// Code generated by 'ccgo -DSQLITE_PRIVATE= -export-defines "" -export-enums "" -export-externs X -export-fields F -export-typedefs "" -ignore-unsupported-alignment -pkgname sqlite3 -volatile=sqlite3_io_error_pending,sqlite3_open_file_count,sqlite3_pager_readdb_count,sqlite3_pager_writedb_count,sqlite3_pager_writej_count,sqlite3_search_count,sqlite3_sort_count,saved_cnt,randomnessPid -o lib/sqlite_windows_amd64.go -trace-translation-units testdata/sqlite-amalgamation-3410200/sqlite3.c -full-path-comments -DNDEBUG -DHAVE_USLEEP -DLONGDOUBLE_TYPE=double -DSQLITE_CORE -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_ENABLE_MEMORY_MANAGEMENT -DSQLITE_ENABLE_OFFSET_SQL_FUNC -DSQLITE_ENABLE_PREUPDATE_HOOK -DSQLITE_ENABLE_RBU -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_SNAPSHOT -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_MUTEX_APPDEF=1 -DSQLITE_MUTEX_NOOP -DSQLITE_SOUNDEX -DSQLITE_THREADSAFE=1 -DSQLITE_OS_WIN=1 -D_MSC_VER=1900', DO NOT EDIT. package sqlite3 import ( "math" "reflect" "sync/atomic" "unsafe" "modernc.org/libc" "modernc.org/libc/sys/types" ) var _ = math.Pi var _ reflect.Kind var _ atomic.Value var _ unsafe.Pointer var _ *libc.TLS var _ types.Size_t const ( ABE_BOTTOM = 3 ABE_LEFT = 0 ABE_RIGHT = 2 ABE_TOP = 1 ABM_ACTIVATE = 0x00000006 ABM_GETAUTOHIDEBAR = 0x00000007 ABM_GETSTATE = 0x00000004 ABM_GETTASKBARPOS = 0x00000005 ABM_NEW = 0x00000000 ABM_QUERYPOS = 0x00000002 ABM_REMOVE = 0x00000001 ABM_SETAUTOHIDEBAR = 0x00000008 ABM_SETPOS = 0x00000003 ABM_SETSTATE = 0x0000000a ABM_WINDOWPOSCHANGED = 0x0000009 ABN_FULLSCREENAPP = 0x0000002 ABN_POSCHANGED = 0x0000001 ABN_STATECHANGE = 0x0000000 ABN_WINDOWARRANGE = 0x0000003 ABORTDOC = 2 ABOVE_NORMAL_PRIORITY_CLASS = 0x8000 ABSOLUTE = 1 ABS_ALWAYSONTOP = 0x0000002 ABS_AUTOHIDE = 0x0000001 ACCESS_ALLOWED_ACE_TYPE = 0 ACCESS_ALLOWED_CALLBACK_ACE_TYPE = 9 ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE = 11 ACCESS_ALLOWED_COMPOUND_ACE_TYPE = 4 ACCESS_ALLOWED_OBJECT_ACE_TYPE = 5 ACCESS_DENIED_ACE_TYPE = 1 ACCESS_DENIED_CALLBACK_ACE_TYPE = 10 ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE = 12 ACCESS_DENIED_OBJECT_ACE_TYPE = 6 ACCESS_DS_OBJECT_TYPE_NAME_A = "Directory Service Object" ACCESS_DS_SOURCE_A = "DS" ACCESS_FILTERKEYS = 0x0002 ACCESS_MAX_LEVEL = 4 ACCESS_MAX_MS_ACE_TYPE = 8 ACCESS_MAX_MS_OBJECT_ACE_TYPE = 8 ACCESS_MAX_MS_V2_ACE_TYPE = 3 ACCESS_MAX_MS_V3_ACE_TYPE = 4 ACCESS_MAX_MS_V4_ACE_TYPE = 8 ACCESS_MAX_MS_V5_ACE_TYPE = 19 ACCESS_MIN_MS_ACE_TYPE = 0 ACCESS_MIN_MS_OBJECT_ACE_TYPE = 5 ACCESS_MOUSEKEYS = 0x0003 ACCESS_OBJECT_GUID = 0 ACCESS_PROPERTY_GUID = 2 ACCESS_PROPERTY_SET_GUID = 1 ACCESS_REASON_DATA_MASK = 0x0000ffff ACCESS_REASON_EXDATA_MASK = 0x7f000000 ACCESS_REASON_STAGING_MASK = 0x80000000 ACCESS_REASON_TYPE_MASK = 0x00ff0000 ACCESS_STICKYKEYS = 0x0001 ACCESS_SYSTEM_SECURITY = 16777216 ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x2 ACE_OBJECT_TYPE_PRESENT = 0x1 ACL_REVISION = 2 ACL_REVISION1 = 1 ACL_REVISION2 = 2 ACL_REVISION3 = 3 ACL_REVISION4 = 4 ACL_REVISION_DS = 4 ACPI_PPM_HARDWARE_ALL = 0xfe ACPI_PPM_SOFTWARE_ALL = 0xfc ACPI_PPM_SOFTWARE_ANY = 0xfd ACTCTX_FLAG_APPLICATION_NAME_VALID = 32 ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID = 4 ACTCTX_FLAG_HMODULE_VALID = 128 ACTCTX_FLAG_LANGID_VALID = 2 ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID = 1 ACTCTX_FLAG_RESOURCE_NAME_VALID = 8 ACTCTX_FLAG_SET_PROCESS_DEFAULT = 16 ACTCTX_FLAG_SOURCE_IS_ASSEMBLYREF = 64 ACTIVATION_CONTEXT_BASIC_INFORMATION_DEFINED = 1 ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF = 4 ACTIVATION_CONTEXT_PATH_TYPE_NONE = 1 ACTIVATION_CONTEXT_PATH_TYPE_URL = 3 ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE = 2 ACTIVATION_CONTEXT_SECTION_APPLICATION_SETTINGS = 10 ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION = 1 ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES = 9 ACTIVATION_CONTEXT_SECTION_COMPATIBILITY_INFO = 11 ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION = 5 ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION = 7 ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION = 4 ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION = 6 ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION = 2 ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE = 8 ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION = 3 ACTIVEOBJECT_STRONG = 0x0 ACTIVEOBJECT_WEAK = 0x1 AC_LINE_BACKUP_POWER = 0x02 AC_LINE_OFFLINE = 0x00 AC_LINE_ONLINE = 0x01 AC_LINE_UNKNOWN = 0xff AC_SRC_ALPHA = 0x01 AC_SRC_OVER = 0x00 ADDRESS_TAG_BIT = 0x40000000000 AD_CLOCKWISE = 2 AD_COUNTERCLOCKWISE = 1 AF_APPLETALK = 16 AF_BAN = 21 AF_CCITT = 10 AF_CHAOS = 5 AF_DATAKIT = 9 AF_DECnet = 12 AF_DLI = 13 AF_ECMA = 8 AF_FIREFOX = 19 AF_HYLINK = 15 AF_IMPLINK = 3 AF_INET = 2 AF_IPX = 6 AF_ISO = 7 AF_LAT = 14 AF_MAX = 22 AF_NETBIOS = 17 AF_NS = 6 AF_OSI = 7 AF_PUP = 4 AF_SNA = 11 AF_UNIX = 1 AF_UNKNOWN1 = 20 AF_UNSPEC = 0 AF_VOICEVIEW = 18 ALERT_SYSTEM_CRITICAL = 5 ALERT_SYSTEM_ERROR = 3 ALERT_SYSTEM_INFORMATIONAL = 1 ALERT_SYSTEM_QUERY = 4 ALERT_SYSTEM_WARNING = 2 ALGIDDEF = 0 ALG_CLASS_ALL = 57344 ALG_CLASS_ANY = 0 ALG_CLASS_DATA_ENCRYPT = 24576 ALG_CLASS_HASH = 32768 ALG_CLASS_KEY_EXCHANGE = 40960 ALG_CLASS_MSG_ENCRYPT = 16384 ALG_CLASS_SIGNATURE = 8192 ALG_SID_3DES = 3 ALG_SID_3DES_112 = 9 ALG_SID_AES = 17 ALG_SID_AES_128 = 14 ALG_SID_AES_192 = 15 ALG_SID_AES_256 = 16 ALG_SID_AGREED_KEY_ANY = 3 ALG_SID_ANY = 0 ALG_SID_CAST = 6 ALG_SID_CYLINK_MEK = 12 ALG_SID_DES = 1 ALG_SID_DESX = 4 ALG_SID_DH_EPHEM = 2 ALG_SID_DH_SANDF = 1 ALG_SID_DSS_ANY = 0 ALG_SID_DSS_DMS = 2 ALG_SID_DSS_PKCS = 1 ALG_SID_EXAMPLE = 80 ALG_SID_HASH_REPLACE_OWF = 11 ALG_SID_HMAC = 9 ALG_SID_IDEA = 5 ALG_SID_KEA = 4 ALG_SID_MAC = 5 ALG_SID_MD2 = 1 ALG_SID_MD4 = 2 ALG_SID_MD5 = 3 ALG_SID_PCT1_MASTER = 4 ALG_SID_RC2 = 2 ALG_SID_RC4 = 1 ALG_SID_RC5 = 13 ALG_SID_RIPEMD = 6 ALG_SID_RIPEMD160 = 7 ALG_SID_RSA_ANY = 0 ALG_SID_RSA_ENTRUST = 3 ALG_SID_RSA_MSATWORK = 2 ALG_SID_RSA_PGP = 4 ALG_SID_RSA_PKCS = 1 ALG_SID_SAFERSK128 = 8 ALG_SID_SAFERSK64 = 7 ALG_SID_SCHANNEL_ENC_KEY = 7 ALG_SID_SCHANNEL_MAC_KEY = 3 ALG_SID_SCHANNEL_MASTER_HASH = 2 ALG_SID_SEAL = 2 ALG_SID_SHA = 4 ALG_SID_SHA1 = 4 ALG_SID_SHA_256 = 12 ALG_SID_SHA_384 = 13 ALG_SID_SHA_512 = 14 ALG_SID_SKIPJACK = 10 ALG_SID_SSL2_MASTER = 5 ALG_SID_SSL3SHAMD5 = 8 ALG_SID_SSL3_MASTER = 1 ALG_SID_TEK = 11 ALG_SID_TLS1PRF = 10 ALG_SID_TLS1_MASTER = 6 ALG_TYPE_ANY = 0 ALG_TYPE_BLOCK = 1536 ALG_TYPE_DH = 2560 ALG_TYPE_DSS = 512 ALG_TYPE_RSA = 1024 ALG_TYPE_SECURECHANNEL = 3072 ALG_TYPE_STREAM = 2048 ALIGNMENT_MACHINE = 0 ALTERNATE = 1 ALTNUMPAD_BIT = 0x4000000 ANSI_CHARSET = 0 ANSI_FIXED_FONT = 11 ANSI_VAR_FONT = 12 ANTIALIASED_QUALITY = 4 ANYSIZE_ARRAY = 1 APD_COPY_ALL_FILES = 0x00000004 APD_COPY_FROM_DIRECTORY = 0x00000010 APD_COPY_NEW_FILES = 0x00000008 APD_STRICT_DOWNGRADE = 0x00000002 APD_STRICT_UPGRADE = 0x00000001 APIENTRY = 0 APIPRIVATE = 0 API_SET_EXTENSION_NAME_A = "EXT-" API_SET_LOAD_SCHEMA_ORDINAL = 1 API_SET_LOOKUP_ORDINAL = 2 API_SET_PREFIX_NAME_A = "API-" API_SET_RELEASE_SCHEMA_ORDINAL = 3 API_SET_SCHEMA_VERSION = 2 API_SET_SECTION_NAME = ".apiset" APPCLASS_MASK = 15 APPCLASS_MONITOR = 1 APPCLASS_STANDARD = 0 APPCMD_CLIENTONLY = 16 APPCMD_FILTERINITS = 32 APPCMD_MASK = 4080 APPCOMMAND_BASS_BOOST = 20 APPCOMMAND_BASS_DOWN = 19 APPCOMMAND_BASS_UP = 21 APPCOMMAND_BROWSER_BACKWARD = 1 APPCOMMAND_BROWSER_FAVORITES = 6 APPCOMMAND_BROWSER_FORWARD = 2 APPCOMMAND_BROWSER_HOME = 7 APPCOMMAND_BROWSER_REFRESH = 3 APPCOMMAND_BROWSER_SEARCH = 5 APPCOMMAND_BROWSER_STOP = 4 APPCOMMAND_CLOSE = 31 APPCOMMAND_COPY = 36 APPCOMMAND_CORRECTION_LIST = 45 APPCOMMAND_CUT = 37 APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE = 43 APPCOMMAND_FIND = 28 APPCOMMAND_FORWARD_MAIL = 40 APPCOMMAND_HELP = 27 APPCOMMAND_LAUNCH_APP1 = 17 APPCOMMAND_LAUNCH_APP2 = 18 APPCOMMAND_LAUNCH_MAIL = 15 APPCOMMAND_LAUNCH_MEDIA_SELECT = 16 APPCOMMAND_MEDIA_CHANNEL_DOWN = 52 APPCOMMAND_MEDIA_CHANNEL_UP = 51 APPCOMMAND_MEDIA_FAST_FORWARD = 49 APPCOMMAND_MEDIA_NEXTTRACK = 11 APPCOMMAND_MEDIA_PAUSE = 47 APPCOMMAND_MEDIA_PLAY = 46 APPCOMMAND_MEDIA_PLAY_PAUSE = 14 APPCOMMAND_MEDIA_PREVIOUSTRACK = 12 APPCOMMAND_MEDIA_RECORD = 48 APPCOMMAND_MEDIA_REWIND = 50 APPCOMMAND_MEDIA_STOP = 13 APPCOMMAND_MICROPHONE_VOLUME_DOWN = 25 APPCOMMAND_MICROPHONE_VOLUME_MUTE = 24 APPCOMMAND_MICROPHONE_VOLUME_UP = 26 APPCOMMAND_MIC_ON_OFF_TOGGLE = 44 APPCOMMAND_NEW = 29 APPCOMMAND_OPEN = 30 APPCOMMAND_PASTE = 38 APPCOMMAND_PRINT = 33 APPCOMMAND_REDO = 35 APPCOMMAND_REPLY_TO_MAIL = 39 APPCOMMAND_SAVE = 32 APPCOMMAND_SEND_MAIL = 41 APPCOMMAND_SPELL_CHECK = 42 APPCOMMAND_TREBLE_DOWN = 22 APPCOMMAND_TREBLE_UP = 23 APPCOMMAND_UNDO = 34 APPCOMMAND_VOLUME_DOWN = 9 APPCOMMAND_VOLUME_MUTE = 8 APPCOMMAND_VOLUME_UP = 10 APPIDREGFLAGS_ACTIVATE_IUSERVER_INDESKTOP = 0x1 APPIDREGFLAGS_ISSUE_ACTIVATION_RPC_AT_IDENTIFY = 0x4 APPIDREGFLAGS_IUSERVER_ACTIVATE_IN_CLIENT_SESSION_ONLY = 0x20 APPIDREGFLAGS_IUSERVER_SELF_SID_IN_LAUNCH_PERMISSION = 0x10 APPIDREGFLAGS_IUSERVER_UNMODIFIED_LOGON_TOKEN = 0x8 APPIDREGFLAGS_RESERVED1 = 0x40 APPIDREGFLAGS_SECURE_SERVER_PROCESS_SD_AND_BIND = 0x2 APPLICATION_ERROR_MASK = 0x20000000 APPLICATION_VERIFIER_ACCESS_VIOLATION = 0x0002 APPLICATION_VERIFIER_BAD_HEAP_HANDLE = 0x0005 APPLICATION_VERIFIER_COM_API_IN_DLLMAIN = 0x0401 APPLICATION_VERIFIER_COM_CF_SUCCESS_WITH_NULL = 0x040A APPLICATION_VERIFIER_COM_ERROR = 0x0400 APPLICATION_VERIFIER_COM_GCO_SUCCESS_WITH_NULL = 0x040B APPLICATION_VERIFIER_COM_HOLDING_LOCKS_ON_CALL = 0x0410 APPLICATION_VERIFIER_COM_NULL_DACL = 0x0406 APPLICATION_VERIFIER_COM_OBJECT_IN_FREED_MEMORY = 0x040C APPLICATION_VERIFIER_COM_OBJECT_IN_UNLOADED_DLL = 0x040D APPLICATION_VERIFIER_COM_SMUGGLED_PROXY = 0x0409 APPLICATION_VERIFIER_COM_SMUGGLED_WRAPPER = 0x0408 APPLICATION_VERIFIER_COM_UNBALANCED_COINIT = 0x0403 APPLICATION_VERIFIER_COM_UNBALANCED_OLEINIT = 0x0404 APPLICATION_VERIFIER_COM_UNBALANCED_SWC = 0x0405 APPLICATION_VERIFIER_COM_UNHANDLED_EXCEPTION = 0x0402 APPLICATION_VERIFIER_COM_UNSAFE_IMPERSONATION = 0x0407 APPLICATION_VERIFIER_COM_VTBL_IN_FREED_MEMORY = 0x040E APPLICATION_VERIFIER_COM_VTBL_IN_UNLOADED_DLL = 0x040F APPLICATION_VERIFIER_CONTINUABLE_BREAK = 0x10000000 APPLICATION_VERIFIER_CORRUPTED_FREED_HEAP_BLOCK = 0x000E APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK = 0x0008 APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_END_STAMP = 0x0011 APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_HEADER = 0x000B APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_PROBING = 0x000C APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_HEADER = 0x000D APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_PREFIX = 0x0012 APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_START_STAMP = 0x0010 APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_SUFFIX = 0x000F APPLICATION_VERIFIER_CORRUPTED_HEAP_LIST = 0x0014 APPLICATION_VERIFIER_DESTROY_PROCESS_HEAP = 0x0009 APPLICATION_VERIFIER_DOUBLE_FREE = 0x0007 APPLICATION_VERIFIER_EXIT_THREAD_OWNS_LOCK = 0x0200 APPLICATION_VERIFIER_EXTREME_SIZE_REQUEST = 0x0004 APPLICATION_VERIFIER_FIRST_CHANCE_ACCESS_VIOLATION = 0x0013 APPLICATION_VERIFIER_INCORRECT_WAIT_CALL = 0x0302 APPLICATION_VERIFIER_INTERNAL_ERROR = 0x80000000 APPLICATION_VERIFIER_INTERNAL_WARNING = 0x40000000 APPLICATION_VERIFIER_INVALID_ALLOCMEM = 0x0601 APPLICATION_VERIFIER_INVALID_EXIT_PROCESS_CALL = 0x0102 APPLICATION_VERIFIER_INVALID_FREEMEM = 0x0600 APPLICATION_VERIFIER_INVALID_HANDLE = 0x0300 APPLICATION_VERIFIER_INVALID_MAPVIEW = 0x0602 APPLICATION_VERIFIER_INVALID_TLS_VALUE = 0x0301 APPLICATION_VERIFIER_LOCK_ALREADY_INITIALIZED = 0x0211 APPLICATION_VERIFIER_LOCK_CORRUPTED = 0x0205 APPLICATION_VERIFIER_LOCK_DOUBLE_INITIALIZE = 0x0203 APPLICATION_VERIFIER_LOCK_INVALID_LOCK_COUNT = 0x0208 APPLICATION_VERIFIER_LOCK_INVALID_OWNER = 0x0206 APPLICATION_VERIFIER_LOCK_INVALID_RECURSION_COUNT = 0x0207 APPLICATION_VERIFIER_LOCK_IN_FREED_HEAP = 0x0202 APPLICATION_VERIFIER_LOCK_IN_FREED_MEMORY = 0x0204 APPLICATION_VERIFIER_LOCK_IN_FREED_VMEM = 0x0212 APPLICATION_VERIFIER_LOCK_IN_UNLOADED_DLL = 0x0201 APPLICATION_VERIFIER_LOCK_IN_UNMAPPED_MEM = 0x0213 APPLICATION_VERIFIER_LOCK_NOT_INITIALIZED = 0x0210 APPLICATION_VERIFIER_LOCK_OVER_RELEASED = 0x0209 APPLICATION_VERIFIER_NO_BREAK = 0x20000000 APPLICATION_VERIFIER_NULL_HANDLE = 0x0303 APPLICATION_VERIFIER_PROBE_FREE_MEM = 0x0604 APPLICATION_VERIFIER_PROBE_GUARD_PAGE = 0x0605 APPLICATION_VERIFIER_PROBE_INVALID_ADDRESS = 0x0603 APPLICATION_VERIFIER_PROBE_INVALID_START_OR_SIZE = 0x0607 APPLICATION_VERIFIER_PROBE_NULL = 0x0606 APPLICATION_VERIFIER_RPC_ERROR = 0x0500 APPLICATION_VERIFIER_SIZE_HEAP_UNEXPECTED_EXCEPTION = 0x0618 APPLICATION_VERIFIER_STACK_OVERFLOW = 0x0101 APPLICATION_VERIFIER_SWITCHED_HEAP_HANDLE = 0x0006 APPLICATION_VERIFIER_TERMINATE_THREAD_CALL = 0x0100 APPLICATION_VERIFIER_THREAD_NOT_LOCK_OWNER = 0x0214 APPLICATION_VERIFIER_UNEXPECTED_EXCEPTION = 0x000A APPLICATION_VERIFIER_UNKNOWN_ERROR = 0x0001 APPLICATION_VERIFIER_UNSYNCHRONIZED_ACCESS = 0x0003 APPLICATION_VERIFIER_WAIT_IN_DLLMAIN = 0x0304 APPMODEL_ERROR_NO_APPLICATION = 15703 APPMODEL_ERROR_NO_PACKAGE = 15700 APPMODEL_ERROR_PACKAGE_IDENTITY_CORRUPT = 15702 APPMODEL_ERROR_PACKAGE_RUNTIME_CORRUPT = 15701 APP_LOCAL_DEVICE_ID_SIZE = 32 ARABIC_CHARSET = 178 ARW_BOTTOMLEFT = 0 ARW_BOTTOMRIGHT = 1 ARW_DOWN = 4 ARW_HIDE = 8 ARW_LEFT = 0 ARW_RIGHT = 0 ARW_STARTMASK = 3 ARW_STARTRIGHT = 1 ARW_STARTTOP = 2 ARW_TOPLEFT = 2 ARW_TOPRIGHT = 3 ARW_UP = 4 ASPECTX = 40 ASPECTXY = 44 ASPECTY = 42 ASPECT_FILTERING = 0x0001 ASSERT_ALTERNATE = 0x9 ASSERT_PRIMARY = 0x8 ASYNCH = 0x80 ASYNC_MODE_COMPATIBILITY = 1 ASYNC_MODE_DEFAULT = 0 ATAPI_ID_CMD = 0xA1 ATF_ONOFFFEEDBACK = 0x00000002 ATF_TIMEOUTON = 0x00000001 ATOM_FLAG_GLOBAL = 0x2 ATTRIBUTE_SECURITY_INFORMATION = 32 ATTR_CONVERTED = 0x02 ATTR_FIXEDCONVERTED = 0x05 ATTR_INPUT = 0x00 ATTR_INPUT_ERROR = 0x04 ATTR_TARGET_CONVERTED = 0x01 ATTR_TARGET_NOTCONVERTED = 0x03 AT_KEYEXCHANGE = 1 AT_SIGNATURE = 2 AUDIT_ALLOW_NO_PRIVILEGE = 0x1 AUTHTYPE_CLIENT = 1 AUTHTYPE_SERVER = 2 AUXCAPS_AUXIN = 2 AUXCAPS_CDAUDIO = 1 AUXCAPS_LRVOLUME = 0x0002 AUXCAPS_VOLUME = 0x0001 AW_ACTIVATE = 0x00020000 AW_BLEND = 0x00080000 AW_CENTER = 0x00000010 AW_HIDE = 0x00010000 AW_HOR_NEGATIVE = 0x00000002 AW_HOR_POSITIVE = 0x00000001 AW_SLIDE = 0x00040000 AW_VER_NEGATIVE = 0x00000008 AW_VER_POSITIVE = 0x00000004 BACKGROUND_BLUE = 0x10 BACKGROUND_GREEN = 0x20 BACKGROUND_INTENSITY = 0x80 BACKGROUND_RED = 0x40 BACKUP_ALTERNATE_DATA = 0x00000004 BACKUP_DATA = 0x00000001 BACKUP_EA_DATA = 0x00000002 BACKUP_INVALID = 0x00000000 BACKUP_LINK = 0x00000005 BACKUP_OBJECT_ID = 0x00000007 BACKUP_PROPERTY_DATA = 0x00000006 BACKUP_REPARSE_DATA = 0x00000008 BACKUP_SECURITY_DATA = 0x00000003 BACKUP_SECURITY_INFORMATION = 65536 BACKUP_SPARSE_BLOCK = 0x00000009 BACKUP_TXFS_DATA = 0x0000000a BALTIC_CHARSET = 186 BANDINFO = 24 BASETYPES = 0 BASE_SEARCH_PATH_DISABLE_SAFE_SEARCHMODE = 0x10000 BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE = 0x1 BASE_SEARCH_PATH_INVALID_FLAGS = -98306 BASE_SEARCH_PATH_PERMANENT = 0x8000 BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_CA_FLAG = 0x80000000 BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_END_ENTITY_FLAG = 0x40000000 BATTERY_DISCHARGE_FLAGS_ENABLE = 0x80000000 BATTERY_DISCHARGE_FLAGS_EVENTCODE_MASK = 0x00000007 BATTERY_FLAG_CHARGING = 0x08 BATTERY_FLAG_CRITICAL = 0x04 BATTERY_FLAG_HIGH = 0x01 BATTERY_FLAG_LOW = 0x02 BATTERY_FLAG_NO_BATTERY = 0x80 BATTERY_FLAG_UNKNOWN = 0xff BATTERY_LIFE_UNKNOWN = 0xffffffff BATTERY_PERCENTAGE_UNKNOWN = 0xff BCRYPTBUFFER_VERSION = 0 BCRYPT_ALG_HANDLE_HMAC_FLAG = 0x00000008 BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE = 0x00000003 BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION = 0x00000004 BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION = 1 BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG = 0x00000001 BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG = 0x00000002 BCRYPT_BLOCK_PADDING = 0x00000001 BCRYPT_BUFFERS_LOCKED_FLAG = 0x00000040 BCRYPT_CAPI_AES_FLAG = 0x00000010 BCRYPT_CIPHER_INTERFACE = 0x00000001 BCRYPT_CIPHER_OPERATION = 0x00000001 BCRYPT_DH_PARAMETERS_MAGIC = 0x4d504844 BCRYPT_DH_PRIVATE_MAGIC = 0x56504844 BCRYPT_DH_PUBLIC_MAGIC = 0x42504844 BCRYPT_DSA_PARAMETERS_MAGIC = 0x4d505344 BCRYPT_DSA_PARAMETERS_MAGIC_V2 = 0x324d5044 BCRYPT_DSA_PRIVATE_MAGIC = 0x56505344 BCRYPT_DSA_PRIVATE_MAGIC_V2 = 0x32565044 BCRYPT_DSA_PUBLIC_MAGIC = 0x42505344 BCRYPT_DSA_PUBLIC_MAGIC_V2 = 0x32425044 BCRYPT_ECDH_PRIVATE_P256_MAGIC = 0x324b4345 BCRYPT_ECDH_PRIVATE_P384_MAGIC = 0x344b4345 BCRYPT_ECDH_PRIVATE_P521_MAGIC = 0x364b4345 BCRYPT_ECDH_PUBLIC_P256_MAGIC = 0x314b4345 BCRYPT_ECDH_PUBLIC_P384_MAGIC = 0x334b4345 BCRYPT_ECDH_PUBLIC_P521_MAGIC = 0x354b4345 BCRYPT_ECDSA_PRIVATE_P256_MAGIC = 0x32534345 BCRYPT_ECDSA_PRIVATE_P384_MAGIC = 0x34534345 BCRYPT_ECDSA_PRIVATE_P521_MAGIC = 0x36534345 BCRYPT_ECDSA_PUBLIC_P256_MAGIC = 0x31534345 BCRYPT_ECDSA_PUBLIC_P384_MAGIC = 0x33534345 BCRYPT_ECDSA_PUBLIC_P521_MAGIC = 0x35534345 BCRYPT_HASH_INTERFACE = 0x00000002 BCRYPT_HASH_OPERATION = 0x00000002 BCRYPT_HASH_REUSABLE_FLAG = 0x00000020 BCRYPT_KEY_DATA_BLOB_MAGIC = 0x4d42444b BCRYPT_KEY_DATA_BLOB_VERSION1 = 0x1 BCRYPT_KEY_DERIVATION_INTERFACE = 0x00000007 BCRYPT_KEY_DERIVATION_OPERATION = 0x00000040 BCRYPT_NO_KEY_VALIDATION = 0x00000008 BCRYPT_OBJECT_ALIGNMENT = 16 BCRYPT_PAD_NONE = 0x00000001 BCRYPT_PAD_OAEP = 0x00000004 BCRYPT_PAD_PKCS1 = 0x00000002 BCRYPT_PAD_PSS = 0x00000008 BCRYPT_PRIVATE_KEY_FLAG = 0x00000002 BCRYPT_PROV_DISPATCH = 0x00000001 BCRYPT_PUBLIC_KEY_FLAG = 0x00000001 BCRYPT_RNG_INTERFACE = 0x00000006 BCRYPT_RNG_OPERATION = 0x00000020 BCRYPT_RNG_USE_ENTROPY_IN_BUFFER = 0x00000001 BCRYPT_RSAFULLPRIVATE_MAGIC = 0x33415352 BCRYPT_RSAPRIVATE_MAGIC = 0x32415352 BCRYPT_RSAPUBLIC_MAGIC = 0x31415352 BCRYPT_SECRET_AGREEMENT_INTERFACE = 0x00000004 BCRYPT_SECRET_AGREEMENT_OPERATION = 0x00000008 BCRYPT_SIGNATURE_INTERFACE = 0x00000005 BCRYPT_SIGNATURE_OPERATION = 0x00000010 BCRYPT_STRUCT_ALIGNMENT = 0 BCRYPT_SUPPORTED_PAD_OAEP = 0x00000008 BCRYPT_SUPPORTED_PAD_PKCS1_ENC = 0x00000002 BCRYPT_SUPPORTED_PAD_PKCS1_SIG = 0x00000004 BCRYPT_SUPPORTED_PAD_PSS = 0x00000010 BCRYPT_SUPPORTED_PAD_ROUTER = 0x00000001 BCRYPT_USE_SYSTEM_PREFERRED_RNG = 0x00000002 BDR_INNER = 12 BDR_OUTER = 3 BDR_RAISED = 5 BDR_RAISEDINNER = 0x0004 BDR_RAISEDOUTER = 0x0001 BDR_SUNKEN = 10 BDR_SUNKENINNER = 0x0008 BDR_SUNKENOUTER = 0x0002 BEGIN_INTERFACE = 0 BEGIN_PATH = 4096 BELOW_NORMAL_PRIORITY_CLASS = 0x4000 BF_ADJUST = 0x2000 BF_BOTTOM = 0x0008 BF_BOTTOMLEFT = 9 BF_BOTTOMRIGHT = 12 BF_DIAGONAL = 0x0010 BF_DIAGONAL_ENDBOTTOMLEFT = 25 BF_DIAGONAL_ENDBOTTOMRIGHT = 28 BF_DIAGONAL_ENDTOPLEFT = 19 BF_DIAGONAL_ENDTOPRIGHT = 22 BF_FLAT = 0x4000 BF_LEFT = 0x0001 BF_MIDDLE = 0x0800 BF_MONO = 0x8000 BF_RECT = 15 BF_RIGHT = 0x0004 BF_SOFT = 0x1000 BF_TOP = 0x0002 BF_TOPLEFT = 3 BF_TOPRIGHT = 6 BIDI_ACCESS_ADMINISTRATOR = 0x1 BIDI_ACCESS_USER = 0x2 BITSPIXEL = 12 BITVEC_SZ = 512 BITVEC_SZELEM = 8 BI_BITFIELDS = 3 BI_JPEG = 4 BI_PNG = 5 BI_RGB = 0 BI_RLE4 = 2 BI_RLE8 = 1 BKMODE_LAST = 2 BLACKONWHITE = 1 BLACK_BRUSH = 4 BLACK_PEN = 7 BLTALIGNMENT = 119 BM_CLICK = 0x00F5 BM_GETCHECK = 0x00F0 BM_GETIMAGE = 0x00F6 BM_GETSTATE = 0x00F2 BM_SETCHECK = 0x00F1 BM_SETIMAGE = 0x00F7 BM_SETSTATE = 0x00F3 BM_SETSTYLE = 0x00F4 BN_CLICKED = 0 BN_DBLCLK = 5 BN_DISABLE = 4 BN_DOUBLECLICKED = 5 BN_HILITE = 2 BN_KILLFOCUS = 7 BN_PAINT = 1 BN_PUSHED = 2 BN_SETFOCUS = 6 BN_UNHILITE = 3 BN_UNPUSHED = 3 BOLD_FONTTYPE = 0x100 BROADCAST_QUERY_DENY = 0x424D5144 BSF_ALLOWSFW = 0x00000080 BSF_FLUSHDISK = 0x00000004 BSF_FORCEIFHUNG = 0x00000020 BSF_IGNORECURRENTTASK = 0x00000002 BSF_LUID = 0x00000400 BSF_NOHANG = 0x00000008 BSF_NOTIMEOUTIFNOTHUNG = 0x00000040 BSF_POSTMESSAGE = 0x00000010 BSF_QUERY = 0x00000001 BSF_RETURNHDESK = 0x00000200 BSF_SENDNOTIFYMESSAGE = 0x00000100 BSM_ALLCOMPONENTS = 0x00000000 BSM_ALLDESKTOPS = 0x00000010 BSM_APPLICATIONS = 0x00000008 BSM_INSTALLABLEDRIVERS = 0x00000004 BSM_NETDRIVER = 0x00000002 BSM_VXDS = 0x00000001 BST_CHECKED = 0x0001 BST_FOCUS = 0x0008 BST_INDETERMINATE = 0x0002 BST_PUSHED = 0x0004 BST_UNCHECKED = 0x0000 BS_3STATE = 5 BS_AUTO3STATE = 6 BS_AUTOCHECKBOX = 3 BS_AUTORADIOBUTTON = 9 BS_BITMAP = 128 BS_BOTTOM = 2048 BS_CENTER = 768 BS_CHECKBOX = 2 BS_DEFPUSHBUTTON = 1 BS_DIBPATTERN = 5 BS_DIBPATTERN8X8 = 8 BS_DIBPATTERNPT = 6 BS_FLAT = 32768 BS_GROUPBOX = 7 BS_HATCHED = 2 BS_HOLLOW = 1 BS_ICON = 64 BS_INDEXED = 4 BS_LEFT = 256 BS_LEFTTEXT = 32 BS_MONOPATTERN = 9 BS_MULTILINE = 8192 BS_NOTIFY = 16384 BS_NULL = 1 BS_OWNERDRAW = 11 BS_PATTERN = 3 BS_PATTERN8X8 = 7 BS_PUSHBOX = 10 BS_PUSHBUTTON = 0 BS_PUSHLIKE = 4096 BS_RADIOBUTTON = 4 BS_RIGHT = 512 BS_RIGHTBUTTON = 32 BS_SOLID = 0 BS_TEXT = 0 BS_TOP = 1024 BS_TYPEMASK = 15 BS_USERBUTTON = 8 BS_VCENTER = 3072 BTALLOC_ANY = 0 BTALLOC_EXACT = 1 BTALLOC_LE = 2 BTCF_AtLast = 0x08 BTCF_Incrblob = 0x10 BTCF_Multiple = 0x20 BTCF_Pinned = 0x40 BTCF_ValidNKey = 0x02 BTCF_ValidOvfl = 0x04 BTCF_WriteFlag = 0x01 BTCURSOR_MAX_DEPTH = 20 BTREE_APPEND = 0x08 BTREE_APPLICATION_ID = 8 BTREE_AUTOVACUUM_FULL = 1 BTREE_AUTOVACUUM_INCR = 2 BTREE_AUTOVACUUM_NONE = 0 BTREE_AUXDELETE = 0x04 BTREE_BLOBKEY = 2 BTREE_BULKLOAD = 0x00000001 BTREE_DATA_VERSION = 15 BTREE_DEFAULT_CACHE_SIZE = 3 BTREE_FILE_FORMAT = 2 BTREE_FORDELETE = 0x00000008 BTREE_FREE_PAGE_COUNT = 0 BTREE_HINT_RANGE = 0 BTREE_INCR_VACUUM = 7 BTREE_INTKEY = 1 BTREE_LARGEST_ROOT_PAGE = 4 BTREE_MEMORY = 2 BTREE_OMIT_JOURNAL = 1 BTREE_PREFORMAT = 0x80 BTREE_SAVEPOSITION = 0x02 BTREE_SCHEMA_VERSION = 1 BTREE_SEEK_EQ = 0x00000002 BTREE_SINGLE = 4 BTREE_TEXT_ENCODING = 5 BTREE_UNORDERED = 8 BTREE_USER_VERSION = 6 BTREE_WRCSR = 0x00000004 BTS_EXCLUSIVE = 0x0040 BTS_FAST_SECURE = 0x000c BTS_INITIALLY_EMPTY = 0x0010 BTS_NO_WAL = 0x0020 BTS_OVERWRITE = 0x0008 BTS_PAGESIZE_FIXED = 0x0002 BTS_PENDING = 0x0080 BTS_READ_ONLY = 0x0001 BTS_SECURE_DELETE = 0x0004 BUFSIZ = 512 C1_ALPHA = 0x0100 C1_BLANK = 0x0040 C1_CNTRL = 0x0020 C1_DEFINED = 0x0200 C1_DIGIT = 0x0004 C1_LOWER = 0x0002 C1_PUNCT = 0x0010 C1_SPACE = 0x0008 C1_UPPER = 0x0001 C1_XDIGIT = 0x0080 C2_ARABICNUMBER = 0x0006 C2_BLOCKSEPARATOR = 0x0008 C2_COMMONSEPARATOR = 0x0007 C2_EUROPENUMBER = 0x0003 C2_EUROPESEPARATOR = 0x0004 C2_EUROPETERMINATOR = 0x0005 C2_LEFTTORIGHT = 0x0001 C2_NOTAPPLICABLE = 0x0000 C2_OTHERNEUTRAL = 0x000b C2_RIGHTTOLEFT = 0x0002 C2_SEGMENTSEPARATOR = 0x0009 C2_WHITESPACE = 0x000a C3_ALPHA = 0x8000 C3_DIACRITIC = 0x0002 C3_FULLWIDTH = 0x0080 C3_HALFWIDTH = 0x0040 C3_HIGHSURROGATE = 0x0800 C3_HIRAGANA = 0x0020 C3_IDEOGRAPH = 0x0100 C3_KASHIDA = 0x0200 C3_KATAKANA = 0x0010 C3_LEXICAL = 0x0400 C3_LOWSURROGATE = 0x1000 C3_NONSPACING = 0x0001 C3_NOTAPPLICABLE = 0x0000 C3_SYMBOL = 0x0008 C3_VOWELMARK = 0x0004 CACHE_E_FIRST = 2147746160 CACHE_E_LAST = 2147746175 CACHE_FULLY_ASSOCIATIVE = 0xFF CACHE_STALE = 0 CACHE_S_FIRST = 262512 CACHE_S_LAST = 262527 CADV_LATEACK = 0xFFFF CALERT_SYSTEM = 6 CALG_3DES = 26115 CALG_3DES_112 = 26121 CALG_AES = 26129 CALG_AES_128 = 26126 CALG_AES_192 = 26127 CALG_AES_256 = 26128 CALG_AGREEDKEY_ANY = 43523 CALG_CYLINK_MEK = 26124 CALG_DES = 26113 CALG_DESX = 26116 CALG_DH_EPHEM = 43522 CALG_DH_SF = 43521 CALG_DSS_SIGN = 8704 CALG_HASH_REPLACE_OWF = 32779 CALG_HMAC = 32777 CALG_HUGHES_MD5 = 40963 CALG_KEA_KEYX = 43524 CALG_MAC = 32773 CALG_MD2 = 32769 CALG_MD4 = 32770 CALG_MD5 = 32771 CALG_NO_SIGN = 8192 CALG_OID_INFO_CNG_ONLY = 0xffffffff CALG_OID_INFO_PARAMETERS = 0xfffffffe CALG_PCT1_MASTER = 19460 CALG_RC2 = 26114 CALG_RC4 = 26625 CALG_RC5 = 26125 CALG_RSA_KEYX = 41984 CALG_RSA_SIGN = 9216 CALG_SCHANNEL_ENC_KEY = 19463 CALG_SCHANNEL_MAC_KEY = 19459 CALG_SCHANNEL_MASTER_HASH = 19458 CALG_SEAL = 26626 CALG_SHA = 32772 CALG_SHA1 = 32772 CALG_SHA_256 = 32780 CALG_SHA_384 = 32781 CALG_SHA_512 = 32782 CALG_SKIPJACK = 26122 CALG_SSL2_MASTER = 19461 CALG_SSL3_MASTER = 19457 CALG_SSL3_SHAMD5 = 32776 CALG_TEK = 26123 CALG_TLS1PRF = 32778 CALG_TLS1_MASTER = 19462 CALLBACK = 0 CALLBACK_CHUNK_FINISHED = 0x0 CALLBACK_EVENT = 327680 CALLBACK_FUNCTION = 196608 CALLBACK_NULL = 0 CALLBACK_STREAM_SWITCH = 0x1 CALLBACK_TASK = 131072 CALLBACK_THREAD = 131072 CALLBACK_TYPEMASK = 458752 CALLBACK_WINDOW = 65536 CALL_PENDING = 0x02 CAL_GREGORIAN = 1 CAL_GREGORIAN_ARABIC = 10 CAL_GREGORIAN_ME_FRENCH = 9 CAL_GREGORIAN_US = 2 CAL_GREGORIAN_XLIT_ENGLISH = 11 CAL_GREGORIAN_XLIT_FRENCH = 12 CAL_HEBREW = 8 CAL_HIJRI = 6 CAL_ICALINTVALUE = 0x00000001 CAL_ITWODIGITYEARMAX = 0x00000030 CAL_IYEAROFFSETRANGE = 0x00000003 CAL_JAPAN = 3 CAL_KOREA = 5 CAL_NOUSEROVERRIDE = 2147483648 CAL_RETURN_NUMBER = 536870912 CAL_SABBREVDAYNAME1 = 0x0000000e CAL_SABBREVDAYNAME2 = 0x0000000f CAL_SABBREVDAYNAME3 = 0x00000010 CAL_SABBREVDAYNAME4 = 0x00000011 CAL_SABBREVDAYNAME5 = 0x00000012 CAL_SABBREVDAYNAME6 = 0x00000013 CAL_SABBREVDAYNAME7 = 0x00000014 CAL_SABBREVMONTHNAME1 = 0x00000022 CAL_SABBREVMONTHNAME10 = 0x0000002b CAL_SABBREVMONTHNAME11 = 0x0000002c CAL_SABBREVMONTHNAME12 = 0x0000002d CAL_SABBREVMONTHNAME13 = 0x0000002e CAL_SABBREVMONTHNAME2 = 0x00000023 CAL_SABBREVMONTHNAME3 = 0x00000024 CAL_SABBREVMONTHNAME4 = 0x00000025 CAL_SABBREVMONTHNAME5 = 0x00000026 CAL_SABBREVMONTHNAME6 = 0x00000027 CAL_SABBREVMONTHNAME7 = 0x00000028 CAL_SABBREVMONTHNAME8 = 0x00000029 CAL_SABBREVMONTHNAME9 = 0x0000002a CAL_SCALNAME = 0x00000002 CAL_SDAYNAME1 = 0x00000007 CAL_SDAYNAME2 = 0x00000008 CAL_SDAYNAME3 = 0x00000009 CAL_SDAYNAME4 = 0x0000000a CAL_SDAYNAME5 = 0x0000000b CAL_SDAYNAME6 = 0x0000000c CAL_SDAYNAME7 = 0x0000000d CAL_SERASTRING = 0x00000004 CAL_SLONGDATE = 0x00000006 CAL_SMONTHNAME1 = 0x00000015 CAL_SMONTHNAME10 = 0x0000001e CAL_SMONTHNAME11 = 0x0000001f CAL_SMONTHNAME12 = 0x00000020 CAL_SMONTHNAME13 = 0x00000021 CAL_SMONTHNAME2 = 0x00000016 CAL_SMONTHNAME3 = 0x00000017 CAL_SMONTHNAME4 = 0x00000018 CAL_SMONTHNAME5 = 0x00000019 CAL_SMONTHNAME6 = 0x0000001a CAL_SMONTHNAME7 = 0x0000001b CAL_SMONTHNAME8 = 0x0000001c CAL_SMONTHNAME9 = 0x0000001d CAL_SSHORTDATE = 0x00000005 CAL_SYEARMONTH = 0x0000002f CAL_TAIWAN = 4 CAL_THAI = 7 CAL_UMALQURA = 23 CAL_USE_CP_ACP = 1073741824 CAPSLOCK_ON = 0x80 CAP_ATAPI_ID_CMD = 2 CAP_ATA_ID_CMD = 1 CAP_SMART_CMD = 4 CAT_E_FIRST = 2147746144 CAT_E_LAST = 2147746145 CA_LOG_FILTER = 0x0002 CA_NEGATIVE = 0x0001 CBF_FAIL_ADVISES = 0x00004000 CBF_FAIL_ALLSVRXACTIONS = 0x0003f000 CBF_FAIL_CONNECTIONS = 0x00002000 CBF_FAIL_EXECUTES = 0x00008000 CBF_FAIL_POKES = 0x00010000 CBF_FAIL_REQUESTS = 0x00020000 CBF_FAIL_SELFCONNECTIONS = 0x00001000 CBF_SKIP_ALLNOTIFICATIONS = 0x003c0000 CBF_SKIP_CONNECT_CONFIRMS = 0x00040000 CBF_SKIP_DISCONNECTS = 0x00200000 CBF_SKIP_REGISTRATIONS = 0x00080000 CBF_SKIP_UNREGISTRATIONS = 0x00100000 CBM_INIT = 4 CBN_CLOSEUP = 8 CBN_DBLCLK = 2 CBN_DROPDOWN = 7 CBN_EDITCHANGE = 5 CBN_EDITUPDATE = 6 CBN_ERRSPACE = -1 CBN_KILLFOCUS = 4 CBN_SELCHANGE = 1 CBN_SELENDCANCEL = 10 CBN_SELENDOK = 9 CBN_SETFOCUS = 3 CBR_110 = 110 CBR_115200 = 115200 CBR_1200 = 1200 CBR_128000 = 128000 CBR_14400 = 14400 CBR_19200 = 19200 CBR_2400 = 2400 CBR_256000 = 256000 CBR_300 = 300 CBR_38400 = 38400 CBR_4800 = 4800 CBR_56000 = 56000 CBR_57600 = 57600 CBR_600 = 600 CBR_9600 = 9600 CBS_AUTOHSCROLL = 64 CBS_DISABLENOSCROLL = 2048 CBS_DROPDOWN = 2 CBS_DROPDOWNLIST = 3 CBS_HASSTRINGS = 512 CBS_LOWERCASE = 16384 CBS_NOINTEGRALHEIGHT = 1024 CBS_OEMCONVERT = 128 CBS_OWNERDRAWFIXED = 16 CBS_OWNERDRAWVARIABLE = 32 CBS_SIMPLE = 1 CBS_SORT = 256 CBS_UPPERCASE = 8192 CB_ADDSTRING = 0x0143 CB_DELETESTRING = 0x0144 CB_DIR = 0x0145 CB_ERR = -1 CB_ERRSPACE = -2 CB_FINDSTRING = 0x014C CB_FINDSTRINGEXACT = 0x0158 CB_GETCOMBOBOXINFO = 0x0164 CB_GETCOUNT = 0x0146 CB_GETCURSEL = 0x0147 CB_GETDROPPEDCONTROLRECT = 0x0152 CB_GETDROPPEDSTATE = 0x0157 CB_GETDROPPEDWIDTH = 0x015f CB_GETEDITSEL = 0x0140 CB_GETEXTENDEDUI = 0x0156 CB_GETHORIZONTALEXTENT = 0x015d CB_GETITEMDATA = 0x0150 CB_GETITEMHEIGHT = 0x0154 CB_GETLBTEXT = 0x0148 CB_GETLBTEXTLEN = 0x0149 CB_GETLOCALE = 0x015A CB_GETTOPINDEX = 0x015b CB_INITSTORAGE = 0x0161 CB_INSERTSTRING = 0x014A CB_LIMITTEXT = 0x0141 CB_MSGMAX = 0x0165 CB_OKAY = 0 CB_RESETCONTENT = 0x014B CB_SELECTSTRING = 0x014D CB_SETCURSEL = 0x014E CB_SETDROPPEDWIDTH = 0x0160 CB_SETEDITSEL = 0x0142 CB_SETEXTENDEDUI = 0x0155 CB_SETHORIZONTALEXTENT = 0x015e CB_SETITEMDATA = 0x0151 CB_SETITEMHEIGHT = 0x0153 CB_SETLOCALE = 0x0159 CB_SETTOPINDEX = 0x015c CB_SHOWDROPDOWN = 0x014F CCERR_CHOOSECOLORCODES = 0x5000 CCHDEVICENAME = 32 CCHFORMNAME = 32 CCHILDREN_SCROLLBAR = 5 CCHILDREN_TITLEBAR = 5 CCH_MAX_PROPSTG_NAME = 31 CC_AND = 24 CC_ANYCOLOR = 0x100 CC_BANG = 15 CC_BOM = 30 CC_CHORD = 4 CC_CIRCLES = 1 CC_COMMA = 23 CC_DIGIT = 3 CC_DOLLAR = 4 CC_DOT = 26 CC_ELLIPSES = 8 CC_ENABLEHOOK = 0x10 CC_ENABLETEMPLATE = 0x20 CC_ENABLETEMPLATEHANDLE = 0x40 CC_EQ = 14 CC_FULLOPEN = 0x2 CC_GT = 13 CC_ID = 27 CC_ILLEGAL = 28 CC_INTERIORS = 128 CC_KYWD = 2 CC_KYWD0 = 1 CC_LP = 17 CC_LT = 12 CC_MINUS = 11 CC_NONE = 0 CC_NUL = 29 CC_PERCENT = 22 CC_PIE = 2 CC_PIPE = 10 CC_PLUS = 20 CC_PREVENTFULLOPEN = 0x4 CC_QUOTE = 8 CC_QUOTE2 = 9 CC_RGBINIT = 0x1 CC_ROUNDRECT = 256 CC_RP = 18 CC_SEMI = 19 CC_SHOWHELP = 0x8 CC_SLASH = 16 CC_SOLIDCOLOR = 0x80 CC_SPACE = 7 CC_STAR = 21 CC_STYLED = 32 CC_TILDA = 25 CC_VARALPHA = 5 CC_VARNUM = 6 CC_WIDE = 16 CC_WIDESTYLED = 64 CC_X = 0 CDECL = 0 CDERR_DIALOGFAILURE = 0xFFFF CDERR_FINDRESFAILURE = 0x0006 CDERR_GENERALCODES = 0x0000 CDERR_INITIALIZATION = 0x0002 CDERR_LOADRESFAILURE = 0x0007 CDERR_LOADSTRFAILURE = 0x0005 CDERR_LOCKRESFAILURE = 0x0008 CDERR_MEMALLOCFAILURE = 0x0009 CDERR_MEMLOCKFAILURE = 0x000A CDERR_NOHINSTANCE = 0x0004 CDERR_NOHOOK = 0x000B CDERR_NOTEMPLATE = 0x0003 CDERR_REGISTERMSGFAIL = 0x000C CDERR_STRUCTSIZE = 0x0001 CDM_FIRST = 1124 CDM_GETFILEPATH = 1125 CDM_GETFOLDERIDLIST = 1127 CDM_GETFOLDERPATH = 1126 CDM_GETSPEC = 1124 CDM_HIDECONTROL = 1129 CDM_LAST = 1224 CDM_SETCONTROLTEXT = 1128 CDM_SETDEFEXT = 1130 CDN_FILEOK = 18446744073709551010 CDN_FIRST = 18446744073709551015 CDN_FOLDERCHANGE = 18446744073709551013 CDN_HELP = 18446744073709551011 CDN_INCLUDEITEM = 18446744073709551008 CDN_INITDONE = 18446744073709551015 CDN_LAST = 18446744073709550917 CDN_SELCHANGE = 18446744073709551014 CDN_SHAREVIOLATION = 18446744073709551012 CDN_TYPECHANGE = 18446744073709551009 CDS_FULLSCREEN = 0x00000004 CDS_GLOBAL = 0x00000008 CDS_NORESET = 0x10000000 CDS_RESET = 0x40000000 CDS_RESET_EX = 0x20000000 CDS_SET_PRIMARY = 0x00000010 CDS_TEST = 0x00000002 CDS_UPDATEREGISTRY = 0x00000001 CDS_VIDEOPARAMETERS = 0x00000020 CD_LBSELADD = 2 CD_LBSELCHANGE = 0 CD_LBSELNOITEMS = -1 CD_LBSELSUB = 1 CERT_ACCESS_STATE_GP_SYSTEM_STORE_FLAG = 0x8 CERT_ACCESS_STATE_LM_SYSTEM_STORE_FLAG = 0x4 CERT_ACCESS_STATE_PROP_ID = 14 CERT_ACCESS_STATE_SHARED_USER_FLAG = 0x10 CERT_ACCESS_STATE_SYSTEM_STORE_FLAG = 0x2 CERT_ACCESS_STATE_WRITE_PERSIST_FLAG = 0x1 CERT_AIA_URL_RETRIEVED_PROP_ID = 67 CERT_ALT_NAME_DIRECTORY_NAME = 5 CERT_ALT_NAME_DNS_NAME = 3 CERT_ALT_NAME_EDI_PARTY_NAME = 6 CERT_ALT_NAME_ENTRY_ERR_INDEX_MASK = 0xff CERT_ALT_NAME_ENTRY_ERR_INDEX_SHIFT = 16 CERT_ALT_NAME_IP_ADDRESS = 8 CERT_ALT_NAME_OTHER_NAME = 1 CERT_ALT_NAME_REGISTERED_ID = 9 CERT_ALT_NAME_RFC822_NAME = 2 CERT_ALT_NAME_URL = 7 CERT_ALT_NAME_VALUE_ERR_INDEX_MASK = 0x0000ffff CERT_ALT_NAME_VALUE_ERR_INDEX_SHIFT = 0 CERT_ALT_NAME_X400_ADDRESS = 4 CERT_ARCHIVED_KEY_HASH_PROP_ID = 65 CERT_ARCHIVED_PROP_ID = 19 CERT_AUTHORITY_INFO_ACCESS_PROP_ID = 68 CERT_AUTH_ROOT_AUTO_UPDATE_DISABLE_PARTIAL_CHAIN_LOGGING_FLAG = 0x2 CERT_AUTH_ROOT_AUTO_UPDATE_DISABLE_UNTRUSTED_ROOT_LOGGING_FLAG = 0x1 CERT_AUTH_ROOT_CTL_FILENAME_A = "authroot.stl" CERT_AUTH_ROOT_SHA256_HASH_PROP_ID = 98 CERT_AUTO_ENROLL_PROP_ID = 21 CERT_AUTO_ENROLL_RETRY_PROP_ID = 66 CERT_AUTO_UPDATE_DISABLE_RANDOM_QUERY_STRING_FLAG = 0x4 CERT_BACKED_UP_PROP_ID = 69 CERT_BIOMETRIC_OID_DATA_CHOICE = 2 CERT_BIOMETRIC_PICTURE_TYPE = 0 CERT_BIOMETRIC_PREDEFINED_DATA_CHOICE = 1 CERT_BIOMETRIC_SIGNATURE_TYPE = 1 CERT_BUNDLE_CERTIFICATE = 0 CERT_BUNDLE_CRL = 1 CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG = 0x2 CERT_CA_DISABLE_CRL_PROP_ID = 82 CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID = 81 CERT_CA_SUBJECT_FLAG = 0x80 CERT_CEP_PROP_ID = 87 CERT_CHAIN_AUTO_CURRENT_USER = 1 CERT_CHAIN_AUTO_FLUSH_DISABLE_FLAG = 0x00000001 CERT_CHAIN_AUTO_FLUSH_FIRST_DELTA_SECONDS_DEFAULT = 300 CERT_CHAIN_AUTO_FLUSH_NEXT_DELTA_SECONDS_DEFAULT = 1800 CERT_CHAIN_AUTO_HPKP_RULE_INFO = 8 CERT_CHAIN_AUTO_IMPERSONATED = 3 CERT_CHAIN_AUTO_LOCAL_MACHINE = 2 CERT_CHAIN_AUTO_LOG_CREATE_FLAG = 0x00000002 CERT_CHAIN_AUTO_LOG_FLAGS = 14 CERT_CHAIN_AUTO_LOG_FLUSH_FLAG = 0x00000008 CERT_CHAIN_AUTO_LOG_FREE_FLAG = 0x00000004 CERT_CHAIN_AUTO_NETWORK_INFO = 6 CERT_CHAIN_AUTO_PINRULE_INFO = 5 CERT_CHAIN_AUTO_PROCESS_INFO = 4 CERT_CHAIN_AUTO_SERIAL_LOCAL_MACHINE = 7 CERT_CHAIN_CACHE_END_CERT = 0x1 CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL = 0x4 CERT_CHAIN_CRL_VALIDITY_EXT_PERIOD_HOURS_DEFAULT = 12 CERT_CHAIN_CROSS_CERT_DOWNLOAD_INTERVAL_HOURS_DEFAULT = 168 CERT_CHAIN_DISABLE_AIA = 0x2000 CERT_CHAIN_DISABLE_ALL_EKU_WEAK_FLAG = 0x00010000 CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE = 0x100 CERT_CHAIN_DISABLE_CODE_SIGNING_WEAK_FLAG = 0x00400000 CERT_CHAIN_DISABLE_FILE_HASH_WEAK_FLAG = 0x00001000 CERT_CHAIN_DISABLE_FILE_HASH_WEAK_FLAGS = 12288 CERT_CHAIN_DISABLE_MD2_MD4 = 0x1000 CERT_CHAIN_DISABLE_MOTW_CODE_SIGNING_WEAK_FLAG = 0x00800000 CERT_CHAIN_DISABLE_MOTW_FILE_HASH_WEAK_FLAG = 0x00002000 CERT_CHAIN_DISABLE_MOTW_TIMESTAMP_HASH_WEAK_FLAG = 0x00008000 CERT_CHAIN_DISABLE_MOTW_TIMESTAMP_WEAK_FLAG = 0x08000000 CERT_CHAIN_DISABLE_MY_PEER_TRUST = 0x800 CERT_CHAIN_DISABLE_OPT_IN_SERVER_AUTH_WEAK_FLAG = 0x00040000 CERT_CHAIN_DISABLE_PASS1_QUALITY_FILTERING = 0x40 CERT_CHAIN_DISABLE_SERVER_AUTH_WEAK_FLAG = 0x00100000 CERT_CHAIN_DISABLE_TIMESTAMP_HASH_WEAK_FLAG = 0x00004000 CERT_CHAIN_DISABLE_TIMESTAMP_HASH_WEAK_FLAGS = 49152 CERT_CHAIN_DISABLE_TIMESTAMP_WEAK_FLAG = 0x04000000 CERT_CHAIN_DISABLE_WEAK_FLAGS = 215285760 CERT_CHAIN_ENABLE_ALL_EKU_HYGIENE_FLAG = 0x00020000 CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE = 0x10 CERT_CHAIN_ENABLE_CODE_SIGNING_HYGIENE_FLAG = 0x01000000 CERT_CHAIN_ENABLE_HYGIENE_FLAGS = 857866240 CERT_CHAIN_ENABLE_MD2_MD4_FLAG = 0x1 CERT_CHAIN_ENABLE_MOTW_CODE_SIGNING_HYGIENE_FLAG = 0x02000000 CERT_CHAIN_ENABLE_MOTW_TIMESTAMP_HYGIENE_FLAG = 0x20000000 CERT_CHAIN_ENABLE_ONLY_WEAK_LOGGING_FLAG = 0x8 CERT_CHAIN_ENABLE_PEER_TRUST = 0x400 CERT_CHAIN_ENABLE_SERVER_AUTH_HYGIENE_FLAG = 0x00200000 CERT_CHAIN_ENABLE_SHARE_STORE = 0x20 CERT_CHAIN_ENABLE_TIMESTAMP_HYGIENE_FLAG = 0x10000000 CERT_CHAIN_ENABLE_WEAK_LOGGING_FLAG = 0x4 CERT_CHAIN_ENABLE_WEAK_RSA_ROOT_FLAG = 0x2 CERT_CHAIN_ENABLE_WEAK_SETTINGS_FLAG = 0x80000000 CERT_CHAIN_FIND_BY_ISSUER = 1 CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG = 0x8000 CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG = 0x4 CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG = 0x1 CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG = 0x2 CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG = 0x8 CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG = 0x4000 CERT_CHAIN_HAS_MOTW = 0x4000 CERT_CHAIN_MAX_AIA_URL_COUNT_IN_CERT_DEFAULT = 5 CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_BYTE_COUNT_DEFAULT = 100000 CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_CERT_COUNT_DEFAULT = 10 CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_COUNT_PER_CHAIN_DEFAULT = 3 CERT_CHAIN_MAX_SSL_TIME_UPDATED_EVENT_COUNT_DEFAULT = 5 CERT_CHAIN_MAX_SSL_TIME_UPDATED_EVENT_COUNT_DISABLE = 0xFFFFFFFF CERT_CHAIN_MAX_URL_RETRIEVAL_BYTE_COUNT_DEFAULT = 104857600 CERT_CHAIN_MIN_PUB_KEY_BIT_LENGTH_DISABLE = 0xFFFFFFFF CERT_CHAIN_MIN_RSA_PUB_KEY_BIT_LENGTH_DEFAULT = 1023 CERT_CHAIN_MIN_RSA_PUB_KEY_BIT_LENGTH_DISABLE = 0xffffffff CERT_CHAIN_MOTW_IGNORE_AFTER_TIME_WEAK_FLAG = 0x40000000 CERT_CHAIN_MOTW_WEAK_FLAGS = 1786773504 CERT_CHAIN_OCSP_VALIDITY_SECONDS_DEFAULT = 43200 CERT_CHAIN_ONLY_ADDITIONAL_AND_AUTH_ROOT = 0x8000 CERT_CHAIN_OPTION_DISABLE_AIA_URL_RETRIEVAL = 0x2 CERT_CHAIN_OPTION_ENABLE_SIA_URL_RETRIEVAL = 0x4 CERT_CHAIN_OPT_IN_WEAK_FLAGS = 262144 CERT_CHAIN_OPT_IN_WEAK_SIGNATURE = 0x10000 CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG = 0x8000 CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG = 0x10 CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS = 7 CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS = 3840 CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG = 0x400 CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAG = 0x2 CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG = 0x200 CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG = 0x100 CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAG = 0x8 CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG = 0x40 CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAG = 0x80 CERT_CHAIN_POLICY_IGNORE_NOT_SUPPORTED_CRITICAL_EXT_FLAG = 0x2000 CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG = 0x4 CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG = 0x1 CERT_CHAIN_POLICY_IGNORE_PEER_TRUST_FLAG = 0x1000 CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG = 0x800 CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG = 0x20 CERT_CHAIN_POLICY_SSL_F12_ERROR_LEVEL = 2 CERT_CHAIN_POLICY_SSL_F12_NONE_CATEGORY = 0 CERT_CHAIN_POLICY_SSL_F12_ROOT_PROGRAM_CATEGORY = 2 CERT_CHAIN_POLICY_SSL_F12_SUCCESS_LEVEL = 0 CERT_CHAIN_POLICY_SSL_F12_WARNING_LEVEL = 1 CERT_CHAIN_POLICY_SSL_F12_WEAK_CRYPTO_CATEGORY = 1 CERT_CHAIN_POLICY_SSL_KEY_PIN_MISMATCH_ERROR = -2 CERT_CHAIN_POLICY_SSL_KEY_PIN_MISMATCH_WARNING = 2 CERT_CHAIN_POLICY_SSL_KEY_PIN_MITM_ERROR = -1 CERT_CHAIN_POLICY_SSL_KEY_PIN_MITM_WARNING = 1 CERT_CHAIN_POLICY_SSL_KEY_PIN_SUCCESS = 0 CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG = 0x4000 CERT_CHAIN_RETURN_LOWER_QUALITY_CONTEXTS = 0x80 CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT = 0x8000000 CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY = 0x80000000 CERT_CHAIN_REVOCATION_CHECK_CHAIN = 0x20000000 CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = 0x40000000 CERT_CHAIN_REVOCATION_CHECK_END_CERT = 0x10000000 CERT_CHAIN_REVOCATION_CHECK_OCSP_CERT = 0x4000000 CERT_CHAIN_REV_ACCUMULATIVE_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_DEFAULT = 20000 CERT_CHAIN_STRONG_SIGN_DISABLE_END_CHECK_FLAG = 0x1 CERT_CHAIN_THREAD_STORE_SYNC = 0x2 CERT_CHAIN_TIMESTAMP_TIME = 0x200 CERT_CHAIN_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_DEFAULT = 15000 CERT_CHAIN_USE_LOCAL_MACHINE_STORE = 0x8 CERT_CHAIN_WEAK_RSA_PUB_KEY_TIME_DEFAULT = 0x01ca8a755c6e0000 CERT_CLOSE_STORE_CHECK_FLAG = 0x2 CERT_CLOSE_STORE_FORCE_FLAG = 0x1 CERT_CLR_DELETE_KEY_PROP_ID = 125 CERT_COMPARE_ANY = 0 CERT_COMPARE_ATTR = 3 CERT_COMPARE_CERT_ID = 16 CERT_COMPARE_CROSS_CERT_DIST_POINTS = 17 CERT_COMPARE_CTL_USAGE = 10 CERT_COMPARE_ENHKEY_USAGE = 10 CERT_COMPARE_EXISTING = 13 CERT_COMPARE_HASH = 1 CERT_COMPARE_HASH_STR = 20 CERT_COMPARE_HAS_PRIVATE_KEY = 21 CERT_COMPARE_ISSUER_OF = 12 CERT_COMPARE_KEY_IDENTIFIER = 15 CERT_COMPARE_KEY_SPEC = 9 CERT_COMPARE_MASK = 0xffff CERT_COMPARE_MD5_HASH = 4 CERT_COMPARE_NAME = 2 CERT_COMPARE_NAME_STR_A = 7 CERT_COMPARE_NAME_STR_W = 8 CERT_COMPARE_PROPERTY = 5 CERT_COMPARE_PUBKEY_MD5_HASH = 18 CERT_COMPARE_PUBLIC_KEY = 6 CERT_COMPARE_SHA1_HASH = 1 CERT_COMPARE_SHIFT = 16 CERT_COMPARE_SIGNATURE_HASH = 14 CERT_COMPARE_SUBJECT_CERT = 11 CERT_COMPARE_SUBJECT_INFO_ACCESS = 19 CERT_CONTEXT_REVOCATION_TYPE = 1 CERT_CREATE_CONTEXT_NOCOPY_FLAG = 0x1 CERT_CREATE_CONTEXT_NO_ENTRY_FLAG = 0x8 CERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAG = 0x4 CERT_CREATE_CONTEXT_SORTED_FLAG = 0x2 CERT_CREATE_SELFSIGN_NO_KEY_INFO = 2 CERT_CREATE_SELFSIGN_NO_SIGN = 1 CERT_CRL_SIGN_KEY_USAGE = 0x02 CERT_CROSS_CERT_DIST_POINTS_PROP_ID = 23 CERT_CTL_USAGE_PROP_ID = 9 CERT_DATA_ENCIPHERMENT_KEY_USAGE = 0x10 CERT_DATE_STAMP_PROP_ID = 27 CERT_DECIPHER_ONLY_KEY_USAGE = 0x80 CERT_DESCRIPTION_PROP_ID = 13 CERT_DIGITAL_SIGNATURE_KEY_USAGE = 0x80 CERT_DISALLOWED_CERT_CTL_FILENAME_A = "disallowedcert.stl" CERT_DISALLOWED_ENHKEY_USAGE_PROP_ID = 122 CERT_DISALLOWED_FILETIME_PROP_ID = 104 CERT_DSS_R_LEN = 20 CERT_DSS_SIGNATURE_LEN = 40 CERT_DSS_S_LEN = 20 CERT_EFS_PROP_ID = 17 CERT_ENCIPHER_ONLY_KEY_USAGE = 0x01 CERT_ENCODING_TYPE_MASK = 0x0000ffff CERT_END_ENTITY_SUBJECT_FLAG = 0x40 CERT_ENHKEY_USAGE_PROP_ID = 9 CERT_ENROLLMENT_PROP_ID = 26 CERT_EXCLUDED_SUBTREE_BIT = 2147483648 CERT_EXTENDED_ERROR_INFO_PROP_ID = 30 CERT_FILE_STORE_COMMIT_ENABLE_FLAG = 0x10000 CERT_FIND_ANY = 0 CERT_FIND_CERT_ID = 1048576 CERT_FIND_CROSS_CERT_DIST_POINTS = 1114112 CERT_FIND_CTL_USAGE = 655360 CERT_FIND_ENHKEY_USAGE = 655360 CERT_FIND_EXISTING = 851968 CERT_FIND_EXT_ONLY_CTL_USAGE_FLAG = 2 CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG = 0x2 CERT_FIND_HASH = 65536 CERT_FIND_HASH_STR = 1310720 CERT_FIND_HAS_PRIVATE_KEY = 1376256 CERT_FIND_ISSUER_ATTR = 196612 CERT_FIND_ISSUER_NAME = 131076 CERT_FIND_ISSUER_OF = 786432 CERT_FIND_ISSUER_STR = 524292 CERT_FIND_ISSUER_STR_A = 458756 CERT_FIND_ISSUER_STR_W = 524292 CERT_FIND_KEY_IDENTIFIER = 983040 CERT_FIND_KEY_SPEC = 589824 CERT_FIND_MD5_HASH = 262144 CERT_FIND_NO_CTL_USAGE_FLAG = 8 CERT_FIND_NO_ENHKEY_USAGE_FLAG = 0x8 CERT_FIND_OPTIONAL_CTL_USAGE_FLAG = 1 CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG = 0x1 CERT_FIND_OR_CTL_USAGE_FLAG = 16 CERT_FIND_OR_ENHKEY_USAGE_FLAG = 0x10 CERT_FIND_PROPERTY = 327680 CERT_FIND_PROP_ONLY_CTL_USAGE_FLAG = 4 CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG = 0x4 CERT_FIND_PUBKEY_MD5_HASH = 1179648 CERT_FIND_PUBLIC_KEY = 393216 CERT_FIND_SHA1_HASH = 65536 CERT_FIND_SIGNATURE_HASH = 917504 CERT_FIND_SUBJECT_ATTR = 196615 CERT_FIND_SUBJECT_CERT = 720896 CERT_FIND_SUBJECT_INFO_ACCESS = 1245184 CERT_FIND_SUBJECT_NAME = 131079 CERT_FIND_SUBJECT_STR = 524295 CERT_FIND_SUBJECT_STR_A = 458759 CERT_FIND_SUBJECT_STR_W = 524295 CERT_FIND_VALID_CTL_USAGE_FLAG = 32 CERT_FIND_VALID_ENHKEY_USAGE_FLAG = 0x20 CERT_FIRST_RESERVED_PROP_ID = 107 CERT_FIRST_USER_PROP_ID = 0x8000 CERT_FORTEZZA_DATA_PROP_ID = 18 CERT_FRIENDLY_NAME_PROP_ID = 11 CERT_HASH_PROP_ID = 3 CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID = 79 CERT_HCRYPTPROV_TRANSFER_PROP_ID = 100 CERT_ID_ISSUER_SERIAL_NUMBER = 1 CERT_ID_KEY_IDENTIFIER = 2 CERT_ID_SHA1_HASH = 3 CERT_IE30_RESERVED_PROP_ID = 7 CERT_INFO_EXTENSION_FLAG = 11 CERT_INFO_ISSUER_FLAG = 4 CERT_INFO_ISSUER_UNIQUE_ID_FLAG = 9 CERT_INFO_NOT_AFTER_FLAG = 6 CERT_INFO_NOT_BEFORE_FLAG = 5 CERT_INFO_SERIAL_NUMBER_FLAG = 2 CERT_INFO_SIGNATURE_ALGORITHM_FLAG = 3 CERT_INFO_SUBJECT_FLAG = 7 CERT_INFO_SUBJECT_PUBLIC_KEY_INFO_FLAG = 8 CERT_INFO_SUBJECT_UNIQUE_ID_FLAG = 10 CERT_INFO_VERSION_FLAG = 1 CERT_ISOLATED_KEY_PROP_ID = 118 CERT_ISSUER_CHAIN_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID = 96 CERT_ISSUER_CHAIN_SIGN_HASH_CNG_ALG_PROP_ID = 95 CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID = 24 CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID = 94 CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID = 28 CERT_KEYGEN_REQUEST_V1 = 0 CERT_KEY_AGREEMENT_KEY_USAGE = 0x08 CERT_KEY_CERT_SIGN_KEY_USAGE = 0x04 CERT_KEY_CLASSIFICATION_PROP_ID = 120 CERT_KEY_CONTEXT_PROP_ID = 5 CERT_KEY_ENCIPHERMENT_KEY_USAGE = 0x20 CERT_KEY_IDENTIFIER_PROP_ID = 20 CERT_KEY_PROV_HANDLE_PROP_ID = 1 CERT_KEY_PROV_INFO_PROP_ID = 2 CERT_KEY_REPAIR_ATTEMPTED_PROP_ID = 103 CERT_KEY_SPEC_PROP_ID = 6 CERT_LAST_RESERVED_PROP_ID = 0x00007fff CERT_LAST_USER_PROP_ID = 0x0000ffff CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG = 0x20000 CERT_LDAP_STORE_OPENED_FLAG = 0x40000 CERT_LDAP_STORE_SIGN_FLAG = 0x10000 CERT_LDAP_STORE_UNBIND_FLAG = 0x80000 CERT_LOGOTYPE_BITS_IMAGE_RESOLUTION_CHOICE = 1 CERT_LOGOTYPE_COLOR_IMAGE_INFO_CHOICE = 2 CERT_LOGOTYPE_DIRECT_INFO_CHOICE = 1 CERT_LOGOTYPE_GRAY_SCALE_IMAGE_INFO_CHOICE = 1 CERT_LOGOTYPE_INDIRECT_INFO_CHOICE = 2 CERT_LOGOTYPE_NO_IMAGE_RESOLUTION_CHOICE = 0 CERT_LOGOTYPE_TABLE_SIZE_IMAGE_RESOLUTION_CHOICE = 2 CERT_MAX_ASN_ENCODED_DSS_SIGNATURE_LEN = 48 CERT_MD5_HASH_PROP_ID = 4 CERT_NAME_ATTR_TYPE = 3 CERT_NAME_DISABLE_IE4_UTF8_FLAG = 0x10000 CERT_NAME_DNS_TYPE = 6 CERT_NAME_EMAIL_TYPE = 1 CERT_NAME_FRIENDLY_DISPLAY_TYPE = 5 CERT_NAME_ISSUER_FLAG = 0x1 CERT_NAME_RDN_TYPE = 2 CERT_NAME_SEARCH_ALL_NAMES_FLAG = 0x2 CERT_NAME_SIMPLE_DISPLAY_TYPE = 4 CERT_NAME_STR_COMMA_FLAG = 0x4000000 CERT_NAME_STR_CRLF_FLAG = 0x8000000 CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG = 0x10000 CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG = 0x100000 CERT_NAME_STR_ENABLE_PUNYCODE_FLAG = 0x200000 CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG = 0x20000 CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG = 0x40000 CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG = 0x80000 CERT_NAME_STR_FORWARD_FLAG = 0x1000000 CERT_NAME_STR_NO_PLUS_FLAG = 0x20000000 CERT_NAME_STR_NO_QUOTING_FLAG = 0x10000000 CERT_NAME_STR_REVERSE_FLAG = 0x2000000 CERT_NAME_STR_SEMICOLON_FLAG = 0x40000000 CERT_NAME_UPN_TYPE = 8 CERT_NAME_URL_TYPE = 7 CERT_NCRYPT_KEY_HANDLE_PROP_ID = 78 CERT_NCRYPT_KEY_HANDLE_TRANSFER_PROP_ID = 99 CERT_NCRYPT_KEY_SPEC = 0xffffffff CERT_NEW_KEY_PROP_ID = 74 CERT_NEXT_UPDATE_LOCATION_PROP_ID = 10 CERT_NONCOMPLIANT_ROOT_URL_PROP_ID = 123 CERT_NON_REPUDIATION_KEY_USAGE = 0x40 CERT_NOT_BEFORE_ENHKEY_USAGE_PROP_ID = 127 CERT_NOT_BEFORE_FILETIME_PROP_ID = 126 CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID = 77 CERT_NO_EXPIRE_NOTIFICATION_PROP_ID = 97 CERT_OCSP_CACHE_PREFIX_PROP_ID = 75 CERT_OCSP_MUST_STAPLE_PROP_ID = 121 CERT_OCSP_RESPONSE_PROP_ID = 70 CERT_OFFLINE_CRL_SIGN_KEY_USAGE = 0x02 CERT_OID_NAME_STR = 2 CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG = 0x1 CERT_PHYSICAL_STORE_INSERT_COMPUTER_NAME_ENABLE_FLAG = 0x8 CERT_PHYSICAL_STORE_OPEN_DISABLE_FLAG = 0x2 CERT_PHYSICAL_STORE_PREDEFINED_ENUM_FLAG = 0x1 CERT_PHYSICAL_STORE_REMOTE_OPEN_DISABLE_FLAG = 0x4 CERT_PIN_RULES_CTL_FILENAME_A = "pinrules.stl" CERT_PIN_SHA256_HASH_PROP_ID = 124 CERT_PROT_ROOT_DISABLE_CURRENT_USER_FLAG = 0x1 CERT_PROT_ROOT_DISABLE_LM_AUTH_FLAG = 0x8 CERT_PROT_ROOT_DISABLE_NOT_DEFINED_NAME_CONSTRAINT_FLAG = 0x20 CERT_PROT_ROOT_DISABLE_NT_AUTH_REQUIRED_FLAG = 0x10 CERT_PROT_ROOT_DISABLE_PEER_TRUST = 0x10000 CERT_PROT_ROOT_INHIBIT_ADD_AT_INIT_FLAG = 0x2 CERT_PROT_ROOT_INHIBIT_PURGE_LM_FLAG = 0x4 CERT_PROT_ROOT_ONLY_LM_GPT_FLAG = 0x8 CERT_PROT_ROOT_PEER_USAGES_VALUE_NAME_A = "PeerUsages" CERT_PUBKEY_ALG_PARA_PROP_ID = 22 CERT_PUBKEY_HASH_RESERVED_PROP_ID = 8 CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID = 93 CERT_PVK_FILE_PROP_ID = 12 CERT_QUERY_CONTENT_CERT = 1 CERT_QUERY_CONTENT_CERT_PAIR = 13 CERT_QUERY_CONTENT_CRL = 3 CERT_QUERY_CONTENT_CTL = 2 CERT_QUERY_CONTENT_FLAG_ALL = 16382 CERT_QUERY_CONTENT_FLAG_ALL_ISSUER_CERT = 818 CERT_QUERY_CONTENT_FLAG_CERT = 2 CERT_QUERY_CONTENT_FLAG_CERT_PAIR = 8192 CERT_QUERY_CONTENT_FLAG_CRL = 8 CERT_QUERY_CONTENT_FLAG_CTL = 4 CERT_QUERY_CONTENT_FLAG_PFX = 4096 CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD = 16384 CERT_QUERY_CONTENT_FLAG_PKCS10 = 2048 CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED = 256 CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED = 1024 CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED = 512 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT = 32 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL = 128 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL = 64 CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE = 16 CERT_QUERY_CONTENT_PFX = 12 CERT_QUERY_CONTENT_PFX_AND_LOAD = 14 CERT_QUERY_CONTENT_PKCS10 = 11 CERT_QUERY_CONTENT_PKCS7_SIGNED = 8 CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED = 10 CERT_QUERY_CONTENT_PKCS7_UNSIGNED = 9 CERT_QUERY_CONTENT_SERIALIZED_CERT = 5 CERT_QUERY_CONTENT_SERIALIZED_CRL = 7 CERT_QUERY_CONTENT_SERIALIZED_CTL = 6 CERT_QUERY_CONTENT_SERIALIZED_STORE = 4 CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED = 3 CERT_QUERY_FORMAT_BASE64_ENCODED = 2 CERT_QUERY_FORMAT_BINARY = 1 CERT_QUERY_FORMAT_FLAG_ALL = 14 CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = 8 CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = 4 CERT_QUERY_FORMAT_FLAG_BINARY = 2 CERT_QUERY_OBJECT_BLOB = 0x2 CERT_QUERY_OBJECT_FILE = 0x1 CERT_RDN_ANY_TYPE = 0 CERT_RDN_BMP_STRING = 12 CERT_RDN_DISABLE_CHECK_TYPE_FLAG = 0x40000000 CERT_RDN_DISABLE_IE4_UTF8_FLAG = 0x1000000 CERT_RDN_ENABLE_PUNYCODE_FLAG = 0x2000000 CERT_RDN_ENABLE_T61_UNICODE_FLAG = 0x80000000 CERT_RDN_ENABLE_UTF8_UNICODE_FLAG = 0x20000000 CERT_RDN_ENCODED_BLOB = 1 CERT_RDN_FLAGS_MASK = 0xff000000 CERT_RDN_FORCE_UTF8_UNICODE_FLAG = 0x10000000 CERT_RDN_GENERAL_STRING = 10 CERT_RDN_GRAPHIC_STRING = 8 CERT_RDN_IA5_STRING = 7 CERT_RDN_INT4_STRING = 11 CERT_RDN_ISO646_STRING = 9 CERT_RDN_NUMERIC_STRING = 3 CERT_RDN_OCTET_STRING = 2 CERT_RDN_PRINTABLE_STRING = 4 CERT_RDN_T61_STRING = 5 CERT_RDN_TELETEX_STRING = 5 CERT_RDN_TYPE_MASK = 0x000000ff CERT_RDN_UNICODE_STRING = 12 CERT_RDN_UNIVERSAL_STRING = 11 CERT_RDN_UTF8_STRING = 13 CERT_RDN_VIDEOTEX_STRING = 6 CERT_RDN_VISIBLE_STRING = 9 CERT_REGISTRY_STORE_CLIENT_GPT_FLAG = 0x80000000 CERT_REGISTRY_STORE_EXTERNAL_FLAG = 0x100000 CERT_REGISTRY_STORE_LM_GPT_FLAG = 0x1000000 CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAG = 0x80000 CERT_REGISTRY_STORE_REMOTE_FLAG = 0x10000 CERT_REGISTRY_STORE_ROAMING_FLAG = 0x40000 CERT_REGISTRY_STORE_SERIALIZED_FLAG = 0x20000 CERT_RENEWAL_PROP_ID = 64 CERT_REQUEST_ORIGINATOR_PROP_ID = 71 CERT_REQUEST_V1 = 0 CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID = 83 CERT_ROOT_PROGRAM_CHAIN_POLICIES_PROP_ID = 105 CERT_ROOT_PROGRAM_FLAG_ADDRESS = 0x08 CERT_ROOT_PROGRAM_FLAG_LSC = 0x40 CERT_ROOT_PROGRAM_FLAG_ORG = 0x80 CERT_ROOT_PROGRAM_FLAG_OU = 0x10 CERT_ROOT_PROGRAM_FLAG_SUBJECT_LOGO = 0x20 CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID = 84 CERT_SCARD_PIN_ID_PROP_ID = 90 CERT_SCARD_PIN_INFO_PROP_ID = 91 CERT_SCEP_CA_CERT_PROP_ID = 111 CERT_SCEP_ENCRYPT_HASH_CNG_ALG_PROP_ID = 114 CERT_SCEP_FLAGS_PROP_ID = 115 CERT_SCEP_GUID_PROP_ID = 116 CERT_SCEP_NONCE_PROP_ID = 113 CERT_SCEP_RA_ENCRYPTION_CERT_PROP_ID = 110 CERT_SCEP_RA_SIGNATURE_CERT_PROP_ID = 109 CERT_SCEP_SERVER_CERTS_PROP_ID = 108 CERT_SCEP_SIGNER_CERT_PROP_ID = 112 CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID = 102 CERT_SERIALIZABLE_KEY_CONTEXT_PROP_ID = 117 CERT_SERIAL_CHAIN_PROP_ID = 119 CERT_SET_KEY_CONTEXT_PROP_ID = 0x1 CERT_SET_KEY_PROV_HANDLE_PROP_ID = 0x1 CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG = 0x80000000 CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG = 0x40000000 CERT_SHA1_HASH_PROP_ID = 3 CERT_SHA256_HASH_PROP_ID = 107 CERT_SIGNATURE_HASH_PROP_ID = 15 CERT_SIGN_HASH_CNG_ALG_PROP_ID = 89 CERT_SIMPLE_NAME_STR = 1 CERT_SMART_CARD_DATA_PROP_ID = 16 CERT_SMART_CARD_READER_NON_REMOVABLE_PROP_ID = 106 CERT_SMART_CARD_READER_PROP_ID = 101 CERT_SMART_CARD_ROOT_INFO_PROP_ID = 76 CERT_SOURCE_LOCATION_PROP_ID = 72 CERT_SOURCE_URL_PROP_ID = 73 CERT_SRV_OCSP_RESP_MAX_BEFORE_NEXT_UPDATE_SECONDS_DEFAULT = 14400 CERT_SRV_OCSP_RESP_MAX_SYNC_CERT_FILE_SECONDS_DEFAULT = 3600 CERT_SRV_OCSP_RESP_MIN_AFTER_NEXT_UPDATE_SECONDS_DEFAULT = 60 CERT_SRV_OCSP_RESP_MIN_BEFORE_NEXT_UPDATE_SECONDS_DEFAULT = 120 CERT_SRV_OCSP_RESP_MIN_SYNC_CERT_FILE_SECONDS_DEFAULT = 5 CERT_SRV_OCSP_RESP_MIN_VALIDITY_SECONDS_DEFAULT = 600 CERT_SRV_OCSP_RESP_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_DEFAULT = 15000 CERT_STORE_ADD_ALWAYS = 4 CERT_STORE_ADD_NEW = 1 CERT_STORE_ADD_NEWER = 6 CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES = 7 CERT_STORE_ADD_REPLACE_EXISTING = 3 CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5 CERT_STORE_ADD_USE_EXISTING = 2 CERT_STORE_ALL_CONTEXT_FLAG = 18446744073709551615 CERT_STORE_BACKUP_RESTORE_FLAG = 0x800 CERT_STORE_BASE_CRL_FLAG = 0x100 CERT_STORE_CERTIFICATE_CONTEXT = 1 CERT_STORE_CERTIFICATE_CONTEXT_FLAG = 2 CERT_STORE_CREATE_NEW_FLAG = 0x2000 CERT_STORE_CRL_CONTEXT = 2 CERT_STORE_CRL_CONTEXT_FLAG = 4 CERT_STORE_CTL_CONTEXT = 3 CERT_STORE_CTL_CONTEXT_FLAG = 8 CERT_STORE_CTRL_AUTO_RESYNC = 4 CERT_STORE_CTRL_CANCEL_NOTIFY = 5 CERT_STORE_CTRL_COMMIT = 3 CERT_STORE_CTRL_COMMIT_CLEAR_FLAG = 0x2 CERT_STORE_CTRL_COMMIT_FORCE_FLAG = 0x1 CERT_STORE_CTRL_INHIBIT_DUPLICATE_HANDLE_FLAG = 0x1 CERT_STORE_CTRL_NOTIFY_CHANGE = 2 CERT_STORE_CTRL_RESYNC = 1 CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x4 CERT_STORE_DELETE_FLAG = 0x10 CERT_STORE_DELTA_CRL_FLAG = 0x200 CERT_STORE_ENUM_ARCHIVED_FLAG = 0x200 CERT_STORE_LOCALIZED_NAME_PROP_ID = 0x1000 CERT_STORE_MANIFOLD_FLAG = 0x100 CERT_STORE_MAXIMUM_ALLOWED_FLAG = 0x1000 CERT_STORE_NO_CRL_FLAG = 0x10000 CERT_STORE_NO_CRYPT_RELEASE_FLAG = 0x1 CERT_STORE_NO_ISSUER_FLAG = 0x20000 CERT_STORE_OPEN_EXISTING_FLAG = 0x4000 CERT_STORE_PROV_CLOSE_FUNC = 0 CERT_STORE_PROV_CONTROL_FUNC = 13 CERT_STORE_PROV_DELETED_FLAG = 0x2 CERT_STORE_PROV_DELETE_CERT_FUNC = 3 CERT_STORE_PROV_DELETE_CRL_FUNC = 7 CERT_STORE_PROV_DELETE_CTL_FUNC = 11 CERT_STORE_PROV_EXTERNAL_FLAG = 0x1 CERT_STORE_PROV_FIND_CERT_FUNC = 14 CERT_STORE_PROV_FIND_CRL_FUNC = 17 CERT_STORE_PROV_FIND_CTL_FUNC = 20 CERT_STORE_PROV_FREE_FIND_CERT_FUNC = 15 CERT_STORE_PROV_FREE_FIND_CRL_FUNC = 18 CERT_STORE_PROV_FREE_FIND_CTL_FUNC = 21 CERT_STORE_PROV_GET_CERT_PROPERTY_FUNC = 16 CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC = 19 CERT_STORE_PROV_GET_CTL_PROPERTY_FUNC = 22 CERT_STORE_PROV_GP_SYSTEM_STORE_FLAG = 0x20 CERT_STORE_PROV_LM_SYSTEM_STORE_FLAG = 0x10 CERT_STORE_PROV_NO_PERSIST_FLAG = 0x4 CERT_STORE_PROV_READ_CERT_FUNC = 1 CERT_STORE_PROV_READ_CRL_FUNC = 5 CERT_STORE_PROV_READ_CTL_FUNC = 9 CERT_STORE_PROV_SET_CERT_PROPERTY_FUNC = 4 CERT_STORE_PROV_SET_CRL_PROPERTY_FUNC = 8 CERT_STORE_PROV_SET_CTL_PROPERTY_FUNC = 12 CERT_STORE_PROV_SHARED_USER_FLAG = 0x40 CERT_STORE_PROV_SYSTEM_STORE_FLAG = 0x8 CERT_STORE_PROV_WRITE_ADD_FLAG = 0x1 CERT_STORE_PROV_WRITE_CERT_FUNC = 2 CERT_STORE_PROV_WRITE_CRL_FUNC = 6 CERT_STORE_PROV_WRITE_CTL_FUNC = 10 CERT_STORE_READONLY_FLAG = 0x8000 CERT_STORE_REVOCATION_FLAG = 0x4 CERT_STORE_SAVE_AS_PKCS12 = 3 CERT_STORE_SAVE_AS_PKCS7 = 2 CERT_STORE_SAVE_AS_STORE = 1 CERT_STORE_SAVE_TO_FILE = 1 CERT_STORE_SAVE_TO_FILENAME = 4 CERT_STORE_SAVE_TO_FILENAME_A = 3 CERT_STORE_SAVE_TO_FILENAME_W = 4 CERT_STORE_SAVE_TO_MEMORY = 2 CERT_STORE_SET_LOCALIZED_NAME_FLAG = 0x2 CERT_STORE_SHARE_CONTEXT_FLAG = 0x80 CERT_STORE_SHARE_STORE_FLAG = 0x40 CERT_STORE_SIGNATURE_FLAG = 0x1 CERT_STORE_TIME_VALIDITY_FLAG = 0x2 CERT_STORE_UNSAFE_PHYSICAL_FLAG = 0x20 CERT_STORE_UPDATE_KEYID_FLAG = 0x400 CERT_STRONG_SIGN_ENABLE_CRL_CHECK = 0x1 CERT_STRONG_SIGN_ENABLE_OCSP_CHECK = 0x2 CERT_STRONG_SIGN_OID_INFO_CHOICE = 2 CERT_STRONG_SIGN_SERIALIZED_INFO_CHOICE = 1 CERT_SUBJECT_DISABLE_CRL_PROP_ID = 86 CERT_SUBJECT_INFO_ACCESS_PROP_ID = 80 CERT_SUBJECT_NAME_MD5_HASH_PROP_ID = 29 CERT_SUBJECT_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID = 85 CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID = 25 CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID = 92 CERT_SYSTEM_STORE_CURRENT_SERVICE = 262144 CERT_SYSTEM_STORE_CURRENT_SERVICE_ID = 4 CERT_SYSTEM_STORE_CURRENT_USER = 65536 CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY = 458752 CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY_ID = 7 CERT_SYSTEM_STORE_CURRENT_USER_ID = 1 CERT_SYSTEM_STORE_DEFER_READ_FLAG = 0x20000000 CERT_SYSTEM_STORE_LOCAL_MACHINE = 131072 CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 589824 CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE_ID = 9 CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 524288 CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY_ID = 8 CERT_SYSTEM_STORE_LOCAL_MACHINE_ID = 2 CERT_SYSTEM_STORE_LOCAL_MACHINE_WCOS = 655360 CERT_SYSTEM_STORE_LOCAL_MACHINE_WCOS_ID = 10 CERT_SYSTEM_STORE_LOCATION_MASK = 0x00ff0000 CERT_SYSTEM_STORE_LOCATION_SHIFT = 16 CERT_SYSTEM_STORE_MASK = 0xffff0000 CERT_SYSTEM_STORE_RELOCATE_FLAG = 0x80000000 CERT_SYSTEM_STORE_SERVICES = 327680 CERT_SYSTEM_STORE_SERVICES_ID = 5 CERT_SYSTEM_STORE_UNPROTECTED_FLAG = 0x40000000 CERT_SYSTEM_STORE_USERS = 393216 CERT_SYSTEM_STORE_USERS_ID = 6 CERT_TRUST_AUTO_UPDATE_CA_REVOCATION = 0x10 CERT_TRUST_AUTO_UPDATE_END_REVOCATION = 0x20 CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID = 0x40000 CERT_TRUST_CTL_IS_NOT_TIME_VALID = 0x20000 CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE = 0x80000 CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED = 0x1000 CERT_TRUST_HAS_EXACT_MATCH_ISSUER = 0x1 CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x8000 CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY = 0x200 CERT_TRUST_HAS_KEY_MATCH_ISSUER = 0x2 CERT_TRUST_HAS_NAME_MATCH_ISSUER = 0x4 CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x2000 CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x4000 CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x8000000 CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x1000 CERT_TRUST_HAS_PREFERRED_ISSUER = 0x100 CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS = 0x400 CERT_TRUST_HAS_WEAK_SIGNATURE = 0x100000 CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x400 CERT_TRUST_INVALID_EXTENSION = 0x100 CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x800 CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x200 CERT_TRUST_IS_COMPLEX_CHAIN = 0x00010000 CERT_TRUST_IS_CYCLIC = 0x80 CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x4000000 CERT_TRUST_IS_FROM_EXCLUSIVE_TRUST_STORE = 0x2000 CERT_TRUST_IS_KEY_ROLLOVER = 0x00000080 CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x8 CERT_TRUST_IS_NOT_TIME_NESTED = 0x2 CERT_TRUST_IS_NOT_TIME_VALID = 0x1 CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x10 CERT_TRUST_IS_OFFLINE_REVOCATION = 0x1000000 CERT_TRUST_IS_PARTIAL_CHAIN = 0x10000 CERT_TRUST_IS_PEER_TRUSTED = 0x800 CERT_TRUST_IS_REVOKED = 0x4 CERT_TRUST_IS_SELF_SIGNED = 0x8 CERT_TRUST_IS_UNTRUSTED_ROOT = 0x20 CERT_TRUST_NO_ERROR = 0x0 CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x2000000 CERT_TRUST_NO_OCSP_FAILOVER_TO_CRL = 0x40 CERT_TRUST_NO_TIME_CHECK = 0x02000000 CERT_TRUST_PUB_ALLOW_END_USER_TRUST = 0x0 CERT_TRUST_PUB_ALLOW_ENTERPRISE_ADMIN_TRUST = 0x2 CERT_TRUST_PUB_ALLOW_MACHINE_ADMIN_TRUST = 0x1 CERT_TRUST_PUB_ALLOW_TRUST_MASK = 0x3 CERT_TRUST_PUB_CHECK_PUBLISHER_REV_FLAG = 0x100 CERT_TRUST_PUB_CHECK_TIMESTAMP_REV_FLAG = 0x200 CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x40 CERT_TRUST_SSL_HANDSHAKE_OCSP = 0x00040000 CERT_TRUST_SSL_RECONNECT_OCSP = 0x00100000 CERT_TRUST_SSL_TIME_VALID = 0x01000000 CERT_TRUST_SSL_TIME_VALID_OCSP = 0x00080000 CERT_UNICODE_ATTR_ERR_INDEX_MASK = 0x3f CERT_UNICODE_ATTR_ERR_INDEX_SHIFT = 16 CERT_UNICODE_IS_RDN_ATTRS_FLAG = 0x1 CERT_UNICODE_RDN_ERR_INDEX_MASK = 0x3ff CERT_UNICODE_RDN_ERR_INDEX_SHIFT = 22 CERT_UNICODE_VALUE_ERR_INDEX_MASK = 0xffff CERT_UNICODE_VALUE_ERR_INDEX_SHIFT = 0 CERT_V1 = 0 CERT_V2 = 1 CERT_V3 = 2 CERT_VERIFY_ALLOW_MORE_USAGE_FLAG = 0x8 CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION = 0x2 CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG = 0x1 CERT_VERIFY_NO_TIME_CHECK_FLAG = 0x4 CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG = 0x4 CERT_VERIFY_REV_CHAIN_FLAG = 0x1 CERT_VERIFY_REV_NO_OCSP_FAILOVER_TO_CRL_FLAG = 0x10 CERT_VERIFY_REV_SERVER_OCSP_FLAG = 0x8 CERT_VERIFY_TRUSTED_SIGNERS_FLAG = 0x2 CERT_VERIFY_UPDATED_CTL_FLAG = 0x1 CERT_X500_NAME_STR = 3 CERT_XML_NAME_STR = 4 CE_BREAK = 0x10 CE_DNS = 0x800 CE_FRAME = 0x8 CE_IOE = 0x400 CE_MODE = 0x8000 CE_OOP = 0x1000 CE_OVERRUN = 0x2 CE_PTO = 0x200 CE_RXOVER = 0x1 CE_RXPARITY = 0x4 CE_TXFULL = 0x100 CFERR_CHOOSEFONTCODES = 0x2000 CFERR_MAXLESSTHANMIN = 0x2002 CFERR_NOFONTS = 0x2001 CFG_CALL_TARGET_CONVERT_EXPORT_SUPPRESSED_TO_VALID = 0x04 CFG_CALL_TARGET_PROCESSED = 0x02 CFG_CALL_TARGET_VALID = 0x01 CFSEPCHAR = 43 CFS_CANDIDATEPOS = 0x0040 CFS_DEFAULT = 0x0000 CFS_EXCLUDE = 0x0080 CFS_FORCE_POSITION = 0x0020 CFS_POINT = 0x0002 CFS_RECT = 0x0001 CF_ANSIONLY = 1024 CF_APPLY = 512 CF_BITMAP = 2 CF_BOTH = 3 CF_DIB = 8 CF_DIBV5 = 17 CF_DIF = 5 CF_DSPBITMAP = 0x0082 CF_DSPENHMETAFILE = 0x008E CF_DSPMETAFILEPICT = 0x0083 CF_DSPTEXT = 0x0081 CF_EFFECTS = 256 CF_ENABLEHOOK = 8 CF_ENABLETEMPLATE = 16 CF_ENABLETEMPLATEHANDLE = 32 CF_ENHMETAFILE = 14 CF_FIXEDPITCHONLY = 16384 CF_FORCEFONTEXIST = 65536 CF_GDIOBJFIRST = 0x0300 CF_GDIOBJLAST = 0x03FF CF_HDROP = 15 CF_INITTOLOGFONTSTRUCT = 64 CF_LIMITSIZE = 8192 CF_LOCALE = 16 CF_MAX = 18 CF_METAFILEPICT = 3 CF_NOFACESEL = 524288 CF_NOOEMFONTS = 2048 CF_NOSCRIPTSEL = 8388608 CF_NOSIMULATIONS = 4096 CF_NOSIZESEL = 2097152 CF_NOSTYLESEL = 1048576 CF_NOVECTORFONTS = 2048 CF_NOVERTFONTS = 16777216 CF_NULL = 0 CF_OEMTEXT = 7 CF_OWNERDISPLAY = 0x0080 CF_PALETTE = 9 CF_PENDATA = 10 CF_PRINTERFONTS = 0x2 CF_PRIVATEFIRST = 0x0200 CF_PRIVATELAST = 0x02FF CF_RIFF = 11 CF_SCALABLEONLY = 131072 CF_SCREENFONTS = 0x1 CF_SCRIPTSONLY = 1024 CF_SELECTSCRIPT = 4194304 CF_SHOWHELP = 4 CF_SYLK = 4 CF_TEXT = 1 CF_TIFF = 6 CF_TTONLY = 262144 CF_UNICODETEXT = 13 CF_USESTYLE = 128 CF_WAVE = 12 CF_WYSIWYG = 32768 CHANGER_BAR_CODE_SCANNER_INSTALLED = 0x00000001 CHANGER_CARTRIDGE_MAGAZINE = 0x00000100 CHANGER_CLEANER_ACCESS_NOT_VALID = 0x00040000 CHANGER_CLEANER_AUTODISMOUNT = 0x80000004 CHANGER_CLEANER_OPS_NOT_SUPPORTED = 0x80000040 CHANGER_CLEANER_SLOT = 0x00000040 CHANGER_CLOSE_IEPORT = 0x00000004 CHANGER_DEVICE_REINITIALIZE_CAPABLE = 0x08000000 CHANGER_DRIVE_CLEANING_REQUIRED = 0x00010000 CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS = 0x20000000 CHANGER_EXCHANGE_MEDIA = 0x00000020 CHANGER_IEPORT_USER_CONTROL_CLOSE = 0x80000100 CHANGER_IEPORT_USER_CONTROL_OPEN = 0x80000080 CHANGER_INIT_ELEM_STAT_WITH_RANGE = 0x00000002 CHANGER_KEYPAD_ENABLE_DISABLE = 0x10000000 CHANGER_LOCK_UNLOCK = 0x00000080 CHANGER_MEDIUM_FLIP = 0x00000200 CHANGER_MOVE_EXTENDS_IEPORT = 0x80000200 CHANGER_MOVE_RETRACTS_IEPORT = 0x80000400 CHANGER_OPEN_IEPORT = 0x00000008 CHANGER_POSITION_TO_ELEMENT = 0x00000400 CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE = 0x80000002 CHANGER_PREDISMOUNT_ALIGN_TO_SLOT = 0x80000001 CHANGER_PREDISMOUNT_EJECT_REQUIRED = 0x00020000 CHANGER_PREMOUNT_EJECT_REQUIRED = 0x00080000 CHANGER_REPORT_IEPORT_STATE = 0x00000800 CHANGER_RESERVED_BIT = 0x80000000 CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR = 0x80000020 CHANGER_SERIAL_NUMBER_VALID = 0x04000000 CHANGER_SLOTS_USE_TRAYS = 0x80000010 CHANGER_STATUS_NON_VOLATILE = 0x00000010 CHANGER_STORAGE_DRIVE = 0x00001000 CHANGER_STORAGE_IEPORT = 0x00002000 CHANGER_STORAGE_SLOT = 0x00004000 CHANGER_STORAGE_TRANSPORT = 0x00008000 CHANGER_TO_DRIVE = 0x08 CHANGER_TO_IEPORT = 0x04 CHANGER_TO_SLOT = 0x02 CHANGER_TO_TRANSPORT = 0x01 CHANGER_TRUE_EXCHANGE_CAPABLE = 0x80000008 CHANGER_VOLUME_ASSERT = 0x00400000 CHANGER_VOLUME_IDENTIFICATION = 0x00100000 CHANGER_VOLUME_REPLACE = 0x00800000 CHANGER_VOLUME_SEARCH = 0x00200000 CHANGER_VOLUME_UNDEFINE = 0x01000000 CHAR_BIT = 8 CHAR_MAX = 127 CHAR_MIN = -128 CHECKJPEGFORMAT = 4119 CHECKPNGFORMAT = 4120 CHILDID_SELF = 0 CHINESEBIG5_CHARSET = 136 CKCNSTRNT_COLUMN = 0x01 CKCNSTRNT_ROWID = 0x02 CLAIM_SECURITY_ATTRIBUTES_INFORMATION_VERSION = 1 CLAIM_SECURITY_ATTRIBUTES_INFORMATION_VERSION_V1 = 1 CLAIM_SECURITY_ATTRIBUTE_CUSTOM_FLAGS = 0xffff0000 CLAIM_SECURITY_ATTRIBUTE_DISABLED = 0x0010 CLAIM_SECURITY_ATTRIBUTE_DISABLED_BY_DEFAULT = 0x0008 CLAIM_SECURITY_ATTRIBUTE_MANDATORY = 0x0020 CLAIM_SECURITY_ATTRIBUTE_NON_INHERITABLE = 0x0001 CLAIM_SECURITY_ATTRIBUTE_TYPE_BOOLEAN = 0x06 CLAIM_SECURITY_ATTRIBUTE_TYPE_FQBN = 0x04 CLAIM_SECURITY_ATTRIBUTE_TYPE_INT64 = 0x01 CLAIM_SECURITY_ATTRIBUTE_TYPE_INVALID = 0x00 CLAIM_SECURITY_ATTRIBUTE_TYPE_OCTET_STRING = 0x10 CLAIM_SECURITY_ATTRIBUTE_TYPE_SID = 0x05 CLAIM_SECURITY_ATTRIBUTE_TYPE_STRING = 0x03 CLAIM_SECURITY_ATTRIBUTE_TYPE_UINT64 = 0x02 CLAIM_SECURITY_ATTRIBUTE_USE_FOR_DENY_ONLY = 0x0004 CLAIM_SECURITY_ATTRIBUTE_VALID_FLAGS = 63 CLAIM_SECURITY_ATTRIBUTE_VALUE_CASE_SENSITIVE = 0x0002 CLASSFACTORY_E_FIRST = 2147746064 CLASSFACTORY_E_LAST = 2147746079 CLASSFACTORY_S_FIRST = 262416 CLASSFACTORY_S_LAST = 262431 CLEARTYPE_NATURAL_QUALITY = 6 CLEARTYPE_QUALITY = 5 CLIENTSITE_E_FIRST = 2147746192 CLIENTSITE_E_LAST = 2147746207 CLIENTSITE_S_FIRST = 262544 CLIENTSITE_S_LAST = 262559 CLIPBRD_E_FIRST = 2147746256 CLIPBRD_E_LAST = 2147746271 CLIPBRD_S_FIRST = 262608 CLIPBRD_S_LAST = 262623 CLIPCAPS = 36 CLIP_CHARACTER_PRECIS = 1 CLIP_DEFAULT_PRECIS = 0 CLIP_EMBEDDED = 128 CLIP_LH_ANGLES = 16 CLIP_MASK = 0xf CLIP_STROKE_PRECIS = 2 CLIP_TO_PATH = 4097 CLIP_TT_ALWAYS = 32 CLK_TCK = 1000 CLOCKS_PER_SEC = 1000 CLOCK_MONOTONIC = 1 CLOCK_PROCESS_CPUTIME_ID = 2 CLOCK_REALTIME = 0 CLOCK_THREAD_CPUTIME_ID = 3 CLOSECHANNEL = 4112 CLRBREAK = 9 CLRDTR = 6 CLRRTS = 4 CLR_INVALID = 0xFFFFFFFF CLSID_DEFINED = 0 CMC_FAIL_BAD_ALG = 0 CMC_FAIL_BAD_CERT_ID = 4 CMC_FAIL_BAD_IDENTITY = 7 CMC_FAIL_BAD_MESSAGE_CHECK = 1 CMC_FAIL_BAD_REQUEST = 2 CMC_FAIL_BAD_TIME = 3 CMC_FAIL_INTERNAL_CA_ERROR = 11 CMC_FAIL_MUST_ARCHIVE_KEYS = 6 CMC_FAIL_NO_KEY_REUSE = 10 CMC_FAIL_POP_FAILED = 9 CMC_FAIL_POP_REQUIRED = 8 CMC_FAIL_TRY_LATER = 12 CMC_FAIL_UNSUPORTED_EXT = 5 CMC_OTHER_INFO_FAIL_CHOICE = 1 CMC_OTHER_INFO_NO_CHOICE = 0 CMC_OTHER_INFO_PEND_CHOICE = 2 CMC_STATUS_CONFIRM_REQUIRED = 5 CMC_STATUS_FAILED = 2 CMC_STATUS_NO_SUPPORT = 4 CMC_STATUS_PENDING = 3 CMC_STATUS_SUCCESS = 0 CMC_TAGGED_CERT_REQUEST_CHOICE = 1 CMSG_ALL_FLAGS = 18446744073709551615 CMSG_ATTR_CERT_COUNT_PARAM = 31 CMSG_ATTR_CERT_PARAM = 32 CMSG_AUTHENTICATED_ATTRIBUTES_FLAG = 0x8 CMSG_BARE_CONTENT_FLAG = 0x1 CMSG_BARE_CONTENT_PARAM = 3 CMSG_CERT_COUNT_PARAM = 11 CMSG_CERT_PARAM = 12 CMSG_CMS_ENCAPSULATED_CONTENT_FLAG = 0x40 CMSG_CMS_ENCAPSULATED_CTL_FLAG = 0x8000 CMSG_CMS_RECIPIENT_COUNT_PARAM = 33 CMSG_CMS_RECIPIENT_ENCRYPTED_KEY_INDEX_PARAM = 35 CMSG_CMS_RECIPIENT_INDEX_PARAM = 34 CMSG_CMS_RECIPIENT_INFO_PARAM = 36 CMSG_CMS_SIGNER_INFO_PARAM = 39 CMSG_COMPUTED_HASH_PARAM = 22 CMSG_CONTENTS_OCTETS_FLAG = 0x10 CMSG_CONTENT_ENCRYPT_FREE_OBJID_FLAG = 0x2 CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG = 0x1 CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG = 0x1 CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG = 0x8000 CMSG_CONTENT_PARAM = 2 CMSG_CRL_COUNT_PARAM = 13 CMSG_CRL_PARAM = 14 CMSG_CRYPT_RELEASE_CONTEXT_FLAG = 0x8000 CMSG_CTRL_ADD_ATTR_CERT = 14 CMSG_CTRL_ADD_CERT = 10 CMSG_CTRL_ADD_CMS_SIGNER_INFO = 20 CMSG_CTRL_ADD_CRL = 12 CMSG_CTRL_ADD_SIGNER = 6 CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR = 8 CMSG_CTRL_DECRYPT = 2 CMSG_CTRL_DEL_ATTR_CERT = 15 CMSG_CTRL_DEL_CERT = 11 CMSG_CTRL_DEL_CRL = 13 CMSG_CTRL_DEL_SIGNER = 7 CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR = 9 CMSG_CTRL_ENABLE_STRONG_SIGNATURE = 21 CMSG_CTRL_KEY_AGREE_DECRYPT = 17 CMSG_CTRL_KEY_TRANS_DECRYPT = 16 CMSG_CTRL_MAIL_LIST_DECRYPT = 18 CMSG_CTRL_VERIFY_HASH = 5 CMSG_CTRL_VERIFY_SIGNATURE = 1 CMSG_CTRL_VERIFY_SIGNATURE_EX = 19 CMSG_DATA = 1 CMSG_DATA_FLAG = 2 CMSG_DETACHED_FLAG = 0x4 CMSG_ENCODED_MESSAGE = 29 CMSG_ENCODED_SIGNER = 28 CMSG_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG = 0x2 CMSG_ENCODE_SORTED_CTL_FLAG = 0x1 CMSG_ENCODING_TYPE_MASK = 0xffff0000 CMSG_ENCRYPTED = 6 CMSG_ENCRYPTED_DIGEST = 27 CMSG_ENCRYPTED_FLAG = 64 CMSG_ENCRYPT_PARAM = 26 CMSG_ENVELOPED = 3 CMSG_ENVELOPED_DATA_CMS_VERSION = 2 CMSG_ENVELOPED_DATA_PKCS_1_5_VERSION = 0 CMSG_ENVELOPED_DATA_V0 = 0 CMSG_ENVELOPED_DATA_V2 = 2 CMSG_ENVELOPED_FLAG = 8 CMSG_ENVELOPED_RECIPIENT_V0 = 0 CMSG_ENVELOPED_RECIPIENT_V2 = 2 CMSG_ENVELOPED_RECIPIENT_V3 = 3 CMSG_ENVELOPED_RECIPIENT_V4 = 4 CMSG_ENVELOPE_ALGORITHM_PARAM = 15 CMSG_HASHED = 5 CMSG_HASHED_DATA_CMS_VERSION = 2 CMSG_HASHED_DATA_PKCS_1_5_VERSION = 0 CMSG_HASHED_DATA_V0 = 0 CMSG_HASHED_DATA_V2 = 2 CMSG_HASHED_FLAG = 32 CMSG_HASH_ALGORITHM_PARAM = 20 CMSG_HASH_DATA_PARAM = 21 CMSG_INDEFINITE_LENGTH = 4294967295 CMSG_INNER_CONTENT_TYPE_PARAM = 4 CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG = 0x2 CMSG_KEY_AGREE_ENCRYPT_FREE_OBJID_FLAG = 0x20 CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG = 0x1 CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_ALG_FLAG = 0x4 CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_BITS_FLAG = 0x10 CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_PARA_FLAG = 0x8 CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE = 1 CMSG_KEY_AGREE_ORIGINATOR_CERT = 1 CMSG_KEY_AGREE_ORIGINATOR_PUBLIC_KEY = 2 CMSG_KEY_AGREE_RECIPIENT = 2 CMSG_KEY_AGREE_STATIC_KEY_CHOICE = 2 CMSG_KEY_AGREE_VERSION = 3 CMSG_KEY_TRANS_CMS_VERSION = 2 CMSG_KEY_TRANS_ENCRYPT_FREE_OBJID_FLAG = 0x2 CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG = 0x1 CMSG_KEY_TRANS_PKCS_1_5_VERSION = 0 CMSG_KEY_TRANS_RECIPIENT = 1 CMSG_LENGTH_ONLY_FLAG = 0x2 CMSG_MAIL_LIST_ENCRYPT_FREE_OBJID_FLAG = 0x2 CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG = 0x1 CMSG_MAIL_LIST_HANDLE_KEY_CHOICE = 1 CMSG_MAIL_LIST_RECIPIENT = 3 CMSG_MAIL_LIST_VERSION = 4 CMSG_MAX_LENGTH_FLAG = 0x20 CMSG_OID_CNG_EXPORT_KEY_AGREE_FUNC = "CryptMsgDllCNGExportKeyAgree" CMSG_OID_CNG_EXPORT_KEY_TRANS_FUNC = "CryptMsgDllCNGExportKeyTrans" CMSG_OID_CNG_GEN_CONTENT_ENCRYPT_KEY_FUNC = "CryptMsgDllCNGGenContentEncryptKey" CMSG_OID_CNG_IMPORT_CONTENT_ENCRYPT_KEY_FUNC = "CryptMsgDllCNGImportContentEncryptKey" CMSG_OID_CNG_IMPORT_KEY_AGREE_FUNC = "CryptMsgDllCNGImportKeyAgree" CMSG_OID_CNG_IMPORT_KEY_TRANS_FUNC = "CryptMsgDllCNGImportKeyTrans" CMSG_OID_EXPORT_ENCRYPT_KEY_FUNC = "CryptMsgDllExportEncryptKey" CMSG_OID_EXPORT_KEY_AGREE_FUNC = "CryptMsgDllExportKeyAgree" CMSG_OID_EXPORT_KEY_TRANS_FUNC = "CryptMsgDllExportKeyTrans" CMSG_OID_EXPORT_MAIL_LIST_FUNC = "CryptMsgDllExportMailList" CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC = "CryptMsgDllGenContentEncryptKey" CMSG_OID_GEN_ENCRYPT_KEY_FUNC = "CryptMsgDllGenEncryptKey" CMSG_OID_IMPORT_ENCRYPT_KEY_FUNC = "CryptMsgDllImportEncryptKey" CMSG_OID_IMPORT_KEY_AGREE_FUNC = "CryptMsgDllImportKeyAgree" CMSG_OID_IMPORT_KEY_TRANS_FUNC = "CryptMsgDllImportKeyTrans" CMSG_OID_IMPORT_MAIL_LIST_FUNC = "CryptMsgDllImportMailList" CMSG_RC4_NO_SALT_FLAG = 0x40000000 CMSG_RECIPIENT_COUNT_PARAM = 17 CMSG_RECIPIENT_INDEX_PARAM = 18 CMSG_RECIPIENT_INFO_PARAM = 19 CMSG_SIGNED = 2 CMSG_SIGNED_AND_ENVELOPED = 4 CMSG_SIGNED_AND_ENVELOPED_FLAG = 16 CMSG_SIGNED_DATA_CMS_VERSION = 3 CMSG_SIGNED_DATA_NO_SIGN_FLAG = 0x80 CMSG_SIGNED_DATA_PKCS_1_5_VERSION = 1 CMSG_SIGNED_DATA_V1 = 1 CMSG_SIGNED_DATA_V3 = 3 CMSG_SIGNED_FLAG = 4 CMSG_SIGNER_AUTH_ATTR_PARAM = 9 CMSG_SIGNER_CERT_ID_PARAM = 38 CMSG_SIGNER_CERT_INFO_PARAM = 7 CMSG_SIGNER_COUNT_PARAM = 5 CMSG_SIGNER_HASH_ALGORITHM_PARAM = 8 CMSG_SIGNER_INFO_CMS_VERSION = 3 CMSG_SIGNER_INFO_PARAM = 6 CMSG_SIGNER_INFO_PKCS_1_5_VERSION = 1 CMSG_SIGNER_INFO_V1 = 1 CMSG_SIGNER_INFO_V3 = 3 CMSG_SIGNER_ONLY_FLAG = 0x2 CMSG_SIGNER_UNAUTH_ATTR_PARAM = 10 CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG = 0x80000000 CMSG_TRUSTED_SIGNER_FLAG = 0x1 CMSG_TYPE_PARAM = 1 CMSG_UNPROTECTED_ATTR_PARAM = 37 CMSG_USE_SIGNER_INDEX_FLAG = 0x4 CMSG_VERIFY_COUNTER_SIGN_ENABLE_STRONG_FLAG = 0x1 CMSG_VERIFY_SIGNER_CERT = 2 CMSG_VERIFY_SIGNER_CHAIN = 3 CMSG_VERIFY_SIGNER_NULL = 4 CMSG_VERIFY_SIGNER_PUBKEY = 1 CMSG_VERSION_PARAM = 30 CM_CMYK_COLOR = 0x00000004 CM_DEVICE_ICM = 0x00000001 CM_GAMMA_RAMP = 0x00000002 CM_IN_GAMUT = 0 CM_NONE = 0x00000000 CM_OUT_OF_GAMUT = 255 CM_SERVICE_MEASURED_BOOT_LOAD = 0x00000020 CM_SERVICE_NETWORK_BOOT_LOAD = 0x00000001 CM_SERVICE_SD_DISK_BOOT_LOAD = 0x00000008 CM_SERVICE_USB3_DISK_BOOT_LOAD = 0x00000010 CM_SERVICE_USB_DISK_BOOT_LOAD = 0x00000004 CM_SERVICE_VALID_PROMOTION_MASK = 255 CM_SERVICE_VERIFIER_BOOT_LOAD = 0x00000040 CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD = 0x00000002 CM_SERVICE_WINPE_BOOT_LOAD = 0x00000080 COLFLAG_BUSY = 0x0100 COLFLAG_GENERATED = 0x0060 COLFLAG_HASCOLL = 0x0200 COLFLAG_HASTYPE = 0x0004 COLFLAG_HIDDEN = 0x0002 COLFLAG_NOEXPAND = 0x0400 COLFLAG_NOINSERT = 0x0062 COLFLAG_NOTAVAIL = 0x0080 COLFLAG_PRIMKEY = 0x0001 COLFLAG_SORTERREF = 0x0010 COLFLAG_STORED = 0x0040 COLFLAG_UNIQUE = 0x0008 COLFLAG_VIRTUAL = 0x0020 COLNAME_COLUMN = 4 COLNAME_DATABASE = 2 COLNAME_DECLTYPE = 1 COLNAME_N = 5 COLNAME_NAME = 0 COLNAME_TABLE = 3 COLORMATCHTOTARGET_EMBEDED = 0x00000001 COLORMGMTCAPS = 121 COLORMGMTDLGORD = 1551 COLOROKSTRINGA = "commdlg_ColorOK" COLORONCOLOR = 3 COLORRES = 108 COLOR_3DDKSHADOW = 21 COLOR_3DFACE = 15 COLOR_3DHIGHLIGHT = 20 COLOR_3DHILIGHT = 20 COLOR_3DLIGHT = 22 COLOR_3DSHADOW = 16 COLOR_ACTIVEBORDER = 10 COLOR_ACTIVECAPTION = 2 COLOR_APPWORKSPACE = 12 COLOR_BACKGROUND = 1 COLOR_BTNFACE = 15 COLOR_BTNHIGHLIGHT = 20 COLOR_BTNHILIGHT = 20 COLOR_BTNSHADOW = 16 COLOR_BTNTEXT = 18 COLOR_CAPTIONTEXT = 9 COLOR_DESKTOP = 1 COLOR_GRADIENTACTIVECAPTION = 27 COLOR_GRADIENTINACTIVECAPTION = 28 COLOR_GRAYTEXT = 17 COLOR_HIGHLIGHT = 13 COLOR_HIGHLIGHTTEXT = 14 COLOR_HOTLIGHT = 26 COLOR_INACTIVEBORDER = 11 COLOR_INACTIVECAPTION = 3 COLOR_INACTIVECAPTIONTEXT = 19 COLOR_INFOBK = 24 COLOR_INFOTEXT = 23 COLOR_MENU = 4 COLOR_MENUBAR = 30 COLOR_MENUHILIGHT = 29 COLOR_MENUTEXT = 7 COLOR_SCROLLBAR = 0 COLOR_WINDOW = 5 COLOR_WINDOWFRAME = 6 COLOR_WINDOWTEXT = 8 COLTYPE_ANY = 1 COLTYPE_BLOB = 2 COLTYPE_CUSTOM = 0 COLTYPE_INT = 3 COLTYPE_INTEGER = 4 COLTYPE_REAL = 5 COLTYPE_TEXT = 6 COMMON_LVB_GRID_HORIZONTAL = 0x400 COMMON_LVB_GRID_LVERTICAL = 0x800 COMMON_LVB_GRID_RVERTICAL = 0x1000 COMMON_LVB_LEADING_BYTE = 0x100 COMMON_LVB_REVERSE_VIDEO = 0x4000 COMMON_LVB_SBCSDBCS = 0x300 COMMON_LVB_TRAILING_BYTE = 0x200 COMMON_LVB_UNDERSCORE = 0x8000 COMPLEXREGION = 3 COMPRESSION_ENGINE_HIBER = 512 COMPRESSION_ENGINE_MAXIMUM = 256 COMPRESSION_ENGINE_STANDARD = 0 COMPRESSION_FORMAT_DEFAULT = 1 COMPRESSION_FORMAT_LZNT1 = 2 COMPRESSION_FORMAT_NONE = 0 COMPRESSION_FORMAT_SPARSE = 16384 COMPRESSION_FORMAT_XPRESS = 3 COMPRESSION_FORMAT_XPRESS_HUFF = 4 COM_RIGHTS_ACTIVATE_LOCAL = 8 COM_RIGHTS_ACTIVATE_REMOTE = 16 COM_RIGHTS_EXECUTE = 1 COM_RIGHTS_EXECUTE_LOCAL = 2 COM_RIGHTS_EXECUTE_REMOTE = 4 CONCURRENCYSAL_HXX = 0 CONDITION_VARIABLE_LOCKMODE_SHARED = 1 CONFIRMSAFETYACTION_LOADOBJECT = 0x1 CONNDLG_CONN_POINT = 0x00000002 CONNDLG_HIDE_BOX = 0x00000008 CONNDLG_NOT_PERSIST = 0x00000020 CONNDLG_PERSIST = 0x00000010 CONNDLG_RO_PATH = 0x00000001 CONNDLG_USE_MRU = 0x00000004 CONNECT_CMD_SAVECRED = 0x00001000 CONNECT_COMMANDLINE = 0x00000800 CONNECT_CURRENT_MEDIA = 0x00000200 CONNECT_DEFERRED = 0x00000400 CONNECT_INTERACTIVE = 0x00000008 CONNECT_LOCALDRIVE = 0x00000100 CONNECT_NEED_DRIVE = 0x00000020 CONNECT_PROMPT = 0x00000010 CONNECT_REDIRECT = 0x00000080 CONNECT_REFCOUNT = 0x00000040 CONNECT_RESERVED = 0xFF000000 CONNECT_TEMPORARY = 0x00000004 CONNECT_UPDATE_PROFILE = 0x00000001 CONNECT_UPDATE_RECENT = 0x00000002 CONSOLE_APPLICATION_16BIT = 0x0000 CONSOLE_CARET_SELECTION = 0x0001 CONSOLE_CARET_VISIBLE = 0x0002 CONSOLE_FULLSCREEN = 1 CONSOLE_FULLSCREEN_HARDWARE = 2 CONSOLE_FULLSCREEN_MODE = 1 CONSOLE_MOUSE_DOWN = 0x8 CONSOLE_MOUSE_SELECTION = 0x4 CONSOLE_NO_SELECTION = 0x0 CONSOLE_SELECTION_IN_PROGRESS = 0x1 CONSOLE_SELECTION_NOT_EMPTY = 0x2 CONSOLE_TEXTMODE_BUFFER = 1 CONSOLE_WINDOWED_MODE = 2 CONST_VTBL = 0 CONTAINER_INHERIT_ACE = 2 CONTEXT_ALL = 1048607 CONTEXT_AMD64 = 0x100000 CONTEXT_CONTROL = 1048577 CONTEXT_DEBUG_REGISTERS = 1048592 CONTEXT_EXCEPTION_ACTIVE = 0x8000000 CONTEXT_EXCEPTION_REPORTING = 0x80000000 CONTEXT_EXCEPTION_REQUEST = 0x40000000 CONTEXT_E_FIRST = 2147803136 CONTEXT_E_LAST = 2147803183 CONTEXT_FLOATING_POINT = 1048584 CONTEXT_FULL = 1048587 CONTEXT_INTEGER = 1048578 CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC = "ContextDllCreateObjectContext" CONTEXT_SEGMENTS = 1048580 CONTEXT_SERVICE_ACTIVE = 0x10000000 CONTEXT_S_FIRST = 319488 CONTEXT_S_LAST = 319535 CONVERT10_E_FIRST = 2147746240 CONVERT10_E_LAST = 2147746255 CONVERT10_S_FIRST = 262592 CONVERT10_S_LAST = 262607 COPYFILE_SIS_FLAGS = 0x0003 COPYFILE_SIS_LINK = 0x0001 COPYFILE_SIS_REPLACE = 0x0002 COPY_FILE_ALLOW_DECRYPTED_DESTINATION = 0x8 COPY_FILE_FAIL_IF_EXISTS = 0x1 COPY_FILE_OPEN_SOURCE_FOR_WRITE = 0x4 COPY_FILE_RESTARTABLE = 0x2 CORE_PARKING_POLICY_CHANGE_IDEAL = 0 CORE_PARKING_POLICY_CHANGE_MAX = 3 CORE_PARKING_POLICY_CHANGE_MULTISTEP = 3 CORE_PARKING_POLICY_CHANGE_ROCKET = 2 CORE_PARKING_POLICY_CHANGE_SINGLE = 1 CO_E_FIRST = 2147746288 CO_E_LAST = 2147746303 CO_S_FIRST = 262640 CO_S_LAST = 262655 CPS_CANCEL = 0x0004 CPS_COMPLETE = 0x0001 CPS_CONVERT = 0x0002 CPS_REVERT = 0x0003 CP_ACP = 0 CP_INSTALLED = 0x00000001 CP_MACCP = 2 CP_NONE = 0 CP_OEMCP = 1 CP_RECTANGLE = 1 CP_REGION = 2 CP_SUPPORTED = 0x00000002 CP_SYMBOL = 42 CP_THREAD_ACP = 3 CP_UTF7 = 65000 CP_UTF8 = 65001 CP_WINANSI = 1004 CP_WINNEUTRAL = 1004 CP_WINUNICODE = 1200 CREATECOLORSPACE_EMBEDED = 0x00000001 CREATE_ALWAYS = 2 CREATE_BOUNDARY_DESCRIPTOR_ADD_APPCONTAINER_SID = 0x1 CREATE_BREAKAWAY_FROM_JOB = 0x1000000 CREATE_DEFAULT_ERROR_MODE = 0x4000000 CREATE_FORCEDOS = 0x2000 CREATE_FOR_DIR = 2 CREATE_FOR_IMPORT = 1 CREATE_IGNORE_SYSTEM_DEFAULT = 0x80000000 CREATE_NEW = 1 CREATE_NEW_CONSOLE = 0x10 CREATE_NEW_PROCESS_GROUP = 0x200 CREATE_NO_WINDOW = 0x8000000 CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x2000000 CREATE_PROCESS_DEBUG_EVENT = 3 CREATE_PROTECTED_PROCESS = 0x40000 CREATE_SEPARATE_WOW_VDM = 0x800 CREATE_SHARED_WOW_VDM = 0x1000 CREATE_SUSPENDED = 0x4 CREATE_THREAD_DEBUG_EVENT = 2 CREATE_UNICODE_ENVIRONMENT = 0x400 CRITICAL_SECTION_NO_DEBUG_INFO = 16777216 CRL_DIST_POINT_ERR_CRL_ISSUER_BIT = 2147483648 CRL_DIST_POINT_ERR_INDEX_MASK = 0x7f CRL_DIST_POINT_ERR_INDEX_SHIFT = 24 CRL_DIST_POINT_FULL_NAME = 1 CRL_DIST_POINT_ISSUER_RDN_NAME = 2 CRL_DIST_POINT_NO_NAME = 0 CRL_FIND_ANY = 0 CRL_FIND_EXISTING = 2 CRL_FIND_ISSUED_BY = 1 CRL_FIND_ISSUED_BY_AKI_FLAG = 0x1 CRL_FIND_ISSUED_BY_BASE_FLAG = 0x8 CRL_FIND_ISSUED_BY_DELTA_FLAG = 0x4 CRL_FIND_ISSUED_BY_SIGNATURE_FLAG = 0x2 CRL_FIND_ISSUED_FOR = 3 CRL_FIND_ISSUED_FOR_SET_STRONG_PROPERTIES_FLAG = 0x10 CRL_REASON_AA_COMPROMISE = 10 CRL_REASON_AA_COMPROMISE_FLAG = 0x80 CRL_REASON_AFFILIATION_CHANGED = 3 CRL_REASON_AFFILIATION_CHANGED_FLAG = 0x10 CRL_REASON_CA_COMPROMISE = 2 CRL_REASON_CA_COMPROMISE_FLAG = 0x20 CRL_REASON_CERTIFICATE_HOLD = 6 CRL_REASON_CERTIFICATE_HOLD_FLAG = 0x02 CRL_REASON_CESSATION_OF_OPERATION = 5 CRL_REASON_CESSATION_OF_OPERATION_FLAG = 0x04 CRL_REASON_KEY_COMPROMISE = 1 CRL_REASON_KEY_COMPROMISE_FLAG = 0x40 CRL_REASON_PRIVILEGE_WITHDRAWN = 9 CRL_REASON_PRIVILEGE_WITHDRAWN_FLAG = 0x01 CRL_REASON_REMOVE_FROM_CRL = 8 CRL_REASON_SUPERSEDED = 4 CRL_REASON_SUPERSEDED_FLAG = 0x08 CRL_REASON_UNSPECIFIED = 0 CRL_REASON_UNUSED_FLAG = 0x80 CRL_V1 = 0 CRL_V2 = 1 CRM_PROTOCOL_DYNAMIC_MARSHAL_INFO = 0x00000002 CRM_PROTOCOL_EXPLICIT_MARSHAL_ONLY = 0x00000001 CRM_PROTOCOL_MAXIMUM_OPTION = 0x00000003 CROSS_CERT_DIST_POINT_ERR_INDEX_MASK = 0xff CROSS_CERT_DIST_POINT_ERR_INDEX_SHIFT = 24 CRYPTNET_CACHED_OCSP_SWITCH_TO_CRL_COUNT_DEFAULT = 50 CRYPTNET_CRL_BEFORE_OCSP_ENABLE = 0xffffffff CRYPTNET_CRL_PRE_FETCH_MAX_AGE_SECONDS_DEFAULT = 7200 CRYPTNET_CRL_PRE_FETCH_MAX_AGE_SECONDS_MIN = 300 CRYPTNET_CRL_PRE_FETCH_MIN_AFTER_NEXT_UPDATE_SECONDS_DEFAULT = 300 CRYPTNET_CRL_PRE_FETCH_MIN_BEFORE_NEXT_UPDATE_SECONDS_DEFAULT = 300 CRYPTNET_CRL_PRE_FETCH_PUBLISH_BEFORE_NEXT_UPDATE_SECONDS_DEFAULT = 3600 CRYPTNET_CRL_PRE_FETCH_PUBLISH_RANDOM_INTERVAL_SECONDS_DEFAULT = 300 CRYPTNET_CRL_PRE_FETCH_TIMEOUT_SECONDS_DEFAULT = 300 CRYPTNET_MAX_CACHED_OCSP_PER_CRL_COUNT_DEFAULT = 500 CRYPTNET_OCSP_AFTER_CRL_DISABLE = 0xffffffff CRYPTNET_PRE_FETCH_AFTER_CURRENT_TIME_PRE_FETCH_PERIOD_SECONDS_DEFAULT = 1800 CRYPTNET_PRE_FETCH_AFTER_PUBLISH_PRE_FETCH_DIVISOR_DEFAULT = 10 CRYPTNET_PRE_FETCH_BEFORE_NEXT_UPDATE_PRE_FETCH_DIVISOR_DEFAULT = 20 CRYPTNET_PRE_FETCH_MAX_AFTER_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_DEFAULT = 14400 CRYPTNET_PRE_FETCH_MAX_MAX_AGE_SECONDS_DEFAULT = 1209600 CRYPTNET_PRE_FETCH_MIN_AFTER_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_DEFAULT = 1800 CRYPTNET_PRE_FETCH_MIN_BEFORE_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_DEFAULT = 3600 CRYPTNET_PRE_FETCH_MIN_MAX_AGE_SECONDS_DEFAULT = 3600 CRYPTNET_PRE_FETCH_MIN_OCSP_VALIDITY_PERIOD_SECONDS_DEFAULT = 1209600 CRYPTNET_PRE_FETCH_RETRIEVAL_TIMEOUT_SECONDS_DEFAULT = 300 CRYPTNET_PRE_FETCH_SCAN_AFTER_TRIGGER_DELAY_SECONDS_DEFAULT = 30 CRYPTNET_PRE_FETCH_TRIGGER_DISABLE = 0xffffffff CRYPTNET_PRE_FETCH_TRIGGER_PERIOD_SECONDS_DEFAULT = 600 CRYPTNET_PRE_FETCH_VALIDITY_PERIOD_AFTER_NEXT_UPDATE_PRE_FETCH_DIVISOR_DEFAULT = 10 CRYPTNET_URL_CACHE_DEFAULT_FLUSH = 0 CRYPTNET_URL_CACHE_DEFAULT_FLUSH_EXEMPT_SECONDS_DEFAULT = 2419200 CRYPTNET_URL_CACHE_DISABLE_FLUSH = 0xffffffff CRYPTNET_URL_CACHE_PRE_FETCH_AUTOROOT_CAB = 5 CRYPTNET_URL_CACHE_PRE_FETCH_BLOB = 1 CRYPTNET_URL_CACHE_PRE_FETCH_CRL = 2 CRYPTNET_URL_CACHE_PRE_FETCH_DISALLOWED_CERT_CAB = 6 CRYPTNET_URL_CACHE_PRE_FETCH_NONE = 0 CRYPTNET_URL_CACHE_PRE_FETCH_OCSP = 3 CRYPTNET_URL_CACHE_PRE_FETCH_PIN_RULES_CAB = 7 CRYPTNET_URL_CACHE_RESPONSE_HTTP = 1 CRYPTNET_URL_CACHE_RESPONSE_NONE = 0 CRYPTNET_URL_CACHE_RESPONSE_VALIDATED = 0x8000 CRYPTO_BLOBS_DEFINED = 0 CRYPTPROTECTMEMORY_BLOCK_SIZE = 16 CRYPTPROTECTMEMORY_CROSS_PROCESS = 0x1 CRYPTPROTECTMEMORY_SAME_LOGON = 0x2 CRYPTPROTECTMEMORY_SAME_PROCESS = 0x0 CRYPTPROTECT_AUDIT = 0x10 CRYPTPROTECT_CRED_REGENERATE = 0x80 CRYPTPROTECT_CRED_SYNC = 0x8 CRYPTPROTECT_FIRST_RESERVED_FLAGVAL = 0x0fffffff CRYPTPROTECT_LAST_RESERVED_FLAGVAL = 0xffffffff CRYPTPROTECT_LOCAL_MACHINE = 0x4 CRYPTPROTECT_NO_RECOVERY = 0x20 CRYPTPROTECT_PROMPT_ON_PROTECT = 0x2 CRYPTPROTECT_PROMPT_ON_UNPROTECT = 0x1 CRYPTPROTECT_PROMPT_REQUIRE_STRONG = 0x10 CRYPTPROTECT_PROMPT_RESERVED = 0x04 CRYPTPROTECT_PROMPT_STRONG = 0x08 CRYPTPROTECT_UI_FORBIDDEN = 0x1 CRYPTPROTECT_VERIFY_PROTECTION = 0x40 CRYPT_ACCUMULATIVE_TIMEOUT = 0x800 CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG = 0x10000 CRYPT_ACQUIRE_CACHE_FLAG = 0x1 CRYPT_ACQUIRE_COMPARE_KEY_FLAG = 0x4 CRYPT_ACQUIRE_NCRYPT_KEY_FLAGS_MASK = 0x70000 CRYPT_ACQUIRE_NO_HEALING = 0x8 CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG = 0x40000 CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG = 0x20000 CRYPT_ACQUIRE_SILENT_FLAG = 0x40 CRYPT_ACQUIRE_USE_PROV_INFO_FLAG = 0x2 CRYPT_ACQUIRE_WINDOW_HANDLE_FLAG = 0x80 CRYPT_AIA_RETRIEVAL = 0x80000 CRYPT_ALL_FUNCTIONS = 1 CRYPT_ALL_PROVIDERS = 2 CRYPT_ANY = 4 CRYPT_ARCHIVABLE = 0x4000 CRYPT_ARCHIVE = 0x100 CRYPT_ASN_ENCODING = 0x1 CRYPT_ASYNC_RETRIEVAL = 0x10 CRYPT_BLOB_VER3 = 0x80 CRYPT_CACHE_ONLY_RETRIEVAL = 0x2 CRYPT_CHECK_FRESHNESS_TIME_VALIDITY = 0x400 CRYPT_CREATE_IV = 0x200 CRYPT_CREATE_NEW_FLUSH_ENTRY = 0x10000000 CRYPT_CREATE_SALT = 0x4 CRYPT_DATA_KEY = 0x800 CRYPT_DECODE_ALLOC_FLAG = 0x8000 CRYPT_DECODE_ENABLE_IA5CONVERSION_FLAG = 100663296 CRYPT_DECODE_ENABLE_PUNYCODE_FLAG = 0x2000000 CRYPT_DECODE_ENABLE_UTF8PERCENT_FLAG = 0x4000000 CRYPT_DECODE_NOCOPY_FLAG = 0x1 CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG = 0x8 CRYPT_DECODE_SHARE_OID_STRING_FLAG = 0x4 CRYPT_DECODE_TO_BE_SIGNED_FLAG = 0x2 CRYPT_DECRYPT = 0x2 CRYPT_DECRYPT_RSA_NO_PADDING_CHECK = 0x20 CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG = 0x1 CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID = 1 CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID = 2 CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG = 0x2 CRYPT_DEFAULT_OID = "DEFAULT" CRYPT_DELETEKEYSET = 0x10 CRYPT_DELETE_DEFAULT = 0x4 CRYPT_DELETE_KEYSET = 16 CRYPT_DESTROYKEY = 0x4 CRYPT_DOMAIN = 2 CRYPT_DONT_CACHE_RESULT = 0x8 CRYPT_DONT_CHECK_TIME_VALIDITY = 0x200 CRYPT_DONT_VERIFY_SIGNATURE = 0x100 CRYPT_ECC_CMS_SHARED_INFO_SUPPPUBINFO_BYTE_LENGTH = 4 CRYPT_ECC_PRIVATE_KEY_INFO_v1 = 1 CRYPT_ENABLE_FILE_RETRIEVAL = 0x08000000 CRYPT_ENABLE_SSL_REVOCATION_RETRIEVAL = 0x800000 CRYPT_ENCODE_ALLOC_FLAG = 0x8000 CRYPT_ENCODE_DECODE_NONE = 0 CRYPT_ENCODE_ENABLE_IA5CONVERSION_FLAG = 393216 CRYPT_ENCODE_ENABLE_PUNYCODE_FLAG = 0x20000 CRYPT_ENCODE_ENABLE_UTF8PERCENT_FLAG = 0x40000 CRYPT_ENCODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG = 0x8 CRYPT_ENCRYPT = 0x1 CRYPT_ENCRYPT_ALG_OID_GROUP_ID = 2 CRYPT_ENHKEY_USAGE_OID_GROUP_ID = 7 CRYPT_EXCLUSIVE = 1 CRYPT_EXPORT = 0x4 CRYPT_EXPORTABLE = 0x1 CRYPT_EXPORT_KEY = 0x40 CRYPT_EXT_OR_ATTR_OID_GROUP_ID = 6 CRYPT_FAILED = 0 CRYPT_FASTSGC = 0x2 CRYPT_FIND_MACHINE_KEYSET_FLAG = 0x2 CRYPT_FIND_SILENT_KEYSET_FLAG = 0x40 CRYPT_FIND_USER_KEYSET_FLAG = 0x1 CRYPT_FIRST = 1 CRYPT_FIRST_ALG_OID_GROUP_ID = 1 CRYPT_FLAG_IPSEC = 0x10 CRYPT_FLAG_PCT1 = 0x1 CRYPT_FLAG_SIGNING = 0x20 CRYPT_FLAG_SSL2 = 0x2 CRYPT_FLAG_SSL3 = 0x4 CRYPT_FLAG_TLS1 = 0x8 CRYPT_FORMAT_COMMA = 0x1000 CRYPT_FORMAT_CRLF = 512 CRYPT_FORMAT_OID = 0x4 CRYPT_FORMAT_RDN_CRLF = 0x200 CRYPT_FORMAT_RDN_REVERSE = 0x800 CRYPT_FORMAT_RDN_SEMICOLON = 0x100 CRYPT_FORMAT_RDN_UNQUOTE = 0x400 CRYPT_FORMAT_SEMICOLON = 256 CRYPT_FORMAT_SIMPLE = 0x1 CRYPT_FORMAT_STR_MULTI_LINE = 0x1 CRYPT_FORMAT_STR_NO_HEX = 0x10 CRYPT_FORMAT_X509 = 0x2 CRYPT_GET_INSTALLED_OID_FUNC_FLAG = 0x1 CRYPT_GET_URL_FROM_AUTH_ATTRIBUTE = 0x8 CRYPT_GET_URL_FROM_EXTENSION = 0x2 CRYPT_GET_URL_FROM_PROPERTY = 0x1 CRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTE = 0x4 CRYPT_HASH_ALG_OID_GROUP_ID = 1 CRYPT_HTTP_POST_RETRIEVAL = 0x100000 CRYPT_IMPL_HARDWARE = 1 CRYPT_IMPL_MIXED = 3 CRYPT_IMPL_REMOVABLE = 8 CRYPT_IMPL_SOFTWARE = 2 CRYPT_IMPL_UNKNOWN = 4 CRYPT_IMPORT_KEY = 0x80 CRYPT_INITIATOR = 0x40 CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG = 1 CRYPT_INSTALL_OID_INFO_BEFORE_FLAG = 1 CRYPT_IPSEC_HMAC_KEY = 0x100 CRYPT_KDF_OID_GROUP_ID = 10 CRYPT_KEEP_TIME_VALID = 0x80 CRYPT_KEK = 0x400 CRYPT_KEYID_ALLOC_FLAG = 0x8000 CRYPT_KEYID_DELETE_FLAG = 0x10 CRYPT_KEYID_MACHINE_FLAG = 0x20 CRYPT_KEYID_SET_NEW_FLAG = 0x2000 CRYPT_KM = 2 CRYPT_LAST_ALG_OID_GROUP_ID = 4 CRYPT_LAST_OID_GROUP_ID = 10 CRYPT_LDAP_AREC_EXCLUSIVE_RETRIEVAL = 0x40000 CRYPT_LDAP_INSERT_ENTRY_ATTRIBUTE = 0x8000 CRYPT_LDAP_SCOPE_BASE_ONLY_RETRIEVAL = 0x2000 CRYPT_LDAP_SIGN_RETRIEVAL = 0x10000 CRYPT_LITTLE_ENDIAN = 0x1 CRYPT_LOCAL = 1 CRYPT_LOCALIZED_NAME_ENCODING_TYPE = 0 CRYPT_LOCALIZED_NAME_OID = "LocalizedNames" CRYPT_MAC = 0x20 CRYPT_MACHINE_DEFAULT = 0x1 CRYPT_MACHINE_KEYSET = 0x20 CRYPT_MATCH_ANY_ENCODING_TYPE = 0xffffffff CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG = 0x1 CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG = 0x2 CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG = 0x4 CRYPT_MESSAGE_KEYID_SIGNER_FLAG = 0x4 CRYPT_MESSAGE_SILENT_KEYSET_FLAG = 0x40 CRYPT_MIN_DEPENDENCIES = 1 CRYPT_MM = 3 CRYPT_MODE_CBC = 1 CRYPT_MODE_CBCI = 6 CRYPT_MODE_CBCOFM = 9 CRYPT_MODE_CBCOFMI = 10 CRYPT_MODE_CFB = 4 CRYPT_MODE_CFBP = 7 CRYPT_MODE_CTS = 5 CRYPT_MODE_ECB = 2 CRYPT_MODE_OFB = 3 CRYPT_MODE_OFBP = 8 CRYPT_NDR_ENCODING = 0x2 CRYPT_NEWKEYSET = 0x8 CRYPT_NEXT = 2 CRYPT_NOHASHOID = 0x1 CRYPT_NOT_MODIFIED_RETRIEVAL = 0x400000 CRYPT_NO_AUTH_RETRIEVAL = 0x20000 CRYPT_NO_OCSP_FAILOVER_TO_CRL_RETRIEVAL = 0x2000000 CRYPT_NO_SALT = 0x10 CRYPT_OAEP = 0x40 CRYPT_OCSP_ONLY_RETRIEVAL = 0x1000000 CRYPT_OFFLINE_CHECK_RETRIEVAL = 0x4000 CRYPT_OID_CREATE_COM_OBJECT_FUNC = "CryptDllCreateCOMObject" CRYPT_OID_DECODE_OBJECT_EX_FUNC = "CryptDllDecodeObjectEx" CRYPT_OID_DECODE_OBJECT_FUNC = "CryptDllDecodeObject" CRYPT_OID_DISABLE_SEARCH_DS_FLAG = 0x80000000 CRYPT_OID_ENCODE_OBJECT_EX_FUNC = "CryptDllEncodeObjectEx" CRYPT_OID_ENCODE_OBJECT_FUNC = "CryptDllEncodeObject" CRYPT_OID_ENUM_PHYSICAL_STORE_FUNC = "CertDllEnumPhysicalStore" CRYPT_OID_ENUM_SYSTEM_STORE_FUNC = "CertDllEnumSystemStore" CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC = "CryptDllExportPrivateKeyInfoEx" CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_EX2_FUNC = "CryptDllExportPublicKeyInfoEx2" CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC = "CryptDllExportPublicKeyInfoEx" CRYPT_OID_EXTRACT_ENCODED_SIGNATURE_PARAMETERS_FUNC = "CryptDllExtractEncodedSignatureParameters" CRYPT_OID_FIND_LOCALIZED_NAME_FUNC = "CryptDllFindLocalizedName" CRYPT_OID_FIND_OID_INFO_FUNC = "CryptDllFindOIDInfo" CRYPT_OID_FORMAT_OBJECT_FUNC = "CryptDllFormatObject" CRYPT_OID_IMPORT_PRIVATE_KEY_INFO_FUNC = "CryptDllImportPrivateKeyInfoEx" CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC = "CryptDllImportPublicKeyInfoEx" CRYPT_OID_INFO_ALGID_KEY = 3 CRYPT_OID_INFO_CNG_ALGID_KEY = 5 CRYPT_OID_INFO_CNG_SIGN_KEY = 6 CRYPT_OID_INFO_NAME_KEY = 2 CRYPT_OID_INFO_OID_GROUP_BIT_LEN_MASK = 0x0fff0000 CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT = 16 CRYPT_OID_INFO_OID_KEY = 1 CRYPT_OID_INFO_OID_KEY_FLAGS_MASK = 0xffff0000 CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG = 0x40000000 CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG = 0x80000000 CRYPT_OID_INFO_SIGN_KEY = 4 CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG = 0x1 CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG = 0x4 CRYPT_OID_OPEN_STORE_PROV_FUNC = "CertDllOpenStoreProv" CRYPT_OID_OPEN_SYSTEM_STORE_PROV_FUNC = "CertDllOpenSystemStoreProv" CRYPT_OID_PUBKEY_ENCRYPT_ONLY_FLAG = 0x40000000 CRYPT_OID_PUBKEY_SIGN_ONLY_FLAG = 0x80000000 CRYPT_OID_REGISTER_PHYSICAL_STORE_FUNC = "CertDllRegisterPhysicalStore" CRYPT_OID_REGISTER_SYSTEM_STORE_FUNC = "CertDllRegisterSystemStore" CRYPT_OID_REGPATH = "Software\\Microsoft\\Cryptography\\OID" CRYPT_OID_REG_ENCODING_TYPE_PREFIX = "EncodingType " CRYPT_OID_REG_FUNC_NAME_VALUE_NAME_A = "FuncName" CRYPT_OID_SIGN_AND_ENCODE_HASH_FUNC = "CryptDllSignAndEncodeHash" CRYPT_OID_UNREGISTER_PHYSICAL_STORE_FUNC = "CertDllUnregisterPhysicalStore" CRYPT_OID_UNREGISTER_SYSTEM_STORE_FUNC = "CertDllUnregisterSystemStore" CRYPT_OID_USE_CURVE_NAME_FOR_ENCODE_FLAG = 0x20000000 CRYPT_OID_USE_CURVE_PARAMETERS_FOR_ENCODE_FLAG = 0x10000000 CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG = 0x2 CRYPT_OID_VERIFY_CERTIFICATE_CHAIN_POLICY_FUNC = "CertDllVerifyCertificateChainPolicy" CRYPT_OID_VERIFY_CTL_USAGE_FUNC = "CertDllVerifyCTLUsage" CRYPT_OID_VERIFY_ENCODED_SIGNATURE_FUNC = "CryptDllVerifyEncodedSignature" CRYPT_OID_VERIFY_REVOCATION_FUNC = "CertDllVerifyRevocation" CRYPT_ONLINE = 0x80 CRYPT_OVERRIDE = 65536 CRYPT_OVERWRITE = 1 CRYPT_OWF_REPL_LM_HASH = 0x1 CRYPT_POLICY_OID_GROUP_ID = 8 CRYPT_PREGEN = 0x40 CRYPT_PRIORITY_BOTTOM = 4294967295 CRYPT_PRIORITY_TOP = 0 CRYPT_PROCESS_ISOLATE = 65536 CRYPT_PROXY_CACHE_RETRIEVAL = 0x200000 CRYPT_PSTORE = 0x2 CRYPT_PUBKEY_ALG_OID_GROUP_ID = 3 CRYPT_RANDOM_QUERY_STRING_RETRIEVAL = 0x4000000 CRYPT_RC2_128BIT_VERSION = 58 CRYPT_RC2_40BIT_VERSION = 160 CRYPT_RC2_56BIT_VERSION = 52 CRYPT_RC2_64BIT_VERSION = 120 CRYPT_RDN_ATTR_OID_GROUP_ID = 5 CRYPT_READ = 0x8 CRYPT_RECIPIENT = 0x10 CRYPT_REGISTER_FIRST_INDEX = 0 CRYPT_REGISTER_LAST_INDEX = 0xffffffff CRYPT_RETRIEVE_MAX_ERROR_CONTENT_LENGTH = 0x1000 CRYPT_RETRIEVE_MULTIPLE_OBJECTS = 0x1 CRYPT_SECRETDIGEST = 0x1 CRYPT_SEC_DESCR = 0x1 CRYPT_SERVER = 0x400 CRYPT_SF = 0x100 CRYPT_SGC = 0x1 CRYPT_SGCKEY = 0x2000 CRYPT_SGC_ENUM = 4 CRYPT_SIGN_ALG_OID_GROUP_ID = 4 CRYPT_SILENT = 0x40 CRYPT_SORTED_CTL_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG = 0x10000 CRYPT_SSL2_FALLBACK = 0x2 CRYPT_STICKY_CACHE_RETRIEVAL = 0x1000 CRYPT_STRING_ANY = 0x00000007 CRYPT_STRING_BASE64 = 0x1 CRYPT_STRING_BASE64HEADER = 0x0 CRYPT_STRING_BASE64REQUESTHEADER = 0x00000003 CRYPT_STRING_BASE64URI = 0x0000000d CRYPT_STRING_BASE64X509CRLHEADER = 0x00000009 CRYPT_STRING_BASE64_ANY = 0x00000006 CRYPT_STRING_BINARY = 0x2 CRYPT_STRING_ENCODEMASK = 0x000000ff CRYPT_STRING_HASHDATA = 0x10000000 CRYPT_STRING_HEX = 0x4 CRYPT_STRING_HEXADDR = 0x0000000a CRYPT_STRING_HEXASCII = 0x00000005 CRYPT_STRING_HEXASCIIADDR = 0x0000000b CRYPT_STRING_HEXRAW = 0x0000000c CRYPT_STRING_HEX_ANY = 0x8 CRYPT_STRING_NOCR = 0x80000000 CRYPT_STRING_NOCRLF = 0x40000000 CRYPT_STRING_PERCENTESCAPE = 0x08000000 CRYPT_STRING_RESERVED100 = 0x00000100 CRYPT_STRING_RESERVED200 = 0x00000200 CRYPT_STRING_STRICT = 0x20000000 CRYPT_SUCCEED = 1 CRYPT_TEMPLATE_OID_GROUP_ID = 9 CRYPT_TYPE2_FORMAT = 0x2 CRYPT_UI_PROMPT = 0x4 CRYPT_UM = 1 CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG = 16777216 CRYPT_UNICODE_NAME_ENCODE_DISABLE_CHECK_TYPE_FLAG = 1073741824 CRYPT_UNICODE_NAME_ENCODE_ENABLE_T61_UNICODE_FLAG = 2147483648 CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG = 536870912 CRYPT_UNICODE_NAME_ENCODE_FORCE_UTF8_UNICODE_FLAG = 268435456 CRYPT_UPDATE_KEY = 0x8 CRYPT_USERDATA = 1 CRYPT_USER_DEFAULT = 0x2 CRYPT_USER_KEYSET = 0x1000 CRYPT_USER_PROTECTED = 0x2 CRYPT_USER_PROTECTED_STRONG = 0x100000 CRYPT_VERIFYCONTEXT = 0xf0000000 CRYPT_VERIFY_CERT_SIGN_DISABLE_MD2_MD4_FLAG = 0x1 CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT = 2 CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN = 3 CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL = 4 CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY = 1 CRYPT_VERIFY_CERT_SIGN_RETURN_STRONG_PROPERTIES_FLAG = 0x4 CRYPT_VERIFY_CERT_SIGN_SET_STRONG_PROPERTIES_FLAG = 0x2 CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB = 1 CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT = 2 CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL = 3 CRYPT_VERIFY_CERT_SIGN_SUBJECT_OCSP_BASIC_SIGNED_RESPONSE = 4 CRYPT_VERIFY_CONTEXT_SIGNATURE = 0x20 CRYPT_VERIFY_DATA_HASH = 0x40 CRYPT_VOLATILE = 0x1000 CRYPT_WIRE_ONLY_RETRIEVAL = 0x4 CRYPT_WRITE = 0x10 CRYPT_X931_FORMAT = 0x4 CRYPT_X942_COUNTER_BYTE_LENGTH = 4 CRYPT_X942_KEY_LENGTH_BYTE_LENGTH = 4 CRYPT_X942_PUB_INFO_BYTE_LENGTH = 64 CRYPT_Y_ONLY = 0x1 CSOUND_SYSTEM = 16 CSTR_EQUAL = 2 CSTR_GREATER_THAN = 3 CSTR_LESS_THAN = 1 CS_BYTEALIGNCLIENT = 0x1000 CS_BYTEALIGNWINDOW = 0x2000 CS_CLASSDC = 0x0040 CS_DBLCLKS = 0x0008 CS_DELETE_TRANSFORM = 3 CS_DISABLE = 2 CS_DROPSHADOW = 0x00020000 CS_ENABLE = 1 CS_E_FIRST = 2147746148 CS_E_LAST = 2147746159 CS_GLOBALCLASS = 0x4000 CS_HREDRAW = 0x0002 CS_IME = 0x00010000 CS_INSERTCHAR = 0x2000 CS_NOCLOSE = 0x0200 CS_NOMOVECARET = 0x4000 CS_OWNDC = 0x0020 CS_PARENTDC = 0x0080 CS_SAVEBITS = 0x0800 CS_VREDRAW = 0x0001 CTLCOLOR_BTN = 3 CTLCOLOR_DLG = 4 CTLCOLOR_EDIT = 1 CTLCOLOR_LISTBOX = 2 CTLCOLOR_MAX = 7 CTLCOLOR_MSGBOX = 0 CTLCOLOR_SCROLLBAR = 5 CTLCOLOR_STATIC = 6 CTL_ANY_SUBJECT_TYPE = 1 CTL_CERT_SUBJECT_TYPE = 2 CTL_ENTRY_FROM_PROP_CHAIN_FLAG = 0x1 CTL_FIND_ANY = 0 CTL_FIND_EXISTING = 5 CTL_FIND_MD5_HASH = 2 CTL_FIND_NO_LIST_ID_CBDATA = 0xffffffff CTL_FIND_SAME_USAGE_FLAG = 0x1 CTL_FIND_SHA1_HASH = 1 CTL_FIND_SUBJECT = 4 CTL_FIND_USAGE = 3 CTL_V1 = 0 CTRL_BREAK_EVENT = 1 CTRL_CLOSE_EVENT = 2 CTRL_C_EVENT = 0 CTRL_LOGOFF_EVENT = 5 CTRL_SHUTDOWN_EVENT = 6 CTRY_ALBANIA = 355 CTRY_ALGERIA = 213 CTRY_ARGENTINA = 54 CTRY_ARMENIA = 374 CTRY_AUSTRALIA = 61 CTRY_AUSTRIA = 43 CTRY_AZERBAIJAN = 994 CTRY_BAHRAIN = 973 CTRY_BELARUS = 375 CTRY_BELGIUM = 32 CTRY_BELIZE = 501 CTRY_BOLIVIA = 591 CTRY_BRAZIL = 55 CTRY_BRUNEI_DARUSSALAM = 673 CTRY_BULGARIA = 359 CTRY_CANADA = 2 CTRY_CARIBBEAN = 1 CTRY_CHILE = 56 CTRY_COLOMBIA = 57 CTRY_COSTA_RICA = 506 CTRY_CROATIA = 385 CTRY_CZECH = 420 CTRY_DEFAULT = 0 CTRY_DENMARK = 45 CTRY_DOMINICAN_REPUBLIC = 1 CTRY_ECUADOR = 593 CTRY_EGYPT = 20 CTRY_EL_SALVADOR = 503 CTRY_ESTONIA = 372 CTRY_FAEROE_ISLANDS = 298 CTRY_FINLAND = 358 CTRY_FRANCE = 33 CTRY_GEORGIA = 995 CTRY_GERMANY = 49 CTRY_GREECE = 30 CTRY_GUATEMALA = 502 CTRY_HONDURAS = 504 CTRY_HONG_KONG = 852 CTRY_HUNGARY = 36 CTRY_ICELAND = 354 CTRY_INDIA = 91 CTRY_INDONESIA = 62 CTRY_IRAN = 981 CTRY_IRAQ = 964 CTRY_IRELAND = 353 CTRY_ISRAEL = 972 CTRY_ITALY = 39 CTRY_JAMAICA = 1 CTRY_JAPAN = 81 CTRY_JORDAN = 962 CTRY_KAZAKSTAN = 7 CTRY_KENYA = 254 CTRY_KUWAIT = 965 CTRY_KYRGYZSTAN = 996 CTRY_LATVIA = 371 CTRY_LEBANON = 961 CTRY_LIBYA = 218 CTRY_LIECHTENSTEIN = 41 CTRY_LITHUANIA = 370 CTRY_LUXEMBOURG = 352 CTRY_MACAU = 853 CTRY_MACEDONIA = 389 CTRY_MALAYSIA = 60 CTRY_MALDIVES = 960 CTRY_MEXICO = 52 CTRY_MONACO = 33 CTRY_MONGOLIA = 976 CTRY_MOROCCO = 212 CTRY_NETHERLANDS = 31 CTRY_NEW_ZEALAND = 64 CTRY_NICARAGUA = 505 CTRY_NORWAY = 47 CTRY_OMAN = 968 CTRY_PAKISTAN = 92 CTRY_PANAMA = 507 CTRY_PARAGUAY = 595 CTRY_PERU = 51 CTRY_PHILIPPINES = 63 CTRY_POLAND = 48 CTRY_PORTUGAL = 351 CTRY_PRCHINA = 86 CTRY_PUERTO_RICO = 1 CTRY_QATAR = 974 CTRY_ROMANIA = 40 CTRY_RUSSIA = 7 CTRY_SAUDI_ARABIA = 966 CTRY_SERBIA = 381 CTRY_SINGAPORE = 65 CTRY_SLOVAK = 421 CTRY_SLOVENIA = 386 CTRY_SOUTH_AFRICA = 27 CTRY_SOUTH_KOREA = 82 CTRY_SPAIN = 34 CTRY_SWEDEN = 46 CTRY_SWITZERLAND = 41 CTRY_SYRIA = 963 CTRY_TAIWAN = 886 CTRY_TATARSTAN = 7 CTRY_THAILAND = 66 CTRY_TRINIDAD_Y_TOBAGO = 1 CTRY_TUNISIA = 216 CTRY_TURKEY = 90 CTRY_UAE = 971 CTRY_UKRAINE = 380 CTRY_UNITED_KINGDOM = 44 CTRY_UNITED_STATES = 1 CTRY_URUGUAY = 598 CTRY_UZBEKISTAN = 7 CTRY_VENEZUELA = 58 CTRY_VIET_NAM = 84 CTRY_YEMEN = 967 CTRY_ZIMBABWE = 263 CT_CTYPE1 = 0x00000001 CT_CTYPE2 = 0x00000002 CT_CTYPE3 = 0x00000004 CURRENT_IMPORT_REDIRECTION_VERSION = 1 CURSOR_FAULT = 4 CURSOR_INVALID = 1 CURSOR_REQUIRESEEK = 3 CURSOR_SHOWING = 0x00000001 CURSOR_SKIPNEXT = 2 CURSOR_VALID = 0 CURTYPE_BTREE = 0 CURTYPE_PSEUDO = 3 CURTYPE_SORTER = 1 CURTYPE_VTAB = 2 CURVECAPS = 28 CUR_BLOB_VERSION = 2 CWCSTORAGENAME = 32 CWF_CREATE_ONLY = 0x00000001 CWMO_MAX_HANDLES = 56 CWP_ALL = 0x0000 CWP_SKIPDISABLED = 0x0002 CWP_SKIPINVISIBLE = 0x0001 CWP_SKIPTRANSPARENT = 0x0004 DACL_SECURITY_INFORMATION = 4 DATA_E_FIRST = 2147746096 DATA_E_LAST = 2147746111 DATA_S_FIRST = 262448 DATA_S_LAST = 262463 DATE_LONGDATE = 0x00000002 DATE_LTRREADING = 0x00000010 DATE_RTLREADING = 0x00000020 DATE_SHORTDATE = 0x00000001 DATE_USE_ALT_CALENDAR = 0x00000004 DATE_YEARMONTH = 0x00000008 DBFLAG_EncodingFixed = 0x0040 DBFLAG_InternalFunc = 0x0020 DBFLAG_PreferBuiltin = 0x0002 DBFLAG_SchemaChange = 0x0001 DBFLAG_SchemaKnownOk = 0x0010 DBFLAG_Vacuum = 0x0004 DBFLAG_VacuumInto = 0x0008 DB_ResetWanted = 0x0008 DB_SchemaLoaded = 0x0001 DB_UnresetViews = 0x0002 DCBA_FACEDOWNCENTER = 0x0101 DCBA_FACEDOWNLEFT = 0x0102 DCBA_FACEDOWNNONE = 0x0100 DCBA_FACEDOWNRIGHT = 0x0103 DCBA_FACEUPCENTER = 0x0001 DCBA_FACEUPLEFT = 0x0002 DCBA_FACEUPNONE = 0x0000 DCBA_FACEUPRIGHT = 0x0003 DCB_ACCUMULATE = 0x0002 DCB_DIRTY = 2 DCB_DISABLE = 0x0008 DCB_ENABLE = 0x0004 DCB_RESET = 0x0001 DCB_SET = 3 DCE_C_ERROR_STRING_LEN = 256 DCOMSCM_ACTIVATION_DISALLOW_UNSECURE_CALL = 0x2 DCOMSCM_ACTIVATION_USE_ALL_AUTHNSERVICES = 0x1 DCOMSCM_PING_DISALLOW_UNSECURE_CALL = 0x20 DCOMSCM_PING_USE_MID_AUTHNSERVICE = 0x10 DCOMSCM_RESOLVE_DISALLOW_UNSECURE_CALL = 0x8 DCOMSCM_RESOLVE_USE_ALL_AUTHNSERVICES = 0x4 DCTT_BITMAP = 1 DCTT_DOWNLOAD = 2 DCTT_DOWNLOAD_OUTLINE = 8 DCTT_SUBDEV = 4 DCX_CACHE = 2 DCX_CLIPCHILDREN = 8 DCX_CLIPSIBLINGS = 16 DCX_EXCLUDERGN = 64 DCX_EXCLUDEUPDATE = 256 DCX_INTERSECTRGN = 128 DCX_INTERSECTUPDATE = 512 DCX_LOCKWINDOWUPDATE = 1024 DCX_NORESETATTRS = 4 DCX_PARENTCLIP = 32 DCX_VALIDATE = 2097152 DCX_WINDOW = 1 DC_ACTIVE = 0x0001 DC_BINADJUST = 19 DC_BINNAMES = 12 DC_BINS = 6 DC_BRUSH = 18 DC_BUTTONS = 0x1000 DC_COLLATE = 22 DC_COLORDEVICE = 32 DC_COPIES = 18 DC_DATATYPE_PRODUCED = 21 DC_DRIVER = 11 DC_DUPLEX = 7 DC_EMF_COMPLIANT = 20 DC_ENUMRESOLUTIONS = 13 DC_EXTRA = 9 DC_FIELDS = 1 DC_FILEDEPENDENCIES = 14 DC_GRADIENT = 0x0020 DC_HASDEFID = 0x534B DC_ICON = 0x0004 DC_INBUTTON = 0x0010 DC_MANUFACTURER = 23 DC_MAXEXTENT = 5 DC_MEDIAREADY = 29 DC_MEDIATYPENAMES = 34 DC_MEDIATYPES = 35 DC_MINEXTENT = 4 DC_MODEL = 24 DC_NUP = 33 DC_ORIENTATION = 17 DC_PAPERNAMES = 16 DC_PAPERS = 2 DC_PAPERSIZE = 3 DC_PEN = 19 DC_PERSONALITY = 25 DC_PRINTERMEM = 28 DC_PRINTRATE = 26 DC_PRINTRATEPPM = 31 DC_PRINTRATEUNIT = 27 DC_SIZE = 8 DC_SMALLCAP = 0x0002 DC_STAPLE = 30 DC_TEXT = 0x0008 DC_TRUETYPE = 15 DC_VERSION = 10 DDD_EXACT_MATCH_ON_REMOVE = 0x00000004 DDD_LUID_BROADCAST_DRIVE = 0x00000010 DDD_NO_BROADCAST_SYSTEM = 0x00000008 DDD_RAW_TARGET_PATH = 0x00000001 DDD_REMOVE_DEFINITION = 0x00000002 DDE_FACK = 0x8000 DDE_FACKREQ = 0x8000 DDE_FACKRESERVED = -49408 DDE_FADVRESERVED = -49153 DDE_FAPPSTATUS = 0x00ff DDE_FBUSY = 0x4000 DDE_FDATRESERVED = -45057 DDE_FDEFERUPD = 0x4000 DDE_FNOTPROCESSED = 0x0000 DDE_FPOKRESERVED = -8193 DDE_FRELEASE = 0x2000 DDE_FREQUESTED = 0x1000 DDL_ARCHIVE = 0x0020 DDL_DIRECTORY = 0x0010 DDL_DRIVES = 0x4000 DDL_EXCLUSIVE = 0x8000 DDL_HIDDEN = 0x0002 DDL_POSTMSGS = 0x2000 DDL_READONLY = 0x0001 DDL_READWRITE = 0x0000 DDL_SYSTEM = 0x0004 DD_DEFDRAGDELAY = 200 DD_DEFDRAGMINDIST = 2 DD_DEFSCROLLDELAY = 50 DD_DEFSCROLLINSET = 11 DD_DEFSCROLLINTERVAL = 50 DEACTIVATE_ACTCTX_FLAG_FORCE_EARLY_DEACTIVATION = 1 DEBUG_ONLY_THIS_PROCESS = 0x2 DEBUG_PROCESS = 0x1 DECLSPEC_ADDRSAFE = 0 DECLSPEC_DEPRECATED_DDK = 0 DECLSPEC_NOVTABLE = 0 DEFAULT_CHARSET = 1 DEFAULT_GUI_FONT = 17 DEFAULT_PALETTE = 15 DEFAULT_PITCH = 0 DEFAULT_QUALITY = 0 DEFAULT_UNREACHABLE = 0 DEFINDE_LPTYPEINFO = 0 DEFINED_DISPID_MEMBERID = 0 DEFINED_LPCREATETYPELIB = 0 DEFINED_LPDISPATCH = 0 DEFINED_LPTYPECOMP = 0 DEFINED_LPTYPELIB = 0 DEFINED_LPUINT = 0 DEFINE_LPCREATETYPEINFO = 0 DEF_PRIORITY = 1 DELETE = 65536 DEPRECATE_SUPPORTED = 0 DEREGISTERED = 0x05 DESKTOPHORZRES = 118 DESKTOPVERTRES = 117 DESKTOP_CREATEMENU = 4 DESKTOP_CREATEWINDOW = 2 DESKTOP_ENUMERATE = 64 DESKTOP_HOOKCONTROL = 8 DESKTOP_JOURNALPLAYBACK = 32 DESKTOP_JOURNALRECORD = 16 DESKTOP_READOBJECTS = 1 DESKTOP_SWITCHDESKTOP = 256 DESKTOP_WRITEOBJECTS = 128 DETACHED_PROCESS = 0x8 DEVICEDATA = 19 DEVICE_DEFAULT_FONT = 14 DEVICE_FONTTYPE = 0x002 DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x00000004 DEVICE_NOTIFY_SERVICE_HANDLE = 0x00000001 DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000 DFCS_ADJUSTRECT = 0x2000 DFCS_BUTTON3STATE = 0x0008 DFCS_BUTTONCHECK = 0x0000 DFCS_BUTTONPUSH = 0x0010 DFCS_BUTTONRADIO = 0x0004 DFCS_BUTTONRADIOIMAGE = 0x0001 DFCS_BUTTONRADIOMASK = 0x0002 DFCS_CAPTIONCLOSE = 0x0000 DFCS_CAPTIONHELP = 0x0004 DFCS_CAPTIONMAX = 0x0002 DFCS_CAPTIONMIN = 0x0001 DFCS_CAPTIONRESTORE = 0x0003 DFCS_CHECKED = 0x0400 DFCS_FLAT = 0x4000 DFCS_HOT = 0x1000 DFCS_INACTIVE = 0x0100 DFCS_MENUARROW = 0x0000 DFCS_MENUARROWRIGHT = 0x0004 DFCS_MENUBULLET = 0x0002 DFCS_MENUCHECK = 0x0001 DFCS_MONO = 0x8000 DFCS_PUSHED = 0x0200 DFCS_SCROLLCOMBOBOX = 0x0005 DFCS_SCROLLDOWN = 0x0001 DFCS_SCROLLLEFT = 0x0002 DFCS_SCROLLRIGHT = 0x0003 DFCS_SCROLLSIZEGRIP = 0x0008 DFCS_SCROLLSIZEGRIPRIGHT = 0x0010 DFCS_SCROLLUP = 0x0000 DFCS_TRANSPARENT = 0x0800 DFC_BUTTON = 4 DFC_CAPTION = 1 DFC_MENU = 2 DFC_POPUPMENU = 5 DFC_SCROLL = 3 DF_ALLOWOTHERACCOUNTHOOK = 1 DIAGNOSTIC_REASON_DETAILED_STRING = 0x00000002 DIAGNOSTIC_REASON_INVALID_FLAGS = -2147483652 DIAGNOSTIC_REASON_NOT_SPECIFIED = 0x80000000 DIAGNOSTIC_REASON_SIMPLE_STRING = 0x00000001 DIAGNOSTIC_REASON_VERSION = 0 DIALOPTION_BILLING = 0x00000040 DIALOPTION_DIALTONE = 0x00000100 DIALOPTION_QUIET = 0x00000080 DIB_PAL_COLORS = 1 DIB_RGB_COLORS = 0 DIFFERENCE = 11 DIRECT_MODE = 0 DISABLE_MAX_PRIVILEGE = 0x1 DISABLE_NEWLINE_AUTO_RETURN = 0x8 DISABLE_SMART = 0xD9 DISCHARGE_POLICY_CRITICAL = 0 DISCHARGE_POLICY_LOW = 1 DISC_NO_FORCE = 0x00000040 DISC_UPDATE_PROFILE = 0x00000001 DISK_BINNING = 3 DISK_LOGGING_DUMP = 2 DISK_LOGGING_START = 0 DISK_LOGGING_STOP = 1 DISPATCH_METHOD = 0x1 DISPATCH_PROPERTYGET = 0x2 DISPATCH_PROPERTYPUT = 0x4 DISPATCH_PROPERTYPUTREF = 0x8 DISPID_COLLECT = -8 DISPID_CONSTRUCTOR = -6 DISPID_DESTRUCTOR = -7 DISPID_EVALUATE = -5 DISPID_NEWENUM = -4 DISPID_PROPERTYPUT = -3 DISPID_UNKNOWN = -1 DISPID_VALUE = 0 DISPLAY_DEVICE_ACTIVE = 0x00000001 DISPLAY_DEVICE_ATTACHED = 0x00000002 DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = 0x00000001 DISPLAY_DEVICE_DISCONNECT = 0x02000000 DISPLAY_DEVICE_MIRRORING_DRIVER = 0x00000008 DISPLAY_DEVICE_MODESPRUNED = 0x08000000 DISPLAY_DEVICE_MULTI_DRIVER = 0x00000002 DISPLAY_DEVICE_PRIMARY_DEVICE = 0x00000004 DISPLAY_DEVICE_RDPUDD = 0x01000000 DISPLAY_DEVICE_REMOTE = 0x04000000 DISPLAY_DEVICE_REMOVABLE = 0x00000020 DISPLAY_DEVICE_TS_COMPATIBLE = 0x00200000 DISPLAY_DEVICE_VGA_COMPATIBLE = 0x00000010 DISP_CHANGE_BADDUALVIEW = -6 DISP_CHANGE_BADFLAGS = -4 DISP_CHANGE_BADMODE = -2 DISP_CHANGE_BADPARAM = -5 DISP_CHANGE_FAILED = -1 DISP_CHANGE_NOTUPDATED = -3 DISP_CHANGE_RESTART = 1 DISP_CHANGE_SUCCESSFUL = 0 DI_APPBANDING = 0x00000001 DI_CHANNEL = 1 DI_COMPAT = 0x0004 DI_DEFAULTSIZE = 0x0008 DI_IMAGE = 0x0002 DI_MASK = 0x0001 DI_MEMORYMAP_WRITE = 0x00000001 DI_NOMIRROR = 0x0010 DI_NORMAL = 0x0003 DI_READ_SPOOL_JOB = 3 DI_ROPS_READ_DESTINATION = 0x00000002 DKGRAY_BRUSH = 3 DLGC_BUTTON = 0x2000 DLGC_DEFPUSHBUTTON = 0x0010 DLGC_HASSETSEL = 0x0008 DLGC_RADIOBUTTON = 0x0040 DLGC_STATIC = 0x0100 DLGC_UNDEFPUSHBUTTON = 0x0020 DLGC_WANTALLKEYS = 0x0004 DLGC_WANTARROWS = 0x0001 DLGC_WANTCHARS = 0x0080 DLGC_WANTMESSAGE = 0x0004 DLGC_WANTTAB = 0x0002 DLGWINDOWEXTRA = 30 DLL_PROCESS_ATTACH = 1 DLL_PROCESS_DETACH = 0 DLL_PROCESS_VERIFIER = 4 DLL_THREAD_ATTACH = 2 DLL_THREAD_DETACH = 3 DMBIN_AUTO = 7 DMBIN_CASSETTE = 14 DMBIN_ENVELOPE = 5 DMBIN_ENVMANUAL = 6 DMBIN_FIRST = 1 DMBIN_FORMSOURCE = 15 DMBIN_LARGECAPACITY = 11 DMBIN_LARGEFMT = 10 DMBIN_LAST = 15 DMBIN_LOWER = 2 DMBIN_MANUAL = 4 DMBIN_MIDDLE = 3 DMBIN_ONLYONE = 1 DMBIN_SMALLFMT = 9 DMBIN_TRACTOR = 8 DMBIN_UPPER = 1 DMBIN_USER = 256 DMCOLLATE_FALSE = 0 DMCOLLATE_TRUE = 1 DMCOLOR_COLOR = 2 DMCOLOR_MONOCHROME = 1 DMDFO_CENTER = 2 DMDFO_DEFAULT = 0 DMDFO_STRETCH = 1 DMDISPLAYFLAGS_TEXTMODE = 0x00000004 DMDITHER_COARSE = 2 DMDITHER_ERRORDIFFUSION = 5 DMDITHER_FINE = 3 DMDITHER_GRAYSCALE = 10 DMDITHER_LINEART = 4 DMDITHER_NONE = 1 DMDITHER_RESERVED6 = 6 DMDITHER_RESERVED7 = 7 DMDITHER_RESERVED8 = 8 DMDITHER_RESERVED9 = 9 DMDITHER_USER = 256 DMDO_180 = 2 DMDO_270 = 3 DMDO_90 = 1 DMDO_DEFAULT = 0 DMDUP_HORIZONTAL = 3 DMDUP_SIMPLEX = 1 DMDUP_VERTICAL = 2 DMICMMETHOD_DEVICE = 4 DMICMMETHOD_DRIVER = 3 DMICMMETHOD_NONE = 1 DMICMMETHOD_SYSTEM = 2 DMICMMETHOD_USER = 256 DMICM_ABS_COLORIMETRIC = 4 DMICM_COLORIMETRIC = 3 DMICM_CONTRAST = 2 DMICM_SATURATE = 1 DMICM_USER = 256 DMLERR_ADVACKTIMEOUT = 0x4000 DMLERR_BUSY = 0x4001 DMLERR_DATAACKTIMEOUT = 0x4002 DMLERR_DLL_NOT_INITIALIZED = 0x4003 DMLERR_DLL_USAGE = 0x4004 DMLERR_EXECACKTIMEOUT = 0x4005 DMLERR_FIRST = 0x4000 DMLERR_INVALIDPARAMETER = 0x4006 DMLERR_LAST = 0x4011 DMLERR_LOW_MEMORY = 0x4007 DMLERR_MEMORY_ERROR = 0x4008 DMLERR_NOTPROCESSED = 0x4009 DMLERR_NO_CONV_ESTABLISHED = 0x400a DMLERR_NO_ERROR = 0 DMLERR_POKEACKTIMEOUT = 0x400b DMLERR_POSTMSG_FAILED = 0x400c DMLERR_REENTRANCY = 0x400d DMLERR_SERVER_DIED = 0x400e DMLERR_SYS_ERROR = 0x400f DMLERR_UNADVACKTIMEOUT = 0x4010 DMLERR_UNFOUND_QUEUE_ID = 0x4011 DMMEDIA_GLOSSY = 3 DMMEDIA_STANDARD = 1 DMMEDIA_TRANSPARENCY = 2 DMMEDIA_USER = 256 DMNUP_ONEUP = 2 DMNUP_SYSTEM = 1 DMORIENT_LANDSCAPE = 2 DMORIENT_PORTRAIT = 1 DMPAPER_10X11 = 45 DMPAPER_10X14 = 16 DMPAPER_11X17 = 17 DMPAPER_12X11 = 90 DMPAPER_15X11 = 46 DMPAPER_9X11 = 44 DMPAPER_A2 = 66 DMPAPER_A3 = 8 DMPAPER_A3_EXTRA = 63 DMPAPER_A3_EXTRA_TRANSVERSE = 68 DMPAPER_A3_ROTATED = 76 DMPAPER_A3_TRANSVERSE = 67 DMPAPER_A4 = 9 DMPAPER_A4SMALL = 10 DMPAPER_A4_EXTRA = 53 DMPAPER_A4_PLUS = 60 DMPAPER_A4_ROTATED = 77 DMPAPER_A4_TRANSVERSE = 55 DMPAPER_A5 = 11 DMPAPER_A5_EXTRA = 64 DMPAPER_A5_ROTATED = 78 DMPAPER_A5_TRANSVERSE = 61 DMPAPER_A6 = 70 DMPAPER_A6_ROTATED = 83 DMPAPER_A_PLUS = 57 DMPAPER_B4 = 12 DMPAPER_B4_JIS_ROTATED = 79 DMPAPER_B5 = 13 DMPAPER_B5_EXTRA = 65 DMPAPER_B5_JIS_ROTATED = 80 DMPAPER_B5_TRANSVERSE = 62 DMPAPER_B6_JIS = 88 DMPAPER_B6_JIS_ROTATED = 89 DMPAPER_B_PLUS = 58 DMPAPER_CSHEET = 24 DMPAPER_DBL_JAPANESE_POSTCARD = 69 DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED = 82 DMPAPER_DSHEET = 25 DMPAPER_ENV_10 = 20 DMPAPER_ENV_11 = 21 DMPAPER_ENV_12 = 22 DMPAPER_ENV_14 = 23 DMPAPER_ENV_9 = 19 DMPAPER_ENV_B4 = 33 DMPAPER_ENV_B5 = 34 DMPAPER_ENV_B6 = 35 DMPAPER_ENV_C3 = 29 DMPAPER_ENV_C4 = 30 DMPAPER_ENV_C5 = 28 DMPAPER_ENV_C6 = 31 DMPAPER_ENV_C65 = 32 DMPAPER_ENV_DL = 27 DMPAPER_ENV_INVITE = 47 DMPAPER_ENV_ITALY = 36 DMPAPER_ENV_MONARCH = 37 DMPAPER_ENV_PERSONAL = 38 DMPAPER_ESHEET = 26 DMPAPER_EXECUTIVE = 7 DMPAPER_FANFOLD_LGL_GERMAN = 41 DMPAPER_FANFOLD_STD_GERMAN = 40 DMPAPER_FANFOLD_US = 39 DMPAPER_FIRST = 1 DMPAPER_FOLIO = 14 DMPAPER_ISO_B4 = 42 DMPAPER_JAPANESE_POSTCARD = 43 DMPAPER_JAPANESE_POSTCARD_ROTATED = 81 DMPAPER_JENV_CHOU3 = 73 DMPAPER_JENV_CHOU3_ROTATED = 86 DMPAPER_JENV_CHOU4 = 74 DMPAPER_JENV_CHOU4_ROTATED = 87 DMPAPER_JENV_KAKU2 = 71 DMPAPER_JENV_KAKU2_ROTATED = 84 DMPAPER_JENV_KAKU3 = 72 DMPAPER_JENV_KAKU3_ROTATED = 85 DMPAPER_JENV_YOU4 = 91 DMPAPER_JENV_YOU4_ROTATED = 92 DMPAPER_LAST = 118 DMPAPER_LEDGER = 4 DMPAPER_LEGAL = 5 DMPAPER_LEGAL_EXTRA = 51 DMPAPER_LETTER = 1 DMPAPER_LETTERSMALL = 2 DMPAPER_LETTER_EXTRA = 50 DMPAPER_LETTER_EXTRA_TRANSVERSE = 56 DMPAPER_LETTER_PLUS = 59 DMPAPER_LETTER_ROTATED = 75 DMPAPER_LETTER_TRANSVERSE = 54 DMPAPER_NOTE = 18 DMPAPER_P16K = 93 DMPAPER_P16K_ROTATED = 106 DMPAPER_P32K = 94 DMPAPER_P32KBIG = 95 DMPAPER_P32KBIG_ROTATED = 108 DMPAPER_P32K_ROTATED = 107 DMPAPER_PENV_1 = 96 DMPAPER_PENV_10 = 105 DMPAPER_PENV_10_ROTATED = 118 DMPAPER_PENV_1_ROTATED = 109 DMPAPER_PENV_2 = 97 DMPAPER_PENV_2_ROTATED = 110 DMPAPER_PENV_3 = 98 DMPAPER_PENV_3_ROTATED = 111 DMPAPER_PENV_4 = 99 DMPAPER_PENV_4_ROTATED = 112 DMPAPER_PENV_5 = 100 DMPAPER_PENV_5_ROTATED = 113 DMPAPER_PENV_6 = 101 DMPAPER_PENV_6_ROTATED = 114 DMPAPER_PENV_7 = 102 DMPAPER_PENV_7_ROTATED = 115 DMPAPER_PENV_8 = 103 DMPAPER_PENV_8_ROTATED = 116 DMPAPER_PENV_9 = 104 DMPAPER_PENV_9_ROTATED = 117 DMPAPER_QUARTO = 15 DMPAPER_RESERVED_48 = 48 DMPAPER_RESERVED_49 = 49 DMPAPER_STATEMENT = 6 DMPAPER_TABLOID = 3 DMPAPER_TABLOID_EXTRA = 52 DMPAPER_USER = 256 DMRES_DRAFT = -1 DMRES_HIGH = -4 DMRES_LOW = -2 DMRES_MEDIUM = -3 DMTT_BITMAP = 1 DMTT_DOWNLOAD = 2 DMTT_DOWNLOAD_OUTLINE = 4 DMTT_SUBDEV = 3 DM_BITSPERPEL = 262144 DM_COLLATE = 32768 DM_COLOR = 2048 DM_COPIES = 256 DM_COPY = 2 DM_DEFAULTSOURCE = 512 DM_DISPLAYFIXEDOUTPUT = 536870912 DM_DISPLAYFLAGS = 2097152 DM_DISPLAYFREQUENCY = 4194304 DM_DISPLAYORIENTATION = 128 DM_DITHERTYPE = 67108864 DM_DUPLEX = 4096 DM_FORMNAME = 65536 DM_GETDEFID = 1024 DM_ICMINTENT = 16777216 DM_ICMMETHOD = 8388608 DM_INTERLACED = 0x00000002 DM_IN_BUFFER = 8 DM_IN_PROMPT = 4 DM_LOGPIXELS = 131072 DM_MEDIATYPE = 33554432 DM_MODIFY = 8 DM_NUP = 64 DM_ORIENTATION = 1 DM_OUT_BUFFER = 2 DM_OUT_DEFAULT = 1 DM_PANNINGHEIGHT = 268435456 DM_PANNINGWIDTH = 134217728 DM_PAPERLENGTH = 4 DM_PAPERSIZE = 2 DM_PAPERWIDTH = 8 DM_PELSHEIGHT = 1048576 DM_PELSWIDTH = 524288 DM_POSITION = 32 DM_PRINTQUALITY = 1024 DM_PROMPT = 4 DM_REPOSITION = 1026 DM_SCALE = 16 DM_SETDEFID = 1025 DM_SPECVERSION = 0x0401 DM_TTOPTION = 16384 DM_UPDATE = 1 DM_YRESOLUTION = 8192 DNS_ERROR_AUTOZONE_ALREADY_EXISTS = 9610 DNS_ERROR_AXFR = 9752 DNS_ERROR_BAD_PACKET = 9502 DNS_ERROR_CANNOT_FIND_ROOT_HINTS = 9564 DNS_ERROR_CNAME_COLLISION = 9709 DNS_ERROR_CNAME_LOOP = 9707 DNS_ERROR_DATABASE_BASE = 9700 DNS_ERROR_DATAFILE_BASE = 9650 DNS_ERROR_DATAFILE_OPEN_FAILURE = 9653 DNS_ERROR_DATAFILE_PARSING = 9655 DNS_ERROR_DP_ALREADY_ENLISTED = 9904 DNS_ERROR_DP_ALREADY_EXISTS = 9902 DNS_ERROR_DP_BASE = 9900 DNS_ERROR_DP_DOES_NOT_EXIST = 9901 DNS_ERROR_DP_FSMO_ERROR = 9906 DNS_ERROR_DP_NOT_AVAILABLE = 9905 DNS_ERROR_DP_NOT_ENLISTED = 9903 DNS_ERROR_DS_UNAVAILABLE = 9717 DNS_ERROR_DS_ZONE_ALREADY_EXISTS = 9718 DNS_ERROR_FILE_WRITEBACK_FAILED = 9654 DNS_ERROR_FORWARDER_ALREADY_EXISTS = 9619 DNS_ERROR_GENERAL_API_BASE = 9550 DNS_ERROR_INCONSISTENT_ROOT_HINTS = 9565 DNS_ERROR_INVALID_DATA = 13 DNS_ERROR_INVALID_DATAFILE_NAME = 9652 DNS_ERROR_INVALID_IP_ADDRESS = 9552 DNS_ERROR_INVALID_NAME = 123 DNS_ERROR_INVALID_NAME_CHAR = 9560 DNS_ERROR_INVALID_PROPERTY = 9553 DNS_ERROR_INVALID_TYPE = 9551 DNS_ERROR_INVALID_ZONE_OPERATION = 9603 DNS_ERROR_INVALID_ZONE_TYPE = 9611 DNS_ERROR_MASK = 0x00002328 DNS_ERROR_NAME_DOES_NOT_EXIST = 9714 DNS_ERROR_NAME_NOT_IN_ZONE = 9706 DNS_ERROR_NBSTAT_INIT_FAILED = 9617 DNS_ERROR_NEED_SECONDARY_ADDRESSES = 9614 DNS_ERROR_NEED_WINS_SERVERS = 9616 DNS_ERROR_NODE_CREATION_FAILED = 9703 DNS_ERROR_NODE_IS_CNAME = 9708 DNS_ERROR_NON_RFC_NAME = 9556 DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER = 9562 DNS_ERROR_NOT_ALLOWED_UNDER_DELEGATION = 9563 DNS_ERROR_NOT_UNIQUE = 9555 DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE = 9719 DNS_ERROR_NO_CREATE_CACHE_DATA = 9713 DNS_ERROR_NO_DNS_SERVERS = 9852 DNS_ERROR_NO_MEMORY = 14 DNS_ERROR_NO_PACKET = 9503 DNS_ERROR_NO_TCPIP = 9851 DNS_ERROR_NO_ZONE_INFO = 9602 DNS_ERROR_NUMERIC_NAME = 9561 DNS_ERROR_OPERATION_BASE = 9750 DNS_ERROR_PACKET_FMT_BASE = 9500 DNS_ERROR_PRIMARY_REQUIRES_DATAFILE = 9651 DNS_ERROR_RCODE = 9504 DNS_ERROR_RCODE_BADKEY = 9017 DNS_ERROR_RCODE_BADSIG = 9016 DNS_ERROR_RCODE_BADTIME = 9018 DNS_ERROR_RCODE_FORMAT_ERROR = 9001 DNS_ERROR_RCODE_LAST = 9018 DNS_ERROR_RCODE_NAME_ERROR = 9003 DNS_ERROR_RCODE_NOTAUTH = 9009 DNS_ERROR_RCODE_NOTZONE = 9010 DNS_ERROR_RCODE_NOT_IMPLEMENTED = 9004 DNS_ERROR_RCODE_NO_ERROR = 0 DNS_ERROR_RCODE_NXRRSET = 9008 DNS_ERROR_RCODE_REFUSED = 9005 DNS_ERROR_RCODE_SERVER_FAILURE = 9002 DNS_ERROR_RCODE_YXDOMAIN = 9006 DNS_ERROR_RCODE_YXRRSET = 9007 DNS_ERROR_RECORD_ALREADY_EXISTS = 9711 DNS_ERROR_RECORD_DOES_NOT_EXIST = 9701 DNS_ERROR_RECORD_FORMAT = 9702 DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT = 9710 DNS_ERROR_RECORD_TIMED_OUT = 9705 DNS_ERROR_RESPONSE_CODES_BASE = 9000 DNS_ERROR_SECONDARY_DATA = 9712 DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP = 9612 DNS_ERROR_SECURE_BASE = 9800 DNS_ERROR_SETUP_BASE = 9850 DNS_ERROR_SOA_DELETE_INVALID = 9618 DNS_ERROR_TRY_AGAIN_LATER = 9554 DNS_ERROR_UNKNOWN_RECORD_TYPE = 9704 DNS_ERROR_UNSECURE_PACKET = 9505 DNS_ERROR_WINS_INIT_FAILED = 9615 DNS_ERROR_ZONE_ALREADY_EXISTS = 9609 DNS_ERROR_ZONE_BASE = 9600 DNS_ERROR_ZONE_CONFIGURATION_ERROR = 9604 DNS_ERROR_ZONE_CREATION_FAILED = 9608 DNS_ERROR_ZONE_DOES_NOT_EXIST = 9601 DNS_ERROR_ZONE_HAS_NO_NS_RECORDS = 9606 DNS_ERROR_ZONE_HAS_NO_SOA_RECORD = 9605 DNS_ERROR_ZONE_IS_SHUTDOWN = 9621 DNS_ERROR_ZONE_LOCKED = 9607 DNS_ERROR_ZONE_NOT_SECONDARY = 9613 DNS_ERROR_ZONE_REQUIRES_MASTER_IP = 9620 DNS_FILTEROFF = 0x0008 DNS_FILTERON = 0x0004 DNS_INFO_ADDED_LOCAL_WINS = 9753 DNS_INFO_AXFR_COMPLETE = 9751 DNS_INFO_NO_RECORDS = 9501 DNS_REGISTER = 0x0001 DNS_STATUS_CONTINUE_NEEDED = 9801 DNS_STATUS_DOTTED_NAME = 9558 DNS_STATUS_FQDN = 9557 DNS_STATUS_PACKET_UNSECURE = 9505 DNS_STATUS_SINGLE_PART_NAME = 9559 DNS_UNREGISTER = 0x0002 DNS_WARNING_DOMAIN_UNDELETED = 9716 DNS_WARNING_PTR_CREATE_FAILED = 9715 DN_DEFAULTPRN = 0x1 DOCKINFO_DOCKED = 2 DOCKINFO_UNDOCKED = 1 DOCKINFO_USER_DOCKED = 6 DOCKINFO_USER_SUPPLIED = 4 DOCKINFO_USER_UNDOCKED = 5 DOF_DIRECTORY = 0x8003 DOF_DOCUMENT = 0x8002 DOF_EXECUTABLE = 0x8001 DOF_MULTIPLE = 0x8004 DOF_PROGMAN = 0x0001 DOF_SHELLDATA = 0x0002 DOMAIN = 1 DOMAIN_ALIAS_RID_ACCESS_CONTROL_ASSISTANCE_OPS = 579 DOMAIN_ALIAS_RID_ACCOUNT_OPS = 548 DOMAIN_ALIAS_RID_ADMINS = 544 DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS = 560 DOMAIN_ALIAS_RID_BACKUP_OPS = 551 DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP = 571 DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP = 574 DOMAIN_ALIAS_RID_CRYPTO_OPERATORS = 569 DOMAIN_ALIAS_RID_DCOM_USERS = 562 DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP = 573 DOMAIN_ALIAS_RID_GUESTS = 546 DOMAIN_ALIAS_RID_HYPER_V_ADMINS = 578 DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS = 557 DOMAIN_ALIAS_RID_IUSERS = 568 DOMAIN_ALIAS_RID_LOGGING_USERS = 559 DOMAIN_ALIAS_RID_MONITORING_USERS = 558 DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS = 556 DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP = 572 DOMAIN_ALIAS_RID_POWER_USERS = 547 DOMAIN_ALIAS_RID_PREW2KCOMPACCESS = 554 DOMAIN_ALIAS_RID_PRINT_OPS = 550 DOMAIN_ALIAS_RID_RAS_SERVERS = 553 DOMAIN_ALIAS_RID_RDS_ENDPOINT_SERVERS = 576 DOMAIN_ALIAS_RID_RDS_MANAGEMENT_SERVERS = 577 DOMAIN_ALIAS_RID_RDS_REMOTE_ACCESS_SERVERS = 575 DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS = 555 DOMAIN_ALIAS_RID_REMOTE_MANAGEMENT_USERS = 580 DOMAIN_ALIAS_RID_REPLICATOR = 552 DOMAIN_ALIAS_RID_SYSTEM_OPS = 549 DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS = 561 DOMAIN_ALIAS_RID_USERS = 545 DOMAIN_GROUP_RID_ADMINS = 512 DOMAIN_GROUP_RID_AUTHORIZATION_DATA_CONTAINS_CLAIMS = 497 DOMAIN_GROUP_RID_AUTHORIZATION_DATA_IS_COMPOUNDED = 496 DOMAIN_GROUP_RID_CERT_ADMINS = 517 DOMAIN_GROUP_RID_CLONEABLE_CONTROLLERS = 522 DOMAIN_GROUP_RID_COMPUTERS = 515 DOMAIN_GROUP_RID_CONTROLLERS = 516 DOMAIN_GROUP_RID_ENTERPRISE_ADMINS = 519 DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS = 498 DOMAIN_GROUP_RID_GUESTS = 514 DOMAIN_GROUP_RID_POLICY_ADMINS = 520 DOMAIN_GROUP_RID_READONLY_CONTROLLERS = 521 DOMAIN_GROUP_RID_SCHEMA_ADMINS = 518 DOMAIN_GROUP_RID_USERS = 513 DOMAIN_USER_RID_ADMIN = 500 DOMAIN_USER_RID_GUEST = 501 DOMAIN_USER_RID_KRBTGT = 502 DOMAIN_USER_RID_MAX = 999 DONT_RESOLVE_DLL_REFERENCES = 0x1 DOUBLE_CLICK = 0x2 DOWNLOADFACE = 514 DOWNLOADHEADER = 4111 DO_DROPFILE = 1162627398 DO_PRINTFILE = 1414419024 DPD_DELETE_ALL_FILES = 0x00000004 DPD_DELETE_SPECIFIC_VERSION = 0x00000002 DPD_DELETE_UNUSED_FILES = 0x00000001 DRAFTMODE = 7 DRAFT_QUALITY = 1 DRAGDROP_E_FIRST = 2147746048 DRAGDROP_E_LAST = 2147746063 DRAGDROP_S_FIRST = 262400 DRAGDROP_S_LAST = 262415 DRAWPATTERNRECT = 25 DRIVERSPECS_H = 0 DRIVERVERSION = 0 DRIVER_KERNELMODE = 0x00000001 DRIVER_USERMODE = 0x00000002 DRIVE_CDROM = 5 DRIVE_FIXED = 3 DRIVE_NO_ROOT_DIR = 1 DRIVE_RAMDISK = 6 DRIVE_REMOTE = 4 DRIVE_REMOVABLE = 2 DRIVE_UNKNOWN = 0 DROPEFFECT_COPY = 1 DROPEFFECT_LINK = 4 DROPEFFECT_MOVE = 2 DROPEFFECT_NONE = 0 DROPEFFECT_SCROLL = 2147483648 DRVCNF_CANCEL = 0x0000 DRVCNF_OK = 0x0001 DRVCNF_RESTART = 0x0002 DRV_CANCEL = 0 DRV_CLOSE = 0x0004 DRV_CONFIGURE = 0x0007 DRV_DISABLE = 0x0005 DRV_ENABLE = 0x0002 DRV_EXITSESSION = 0x000B DRV_FREE = 0x0006 DRV_INSTALL = 0x0009 DRV_LOAD = 0x0001 DRV_MCI_FIRST = 2048 DRV_MCI_LAST = 6143 DRV_OK = 1 DRV_OPEN = 0x0003 DRV_POWER = 0x000F DRV_QUERYCONFIGURE = 0x0008 DRV_REMOVE = 0x000A DRV_RESERVED = 0x0800 DRV_RESTART = 2 DRV_USER = 0x4000 DSPRINT_PENDING = 0x80000000 DSPRINT_PUBLISH = 0x00000001 DSPRINT_REPUBLISH = 0x00000008 DSPRINT_UNPUBLISH = 0x00000004 DSPRINT_UPDATE = 0x00000002 DSS_DISABLED = 0x0020 DSS_HIDEPREFIX = 0x0200 DSS_MONO = 0x0080 DSS_NORMAL = 0x0000 DSS_PREFIXONLY = 0x0400 DSS_RIGHT = 0x8000 DSS_UNION = 0x0010 DST_BITMAP = 0x0004 DST_COMPLEX = 0x0000 DST_ICON = 0x0003 DST_PREFIXTEXT = 0x0002 DST_TEXT = 0x0001 DS_3DLOOK = 4 DS_ABSALIGN = 1 DS_CENTER = 2048 DS_CENTERMOUSE = 4096 DS_CONTEXTHELP = 8192 DS_CONTROL = 1024 DS_FIXEDSYS = 8 DS_LOCALEDIT = 32 DS_MODALFRAME = 128 DS_NOFAILCREATE = 16 DS_NOIDLEMSG = 256 DS_SETFONT = 64 DS_SETFOREGROUND = 512 DS_SHELLFONT = 72 DS_SYSMODAL = 2 DS_S_SUCCESS = 0 DTR_CONTROL_DISABLE = 0x0 DTR_CONTROL_ENABLE = 0x1 DTR_CONTROL_HANDSHAKE = 0x2 DT_BOTTOM = 0x00000008 DT_CALCRECT = 0x00000400 DT_CENTER = 0x00000001 DT_CHARSTREAM = 4 DT_DISPFILE = 6 DT_EDITCONTROL = 0x00002000 DT_END_ELLIPSIS = 0x00008000 DT_EXPANDTABS = 0x00000040 DT_EXTERNALLEADING = 0x00000200 DT_HIDEPREFIX = 0x00100000 DT_INTERNAL = 0x00001000 DT_LEFT = 0x00000000 DT_METAFILE = 5 DT_MODIFYSTRING = 0x00010000 DT_NOCLIP = 0x00000100 DT_NOFULLWIDTHCHARBREAK = 0x00080000 DT_NOPREFIX = 0x00000800 DT_PATH_ELLIPSIS = 0x00004000 DT_PLOTTER = 0 DT_PREFIXONLY = 0x00200000 DT_RASCAMERA = 3 DT_RASDISPLAY = 1 DT_RASPRINTER = 2 DT_RIGHT = 0x00000002 DT_RTLREADING = 0x00020000 DT_SINGLELINE = 0x00000020 DT_TABSTOP = 0x00000080 DT_TOP = 0x00000000 DT_VCENTER = 0x00000004 DT_WORDBREAK = 0x00000010 DT_WORD_ELLIPSIS = 0x00040000 DUPLICATE = 0x06 DUPLICATE_CLOSE_SOURCE = 0x00000001 DUPLICATE_DEREG = 0x07 DUPLICATE_SAME_ACCESS = 0x00000002 DWLP_MSGRESULT = 0 E2BIG = 7 EACCES = 13 EADDRINUSE = 100 EADDRNOTAVAIL = 101 EAFNOSUPPORT = 102 EAGAIN = 11 EALREADY = 103 EASTEUROPE_CHARSET = 238 EBADF = 9 EBADMSG = 104 EBUSY = 16 ECANCELED = 105 ECHILD = 10 ECONNABORTED = 106 ECONNREFUSED = 107 ECONNRESET = 108 EC_DISABLE = 8 EC_ENABLEALL = 0 EC_ENABLEONE = 128 EC_LEFTMARGIN = 0x0001 EC_QUERYWAITING = 2 EC_RIGHTMARGIN = 0x0002 EC_USEFONTINFO = 0xffff EDD_GET_DEVICE_INTERFACE_NAME = 0x00000001 EDEADLK = 36 EDEADLOCK = 36 EDESTADDRREQ = 109 EDGE_BUMP = 9 EDGE_ETCHED = 6 EDGE_RAISED = 5 EDGE_SUNKEN = 10 EDOM = 33 EDS_RAWMODE = 0x00000002 EDS_ROTATEDMODE = 0x00000004 EEInfoGCCOM = 11 EEInfoGCFRS = 12 EEInfoNextRecordsMissing = 2 EEInfoPreviousRecordsMissing = 1 EEInfoUseFileTime = 4 EEXIST = 17 EFAULT = 14 EFBIG = 27 EFSRPC_SECURE_ONLY = 8 EFS_USE_RECOVERY_KEYS = 1 EHOSTUNREACH = 110 EIDRM = 111 EILSEQ = 42 EIMES_CANCELCOMPSTRINFOCUS = 0x0002 EIMES_COMPLETECOMPSTRKILLFOCUS = 0x0004 EIMES_GETCOMPSTRATONCE = 0x0001 EINPROGRESS = 112 EINTR = 4 EINVAL = 22 EIO = 5 EISCONN = 113 EISDIR = 21 ELEMENT_STATUS_ACCESS = 0x00000008 ELEMENT_STATUS_AVOLTAG = 0x20000000 ELEMENT_STATUS_EXCEPT = 0x00000004 ELEMENT_STATUS_EXENAB = 0x00000010 ELEMENT_STATUS_FULL = 0x00000001 ELEMENT_STATUS_ID_VALID = 0x00002000 ELEMENT_STATUS_IMPEXP = 0x00000002 ELEMENT_STATUS_INENAB = 0x00000020 ELEMENT_STATUS_INVERT = 0x00400000 ELEMENT_STATUS_LUN_VALID = 0x00001000 ELEMENT_STATUS_NOT_BUS = 0x00008000 ELEMENT_STATUS_PRODUCT_DATA = 0x00000040 ELEMENT_STATUS_PVOLTAG = 0x10000000 ELEMENT_STATUS_SVALID = 0x00800000 ELF_CULTURE_LATIN = 0 ELF_VENDOR_SIZE = 4 ELF_VERSION = 0 ELOOP = 114 EMARCH_ENC_I17_IC_INST_WORD_POS_X = 12 EMARCH_ENC_I17_IC_INST_WORD_X = 3 EMARCH_ENC_I17_IC_SIZE_X = 1 EMARCH_ENC_I17_IC_VAL_POS_X = 21 EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X = 14 EMARCH_ENC_I17_IMM41a_INST_WORD_X = 1 EMARCH_ENC_I17_IMM41a_SIZE_X = 10 EMARCH_ENC_I17_IMM41a_VAL_POS_X = 22 EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X = 24 EMARCH_ENC_I17_IMM41b_INST_WORD_X = 1 EMARCH_ENC_I17_IMM41b_SIZE_X = 8 EMARCH_ENC_I17_IMM41b_VAL_POS_X = 32 EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X = 0 EMARCH_ENC_I17_IMM41c_INST_WORD_X = 2 EMARCH_ENC_I17_IMM41c_SIZE_X = 23 EMARCH_ENC_I17_IMM41c_VAL_POS_X = 40 EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X = 13 EMARCH_ENC_I17_IMM5C_INST_WORD_X = 3 EMARCH_ENC_I17_IMM5C_SIZE_X = 5 EMARCH_ENC_I17_IMM5C_VAL_POS_X = 16 EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X = 4 EMARCH_ENC_I17_IMM7B_INST_WORD_X = 3 EMARCH_ENC_I17_IMM7B_SIZE_X = 7 EMARCH_ENC_I17_IMM7B_VAL_POS_X = 0 EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X = 18 EMARCH_ENC_I17_IMM9D_INST_WORD_X = 3 EMARCH_ENC_I17_IMM9D_SIZE_X = 9 EMARCH_ENC_I17_IMM9D_VAL_POS_X = 7 EMARCH_ENC_I17_SIGN_INST_WORD_POS_X = 27 EMARCH_ENC_I17_SIGN_INST_WORD_X = 3 EMARCH_ENC_I17_SIGN_SIZE_X = 1 EMARCH_ENC_I17_SIGN_VAL_POS_X = 63 EMBDHLP_CREATENOW = 0 EMBDHLP_DELAYCREATE = 65536 EMBDHLP_INPROC_HANDLER = 0 EMBDHLP_INPROC_SERVER = 1 EMFILE = 24 EMLINK = 31 EMR_ABORTPATH = 68 EMR_ALPHABLEND = 114 EMR_ANGLEARC = 41 EMR_ARC = 45 EMR_ARCTO = 55 EMR_BEGINPATH = 59 EMR_BITBLT = 76 EMR_CHORD = 46 EMR_CLOSEFIGURE = 61 EMR_COLORCORRECTPALETTE = 111 EMR_COLORMATCHTOTARGETW = 121 EMR_CREATEBRUSHINDIRECT = 39 EMR_CREATECOLORSPACE = 99 EMR_CREATECOLORSPACEW = 122 EMR_CREATEDIBPATTERNBRUSHPT = 94 EMR_CREATEMONOBRUSH = 93 EMR_CREATEPALETTE = 49 EMR_CREATEPEN = 38 EMR_DELETECOLORSPACE = 101 EMR_DELETEOBJECT = 40 EMR_ELLIPSE = 42 EMR_ENDPATH = 60 EMR_EOF = 14 EMR_EXCLUDECLIPRECT = 29 EMR_EXTCREATEFONTINDIRECTW = 82 EMR_EXTCREATEPEN = 95 EMR_EXTFLOODFILL = 53 EMR_EXTSELECTCLIPRGN = 75 EMR_EXTTEXTOUTA = 83 EMR_EXTTEXTOUTW = 84 EMR_FILLPATH = 62 EMR_FILLRGN = 71 EMR_FLATTENPATH = 65 EMR_FRAMERGN = 72 EMR_GDICOMMENT = 70 EMR_GLSBOUNDEDRECORD = 103 EMR_GLSRECORD = 102 EMR_GRADIENTFILL = 118 EMR_HEADER = 1 EMR_INTERSECTCLIPRECT = 30 EMR_INVERTRGN = 73 EMR_LINETO = 54 EMR_MASKBLT = 78 EMR_MAX = 122 EMR_MIN = 1 EMR_MODIFYWORLDTRANSFORM = 36 EMR_MOVETOEX = 27 EMR_OFFSETCLIPRGN = 26 EMR_PAINTRGN = 74 EMR_PIE = 47 EMR_PIXELFORMAT = 104 EMR_PLGBLT = 79 EMR_POLYBEZIER = 2 EMR_POLYBEZIER16 = 85 EMR_POLYBEZIERTO = 5 EMR_POLYBEZIERTO16 = 88 EMR_POLYDRAW = 56 EMR_POLYDRAW16 = 92 EMR_POLYGON = 3 EMR_POLYGON16 = 86 EMR_POLYLINE = 4 EMR_POLYLINE16 = 87 EMR_POLYLINETO = 6 EMR_POLYLINETO16 = 89 EMR_POLYPOLYGON = 8 EMR_POLYPOLYGON16 = 91 EMR_POLYPOLYLINE = 7 EMR_POLYPOLYLINE16 = 90 EMR_POLYTEXTOUTA = 96 EMR_POLYTEXTOUTW = 97 EMR_REALIZEPALETTE = 52 EMR_RECTANGLE = 43 EMR_RESERVED_105 = 105 EMR_RESERVED_106 = 106 EMR_RESERVED_107 = 107 EMR_RESERVED_108 = 108 EMR_RESERVED_109 = 109 EMR_RESERVED_110 = 110 EMR_RESERVED_117 = 117 EMR_RESERVED_119 = 119 EMR_RESERVED_120 = 120 EMR_RESIZEPALETTE = 51 EMR_RESTOREDC = 34 EMR_ROUNDRECT = 44 EMR_SAVEDC = 33 EMR_SCALEVIEWPORTEXTEX = 31 EMR_SCALEWINDOWEXTEX = 32 EMR_SELECTCLIPPATH = 67 EMR_SELECTOBJECT = 37 EMR_SELECTPALETTE = 48 EMR_SETARCDIRECTION = 57 EMR_SETBKCOLOR = 25 EMR_SETBKMODE = 18 EMR_SETBRUSHORGEX = 13 EMR_SETCOLORADJUSTMENT = 23 EMR_SETCOLORSPACE = 100 EMR_SETDIBITSTODEVICE = 80 EMR_SETICMMODE = 98 EMR_SETICMPROFILEA = 112 EMR_SETICMPROFILEW = 113 EMR_SETLAYOUT = 115 EMR_SETMAPMODE = 17 EMR_SETMAPPERFLAGS = 16 EMR_SETMETARGN = 28 EMR_SETMITERLIMIT = 58 EMR_SETPALETTEENTRIES = 50 EMR_SETPIXELV = 15 EMR_SETPOLYFILLMODE = 19 EMR_SETROP2 = 20 EMR_SETSTRETCHBLTMODE = 21 EMR_SETTEXTALIGN = 22 EMR_SETTEXTCOLOR = 24 EMR_SETVIEWPORTEXTEX = 11 EMR_SETVIEWPORTORGEX = 12 EMR_SETWINDOWEXTEX = 9 EMR_SETWINDOWORGEX = 10 EMR_SETWORLDTRANSFORM = 35 EMR_STRETCHBLT = 77 EMR_STRETCHDIBITS = 81 EMR_STROKEANDFILLPATH = 63 EMR_STROKEPATH = 64 EMR_TRANSPARENTBLT = 116 EMR_WIDENPATH = 66 EMSGSIZE = 115 EMSIS_COMPOSITIONSTRING = 0x0001 EM_CANUNDO = 0x00C6 EM_CHARFROMPOS = 0x00D7 EM_EMPTYUNDOBUFFER = 0x00CD EM_FMTLINES = 0x00C8 EM_GETFIRSTVISIBLELINE = 0x00CE EM_GETHANDLE = 0x00BD EM_GETIMESTATUS = 0x00D9 EM_GETLIMITTEXT = 0x00D5 EM_GETLINE = 0x00C4 EM_GETLINECOUNT = 0x00BA EM_GETMARGINS = 0x00D4 EM_GETMODIFY = 0x00B8 EM_GETPASSWORDCHAR = 0x00D2 EM_GETRECT = 0x00B2 EM_GETSEL = 0x00B0 EM_GETTHUMB = 0x00BE EM_GETWORDBREAKPROC = 0x00D1 EM_LIMITTEXT = 0x00C5 EM_LINEFROMCHAR = 0x00C9 EM_LINEINDEX = 0x00BB EM_LINELENGTH = 0x00C1 EM_LINESCROLL = 0x00B6 EM_POSFROMCHAR = 0x00D6 EM_REPLACESEL = 0x00C2 EM_SCROLL = 0x00B5 EM_SCROLLCARET = 0x00B7 EM_SETHANDLE = 0x00BC EM_SETIMESTATUS = 0x00D8 EM_SETLIMITTEXT = 197 EM_SETMARGINS = 0x00D3 EM_SETMODIFY = 0x00B9 EM_SETPASSWORDCHAR = 0x00CC EM_SETREADONLY = 0x00CF EM_SETRECT = 0x00B3 EM_SETRECTNP = 0x00B4 EM_SETSEL = 0x00B1 EM_SETTABSTOPS = 0x00CB EM_SETWORDBREAKPROC = 0x00D0 EM_UNDO = 0x00C7 ENABLEDUPLEX = 28 ENABLEPAIRKERNING = 769 ENABLERELATIVEWIDTHS = 768 ENABLE_AUTO_POSITION = 0x100 ENABLE_DISABLE_AUTOSAVE = 0xD2 ENABLE_DISABLE_AUTO_OFFLINE = 0xDB ENABLE_ECHO_INPUT = 0x4 ENABLE_EXTENDED_FLAGS = 0x80 ENABLE_INSERT_MODE = 0x20 ENABLE_LINE_INPUT = 0x2 ENABLE_LVB_GRID_WORLDWIDE = 0x10 ENABLE_MOUSE_INPUT = 0x10 ENABLE_PROCESSED_INPUT = 0x1 ENABLE_PROCESSED_OUTPUT = 0x1 ENABLE_QUICK_EDIT_MODE = 0x40 ENABLE_SMART = 0xD8 ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200 ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 ENABLE_WINDOW_INPUT = 0x8 ENABLE_WRAP_AT_EOL_OUTPUT = 0x2 ENAMETOOLONG = 38 ENAME_NAME = 0 ENAME_SPAN = 1 ENAME_TAB = 2 ENCAPSULATED_POSTSCRIPT = 4116 ENCRYPTION_FORMAT_DEFAULT = 1 ENDDOC = 11 ENDSESSION_CLOSEAPP = 0x00000001 ENDSESSION_CRITICAL = 0x40000000 ENDSESSION_LOGOFF = 0x80000000 END_INTERFACE = 0 END_PATH = 4098 ENETDOWN = 116 ENETRESET = 117 ENETUNREACH = 118 ENFILE = 23 ENHANCED_KEY = 0x100 ENHMETA_SIGNATURE = 0x464D4520 ENHMETA_STOCK_OBJECT = 0x80000000 ENLISTMENT_ALL_ACCESS = 983071 ENLISTMENT_GENERIC_EXECUTE = 131100 ENLISTMENT_GENERIC_READ = 131073 ENLISTMENT_GENERIC_WRITE = 131102 ENLISTMENT_MAXIMUM_OPTION = 0x00000001 ENLISTMENT_QUERY_INFORMATION = 1 ENLISTMENT_RECOVER = 4 ENLISTMENT_SET_INFORMATION = 2 ENLISTMENT_SUBORDINATE_RIGHTS = 8 ENLISTMENT_SUPERIOR = 0x00000001 ENLISTMENT_SUPERIOR_RIGHTS = 0x10 ENOBUFS = 119 ENODATA = 120 ENODEV = 19 ENOENT = 2 ENOEXEC = 8 ENOFILE = 2 ENOLCK = 39 ENOLINK = 121 ENOMEM = 12 ENOMSG = 122 ENOPROTOOPT = 123 ENOSPC = 28 ENOSR = 124 ENOSTR = 125 ENOSYS = 40 ENOTCONN = 126 ENOTDIR = 20 ENOTEMPTY = 41 ENOTRECOVERABLE = 127 ENOTSOCK = 128 ENOTSUP = 129 ENOTTY = 25 ENUMPAPERBINS = 31 ENUMPAPERMETRICS = 34 ENUM_ALL_CALENDARS = 0xffffffff ENUM_E_FIRST = 2147746224 ENUM_E_LAST = 2147746239 ENUM_S_FIRST = 262576 ENUM_S_LAST = 262591 ENXIO = 6 EN_ALIGN_LTR_EC = 0x0700 EN_ALIGN_RTL_EC = 0x0701 EN_CHANGE = 0x0300 EN_ERRSPACE = 0x0500 EN_HSCROLL = 0x0601 EN_KILLFOCUS = 0x0200 EN_MAXTEXT = 0x0501 EN_SETFOCUS = 0x0100 EN_UPDATE = 0x0400 EN_VSCROLL = 0x0602 EOF = -1 EOPNOTSUPP = 130 EOVERFLOW = 132 EOWNERDEAD = 133 EPERM = 1 EPIPE = 32 EPROTO = 134 EPROTONOSUPPORT = 135 EPROTOTYPE = 136 EPSPRINTING = 33 EPS_SIGNATURE = 0x46535045 EPT_S_CANT_CREATE = 1899 EPT_S_CANT_PERFORM_OP = 1752 EPT_S_INVALID_ENTRY = 1751 EPT_S_NOT_REGISTERED = 1753 EP_Agg = 0x000010 EP_CanBeNull = 0x200000 EP_Collate = 0x000200 EP_Commuted = 0x000400 EP_ConstFunc = 0x100000 EP_DblQuoted = 0x000080 EP_Distinct = 0x000004 EP_FixedCol = 0x000020 EP_FromDDL = 0x40000000 EP_HasFunc = 0x000008 EP_IfNullRow = 0x040000 EP_Immutable = 0x02 EP_InfixFunc = 0x000100 EP_InnerON = 0x000002 EP_IntValue = 0x000800 EP_IsFalse = 0x20000000 EP_IsTrue = 0x10000000 EP_Leaf = 0x800000 EP_NoReduce = 0x01 EP_OuterON = 0x000001 EP_Propagate = 4194824 EP_Quoted = 0x4000000 EP_Reduced = 0x004000 EP_Skip = 0x002000 EP_Static = 0x8000000 EP_Subquery = 0x400000 EP_Subrtn = 0x2000000 EP_TokenOnly = 0x010000 EP_Unlikely = 0x080000 EP_VarSelect = 0x000040 EP_Win = 0x008000 EP_WinFunc = 0x1000000 EP_xIsSelect = 0x001000 ERANGE = 34 EROFS = 30 ERROR = 0 ERROR_ABANDONED_WAIT_0 = 735 ERROR_ABANDONED_WAIT_63 = 736 ERROR_ACCESS_DENIED = 5 ERROR_ACCESS_DISABLED_BY_POLICY = 1260 ERROR_ACCESS_DISABLED_WEBBLADE = 1277 ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER = 1278 ERROR_ACCOUNT_DISABLED = 1331 ERROR_ACCOUNT_EXPIRED = 1793 ERROR_ACCOUNT_LOCKED_OUT = 1909 ERROR_ACCOUNT_RESTRICTION = 1327 ERROR_ACTIVATION_COUNT_EXCEEDED = 7059 ERROR_ACTIVE_CONNECTIONS = 2402 ERROR_ADAP_HDW_ERR = 57 ERROR_ADDRESS_ALREADY_ASSOCIATED = 1227 ERROR_ADDRESS_NOT_ASSOCIATED = 1228 ERROR_ADVANCED_INSTALLER_FAILED = 14099 ERROR_ALERTED = 739 ERROR_ALIAS_EXISTS = 1379 ERROR_ALLOTTED_SPACE_EXCEEDED = 1344 ERROR_ALL_NODES_NOT_AVAILABLE = 5037 ERROR_ALL_USER_TRUST_QUOTA_EXCEEDED = 1933 ERROR_ALREADY_ASSIGNED = 85 ERROR_ALREADY_EXISTS = 183 ERROR_ALREADY_FIBER = 1280 ERROR_ALREADY_INITIALIZED = 1247 ERROR_ALREADY_REGISTERED = 1242 ERROR_ALREADY_RUNNING_LKG = 1074 ERROR_ALREADY_THREAD = 1281 ERROR_ALREADY_WAITING = 1904 ERROR_AMBIGUOUS_SYSTEM_DEVICE = 15250 ERROR_API_UNAVAILABLE = 15841 ERROR_APPHELP_BLOCK = 1259 ERROR_APPX_INTEGRITY_FAILURE_CLR_NGEN = 15624 ERROR_APP_WRONG_OS = 1151 ERROR_ARENA_TRASHED = 7 ERROR_ARITHMETIC_OVERFLOW = 534 ERROR_ATOMIC_LOCKS_NOT_SUPPORTED = 174 ERROR_AUTHENTICATION_FIREWALL_FAILED = 1935 ERROR_AUTHIP_FAILURE = 1469 ERROR_AUTODATASEG_EXCEEDS_64k = 199 ERROR_BADDB = 1009 ERROR_BADKEY = 1010 ERROR_BAD_ARGUMENTS = 160 ERROR_BAD_COMMAND = 22 ERROR_BAD_CONFIGURATION = 1610 ERROR_BAD_DESCRIPTOR_FORMAT = 1361 ERROR_BAD_DEVICE = 1200 ERROR_BAD_DEV_TYPE = 66 ERROR_BAD_DRIVER = 2001 ERROR_BAD_DRIVER_LEVEL = 119 ERROR_BAD_ENVIRONMENT = 10 ERROR_BAD_EXE_FORMAT = 193 ERROR_BAD_FILE_TYPE = 222 ERROR_BAD_FORMAT = 11 ERROR_BAD_IMPERSONATION_LEVEL = 1346 ERROR_BAD_INHERITANCE_ACL = 1340 ERROR_BAD_LENGTH = 24 ERROR_BAD_LOGON_SESSION_STATE = 1365 ERROR_BAD_NETPATH = 53 ERROR_BAD_NET_NAME = 67 ERROR_BAD_NET_RESP = 58 ERROR_BAD_PATHNAME = 161 ERROR_BAD_PIPE = 230 ERROR_BAD_PROFILE = 1206 ERROR_BAD_PROVIDER = 1204 ERROR_BAD_QUERY_SYNTAX = 1615 ERROR_BAD_RECOVERY_POLICY = 6012 ERROR_BAD_REM_ADAP = 60 ERROR_BAD_THREADID_ADDR = 159 ERROR_BAD_TOKEN_TYPE = 1349 ERROR_BAD_UNIT = 20 ERROR_BAD_USERNAME = 2202 ERROR_BAD_USER_PROFILE = 1253 ERROR_BAD_VALIDATION_CLASS = 1348 ERROR_BEGINNING_OF_MEDIA = 1102 ERROR_BIDI_DEVICE_OFFLINE = 13004 ERROR_BIDI_ERROR_BASE = 13000 ERROR_BIDI_NOT_SUPPORTED = 50 ERROR_BIDI_SCHEMA_NOT_SUPPORTED = 13005 ERROR_BIDI_SCHEMA_READ_ONLY = 13002 ERROR_BIDI_SERVER_OFFLINE = 13003 ERROR_BIDI_STATUS_OK = 0 ERROR_BIDI_STATUS_WARNING = 13001 ERROR_BOOT_ALREADY_ACCEPTED = 1076 ERROR_BROKEN_PIPE = 109 ERROR_BUFFER_OVERFLOW = 111 ERROR_BUSY = 170 ERROR_BUSY_DRIVE = 142 ERROR_BUS_RESET = 1111 ERROR_CALLBACK_SUPPLIED_INVALID_DATA = 1273 ERROR_CALL_NOT_IMPLEMENTED = 120 ERROR_CANCELLED = 1223 ERROR_CANCEL_VIOLATION = 173 ERROR_CANNOT_COPY = 266 ERROR_CANNOT_DETECT_DRIVER_FAILURE = 1080 ERROR_CANNOT_DETECT_PROCESS_ABORT = 1081 ERROR_CANNOT_FIND_WND_CLASS = 1407 ERROR_CANNOT_IMPERSONATE = 1368 ERROR_CANNOT_MAKE = 82 ERROR_CANNOT_OPEN_PROFILE = 1205 ERROR_CANNOT_SWITCH_RUNLEVEL = 15400 ERROR_CANTOPEN = 1011 ERROR_CANTREAD = 1012 ERROR_CANTWRITE = 1013 ERROR_CANT_ACCESS_DOMAIN_INFO = 1351 ERROR_CANT_ACCESS_FILE = 1920 ERROR_CANT_DELETE_LAST_ITEM = 4335 ERROR_CANT_DISABLE_MANDATORY = 1310 ERROR_CANT_EVICT_ACTIVE_NODE = 5009 ERROR_CANT_OPEN_ANONYMOUS = 1347 ERROR_CANT_RESOLVE_FILENAME = 1921 ERROR_CAN_NOT_COMPLETE = 1003 ERROR_CAN_NOT_DEL_LOCAL_WINS = 4001 ERROR_CHECKOUT_REQUIRED = 221 ERROR_CHILD_MUST_BE_VOLATILE = 1021 ERROR_CHILD_NOT_COMPLETE = 129 ERROR_CHILD_WINDOW_MENU = 1436 ERROR_CIRCULAR_DEPENDENCY = 1059 ERROR_CLASS_ALREADY_EXISTS = 1410 ERROR_CLASS_DOES_NOT_EXIST = 1411 ERROR_CLASS_HAS_WINDOWS = 1412 ERROR_CLEANER_CARTRIDGE_INSTALLED = 4340 ERROR_CLEANER_CARTRIDGE_SPENT = 4333 ERROR_CLEANER_SLOT_NOT_SET = 4332 ERROR_CLEANER_SLOT_SET = 4331 ERROR_CLIPBOARD_NOT_OPEN = 1418 ERROR_CLIPPING_NOT_SUPPORTED = 2005 ERROR_CLUSCFG_ALREADY_COMMITTED = 5901 ERROR_CLUSCFG_ROLLBACK_FAILED = 5902 ERROR_CLUSCFG_SYSTEM_DISK_DRIVE_LETTER_CONFLICT = 5903 ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND = 5032 ERROR_CLUSTERLOG_CORRUPT = 5029 ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE = 5031 ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE = 5033 ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE = 5030 ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME = 5900 ERROR_CLUSTER_DATABASE_SEQMISMATCH = 5083 ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP = 5896 ERROR_CLUSTER_GUM_NOT_LOCKER = 5085 ERROR_CLUSTER_INCOMPATIBLE_VERSIONS = 5075 ERROR_CLUSTER_INSTANCE_ID_MISMATCH = 5893 ERROR_CLUSTER_INVALID_NETWORK = 5054 ERROR_CLUSTER_INVALID_NETWORK_PROVIDER = 5049 ERROR_CLUSTER_INVALID_NODE = 5039 ERROR_CLUSTER_INVALID_REQUEST = 5048 ERROR_CLUSTER_IPADDR_IN_USE = 5057 ERROR_CLUSTER_JOIN_ABORTED = 5074 ERROR_CLUSTER_JOIN_IN_PROGRESS = 5041 ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS = 5053 ERROR_CLUSTER_LAST_INTERNAL_NETWORK = 5066 ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND = 5043 ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED = 5076 ERROR_CLUSTER_MEMBERSHIP_HALT = 5892 ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE = 5890 ERROR_CLUSTER_MISMATCHED_COMPUTER_ACCT_NAME = 5905 ERROR_CLUSTER_NETINTERFACE_EXISTS = 5046 ERROR_CLUSTER_NETINTERFACE_NOT_FOUND = 5047 ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE = 5064 ERROR_CLUSTER_NETWORK_ALREADY_ONLINE = 5063 ERROR_CLUSTER_NETWORK_EXISTS = 5044 ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS = 5067 ERROR_CLUSTER_NETWORK_NOT_FOUND = 5045 ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP = 5894 ERROR_CLUSTER_NETWORK_NOT_INTERNAL = 5060 ERROR_CLUSTER_NODE_ALREADY_DOWN = 5062 ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT = 5088 ERROR_CLUSTER_NODE_ALREADY_MEMBER = 5065 ERROR_CLUSTER_NODE_ALREADY_UP = 5061 ERROR_CLUSTER_NODE_DOWN = 5050 ERROR_CLUSTER_NODE_EXISTS = 5040 ERROR_CLUSTER_NODE_NOT_FOUND = 5042 ERROR_CLUSTER_NODE_NOT_MEMBER = 5052 ERROR_CLUSTER_NODE_NOT_PAUSED = 5058 ERROR_CLUSTER_NODE_NOT_READY = 5072 ERROR_CLUSTER_NODE_PAUSED = 5070 ERROR_CLUSTER_NODE_SHUTTING_DOWN = 5073 ERROR_CLUSTER_NODE_UNREACHABLE = 5051 ERROR_CLUSTER_NODE_UP = 5056 ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED = 5081 ERROR_CLUSTER_NO_SECURITY_CONTEXT = 5059 ERROR_CLUSTER_OLD_VERSION = 5904 ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST = 5082 ERROR_CLUSTER_PARAMETER_MISMATCH = 5897 ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH = 5895 ERROR_CLUSTER_QUORUMLOG_NOT_FOUND = 5891 ERROR_CLUSTER_RESNAME_NOT_FOUND = 5080 ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND = 5078 ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED = 5079 ERROR_CLUSTER_SHUTTING_DOWN = 5022 ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED = 5077 ERROR_CLUSTER_WRONG_OS_VERSION = 5899 ERROR_COLORSPACE_MISMATCH = 2021 ERROR_COMMITMENT_LIMIT = 1455 ERROR_COM_TASK_STOP_PENDING = 15501 ERROR_CONNECTED_OTHER_PASSWORD = 2108 ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT = 2109 ERROR_CONNECTION_ABORTED = 1236 ERROR_CONNECTION_ACTIVE = 1230 ERROR_CONNECTION_COUNT_LIMIT = 1238 ERROR_CONNECTION_INVALID = 1229 ERROR_CONNECTION_REFUSED = 1225 ERROR_CONNECTION_UNAVAIL = 1201 ERROR_CONTEXT_EXPIRED = 1931 ERROR_CONTINUE = 1246 ERROR_CONTROLLING_IEPORT = 4329 ERROR_CONTROL_ID_NOT_FOUND = 1421 ERROR_CORE_RESOURCE = 5026 ERROR_COUNTER_TIMEOUT = 1121 ERROR_CRC = 23 ERROR_CREATE_FAILED = 1631 ERROR_CSCSHARE_OFFLINE = 1262 ERROR_CTX_BAD_VIDEO_MODE = 7025 ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY = 7005 ERROR_CTX_CLIENT_LICENSE_IN_USE = 7052 ERROR_CTX_CLIENT_LICENSE_NOT_SET = 7053 ERROR_CTX_CLIENT_QUERY_TIMEOUT = 7040 ERROR_CTX_CLOSE_PENDING = 7007 ERROR_CTX_CONSOLE_CONNECT = 7042 ERROR_CTX_CONSOLE_DISCONNECT = 7041 ERROR_CTX_GRAPHICS_INVALID = 7035 ERROR_CTX_INVALID_MODEMNAME = 7010 ERROR_CTX_INVALID_PD = 7002 ERROR_CTX_INVALID_WD = 7049 ERROR_CTX_LICENSE_CLIENT_INVALID = 7055 ERROR_CTX_LICENSE_EXPIRED = 7056 ERROR_CTX_LICENSE_NOT_AVAILABLE = 7054 ERROR_CTX_LOGON_DISABLED = 7037 ERROR_CTX_MODEM_INF_NOT_FOUND = 7009 ERROR_CTX_MODEM_RESPONSE_BUSY = 7015 ERROR_CTX_MODEM_RESPONSE_ERROR = 7011 ERROR_CTX_MODEM_RESPONSE_NO_CARRIER = 7013 ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE = 7014 ERROR_CTX_MODEM_RESPONSE_TIMEOUT = 7012 ERROR_CTX_MODEM_RESPONSE_VOICE = 7016 ERROR_CTX_NOT_CONSOLE = 7038 ERROR_CTX_NO_OUTBUF = 7008 ERROR_CTX_PD_NOT_FOUND = 7003 ERROR_CTX_SERVICE_NAME_COLLISION = 7006 ERROR_CTX_SHADOW_DENIED = 7044 ERROR_CTX_SHADOW_DISABLED = 7051 ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 7058 ERROR_CTX_SHADOW_INVALID = 7050 ERROR_CTX_SHADOW_NOT_RUNNING = 7057 ERROR_CTX_TD_ERROR = 7017 ERROR_CTX_WD_NOT_FOUND = 7004 ERROR_CTX_WINSTATION_ACCESS_DENIED = 7045 ERROR_CTX_WINSTATION_ALREADY_EXISTS = 7023 ERROR_CTX_WINSTATION_BUSY = 7024 ERROR_CTX_WINSTATION_NAME_INVALID = 7001 ERROR_CTX_WINSTATION_NOT_FOUND = 7022 ERROR_CURRENT_DIRECTORY = 16 ERROR_CURRENT_DOMAIN_NOT_ALLOWED = 1399 ERROR_DATABASE_BACKUP_CORRUPT = 5087 ERROR_DATABASE_DOES_NOT_EXIST = 1065 ERROR_DATABASE_FAILURE = 4313 ERROR_DATABASE_FULL = 4314 ERROR_DATATYPE_MISMATCH = 1629 ERROR_DC_NOT_FOUND = 1425 ERROR_DDE_FAIL = 1156 ERROR_DEBUGGER_INACTIVE = 1284 ERROR_DECRYPTION_FAILED = 6001 ERROR_DELAY_LOAD_FAILED = 1285 ERROR_DELETE_PENDING = 303 ERROR_DELETING_EXISTING_APPLICATIONDATA_STORE_FAILED = 15621 ERROR_DELETING_ICM_XFORM = 2019 ERROR_DEPENDENCY_ALREADY_EXISTS = 5003 ERROR_DEPENDENCY_NOT_ALLOWED = 5069 ERROR_DEPENDENCY_NOT_FOUND = 5002 ERROR_DEPENDENT_RESOURCE_EXISTS = 5001 ERROR_DEPENDENT_SERVICES_RUNNING = 1051 ERROR_DEPLOYMENT_BLOCKED_BY_POLICY = 15617 ERROR_DESTINATION_ELEMENT_FULL = 1161 ERROR_DESTROY_OBJECT_OF_OTHER_THREAD = 1435 ERROR_DEVICE_ALREADY_REMEMBERED = 1202 ERROR_DEVICE_DOOR_OPEN = 1166 ERROR_DEVICE_IN_USE = 2404 ERROR_DEVICE_NOT_AVAILABLE = 4319 ERROR_DEVICE_NOT_CONNECTED = 1167 ERROR_DEVICE_NOT_PARTITIONED = 1107 ERROR_DEVICE_REINITIALIZATION_NEEDED = 1164 ERROR_DEVICE_REMOVED = 1617 ERROR_DEVICE_REQUIRES_CLEANING = 1165 ERROR_DEV_NOT_EXIST = 55 ERROR_DHCP_ADDRESS_CONFLICT = 4100 ERROR_DIFFERENT_SERVICE_ACCOUNT = 1079 ERROR_DIRECTORY = 267 ERROR_DIRECT_ACCESS_HANDLE = 130 ERROR_DIR_EFS_DISALLOWED = 6010 ERROR_DIR_NOT_EMPTY = 145 ERROR_DIR_NOT_ROOT = 144 ERROR_DISCARDED = 157 ERROR_DISK_CHANGE = 107 ERROR_DISK_CORRUPT = 1393 ERROR_DISK_FULL = 112 ERROR_DISK_OPERATION_FAILED = 1127 ERROR_DISK_RECALIBRATE_FAILED = 1126 ERROR_DISK_RESET_FAILED = 1128 ERROR_DISK_TOO_FRAGMENTED = 302 ERROR_DLL_INIT_FAILED = 1114 ERROR_DLL_NOT_FOUND = 1157 ERROR_DOMAIN_CONTROLLER_EXISTS = 1250 ERROR_DOMAIN_CONTROLLER_NOT_FOUND = 1908 ERROR_DOMAIN_EXISTS = 1356 ERROR_DOMAIN_LIMIT_EXCEEDED = 1357 ERROR_DOMAIN_TRUST_INCONSISTENT = 1810 ERROR_DOWNGRADE_DETECTED = 1265 ERROR_DRIVER_BLOCKED = 1275 ERROR_DRIVE_LOCKED = 108 ERROR_DRIVE_MEDIA_MISMATCH = 4303 ERROR_DRIVE_NOT_INSTALLED = 0x00000008 ERROR_DS_ADD_REPLICA_INHIBITED = 8302 ERROR_DS_ADMIN_LIMIT_EXCEEDED = 8228 ERROR_DS_AFFECTS_MULTIPLE_DSAS = 8249 ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 8578 ERROR_DS_ALIASED_OBJ_MISSING = 8334 ERROR_DS_ALIAS_DEREF_PROBLEM = 8244 ERROR_DS_ALIAS_POINTS_TO_ALIAS = 8336 ERROR_DS_ALIAS_PROBLEM = 8241 ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS = 8205 ERROR_DS_ATTRIBUTE_OWNED_BY_SAM = 8346 ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED = 8204 ERROR_DS_ATT_ALREADY_EXISTS = 8318 ERROR_DS_ATT_IS_NOT_ON_OBJ = 8310 ERROR_DS_ATT_NOT_DEF_FOR_CLASS = 8317 ERROR_DS_ATT_NOT_DEF_IN_SCHEMA = 8303 ERROR_DS_ATT_SCHEMA_REQ_ID = 8399 ERROR_DS_ATT_SCHEMA_REQ_SYNTAX = 8416 ERROR_DS_ATT_VAL_ALREADY_EXISTS = 8323 ERROR_DS_AUTHORIZATION_FAILED = 8599 ERROR_DS_AUTH_METHOD_NOT_SUPPORTED = 8231 ERROR_DS_AUTH_UNKNOWN = 8234 ERROR_DS_AUX_CLS_TEST_FAIL = 8389 ERROR_DS_BACKLINK_WITHOUT_LINK = 8482 ERROR_DS_BAD_ATT_SCHEMA_SYNTAX = 8400 ERROR_DS_BAD_HIERARCHY_FILE = 8425 ERROR_DS_BAD_INSTANCE_TYPE = 8313 ERROR_DS_BAD_NAME_SYNTAX = 8335 ERROR_DS_BAD_RDN_ATT_ID_SYNTAX = 8392 ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED = 8426 ERROR_DS_BUSY = 8206 ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD = 8585 ERROR_DS_CANT_ADD_ATT_VALUES = 8320 ERROR_DS_CANT_ADD_SYSTEM_ONLY = 8358 ERROR_DS_CANT_ADD_TO_GC = 8550 ERROR_DS_CANT_CACHE_ATT = 8401 ERROR_DS_CANT_CACHE_CLASS = 8402 ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC = 8553 ERROR_DS_CANT_CREATE_UNDER_SCHEMA = 8510 ERROR_DS_CANT_DELETE = 8398 ERROR_DS_CANT_DELETE_DSA_OBJ = 8340 ERROR_DS_CANT_DEL_MASTER_CROSSREF = 8375 ERROR_DS_CANT_DEMOTE_WITH_WRITEABLE_NC = 8604 ERROR_DS_CANT_DEREF_ALIAS = 8337 ERROR_DS_CANT_DERIVE_SPN_FOR_DELETED_DOMAIN = 8603 ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF = 8589 ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN = 8537 ERROR_DS_CANT_FIND_DSA_OBJ = 8419 ERROR_DS_CANT_FIND_EXPECTED_NC = 8420 ERROR_DS_CANT_FIND_NC_IN_CACHE = 8421 ERROR_DS_CANT_MIX_MASTER_AND_REPS = 8331 ERROR_DS_CANT_MOD_OBJ_CLASS = 8215 ERROR_DS_CANT_MOD_PRIMARYGROUPID = 8506 ERROR_DS_CANT_MOD_SYSTEM_ONLY = 8369 ERROR_DS_CANT_MOVE_ACCOUNT_GROUP = 8498 ERROR_DS_CANT_MOVE_APP_BASIC_GROUP = 8608 ERROR_DS_CANT_MOVE_APP_QUERY_GROUP = 8609 ERROR_DS_CANT_MOVE_DELETED_OBJECT = 8489 ERROR_DS_CANT_MOVE_RESOURCE_GROUP = 8499 ERROR_DS_CANT_ON_NON_LEAF = 8213 ERROR_DS_CANT_ON_RDN = 8214 ERROR_DS_CANT_REMOVE_ATT_CACHE = 8403 ERROR_DS_CANT_REMOVE_CLASS_CACHE = 8404 ERROR_DS_CANT_REM_MISSING_ATT = 8324 ERROR_DS_CANT_REM_MISSING_ATT_VAL = 8325 ERROR_DS_CANT_REPLACE_HIDDEN_REC = 8424 ERROR_DS_CANT_RETRIEVE_ATTS = 8481 ERROR_DS_CANT_RETRIEVE_CHILD = 8422 ERROR_DS_CANT_RETRIEVE_DN = 8405 ERROR_DS_CANT_RETRIEVE_INSTANCE = 8407 ERROR_DS_CANT_RETRIEVE_SD = 8526 ERROR_DS_CANT_START = 8531 ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ = 8560 ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS = 8493 ERROR_DS_CHILDREN_EXIST = 8332 ERROR_DS_CLASS_MUST_BE_CONCRETE = 8359 ERROR_DS_CLASS_NOT_DSA = 8343 ERROR_DS_CLIENT_LOOP = 8259 ERROR_DS_CODE_INCONSISTENCY = 8408 ERROR_DS_COMPARE_FALSE = 8229 ERROR_DS_COMPARE_TRUE = 8230 ERROR_DS_CONFIDENTIALITY_REQUIRED = 8237 ERROR_DS_CONFIG_PARAM_MISSING = 8427 ERROR_DS_CONSTRAINT_VIOLATION = 8239 ERROR_DS_CONSTRUCTED_ATT_MOD = 8475 ERROR_DS_CONTROL_NOT_FOUND = 8258 ERROR_DS_COULDNT_CONTACT_FSMO = 8367 ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE = 8503 ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE = 8502 ERROR_DS_COULDNT_UPDATE_SPNS = 8525 ERROR_DS_COUNTING_AB_INDICES_FAILED = 8428 ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD = 8491 ERROR_DS_CROSS_DOM_MOVE_ERROR = 8216 ERROR_DS_CROSS_NC_DN_RENAME = 8368 ERROR_DS_CROSS_REF_BUSY = 8602 ERROR_DS_CROSS_REF_EXISTS = 8374 ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE = 8495 ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE_V2 = 8586 ERROR_DS_DATABASE_ERROR = 8409 ERROR_DS_DECODING_ERROR = 8253 ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED = 8536 ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST = 8535 ERROR_DS_DIFFERENT_REPL_EPOCHS = 8593 ERROR_DS_DISALLOWED_IN_SYSTEM_CONTAINER = 8615 ERROR_DS_DNS_LOOKUP_FAILURE = 8524 ERROR_DS_DOMAIN_RENAME_IN_PROGRESS = 8612 ERROR_DS_DOMAIN_VERSION_TOO_HIGH = 8564 ERROR_DS_DOMAIN_VERSION_TOO_LOW = 8566 ERROR_DS_DRA_ABANDON_SYNC = 8462 ERROR_DS_DRA_ACCESS_DENIED = 8453 ERROR_DS_DRA_BAD_DN = 8439 ERROR_DS_DRA_BAD_INSTANCE_TYPE = 8445 ERROR_DS_DRA_BAD_NC = 8440 ERROR_DS_DRA_BUSY = 8438 ERROR_DS_DRA_CONNECTION_FAILED = 8444 ERROR_DS_DRA_DB_ERROR = 8451 ERROR_DS_DRA_DN_EXISTS = 8441 ERROR_DS_DRA_EARLIER_SCHEMA_CONFLICT = 8544 ERROR_DS_DRA_EXTN_CONNECTION_FAILED = 8466 ERROR_DS_DRA_GENERIC = 8436 ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET = 8464 ERROR_DS_DRA_INCONSISTENT_DIT = 8443 ERROR_DS_DRA_INTERNAL_ERROR = 8442 ERROR_DS_DRA_INVALID_PARAMETER = 8437 ERROR_DS_DRA_MAIL_PROBLEM = 8447 ERROR_DS_DRA_MISSING_PARENT = 8460 ERROR_DS_DRA_NAME_COLLISION = 8458 ERROR_DS_DRA_NOT_SUPPORTED = 8454 ERROR_DS_DRA_NO_REPLICA = 8452 ERROR_DS_DRA_OBJ_IS_REP_SOURCE = 8450 ERROR_DS_DRA_OBJ_NC_MISMATCH = 8545 ERROR_DS_DRA_OUT_OF_MEM = 8446 ERROR_DS_DRA_OUT_SCHEDULE_WINDOW = 8617 ERROR_DS_DRA_PREEMPTED = 8461 ERROR_DS_DRA_REF_ALREADY_EXISTS = 8448 ERROR_DS_DRA_REF_NOT_FOUND = 8449 ERROR_DS_DRA_REPL_PENDING = 8477 ERROR_DS_DRA_RPC_CANCELLED = 8455 ERROR_DS_DRA_SCHEMA_CONFLICT = 8543 ERROR_DS_DRA_SCHEMA_INFO_SHIP = 8542 ERROR_DS_DRA_SCHEMA_MISMATCH = 8418 ERROR_DS_DRA_SHUTDOWN = 8463 ERROR_DS_DRA_SINK_DISABLED = 8457 ERROR_DS_DRA_SOURCE_DISABLED = 8456 ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA = 8465 ERROR_DS_DRA_SOURCE_REINSTALLED = 8459 ERROR_DS_DRS_EXTENSIONS_CHANGED = 8594 ERROR_DS_DSA_MUST_BE_INT_MASTER = 8342 ERROR_DS_DST_DOMAIN_NOT_NATIVE = 8496 ERROR_DS_DST_NC_MISMATCH = 8486 ERROR_DS_DS_REQUIRED = 8478 ERROR_DS_DUPLICATE_ID_FOUND = 8605 ERROR_DS_DUP_LDAP_DISPLAY_NAME = 8382 ERROR_DS_DUP_LINK_ID = 8468 ERROR_DS_DUP_MAPI_ID = 8380 ERROR_DS_DUP_MSDS_INTID = 8597 ERROR_DS_DUP_OID = 8379 ERROR_DS_DUP_RDN = 8378 ERROR_DS_DUP_SCHEMA_ID_GUID = 8381 ERROR_DS_ENCODING_ERROR = 8252 ERROR_DS_EPOCH_MISMATCH = 8483 ERROR_DS_EXISTING_AD_CHILD_NC = 8613 ERROR_DS_EXISTS_IN_AUX_CLS = 8393 ERROR_DS_EXISTS_IN_MAY_HAVE = 8386 ERROR_DS_EXISTS_IN_MUST_HAVE = 8385 ERROR_DS_EXISTS_IN_POSS_SUP = 8395 ERROR_DS_EXISTS_IN_RDNATTID = 8598 ERROR_DS_EXISTS_IN_SUB_CLS = 8394 ERROR_DS_FILTER_UNKNOWN = 8254 ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS = 8555 ERROR_DS_FOREST_VERSION_TOO_HIGH = 8563 ERROR_DS_FOREST_VERSION_TOO_LOW = 8565 ERROR_DS_GCVERIFY_ERROR = 8417 ERROR_DS_GC_NOT_AVAILABLE = 8217 ERROR_DS_GC_REQUIRED = 8547 ERROR_DS_GENERIC_ERROR = 8341 ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 8519 ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 8516 ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 8517 ERROR_DS_GOVERNSID_MISSING = 8410 ERROR_DS_GROUP_CONVERSION_ERROR = 8607 ERROR_DS_HAVE_PRIMARY_MEMBERS = 8521 ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED = 8429 ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD = 8507 ERROR_DS_ILLEGAL_MOD_OPERATION = 8311 ERROR_DS_ILLEGAL_SUPERIOR = 8345 ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION = 8492 ERROR_DS_INAPPROPRIATE_AUTH = 8233 ERROR_DS_INAPPROPRIATE_MATCHING = 8238 ERROR_DS_INCOMPATIBLE_CONTROLS_USED = 8574 ERROR_DS_INCOMPATIBLE_VERSION = 8567 ERROR_DS_INCORRECT_ROLE_OWNER = 8210 ERROR_DS_INIT_FAILURE = 8532 ERROR_DS_INIT_FAILURE_CONSOLE = 8561 ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE = 8512 ERROR_DS_INSTALL_NO_SRC_SCH_VERSION = 8511 ERROR_DS_INSTALL_SCHEMA_MISMATCH = 8467 ERROR_DS_INSUFFICIENT_ATTR_TO_CREATE_OBJECT = 8606 ERROR_DS_INSUFF_ACCESS_RIGHTS = 8344 ERROR_DS_INTERNAL_FAILURE = 8430 ERROR_DS_INVALID_ATTRIBUTE_SYNTAX = 8203 ERROR_DS_INVALID_DMD = 8360 ERROR_DS_INVALID_DN_SYNTAX = 8242 ERROR_DS_INVALID_GROUP_TYPE = 8513 ERROR_DS_INVALID_LDAP_DISPLAY_NAME = 8479 ERROR_DS_INVALID_NAME_FOR_SPN = 8554 ERROR_DS_INVALID_ROLE_OWNER = 8366 ERROR_DS_INVALID_SCRIPT = 8600 ERROR_DS_INVALID_SEARCH_FLAG = 8500 ERROR_DS_IS_LEAF = 8243 ERROR_DS_KEY_NOT_UNIQUE = 8527 ERROR_DS_LDAP_SEND_QUEUE_FULL = 8616 ERROR_DS_LINK_ID_NOT_AVAILABLE = 8577 ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 8520 ERROR_DS_LOCAL_ERROR = 8251 ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 8548 ERROR_DS_LOOP_DETECT = 8246 ERROR_DS_LOW_DSA_VERSION = 8568 ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4 = 8572 ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 8557 ERROR_DS_MASTERDSA_REQUIRED = 8314 ERROR_DS_MAX_OBJ_SIZE_EXCEEDED = 8304 ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY = 8201 ERROR_DS_MISSING_EXPECTED_ATT = 8411 ERROR_DS_MISSING_FSMO_SETTINGS = 8434 ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER = 8497 ERROR_DS_MISSING_REQUIRED_ATT = 8316 ERROR_DS_MISSING_SUPREF = 8406 ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG = 8581 ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE = 8579 ERROR_DS_MODIFYDN_WRONG_GRANDPARENT = 8582 ERROR_DS_MUST_BE_RUN_ON_DST_DC = 8558 ERROR_DS_NAME_ERROR_DOMAIN_ONLY = 8473 ERROR_DS_NAME_ERROR_NOT_FOUND = 8470 ERROR_DS_NAME_ERROR_NOT_UNIQUE = 8471 ERROR_DS_NAME_ERROR_NO_MAPPING = 8472 ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING = 8474 ERROR_DS_NAME_ERROR_RESOLVING = 8469 ERROR_DS_NAME_ERROR_TRUST_REFERRAL = 8583 ERROR_DS_NAME_NOT_UNIQUE = 8571 ERROR_DS_NAME_REFERENCE_INVALID = 8373 ERROR_DS_NAME_TOO_LONG = 8348 ERROR_DS_NAME_TOO_MANY_PARTS = 8347 ERROR_DS_NAME_TYPE_UNKNOWN = 8351 ERROR_DS_NAME_UNPARSEABLE = 8350 ERROR_DS_NAME_VALUE_TOO_LONG = 8349 ERROR_DS_NAMING_MASTER_GC = 8523 ERROR_DS_NAMING_VIOLATION = 8247 ERROR_DS_NCNAME_MISSING_CR_REF = 8412 ERROR_DS_NCNAME_MUST_BE_NC = 8357 ERROR_DS_NC_MUST_HAVE_NC_PARENT = 8494 ERROR_DS_NC_STILL_HAS_DSAS = 8546 ERROR_DS_NONEXISTENT_MAY_HAVE = 8387 ERROR_DS_NONEXISTENT_MUST_HAVE = 8388 ERROR_DS_NONEXISTENT_POSS_SUP = 8390 ERROR_DS_NONSAFE_SCHEMA_CHANGE = 8508 ERROR_DS_NON_BASE_SEARCH = 8480 ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX = 8377 ERROR_DS_NOT_AN_OBJECT = 8352 ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC = 8487 ERROR_DS_NOT_CLOSEST = 8588 ERROR_DS_NOT_INSTALLED = 8200 ERROR_DS_NOT_ON_BACKLINK = 8362 ERROR_DS_NOT_SUPPORTED = 8256 ERROR_DS_NOT_SUPPORTED_SORT_ORDER = 8570 ERROR_DS_NO_ATTRIBUTE_OR_VALUE = 8202 ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN = 8569 ERROR_DS_NO_CHAINED_EVAL = 8328 ERROR_DS_NO_CHAINING = 8327 ERROR_DS_NO_CHECKPOINT_WITH_PDC = 8551 ERROR_DS_NO_CROSSREF_FOR_NC = 8363 ERROR_DS_NO_DELETED_NAME = 8355 ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 8549 ERROR_DS_NO_MORE_RIDS = 8209 ERROR_DS_NO_MSDS_INTID = 8596 ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 8514 ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 8515 ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC = 8580 ERROR_DS_NO_PARENT_OBJECT = 8329 ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION = 8533 ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA = 8306 ERROR_DS_NO_REF_DOMAIN = 8575 ERROR_DS_NO_REQUESTED_ATTS_FOUND = 8308 ERROR_DS_NO_RESULTS_RETURNED = 8257 ERROR_DS_NO_RIDS_ALLOCATED = 8208 ERROR_DS_NO_SUCH_OBJECT = 8240 ERROR_DS_NO_TREE_DELETE_ABOVE_NC = 8501 ERROR_DS_NTDSCRIPT_PROCESS_ERROR = 8592 ERROR_DS_NTDSCRIPT_SYNTAX_ERROR = 8591 ERROR_DS_OBJECT_BEING_REMOVED = 8339 ERROR_DS_OBJECT_CLASS_REQUIRED = 8315 ERROR_DS_OBJECT_RESULTS_TOO_LARGE = 8248 ERROR_DS_OBJ_CLASS_NOT_DEFINED = 8371 ERROR_DS_OBJ_CLASS_NOT_SUBCLASS = 8372 ERROR_DS_OBJ_CLASS_VIOLATION = 8212 ERROR_DS_OBJ_GUID_EXISTS = 8361 ERROR_DS_OBJ_NOT_FOUND = 8333 ERROR_DS_OBJ_STRING_NAME_EXISTS = 8305 ERROR_DS_OBJ_TOO_LARGE = 8312 ERROR_DS_OFFSET_RANGE_ERROR = 8262 ERROR_DS_OPERATIONS_ERROR = 8224 ERROR_DS_OUT_OF_SCOPE = 8338 ERROR_DS_OUT_OF_VERSION_STORE = 8573 ERROR_DS_PARAM_ERROR = 8255 ERROR_DS_PARENT_IS_AN_ALIAS = 8330 ERROR_DS_PDC_OPERATION_IN_PROGRESS = 8490 ERROR_DS_PROTOCOL_ERROR = 8225 ERROR_DS_RANGE_CONSTRAINT = 8322 ERROR_DS_RDN_DOESNT_MATCH_SCHEMA = 8307 ERROR_DS_RECALCSCHEMA_FAILED = 8396 ERROR_DS_REFERRAL = 8235 ERROR_DS_REFERRAL_LIMIT_EXCEEDED = 8260 ERROR_DS_REFUSING_FSMO_ROLES = 8433 ERROR_DS_REMOTE_CROSSREF_OP_FAILED = 8601 ERROR_DS_REPLICATOR_ONLY = 8370 ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR = 8595 ERROR_DS_REPL_LIFETIME_EXCEEDED = 8614 ERROR_DS_RESERVED_LINK_ID = 8576 ERROR_DS_RIDMGR_INIT_ERROR = 8211 ERROR_DS_ROLE_NOT_VERIFIED = 8610 ERROR_DS_ROOT_CANT_BE_SUBREF = 8326 ERROR_DS_ROOT_MUST_BE_NC = 8301 ERROR_DS_ROOT_REQUIRES_CLASS_TOP = 8432 ERROR_DS_SAM_INIT_FAILURE = 8504 ERROR_DS_SAM_INIT_FAILURE_CONSOLE = 8562 ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY = 8530 ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD = 8529 ERROR_DS_SCHEMA_ALLOC_FAILED = 8415 ERROR_DS_SCHEMA_NOT_LOADED = 8414 ERROR_DS_SCHEMA_UPDATE_DISALLOWED = 8509 ERROR_DS_SECURITY_CHECKING_ERROR = 8413 ERROR_DS_SECURITY_ILLEGAL_MODIFY = 8423 ERROR_DS_SEC_DESC_INVALID = 8354 ERROR_DS_SEC_DESC_TOO_SHORT = 8353 ERROR_DS_SEMANTIC_ATT_TEST = 8383 ERROR_DS_SENSITIVE_GROUP_VIOLATION = 8505 ERROR_DS_SERVER_DOWN = 8250 ERROR_DS_SHUTTING_DOWN = 8364 ERROR_DS_SINGLE_USER_MODE_FAILED = 8590 ERROR_DS_SINGLE_VALUE_CONSTRAINT = 8321 ERROR_DS_SIZELIMIT_EXCEEDED = 8227 ERROR_DS_SORT_CONTROL_MISSING = 8261 ERROR_DS_SOURCE_AUDITING_NOT_ENABLED = 8552 ERROR_DS_SOURCE_DOMAIN_IN_FOREST = 8534 ERROR_DS_SRC_AND_DST_NC_IDENTICAL = 8485 ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH = 8540 ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER = 8559 ERROR_DS_SRC_GUID_MISMATCH = 8488 ERROR_DS_SRC_NAME_MISMATCH = 8484 ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER = 8538 ERROR_DS_SRC_SID_EXISTS_IN_FOREST = 8539 ERROR_DS_STRING_SD_CONVERSION_FAILED = 8522 ERROR_DS_STRONG_AUTH_REQUIRED = 8232 ERROR_DS_SUBREF_MUST_HAVE_PARENT = 8356 ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD = 8376 ERROR_DS_SUB_CLS_TEST_FAIL = 8391 ERROR_DS_SYNTAX_MISMATCH = 8384 ERROR_DS_THREAD_LIMIT_EXCEEDED = 8587 ERROR_DS_TIMELIMIT_EXCEEDED = 8226 ERROR_DS_TREE_DELETE_NOT_FINISHED = 8397 ERROR_DS_UNABLE_TO_SURRENDER_ROLES = 8435 ERROR_DS_UNAVAILABLE = 8207 ERROR_DS_UNAVAILABLE_CRIT_EXTENSION = 8236 ERROR_DS_UNICODEPWD_NOT_IN_QUOTES = 8556 ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 8518 ERROR_DS_UNKNOWN_ERROR = 8431 ERROR_DS_UNKNOWN_OPERATION = 8365 ERROR_DS_UNWILLING_TO_PERFORM = 8245 ERROR_DS_USER_BUFFER_TO_SMALL = 8309 ERROR_DS_WKO_CONTAINER_CANNOT_BE_SPECIAL = 8611 ERROR_DS_WRONG_LINKED_ATT_SYNTAX = 8528 ERROR_DS_WRONG_OM_OBJ_CLASS = 8476 ERROR_DUPLICATE_SERVICE_NAME = 1078 ERROR_DUPLICATE_TAG = 2014 ERROR_DUP_DOMAINNAME = 1221 ERROR_DUP_NAME = 52 ERROR_DYNLINK_FROM_INVALID_RING = 196 ERROR_EAS_DIDNT_FIT = 275 ERROR_EAS_NOT_SUPPORTED = 282 ERROR_EA_ACCESS_DENIED = 994 ERROR_EA_FILE_CORRUPT = 276 ERROR_EA_LIST_INCONSISTENT = 255 ERROR_EA_TABLE_FULL = 277 ERROR_EC_CIRCULAR_FORWARDING = 15082 ERROR_EC_CREDSTORE_FULL = 15083 ERROR_EC_CRED_NOT_FOUND = 15084 ERROR_EC_LOG_DISABLED = 15081 ERROR_EC_NO_ACTIVE_CHANNEL = 15085 ERROR_EC_SUBSCRIPTION_CANNOT_ACTIVATE = 15080 ERROR_EFS_ALG_BLOB_TOO_BIG = 6013 ERROR_EFS_DISABLED = 6015 ERROR_EFS_SERVER_NOT_TRUSTED = 6011 ERROR_EFS_VERSION_NOT_SUPPORT = 6016 ERROR_EMPTY = 4306 ERROR_ENCRYPTION_FAILED = 6000 ERROR_END_OF_MEDIA = 1100 ERROR_ENVVAR_NOT_FOUND = 203 ERROR_EOM_OVERFLOW = 1129 ERROR_EVENTLOG_CANT_START = 1501 ERROR_EVENTLOG_FILE_CHANGED = 1503 ERROR_EVENTLOG_FILE_CORRUPT = 1500 ERROR_EVT_CANNOT_OPEN_CHANNEL_OF_QUERY = 15036 ERROR_EVT_CHANNEL_CANNOT_ACTIVATE = 15025 ERROR_EVT_CHANNEL_NOT_FOUND = 15007 ERROR_EVT_CONFIGURATION_ERROR = 15010 ERROR_EVT_EVENT_DEFINITION_NOT_FOUND = 15032 ERROR_EVT_EVENT_TEMPLATE_NOT_FOUND = 15003 ERROR_EVT_FILTER_ALREADYSCOPED = 15014 ERROR_EVT_FILTER_INVARG = 15016 ERROR_EVT_FILTER_INVTEST = 15017 ERROR_EVT_FILTER_INVTYPE = 15018 ERROR_EVT_FILTER_NOTELTSET = 15015 ERROR_EVT_FILTER_OUT_OF_RANGE = 15038 ERROR_EVT_FILTER_PARSEERR = 15019 ERROR_EVT_FILTER_TOO_COMPLEX = 15026 ERROR_EVT_FILTER_UNEXPECTEDTOKEN = 15021 ERROR_EVT_FILTER_UNSUPPORTEDOP = 15020 ERROR_EVT_INVALID_CHANNEL_PATH = 15000 ERROR_EVT_INVALID_CHANNEL_PROPERTY_VALUE = 15023 ERROR_EVT_INVALID_EVENT_DATA = 15005 ERROR_EVT_INVALID_OPERATION_OVER_ENABLED_DIRECT_CHANNEL = 15022 ERROR_EVT_INVALID_PUBLISHER_NAME = 15004 ERROR_EVT_INVALID_PUBLISHER_PROPERTY_VALUE = 15024 ERROR_EVT_INVALID_QUERY = 15001 ERROR_EVT_MALFORMED_XML_TEXT = 15008 ERROR_EVT_MAX_INSERTS_REACHED = 15031 ERROR_EVT_MESSAGE_ID_NOT_FOUND = 15028 ERROR_EVT_MESSAGE_LOCALE_NOT_FOUND = 15033 ERROR_EVT_MESSAGE_NOT_FOUND = 15027 ERROR_EVT_NON_VALIDATING_MSXML = 15013 ERROR_EVT_PUBLISHER_DISABLED = 15037 ERROR_EVT_PUBLISHER_METADATA_NOT_FOUND = 15002 ERROR_EVT_QUERY_RESULT_INVALID_POSITION = 15012 ERROR_EVT_QUERY_RESULT_STALE = 15011 ERROR_EVT_SUBSCRIPTION_TO_DIRECT_CHANNEL = 15009 ERROR_EVT_UNRESOLVED_PARAMETER_INSERT = 15030 ERROR_EVT_UNRESOLVED_VALUE_INSERT = 15029 ERROR_EVT_VERSION_TOO_NEW = 15035 ERROR_EVT_VERSION_TOO_OLD = 15034 ERROR_EXCEPTION_IN_SERVICE = 1064 ERROR_EXCL_SEM_ALREADY_OWNED = 101 ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY = 217 ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY = 218 ERROR_EXE_MACHINE_TYPE_MISMATCH = 216 ERROR_EXE_MARKED_INVALID = 192 ERROR_EXTENDED_ERROR = 1208 ERROR_FAILED_SERVICE_CONTROLLER_CONNECT = 1063 ERROR_FAIL_I24 = 83 ERROR_FILEMARK_DETECTED = 1101 ERROR_FILENAME_EXCED_RANGE = 206 ERROR_FILE_CHECKED_OUT = 220 ERROR_FILE_CORRUPT = 1392 ERROR_FILE_ENCRYPTED = 6002 ERROR_FILE_EXISTS = 80 ERROR_FILE_INVALID = 1006 ERROR_FILE_NOT_ENCRYPTED = 6007 ERROR_FILE_NOT_FOUND = 2 ERROR_FILE_OFFLINE = 4350 ERROR_FILE_READ_ONLY = 6009 ERROR_FILE_TOO_LARGE = 223 ERROR_FLOPPY_BAD_REGISTERS = 1125 ERROR_FLOPPY_ID_MARK_NOT_FOUND = 1122 ERROR_FLOPPY_UNKNOWN_ERROR = 1124 ERROR_FLOPPY_WRONG_CYLINDER = 1123 ERROR_FORMS_AUTH_REQUIRED = 224 ERROR_FULLSCREEN_MODE = 1007 ERROR_FULL_BACKUP = 4004 ERROR_FUNCTION_FAILED = 1627 ERROR_FUNCTION_NOT_CALLED = 1626 ERROR_GENERIC_COMMAND_FAILED = 14109 ERROR_GENERIC_NOT_MAPPED = 1360 ERROR_GEN_FAILURE = 31 ERROR_GLOBAL_ONLY_HOOK = 1429 ERROR_GPIO_CLIENT_INFORMATION_INVALID = 15322 ERROR_GPIO_INCOMPATIBLE_CONNECT_MODE = 15326 ERROR_GPIO_INTERRUPT_ALREADY_UNMASKED = 15327 ERROR_GPIO_INVALID_REGISTRATION_PACKET = 15324 ERROR_GPIO_OPERATION_DENIED = 15325 ERROR_GPIO_VERSION_NOT_SUPPORTED = 15323 ERROR_GRACEFUL_DISCONNECT = 1226 ERROR_GROUP_EXISTS = 1318 ERROR_GROUP_NOT_AVAILABLE = 5012 ERROR_GROUP_NOT_FOUND = 5013 ERROR_GROUP_NOT_ONLINE = 5014 ERROR_HANDLE_DISK_FULL = 39 ERROR_HANDLE_EOF = 38 ERROR_HASH_NOT_PRESENT = 15301 ERROR_HASH_NOT_SUPPORTED = 15300 ERROR_HOOK_NEEDS_HMOD = 1428 ERROR_HOOK_NOT_INSTALLED = 1431 ERROR_HOOK_TYPE_NOT_ALLOWED = 1458 ERROR_HOST_DOWN = 1256 ERROR_HOST_NODE_NOT_AVAILABLE = 5005 ERROR_HOST_NODE_NOT_GROUP_OWNER = 5016 ERROR_HOST_NODE_NOT_RESOURCE_OWNER = 5015 ERROR_HOST_UNREACHABLE = 1232 ERROR_HOTKEY_ALREADY_REGISTERED = 1409 ERROR_HOTKEY_NOT_REGISTERED = 1419 ERROR_HWNDS_HAVE_DIFF_PARENT = 1441 ERROR_ICM_NOT_ENABLED = 2018 ERROR_IEPORT_FULL = 4341 ERROR_ILLEGAL_ELEMENT_ADDRESS = 1162 ERROR_ILL_FORMED_PASSWORD = 1324 ERROR_INCORRECT_ADDRESS = 1241 ERROR_INCORRECT_SIZE = 1462 ERROR_INC_BACKUP = 4003 ERROR_INDEX_ABSENT = 1611 ERROR_INDIGENOUS_TYPE = 4338 ERROR_INFLOOP_IN_RELOC_CHAIN = 202 ERROR_INIT_STATUS_NEEDED = 0x00000011 ERROR_INSTALL_ALREADY_RUNNING = 1618 ERROR_INSTALL_CANCEL = 15608 ERROR_INSTALL_DEREGISTRATION_FAILURE = 15607 ERROR_INSTALL_FAILED = 15609 ERROR_INSTALL_FAILURE = 1603 ERROR_INSTALL_FIREWALL_SERVICE_NOT_RUNNING = 15626 ERROR_INSTALL_INVALID_PACKAGE = 15602 ERROR_INSTALL_LANGUAGE_UNSUPPORTED = 1623 ERROR_INSTALL_LOG_FAILURE = 1622 ERROR_INSTALL_NETWORK_FAILURE = 15605 ERROR_INSTALL_NOTUSED = 1634 ERROR_INSTALL_OPEN_PACKAGE_FAILED = 15600 ERROR_INSTALL_OUT_OF_DISK_SPACE = 15604 ERROR_INSTALL_PACKAGE_DOWNGRADE = 15622 ERROR_INSTALL_PACKAGE_INVALID = 1620 ERROR_INSTALL_PACKAGE_NOT_FOUND = 15601 ERROR_INSTALL_PACKAGE_OPEN_FAILED = 1619 ERROR_INSTALL_PACKAGE_REJECTED = 1625 ERROR_INSTALL_PACKAGE_VERSION = 1613 ERROR_INSTALL_PLATFORM_UNSUPPORTED = 1633 ERROR_INSTALL_POLICY_FAILURE = 15615 ERROR_INSTALL_PREREQUISITE_FAILED = 15613 ERROR_INSTALL_REGISTRATION_FAILURE = 15606 ERROR_INSTALL_REMOTE_DISALLOWED = 1640 ERROR_INSTALL_REMOTE_PROHIBITED = 1645 ERROR_INSTALL_RESOLVE_DEPENDENCY_FAILED = 15603 ERROR_INSTALL_SERVICE_FAILURE = 1601 ERROR_INSTALL_SOURCE_ABSENT = 1612 ERROR_INSTALL_SUSPEND = 1604 ERROR_INSTALL_TEMP_UNWRITABLE = 1632 ERROR_INSTALL_TRANSFORM_FAILURE = 1624 ERROR_INSTALL_TRANSFORM_REJECTED = 1644 ERROR_INSTALL_UI_FAILURE = 1621 ERROR_INSTALL_USEREXIT = 1602 ERROR_INSUFFICIENT_BUFFER = 122 ERROR_INTERNAL_DB_CORRUPTION = 1358 ERROR_INTERNAL_DB_ERROR = 1383 ERROR_INTERNAL_ERROR = 1359 ERROR_INVALID_ACCEL_HANDLE = 1403 ERROR_INVALID_ACCESS = 12 ERROR_INVALID_ACCOUNT_NAME = 1315 ERROR_INVALID_ACL = 1336 ERROR_INVALID_ADDRESS = 487 ERROR_INVALID_AT_INTERRUPT_TIME = 104 ERROR_INVALID_BLOCK = 9 ERROR_INVALID_BLOCK_LENGTH = 1106 ERROR_INVALID_CATEGORY = 117 ERROR_INVALID_CLEANER = 4310 ERROR_INVALID_CMM = 2010 ERROR_INVALID_COLORINDEX = 2022 ERROR_INVALID_COLORSPACE = 2017 ERROR_INVALID_COMBOBOX_MESSAGE = 1422 ERROR_INVALID_COMMAND_LINE = 1639 ERROR_INVALID_COMPUTERNAME = 1210 ERROR_INVALID_CURSOR_HANDLE = 1402 ERROR_INVALID_DATA = 13 ERROR_INVALID_DATATYPE = 1804 ERROR_INVALID_DLL = 1154 ERROR_INVALID_DOMAINNAME = 1212 ERROR_INVALID_DOMAIN_ROLE = 1354 ERROR_INVALID_DOMAIN_STATE = 1353 ERROR_INVALID_DRIVE = 15 ERROR_INVALID_DRIVE_OBJECT = 4321 ERROR_INVALID_DWP_HANDLE = 1405 ERROR_INVALID_EA_HANDLE = 278 ERROR_INVALID_EA_NAME = 254 ERROR_INVALID_EDIT_HEIGHT = 1424 ERROR_INVALID_ENVIRONMENT = 1805 ERROR_INVALID_EVENTNAME = 1211 ERROR_INVALID_EVENT_COUNT = 151 ERROR_INVALID_EXE_SIGNATURE = 191 ERROR_INVALID_FIELD = 1616 ERROR_INVALID_FILTER_PROC = 1427 ERROR_INVALID_FLAGS = 1004 ERROR_INVALID_FLAG_NUMBER = 186 ERROR_INVALID_FORM_NAME = 1902 ERROR_INVALID_FORM_SIZE = 1903 ERROR_INVALID_FUNCTION = 1 ERROR_INVALID_GROUPNAME = 1209 ERROR_INVALID_GROUP_ATTRIBUTES = 1345 ERROR_INVALID_GW_COMMAND = 1443 ERROR_INVALID_HANDLE = 6 ERROR_INVALID_HANDLE_STATE = 1609 ERROR_INVALID_HOOK_FILTER = 1426 ERROR_INVALID_HOOK_HANDLE = 1404 ERROR_INVALID_ICON_HANDLE = 1414 ERROR_INVALID_ID_AUTHORITY = 1343 ERROR_INVALID_IMPORT_OF_NON_DLL = 1276 ERROR_INVALID_INDEX = 1413 ERROR_INVALID_KEYBOARD_HANDLE = 1457 ERROR_INVALID_LB_MESSAGE = 1432 ERROR_INVALID_LEVEL = 124 ERROR_INVALID_LIBRARY = 4301 ERROR_INVALID_LIST_FORMAT = 153 ERROR_INVALID_LOGON_HOURS = 1328 ERROR_INVALID_LOGON_TYPE = 1367 ERROR_INVALID_MEDIA = 4300 ERROR_INVALID_MEDIA_POOL = 4302 ERROR_INVALID_MEMBER = 1388 ERROR_INVALID_MENU_HANDLE = 1401 ERROR_INVALID_MESSAGE = 1002 ERROR_INVALID_MESSAGEDEST = 1218 ERROR_INVALID_MESSAGENAME = 1217 ERROR_INVALID_MINALLOCSIZE = 195 ERROR_INVALID_MODULETYPE = 190 ERROR_INVALID_MONITOR_HANDLE = 1461 ERROR_INVALID_MSGBOX_STYLE = 1438 ERROR_INVALID_NAME = 123 ERROR_INVALID_NETNAME = 1214 ERROR_INVALID_OPERATION = 4317 ERROR_INVALID_OPERATION_ON_QUORUM = 5068 ERROR_INVALID_OPLOCK_PROTOCOL = 301 ERROR_INVALID_ORDINAL = 182 ERROR_INVALID_OWNER = 1307 ERROR_INVALID_PARAMETER = 87 ERROR_INVALID_PASSWORD = 86 ERROR_INVALID_PASSWORDNAME = 1216 ERROR_INVALID_PIXEL_FORMAT = 2000 ERROR_INVALID_PRIMARY_GROUP = 1308 ERROR_INVALID_PRINTER_COMMAND = 1803 ERROR_INVALID_PRINTER_NAME = 1801 ERROR_INVALID_PRINTER_STATE = 1906 ERROR_INVALID_PRINT_MONITOR = 3007 ERROR_INVALID_PRIORITY = 1800 ERROR_INVALID_PROFILE = 2011 ERROR_INVALID_REPARSE_DATA = 4392 ERROR_INVALID_RUNLEVEL_SETTING = 15401 ERROR_INVALID_SCROLLBAR_RANGE = 1448 ERROR_INVALID_SECURITY_DESCR = 1338 ERROR_INVALID_SEGDPL = 198 ERROR_INVALID_SEGMENT_NUMBER = 180 ERROR_INVALID_SEPARATOR_FILE = 1799 ERROR_INVALID_SERVER_STATE = 1352 ERROR_INVALID_SERVICENAME = 1213 ERROR_INVALID_SERVICE_ACCOUNT = 1057 ERROR_INVALID_SERVICE_CONTROL = 1052 ERROR_INVALID_SERVICE_LOCK = 1071 ERROR_INVALID_SHARENAME = 1215 ERROR_INVALID_SHOWWIN_COMMAND = 1449 ERROR_INVALID_SID = 1337 ERROR_INVALID_SIGNAL_NUMBER = 209 ERROR_INVALID_SPI_VALUE = 1439 ERROR_INVALID_STACKSEG = 189 ERROR_INVALID_STAGED_SIGNATURE = 15620 ERROR_INVALID_STARTING_CODESEG = 188 ERROR_INVALID_STATE = 5023 ERROR_INVALID_SUB_AUTHORITY = 1335 ERROR_INVALID_TABLE = 1628 ERROR_INVALID_TARGET_HANDLE = 114 ERROR_INVALID_THREAD_ID = 1444 ERROR_INVALID_TIME = 1901 ERROR_INVALID_TOKEN = 315 ERROR_INVALID_TRANSFORM = 2020 ERROR_INVALID_USER_BUFFER = 1784 ERROR_INVALID_VERIFY_SWITCH = 118 ERROR_INVALID_WINDOW_HANDLE = 1400 ERROR_INVALID_WINDOW_STYLE = 2002 ERROR_INVALID_WORKSTATION = 1329 ERROR_IOPL_NOT_ENABLED = 197 ERROR_IO_DEVICE = 1117 ERROR_IO_INCOMPLETE = 996 ERROR_IO_PENDING = 997 ERROR_IPSEC_AUTH_FIREWALL_DROP = 13917 ERROR_IPSEC_BAD_SPI = 13910 ERROR_IPSEC_CLEAR_TEXT_DROP = 13916 ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND = 13014 ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND = 13013 ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND = 13015 ERROR_IPSEC_DOSP_BLOCK = 13925 ERROR_IPSEC_DOSP_INVALID_PACKET = 13927 ERROR_IPSEC_DOSP_KEYMOD_NOT_ALLOWED = 13930 ERROR_IPSEC_DOSP_MAX_ENTRIES = 13929 ERROR_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES = 13932 ERROR_IPSEC_DOSP_NOT_INSTALLED = 13931 ERROR_IPSEC_DOSP_RECEIVED_MULTICAST = 13926 ERROR_IPSEC_DOSP_STATE_LOOKUP_FAILED = 13928 ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED = 13860 ERROR_IPSEC_IKE_ATTRIB_FAIL = 13802 ERROR_IPSEC_IKE_AUTHORIZATION_FAILURE = 13905 ERROR_IPSEC_IKE_AUTHORIZATION_FAILURE_WITH_OPTIONAL_RETRY = 13907 ERROR_IPSEC_IKE_AUTH_FAIL = 13801 ERROR_IPSEC_IKE_BENIGN_REINIT = 13878 ERROR_IPSEC_IKE_CERT_CHAIN_POLICY_MISMATCH = 13887 ERROR_IPSEC_IKE_CGA_AUTH_FAILED = 13892 ERROR_IPSEC_IKE_COEXISTENCE_SUPPRESS = 13902 ERROR_IPSEC_IKE_CRL_FAILED = 13817 ERROR_IPSEC_IKE_DECRYPT = 13867 ERROR_IPSEC_IKE_DH_FAIL = 13822 ERROR_IPSEC_IKE_DH_FAILURE = 13864 ERROR_IPSEC_IKE_DOS_COOKIE_SENT = 13890 ERROR_IPSEC_IKE_DROP_NO_RESPONSE = 13813 ERROR_IPSEC_IKE_ENCRYPT = 13866 ERROR_IPSEC_IKE_ERROR = 13816 ERROR_IPSEC_IKE_FAILQUERYSSP = 13854 ERROR_IPSEC_IKE_FAILSSPINIT = 13853 ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR = 13804 ERROR_IPSEC_IKE_GETSPIFAIL = 13857 ERROR_IPSEC_IKE_INNER_IP_ASSIGNMENT_FAILURE = 13899 ERROR_IPSEC_IKE_INVALID_AUTH_ALG = 13874 ERROR_IPSEC_IKE_INVALID_AUTH_PAYLOAD = 13889 ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN = 13881 ERROR_IPSEC_IKE_INVALID_CERT_TYPE = 13819 ERROR_IPSEC_IKE_INVALID_COOKIE = 13846 ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG = 13873 ERROR_IPSEC_IKE_INVALID_FILTER = 13858 ERROR_IPSEC_IKE_INVALID_GROUP = 13865 ERROR_IPSEC_IKE_INVALID_HASH = 13870 ERROR_IPSEC_IKE_INVALID_HASH_ALG = 13871 ERROR_IPSEC_IKE_INVALID_HASH_SIZE = 13872 ERROR_IPSEC_IKE_INVALID_HEADER = 13824 ERROR_IPSEC_IKE_INVALID_KEY_USAGE = 13818 ERROR_IPSEC_IKE_INVALID_MM_FOR_QM = 13894 ERROR_IPSEC_IKE_INVALID_PAYLOAD = 13843 ERROR_IPSEC_IKE_INVALID_POLICY = 13861 ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY = 13879 ERROR_IPSEC_IKE_INVALID_SIG = 13875 ERROR_IPSEC_IKE_INVALID_SIGNATURE = 13826 ERROR_IPSEC_IKE_INVALID_SITUATION = 13863 ERROR_IPSEC_IKE_KERBEROS_ERROR = 13827 ERROR_IPSEC_IKE_KILL_DUMMY_NAP_TUNNEL = 13898 ERROR_IPSEC_IKE_LOAD_FAILED = 13876 ERROR_IPSEC_IKE_LOAD_SOFT_SA = 13844 ERROR_IPSEC_IKE_MM_ACQUIRE_DROP = 13809 ERROR_IPSEC_IKE_MM_DELAY_DROP = 13814 ERROR_IPSEC_IKE_MM_EXPIRED = 13885 ERROR_IPSEC_IKE_MM_LIMIT = 13882 ERROR_IPSEC_IKE_NEGOTIATION_DISABLED = 13883 ERROR_IPSEC_IKE_NEGOTIATION_PENDING = 13803 ERROR_IPSEC_IKE_NEG_STATUS_BEGIN = 13800 ERROR_IPSEC_IKE_NEG_STATUS_END = 13897 ERROR_IPSEC_IKE_NEG_STATUS_EXTENDED_END = 13909 ERROR_IPSEC_IKE_NOTCBPRIV = 13851 ERROR_IPSEC_IKE_NO_CERT = 13806 ERROR_IPSEC_IKE_NO_MM_POLICY = 13850 ERROR_IPSEC_IKE_NO_PEER_CERT = 13847 ERROR_IPSEC_IKE_NO_POLICY = 13825 ERROR_IPSEC_IKE_NO_PRIVATE_KEY = 13820 ERROR_IPSEC_IKE_NO_PUBLIC_KEY = 13828 ERROR_IPSEC_IKE_OUT_OF_MEMORY = 13859 ERROR_IPSEC_IKE_PEER_CRL_FAILED = 13848 ERROR_IPSEC_IKE_PEER_DOESNT_SUPPORT_MOBIKE = 13904 ERROR_IPSEC_IKE_PEER_MM_ASSUMED_INVALID = 13886 ERROR_IPSEC_IKE_POLICY_CHANGE = 13849 ERROR_IPSEC_IKE_POLICY_MATCH = 13868 ERROR_IPSEC_IKE_PROCESS_ERR = 13829 ERROR_IPSEC_IKE_PROCESS_ERR_CERT = 13835 ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ = 13836 ERROR_IPSEC_IKE_PROCESS_ERR_DELETE = 13841 ERROR_IPSEC_IKE_PROCESS_ERR_HASH = 13837 ERROR_IPSEC_IKE_PROCESS_ERR_ID = 13834 ERROR_IPSEC_IKE_PROCESS_ERR_KE = 13833 ERROR_IPSEC_IKE_PROCESS_ERR_NATOA = 13893 ERROR_IPSEC_IKE_PROCESS_ERR_NONCE = 13839 ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY = 13840 ERROR_IPSEC_IKE_PROCESS_ERR_PROP = 13831 ERROR_IPSEC_IKE_PROCESS_ERR_SA = 13830 ERROR_IPSEC_IKE_PROCESS_ERR_SIG = 13838 ERROR_IPSEC_IKE_PROCESS_ERR_TRANS = 13832 ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR = 13842 ERROR_IPSEC_IKE_QM_ACQUIRE_DROP = 13810 ERROR_IPSEC_IKE_QM_DELAY_DROP = 13815 ERROR_IPSEC_IKE_QM_EXPIRED = 13895 ERROR_IPSEC_IKE_QM_LIMIT = 13884 ERROR_IPSEC_IKE_QUEUE_DROP_MM = 13811 ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM = 13812 ERROR_IPSEC_IKE_RATELIMIT_DROP = 13903 ERROR_IPSEC_IKE_REQUIRE_CP_PAYLOAD_MISSING = 13900 ERROR_IPSEC_IKE_RPC_DELETE = 13877 ERROR_IPSEC_IKE_SA_DELETED = 13807 ERROR_IPSEC_IKE_SA_REAPED = 13808 ERROR_IPSEC_IKE_SECLOADFAIL = 13852 ERROR_IPSEC_IKE_SHUTTING_DOWN = 13891 ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN = 13845 ERROR_IPSEC_IKE_SRVACQFAIL = 13855 ERROR_IPSEC_IKE_SRVQUERYCRED = 13856 ERROR_IPSEC_IKE_STRONG_CRED_AUTHORIZATION_AND_CERTMAP_FAILURE = 13908 ERROR_IPSEC_IKE_STRONG_CRED_AUTHORIZATION_FAILURE = 13906 ERROR_IPSEC_IKE_TIMED_OUT = 13805 ERROR_IPSEC_IKE_TOO_MANY_FILTERS = 13896 ERROR_IPSEC_IKE_UNEXPECTED_MESSAGE_ID = 13888 ERROR_IPSEC_IKE_UNKNOWN_DOI = 13862 ERROR_IPSEC_IKE_UNSUPPORTED_ID = 13869 ERROR_IPSEC_INTEGRITY_CHECK_FAILED = 13915 ERROR_IPSEC_INVALID_PACKET = 13914 ERROR_IPSEC_KEY_MODULE_IMPERSONATION_NEGOTIATION_PENDING = 13901 ERROR_IPSEC_MM_AUTH_EXISTS = 13010 ERROR_IPSEC_MM_AUTH_IN_USE = 13012 ERROR_IPSEC_MM_AUTH_NOT_FOUND = 13011 ERROR_IPSEC_MM_AUTH_PENDING_DELETION = 13022 ERROR_IPSEC_MM_FILTER_EXISTS = 13006 ERROR_IPSEC_MM_FILTER_NOT_FOUND = 13007 ERROR_IPSEC_MM_FILTER_PENDING_DELETION = 13018 ERROR_IPSEC_MM_POLICY_EXISTS = 13003 ERROR_IPSEC_MM_POLICY_IN_USE = 13005 ERROR_IPSEC_MM_POLICY_NOT_FOUND = 13004 ERROR_IPSEC_MM_POLICY_PENDING_DELETION = 13021 ERROR_IPSEC_QM_POLICY_EXISTS = 13000 ERROR_IPSEC_QM_POLICY_IN_USE = 13002 ERROR_IPSEC_QM_POLICY_NOT_FOUND = 13001 ERROR_IPSEC_QM_POLICY_PENDING_DELETION = 13023 ERROR_IPSEC_REPLAY_CHECK_FAILED = 13913 ERROR_IPSEC_SA_LIFETIME_EXPIRED = 13911 ERROR_IPSEC_THROTTLE_DROP = 13918 ERROR_IPSEC_TRANSPORT_FILTER_EXISTS = 13008 ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND = 13009 ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION = 13019 ERROR_IPSEC_TUNNEL_FILTER_EXISTS = 13016 ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND = 13017 ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION = 13020 ERROR_IPSEC_WRONG_SA = 13912 ERROR_IRQ_BUSY = 1119 ERROR_IS_JOINED = 134 ERROR_IS_JOIN_PATH = 147 ERROR_IS_JOIN_TARGET = 133 ERROR_IS_SUBSTED = 135 ERROR_IS_SUBST_PATH = 146 ERROR_IS_SUBST_TARGET = 149 ERROR_ITERATED_DATA_EXCEEDS_64k = 194 ERROR_JOIN_TO_JOIN = 138 ERROR_JOIN_TO_SUBST = 140 ERROR_JOURNAL_DELETE_IN_PROGRESS = 1178 ERROR_JOURNAL_ENTRY_DELETED = 1181 ERROR_JOURNAL_HOOK_SET = 1430 ERROR_JOURNAL_NOT_ACTIVE = 1179 ERROR_KERNEL_APC = 738 ERROR_KEY_DELETED = 1018 ERROR_KEY_HAS_CHILDREN = 1020 ERROR_KM_DRIVER_BLOCKED = 1930 ERROR_LABEL_QUESTIONABLE = 0x00000002 ERROR_LABEL_TOO_LONG = 154 ERROR_LABEL_UNREADABLE = 0x00000001 ERROR_LAST_ADMIN = 1322 ERROR_LB_WITHOUT_TABSTOPS = 1434 ERROR_LIBRARY_FULL = 4322 ERROR_LIBRARY_OFFLINE = 4305 ERROR_LICENSE_QUOTA_EXCEEDED = 1395 ERROR_LISTBOX_ID_NOT_FOUND = 1416 ERROR_LM_CROSS_ENCRYPTION_REQUIRED = 1390 ERROR_LOCAL_USER_SESSION_KEY = 1303 ERROR_LOCKED = 212 ERROR_LOCK_FAILED = 167 ERROR_LOCK_VIOLATION = 33 ERROR_LOGIN_TIME_RESTRICTION = 1239 ERROR_LOGIN_WKSTA_RESTRICTION = 1240 ERROR_LOGON_FAILURE = 1326 ERROR_LOGON_NOT_GRANTED = 1380 ERROR_LOGON_SESSION_COLLISION = 1366 ERROR_LOGON_SESSION_EXISTS = 1363 ERROR_LOGON_TYPE_NOT_GRANTED = 1385 ERROR_LOG_FILE_FULL = 1502 ERROR_LUIDS_EXHAUSTED = 1334 ERROR_MACHINE_LOCKED = 1271 ERROR_MAGAZINE_NOT_PRESENT = 1163 ERROR_MALFORMED_SUBSTITUTION_STRING = 14094 ERROR_MAPPED_ALIGNMENT = 1132 ERROR_MAX_THRDS_REACHED = 164 ERROR_MCA_INTERNAL_ERROR = 15205 ERROR_MCA_INVALID_CAPABILITIES_STRING = 15200 ERROR_MCA_INVALID_TECHNOLOGY_TYPE_RETURNED = 15206 ERROR_MCA_INVALID_VCP_VERSION = 15201 ERROR_MCA_MCCS_VERSION_MISMATCH = 15203 ERROR_MCA_MONITOR_VIOLATES_MCCS_SPECIFICATION = 15202 ERROR_MCA_UNSUPPORTED_COLOR_TEMPERATURE = 15207 ERROR_MCA_UNSUPPORTED_MCCS_VERSION = 15204 ERROR_MEDIA_CHANGED = 1110 ERROR_MEDIA_INCOMPATIBLE = 4315 ERROR_MEDIA_NOT_AVAILABLE = 4318 ERROR_MEDIA_OFFLINE = 4304 ERROR_MEDIA_UNAVAILABLE = 4308 ERROR_MEDIUM_NOT_ACCESSIBLE = 4323 ERROR_MEMBERS_PRIMARY_GROUP = 1374 ERROR_MEMBER_IN_ALIAS = 1378 ERROR_MEMBER_IN_GROUP = 1320 ERROR_MEMBER_NOT_IN_ALIAS = 1377 ERROR_MEMBER_NOT_IN_GROUP = 1321 ERROR_MENU_ITEM_NOT_FOUND = 1456 ERROR_MESSAGE_EXCEEDS_MAX_SIZE = 4336 ERROR_MESSAGE_SYNC_ONLY = 1159 ERROR_METAFILE_NOT_SUPPORTED = 2003 ERROR_META_EXPANSION_TOO_LONG = 208 ERROR_MOD_NOT_FOUND = 126 ERROR_MORE_DATA = 234 ERROR_MORE_WRITES = 1120 ERROR_MRM_AUTOMERGE_ENABLED = 15139 ERROR_MRM_DUPLICATE_ENTRY = 15119 ERROR_MRM_DUPLICATE_MAP_NAME = 15118 ERROR_MRM_FILEPATH_TOO_LONG = 15121 ERROR_MRM_INDETERMINATE_QUALIFIER_VALUE = 15138 ERROR_MRM_INVALID_FILE_TYPE = 15112 ERROR_MRM_INVALID_PRICONFIG = 15111 ERROR_MRM_INVALID_PRI_FILE = 15126 ERROR_MRM_INVALID_QUALIFIER_OPERATOR = 15137 ERROR_MRM_INVALID_QUALIFIER_VALUE = 15114 ERROR_MRM_INVALID_RESOURCE_IDENTIFIER = 15120 ERROR_MRM_MAP_NOT_FOUND = 15135 ERROR_MRM_NAMED_RESOURCE_NOT_FOUND = 15127 ERROR_MRM_NO_CANDIDATE = 15115 ERROR_MRM_NO_MATCH_OR_DEFAULT_CANDIDATE = 15116 ERROR_MRM_RESOURCE_TYPE_MISMATCH = 15117 ERROR_MRM_RUNTIME_NO_DEFAULT_OR_NEUTRAL_RESOURCE = 15110 ERROR_MRM_TOO_MANY_RESOURCES = 15140 ERROR_MRM_UNKNOWN_QUALIFIER = 15113 ERROR_MRM_UNSUPPORTED_DIRECTORY_TYPE = 15122 ERROR_MRM_UNSUPPORTED_PROFILE_TYPE = 15136 ERROR_MR_MID_NOT_FOUND = 317 ERROR_MUI_FILE_NOT_FOUND = 15100 ERROR_MUI_FILE_NOT_LOADED = 15105 ERROR_MUI_INTLSETTINGS_INVALID_LOCALE_NAME = 15108 ERROR_MUI_INTLSETTINGS_UILANG_NOT_INSTALLED = 15107 ERROR_MUI_INVALID_FILE = 15101 ERROR_MUI_INVALID_LOCALE_NAME = 15103 ERROR_MUI_INVALID_RC_CONFIG = 15102 ERROR_MUI_INVALID_ULTIMATEFALLBACK_NAME = 15104 ERROR_MUTUAL_AUTH_FAILED = 1397 ERROR_NEEDS_REMEDIATION = 15612 ERROR_NEGATIVE_SEEK = 131 ERROR_NESTING_NOT_ALLOWED = 215 ERROR_NETLOGON_NOT_STARTED = 1792 ERROR_NETNAME_DELETED = 64 ERROR_NETWORK_ACCESS_DENIED = 65 ERROR_NETWORK_BUSY = 54 ERROR_NETWORK_NOT_AVAILABLE = 5035 ERROR_NETWORK_UNREACHABLE = 1231 ERROR_NET_WRITE_FAULT = 88 ERROR_NOACCESS = 998 ERROR_NODE_CANNOT_BE_CLUSTERED = 5898 ERROR_NODE_CANT_HOST_RESOURCE = 5071 ERROR_NODE_NOT_AVAILABLE = 5036 ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 1807 ERROR_NOLOGON_SERVER_TRUST_ACCOUNT = 1809 ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 1808 ERROR_NONE_MAPPED = 1332 ERROR_NONPAGED_SYSTEM_RESOURCES = 1451 ERROR_NON_ACCOUNT_SID = 1257 ERROR_NON_DOMAIN_SID = 1258 ERROR_NON_MDICHILD_WINDOW = 1445 ERROR_NOTIFY_ENUM_DIR = 1022 ERROR_NOT_ALL_ASSIGNED = 1300 ERROR_NOT_AUTHENTICATED = 1244 ERROR_NOT_A_REPARSE_POINT = 4390 ERROR_NOT_CHILD_WINDOW = 1442 ERROR_NOT_CONNECTED = 2250 ERROR_NOT_CONTAINER = 1207 ERROR_NOT_DOS_DISK = 26 ERROR_NOT_EMPTY = 4307 ERROR_NOT_ENOUGH_MEMORY = 8 ERROR_NOT_ENOUGH_QUOTA = 1816 ERROR_NOT_ENOUGH_SERVER_MEMORY = 1130 ERROR_NOT_EXPORT_FORMAT = 6008 ERROR_NOT_FOUND = 1168 ERROR_NOT_GUI_PROCESS = 1471 ERROR_NOT_JOINED = 136 ERROR_NOT_LOCKED = 158 ERROR_NOT_LOGGED_ON = 1245 ERROR_NOT_LOGON_PROCESS = 1362 ERROR_NOT_OWNER = 288 ERROR_NOT_QUORUM_CAPABLE = 5021 ERROR_NOT_QUORUM_CLASS = 5025 ERROR_NOT_READY = 21 ERROR_NOT_REGISTRY_FILE = 1017 ERROR_NOT_SAFEBOOT_SERVICE = 1084 ERROR_NOT_SAME_DEVICE = 17 ERROR_NOT_SUBSTED = 137 ERROR_NOT_SUPPORTED = 50 ERROR_NOT_SUPPORTED_ON_SBS = 1254 ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER = 8584 ERROR_NO_ASSOCIATION = 1155 ERROR_NO_BROWSER_SERVERS_FOUND = 6118 ERROR_NO_DATA = 232 ERROR_NO_DATA_DETECTED = 1104 ERROR_NO_EFS = 6004 ERROR_NO_IMPERSONATION_TOKEN = 1309 ERROR_NO_INHERITANCE = 1391 ERROR_NO_LOGON_SERVERS = 1311 ERROR_NO_LOG_SPACE = 1019 ERROR_NO_MATCH = 1169 ERROR_NO_MEDIA_IN_DRIVE = 1112 ERROR_NO_MORE_DEVICES = 1248 ERROR_NO_MORE_FILES = 18 ERROR_NO_MORE_ITEMS = 259 ERROR_NO_MORE_SEARCH_HANDLES = 113 ERROR_NO_MORE_USER_HANDLES = 1158 ERROR_NO_NETWORK = 1222 ERROR_NO_NET_OR_BAD_PATH = 1203 ERROR_NO_NVRAM_RESOURCES = 1470 ERROR_NO_PROC_SLOTS = 89 ERROR_NO_PROMOTION_ACTIVE = 8222 ERROR_NO_QUOTAS_FOR_ACCOUNT = 1302 ERROR_NO_RECOVERY_POLICY = 6003 ERROR_NO_RECOVERY_PROGRAM = 1082 ERROR_NO_SCROLLBARS = 1447 ERROR_NO_SECURITY_ON_OBJECT = 1350 ERROR_NO_SHUTDOWN_IN_PROGRESS = 1116 ERROR_NO_SIGNAL_SENT = 205 ERROR_NO_SITENAME = 1919 ERROR_NO_SPOOL_SPACE = 62 ERROR_NO_SUCH_ALIAS = 1376 ERROR_NO_SUCH_DOMAIN = 1355 ERROR_NO_SUCH_GROUP = 1319 ERROR_NO_SUCH_LOGON_SESSION = 1312 ERROR_NO_SUCH_MEMBER = 1387 ERROR_NO_SUCH_PACKAGE = 1364 ERROR_NO_SUCH_PRIVILEGE = 1313 ERROR_NO_SUCH_SITE = 1249 ERROR_NO_SUCH_USER = 1317 ERROR_NO_SUPPORTING_DRIVES = 4339 ERROR_NO_SYSTEM_MENU = 1437 ERROR_NO_SYSTEM_RESOURCES = 1450 ERROR_NO_TOKEN = 1008 ERROR_NO_TRACKING_SERVICE = 1172 ERROR_NO_TRUST_LSA_SECRET = 1786 ERROR_NO_TRUST_SAM_ACCOUNT = 1787 ERROR_NO_UNICODE_TRANSLATION = 1113 ERROR_NO_USER_KEYS = 6006 ERROR_NO_USER_SESSION_KEY = 1394 ERROR_NO_VOLUME_ID = 1173 ERROR_NO_VOLUME_LABEL = 125 ERROR_NO_WILDCARD_CHARACTERS = 1417 ERROR_NT_CROSS_ENCRYPTION_REQUIRED = 1386 ERROR_NULL_LM_PASSWORD = 1304 ERROR_OBJECT_ALREADY_EXISTS = 5010 ERROR_OBJECT_IN_LIST = 5011 ERROR_OBJECT_NOT_FOUND = 4312 ERROR_OLD_WIN_VERSION = 1150 ERROR_ONLY_IF_CONNECTED = 1251 ERROR_OPEN_FAILED = 110 ERROR_OPEN_FILES = 2401 ERROR_OPERATION_ABORTED = 995 ERROR_OPLOCK_NOT_GRANTED = 300 ERROR_OUTOFMEMORY = 14 ERROR_OUT_OF_PAPER = 28 ERROR_OUT_OF_STRUCTURES = 84 ERROR_OVERRIDE_NOCHANGES = 1252 ERROR_PACKAGES_IN_USE = 15618 ERROR_PACKAGE_ALREADY_EXISTS = 15611 ERROR_PACKAGE_REPOSITORY_CORRUPTED = 15614 ERROR_PACKAGE_UPDATING = 15616 ERROR_PAGED_SYSTEM_RESOURCES = 1452 ERROR_PAGEFILE_QUOTA = 1454 ERROR_PARAMETER_QUOTA_EXCEEDED = 1283 ERROR_PARTIAL_COPY = 299 ERROR_PARTITION_FAILURE = 1105 ERROR_PASSWORD_EXPIRED = 1330 ERROR_PASSWORD_MUST_CHANGE = 1907 ERROR_PASSWORD_RESTRICTION = 1325 ERROR_PATCH_PACKAGE_INVALID = 1636 ERROR_PATCH_PACKAGE_OPEN_FAILED = 1635 ERROR_PATCH_PACKAGE_REJECTED = 1643 ERROR_PATCH_PACKAGE_UNSUPPORTED = 1637 ERROR_PATCH_TARGET_NOT_FOUND = 1642 ERROR_PATH_BUSY = 148 ERROR_PATH_NOT_FOUND = 3 ERROR_PER_USER_TRUST_QUOTA_EXCEEDED = 1932 ERROR_PIPE_BUSY = 231 ERROR_PIPE_CONNECTED = 535 ERROR_PIPE_LISTENING = 536 ERROR_PIPE_LOCAL = 229 ERROR_PIPE_NOT_CONNECTED = 233 ERROR_PKINIT_FAILURE = 1263 ERROR_POINT_NOT_FOUND = 1171 ERROR_POLICY_OBJECT_NOT_FOUND = 8219 ERROR_POLICY_ONLY_IN_DS = 8220 ERROR_POPUP_ALREADY_ACTIVE = 1446 ERROR_PORT_UNREACHABLE = 1234 ERROR_POSSIBLE_DEADLOCK = 1131 ERROR_POTENTIAL_FILE_FOUND = 1180 ERROR_PRINTER_ALREADY_EXISTS = 1802 ERROR_PRINTER_DELETED = 1905 ERROR_PRINTER_DRIVER_ALREADY_INSTALLED = 1795 ERROR_PRINTER_DRIVER_BLOCKED = 3014 ERROR_PRINTER_DRIVER_IN_USE = 3001 ERROR_PRINTER_DRIVER_WARNED = 3013 ERROR_PRINTER_HAS_JOBS_QUEUED = 3009 ERROR_PRINTER_NOT_FOUND = 3012 ERROR_PRINTQ_FULL = 61 ERROR_PRINT_CANCELLED = 63 ERROR_PRINT_MONITOR_ALREADY_INSTALLED = 3006 ERROR_PRINT_MONITOR_IN_USE = 3008 ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED = 3005 ERROR_PRIVATE_DIALOG_INDEX = 1415 ERROR_PRIVILEGE_NOT_HELD = 1314 ERROR_PROCESS_ABORTED = 1067 ERROR_PROC_NOT_FOUND = 127 ERROR_PRODUCT_UNINSTALLED = 1614 ERROR_PRODUCT_VERSION = 1638 ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE = 2015 ERROR_PROFILE_NOT_FOUND = 2016 ERROR_PROMOTION_ACTIVE = 8221 ERROR_PROTOCOL_UNREACHABLE = 1233 ERROR_QUORUMLOG_OPEN_FAILED = 5028 ERROR_QUORUM_DISK_NOT_FOUND = 5086 ERROR_QUORUM_OWNER_ALIVE = 5034 ERROR_QUORUM_RESOURCE = 5020 ERROR_QUORUM_RESOURCE_ONLINE_FAILED = 5027 ERROR_READ_FAULT = 30 ERROR_RECOVERY_FAILURE = 1279 ERROR_RECOVERY_FILE_CORRUPT = 15619 ERROR_REC_NON_EXISTENT = 4005 ERROR_REDIRECTOR_HAS_OPEN_HANDLES = 1794 ERROR_REDIR_PAUSED = 72 ERROR_REGISTRY_CORRUPT = 1015 ERROR_REGISTRY_IO_FAILED = 1016 ERROR_REGISTRY_RECOVERED = 1014 ERROR_REG_NAT_CONSUMPTION = 1261 ERROR_RELOC_CHAIN_XEEDS_SEGLIM = 201 ERROR_REMOTE_PRINT_CONNECTIONS_BLOCKED = 1936 ERROR_REMOTE_SESSION_LIMIT_EXCEEDED = 1220 ERROR_REMOTE_STORAGE_MEDIA_ERROR = 4352 ERROR_REMOTE_STORAGE_NOT_ACTIVE = 4351 ERROR_REMOVE_FAILED = 15610 ERROR_REM_NOT_LIST = 51 ERROR_REPARSE_ATTRIBUTE_CONFLICT = 4391 ERROR_REPARSE_TAG_INVALID = 4393 ERROR_REPARSE_TAG_MISMATCH = 4394 ERROR_REQUEST_ABORTED = 1235 ERROR_REQUEST_REFUSED = 4320 ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION = 1459 ERROR_REQ_NOT_ACCEP = 71 ERROR_RESILIENCY_FILE_CORRUPT = 15625 ERROR_RESMON_CREATE_FAILED = 5017 ERROR_RESMON_INVALID_STATE = 5084 ERROR_RESMON_ONLINE_FAILED = 5018 ERROR_RESOURCE_DATA_NOT_FOUND = 1812 ERROR_RESOURCE_DISABLED = 4309 ERROR_RESOURCE_ENUM_USER_STOP = 15106 ERROR_RESOURCE_FAILED = 5038 ERROR_RESOURCE_LANG_NOT_FOUND = 1815 ERROR_RESOURCE_NAME_NOT_FOUND = 1814 ERROR_RESOURCE_NOT_AVAILABLE = 5006 ERROR_RESOURCE_NOT_FOUND = 5007 ERROR_RESOURCE_NOT_ONLINE = 5004 ERROR_RESOURCE_NOT_PRESENT = 4316 ERROR_RESOURCE_ONLINE = 5019 ERROR_RESOURCE_PROPERTIES_STORED = 5024 ERROR_RESOURCE_PROPERTY_UNCHANGEABLE = 5089 ERROR_RESOURCE_TYPE_NOT_FOUND = 1813 ERROR_RESTART_APPLICATION = 1467 ERROR_RETRY = 1237 ERROR_REVISION_MISMATCH = 1306 ERROR_RING2SEG_MUST_BE_MOVABLE = 200 ERROR_RING2_STACK_IN_USE = 207 ERROR_RMODE_APP = 1153 ERROR_RPL_NOT_ALLOWED = 4006 ERROR_RUNLEVEL_SWITCH_AGENT_TIMEOUT = 15403 ERROR_RUNLEVEL_SWITCH_IN_PROGRESS = 15404 ERROR_RUNLEVEL_SWITCH_TIMEOUT = 15402 ERROR_RXACT_COMMIT_FAILURE = 1370 ERROR_RXACT_INVALID_STATE = 1369 ERROR_SAME_DRIVE = 143 ERROR_SAM_INIT_FAILURE = 8541 ERROR_SCOPE_NOT_FOUND = 318 ERROR_SCREEN_ALREADY_LOCKED = 1440 ERROR_SECONDARY_IC_PROVIDER_NOT_REGISTERED = 15321 ERROR_SECRET_TOO_LONG = 1382 ERROR_SECTOR_NOT_FOUND = 27 ERROR_SEEK = 25 ERROR_SEEK_ON_DEVICE = 132 ERROR_SEM_IS_SET = 102 ERROR_SEM_NOT_FOUND = 187 ERROR_SEM_OWNER_DIED = 105 ERROR_SEM_TIMEOUT = 121 ERROR_SEM_USER_LIMIT = 106 ERROR_SERIAL_NO_DEVICE = 1118 ERROR_SERVER_DISABLED = 1341 ERROR_SERVER_HAS_OPEN_HANDLES = 1811 ERROR_SERVER_NOT_DISABLED = 1342 ERROR_SERVER_SHUTDOWN_IN_PROGRESS = 1255 ERROR_SERVICES_FAILED_AUTOSTART = 15405 ERROR_SERVICE_ALREADY_RUNNING = 1056 ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061 ERROR_SERVICE_DATABASE_LOCKED = 1055 ERROR_SERVICE_DEPENDENCY_DELETED = 1075 ERROR_SERVICE_DEPENDENCY_FAIL = 1068 ERROR_SERVICE_DISABLED = 1058 ERROR_SERVICE_DOES_NOT_EXIST = 1060 ERROR_SERVICE_EXISTS = 1073 ERROR_SERVICE_LOGON_FAILED = 1069 ERROR_SERVICE_MARKED_FOR_DELETE = 1072 ERROR_SERVICE_NEVER_STARTED = 1077 ERROR_SERVICE_NOT_ACTIVE = 1062 ERROR_SERVICE_NOT_FOUND = 1243 ERROR_SERVICE_NOT_IN_EXE = 1083 ERROR_SERVICE_NO_THREAD = 1054 ERROR_SERVICE_REQUEST_TIMEOUT = 1053 ERROR_SERVICE_SPECIFIC_ERROR = 1066 ERROR_SERVICE_START_HANG = 1070 ERROR_SESSION_CREDENTIAL_CONFLICT = 1219 ERROR_SETCOUNT_ON_BAD_LB = 1433 ERROR_SETMARK_DETECTED = 1103 ERROR_SET_NOT_FOUND = 1170 ERROR_SET_POWER_STATE_FAILED = 1141 ERROR_SET_POWER_STATE_VETOED = 1140 ERROR_SEVERITY_ERROR = 0xC0000000 ERROR_SEVERITY_INFORMATIONAL = 0x40000000 ERROR_SEVERITY_SUCCESS = 0x00000000 ERROR_SEVERITY_WARNING = 0x80000000 ERROR_SHARED_POLICY = 8218 ERROR_SHARING_BUFFER_EXCEEDED = 36 ERROR_SHARING_PAUSED = 70 ERROR_SHARING_VIOLATION = 32 ERROR_SHUTDOWN_CLUSTER = 5008 ERROR_SHUTDOWN_IN_PROGRESS = 1115 ERROR_SIGNAL_PENDING = 162 ERROR_SIGNAL_REFUSED = 156 ERROR_SINGLE_INSTANCE_APP = 1152 ERROR_SLOT_NOT_PRESENT = 0x00000004 ERROR_SMARTCARD_SUBSYSTEM_FAILURE = 1264 ERROR_SMI_PRIMITIVE_INSTALLER_FAILED = 14108 ERROR_SOME_NOT_MAPPED = 1301 ERROR_SOURCE_ELEMENT_EMPTY = 1160 ERROR_SPECIAL_ACCOUNT = 1371 ERROR_SPECIAL_GROUP = 1372 ERROR_SPECIAL_USER = 1373 ERROR_SPL_NO_ADDJOB = 3004 ERROR_SPL_NO_STARTDOC = 3003 ERROR_SPOOL_FILE_NOT_FOUND = 3002 ERROR_STACK_BUFFER_OVERRUN = 1282 ERROR_STACK_OVERFLOW = 1001 ERROR_STATE_COMPOSITE_SETTING_VALUE_SIZE_LIMIT_EXCEEDED = 15815 ERROR_STATE_CONTAINER_NAME_SIZE_LIMIT_EXCEEDED = 15818 ERROR_STATE_CREATE_CONTAINER_FAILED = 15805 ERROR_STATE_DELETE_CONTAINER_FAILED = 15806 ERROR_STATE_DELETE_SETTING_FAILED = 15809 ERROR_STATE_ENUMERATE_CONTAINER_FAILED = 15813 ERROR_STATE_ENUMERATE_SETTINGS_FAILED = 15814 ERROR_STATE_GET_VERSION_FAILED = 15801 ERROR_STATE_LOAD_STORE_FAILED = 15800 ERROR_STATE_OPEN_CONTAINER_FAILED = 15804 ERROR_STATE_QUERY_SETTING_FAILED = 15810 ERROR_STATE_READ_COMPOSITE_SETTING_FAILED = 15811 ERROR_STATE_READ_SETTING_FAILED = 15807 ERROR_STATE_SETTING_NAME_SIZE_LIMIT_EXCEEDED = 15817 ERROR_STATE_SETTING_VALUE_SIZE_LIMIT_EXCEEDED = 15816 ERROR_STATE_SET_VERSION_FAILED = 15802 ERROR_STATE_STRUCTURED_RESET_FAILED = 15803 ERROR_STATE_WRITE_COMPOSITE_SETTING_FAILED = 15812 ERROR_STATE_WRITE_SETTING_FAILED = 15808 ERROR_STATIC_INIT = 4002 ERROR_SUBST_TO_JOIN = 141 ERROR_SUBST_TO_SUBST = 139 ERROR_SUCCESS = 0 ERROR_SUCCESS_REBOOT_INITIATED = 1641 ERROR_SUCCESS_REBOOT_REQUIRED = 3010 ERROR_SUCCESS_RESTART_REQUIRED = 3011 ERROR_SWAPERROR = 999 ERROR_SXS_ACTIVATION_CONTEXT_DISABLED = 14006 ERROR_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT = 14103 ERROR_SXS_ASSEMBLY_MISSING = 14081 ERROR_SXS_ASSEMBLY_NOT_FOUND = 14003 ERROR_SXS_ASSEMBLY_NOT_LOCKED = 14097 ERROR_SXS_CANT_GEN_ACTCTX = 14001 ERROR_SXS_COMPONENT_STORE_CORRUPT = 14098 ERROR_SXS_CORRUPTION = 14083 ERROR_SXS_CORRUPT_ACTIVATION_STACK = 14082 ERROR_SXS_DUPLICATE_ASSEMBLY_NAME = 14027 ERROR_SXS_DUPLICATE_CLSID = 14023 ERROR_SXS_DUPLICATE_DLL_NAME = 14021 ERROR_SXS_DUPLICATE_IID = 14024 ERROR_SXS_DUPLICATE_PROGID = 14026 ERROR_SXS_DUPLICATE_TLBID = 14025 ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME = 14022 ERROR_SXS_EARLY_DEACTIVATION = 14084 ERROR_SXS_FILE_HASH_MISMATCH = 14028 ERROR_SXS_FILE_HASH_MISSING = 14110 ERROR_SXS_FILE_NOT_PART_OF_ASSEMBLY = 14104 ERROR_SXS_IDENTITIES_DIFFERENT = 14102 ERROR_SXS_IDENTITY_DUPLICATE_ATTRIBUTE = 14092 ERROR_SXS_IDENTITY_PARSE_ERROR = 14093 ERROR_SXS_INCORRECT_PUBLIC_KEY_TOKEN = 14095 ERROR_SXS_INVALID_ACTCTXDATA_FORMAT = 14002 ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE = 14017 ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME = 14080 ERROR_SXS_INVALID_DEACTIVATION = 14085 ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME = 14091 ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE = 14090 ERROR_SXS_INVALID_XML_NAMESPACE_URI = 14014 ERROR_SXS_KEY_NOT_FOUND = 14007 ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14016 ERROR_SXS_MANIFEST_FORMAT_ERROR = 14004 ERROR_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT = 14101 ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE = 14019 ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE = 14018 ERROR_SXS_MANIFEST_PARSE_ERROR = 14005 ERROR_SXS_MANIFEST_TOO_BIG = 14105 ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE = 14079 ERROR_SXS_MULTIPLE_DEACTIVATION = 14086 ERROR_SXS_POLICY_PARSE_ERROR = 14029 ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT = 14020 ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET = 14011 ERROR_SXS_PROCESS_TERMINATION_REQUESTED = 14087 ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING = 14078 ERROR_SXS_PROTECTION_CATALOG_NOT_VALID = 14076 ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT = 14075 ERROR_SXS_PROTECTION_RECOVERY_FAILED = 14074 ERROR_SXS_RELEASE_ACTIVATION_CONTEXT = 14088 ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14015 ERROR_SXS_SECTION_NOT_FOUND = 14000 ERROR_SXS_SETTING_NOT_REGISTERED = 14106 ERROR_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY = 14089 ERROR_SXS_THREAD_QUERIES_DISABLED = 14010 ERROR_SXS_TRANSACTION_CLOSURE_INCOMPLETE = 14107 ERROR_SXS_UNKNOWN_ENCODING = 14013 ERROR_SXS_UNKNOWN_ENCODING_GROUP = 14012 ERROR_SXS_UNTRANSLATABLE_HRESULT = 14077 ERROR_SXS_VERSION_CONFLICT = 14008 ERROR_SXS_WRONG_SECTION_TYPE = 14009 ERROR_SXS_XML_E_BADCHARDATA = 14036 ERROR_SXS_XML_E_BADCHARINSTRING = 14034 ERROR_SXS_XML_E_BADNAMECHAR = 14033 ERROR_SXS_XML_E_BADPEREFINSUBSET = 14059 ERROR_SXS_XML_E_BADSTARTNAMECHAR = 14032 ERROR_SXS_XML_E_BADXMLCASE = 14069 ERROR_SXS_XML_E_BADXMLDECL = 14056 ERROR_SXS_XML_E_COMMENTSYNTAX = 14031 ERROR_SXS_XML_E_DUPLICATEATTRIBUTE = 14053 ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE = 14045 ERROR_SXS_XML_E_EXPECTINGTAGEND = 14038 ERROR_SXS_XML_E_INCOMPLETE_ENCODING = 14043 ERROR_SXS_XML_E_INTERNALERROR = 14041 ERROR_SXS_XML_E_INVALIDATROOTLEVEL = 14055 ERROR_SXS_XML_E_INVALIDENCODING = 14067 ERROR_SXS_XML_E_INVALIDSWITCH = 14068 ERROR_SXS_XML_E_INVALID_DECIMAL = 14047 ERROR_SXS_XML_E_INVALID_HEXIDECIMAL = 14048 ERROR_SXS_XML_E_INVALID_STANDALONE = 14070 ERROR_SXS_XML_E_INVALID_UNICODE = 14049 ERROR_SXS_XML_E_INVALID_VERSION = 14072 ERROR_SXS_XML_E_MISSINGEQUALS = 14073 ERROR_SXS_XML_E_MISSINGQUOTE = 14030 ERROR_SXS_XML_E_MISSINGROOT = 14057 ERROR_SXS_XML_E_MISSINGSEMICOLON = 14039 ERROR_SXS_XML_E_MISSINGWHITESPACE = 14037 ERROR_SXS_XML_E_MISSING_PAREN = 14044 ERROR_SXS_XML_E_MULTIPLEROOTS = 14054 ERROR_SXS_XML_E_MULTIPLE_COLONS = 14046 ERROR_SXS_XML_E_RESERVEDNAMESPACE = 14066 ERROR_SXS_XML_E_UNBALANCEDPAREN = 14040 ERROR_SXS_XML_E_UNCLOSEDCDATA = 14065 ERROR_SXS_XML_E_UNCLOSEDCOMMENT = 14063 ERROR_SXS_XML_E_UNCLOSEDDECL = 14064 ERROR_SXS_XML_E_UNCLOSEDENDTAG = 14061 ERROR_SXS_XML_E_UNCLOSEDSTARTTAG = 14060 ERROR_SXS_XML_E_UNCLOSEDSTRING = 14062 ERROR_SXS_XML_E_UNCLOSEDTAG = 14052 ERROR_SXS_XML_E_UNEXPECTEDENDTAG = 14051 ERROR_SXS_XML_E_UNEXPECTEDEOF = 14058 ERROR_SXS_XML_E_UNEXPECTED_STANDALONE = 14071 ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE = 14042 ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK = 14050 ERROR_SXS_XML_E_XMLDECLSYNTAX = 14035 ERROR_SYMLINK_CLASS_DISABLED = 1463 ERROR_SYMLINK_NOT_SUPPORTED = 1464 ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED = 1274 ERROR_SYSTEM_DEVICE_NOT_FOUND = 15299 ERROR_SYSTEM_NEEDS_REMEDIATION = 15623 ERROR_SYSTEM_TRACE = 150 ERROR_TAG_NOT_FOUND = 2012 ERROR_TAG_NOT_PRESENT = 2013 ERROR_THREAD_1_INACTIVE = 210 ERROR_TIMEOUT = 1460 ERROR_TIME_SKEW = 1398 ERROR_TLW_WITH_WSCHILD = 1406 ERROR_TOKEN_ALREADY_IN_USE = 1375 ERROR_TOO_MANY_CMDS = 56 ERROR_TOO_MANY_CONTEXT_IDS = 1384 ERROR_TOO_MANY_LINKS = 1142 ERROR_TOO_MANY_LUIDS_REQUESTED = 1333 ERROR_TOO_MANY_MODULES = 214 ERROR_TOO_MANY_MUXWAITERS = 152 ERROR_TOO_MANY_NAMES = 68 ERROR_TOO_MANY_OPEN_FILES = 4 ERROR_TOO_MANY_POSTS = 298 ERROR_TOO_MANY_SECRETS = 1381 ERROR_TOO_MANY_SEMAPHORES = 100 ERROR_TOO_MANY_SEM_REQUESTS = 103 ERROR_TOO_MANY_SESS = 69 ERROR_TOO_MANY_SIDS = 1389 ERROR_TOO_MANY_TCBS = 155 ERROR_TRANSFORM_NOT_SUPPORTED = 2004 ERROR_TRANSPORT_FULL = 4328 ERROR_TRAY_MALFUNCTION = 0x00000010 ERROR_TRUSTED_DOMAIN_FAILURE = 1788 ERROR_TRUSTED_RELATIONSHIP_FAILURE = 1789 ERROR_TRUST_FAILURE = 1790 ERROR_UNABLE_TO_CLEAN = 4311 ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA = 4330 ERROR_UNABLE_TO_INVENTORY_DRIVE = 4325 ERROR_UNABLE_TO_INVENTORY_SLOT = 4326 ERROR_UNABLE_TO_INVENTORY_TRANSPORT = 4327 ERROR_UNABLE_TO_LOAD_MEDIUM = 4324 ERROR_UNABLE_TO_LOCK_MEDIA = 1108 ERROR_UNABLE_TO_MOVE_REPLACEMENT = 1176 ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 = 1177 ERROR_UNABLE_TO_REMOVE_REPLACED = 1175 ERROR_UNABLE_TO_UNLOAD_MEDIA = 1109 ERROR_UNEXPECTED_OMID = 4334 ERROR_UNEXP_NET_ERR = 59 ERROR_UNHANDLED_ERROR = 0xFFFFFFFF ERROR_UNIDENTIFIED_ERROR = 1287 ERROR_UNKNOWN_COMPONENT = 1607 ERROR_UNKNOWN_FEATURE = 1606 ERROR_UNKNOWN_PORT = 1796 ERROR_UNKNOWN_PRINTER_DRIVER = 1797 ERROR_UNKNOWN_PRINTPROCESSOR = 1798 ERROR_UNKNOWN_PRINT_MONITOR = 3000 ERROR_UNKNOWN_PRODUCT = 1605 ERROR_UNKNOWN_PROPERTY = 1608 ERROR_UNKNOWN_REVISION = 1305 ERROR_UNMAPPED_SUBSTITUTION_STRING = 14096 ERROR_UNRECOGNIZED_MEDIA = 1785 ERROR_UNRECOGNIZED_VOLUME = 1005 ERROR_UNSUPPORTED_TYPE = 1630 ERROR_USER_APC = 737 ERROR_USER_DELETE_TRUST_QUOTA_EXCEEDED = 1934 ERROR_USER_EXISTS = 1316 ERROR_USER_MAPPED_FILE = 1224 ERROR_VC_DISCONNECTED = 240 ERROR_VDM_DISALLOWED = 1286 ERROR_VOLUME_CONTAINS_SYS_FILES = 4337 ERROR_VOLUME_NOT_SIS_ENABLED = 4500 ERROR_VOLUME_NOT_SUPPORT_EFS = 6014 ERROR_WAIT_1 = 731 ERROR_WAIT_2 = 732 ERROR_WAIT_3 = 733 ERROR_WAIT_63 = 734 ERROR_WAIT_NO_CHILDREN = 128 ERROR_WAKE_SYSTEM = 730 ERROR_WINDOW_NOT_COMBOBOX = 1423 ERROR_WINDOW_NOT_DIALOG = 1420 ERROR_WINDOW_OF_OTHER_THREAD = 1408 ERROR_WINS_INTERNAL = 4000 ERROR_WMI_ALREADY_DISABLED = 4212 ERROR_WMI_ALREADY_ENABLED = 4206 ERROR_WMI_DP_FAILED = 4209 ERROR_WMI_DP_NOT_FOUND = 4204 ERROR_WMI_GUID_DISCONNECTED = 4207 ERROR_WMI_GUID_NOT_FOUND = 4200 ERROR_WMI_INSTANCE_NOT_FOUND = 4201 ERROR_WMI_INVALID_MOF = 4210 ERROR_WMI_INVALID_REGINFO = 4211 ERROR_WMI_ITEMID_NOT_FOUND = 4202 ERROR_WMI_READ_ONLY = 4213 ERROR_WMI_SERVER_UNAVAILABLE = 4208 ERROR_WMI_SET_FAILURE = 4214 ERROR_WMI_TRY_AGAIN = 4203 ERROR_WMI_UNRESOLVED_INSTANCE_REF = 4205 ERROR_WORKING_SET_QUOTA = 1453 ERROR_WRITE_FAULT = 29 ERROR_WRITE_PROTECT = 19 ERROR_WRONG_COMPARTMENT = 1468 ERROR_WRONG_DISK = 34 ERROR_WRONG_EFS = 6005 ERROR_WRONG_PASSWORD = 1323 ERROR_WRONG_TARGET_NAME = 1396 ERROR_XMLDSIG_ERROR = 1466 ERROR_XML_ENCODING_MISMATCH = 14100 ERROR_XML_PARSE_ERROR = 1465 ESB_DISABLE_BOTH = 0x0003 ESB_DISABLE_DOWN = 0x0002 ESB_DISABLE_LEFT = 0x0001 ESB_DISABLE_LTUP = 1 ESB_DISABLE_RIGHT = 0x0002 ESB_DISABLE_RTDN = 2 ESB_DISABLE_UP = 0x0001 ESB_ENABLE_BOTH = 0x0000 ESPIPE = 29 ESRCH = 3 ES_AUTOHSCROLL = 128 ES_AUTOVSCROLL = 64 ES_CENTER = 1 ES_LEFT = 0 ES_LOWERCASE = 16 ES_MULTILINE = 4 ES_NOHIDESEL = 256 ES_NUMBER = 8192 ES_OEMCONVERT = 1024 ES_PASSWORD = 32 ES_READONLY = 2048 ES_RIGHT = 2 ES_UPPERCASE = 8 ES_WANTRETURN = 4096 ETIME = 137 ETIMEDOUT = 138 ETO_CLIPPED = 0x0004 ETO_GLYPH_INDEX = 0x0010 ETO_IGNORELANGUAGE = 0x1000 ETO_NUMERICSLATIN = 0x0800 ETO_NUMERICSLOCAL = 0x0400 ETO_OPAQUE = 0x0002 ETO_PDY = 0x2000 ETO_RTLREADING = 0x0080 ETXTBSY = 139 EU4_EXPR = 2 EU4_IDX = 1 EU4_NONE = 0 EVENPARITY = 2 EVENTLOG_AUDIT_FAILURE = 0x0010 EVENTLOG_AUDIT_SUCCESS = 0x0008 EVENTLOG_BACKWARDS_READ = 0x0008 EVENTLOG_END_ALL_PAIRED_EVENTS = 0x0004 EVENTLOG_END_PAIRED_EVENT = 0x0002 EVENTLOG_ERROR_TYPE = 0x0001 EVENTLOG_FORWARDS_READ = 0x0004 EVENTLOG_FULL_INFO = 0 EVENTLOG_INFORMATION_TYPE = 0x0004 EVENTLOG_PAIRED_EVENT_ACTIVE = 0x0008 EVENTLOG_PAIRED_EVENT_INACTIVE = 0x0010 EVENTLOG_SEEK_READ = 0x0002 EVENTLOG_SEQUENTIAL_READ = 0x0001 EVENTLOG_START_PAIRED_EVENT = 0x0001 EVENTLOG_SUCCESS = 0x0000 EVENTLOG_WARNING_TYPE = 0x0002 EVENT_ALL_ACCESS = 2031619 EVENT_CONSOLE_CARET = 0x4001 EVENT_CONSOLE_END_APPLICATION = 0x4007 EVENT_CONSOLE_LAYOUT = 0x4005 EVENT_CONSOLE_START_APPLICATION = 0x4006 EVENT_CONSOLE_UPDATE_REGION = 0x4002 EVENT_CONSOLE_UPDATE_SCROLL = 0x4004 EVENT_CONSOLE_UPDATE_SIMPLE = 0x4003 EVENT_E_FIRST = 2147746304 EVENT_E_LAST = 2147746335 EVENT_MAX = 0x7FFFFFFF EVENT_MIN = 0x00000001 EVENT_MODIFY_STATE = 0x0002 EVENT_OBJECT_ACCELERATORCHANGE = 0x8012 EVENT_OBJECT_CREATE = 0x8000 EVENT_OBJECT_DEFACTIONCHANGE = 0x8011 EVENT_OBJECT_DESCRIPTIONCHANGE = 0x800D EVENT_OBJECT_DESTROY = 0x8001 EVENT_OBJECT_FOCUS = 0x8005 EVENT_OBJECT_HELPCHANGE = 0x8010 EVENT_OBJECT_HIDE = 0x8003 EVENT_OBJECT_LOCATIONCHANGE = 0x800B EVENT_OBJECT_NAMECHANGE = 0x800C EVENT_OBJECT_PARENTCHANGE = 0x800F EVENT_OBJECT_REORDER = 0x8004 EVENT_OBJECT_SELECTION = 0x8006 EVENT_OBJECT_SELECTIONADD = 0x8007 EVENT_OBJECT_SELECTIONREMOVE = 0x8008 EVENT_OBJECT_SELECTIONWITHIN = 0x8009 EVENT_OBJECT_SHOW = 0x8002 EVENT_OBJECT_STATECHANGE = 0x800A EVENT_OBJECT_VALUECHANGE = 0x800E EVENT_SYSTEM_ALERT = 0x0002 EVENT_SYSTEM_CAPTUREEND = 0x0009 EVENT_SYSTEM_CAPTURESTART = 0x0008 EVENT_SYSTEM_CONTEXTHELPEND = 0x000D EVENT_SYSTEM_CONTEXTHELPSTART = 0x000C EVENT_SYSTEM_DIALOGEND = 0x0011 EVENT_SYSTEM_DIALOGSTART = 0x0010 EVENT_SYSTEM_DRAGDROPEND = 0x000F EVENT_SYSTEM_DRAGDROPSTART = 0x000E EVENT_SYSTEM_FOREGROUND = 0x0003 EVENT_SYSTEM_MENUEND = 0x0005 EVENT_SYSTEM_MENUPOPUPEND = 0x0007 EVENT_SYSTEM_MENUPOPUPSTART = 0x0006 EVENT_SYSTEM_MENUSTART = 0x0004 EVENT_SYSTEM_MINIMIZEEND = 0x0017 EVENT_SYSTEM_MINIMIZESTART = 0x0016 EVENT_SYSTEM_MOVESIZEEND = 0x000B EVENT_SYSTEM_MOVESIZESTART = 0x000A EVENT_SYSTEM_SCROLLINGEND = 0x0013 EVENT_SYSTEM_SCROLLINGSTART = 0x0012 EVENT_SYSTEM_SOUND = 0x0001 EVENT_SYSTEM_SWITCHEND = 0x0015 EVENT_SYSTEM_SWITCHSTART = 0x0014 EVENT_S_FIRST = 262656 EVENT_S_LAST = 262687 EV_BREAK = 0x40 EV_CTS = 0x8 EV_DSR = 0x10 EV_ERR = 0x80 EV_EVENT1 = 0x800 EV_EVENT2 = 0x1000 EV_PERR = 0x200 EV_RING = 0x100 EV_RLSD = 0x20 EV_RX80FULL = 0x400 EV_RXCHAR = 0x1 EV_RXFLAG = 0x2 EV_TXEMPTY = 0x4 EWOULDBLOCK = 140 EWX_ARSO = 0x04000000 EWX_BOOTOPTIONS = 0x01000000 EWX_CHECK_SAFE_FOR_SERVER = 0x08000000 EWX_FORCE = 0x00000004 EWX_FORCEIFHUNG = 0x00000010 EWX_HYBRID_SHUTDOWN = 0x00400000 EWX_LOGOFF = 0x00000000 EWX_POWEROFF = 0x00000008 EWX_QUICKRESOLVE = 0x00000020 EWX_REBOOT = 0x00000002 EWX_SHUTDOWN = 0x00000001 EXCEPTION_COLLIDED_UNWIND = 0x40 EXCEPTION_CONTINUE_EXECUTION = -1 EXCEPTION_CONTINUE_SEARCH = 0 EXCEPTION_DEBUG_EVENT = 1 EXCEPTION_EXECUTE_FAULT = 8 EXCEPTION_EXECUTE_HANDLER = 1 EXCEPTION_EXIT_UNWIND = 0x4 EXCEPTION_MAXIMUM_PARAMETERS = 15 EXCEPTION_NESTED_CALL = 0x10 EXCEPTION_NONCONTINUABLE = 0x1 EXCEPTION_READ_FAULT = 0 EXCEPTION_STACK_INVALID = 0x8 EXCEPTION_TARGET_UNWIND = 0x20 EXCEPTION_UNWIND = 0x66 EXCEPTION_UNWINDING = 0x2 EXCEPTION_WRITE_FAULT = 1 EXCLUDED_TABLE_NUMBER = 2 EXCLUSIVE_LOCK = 4 EXDEV = 18 EXECUTE_OFFLINE_DIAGS = 0xD4 EXIT_FAILURE = 1 EXIT_PROCESS_DEBUG_EVENT = 5 EXIT_SUCCESS = 0 EXIT_THREAD_DEBUG_EVENT = 4 EXPAND_LOCAL_DRIVES = 0 EXPENTRY = 0 EXPORT_PRIVATE_KEYS = 0x4 EXPO_OFFLOAD_FUNC_NAME = "OffloadModExpo" EXPO_OFFLOAD_REG_VALUE = "ExpoOffload" EXPRDUP_REDUCE = 0x0001 EXTENDED_STARTUPINFO_PRESENT = 0x80000 EXTEND_IEPORT = 2 EXTTEXTOUT = 512 EXT_DEVICE_CAPS = 4099 ExceptionCollidedUnwind = 3 ExceptionContinueExecution = 0 ExceptionContinueSearch = 1 ExceptionExecuteHandler = 4 ExceptionNestedException = 2 FACILITY_AAF = 18 FACILITY_ACS = 20 FACILITY_AUDCLNT = 2185 FACILITY_BACKGROUNDCOPY = 32 FACILITY_CERT = 11 FACILITY_COMPLUS = 17 FACILITY_CONFIGURATION = 33 FACILITY_CONTROL = 10 FACILITY_DIRECTORYSERVICE = 37 FACILITY_DISPATCH = 2 FACILITY_DPLAY = 21 FACILITY_HTTP = 25 FACILITY_INTERNET = 12 FACILITY_ITF = 4 FACILITY_MEDIASERVER = 13 FACILITY_METADIRECTORY = 35 FACILITY_MSMQ = 14 FACILITY_NT_BIT = 0x10000000 FACILITY_NULL = 0 FACILITY_RPC = 1 FACILITY_SCARD = 16 FACILITY_SECURITY = 9 FACILITY_SETUPAPI = 15 FACILITY_SSPI = 9 FACILITY_STATE_MANAGEMENT = 34 FACILITY_STORAGE = 3 FACILITY_SXS = 23 FACILITY_UMI = 22 FACILITY_URT = 19 FACILITY_USERMODE_FILTER_MANAGER = 0x1f FACILITY_WIN32 = 7 FACILITY_WINDOWS = 8 FACILITY_WINDOWSUPDATE = 36 FACILITY_WINDOWS_CE = 24 FADF_AUTO = 1 FADF_BSTR = 256 FADF_DISPATCH = 1024 FADF_EMBEDDED = 4 FADF_FIXEDSIZE = 16 FADF_HAVEIID = 64 FADF_HAVEVARTYPE = 128 FADF_RECORD = 32 FADF_RESERVED = 61448 FADF_STATIC = 2 FADF_UNKNOWN = 512 FADF_VARIANT = 2048 FAILED_ACCESS_ACE_FLAG = 128 FAIL_FAST_GENERATE_EXCEPTION_ADDRESS = 0x1 FAIL_FAST_NO_HARD_ERROR_DLG = 0x2 FALSE = 0 FALT = 0x10 FAPPCOMMAND_KEY = 0 FAPPCOMMAND_MASK = 0xF000 FAPPCOMMAND_MOUSE = 0x8000 FAPPCOMMAND_OEM = 0x1000 FAR = 0 FARSTRUCT = 0 FASTCALL = 0 FAST_FAIL_CORRUPT_LIST_ENTRY = 3 FAST_FAIL_FATAL_APP_EXIT = 7 FAST_FAIL_GS_COOKIE_INIT = 6 FAST_FAIL_INCORRECT_STACK = 4 FAST_FAIL_INVALID_ARG = 5 FAST_FAIL_INVALID_FAST_FAIL_CODE = 0xffffffff FAST_FAIL_LEGACY_GS_VIOLATION = 0 FAST_FAIL_RANGE_CHECK_FAILURE = 8 FAST_FAIL_STACK_COOKIE_CHECK_FAILURE = 2 FAST_FAIL_UNSAFE_REGISTRY_ACCESS = 9 FAST_FAIL_VTGUARD_CHECK_FAILURE = 1 FCONTROL = 0x08 FD_ACCEPT = 0x08 FD_CLOSE = 0x20 FD_CONNECT = 0x10 FD_OOB = 0x04 FD_READ = 0x01 FD_SETSIZE = 64 FD_WRITE = 0x02 FEATURESETTING_CUSTPAPER = 3 FEATURESETTING_MIRROR = 4 FEATURESETTING_NEGATIVE = 5 FEATURESETTING_NUP = 0 FEATURESETTING_OUTPUT = 1 FEATURESETTING_PRIVATE_BEGIN = 0x1000 FEATURESETTING_PRIVATE_END = 0x1FFF FEATURESETTING_PROTOCOL = 6 FEATURESETTING_PSLEVEL = 2 FE_FONTSMOOTHINGCLEARTYPE = 0x0002 FE_FONTSMOOTHINGDOCKING = 0x8000 FE_FONTSMOOTHINGORIENTATIONBGR = 0x0000 FE_FONTSMOOTHINGORIENTATIONRGB = 0x0001 FE_FONTSMOOTHINGSTANDARD = 0x0001 FF_DECORATIVE = 80 FF_DONTCARE = 0 FF_MODERN = 48 FF_ROMAN = 16 FF_SCRIPT = 64 FF_SWISS = 32 FIBER_FLAG_FLOAT_SWITCH = 0x1 FIEF_FLAG_FORCE_JITUI = 0x1 FIEF_FLAG_PEEK = 0x2 FIEF_FLAG_SKIP_INSTALLED_VERSION_CHECK = 0x4 FILENAME_MAX = 260 FILEOKSTRINGA = "commdlg_FileNameOK" FILEOPENORD = 1536 FILESYSTEM_STATISTICS_TYPE_FAT = 2 FILESYSTEM_STATISTICS_TYPE_NTFS = 1 FILE_ACTION_ADDED = 0x00000001 FILE_ACTION_MODIFIED = 0x00000003 FILE_ACTION_REMOVED = 0x00000002 FILE_ACTION_RENAMED_NEW_NAME = 0x00000005 FILE_ACTION_RENAMED_OLD_NAME = 0x00000004 FILE_ADD_FILE = 2 FILE_ADD_SUBDIRECTORY = 4 FILE_ALL_ACCESS = 2032127 FILE_ANY_ACCESS = 0 FILE_APPEND_DATA = 4 FILE_ATTRIBUTE_ARCHIVE = 0x00000020 FILE_ATTRIBUTE_COMPRESSED = 0x00000800 FILE_ATTRIBUTE_DEVICE = 0x00000040 FILE_ATTRIBUTE_DIRECTORY = 0x00000010 FILE_ATTRIBUTE_ENCRYPTED = 0x00004000 FILE_ATTRIBUTE_HIDDEN = 0x00000002 FILE_ATTRIBUTE_MASK = 262135 FILE_ATTRIBUTE_NORMAL = 0x00000080 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000 FILE_ATTRIBUTE_OFFLINE = 0x00001000 FILE_ATTRIBUTE_READONLY = 0x00000001 FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200 FILE_ATTRIBUTE_SYSTEM = 0x00000004 FILE_ATTRIBUTE_TEMPORARY = 0x00000100 FILE_ATTRIBUTE_VIRTUAL = 0x00010000 FILE_BEGIN = 0 FILE_CACHE_FLAGS_DEFINED = 0 FILE_CACHE_MAX_HARD_DISABLE = 0x00000002 FILE_CACHE_MAX_HARD_ENABLE = 0x00000001 FILE_CACHE_MIN_HARD_DISABLE = 0x00000008 FILE_CACHE_MIN_HARD_ENABLE = 0x00000004 FILE_CASE_PRESERVED_NAMES = 0x00000002 FILE_CASE_SENSITIVE_SEARCH = 0x00000001 FILE_CLEAR_ENCRYPTION = 0x00000002 FILE_COMPLETE_IF_OPLOCKED = 0x00000100 FILE_CREATE = 0x00000002 FILE_CREATE_PIPE_INSTANCE = 4 FILE_CREATE_TREE_CONNECTION = 0x00000080 FILE_CURRENT = 1 FILE_DELETE_CHILD = 64 FILE_DELETE_ON_CLOSE = 0x00001000 FILE_DEVICE_8042_PORT = 0x00000027 FILE_DEVICE_ACPI = 0x00000032 FILE_DEVICE_BATTERY = 0x00000029 FILE_DEVICE_BEEP = 0x00000001 FILE_DEVICE_BIOMETRIC = 0x00000044 FILE_DEVICE_BLUETOOTH = 0x00000041 FILE_DEVICE_BUS_EXTENDER = 0x0000002a FILE_DEVICE_CD_ROM = 0x00000002 FILE_DEVICE_CD_ROM_FILE_SYSTEM = 0x00000003 FILE_DEVICE_CHANGER = 0x00000030 FILE_DEVICE_CONSOLE = 0x00000050 FILE_DEVICE_CONTROLLER = 0x00000004 FILE_DEVICE_CRYPT_PROVIDER = 0x0000003F FILE_DEVICE_DATALINK = 0x00000005 FILE_DEVICE_DEVAPI = 0x00000047 FILE_DEVICE_DFS = 0x00000006 FILE_DEVICE_DFS_FILE_SYSTEM = 0x00000035 FILE_DEVICE_DFS_VOLUME = 0x00000036 FILE_DEVICE_DISK = 0x00000007 FILE_DEVICE_DISK_FILE_SYSTEM = 0x00000008 FILE_DEVICE_DVD = 0x00000033 FILE_DEVICE_EHSTOR = 0x00000046 FILE_DEVICE_FILE_SYSTEM = 0x00000009 FILE_DEVICE_FIPS = 0x0000003A FILE_DEVICE_FULLSCREEN_VIDEO = 0x00000034 FILE_DEVICE_GPIO = 0x00000048 FILE_DEVICE_HOLOGRAPHIC = 0x0000005b FILE_DEVICE_INFINIBAND = 0x0000003B FILE_DEVICE_INPORT_PORT = 0x0000000a FILE_DEVICE_KEYBOARD = 0x0000000b FILE_DEVICE_KS = 0x0000002f FILE_DEVICE_KSEC = 0x00000039 FILE_DEVICE_MAILSLOT = 0x0000000c FILE_DEVICE_MASS_STORAGE = 0x0000002d FILE_DEVICE_MIDI_IN = 0x0000000d FILE_DEVICE_MIDI_OUT = 0x0000000e FILE_DEVICE_MODEM = 0x0000002b FILE_DEVICE_MOUSE = 0x0000000f FILE_DEVICE_MT_COMPOSITE = 0x00000042 FILE_DEVICE_MT_TRANSPORT = 0x00000043 FILE_DEVICE_MULTI_UNC_PROVIDER = 0x00000010 FILE_DEVICE_NAMED_PIPE = 0x00000011 FILE_DEVICE_NETWORK = 0x00000012 FILE_DEVICE_NETWORK_BROWSER = 0x00000013 FILE_DEVICE_NETWORK_FILE_SYSTEM = 0x00000014 FILE_DEVICE_NETWORK_REDIRECTOR = 0x00000028 FILE_DEVICE_NFP = 0x00000051 FILE_DEVICE_NULL = 0x00000015 FILE_DEVICE_NVDIMM = 0x0000005a FILE_DEVICE_PARALLEL_PORT = 0x00000016 FILE_DEVICE_PERSISTENT_MEMORY = 0x00000059 FILE_DEVICE_PHYSICAL_NETCARD = 0x00000017 FILE_DEVICE_PMI = 0x00000045 FILE_DEVICE_POINT_OF_SERVICE = 0x00000054 FILE_DEVICE_PRINTER = 0x00000018 FILE_DEVICE_SCANNER = 0x00000019 FILE_DEVICE_SCREEN = 0x0000001c FILE_DEVICE_SDFXHCI = 0x0000005c FILE_DEVICE_SERENUM = 0x00000037 FILE_DEVICE_SERIAL_MOUSE_PORT = 0x0000001a FILE_DEVICE_SERIAL_PORT = 0x0000001b FILE_DEVICE_SMARTCARD = 0x00000031 FILE_DEVICE_SMB = 0x0000002e FILE_DEVICE_SOUND = 0x0000001d FILE_DEVICE_STORAGE_REPLICATION = 0x00000055 FILE_DEVICE_STREAMS = 0x0000001e FILE_DEVICE_SYSENV = 0x00000052 FILE_DEVICE_TAPE = 0x0000001f FILE_DEVICE_TAPE_FILE_SYSTEM = 0x00000020 FILE_DEVICE_TERMSRV = 0x00000038 FILE_DEVICE_TRANSPORT = 0x00000021 FILE_DEVICE_TRUST_ENV = 0x00000056 FILE_DEVICE_UCM = 0x00000057 FILE_DEVICE_UCMTCPCI = 0x00000058 FILE_DEVICE_UCMUCSI = 0x0000005d FILE_DEVICE_UNKNOWN = 0x00000022 FILE_DEVICE_USBEX = 0x00000049 FILE_DEVICE_VDM = 0x0000002c FILE_DEVICE_VIDEO = 0x00000023 FILE_DEVICE_VIRTUAL_BLOCK = 0x00000053 FILE_DEVICE_VIRTUAL_DISK = 0x00000024 FILE_DEVICE_VMBUS = 0x0000003E FILE_DEVICE_WAVE_IN = 0x00000025 FILE_DEVICE_WAVE_OUT = 0x00000026 FILE_DEVICE_WPD = 0x00000040 FILE_DIRECTORY_FILE = 0x00000001 FILE_DIR_DISALLOWED = 9 FILE_ENCRYPTABLE = 0 FILE_END = 2 FILE_EXECUTE = 32 FILE_FILE_COMPRESSION = 0x00000010 FILE_FLAG_BACKUP_SEMANTICS = 0x2000000 FILE_FLAG_DELETE_ON_CLOSE = 0x4000000 FILE_FLAG_FIRST_PIPE_INSTANCE = 0x80000 FILE_FLAG_MASK = 4282122240 FILE_FLAG_NO_BUFFERING = 0x20000000 FILE_FLAG_OPEN_NO_RECALL = 0x100000 FILE_FLAG_OPEN_REPARSE_POINT = 0x200000 FILE_FLAG_OVERLAPPED = 0x40000000 FILE_FLAG_POSIX_SEMANTICS = 0x1000000 FILE_FLAG_RANDOM_ACCESS = 0x10000000 FILE_FLAG_SEQUENTIAL_SCAN = 0x8000000 FILE_FLAG_SESSION_AWARE = 0x800000 FILE_FLAG_WRITE_THROUGH = 0x80000000 FILE_GENERIC_EXECUTE = 1179808 FILE_GENERIC_READ = 1179785 FILE_GENERIC_WRITE = 1179926 FILE_IS_ENCRYPTED = 1 FILE_LIST_DIRECTORY = 1 FILE_MAP_ALL_ACCESS = 983071 FILE_MAP_COPY = 0x1 FILE_MAP_EXECUTE = 32 FILE_MAP_LARGE_PAGES = 0x20000000 FILE_MAP_READ = 4 FILE_MAP_RESERVE = 0x80000000 FILE_MAP_TARGETS_INVALID = 0x40000000 FILE_MAP_WRITE = 2 FILE_MAXIMUM_DISPOSITION = 0x00000005 FILE_NAMED_STREAMS = 0x00040000 FILE_NAME_NORMALIZED = 0x0 FILE_NAME_OPENED = 0x8 FILE_NON_DIRECTORY_FILE = 0x00000040 FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004 FILE_NOTIFY_CHANGE_CREATION = 0x00000040 FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002 FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001 FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020 FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010 FILE_NOTIFY_CHANGE_SECURITY = 0x00000100 FILE_NOTIFY_CHANGE_SIZE = 0x00000008 FILE_NO_COMPRESSION = 0x00008000 FILE_NO_EA_KNOWLEDGE = 0x00000200 FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008 FILE_OPEN = 0x00000001 FILE_OPEN_BY_FILE_ID = 0x00002000 FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000 FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000 FILE_OPEN_IF = 0x00000003 FILE_OPEN_NO_RECALL = 0x00400000 FILE_OPEN_REMOTE_INSTANCE = 0x00000400 FILE_OPEN_REPARSE_POINT = 0x00200000 FILE_OVERWRITE = 0x00000004 FILE_OVERWRITE_IF = 0x00000005 FILE_PERSISTENT_ACLS = 0x00000008 FILE_PREFETCH_TYPE_FOR_CREATE = 0x1 FILE_RANDOM_ACCESS = 0x00000800 FILE_READ_ACCESS = 1 FILE_READ_ATTRIBUTES = 128 FILE_READ_DATA = 1 FILE_READ_EA = 8 FILE_READ_ONLY = 8 FILE_READ_ONLY_VOLUME = 0x00080000 FILE_RESERVE_OPFILTER = 0x00100000 FILE_ROOT_DIR = 3 FILE_SEQUENTIAL_ONLY = 0x00000004 FILE_SEQUENTIAL_WRITE_ONCE = 0x00100000 FILE_SET_ENCRYPTION = 0x00000001 FILE_SHARE_DELETE = 0x00000004 FILE_SHARE_READ = 0x00000001 FILE_SHARE_VALID_FLAGS = 0x00000007 FILE_SHARE_WRITE = 0x00000002 FILE_SPECIAL_ACCESS = 0 FILE_SUPERSEDE = 0x00000000 FILE_SUPPORTS_ENCRYPTION = 0x00020000 FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000 FILE_SUPPORTS_HARD_LINKS = 0x00400000 FILE_SUPPORTS_INTEGRITY_STREAMS = 0x04000000 FILE_SUPPORTS_OBJECT_IDS = 0x00010000 FILE_SUPPORTS_OPEN_BY_FILE_ID = 0x01000000 FILE_SUPPORTS_REMOTE_STORAGE = 0x00000100 FILE_SUPPORTS_REPARSE_POINTS = 0x00000080 FILE_SUPPORTS_SPARSE_FILES = 0x00000040 FILE_SUPPORTS_TRANSACTIONS = 0x00200000 FILE_SUPPORTS_USN_JOURNAL = 0x02000000 FILE_SYNCHRONOUS_IO_ALERT = 0x00000010 FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020 FILE_SYSTEM_ATTR = 2 FILE_SYSTEM_DIR = 4 FILE_SYSTEM_NOT_SUPPORT = 6 FILE_TRAVERSE = 32 FILE_TYPE_CHAR = 0x2 FILE_TYPE_DISK = 0x1 FILE_TYPE_PIPE = 0x3 FILE_TYPE_REMOTE = 0x8000 FILE_TYPE_UNKNOWN = 0x0 FILE_UNICODE_ON_DISK = 0x00000004 FILE_UNKNOWN = 5 FILE_USER_DISALLOWED = 7 FILE_VER_GET_LOCALISED = 0x01 FILE_VER_GET_NEUTRAL = 0x02 FILE_VER_GET_PREFETCHED = 0x04 FILE_VOLUME_IS_COMPRESSED = 0x00008000 FILE_VOLUME_QUOTAS = 0x00000020 FILE_WRITE_ACCESS = 2 FILE_WRITE_ATTRIBUTES = 256 FILE_WRITE_DATA = 2 FILE_WRITE_EA = 16 FILE_WRITE_THROUGH = 0x00000002 FINDDLGORD = 1540 FINDMSGSTRINGA = "commdlg_FindReplace" FIND_ACTCTX_SECTION_KEY_RETURN_ASSEMBLY_METADATA = 4 FIND_ACTCTX_SECTION_KEY_RETURN_FLAGS = 2 FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX = 1 FIND_ENDSWITH = 0x00200000 FIND_FIRST_EX_CASE_SENSITIVE = 0x00000001 FIND_FIRST_EX_LARGE_FETCH = 0x00000002 FIND_FROMEND = 0x00800000 FIND_FROMSTART = 0x00400000 FIND_RESOURCE_DIRECTORY_LANGUAGES = 1024 FIND_RESOURCE_DIRECTORY_NAMES = 512 FIND_RESOURCE_DIRECTORY_TYPES = 256 FIND_STARTSWITH = 0x00100000 FIRMWARE_PTR = 0 FIXED_PITCH = 1 FKF_AVAILABLE = 0x00000002 FKF_CLICKON = 0x00000040 FKF_CONFIRMHOTKEY = 0x00000008 FKF_FILTERKEYSON = 0x00000001 FKF_HOTKEYACTIVE = 0x00000004 FKF_HOTKEYSOUND = 0x00000010 FKF_INDICATOR = 0x00000020 FLAG_SIGNED = 1 FLAG_STRING = 4 FLASHW_ALL = 3 FLASHW_CAPTION = 0x00000001 FLASHW_STOP = 0 FLASHW_TIMER = 0x00000004 FLASHW_TIMERNOFG = 0x0000000c FLASHW_TRAY = 0x00000002 FLI_GLYPHS = 262144 FLI_MASK = 0x103B FLOODFILLBORDER = 0 FLOODFILLSURFACE = 1 FLS_MAXIMUM_AVAILABLE = 128 FLUSHOUTPUT = 6 FMFD_DEFAULT = 0x0 FMFD_RESPECTTEXTPLAIN = 0x10 FMFD_RETURNUPDATEDIMGMIMES = 0x20 FMFD_SERVERMIME = 0x8 FMFD_URLASFILENAME = 0x1 FNERR_BUFFERTOOSMALL = 0x3003 FNERR_FILENAMECODES = 0x3000 FNERR_INVALIDFILENAME = 0x3002 FNERR_SUBCLASSFAILURE = 0x3001 FNOINVERT = 0x02 FOCUS_EVENT = 0x10 FOF_ALLOWUNDO = 0x40 FOF_CONFIRMMOUSE = 0x2 FOF_FILESONLY = 0x80 FOF_MULTIDESTFILES = 0x1 FOF_NOCONFIRMATION = 0x10 FOF_NOCONFIRMMKDIR = 0x200 FOF_NOCOPYSECURITYATTRIBS = 0x800 FOF_NOERRORUI = 0x400 FOF_NORECURSEREPARSE = 0x8000 FOF_NORECURSION = 0x1000 FOF_NO_CONNECTED_ELEMENTS = 0x2000 FOF_NO_UI = 1556 FOF_RENAMEONCOLLISION = 0x8 FOF_SILENT = 0x4 FOF_SIMPLEPROGRESS = 0x100 FOF_WANTMAPPINGHANDLE = 0x20 FOF_WANTNUKEWARNING = 0x4000 FONTDLGORD = 1542 FONTMAPPER_MAX = 10 FOPEN_MAX = 20 FOREGROUND_BLUE = 0x1 FOREGROUND_GREEN = 0x2 FOREGROUND_INTENSITY = 0x8 FOREGROUND_RED = 0x4 FOREST_USER_RID_MAX = 499 FORMATDLGORD30 = 1544 FORMATDLGORD31 = 1543 FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100 FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000 FORMAT_MESSAGE_FROM_HMODULE = 0x00000800 FORMAT_MESSAGE_FROM_STRING = 0x00000400 FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000 FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200 FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000ff FORM_BUILTIN = 0x00000001 FORM_PRINTER = 0x00000002 FORM_USER = 0x00000000 FO_COPY = 0x2 FO_DELETE = 0x3 FO_MOVE = 0x1 FO_RENAME = 0x4 FP_INFINITE = 1280 FP_NAN = 0x0100 FP_NDENORM = 16 FP_NINF = 4 FP_NNORM = 8 FP_NORMAL = 0x0400 FP_NZERO = 32 FP_PDENORM = 128 FP_PINF = 512 FP_PNORM = 256 FP_PZERO = 64 FP_QNAN = 2 FP_SNAN = 1 FP_SUBNORMAL = 17408 FP_ZERO = 0x4000 FRAME_FPO = 0 FRAME_NONFPO = 3 FRAME_TRAP = 1 FRAME_TSS = 2 FRERR_BUFFERLENGTHZERO = 0x4001 FRERR_FINDREPLACECODES = 0x4000 FROM_LEFT_1ST_BUTTON_PRESSED = 0x1 FROM_LEFT_2ND_BUTTON_PRESSED = 0x4 FROM_LEFT_3RD_BUTTON_PRESSED = 0x8 FROM_LEFT_4TH_BUTTON_PRESSED = 0x10 FRS_ERR_AUTHENTICATION = 8008 FRS_ERR_CHILD_TO_PARENT_COMM = 8011 FRS_ERR_INSUFFICIENT_PRIV = 8007 FRS_ERR_INTERNAL = 8005 FRS_ERR_INTERNAL_API = 8004 FRS_ERR_INVALID_API_SEQUENCE = 8001 FRS_ERR_INVALID_SERVICE_PARAMETER = 8017 FRS_ERR_PARENT_AUTHENTICATION = 8010 FRS_ERR_PARENT_INSUFFICIENT_PRIV = 8009 FRS_ERR_PARENT_TO_CHILD_COMM = 8012 FRS_ERR_SERVICE_COMM = 8006 FRS_ERR_STARTING_SERVICE = 8002 FRS_ERR_STOPPING_SERVICE = 8003 FRS_ERR_SYSVOL_DEMOTE = 8016 FRS_ERR_SYSVOL_IS_BUSY = 8015 FRS_ERR_SYSVOL_POPULATE = 8013 FRS_ERR_SYSVOL_POPULATE_TIMEOUT = 8014 FR_DIALOGTERM = 0x40 FR_DOWN = 0x1 FR_ENABLEHOOK = 0x100 FR_ENABLETEMPLATE = 0x200 FR_ENABLETEMPLATEHANDLE = 0x2000 FR_FINDNEXT = 0x8 FR_HIDEMATCHCASE = 0x8000 FR_HIDEUPDOWN = 0x4000 FR_HIDEWHOLEWORD = 0x10000 FR_MATCHALEFHAMZA = 0x80000000 FR_MATCHCASE = 0x4 FR_MATCHDIAC = 0x20000000 FR_MATCHKASHIDA = 0x40000000 FR_NOMATCHCASE = 0x800 FR_NOT_ENUM = 0x20 FR_NOUPDOWN = 0x400 FR_NOWHOLEWORD = 0x1000 FR_PRIVATE = 0x10 FR_RAW = 0x20000 FR_REPLACE = 0x10 FR_REPLACEALL = 0x20 FR_SHOWHELP = 0x80 FR_WHOLEWORD = 0x2 FSCTL_ALLOW_EXTENDED_DASD_IO = 589955 FSCTL_CREATE_OR_GET_OBJECT_ID = 590016 FSCTL_CREATE_USN_JOURNAL = 590055 FSCTL_DELETE_OBJECT_ID = 589984 FSCTL_DELETE_REPARSE_POINT = 589996 FSCTL_DELETE_USN_JOURNAL = 590072 FSCTL_DISMOUNT_VOLUME = 589856 FSCTL_ENCRYPTION_FSCTL_IO = 590043 FSCTL_ENUM_USN_DATA = 590003 FSCTL_EXTEND_VOLUME = 590064 FSCTL_FILESYSTEM_GET_STATISTICS = 589920 FSCTL_FILE_PREFETCH = 590112 FSCTL_FIND_FILES_BY_SID = 589967 FSCTL_GET_COMPRESSION = 589884 FSCTL_GET_NTFS_FILE_RECORD = 589928 FSCTL_GET_NTFS_VOLUME_DATA = 589924 FSCTL_GET_OBJECT_ID = 589980 FSCTL_GET_REPARSE_POINT = 589992 FSCTL_GET_RETRIEVAL_POINTERS = 589939 FSCTL_GET_VOLUME_BITMAP = 589935 FSCTL_HSM_DATA = 639251 FSCTL_HSM_MSG = 639240 FSCTL_INVALIDATE_VOLUMES = 589908 FSCTL_IS_PATHNAME_VALID = 589868 FSCTL_IS_VOLUME_DIRTY = 589944 FSCTL_IS_VOLUME_MOUNTED = 589864 FSCTL_LOCK_VOLUME = 589848 FSCTL_MARK_AS_SYSTEM_HIVE = 589903 FSCTL_MARK_HANDLE = 590076 FSCTL_MARK_VOLUME_DIRTY = 589872 FSCTL_MOVE_FILE = 589940 FSCTL_OPBATCH_ACK_CLOSE_PENDING = 589840 FSCTL_OPLOCK_BREAK_ACKNOWLEDGE = 589836 FSCTL_OPLOCK_BREAK_ACK_NO_2 = 589904 FSCTL_OPLOCK_BREAK_NOTIFY = 589844 FSCTL_QUERY_ALLOCATED_RANGES = 606415 FSCTL_QUERY_FAT_BPB = 589912 FSCTL_QUERY_RETRIEVAL_POINTERS = 589883 FSCTL_QUERY_USN_JOURNAL = 590068 FSCTL_READ_FILE_USN_DATA = 590059 FSCTL_READ_FROM_PLEX = 606494 FSCTL_READ_RAW_ENCRYPTED = 590051 FSCTL_READ_USN_JOURNAL = 590011 FSCTL_RECALL_FILE = 590103 FSCTL_REQUEST_BATCH_OPLOCK = 589832 FSCTL_REQUEST_FILTER_OPLOCK = 589916 FSCTL_REQUEST_OPLOCK_LEVEL_1 = 589824 FSCTL_REQUEST_OPLOCK_LEVEL_2 = 589828 FSCTL_SECURITY_ID_CHECK = 606391 FSCTL_SET_COMPRESSION = 639040 FSCTL_SET_ENCRYPTION = 590039 FSCTL_SET_OBJECT_ID = 589976 FSCTL_SET_OBJECT_ID_EXTENDED = 590012 FSCTL_SET_REPARSE_POINT = 589988 FSCTL_SET_SPARSE = 590020 FSCTL_SET_ZERO_DATA = 622792 FSCTL_SIS_COPYFILE = 590080 FSCTL_SIS_LINK_FILES = 639236 FSCTL_UNLOCK_VOLUME = 589852 FSCTL_WRITE_RAW_ENCRYPTED = 590047 FSCTL_WRITE_USN_CLOSE_RECORD = 590063 FSHIFT = 0x04 FS_ARABIC = 64 FS_BALTIC = 128 FS_CASE_IS_PRESERVED = 2 FS_CASE_SENSITIVE = 1 FS_CHINESESIMP = 262144 FS_CHINESETRAD = 1048576 FS_CYRILLIC = 4 FS_FILE_COMPRESSION = 16 FS_FILE_ENCRYPTION = 131072 FS_GREEK = 8 FS_HEBREW = 32 FS_JISJAPAN = 131072 FS_JOHAB = 2097152 FS_LATIN1 = 1 FS_LATIN2 = 2 FS_PERSISTENT_ACLS = 8 FS_SYMBOL = 2147483648 FS_THAI = 65536 FS_TURKISH = 16 FS_UNICODE_STORED_ON_DISK = 4 FS_VIETNAMESE = 256 FS_VOL_IS_COMPRESSED = 32768 FS_WANSUNG = 524288 FTS5CSR_EOF = 0x01 FTS5CSR_FREE_ZRANK = 0x10 FTS5CSR_REQUIRE_CONTENT = 0x02 FTS5CSR_REQUIRE_DOCSIZE = 0x04 FTS5CSR_REQUIRE_INST = 0x08 FTS5CSR_REQUIRE_POSLIST = 0x40 FTS5CSR_REQUIRE_RESEEK = 0x20 FTS5INDEX_QUERY_DESC = 0x0002 FTS5INDEX_QUERY_NOOUTPUT = 0x0020 FTS5INDEX_QUERY_PREFIX = 0x0001 FTS5INDEX_QUERY_SCAN = 0x0008 FTS5INDEX_QUERY_SKIPEMPTY = 0x0010 FTS5INDEX_QUERY_TEST_NOIDX = 0x0004 FTS5_AND = 2 FTS5_AVERAGES_ROWID = 1 FTS5_BI_MATCH = 0x0001 FTS5_BI_ORDER_DESC = 0x0080 FTS5_BI_ORDER_RANK = 0x0020 FTS5_BI_ORDER_ROWID = 0x0040 FTS5_BI_RANK = 0x0002 FTS5_BI_ROWID_EQ = 0x0004 FTS5_BI_ROWID_GE = 0x0010 FTS5_BI_ROWID_LE = 0x0008 FTS5_CARET = 12 FTS5_COLON = 5 FTS5_COMMA = 13 FTS5_CONTENT_EXTERNAL = 2 FTS5_CONTENT_NONE = 1 FTS5_CONTENT_NORMAL = 0 FTS5_CORRUPT = 267 FTS5_CURRENT_VERSION = 4 FTS5_DATA_DLI_B = 1 FTS5_DATA_HEIGHT_B = 5 FTS5_DATA_ID_B = 16 FTS5_DATA_PADDING = 20 FTS5_DATA_PAGE_B = 31 FTS5_DATA_ZERO_PADDING = 8 FTS5_DEFAULT_AUTOMERGE = 4 FTS5_DEFAULT_CRISISMERGE = 16 FTS5_DEFAULT_HASHSIZE = 1048576 FTS5_DEFAULT_NEARDIST = 10 FTS5_DEFAULT_PAGE_SIZE = 4050 FTS5_DEFAULT_RANK = "bm25" FTS5_DEFAULT_USERMERGE = 4 FTS5_DETAIL_COLUMNS = 2 FTS5_DETAIL_FULL = 0 FTS5_DETAIL_NONE = 1 FTS5_EOF = 0 FTS5_LCP = 7 FTS5_LP = 10 FTS5_MAIN_PREFIX = 48 FTS5_MAX_LEVEL = 64 FTS5_MAX_PAGE_SIZE = 65536 FTS5_MAX_PREFIX_INDEXES = 31 FTS5_MAX_SEGMENT = 2000 FTS5_MAX_TOKEN_SIZE = 32768 FTS5_MERGE_NLIST = 16 FTS5_MINUS = 6 FTS5_MIN_DLIDX_SIZE = 4 FTS5_NOT = 3 FTS5_OPT_WORK_UNIT = 1000 FTS5_OR = 1 FTS5_PATTERN_GLOB = 66 FTS5_PATTERN_LIKE = 65 FTS5_PATTERN_NONE = 0 FTS5_PLAN_MATCH = 1 FTS5_PLAN_ROWID = 6 FTS5_PLAN_SCAN = 5 FTS5_PLAN_SORTED_MATCH = 4 FTS5_PLAN_SOURCE = 2 FTS5_PLAN_SPECIAL = 3 FTS5_PLUS = 14 FTS5_PORTER_MAX_TOKEN = 64 FTS5_RANK_NAME = "rank" FTS5_RCP = 8 FTS5_REMOVE_DIACRITICS_COMPLEX = 2 FTS5_REMOVE_DIACRITICS_NONE = 0 FTS5_REMOVE_DIACRITICS_SIMPLE = 1 FTS5_ROWID_NAME = "rowid" FTS5_RP = 11 FTS5_SEGITER_ONETERM = 0x01 FTS5_SEGITER_REVERSE = 0x02 FTS5_STAR = 15 FTS5_STMT_DELETE_CONTENT = 5 FTS5_STMT_DELETE_DOCSIZE = 7 FTS5_STMT_INSERT_CONTENT = 3 FTS5_STMT_LOOKUP = 2 FTS5_STMT_LOOKUP_DOCSIZE = 8 FTS5_STMT_REPLACE_CONFIG = 9 FTS5_STMT_REPLACE_CONTENT = 4 FTS5_STMT_REPLACE_DOCSIZE = 6 FTS5_STMT_SCAN = 10 FTS5_STMT_SCAN_ASC = 0 FTS5_STMT_SCAN_DESC = 1 FTS5_STRING = 9 FTS5_STRUCTURE_ROWID = 10 FTS5_TERM = 4 FTS5_TOKENIZE_AUX = 0x0008 FTS5_TOKENIZE_DOCUMENT = 0x0004 FTS5_TOKENIZE_PREFIX = 0x0002 FTS5_TOKENIZE_QUERY = 0x0001 FTS5_TOKEN_COLOCATED = 0x0001 FTS5_VOCAB_COL = 0 FTS5_VOCAB_COL_SCHEMA = "term, col, doc, cnt" FTS5_VOCAB_INSTANCE = 2 FTS5_VOCAB_INST_SCHEMA = "term, doc, col, offset" FTS5_VOCAB_ROW = 1 FTS5_VOCAB_ROW_SCHEMA = "term, doc, cnt" FTS5_VOCAB_TERM_EQ = 0x01 FTS5_VOCAB_TERM_GE = 0x02 FTS5_VOCAB_TERM_LE = 0x04 FTS5_WORK_UNIT = 64 FULLY_WITHIN = 2 FUNC_PERFECT_MATCH = 6 FVIRTKEY = 1 FW_BLACK = 900 FW_BOLD = 700 FW_DEMIBOLD = 600 FW_DONTCARE = 0 FW_EXTRABOLD = 800 FW_EXTRALIGHT = 200 FW_HEAVY = 900 FW_LIGHT = 300 FW_MEDIUM = 500 FW_NORMAL = 400 FW_REGULAR = 400 FW_SEMIBOLD = 600 FW_THIN = 100 FW_ULTRABOLD = 800 FW_ULTRALIGHT = 200 GA_PARENT = 1 GA_ROOT = 2 GA_ROOTOWNER = 3 GB2312_CHARSET = 134 GCC_VERSION = 10000000 GCLP_HBRBACKGROUND = -10 GCLP_HCURSOR = -12 GCLP_HICON = -14 GCLP_HICONSM = -34 GCLP_HMODULE = -16 GCLP_MENUNAME = -8 GCLP_WNDPROC = -24 GCL_CBCLSEXTRA = -20 GCL_CBWNDEXTRA = -18 GCL_CONVERSION = 0x0001 GCL_REVERSECONVERSION = 0x0002 GCL_REVERSE_LENGTH = 0x0003 GCL_STYLE = -26 GCPCLASS_ARABIC = 2 GCPCLASS_HEBREW = 2 GCPCLASS_LATIN = 1 GCPCLASS_LATINNUMBER = 5 GCPCLASS_LATINNUMERICSEPARATOR = 7 GCPCLASS_LATINNUMERICTERMINATOR = 6 GCPCLASS_LOCALNUMBER = 4 GCPCLASS_NEUTRAL = 3 GCPCLASS_NUMERICSEPARATOR = 8 GCPCLASS_POSTBOUNDLTR = 0x20 GCPCLASS_POSTBOUNDRTL = 0x10 GCPCLASS_PREBOUNDLTR = 0x80 GCPCLASS_PREBOUNDRTL = 0x40 GCPGLYPH_LINKAFTER = 0x4000 GCPGLYPH_LINKBEFORE = 0x8000 GCP_CLASSIN = 524288 GCP_DBCS = 0x0001 GCP_DIACRITIC = 0x0100 GCP_DISPLAYZWG = 4194304 GCP_ERROR = 0x8000 GCP_GLYPHSHAPE = 0x0010 GCP_JUSTIFY = 65536 GCP_JUSTIFYIN = 2097152 GCP_KASHIDA = 0x0400 GCP_LIGATE = 0x0020 GCP_MAXEXTENT = 1048576 GCP_NEUTRALOVERRIDE = 33554432 GCP_NUMERICOVERRIDE = 16777216 GCP_NUMERICSLATIN = 67108864 GCP_NUMERICSLOCAL = 134217728 GCP_REORDER = 0x0002 GCP_SYMSWAPOFF = 8388608 GCP_USEKERNING = 0x0008 GCS_COMPATTR = 0x0010 GCS_COMPCLAUSE = 0x0020 GCS_COMPREADATTR = 0x0002 GCS_COMPREADCLAUSE = 0x0004 GCS_COMPREADSTR = 0x0001 GCS_COMPSTR = 0x0008 GCS_CURSORPOS = 0x0080 GCS_DELTASTART = 0x0100 GCS_RESULTCLAUSE = 0x1000 GCS_RESULTREADCLAUSE = 0x0400 GCS_RESULTREADSTR = 0x0200 GCS_RESULTSTR = 0x0800 GCW_ATOM = -32 GDICOMMENT_BEGINGROUP = 0x00000002 GDICOMMENT_ENDGROUP = 0x00000003 GDICOMMENT_IDENTIFIER = 0x43494447 GDICOMMENT_MULTIFORMATS = 0x40000004 GDICOMMENT_UNICODE_END = 0x00000080 GDICOMMENT_UNICODE_STRING = 0x00000040 GDICOMMENT_WINDOWS_METAFILE = 0x80000001 GDIPLUS_TS_QUERYVER = 4122 GDIPLUS_TS_RECORD = 4123 GDI_ERROR = 4294967295 GDI_OBJ_LAST = 14 GENERIC_ALL = 268435456 GENERIC_EXECUTE = 536870912 GENERIC_READ = 2147483648 GENERIC_WRITE = 1073741824 GEOID_NOT_AVAILABLE = -1 GEOPOLY_PI = 3.1415926535897932385 GETCOLORTABLE = 5 GETDEVICEUNITS = 42 GETEXTENDEDTEXTMETRICS = 256 GETEXTENTTABLE = 257 GETFACENAME = 513 GETPAIRKERNTABLE = 258 GETPENWIDTH = 16 GETPHYSPAGESIZE = 12 GETPRINTINGOFFSET = 13 GETSCALINGFACTOR = 14 GETSETPAPERBINS = 29 GETSETPAPERMETRICS = 35 GETSETPRINTORIENT = 30 GETSETSCREENPARAMS = 3072 GETTECHNOLGY = 20 GETTECHNOLOGY = 20 GETTRACKKERNTABLE = 259 GETVECTORBRUSHSIZE = 27 GETVECTORPENSIZE = 26 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS = 4 GET_MODULE_HANDLE_EX_FLAG_PIN = 1 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2 GET_PS_FEATURESETTING = 4121 GET_SYSTEM_WOW64_DIRECTORY_NAME_A_A = "GetSystemWow64DirectoryA" GET_SYSTEM_WOW64_DIRECTORY_NAME_W_A = "GetSystemWow64DirectoryW" GET_TAPE_DRIVE_INFORMATION = 1 GET_TAPE_MEDIA_INFORMATION = 0 GGI_MARK_NONEXISTING_GLYPHS = 0x0001 GGL_INDEX = 0x00000002 GGL_LEVEL = 0x00000001 GGL_PRIVATE = 0x00000004 GGL_STRING = 0x00000003 GGO_BEZIER = 3 GGO_BITMAP = 1 GGO_GLYPH_INDEX = 0x0080 GGO_GRAY2_BITMAP = 4 GGO_GRAY4_BITMAP = 5 GGO_GRAY8_BITMAP = 6 GGO_METRICS = 0 GGO_NATIVE = 2 GGO_UNHINTED = 0x0100 GHND = 66 GIDC_ARRIVAL = 1 GIDC_REMOVAL = 2 GL_ID_CANNOTSAVE = 0x00000011 GL_ID_CHOOSECANDIDATE = 0x00000028 GL_ID_INPUTCODE = 0x00000026 GL_ID_INPUTRADICAL = 0x00000025 GL_ID_INPUTREADING = 0x00000024 GL_ID_INPUTSYMBOL = 0x00000027 GL_ID_NOCONVERT = 0x00000020 GL_ID_NODICTIONARY = 0x00000010 GL_ID_NOMODULE = 0x00000001 GL_ID_PRIVATE_FIRST = 0x00008000 GL_ID_PRIVATE_LAST = 0x0000FFFF GL_ID_READINGCONFLICT = 0x00000023 GL_ID_REVERSECONVERSION = 0x00000029 GL_ID_TOOMANYSTROKE = 0x00000022 GL_ID_TYPINGERROR = 0x00000021 GL_ID_UNKNOWN = 0x00000000 GL_LEVEL_ERROR = 0x00000002 GL_LEVEL_FATAL = 0x00000001 GL_LEVEL_INFORMATION = 0x00000004 GL_LEVEL_NOGUIDELINE = 0x00000000 GL_LEVEL_WARNING = 0x00000003 GMDI_GOINTOPOPUPS = 2 GMDI_USEDISABLED = 1 GMEM_DDESHARE = 0x2000 GMEM_DISCARDABLE = 0x100 GMEM_DISCARDED = 0x4000 GMEM_FIXED = 0x0 GMEM_INVALID_HANDLE = 0x8000 GMEM_LOCKCOUNT = 0x00ff GMEM_LOWER = 4096 GMEM_MODIFY = 0x80 GMEM_MOVEABLE = 0x2 GMEM_NOCOMPACT = 0x10 GMEM_NODISCARD = 0x20 GMEM_NOTIFY = 0x4000 GMEM_NOT_BANKED = 0x1000 GMEM_SHARE = 0x2000 GMEM_VALID_FLAGS = 0x7f72 GMEM_ZEROINIT = 0x40 GMMP_USE_DISPLAY_POINTS = 1 GMMP_USE_HIGH_RESOLUTION_POINTS = 2 GM_ADVANCED = 2 GM_COMPATIBLE = 1 GM_LAST = 2 GPTR = 64 GPT_ATTRIBUTE_PLATFORM_REQUIRED = 1 GPT_BASIC_DATA_ATTRIBUTE_HIDDEN = 4611686018427387904 GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER = 9223372036854775808 GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY = 1152921504606846976 GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY = 2305843009213693952 GRADIENT_FILL_OP_FLAG = 0x000000ff GRADIENT_FILL_RECT_H = 0x00000000 GRADIENT_FILL_RECT_V = 0x00000001 GRADIENT_FILL_TRIANGLE = 0x00000002 GRAY_BRUSH = 2 GREEK_CHARSET = 161 GROUP_NAME = 0x80 GROUP_SECURITY_INFORMATION = 2 GR_GDIOBJECTS = 0 GR_USEROBJECTS = 1 GS_8BIT_INDICES = 0x00000001 GUID_DEFINED = 0 GUI_16BITTASK = 0x00000000 GUI_CARETBLINKING = 0x00000001 GUI_INMENUMODE = 0x00000004 GUI_INMOVESIZE = 0x00000002 GUI_POPUPMENUMODE = 0x00000010 GUI_SYSTEMMENUMODE = 0x00000008 GWLP_HINSTANCE = -6 GWLP_HWNDPARENT = -8 GWLP_ID = -12 GWLP_USERDATA = -21 GWLP_WNDPROC = -4 GWL_EXSTYLE = -20 GWL_ID = -12 GWL_STYLE = -16 GW_CHILD = 5 GW_ENABLEDPOPUP = 6 GW_HWNDFIRST = 0 GW_HWNDLAST = 1 GW_HWNDNEXT = 2 GW_HWNDPREV = 3 GW_MAX = 6 GW_OWNER = 4 HALFTONE = 4 HANDLE_FLAG_INHERIT = 0x1 HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x2 HANGEUL_CHARSET = 129 HANGUL_CHARSET = 129 HANGUP_COMPLETE = 0x05 HANGUP_PENDING = 0x04 HASHSIZE = 97 HASHTABLE_HASH_1 = 383 HASHTABLE_NPAGE = 4096 HASHTABLE_NSLOT = 8192 HAVE_FCHOWN = 1 HAVE_LSTAT = 1 HAVE_READLINK = 1 HAVE_USLEEP = 1 HCBT_ACTIVATE = 5 HCBT_CLICKSKIPPED = 6 HCBT_CREATEWND = 3 HCBT_DESTROYWND = 4 HCBT_KEYSKIPPED = 7 HCBT_MINMAX = 1 HCBT_MOVESIZE = 0 HCBT_QS = 2 HCBT_SETFOCUS = 9 HCBT_SYSCOMMAND = 8 HCF_AVAILABLE = 0x00000002 HCF_CONFIRMHOTKEY = 0x00000008 HCF_DEFAULTDESKTOP = 0x00000200 HCF_HIGHCONTRASTON = 0x00000001 HCF_HOTKEYACTIVE = 0x00000004 HCF_HOTKEYAVAILABLE = 0x00000040 HCF_HOTKEYSOUND = 0x00000010 HCF_INDICATOR = 0x00000020 HCF_LOGONDESKTOP = 0x00000100 HCF_OPTION_NOTHEMECHANGE = 0x00001000 HCRYPTPROV_DEFINED = 0 HC_ACTION = 0 HC_GETNEXT = 1 HC_NOREM = 3 HC_NOREMOVE = 3 HC_SKIP = 2 HC_SYSMODALOFF = 5 HC_SYSMODALON = 4 HDATA_APPOWNED = 0x0001 HEAP_CREATE_ALIGN_16 = 0x00010000 HEAP_CREATE_ENABLE_EXECUTE = 0x00040000 HEAP_CREATE_ENABLE_TRACING = 0x00020000 HEAP_DISABLE_COALESCE_ON_FREE = 0x00000080 HEAP_FREE_CHECKING_ENABLED = 0x00000040 HEAP_GENERATE_EXCEPTIONS = 0x00000004 HEAP_GROWABLE = 0x00000002 HEAP_MAXIMUM_TAG = 0x0FFF HEAP_NO_SERIALIZE = 0x00000001 HEAP_PSEUDO_TAG_FLAG = 0x8000 HEAP_REALLOC_IN_PLACE_ONLY = 0x00000010 HEAP_TAG_SHIFT = 18 HEAP_TAIL_CHECKING_ENABLED = 0x00000020 HEAP_ZERO_MEMORY = 0x00000008 HEBREW_CHARSET = 177 HELPINFO_MENUITEM = 0x0002 HELPINFO_WINDOW = 0x0001 HELPMSGSTRINGA = "commdlg_help" HELP_COMMAND = 0x0102 HELP_CONTENTS = 0x0003 HELP_CONTEXT = 0x0001 HELP_CONTEXTMENU = 0x000a HELP_CONTEXTPOPUP = 0x0008 HELP_FINDER = 0x000b HELP_FORCEFILE = 0x0009 HELP_HELPONHELP = 0x0004 HELP_INDEX = 0x0003 HELP_KEY = 0x0101 HELP_MULTIKEY = 0x0201 HELP_PARTIALKEY = 0x0105 HELP_QUIT = 0x0002 HELP_SETCONTENTS = 0x0005 HELP_SETINDEX = 0x0005 HELP_SETPOPUP_POS = 0x000d HELP_SETWINPOS = 0x0203 HELP_TCARD = 0x8000 HELP_TCARD_DATA = 0x0010 HELP_TCARD_OTHER_CALLER = 0x0011 HELP_WM_HELP = 0x000c HIDE_WINDOW = 0 HIGH_PRIORITY_CLASS = 0x80 HIGH_SURROGATE_END = 0xdbff HIGH_SURROGATE_START = 0xd800 HINSTANCE_ERROR = 32 HISTORY_NO_DUP_FLAG = 0x1 HIST_NO_OF_BUCKETS = 24 HKL_NEXT = 1 HKL_PREV = 0 HMONITOR_DECLARED = 1 HOLLOW_BRUSH = 5 HORZRES = 8 HORZSIZE = 4 HOST_NOT_FOUND = 11001 HOVER_DEFAULT = 0xFFFFFFFF HP_ALGID = 0x1 HP_HASHSIZE = 0x4 HP_HASHVAL = 0x2 HP_HMAC_INFO = 0x5 HP_TLS1PRF_LABEL = 0x6 HP_TLS1PRF_SEED = 0x7 HSHELL_ACCESSIBILITYSTATE = 11 HSHELL_ACTIVATESHELLWINDOW = 3 HSHELL_APPCOMMAND = 12 HSHELL_ENDTASK = 10 HSHELL_FLASH = 32774 HSHELL_GETMINRECT = 5 HSHELL_HIGHBIT = 0x8000 HSHELL_LANGUAGE = 8 HSHELL_REDRAW = 6 HSHELL_RUDEAPPACTIVATED = 32772 HSHELL_SYSMENU = 9 HSHELL_TASKMAN = 7 HSHELL_WINDOWACTIVATED = 4 HSHELL_WINDOWCREATED = 1 HSHELL_WINDOWDESTROYED = 2 HSHELL_WINDOWREPLACED = 13 HSHELL_WINDOWREPLACING = 14 HS_API_MAX = 12 HS_BDIAGONAL = 3 HS_CROSS = 4 HS_DIAGCROSS = 5 HS_FDIAGONAL = 2 HS_HORIZONTAL = 0 HS_VERTICAL = 1 HTBORDER = 18 HTBOTTOM = 15 HTBOTTOMLEFT = 16 HTBOTTOMRIGHT = 17 HTCAPTION = 2 HTCLIENT = 1 HTCLOSE = 20 HTERROR = -2 HTGROWBOX = 4 HTHELP = 21 HTHSCROLL = 6 HTLEFT = 10 HTMAXBUTTON = 9 HTMENU = 5 HTMINBUTTON = 8 HTNOWHERE = 0 HTOBJECT = 19 HTREDUCE = 8 HTRIGHT = 11 HTSIZE = 4 HTSIZEFIRST = 10 HTSIZELAST = 17 HTSYSMENU = 3 HTTOP = 12 HTTOPLEFT = 13 HTTOPRIGHT = 14 HTTRANSPARENT = -1 HTVSCROLL = 7 HTZOOM = 9 HUGEP = 0 HW_PROFILE_GUIDLEN = 39 IACE_CHILDREN = 0x0001 IACE_DEFAULT = 0x0010 IACE_IGNORENOCONTEXT = 0x0020 ICM_ADDPROFILE = 1 ICM_DELETEPROFILE = 2 ICM_DONE_OUTSIDEDC = 4 ICM_OFF = 1 ICM_ON = 2 ICM_QUERY = 3 ICM_QUERYMATCH = 7 ICM_QUERYPROFILE = 3 ICM_REGISTERICMATCHER = 5 ICM_SETDEFAULTPROFILE = 4 ICM_UNREGISTERICMATCHER = 6 ICON_BIG = 1 ICON_SMALL = 0 ICON_SMALL2 = 2 IDABORT = 3 IDANI_CAPTION = 3 IDANI_OPEN = 1 IDCANCEL = 2 IDCLOSE = 8 IDCONTINUE = 11 IDENTIFY_BUFFER_SIZE = 512 IDHELP = 9 IDHOT_SNAPDESKTOP = -2 IDHOT_SNAPWINDOW = -1 IDH_CANCEL = 28444 IDH_GENERIC_HELP_BUTTON = 28442 IDH_HELP = 28445 IDH_MISSING_CONTEXT = 28441 IDH_NO_HELP = 28440 IDH_OK = 28443 IDIGNORE = 5 IDLE_PRIORITY_CLASS = 0x40 IDLFLAG_FIN = 1 IDLFLAG_FLCID = 4 IDLFLAG_FOUT = 2 IDLFLAG_FRETVAL = 8 IDLFLAG_NONE = 0 IDNO = 7 IDOK = 1 IDRETRY = 4 IDTIMEOUT = 32000 IDTRYAGAIN = 10 IDYES = 6 ID_CMD = 0xEC ID_DEFAULTINST = -2 ID_PSREBOOTSYSTEM = 3 ID_PSRESTARTWINDOWS = 0x2 IE_BADID = -1 IE_BAUDRATE = -12 IE_BYTESIZE = -11 IE_DEFAULT = -5 IE_HARDWARE = -10 IE_MEMORY = -4 IE_NOPEN = -3 IE_OPEN = -2 IFID_DEFINED = 0 IGIMIF_RIGHTMENU = 0x0001 IGIMII_CMODE = 0x0001 IGIMII_CONFIGURE = 0x0004 IGIMII_HELP = 0x0010 IGIMII_INPUTTOOLS = 0x0040 IGIMII_OTHER = 0x0020 IGIMII_SMODE = 0x0002 IGIMII_TOOLS = 0x0008 IGNORE = 0 IGP_CONVERSION = 0x00000008 IGP_PROPERTY = 0x00000004 IGP_SELECT = 0x00000018 IGP_SENTENCE = 0x0000000c IGP_SETCOMPSTR = 0x00000014 IGP_UI = 0x00000010 ILLUMINANT_A = 1 ILLUMINANT_B = 2 ILLUMINANT_C = 3 ILLUMINANT_D50 = 4 ILLUMINANT_D55 = 5 ILLUMINANT_D65 = 6 ILLUMINANT_D75 = 7 ILLUMINANT_DAYLIGHT = 3 ILLUMINANT_DEVICE_DEFAULT = 0 ILLUMINANT_F2 = 8 ILLUMINANT_FLUORESCENT = 8 ILLUMINANT_MAX_INDEX = 8 ILLUMINANT_NTSC = 3 ILLUMINANT_TUNGSTEN = 1 IMAGE_ARCHIVE_END = "`\n" IMAGE_ARCHIVE_LINKER_MEMBER = "/ " IMAGE_ARCHIVE_LONGNAMES_MEMBER = "// " IMAGE_ARCHIVE_PAD = "\n" IMAGE_ARCHIVE_START = "!\n" IMAGE_ARCHIVE_START_SIZE = 8 IMAGE_BITMAP = 0 IMAGE_COMDAT_SELECT_ANY = 2 IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5 IMAGE_COMDAT_SELECT_EXACT_MATCH = 4 IMAGE_COMDAT_SELECT_LARGEST = 6 IMAGE_COMDAT_SELECT_NEWEST = 7 IMAGE_COMDAT_SELECT_NODUPLICATES = 1 IMAGE_COMDAT_SELECT_SAME_SIZE = 3 IMAGE_CURSOR = 2 IMAGE_DEBUG_MISC_EXENAME = 1 IMAGE_DEBUG_TYPE_BORLAND = 9 IMAGE_DEBUG_TYPE_CLSID = 11 IMAGE_DEBUG_TYPE_CODEVIEW = 2 IMAGE_DEBUG_TYPE_COFF = 1 IMAGE_DEBUG_TYPE_EXCEPTION = 5 IMAGE_DEBUG_TYPE_FIXUP = 6 IMAGE_DEBUG_TYPE_FPO = 3 IMAGE_DEBUG_TYPE_MISC = 4 IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8 IMAGE_DEBUG_TYPE_OMAP_TO_SRC = 7 IMAGE_DEBUG_TYPE_RESERVED10 = 10 IMAGE_DEBUG_TYPE_UNKNOWN = 0 IMAGE_DIRECTORY_ENTRY_ARCHITECTURE = 7 IMAGE_DIRECTORY_ENTRY_BASERELOC = 5 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14 IMAGE_DIRECTORY_ENTRY_DEBUG = 6 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT = 13 IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3 IMAGE_DIRECTORY_ENTRY_EXPORT = 0 IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8 IMAGE_DIRECTORY_ENTRY_IAT = 12 IMAGE_DIRECTORY_ENTRY_IMPORT = 1 IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10 IMAGE_DIRECTORY_ENTRY_RESOURCE = 2 IMAGE_DIRECTORY_ENTRY_SECURITY = 4 IMAGE_DIRECTORY_ENTRY_TLS = 9 IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040 IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY = 0x0080 IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000 IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020 IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800 IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200 IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400 IMAGE_DLLCHARACTERISTICS_NX_COMPAT = 0x0100 IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000 IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000 IMAGE_DOS_SIGNATURE = 0x5A4D IMAGE_ENHMETAFILE = 3 IMAGE_FILE_32BIT_MACHINE = 0x0100 IMAGE_FILE_AGGRESIVE_WS_TRIM = 0x0010 IMAGE_FILE_BYTES_REVERSED_HI = 0x8000 IMAGE_FILE_BYTES_REVERSED_LO = 0x0080 IMAGE_FILE_DEBUG_STRIPPED = 0x0200 IMAGE_FILE_DLL = 0x2000 IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002 IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020 IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004 IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008 IMAGE_FILE_MACHINE_ALPHA = 0x0184 IMAGE_FILE_MACHINE_ALPHA64 = 0x0284 IMAGE_FILE_MACHINE_AM33 = 0x01d3 IMAGE_FILE_MACHINE_AMD64 = 0x8664 IMAGE_FILE_MACHINE_ARM = 0x01c0 IMAGE_FILE_MACHINE_ARM64 = 0xaa64 IMAGE_FILE_MACHINE_ARMNT = 0x01c4 IMAGE_FILE_MACHINE_ARMV7 = 0x01c4 IMAGE_FILE_MACHINE_AXP64 = 644 IMAGE_FILE_MACHINE_CEE = 0xc0ee IMAGE_FILE_MACHINE_CEF = 0x0CEF IMAGE_FILE_MACHINE_EBC = 0x0EBC IMAGE_FILE_MACHINE_I386 = 0x014c IMAGE_FILE_MACHINE_IA64 = 0x0200 IMAGE_FILE_MACHINE_M32R = 0x9041 IMAGE_FILE_MACHINE_MIPS16 = 0x0266 IMAGE_FILE_MACHINE_MIPSFPU = 0x0366 IMAGE_FILE_MACHINE_MIPSFPU16 = 0x0466 IMAGE_FILE_MACHINE_POWERPC = 0x01F0 IMAGE_FILE_MACHINE_POWERPCFP = 0x01f1 IMAGE_FILE_MACHINE_R10000 = 0x0168 IMAGE_FILE_MACHINE_R3000 = 0x0162 IMAGE_FILE_MACHINE_R4000 = 0x0166 IMAGE_FILE_MACHINE_SH3 = 0x01a2 IMAGE_FILE_MACHINE_SH3DSP = 0x01a3 IMAGE_FILE_MACHINE_SH3E = 0x01a4 IMAGE_FILE_MACHINE_SH4 = 0x01a6 IMAGE_FILE_MACHINE_SH5 = 0x01a8 IMAGE_FILE_MACHINE_THUMB = 0x01c2 IMAGE_FILE_MACHINE_TRICORE = 0x0520 IMAGE_FILE_MACHINE_UNKNOWN = 0 IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x0169 IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800 IMAGE_FILE_RELOCS_STRIPPED = 0x0001 IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400 IMAGE_FILE_SYSTEM = 0x1000 IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000 IMAGE_ICON = 1 IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x10b IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x20b IMAGE_NT_OPTIONAL_HDR_MAGIC = 523 IMAGE_NT_SIGNATURE = 0x00004550 IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16 IMAGE_ORDINAL_FLAG = 9223372036854775808 IMAGE_ORDINAL_FLAG32 = 0x80000000 IMAGE_ORDINAL_FLAG64 = 0x8000000000000000 IMAGE_OS2_SIGNATURE = 0x454E IMAGE_OS2_SIGNATURE_LE = 0x454C IMAGE_REL_ALPHA_ABSOLUTE = 0x0000 IMAGE_REL_ALPHA_BRADDR = 0x0007 IMAGE_REL_ALPHA_GPDISP = 0x0006 IMAGE_REL_ALPHA_GPREL32 = 0x0003 IMAGE_REL_ALPHA_GPRELHI = 0x0017 IMAGE_REL_ALPHA_GPRELLO = 0x0016 IMAGE_REL_ALPHA_HINT = 0x0008 IMAGE_REL_ALPHA_INLINE_REFLONG = 0x0009 IMAGE_REL_ALPHA_LITERAL = 0x0004 IMAGE_REL_ALPHA_LITUSE = 0x0005 IMAGE_REL_ALPHA_MATCH = 0x000D IMAGE_REL_ALPHA_PAIR = 0x000C IMAGE_REL_ALPHA_REFHI = 0x000A IMAGE_REL_ALPHA_REFLO = 0x000B IMAGE_REL_ALPHA_REFLONG = 0x0001 IMAGE_REL_ALPHA_REFLONGNB = 0x0010 IMAGE_REL_ALPHA_REFQ1 = 0x0015 IMAGE_REL_ALPHA_REFQ2 = 0x0014 IMAGE_REL_ALPHA_REFQ3 = 0x0013 IMAGE_REL_ALPHA_REFQUAD = 0x0002 IMAGE_REL_ALPHA_SECREL = 0x000F IMAGE_REL_ALPHA_SECRELHI = 0x0012 IMAGE_REL_ALPHA_SECRELLO = 0x0011 IMAGE_REL_ALPHA_SECTION = 0x000E IMAGE_REL_AMD64_ABSOLUTE = 0x0000 IMAGE_REL_AMD64_ADDR32 = 0x0002 IMAGE_REL_AMD64_ADDR32NB = 0x0003 IMAGE_REL_AMD64_ADDR64 = 0x0001 IMAGE_REL_AMD64_PAIR = 0x000F IMAGE_REL_AMD64_REL32 = 0x0004 IMAGE_REL_AMD64_REL32_1 = 0x0005 IMAGE_REL_AMD64_REL32_2 = 0x0006 IMAGE_REL_AMD64_REL32_3 = 0x0007 IMAGE_REL_AMD64_REL32_4 = 0x0008 IMAGE_REL_AMD64_REL32_5 = 0x0009 IMAGE_REL_AMD64_SECREL = 0x000B IMAGE_REL_AMD64_SECREL7 = 0x000C IMAGE_REL_AMD64_SECTION = 0x000A IMAGE_REL_AMD64_SREL32 = 0x000E IMAGE_REL_AMD64_SSPAN32 = 0x0010 IMAGE_REL_AMD64_TOKEN = 0x000D IMAGE_REL_AM_ABSOLUTE = 0x0000 IMAGE_REL_AM_ADDR32 = 0x0001 IMAGE_REL_AM_ADDR32NB = 0x0002 IMAGE_REL_AM_CALL32 = 0x0003 IMAGE_REL_AM_FUNCINFO = 0x0004 IMAGE_REL_AM_REL32_1 = 0x0005 IMAGE_REL_AM_REL32_2 = 0x0006 IMAGE_REL_AM_SECREL = 0x0007 IMAGE_REL_AM_SECTION = 0x0008 IMAGE_REL_AM_TOKEN = 0x0009 IMAGE_REL_ARM_ABSOLUTE = 0x0000 IMAGE_REL_ARM_ADDR32 = 0x0001 IMAGE_REL_ARM_ADDR32NB = 0x0002 IMAGE_REL_ARM_BLX11 = 0x0009 IMAGE_REL_ARM_BLX23T = 0x0015 IMAGE_REL_ARM_BLX24 = 0x0008 IMAGE_REL_ARM_BRANCH11 = 0x0004 IMAGE_REL_ARM_BRANCH20T = 0x0012 IMAGE_REL_ARM_BRANCH24 = 0x0003 IMAGE_REL_ARM_BRANCH24T = 0x0014 IMAGE_REL_ARM_GPREL12 = 0x0006 IMAGE_REL_ARM_GPREL7 = 0x0007 IMAGE_REL_ARM_MOV32 = 0x0010 IMAGE_REL_ARM_MOV32A = 0x0010 IMAGE_REL_ARM_MOV32T = 0x0011 IMAGE_REL_ARM_SECREL = 0x000F IMAGE_REL_ARM_SECTION = 0x000E IMAGE_REL_ARM_TOKEN = 0x0005 IMAGE_REL_BASED_ABSOLUTE = 0 IMAGE_REL_BASED_ARM_MOV32 = 5 IMAGE_REL_BASED_DIR64 = 10 IMAGE_REL_BASED_HIGH = 1 IMAGE_REL_BASED_HIGHADJ = 4 IMAGE_REL_BASED_HIGHLOW = 3 IMAGE_REL_BASED_IA64_IMM64 = 9 IMAGE_REL_BASED_LOW = 2 IMAGE_REL_BASED_MIPS_JMPADDR = 5 IMAGE_REL_BASED_MIPS_JMPADDR16 = 9 IMAGE_REL_BASED_THUMB_MOV32 = 7 IMAGE_REL_CEE_ABSOLUTE = 0x0000 IMAGE_REL_CEE_ADDR32 = 0x0001 IMAGE_REL_CEE_ADDR32NB = 0x0003 IMAGE_REL_CEE_ADDR64 = 0x0002 IMAGE_REL_CEE_SECREL = 0x0005 IMAGE_REL_CEE_SECTION = 0x0004 IMAGE_REL_CEE_TOKEN = 0x0006 IMAGE_REL_CEF_ABSOLUTE = 0x0000 IMAGE_REL_CEF_ADDR32 = 0x0001 IMAGE_REL_CEF_ADDR32NB = 0x0003 IMAGE_REL_CEF_ADDR64 = 0x0002 IMAGE_REL_CEF_SECREL = 0x0005 IMAGE_REL_CEF_SECTION = 0x0004 IMAGE_REL_CEF_TOKEN = 0x0006 IMAGE_REL_EBC_ABSOLUTE = 0x0000 IMAGE_REL_EBC_ADDR32NB = 0x0001 IMAGE_REL_EBC_REL32 = 0x0002 IMAGE_REL_EBC_SECREL = 0x0004 IMAGE_REL_EBC_SECTION = 0x0003 IMAGE_REL_I386_ABSOLUTE = 0x0000 IMAGE_REL_I386_DIR16 = 0x0001 IMAGE_REL_I386_DIR32 = 0x0006 IMAGE_REL_I386_DIR32NB = 0x0007 IMAGE_REL_I386_REL16 = 0x0002 IMAGE_REL_I386_REL32 = 0x0014 IMAGE_REL_I386_SECREL = 0x000B IMAGE_REL_I386_SECREL7 = 0x000D IMAGE_REL_I386_SECTION = 0x000A IMAGE_REL_I386_SEG12 = 0x0009 IMAGE_REL_I386_TOKEN = 0x000C IMAGE_REL_IA64_ABSOLUTE = 0x0000 IMAGE_REL_IA64_ADDEND = 0x001F IMAGE_REL_IA64_DIR32 = 0x0004 IMAGE_REL_IA64_DIR32NB = 0x0010 IMAGE_REL_IA64_DIR64 = 0x0005 IMAGE_REL_IA64_GPREL22 = 0x0009 IMAGE_REL_IA64_GPREL32 = 0x001C IMAGE_REL_IA64_IMM14 = 0x0001 IMAGE_REL_IA64_IMM22 = 0x0002 IMAGE_REL_IA64_IMM64 = 0x0003 IMAGE_REL_IA64_IMMGPREL64 = 0x001A IMAGE_REL_IA64_LTOFF22 = 0x000A IMAGE_REL_IA64_PCREL21B = 0x0006 IMAGE_REL_IA64_PCREL21F = 0x0008 IMAGE_REL_IA64_PCREL21M = 0x0007 IMAGE_REL_IA64_PCREL60B = 0x0016 IMAGE_REL_IA64_PCREL60F = 0x0017 IMAGE_REL_IA64_PCREL60I = 0x0018 IMAGE_REL_IA64_PCREL60M = 0x0019 IMAGE_REL_IA64_PCREL60X = 0x0015 IMAGE_REL_IA64_SECREL22 = 0x000C IMAGE_REL_IA64_SECREL32 = 0x000E IMAGE_REL_IA64_SECREL64I = 0x000D IMAGE_REL_IA64_SECTION = 0x000B IMAGE_REL_IA64_SREL14 = 0x0011 IMAGE_REL_IA64_SREL22 = 0x0012 IMAGE_REL_IA64_SREL32 = 0x0013 IMAGE_REL_IA64_TOKEN = 0x001B IMAGE_REL_IA64_UREL32 = 0x0014 IMAGE_REL_M32R_ABSOLUTE = 0x0000 IMAGE_REL_M32R_ADDR24 = 0x0003 IMAGE_REL_M32R_ADDR32 = 0x0001 IMAGE_REL_M32R_ADDR32NB = 0x0002 IMAGE_REL_M32R_GPREL16 = 0x0004 IMAGE_REL_M32R_PAIR = 0x000B IMAGE_REL_M32R_PCREL16 = 0x0006 IMAGE_REL_M32R_PCREL24 = 0x0005 IMAGE_REL_M32R_PCREL8 = 0x0007 IMAGE_REL_M32R_REFHALF = 0x0008 IMAGE_REL_M32R_REFHI = 0x0009 IMAGE_REL_M32R_REFLO = 0x000A IMAGE_REL_M32R_SECREL32 = 0x000D IMAGE_REL_M32R_SECTION = 0x000C IMAGE_REL_M32R_TOKEN = 0x000E IMAGE_REL_MIPS_ABSOLUTE = 0x0000 IMAGE_REL_MIPS_GPREL = 0x0006 IMAGE_REL_MIPS_JMPADDR = 0x0003 IMAGE_REL_MIPS_JMPADDR16 = 0x0010 IMAGE_REL_MIPS_LITERAL = 0x0007 IMAGE_REL_MIPS_PAIR = 0x0025 IMAGE_REL_MIPS_REFHALF = 0x0001 IMAGE_REL_MIPS_REFHI = 0x0004 IMAGE_REL_MIPS_REFLO = 0x0005 IMAGE_REL_MIPS_REFWORD = 0x0002 IMAGE_REL_MIPS_REFWORDNB = 0x0022 IMAGE_REL_MIPS_SECREL = 0x000B IMAGE_REL_MIPS_SECRELHI = 0x000D IMAGE_REL_MIPS_SECRELLO = 0x000C IMAGE_REL_MIPS_SECTION = 0x000A IMAGE_REL_MIPS_TOKEN = 0x000E IMAGE_REL_PPC_ABSOLUTE = 0x0000 IMAGE_REL_PPC_ADDR14 = 0x0005 IMAGE_REL_PPC_ADDR16 = 0x0004 IMAGE_REL_PPC_ADDR24 = 0x0003 IMAGE_REL_PPC_ADDR32 = 0x0002 IMAGE_REL_PPC_ADDR32NB = 0x000A IMAGE_REL_PPC_ADDR64 = 0x0001 IMAGE_REL_PPC_BRNTAKEN = 0x0400 IMAGE_REL_PPC_BRTAKEN = 0x0200 IMAGE_REL_PPC_GPREL = 0x0015 IMAGE_REL_PPC_IFGLUE = 0x000D IMAGE_REL_PPC_IMGLUE = 0x000E IMAGE_REL_PPC_NEG = 0x0100 IMAGE_REL_PPC_PAIR = 0x0012 IMAGE_REL_PPC_REFHI = 0x0010 IMAGE_REL_PPC_REFLO = 0x0011 IMAGE_REL_PPC_REL14 = 0x0007 IMAGE_REL_PPC_REL24 = 0x0006 IMAGE_REL_PPC_SECREL = 0x000B IMAGE_REL_PPC_SECREL16 = 0x000F IMAGE_REL_PPC_SECRELHI = 0x0014 IMAGE_REL_PPC_SECRELLO = 0x0013 IMAGE_REL_PPC_SECTION = 0x000C IMAGE_REL_PPC_TOCDEFN = 0x0800 IMAGE_REL_PPC_TOCREL14 = 0x0009 IMAGE_REL_PPC_TOCREL16 = 0x0008 IMAGE_REL_PPC_TOKEN = 0x0016 IMAGE_REL_PPC_TYPEMASK = 0x00FF IMAGE_REL_SH3_ABSOLUTE = 0x0000 IMAGE_REL_SH3_DIRECT16 = 0x0001 IMAGE_REL_SH3_DIRECT32 = 0x0002 IMAGE_REL_SH3_DIRECT32_NB = 0x0010 IMAGE_REL_SH3_DIRECT4 = 0x0006 IMAGE_REL_SH3_DIRECT4_LONG = 0x0008 IMAGE_REL_SH3_DIRECT4_WORD = 0x0007 IMAGE_REL_SH3_DIRECT8 = 0x0003 IMAGE_REL_SH3_DIRECT8_LONG = 0x0005 IMAGE_REL_SH3_DIRECT8_WORD = 0x0004 IMAGE_REL_SH3_GPREL4_LONG = 0x0011 IMAGE_REL_SH3_PCREL12_WORD = 0x000B IMAGE_REL_SH3_PCREL8_LONG = 0x000A IMAGE_REL_SH3_PCREL8_WORD = 0x0009 IMAGE_REL_SH3_SECREL = 0x000F IMAGE_REL_SH3_SECTION = 0x000E IMAGE_REL_SH3_SIZEOF_SECTION = 0x000D IMAGE_REL_SH3_STARTOF_SECTION = 0x000C IMAGE_REL_SH3_TOKEN = 0x0012 IMAGE_REL_SHM_PAIR = 0x0018 IMAGE_REL_SHM_PCRELPT = 0x0013 IMAGE_REL_SHM_REFHALF = 0x0015 IMAGE_REL_SHM_REFLO = 0x0014 IMAGE_REL_SHM_RELHALF = 0x0017 IMAGE_REL_SHM_RELLO = 0x0016 IMAGE_REL_SH_NOMODE = 0x8000 IMAGE_REL_THUMB_BLX23 = 0x0015 IMAGE_REL_THUMB_BRANCH20 = 0x0012 IMAGE_REL_THUMB_BRANCH24 = 0x0014 IMAGE_REL_THUMB_MOV32 = 0x0011 IMAGE_RESOURCE_DATA_IS_DIRECTORY = 0x80000000 IMAGE_RESOURCE_NAME_IS_STRING = 0x80000000 IMAGE_ROM_OPTIONAL_HDR_MAGIC = 0x107 IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000 IMAGE_SCN_ALIGN_128BYTES = 0x00800000 IMAGE_SCN_ALIGN_16BYTES = 0x00500000 IMAGE_SCN_ALIGN_1BYTES = 0x00100000 IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000 IMAGE_SCN_ALIGN_256BYTES = 0x00900000 IMAGE_SCN_ALIGN_2BYTES = 0x00200000 IMAGE_SCN_ALIGN_32BYTES = 0x00600000 IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000 IMAGE_SCN_ALIGN_4BYTES = 0x00300000 IMAGE_SCN_ALIGN_512BYTES = 0x00A00000 IMAGE_SCN_ALIGN_64BYTES = 0x00700000 IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000 IMAGE_SCN_ALIGN_8BYTES = 0x00400000 IMAGE_SCN_ALIGN_MASK = 0x00F00000 IMAGE_SCN_CNT_CODE = 0x00000020 IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040 IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 IMAGE_SCN_GPREL = 0x00008000 IMAGE_SCN_LNK_COMDAT = 0x00001000 IMAGE_SCN_LNK_INFO = 0x00000200 IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000 IMAGE_SCN_LNK_OTHER = 0x00000100 IMAGE_SCN_LNK_REMOVE = 0x00000800 IMAGE_SCN_MEM_16BIT = 0x00020000 IMAGE_SCN_MEM_DISCARDABLE = 0x02000000 IMAGE_SCN_MEM_EXECUTE = 0x20000000 IMAGE_SCN_MEM_FARDATA = 0x00008000 IMAGE_SCN_MEM_LOCKED = 0x00040000 IMAGE_SCN_MEM_NOT_CACHED = 0x04000000 IMAGE_SCN_MEM_NOT_PAGED = 0x08000000 IMAGE_SCN_MEM_PRELOAD = 0x00080000 IMAGE_SCN_MEM_PURGEABLE = 0x00020000 IMAGE_SCN_MEM_READ = 0x40000000 IMAGE_SCN_MEM_SHARED = 0x10000000 IMAGE_SCN_MEM_WRITE = 0x80000000 IMAGE_SCN_NO_DEFER_SPEC_EXC = 0x00004000 IMAGE_SCN_SCALE_INDEX = 0x00000001 IMAGE_SCN_TYPE_NO_PAD = 0x00000008 IMAGE_SEPARATE_DEBUG_FLAGS_MASK = 0x8000 IMAGE_SEPARATE_DEBUG_MISMATCH = 0x8000 IMAGE_SEPARATE_DEBUG_SIGNATURE = 0x4944 IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR = 60 IMAGE_SIZEOF_AUX_SYMBOL = 18 IMAGE_SIZEOF_BASE_RELOCATION = 8 IMAGE_SIZEOF_FILE_HEADER = 20 IMAGE_SIZEOF_LINENUMBER = 6 IMAGE_SIZEOF_NT_OPTIONAL32_HEADER = 224 IMAGE_SIZEOF_NT_OPTIONAL64_HEADER = 240 IMAGE_SIZEOF_NT_OPTIONAL_HEADER = 240 IMAGE_SIZEOF_RELOCATION = 10 IMAGE_SIZEOF_ROM_OPTIONAL_HEADER = 56 IMAGE_SIZEOF_SECTION_HEADER = 40 IMAGE_SIZEOF_SHORT_NAME = 8 IMAGE_SIZEOF_STD_OPTIONAL_HEADER = 28 IMAGE_SIZEOF_SYMBOL = 18 IMAGE_SUBSYSTEM_EFI_APPLICATION = 10 IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11 IMAGE_SUBSYSTEM_EFI_ROM = 13 IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12 IMAGE_SUBSYSTEM_NATIVE = 1 IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8 IMAGE_SUBSYSTEM_OS2_CUI = 5 IMAGE_SUBSYSTEM_POSIX_CUI = 7 IMAGE_SUBSYSTEM_UNKNOWN = 0 IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16 IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9 IMAGE_SUBSYSTEM_WINDOWS_CUI = 3 IMAGE_SUBSYSTEM_WINDOWS_GUI = 2 IMAGE_SUBSYSTEM_XBOX = 14 IMAGE_SYM_CLASS_ARGUMENT = 0x0009 IMAGE_SYM_CLASS_AUTOMATIC = 0x0001 IMAGE_SYM_CLASS_BIT_FIELD = 0x0012 IMAGE_SYM_CLASS_BLOCK = 0x0064 IMAGE_SYM_CLASS_CLR_TOKEN = 0x006B IMAGE_SYM_CLASS_END_OF_STRUCT = 0x0066 IMAGE_SYM_CLASS_ENUM_TAG = 0x000F IMAGE_SYM_CLASS_EXTERNAL = 0x0002 IMAGE_SYM_CLASS_EXTERNAL_DEF = 0x0005 IMAGE_SYM_CLASS_FAR_EXTERNAL = 0x0044 IMAGE_SYM_CLASS_FILE = 0x0067 IMAGE_SYM_CLASS_FUNCTION = 0x0065 IMAGE_SYM_CLASS_LABEL = 0x0006 IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 0x0010 IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 0x0008 IMAGE_SYM_CLASS_MEMBER_OF_UNION = 0x000B IMAGE_SYM_CLASS_NULL = 0x0000 IMAGE_SYM_CLASS_REGISTER = 0x0004 IMAGE_SYM_CLASS_REGISTER_PARAM = 0x0011 IMAGE_SYM_CLASS_SECTION = 0x0068 IMAGE_SYM_CLASS_STATIC = 0x0003 IMAGE_SYM_CLASS_STRUCT_TAG = 0x000A IMAGE_SYM_CLASS_TYPE_DEFINITION = 0x000D IMAGE_SYM_CLASS_UNDEFINED_LABEL = 0x0007 IMAGE_SYM_CLASS_UNDEFINED_STATIC = 0x000E IMAGE_SYM_CLASS_UNION_TAG = 0x000C IMAGE_SYM_CLASS_WEAK_EXTERNAL = 0x0069 IMAGE_SYM_DTYPE_ARRAY = 3 IMAGE_SYM_DTYPE_FUNCTION = 2 IMAGE_SYM_DTYPE_NULL = 0 IMAGE_SYM_DTYPE_POINTER = 1 IMAGE_SYM_SECTION_MAX = 0xFEFF IMAGE_SYM_SECTION_MAX_EX = 2147483647 IMAGE_SYM_TYPE_BYTE = 0x000C IMAGE_SYM_TYPE_CHAR = 0x0002 IMAGE_SYM_TYPE_DOUBLE = 0x0007 IMAGE_SYM_TYPE_DWORD = 0x000F IMAGE_SYM_TYPE_ENUM = 0x000A IMAGE_SYM_TYPE_FLOAT = 0x0006 IMAGE_SYM_TYPE_INT = 0x0004 IMAGE_SYM_TYPE_LONG = 0x0005 IMAGE_SYM_TYPE_MOE = 0x000B IMAGE_SYM_TYPE_NULL = 0x0000 IMAGE_SYM_TYPE_PCODE = 0x8000 IMAGE_SYM_TYPE_SHORT = 0x0003 IMAGE_SYM_TYPE_STRUCT = 0x0008 IMAGE_SYM_TYPE_UINT = 0x000E IMAGE_SYM_TYPE_UNION = 0x0009 IMAGE_SYM_TYPE_VOID = 0x0001 IMAGE_SYM_TYPE_WORD = 0x000D IMAGE_VXD_SIGNATURE = 0x454C IMAGE_WEAK_EXTERN_SEARCH_ALIAS = 3 IMAGE_WEAK_EXTERN_SEARCH_LIBRARY = 2 IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1 IMC_CLOSESTATUSWINDOW = 0x0021 IMC_GETCANDIDATEPOS = 0x0007 IMC_GETCOMPOSITIONFONT = 0x0009 IMC_GETCOMPOSITIONWINDOW = 0x000B IMC_GETSTATUSWINDOWPOS = 0x000F IMC_OPENSTATUSWINDOW = 0x0022 IMC_SETCANDIDATEPOS = 0x0008 IMC_SETCOMPOSITIONFONT = 0x000A IMC_SETCOMPOSITIONWINDOW = 0x000C IMC_SETSTATUSWINDOWPOS = 0x0010 IMEMENUITEM_STRING_SIZE = 80 IMEVER_0310 = 0x0003000A IMEVER_0400 = 0x00040000 IME_CAND_CODE = 0x0002 IME_CAND_MEANING = 0x0003 IME_CAND_RADICAL = 0x0004 IME_CAND_READ = 0x0001 IME_CAND_STROKE = 0x0005 IME_CAND_UNKNOWN = 0x0000 IME_CHOTKEY_IME_NONIME_TOGGLE = 0x10 IME_CHOTKEY_SHAPE_TOGGLE = 0x11 IME_CHOTKEY_SYMBOL_TOGGLE = 0x12 IME_CMODE_ALPHANUMERIC = 0x0000 IME_CMODE_CHARCODE = 0x0020 IME_CMODE_CHINESE = 1 IME_CMODE_EUDC = 0x0200 IME_CMODE_FIXED = 0x0800 IME_CMODE_FULLSHAPE = 0x0008 IME_CMODE_HANGEUL = 1 IME_CMODE_HANGUL = 1 IME_CMODE_HANJACONVERT = 0x0040 IME_CMODE_JAPANESE = 1 IME_CMODE_KATAKANA = 0x0002 IME_CMODE_LANGUAGE = 0x0003 IME_CMODE_NATIVE = 0x0001 IME_CMODE_NOCONVERSION = 0x0100 IME_CMODE_RESERVED = 0xF0000000 IME_CMODE_ROMAN = 0x0010 IME_CMODE_SOFTKBD = 0x0080 IME_CMODE_SYMBOL = 0x0400 IME_CONFIG_GENERAL = 1 IME_CONFIG_REGISTERWORD = 2 IME_CONFIG_SELECTDICTIONARY = 3 IME_ESC_AUTOMATA = 0x1009 IME_ESC_GETHELPFILENAME = 0x100b IME_ESC_GET_EUDC_DICTIONARY = 0x1003 IME_ESC_HANJA_MODE = 0x1008 IME_ESC_IME_NAME = 0x1006 IME_ESC_MAX_KEY = 0x1005 IME_ESC_PRIVATE_FIRST = 0x0800 IME_ESC_PRIVATE_HOTKEY = 0x100a IME_ESC_PRIVATE_LAST = 0x0FFF IME_ESC_QUERY_SUPPORT = 0x0003 IME_ESC_RESERVED_FIRST = 0x0004 IME_ESC_RESERVED_LAST = 0x07FF IME_ESC_SEQUENCE_TO_INTERNAL = 0x1001 IME_ESC_SET_EUDC_DICTIONARY = 0x1004 IME_ESC_SYNC_HOTKEY = 0x1007 IME_HOTKEY_DSWITCH_FIRST = 0x100 IME_HOTKEY_DSWITCH_LAST = 0x11F IME_HOTKEY_PRIVATE_FIRST = 0x200 IME_HOTKEY_PRIVATE_LAST = 0x21F IME_ITHOTKEY_PREVIOUS_COMPOSITION = 0x201 IME_ITHOTKEY_RECONVERTSTRING = 0x203 IME_ITHOTKEY_RESEND_RESULTSTR = 0x200 IME_ITHOTKEY_UISTYLE_TOGGLE = 0x202 IME_JHOTKEY_CLOSE_OPEN = 0x30 IME_KHOTKEY_ENGLISH = 0x52 IME_KHOTKEY_HANJACONVERT = 0x51 IME_KHOTKEY_SHAPE_TOGGLE = 0x50 IME_PROP_AT_CARET = 0x00010000 IME_PROP_CANDLIST_START_FROM_1 = 0x00040000 IME_PROP_COMPLETE_ON_UNSELECT = 0x00100000 IME_PROP_SPECIAL_UI = 0x00020000 IME_PROP_UNICODE = 0x00080000 IME_REGWORD_STYLE_EUDC = 0x00000001 IME_REGWORD_STYLE_USER_FIRST = 0x80000000 IME_REGWORD_STYLE_USER_LAST = 0xFFFFFFFF IME_SMODE_AUTOMATIC = 0x0004 IME_SMODE_CONVERSATION = 0x0010 IME_SMODE_NONE = 0x0000 IME_SMODE_PHRASEPREDICT = 0x0008 IME_SMODE_PLAURALCLAUSE = 0x0001 IME_SMODE_RESERVED = 0x0000F000 IME_SMODE_SINGLECONVERT = 0x0002 IME_THOTKEY_IME_NONIME_TOGGLE = 0x70 IME_THOTKEY_SHAPE_TOGGLE = 0x71 IME_THOTKEY_SYMBOL_TOGGLE = 0x72 IMFS_CHECKED = 8 IMFS_DEFAULT = 4096 IMFS_DISABLED = 3 IMFS_ENABLED = 0 IMFS_GRAYED = 3 IMFS_HILITE = 128 IMFS_UNCHECKED = 0 IMFS_UNHILITE = 0 IMFT_RADIOCHECK = 0x00001 IMFT_SEPARATOR = 0x00002 IMFT_SUBMENU = 0x00004 IMM_ERROR_GENERAL = -2 IMM_ERROR_NODATA = -1 IMN_CHANGECANDIDATE = 0x0003 IMN_CLOSECANDIDATE = 0x0004 IMN_CLOSESTATUSWINDOW = 0x0001 IMN_GUIDELINE = 0x000D IMN_OPENCANDIDATE = 0x0005 IMN_OPENSTATUSWINDOW = 0x0002 IMN_PRIVATE = 0x000E IMN_SETCANDIDATEPOS = 0x0009 IMN_SETCOMPOSITIONFONT = 0x000A IMN_SETCOMPOSITIONWINDOW = 0x000B IMN_SETCONVERSIONMODE = 0x0006 IMN_SETOPENSTATUS = 0x0008 IMN_SETSENTENCEMODE = 0x0007 IMN_SETSTATUSWINDOWPOS = 0x000C IMPLINK_HIGHEXPER = 158 IMPLINK_IP = 155 IMPLINK_LOWEXPER = 156 IMPLTYPEFLAG_FDEFAULT = 1 IMPLTYPEFLAG_FDEFAULTVTABLE = 8 IMPLTYPEFLAG_FRESTRICTED = 4 IMPLTYPEFLAG_FSOURCE = 2 IMPORT_OBJECT_HDR_SIG2 = 0xffff IMR_CANDIDATEWINDOW = 0x0002 IMR_COMPOSITIONFONT = 0x0003 IMR_COMPOSITIONWINDOW = 0x0001 IMR_CONFIRMRECONVERTSTRING = 0x0005 IMR_DOCUMENTFEED = 0x0007 IMR_QUERYCHARPOSITION = 0x0006 IMR_RECONVERTSTRING = 0x0004 IN = 0 INADDR_LOOPBACK = 0x7f000001 INADDR_NONE = 0xffffffff INCRINIT_NORMAL = 0 INCRINIT_ROOT = 2 INCRINIT_TASK = 1 INDEXID_CONTAINER = 0 INDEXID_OBJECT = 0 INFINITE = 0xffffffff INHERITED_ACE = 16 INHERIT_CALLER_PRIORITY = 0x20000 INHERIT_ONLY_ACE = 8 INHERIT_PARENT_AFFINITY = 0x10000 INITFLAG_AlterAdd = 0x0003 INITFLAG_AlterDrop = 0x0002 INITFLAG_AlterMask = 0x0003 INITFLAG_AlterRename = 0x0001 INITIAL_FPCSR = 0x027f INITIAL_MXCSR = 0x1f80 INIT_ONCE_ASYNC = 2 INIT_ONCE_CHECK_ONLY = 1 INIT_ONCE_CTX_RESERVED_BITS = 2 INIT_ONCE_INIT_FAILED = 4 INLINEFUNC_affinity = 4 INLINEFUNC_coalesce = 0 INLINEFUNC_expr_compare = 3 INLINEFUNC_expr_implies_expr = 2 INLINEFUNC_iif = 5 INLINEFUNC_implies_nonnull_row = 1 INLINEFUNC_sqlite_offset = 6 INLINEFUNC_unlikely = 99 INPLACE_E_FIRST = 2147746208 INPLACE_E_LAST = 2147746223 INPLACE_S_FIRST = 262560 INPLACE_S_LAST = 262575 INPUTLANGCHANGE_BACKWARD = 0x0004 INPUTLANGCHANGE_FORWARD = 0x0002 INPUTLANGCHANGE_SYSCHARSET = 0x0001 INPUT_HARDWARE = 2 INPUT_KEYBOARD = 1 INPUT_MOUSE = 0 INTERNATIONAL_USAGE = 0x1 INT_MAX = 2147483647 INT_MIN = -2147483648 INVALID_OS_COUNT = 65535 IN_CLASSA_HOST = 0x00ffffff IN_CLASSA_MAX = 128 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 24 IN_CLASSB_HOST = 0x0000ffff IN_CLASSB_MAX = 65536 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 16 IN_CLASSC_HOST = 0x000000ff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 8 IN_INDEX_EPH = 2 IN_INDEX_INDEX_ASC = 3 IN_INDEX_INDEX_DESC = 4 IN_INDEX_LOOP = 0x0004 IN_INDEX_MEMBERSHIP = 0x0002 IN_INDEX_NOOP = 5 IN_INDEX_NOOP_OK = 0x0001 IN_INDEX_ROWID = 1 IOCPARM_MASK = 0x7f IOCTL_CHANGER_BASE = 48 IOCTL_CHANGER_EXCHANGE_MEDIUM = 3162144 IOCTL_CHANGER_GET_ELEMENT_STATUS = 3194900 IOCTL_CHANGER_GET_PARAMETERS = 3162112 IOCTL_CHANGER_GET_PRODUCT_DATA = 3162120 IOCTL_CHANGER_GET_STATUS = 3162116 IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS = 3162136 IOCTL_CHANGER_MOVE_MEDIUM = 3162148 IOCTL_CHANGER_QUERY_VOLUME_TAGS = 3194924 IOCTL_CHANGER_REINITIALIZE_TRANSPORT = 3162152 IOCTL_CHANGER_SET_ACCESS = 3194896 IOCTL_CHANGER_SET_POSITION = 3162140 IOCTL_DISK_BASE = 7 IOCTL_DISK_CHECK_VERIFY = 477184 IOCTL_DISK_CONTROLLER_NUMBER = 458820 IOCTL_DISK_CREATE_DISK = 507992 IOCTL_DISK_DELETE_DRIVE_LAYOUT = 508160 IOCTL_DISK_EJECT_MEDIA = 477192 IOCTL_DISK_FIND_NEW_DEVICES = 477208 IOCTL_DISK_FORMAT_DRIVE = 508876 IOCTL_DISK_FORMAT_TRACKS = 507928 IOCTL_DISK_FORMAT_TRACKS_EX = 507948 IOCTL_DISK_GET_CACHE_INFORMATION = 475348 IOCTL_DISK_GET_DRIVE_GEOMETRY = 458752 IOCTL_DISK_GET_DRIVE_GEOMETRY_EX = 458912 IOCTL_DISK_GET_DRIVE_LAYOUT = 475148 IOCTL_DISK_GET_DRIVE_LAYOUT_EX = 458832 IOCTL_DISK_GET_LENGTH_INFO = 475228 IOCTL_DISK_GET_MEDIA_TYPES = 461824 IOCTL_DISK_GET_PARTITION_INFO = 475140 IOCTL_DISK_GET_PARTITION_INFO_EX = 458824 IOCTL_DISK_GROW_PARTITION = 508112 IOCTL_DISK_HISTOGRAM_DATA = 458804 IOCTL_DISK_HISTOGRAM_RESET = 458808 IOCTL_DISK_HISTOGRAM_STRUCTURE = 458800 IOCTL_DISK_IS_WRITABLE = 458788 IOCTL_DISK_LOAD_MEDIA = 477196 IOCTL_DISK_LOGGING = 458792 IOCTL_DISK_MEDIA_REMOVAL = 477188 IOCTL_DISK_PERFORMANCE = 458784 IOCTL_DISK_PERFORMANCE_OFF = 458848 IOCTL_DISK_REASSIGN_BLOCKS = 507932 IOCTL_DISK_REASSIGN_BLOCKS_EX = 508068 IOCTL_DISK_RELEASE = 477204 IOCTL_DISK_REQUEST_DATA = 458816 IOCTL_DISK_REQUEST_STRUCTURE = 458812 IOCTL_DISK_RESERVE = 477200 IOCTL_DISK_RESET_SNAPSHOT_INFO = 508432 IOCTL_DISK_SENSE_DEVICE = 459744 IOCTL_DISK_SET_CACHE_INFORMATION = 508120 IOCTL_DISK_SET_DRIVE_LAYOUT = 507920 IOCTL_DISK_SET_DRIVE_LAYOUT_EX = 507988 IOCTL_DISK_SET_PARTITION_INFO = 507912 IOCTL_DISK_SET_PARTITION_INFO_EX = 507980 IOCTL_DISK_UPDATE_DRIVE_SIZE = 508104 IOCTL_DISK_UPDATE_PROPERTIES = 459072 IOCTL_DISK_VERIFY = 458772 IOCTL_SERENUM_EXPOSE_HARDWARE = 3604992 IOCTL_SERENUM_GET_PORT_NAME = 3605004 IOCTL_SERENUM_PORT_DESC = 3605000 IOCTL_SERENUM_REMOVE_HARDWARE = 3604996 IOCTL_SERIAL_LSRMST_INSERT = 1769596 IOCTL_SMARTCARD_CONFISCATE = 3211280 IOCTL_SMARTCARD_EJECT = 3211288 IOCTL_SMARTCARD_GET_ATTRIBUTE = 3211272 IOCTL_SMARTCARD_GET_LAST_ERROR = 3211324 IOCTL_SMARTCARD_GET_PERF_CNTR = 3211328 IOCTL_SMARTCARD_GET_STATE = 3211320 IOCTL_SMARTCARD_IS_ABSENT = 3211308 IOCTL_SMARTCARD_IS_PRESENT = 3211304 IOCTL_SMARTCARD_POWER = 3211268 IOCTL_SMARTCARD_SET_ATTRIBUTE = 3211276 IOCTL_SMARTCARD_SET_PROTOCOL = 3211312 IOCTL_SMARTCARD_SWALLOW = 3211292 IOCTL_SMARTCARD_TRANSMIT = 3211284 IOCTL_STORAGE_BASE = 45 IOCTL_STORAGE_BREAK_RESERVATION = 2969620 IOCTL_STORAGE_CHECK_VERIFY = 2967552 IOCTL_STORAGE_CHECK_VERIFY2 = 2951168 IOCTL_STORAGE_EJECTION_CONTROL = 2951488 IOCTL_STORAGE_EJECT_MEDIA = 2967560 IOCTL_STORAGE_FIND_NEW_DEVICES = 2967576 IOCTL_STORAGE_GET_DEVICE_NUMBER = 2953344 IOCTL_STORAGE_GET_HOTPLUG_INFO = 2952212 IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER = 2952208 IOCTL_STORAGE_GET_MEDIA_TYPES = 2952192 IOCTL_STORAGE_GET_MEDIA_TYPES_EX = 2952196 IOCTL_STORAGE_LOAD_MEDIA = 2967564 IOCTL_STORAGE_LOAD_MEDIA2 = 2951180 IOCTL_STORAGE_MCN_CONTROL = 2951492 IOCTL_STORAGE_MEDIA_REMOVAL = 2967556 IOCTL_STORAGE_PREDICT_FAILURE = 2953472 IOCTL_STORAGE_QUERY_PROPERTY = 2954240 IOCTL_STORAGE_READ_CAPACITY = 2969920 IOCTL_STORAGE_RELEASE = 2967572 IOCTL_STORAGE_RESERVE = 2967568 IOCTL_STORAGE_RESET_BUS = 2969600 IOCTL_STORAGE_RESET_DEVICE = 2969604 IOCTL_STORAGE_SET_HOTPLUG_INFO = 3001368 IOC_IN = 0x80000000 IOC_INOUT = 3221225472 IOC_OUT = 0x40000000 IOC_VOID = 0x20000000 IO_COMPLETION_ALL_ACCESS = 2031619 IO_COMPLETION_MODIFY_STATE = 0x0002 IO_REPARSE_TAG_AF_UNIX = 2147483683 IO_REPARSE_TAG_APPEXECLINK = 2147483675 IO_REPARSE_TAG_CLOUD = 2415919130 IO_REPARSE_TAG_CLOUD_1 = 2415923226 IO_REPARSE_TAG_CLOUD_2 = 2415927322 IO_REPARSE_TAG_CLOUD_3 = 2415931418 IO_REPARSE_TAG_CLOUD_4 = 2415935514 IO_REPARSE_TAG_CLOUD_5 = 2415939610 IO_REPARSE_TAG_CLOUD_6 = 2415943706 IO_REPARSE_TAG_CLOUD_7 = 2415947802 IO_REPARSE_TAG_CLOUD_8 = 2415951898 IO_REPARSE_TAG_CLOUD_9 = 2415955994 IO_REPARSE_TAG_CLOUD_A = 2415960090 IO_REPARSE_TAG_CLOUD_B = 2415964186 IO_REPARSE_TAG_CLOUD_C = 2415968282 IO_REPARSE_TAG_CLOUD_D = 2415972378 IO_REPARSE_TAG_CLOUD_E = 2415976474 IO_REPARSE_TAG_CLOUD_F = 2415980570 IO_REPARSE_TAG_CLOUD_MASK = 61440 IO_REPARSE_TAG_CSV = 2147483657 IO_REPARSE_TAG_DEDUP = 2147483667 IO_REPARSE_TAG_DFS = 2147483658 IO_REPARSE_TAG_DFSR = 2147483666 IO_REPARSE_TAG_DRIVE_EXTENDER = 2147483653 IO_REPARSE_TAG_FILE_PLACEHOLDER = 2147483669 IO_REPARSE_TAG_FILTER_MANAGER = 2147483659 IO_REPARSE_TAG_GLOBAL_REPARSE = 2684354585 IO_REPARSE_TAG_HSM = 3221225476 IO_REPARSE_TAG_HSM2 = 2147483654 IO_REPARSE_TAG_IIS_CACHE = 2684354576 IO_REPARSE_TAG_MOUNT_POINT = 2684354563 IO_REPARSE_TAG_NFS = 2147483668 IO_REPARSE_TAG_ONEDRIVE = 2147483681 IO_REPARSE_TAG_PROJFS = 2415919132 IO_REPARSE_TAG_PROJFS_TOMBSTONE = 2684354594 IO_REPARSE_TAG_RESERVED_ONE = 1 IO_REPARSE_TAG_RESERVED_RANGE = 1 IO_REPARSE_TAG_RESERVED_ZERO = 0 IO_REPARSE_TAG_SIS = 2147483655 IO_REPARSE_TAG_STORAGE_SYNC = 2147483678 IO_REPARSE_TAG_SYMLINK = 2684354572 IO_REPARSE_TAG_UNHANDLED = 2147483680 IO_REPARSE_TAG_WCI = 2147483672 IO_REPARSE_TAG_WCI_1 = 2415923224 IO_REPARSE_TAG_WCI_TOMBSTONE = 2684354591 IO_REPARSE_TAG_WIM = 2147483656 IO_REPARSE_TAG_WOF = 2147483671 IPPORT_BIFFUDP = 512 IPPORT_CMDSERVER = 514 IPPORT_DAYTIME = 13 IPPORT_DISCARD = 9 IPPORT_ECHO = 7 IPPORT_EFSSERVER = 520 IPPORT_EXECSERVER = 512 IPPORT_FINGER = 79 IPPORT_FTP = 21 IPPORT_LOGINSERVER = 513 IPPORT_MTP = 57 IPPORT_NAMESERVER = 42 IPPORT_NETSTAT = 15 IPPORT_RESERVED = 1024 IPPORT_RJE = 77 IPPORT_ROUTESERVER = 520 IPPORT_SMTP = 25 IPPORT_SUPDUP = 95 IPPORT_SYSTAT = 11 IPPORT_TELNET = 23 IPPORT_TFTP = 69 IPPORT_TIMESERVER = 37 IPPORT_TTYLINK = 87 IPPORT_WHOIS = 43 IPPORT_WHOSERVER = 513 IPPROTO_GGP = 3 IPPROTO_ICMP = 1 IPPROTO_IDP = 22 IPPROTO_IGMP = 2 IPPROTO_IP = 0 IPPROTO_MAX = 256 IPPROTO_ND = 77 IPPROTO_PUP = 12 IPPROTO_RAW = 255 IPPROTO_TCP = 6 IPPROTO_UDP = 17 IP_ADD_MEMBERSHIP = 5 IP_DEFAULT_MULTICAST_LOOP = 1 IP_DEFAULT_MULTICAST_TTL = 1 IP_DONTFRAGMENT = 9 IP_DROP_MEMBERSHIP = 6 IP_MAX_MEMBERSHIPS = 20 IP_MULTICAST_IF = 2 IP_MULTICAST_LOOP = 4 IP_MULTICAST_TTL = 3 IP_OPTIONS = 1 IP_TOS = 8 IP_TTL = 7 ISC_SHOWUIALL = 0xC000000F ISC_SHOWUIALLCANDIDATEWINDOW = 0x0000000F ISC_SHOWUICANDIDATEWINDOW = 0x00000001 ISC_SHOWUICOMPOSITIONWINDOW = 0x80000000 ISC_SHOWUIGUIDELINE = 0x40000000 ISMEX_CALLBACK = 0x00000004 ISMEX_NOSEND = 0x00000000 ISMEX_NOTIFY = 0x00000002 ISMEX_REPLIED = 0x00000008 ISMEX_SEND = 0x00000001 IS_TEXT_UNICODE_ASCII16 = 0x0001 IS_TEXT_UNICODE_CONTROLS = 0x0004 IS_TEXT_UNICODE_DBCS_LEADBYTE = 0x0400 IS_TEXT_UNICODE_ILLEGAL_CHARS = 0x0100 IS_TEXT_UNICODE_NOT_ASCII_MASK = 0xF000 IS_TEXT_UNICODE_NOT_UNICODE_MASK = 0x0F00 IS_TEXT_UNICODE_NULL_BYTES = 0x1000 IS_TEXT_UNICODE_ODD_LENGTH = 0x0200 IS_TEXT_UNICODE_REVERSE_ASCII16 = 0x0010 IS_TEXT_UNICODE_REVERSE_CONTROLS = 0x0040 IS_TEXT_UNICODE_REVERSE_MASK = 0x00F0 IS_TEXT_UNICODE_REVERSE_SIGNATURE = 0x0080 IS_TEXT_UNICODE_REVERSE_STATISTICS = 0x0020 IS_TEXT_UNICODE_SIGNATURE = 0x0008 IS_TEXT_UNICODE_STATISTICS = 0x0002 IS_TEXT_UNICODE_UNICODE_MASK = 0x000F ITALIC_FONTTYPE = 0x200 IsStat4 = 1 JEACH_ATOM = 3 JEACH_FULLKEY = 6 JEACH_ID = 4 JEACH_JSON = 8 JEACH_KEY = 0 JEACH_PARENT = 5 JEACH_PATH = 7 JEACH_ROOT = 9 JEACH_TYPE = 2 JEACH_VALUE = 1 JNODE_APPEND = 0x20 JNODE_ESCAPE = 0x02 JNODE_LABEL = 0x40 JNODE_PATCH = 0x10 JNODE_RAW = 0x01 JNODE_REMOVE = 0x04 JNODE_REPLACE = 0x08 JOB_ACCESS_ADMINISTER = 0x00000010 JOB_ACCESS_READ = 0x00000020 JOB_ALL_ACCESS = 983088 JOB_CONTROL_CANCEL = 3 JOB_CONTROL_DELETE = 5 JOB_CONTROL_LAST_PAGE_EJECTED = 7 JOB_CONTROL_PAUSE = 1 JOB_CONTROL_RESTART = 4 JOB_CONTROL_RESUME = 2 JOB_CONTROL_SENT_TO_PRINTER = 6 JOB_EXECUTE = 131088 JOB_NOTIFY_FIELD_BYTES_PRINTED = 0x17 JOB_NOTIFY_FIELD_DATATYPE = 0x05 JOB_NOTIFY_FIELD_DEVMODE = 0x09 JOB_NOTIFY_FIELD_DOCUMENT = 0x0D JOB_NOTIFY_FIELD_DRIVER_NAME = 0x08 JOB_NOTIFY_FIELD_MACHINE_NAME = 0x01 JOB_NOTIFY_FIELD_NOTIFY_NAME = 0x04 JOB_NOTIFY_FIELD_PAGES_PRINTED = 0x15 JOB_NOTIFY_FIELD_PARAMETERS = 0x07 JOB_NOTIFY_FIELD_PORT_NAME = 0x02 JOB_NOTIFY_FIELD_POSITION = 0x0F JOB_NOTIFY_FIELD_PRINTER_NAME = 0x00 JOB_NOTIFY_FIELD_PRINT_PROCESSOR = 0x06 JOB_NOTIFY_FIELD_PRIORITY = 0x0E JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR = 0x0C JOB_NOTIFY_FIELD_START_TIME = 0x11 JOB_NOTIFY_FIELD_STATUS = 0x0A JOB_NOTIFY_FIELD_STATUS_STRING = 0x0B JOB_NOTIFY_FIELD_SUBMITTED = 0x10 JOB_NOTIFY_FIELD_TIME = 0x13 JOB_NOTIFY_FIELD_TOTAL_BYTES = 0x16 JOB_NOTIFY_FIELD_TOTAL_PAGES = 0x14 JOB_NOTIFY_FIELD_UNTIL_TIME = 0x12 JOB_NOTIFY_FIELD_USER_NAME = 0x03 JOB_NOTIFY_TYPE = 0x01 JOB_OBJECT_ALL_ACCESS = 2031647 JOB_OBJECT_ASSIGN_PROCESS = 1 JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS = 0x000000ff JOB_OBJECT_CPU_RATE_CONTROL_ENABLE = 0x1 JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP = 0x4 JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY = 0x8 JOB_OBJECT_CPU_RATE_CONTROL_VALID_FLAGS = 0xf JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED = 0x2 JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS = 0x00007fff JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008 JOB_OBJECT_LIMIT_AFFINITY = 0x00000010 JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800 JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400 JOB_OBJECT_LIMIT_JOB_MEMORY = 0x00000200 JOB_OBJECT_LIMIT_JOB_READ_BYTES = 0x00010000 JOB_OBJECT_LIMIT_JOB_TIME = 0x00000004 JOB_OBJECT_LIMIT_JOB_WRITE_BYTES = 0x00020000 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000 JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x00000040 JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x00000020 JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x00000100 JOB_OBJECT_LIMIT_PROCESS_TIME = 0x00000002 JOB_OBJECT_LIMIT_RATE_CONTROL = 0x00040000 JOB_OBJECT_LIMIT_RESERVED3 = 0x00008000 JOB_OBJECT_LIMIT_RESERVED4 = 0x00010000 JOB_OBJECT_LIMIT_RESERVED5 = 0x00020000 JOB_OBJECT_LIMIT_RESERVED6 = 0x00040000 JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x00000080 JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x00001000 JOB_OBJECT_LIMIT_SUBSET_AFFINITY = 0x00004000 JOB_OBJECT_LIMIT_VALID_FLAGS = 0x0007ffff JOB_OBJECT_LIMIT_WORKINGSET = 0x00000001 JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS = 8 JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT = 3 JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO = 4 JOB_OBJECT_MSG_END_OF_JOB_TIME = 1 JOB_OBJECT_MSG_END_OF_PROCESS_TIME = 2 JOB_OBJECT_MSG_EXIT_PROCESS = 7 JOB_OBJECT_MSG_JOB_CYCLE_TIME_LIMIT = 12 JOB_OBJECT_MSG_JOB_MEMORY_LIMIT = 10 JOB_OBJECT_MSG_MAXIMUM = 12 JOB_OBJECT_MSG_MINIMUM = 1 JOB_OBJECT_MSG_NEW_PROCESS = 6 JOB_OBJECT_MSG_NOTIFICATION_LIMIT = 11 JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT = 9 JOB_OBJECT_NOTIFICATION_LIMIT_VALID_FLAGS = 0x00070204 JOB_OBJECT_POST_AT_END_OF_JOB = 1 JOB_OBJECT_QUERY = 4 JOB_OBJECT_RESERVED_LIMIT_VALID_FLAGS = 0x0007ffff JOB_OBJECT_SECURITY_FILTER_TOKENS = 0x00000008 JOB_OBJECT_SECURITY_NO_ADMIN = 0x00000001 JOB_OBJECT_SECURITY_ONLY_TOKEN = 0x00000004 JOB_OBJECT_SECURITY_RESTRICTED_TOKEN = 0x00000002 JOB_OBJECT_SECURITY_VALID_FLAGS = 0x0000000f JOB_OBJECT_SET_ATTRIBUTES = 2 JOB_OBJECT_SET_SECURITY_ATTRIBUTES = 16 JOB_OBJECT_TERMINATE = 8 JOB_OBJECT_TERMINATE_AT_END_OF_JOB = 0 JOB_OBJECT_UILIMIT_ALL = 0x000000FF JOB_OBJECT_UILIMIT_DESKTOP = 0x00000040 JOB_OBJECT_UILIMIT_DISPLAYSETTINGS = 0x00000010 JOB_OBJECT_UILIMIT_EXITWINDOWS = 0x00000080 JOB_OBJECT_UILIMIT_GLOBALATOMS = 0x00000020 JOB_OBJECT_UILIMIT_HANDLES = 0x00000001 JOB_OBJECT_UILIMIT_NONE = 0x00000000 JOB_OBJECT_UILIMIT_READCLIPBOARD = 0x00000002 JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x00000008 JOB_OBJECT_UILIMIT_WRITECLIPBOARD = 0x00000004 JOB_OBJECT_UI_VALID_FLAGS = 0x000000FF JOB_POSITION_UNSPECIFIED = 0 JOB_READ = 131104 JOB_STATUS_BLOCKED_DEVQ = 0x00000200 JOB_STATUS_COMPLETE = 0x00001000 JOB_STATUS_DELETED = 0x00000100 JOB_STATUS_DELETING = 0x00000004 JOB_STATUS_ERROR = 0x00000002 JOB_STATUS_OFFLINE = 0x00000020 JOB_STATUS_PAPEROUT = 0x00000040 JOB_STATUS_PAUSED = 0x00000001 JOB_STATUS_PRINTED = 0x00000080 JOB_STATUS_PRINTING = 0x00000010 JOB_STATUS_RESTART = 0x00000800 JOB_STATUS_SPOOLING = 0x00000008 JOB_STATUS_USER_INTERVENTION = 0x00000400 JOB_WRITE = 131088 JOHAB_CHARSET = 130 JOYCAPS_HASPOV = 0x0010 JOYCAPS_HASR = 0x0002 JOYCAPS_HASU = 0x0004 JOYCAPS_HASV = 0x0008 JOYCAPS_HASZ = 0x0001 JOYCAPS_POV4DIR = 0x0020 JOYCAPS_POVCTS = 0x0040 JOYERR_BASE = 160 JOYERR_NOCANDO = 166 JOYERR_NOERROR = 0 JOYERR_PARMS = 165 JOYERR_UNPLUGGED = 167 JOYSTICKID1 = 0 JOYSTICKID2 = 1 JOY_BUTTON1 = 0x0001 JOY_BUTTON10 = 512 JOY_BUTTON11 = 1024 JOY_BUTTON12 = 2048 JOY_BUTTON13 = 4096 JOY_BUTTON14 = 8192 JOY_BUTTON15 = 16384 JOY_BUTTON16 = 32768 JOY_BUTTON17 = 65536 JOY_BUTTON18 = 131072 JOY_BUTTON19 = 262144 JOY_BUTTON1CHG = 0x0100 JOY_BUTTON2 = 0x0002 JOY_BUTTON20 = 524288 JOY_BUTTON21 = 1048576 JOY_BUTTON22 = 2097152 JOY_BUTTON23 = 4194304 JOY_BUTTON24 = 8388608 JOY_BUTTON25 = 16777216 JOY_BUTTON26 = 33554432 JOY_BUTTON27 = 67108864 JOY_BUTTON28 = 134217728 JOY_BUTTON29 = 268435456 JOY_BUTTON2CHG = 0x0200 JOY_BUTTON3 = 0x0004 JOY_BUTTON30 = 536870912 JOY_BUTTON31 = 1073741824 JOY_BUTTON32 = 2147483648 JOY_BUTTON3CHG = 0x0400 JOY_BUTTON4 = 0x0008 JOY_BUTTON4CHG = 0x0800 JOY_BUTTON5 = 16 JOY_BUTTON6 = 32 JOY_BUTTON7 = 64 JOY_BUTTON8 = 128 JOY_BUTTON9 = 256 JOY_CAL_READ3 = 262144 JOY_CAL_READ4 = 524288 JOY_CAL_READ5 = 4194304 JOY_CAL_READ6 = 8388608 JOY_CAL_READALWAYS = 65536 JOY_CAL_READRONLY = 33554432 JOY_CAL_READUONLY = 67108864 JOY_CAL_READVONLY = 134217728 JOY_CAL_READXONLY = 1048576 JOY_CAL_READXYONLY = 131072 JOY_CAL_READYONLY = 2097152 JOY_CAL_READZONLY = 16777216 JOY_POVBACKWARD = 18000 JOY_POVFORWARD = 0 JOY_POVLEFT = 27000 JOY_POVRIGHT = 9000 JOY_RETURNALL = 255 JOY_RETURNBUTTONS = 128 JOY_RETURNCENTERED = 1024 JOY_RETURNPOV = 64 JOY_RETURNPOVCTS = 512 JOY_RETURNR = 8 JOY_RETURNRAWDATA = 256 JOY_RETURNU = 16 JOY_RETURNV = 32 JOY_RETURNX = 1 JOY_RETURNY = 2 JOY_RETURNZ = 4 JOY_USEDEADZONE = 2048 JSON_ABPATH = 0x03 JSON_ARRAY = 6 JSON_CACHE_ID = -429938 JSON_CACHE_SZ = 4 JSON_FALSE = 2 JSON_INT = 3 JSON_ISSET = 0x04 JSON_JSON = 0x01 JSON_MAX_DEPTH = 2000 JSON_NULL = 0 JSON_OBJECT = 7 JSON_REAL = 4 JSON_SQL = 0x02 JSON_STRING = 5 JSON_SUBTYPE = 74 JSON_TRUE = 1 JT_CROSS = 0x02 JT_ERROR = 0x80 JT_INNER = 0x01 JT_LEFT = 0x08 JT_LTORJ = 0x40 JT_NATURAL = 0x04 JT_OUTER = 0x20 JT_RIGHT = 0x10 KDF_ALGORITHMID = 0x8 KDF_CONTEXT = 0xe KDF_GENERIC_PARAMETER = 0x11 KDF_HASH_ALGORITHM = 0x0 KDF_HMAC_KEY = 0x3 KDF_ITERATION_COUNT = 0x10 KDF_KEYBITLENGTH = 0x12 KDF_LABEL = 0xd KDF_PARTYUINFO = 0x9 KDF_PARTYVINFO = 0xa KDF_SALT = 0xf KDF_SECRET_APPEND = 0x2 KDF_SECRET_HANDLE = 0x6 KDF_SECRET_PREPEND = 0x1 KDF_SUPPPRIVINFO = 0xc KDF_SUPPPUBINFO = 0xb KDF_TLS_PRF_LABEL = 0x4 KDF_TLS_PRF_PROTOCOL = 0x7 KDF_TLS_PRF_SEED = 0x5 KDF_USE_SECRET_AS_HMAC_KEY_FLAG = 1 KEYBOARD_OVERRUN_MAKE_CODE = 0xFF KEYEVENTF_EXTENDEDKEY = 0x0001 KEYEVENTF_KEYUP = 0x0002 KEYEVENTF_SCANCODE = 0x0008 KEYEVENTF_UNICODE = 0x0004 KEYINFO_ORDER_BIGNULL = 0x02 KEYINFO_ORDER_DESC = 0x01 KEYSTATEBLOB = 0xc KEY_ALL_ACCESS = 983103 KEY_CREATE_LINK = 32 KEY_CREATE_SUB_KEY = 4 KEY_ENUMERATE_SUB_KEYS = 8 KEY_EVENT = 0x1 KEY_EXECUTE = 131097 KEY_LENGTH_MASK = 0xffff0000 KEY_NOTIFY = 16 KEY_QUERY_VALUE = 1 KEY_READ = 131097 KEY_SET_VALUE = 2 KEY_WOW64_32KEY = 512 KEY_WOW64_64KEY = 256 KEY_WOW64_RES = 768 KEY_WRITE = 131078 KF_ALTDOWN = 0x2000 KF_DLGMODE = 0x0800 KF_EXTENDED = 0x0100 KF_MENUMODE = 0x1000 KF_REPEAT = 0x4000 KF_UP = 0x8000 KLF_ACTIVATE = 0x00000001 KLF_NOTELLSHELL = 0x00000080 KLF_REORDER = 0x00000008 KLF_REPLACELANG = 0x00000010 KLF_RESET = 0x40000000 KLF_SETFORPROCESS = 0x00000100 KLF_SHIFTLOCK = 0x00010000 KLF_SUBSTITUTE_OK = 0x00000002 KL_NAMELENGTH = 9 KP_ADMIN_PIN = 31 KP_ALGID = 7 KP_BLOCKLEN = 8 KP_CERTIFICATE = 26 KP_CLEAR_KEY = 27 KP_CLIENT_RANDOM = 21 KP_CMS_DH_KEY_INFO = 38 KP_CMS_KEY_INFO = 37 KP_EFFECTIVE_KEYLEN = 19 KP_G = 12 KP_GET_USE_COUNT = 42 KP_HIGHEST_VERSION = 41 KP_INFO = 18 KP_IV = 1 KP_KEYEXCHANGE_PIN = 32 KP_KEYLEN = 9 KP_KEYVAL = 30 KP_MODE = 4 KP_MODE_BITS = 5 KP_OAEP_PARAMS = 36 KP_P = 11 KP_PADDING = 3 KP_PERMISSIONS = 6 KP_PIN_ID = 43 KP_PIN_INFO = 44 KP_PRECOMP_MD5 = 24 KP_PRECOMP_SHA = 25 KP_PREHASH = 34 KP_PUB_EX_LEN = 28 KP_PUB_EX_VAL = 29 KP_PUB_PARAMS = 39 KP_Q = 13 KP_RA = 16 KP_RB = 17 KP_ROUNDS = 35 KP_RP = 23 KP_SALT = 2 KP_SALT_EX = 10 KP_SCHANNEL_ALG = 20 KP_SERVER_RANDOM = 22 KP_SIGNATURE_PIN = 33 KP_VERIFY_PARAMS = 40 KP_X = 14 KP_Y = 15 KTM_MARSHAL_BLOB_VERSION_MAJOR = 1 KTM_MARSHAL_BLOB_VERSION_MINOR = 1 LABEL_SECURITY_INFORMATION = 16 LANG_AFRIKAANS = 0x36 LANG_ALBANIAN = 0x1c LANG_ALSATIAN = 0x84 LANG_AMHARIC = 0x5e LANG_ARABIC = 0x01 LANG_ARMENIAN = 0x2b LANG_ASSAMESE = 0x4d LANG_AZERBAIJANI = 0x2c LANG_AZERI = 0x2c LANG_BANGLA = 0x45 LANG_BASHKIR = 0x6d LANG_BASQUE = 0x2d LANG_BELARUSIAN = 0x23 LANG_BENGALI = 0x45 LANG_BOSNIAN = 0x1a LANG_BOSNIAN_NEUTRAL = 0x781a LANG_BRETON = 0x7e LANG_BULGARIAN = 0x02 LANG_CATALAN = 0x03 LANG_CENTRAL_KURDISH = 0x92 LANG_CHEROKEE = 0x5c LANG_CHINESE = 0x04 LANG_CHINESE_SIMPLIFIED = 0x04 LANG_CHINESE_TRADITIONAL = 0x7c04 LANG_CORSICAN = 0x83 LANG_CROATIAN = 0x1a LANG_CZECH = 0x05 LANG_DANISH = 0x06 LANG_DARI = 0x8c LANG_DIVEHI = 0x65 LANG_DUTCH = 0x13 LANG_ENGLISH = 0x09 LANG_ESTONIAN = 0x25 LANG_FAEROESE = 0x38 LANG_FARSI = 0x29 LANG_FILIPINO = 0x64 LANG_FINNISH = 0x0b LANG_FRENCH = 0x0c LANG_FRISIAN = 0x62 LANG_FULAH = 0x67 LANG_GALICIAN = 0x56 LANG_GEORGIAN = 0x37 LANG_GERMAN = 0x07 LANG_GREEK = 0x08 LANG_GREENLANDIC = 0x6f LANG_GUJARATI = 0x47 LANG_HAUSA = 0x68 LANG_HEBREW = 0x0d LANG_HINDI = 0x39 LANG_HUNGARIAN = 0x0e LANG_ICELANDIC = 0x0f LANG_IGBO = 0x70 LANG_INDONESIAN = 0x21 LANG_INUKTITUT = 0x5d LANG_INVARIANT = 0x7f LANG_IRISH = 0x3c LANG_ITALIAN = 0x10 LANG_JAPANESE = 0x11 LANG_KANNADA = 0x4b LANG_KASHMIRI = 0x60 LANG_KAZAK = 0x3f LANG_KHMER = 0x53 LANG_KICHE = 0x86 LANG_KINYARWANDA = 0x87 LANG_KONKANI = 0x57 LANG_KOREAN = 0x12 LANG_KYRGYZ = 0x40 LANG_LAO = 0x54 LANG_LATVIAN = 0x26 LANG_LITHUANIAN = 0x27 LANG_LOWER_SORBIAN = 0x2e LANG_LUXEMBOURGISH = 0x6e LANG_MACEDONIAN = 0x2f LANG_MALAY = 0x3e LANG_MALAYALAM = 0x4c LANG_MALTESE = 0x3a LANG_MANIPURI = 0x58 LANG_MAORI = 0x81 LANG_MAPUDUNGUN = 0x7a LANG_MARATHI = 0x4e LANG_MOHAWK = 0x7c LANG_MONGOLIAN = 0x50 LANG_NEPALI = 0x61 LANG_NEUTRAL = 0x00 LANG_NORWEGIAN = 0x14 LANG_OCCITAN = 0x82 LANG_ODIA = 0x48 LANG_ORIYA = 0x48 LANG_PASHTO = 0x63 LANG_PERSIAN = 0x29 LANG_POLISH = 0x15 LANG_PORTUGUESE = 0x16 LANG_PULAR = 0x67 LANG_PUNJABI = 0x46 LANG_QUECHUA = 0x6b LANG_ROMANIAN = 0x18 LANG_ROMANSH = 0x17 LANG_RUSSIAN = 0x19 LANG_SAKHA = 0x85 LANG_SAMI = 0x3b LANG_SANSKRIT = 0x4f LANG_SCOTTISH_GAELIC = 0x91 LANG_SERBIAN = 0x1a LANG_SERBIAN_NEUTRAL = 0x7c1a LANG_SINDHI = 0x59 LANG_SINHALESE = 0x5b LANG_SLOVAK = 0x1b LANG_SLOVENIAN = 0x24 LANG_SOTHO = 0x6c LANG_SPANISH = 0x0a LANG_SWAHILI = 0x41 LANG_SWEDISH = 0x1d LANG_SYRIAC = 0x5a LANG_TAJIK = 0x28 LANG_TAMAZIGHT = 0x5f LANG_TAMIL = 0x49 LANG_TATAR = 0x44 LANG_TELUGU = 0x4a LANG_THAI = 0x1e LANG_TIBETAN = 0x51 LANG_TIGRIGNA = 0x73 LANG_TIGRINYA = 0x73 LANG_TSWANA = 0x32 LANG_TURKISH = 0x1f LANG_TURKMEN = 0x42 LANG_UIGHUR = 0x80 LANG_UKRAINIAN = 0x22 LANG_UPPER_SORBIAN = 0x2e LANG_URDU = 0x20 LANG_UZBEK = 0x43 LANG_VALENCIAN = 0x03 LANG_VIETNAMESE = 0x2a LANG_WELSH = 0x52 LANG_WOLOF = 0x88 LANG_XHOSA = 0x34 LANG_YAKUT = 0x85 LANG_YI = 0x78 LANG_YORUBA = 0x6a LANG_ZULU = 0x35 LAYOUT_BITMAPORIENTATIONPRESERVED = 0x00000008 LAYOUT_BTT = 0x00000002 LAYOUT_ORIENTATIONMASK = 7 LAYOUT_RTL = 0x00000001 LAYOUT_VBH = 0x00000004 LBN_DBLCLK = 2 LBN_ERRSPACE = -2 LBN_KILLFOCUS = 5 LBN_SELCANCEL = 3 LBN_SELCHANGE = 1 LBN_SETFOCUS = 4 LBSELCHSTRINGA = "commdlg_LBSelChangedNotify" LBS_COMBOBOX = 32768 LBS_DISABLENOSCROLL = 4096 LBS_EXTENDEDSEL = 2048 LBS_HASSTRINGS = 64 LBS_MULTICOLUMN = 512 LBS_MULTIPLESEL = 8 LBS_NODATA = 8192 LBS_NOINTEGRALHEIGHT = 256 LBS_NOREDRAW = 4 LBS_NOSEL = 16384 LBS_NOTIFY = 1 LBS_OWNERDRAWFIXED = 16 LBS_OWNERDRAWVARIABLE = 32 LBS_SORT = 2 LBS_STANDARD = 10485763 LBS_USETABSTOPS = 128 LBS_WANTKEYBOARDINPUT = 1024 LB_ADDFILE = 0x0196 LB_ADDSTRING = 0x0180 LB_CTLCODE = 0 LB_DELETESTRING = 0x0182 LB_DIR = 0x018D LB_ERR = -1 LB_ERRSPACE = -2 LB_FINDSTRING = 0x018F LB_FINDSTRINGEXACT = 0x01A2 LB_GETANCHORINDEX = 0x019D LB_GETCARETINDEX = 0x019F LB_GETCOUNT = 0x018B LB_GETCURSEL = 0x0188 LB_GETHORIZONTALEXTENT = 0x0193 LB_GETITEMDATA = 0x0199 LB_GETITEMHEIGHT = 0x01A1 LB_GETITEMRECT = 0x0198 LB_GETLISTBOXINFO = 0x01B2 LB_GETLOCALE = 0x01A6 LB_GETSEL = 0x0187 LB_GETSELCOUNT = 0x0190 LB_GETSELITEMS = 0x0191 LB_GETTEXT = 0x0189 LB_GETTEXTLEN = 0x018A LB_GETTOPINDEX = 0x018E LB_INITSTORAGE = 0x01A8 LB_INSERTSTRING = 0x0181 LB_ITEMFROMPOINT = 0x01A9 LB_MSGMAX = 0x01B3 LB_OKAY = 0 LB_RESETCONTENT = 0x0184 LB_SELECTSTRING = 0x018C LB_SELITEMRANGE = 0x019B LB_SELITEMRANGEEX = 0x0183 LB_SETANCHORINDEX = 0x019C LB_SETCARETINDEX = 0x019E LB_SETCOLUMNWIDTH = 0x0195 LB_SETCOUNT = 0x01A7 LB_SETCURSEL = 0x0186 LB_SETHORIZONTALEXTENT = 0x0194 LB_SETITEMDATA = 0x019A LB_SETITEMHEIGHT = 0x01A0 LB_SETLOCALE = 0x01A5 LB_SETSEL = 0x0185 LB_SETTABSTOPS = 0x0192 LB_SETTOPINDEX = 0x0197 LCID_ALTERNATE_SORTS = 0x00000004 LCID_INSTALLED = 0x00000001 LCID_SUPPORTED = 0x00000002 LCMAP_BYTEREV = 0x00000800 LCMAP_FULLWIDTH = 0x00800000 LCMAP_HALFWIDTH = 0x00400000 LCMAP_HIRAGANA = 0x00100000 LCMAP_KATAKANA = 0x00200000 LCMAP_LINGUISTIC_CASING = 0x01000000 LCMAP_LOWERCASE = 0x00000100 LCMAP_SIMPLIFIED_CHINESE = 0x02000000 LCMAP_SORTKEY = 0x00000400 LCMAP_TRADITIONAL_CHINESE = 0x04000000 LCMAP_UPPERCASE = 0x00000200 LCS_CALIBRATED_RGB = 0 LCS_GM_ABS_COLORIMETRIC = 8 LCS_GM_BUSINESS = 1 LCS_GM_GRAPHICS = 2 LCS_GM_IMAGES = 4 LCS_SIGNATURE = 80 LCS_WINDOWS_COLOR_SPACE = 87 LCS_sRGB = 115 LC_INTERIORS = 128 LC_MARKER = 4 LC_NONE = 0 LC_POLYLINE = 2 LC_POLYMARKER = 8 LC_STYLED = 32 LC_WIDE = 16 LC_WIDESTYLED = 64 LEFT_ALT_PRESSED = 0x2 LEFT_CTRL_PRESSED = 0x8 LEGACY_SCHEMA_TABLE = "sqlite_master" LEGACY_TEMP_SCHEMA_TABLE = "sqlite_temp_master" LF_FACESIZE = 32 LF_FULLFACESIZE = 64 LGRPID_ARABIC = 0x000d LGRPID_ARMENIAN = 0x0011 LGRPID_BALTIC = 0x0003 LGRPID_CENTRAL_EUROPE = 0x0002 LGRPID_CYRILLIC = 0x0005 LGRPID_GEORGIAN = 0x0010 LGRPID_GREEK = 0x0004 LGRPID_HEBREW = 0x000c LGRPID_INDIC = 0x000f LGRPID_INSTALLED = 0x00000001 LGRPID_JAPANESE = 0x0007 LGRPID_KOREAN = 0x0008 LGRPID_SIMPLIFIED_CHINESE = 0x000a LGRPID_SUPPORTED = 0x00000002 LGRPID_THAI = 0x000b LGRPID_TRADITIONAL_CHINESE = 0x0009 LGRPID_TURKIC = 0x0006 LGRPID_TURKISH = 0x0006 LGRPID_VIETNAMESE = 0x000e LGRPID_WESTERN_EUROPE = 0x0001 LHND = 66 LINECAPS = 30 LINGUISTIC_IGNORECASE = 0x00000010 LINGUISTIC_IGNOREDIACRITIC = 0x00000020 LISTEN_OUTSTANDING = 0x01 LLKHF_ALTDOWN = 32 LLKHF_EXTENDED = 1 LLKHF_INJECTED = 0x00000010 LLKHF_LOWER_IL_INJECTED = 0x00000002 LLKHF_UP = 128 LLMHF_INJECTED = 0x00000001 LLMHF_LOWER_IL_INJECTED = 0x00000002 LLONG_MAX = 9223372036854775807 LLONG_MIN = -9223372036854775808 LMEM_DISCARDABLE = 0xf00 LMEM_DISCARDED = 0x4000 LMEM_FIXED = 0x0 LMEM_INVALID_HANDLE = 0x8000 LMEM_LOCKCOUNT = 0xff LMEM_MODIFY = 0x80 LMEM_MOVEABLE = 0x2 LMEM_NOCOMPACT = 0x10 LMEM_NODISCARD = 0x20 LMEM_VALID_FLAGS = 0xf72 LMEM_ZEROINIT = 0x40 LOAD_DLL_DEBUG_EVENT = 6 LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x10 LOAD_LIBRARY_AS_DATAFILE = 0x2 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x40 LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x20 LOAD_LIBRARY_REQUIRE_SIGNED_TARGET = 0x80 LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x200 LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x1000 LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x100 LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x800 LOAD_LIBRARY_SEARCH_SYSTEM32_NO_FORWARDER = 2048 LOAD_LIBRARY_SEARCH_USER_DIRS = 0x400 LOAD_TLB_AS_32BIT = 0x20 LOAD_TLB_AS_64BIT = 0x40 LOAD_WITH_ALTERED_SEARCH_PATH = 0x8 LOCALE_FONTSIGNATURE = 0x00000058 LOCALE_ICALENDARTYPE = 0x00001009 LOCALE_ICENTURY = 0x00000024 LOCALE_ICOUNTRY = 0x00000005 LOCALE_ICURRDIGITS = 0x00000019 LOCALE_ICURRENCY = 0x0000001b LOCALE_IDATE = 0x00000021 LOCALE_IDAYLZERO = 0x00000026 LOCALE_IDEFAULTANSICODEPAGE = 0x00001004 LOCALE_IDEFAULTCODEPAGE = 0x0000000b LOCALE_IDEFAULTCOUNTRY = 0x0000000a LOCALE_IDEFAULTEBCDICCODEPAGE = 0x00001012 LOCALE_IDEFAULTLANGUAGE = 0x00000009 LOCALE_IDEFAULTMACCODEPAGE = 0x00001011 LOCALE_IDIGITS = 0x00000011 LOCALE_IDIGITSUBSTITUTION = 0x00001014 LOCALE_IFIRSTDAYOFWEEK = 0x0000100c LOCALE_IFIRSTWEEKOFYEAR = 0x0000100d LOCALE_IGEOID = 0x0000005b LOCALE_IINTLCURRDIGITS = 0x0000001a LOCALE_ILANGUAGE = 0x00000001 LOCALE_ILDATE = 0x00000022 LOCALE_ILZERO = 0x00000012 LOCALE_IMEASURE = 0x0000000d LOCALE_IMONLZERO = 0x00000027 LOCALE_INEGCURR = 0x0000001c LOCALE_INEGNUMBER = 0x00001010 LOCALE_INEGSEPBYSPACE = 0x00000057 LOCALE_INEGSIGNPOSN = 0x00000053 LOCALE_INEGSYMPRECEDES = 0x00000056 LOCALE_IOPTIONALCALENDAR = 0x0000100b LOCALE_IPAPERSIZE = 0x0000100a LOCALE_IPOSSEPBYSPACE = 0x00000055 LOCALE_IPOSSIGNPOSN = 0x00000052 LOCALE_IPOSSYMPRECEDES = 0x00000054 LOCALE_ITIME = 0x00000023 LOCALE_ITIMEMARKPOSN = 0x00001005 LOCALE_ITLZERO = 0x00000025 LOCALE_NAME_MAX_LENGTH = 85 LOCALE_NOUSEROVERRIDE = 0x80000000 LOCALE_RETURN_NUMBER = 0x20000000 LOCALE_S1159 = 0x00000028 LOCALE_S2359 = 0x00000029 LOCALE_SABBREVCTRYNAME = 0x00000007 LOCALE_SABBREVDAYNAME1 = 0x00000031 LOCALE_SABBREVDAYNAME2 = 0x00000032 LOCALE_SABBREVDAYNAME3 = 0x00000033 LOCALE_SABBREVDAYNAME4 = 0x00000034 LOCALE_SABBREVDAYNAME5 = 0x00000035 LOCALE_SABBREVDAYNAME6 = 0x00000036 LOCALE_SABBREVDAYNAME7 = 0x00000037 LOCALE_SABBREVLANGNAME = 0x00000003 LOCALE_SABBREVMONTHNAME1 = 0x00000044 LOCALE_SABBREVMONTHNAME10 = 0x0000004d LOCALE_SABBREVMONTHNAME11 = 0x0000004e LOCALE_SABBREVMONTHNAME12 = 0x0000004f LOCALE_SABBREVMONTHNAME13 = 0x0000100f LOCALE_SABBREVMONTHNAME2 = 0x00000045 LOCALE_SABBREVMONTHNAME3 = 0x00000046 LOCALE_SABBREVMONTHNAME4 = 0x00000047 LOCALE_SABBREVMONTHNAME5 = 0x00000048 LOCALE_SABBREVMONTHNAME6 = 0x00000049 LOCALE_SABBREVMONTHNAME7 = 0x0000004a LOCALE_SABBREVMONTHNAME8 = 0x0000004b LOCALE_SABBREVMONTHNAME9 = 0x0000004c LOCALE_SCOUNTRY = 0x00000006 LOCALE_SCURRENCY = 0x00000014 LOCALE_SDATE = 0x0000001d LOCALE_SDAYNAME1 = 0x0000002a LOCALE_SDAYNAME2 = 0x0000002b LOCALE_SDAYNAME3 = 0x0000002c LOCALE_SDAYNAME4 = 0x0000002d LOCALE_SDAYNAME5 = 0x0000002e LOCALE_SDAYNAME6 = 0x0000002f LOCALE_SDAYNAME7 = 0x00000030 LOCALE_SDECIMAL = 0x0000000e LOCALE_SENGCOUNTRY = 0x00001002 LOCALE_SENGCURRNAME = 0x00001007 LOCALE_SENGLANGUAGE = 0x00001001 LOCALE_SENGLISHCOUNTRYNAME = 0x00001002 LOCALE_SENGLISHLANGUAGENAME = 0x00001001 LOCALE_SGROUPING = 0x00000010 LOCALE_SINTLSYMBOL = 0x00000015 LOCALE_SISO3166CTRYNAME = 0x0000005a LOCALE_SISO639LANGNAME = 0x00000059 LOCALE_SLANGUAGE = 0x00000002 LOCALE_SLIST = 0x0000000c LOCALE_SLOCALIZEDCOUNTRYNAME = 0x00000006 LOCALE_SLOCALIZEDDISPLAYNAME = 0x00000002 LOCALE_SLONGDATE = 0x00000020 LOCALE_SMONDECIMALSEP = 0x00000016 LOCALE_SMONGROUPING = 0x00000018 LOCALE_SMONTHNAME1 = 0x00000038 LOCALE_SMONTHNAME10 = 0x00000041 LOCALE_SMONTHNAME11 = 0x00000042 LOCALE_SMONTHNAME12 = 0x00000043 LOCALE_SMONTHNAME13 = 0x0000100e LOCALE_SMONTHNAME2 = 0x00000039 LOCALE_SMONTHNAME3 = 0x0000003a LOCALE_SMONTHNAME4 = 0x0000003b LOCALE_SMONTHNAME5 = 0x0000003c LOCALE_SMONTHNAME6 = 0x0000003d LOCALE_SMONTHNAME7 = 0x0000003e LOCALE_SMONTHNAME8 = 0x0000003f LOCALE_SMONTHNAME9 = 0x00000040 LOCALE_SMONTHOUSANDSEP = 0x00000017 LOCALE_SNATIVECOUNTRYNAME = 0x00000008 LOCALE_SNATIVECTRYNAME = 0x00000008 LOCALE_SNATIVECURRNAME = 0x00001008 LOCALE_SNATIVEDIGITS = 0x00000013 LOCALE_SNATIVELANGNAME = 0x00000004 LOCALE_SNATIVELANGUAGENAME = 0x00000004 LOCALE_SNEGATIVESIGN = 0x00000051 LOCALE_SPOSITIVESIGN = 0x00000050 LOCALE_SSHORTDATE = 0x0000001f LOCALE_SSORTNAME = 0x00001013 LOCALE_STHOUSAND = 0x0000000f LOCALE_STIME = 0x0000001e LOCALE_STIMEFORMAT = 0x00001003 LOCALE_SYEARMONTH = 0x00001006 LOCALE_USE_CP_ACP = 0x40000000 LOCALE_USE_NLS = 0x10000000 LOCATE_NOERR = 0x02 LOCATE_VIEW = 0x01 LOCKFILE_EXCLUSIVE_LOCK = 0x2 LOCKFILE_FAIL_IMMEDIATELY = 0x1 LOCK_ELEMENT = 0 LOCK_UNLOCK_DOOR = 0x02 LOCK_UNLOCK_IEPORT = 0x01 LOCK_UNLOCK_KEYPAD = 0x04 LOGON32_LOGON_BATCH = 4 LOGON32_LOGON_INTERACTIVE = 2 LOGON32_LOGON_NETWORK = 3 LOGON32_LOGON_NETWORK_CLEARTEXT = 8 LOGON32_LOGON_NEW_CREDENTIALS = 9 LOGON32_LOGON_SERVICE = 5 LOGON32_LOGON_UNLOCK = 7 LOGON32_PROVIDER_DEFAULT = 0 LOGON32_PROVIDER_WINNT35 = 1 LOGON32_PROVIDER_WINNT40 = 2 LOGON32_PROVIDER_WINNT50 = 3 LOGON_NETCREDENTIALS_ONLY = 0x00000002 LOGON_WITH_PROFILE = 0x00000001 LOGON_ZERO_PASSWORD_BUFFER = 0x80000000 LOGPIXELSX = 88 LOGPIXELSY = 90 LONG_LONG_MAX = 9223372036854775807 LONG_LONG_MIN = -9223372036854775808 LONG_MAX = 2147483647 LONG_MIN = -2147483648 LOOKASIDE_SMALL = 128 LOW_SURROGATE_END = 0xdfff LOW_SURROGATE_START = 0xdc00 LPD_DOUBLEBUFFER = 0x00000001 LPD_SHARE_ACCUM = 0x00000100 LPD_SHARE_DEPTH = 0x00000040 LPD_SHARE_STENCIL = 0x00000080 LPD_STEREO = 0x00000002 LPD_SUPPORT_GDI = 0x00000010 LPD_SUPPORT_OPENGL = 0x00000020 LPD_SWAP_COPY = 0x00000400 LPD_SWAP_EXCHANGE = 0x00000200 LPD_TRANSPARENT = 0x00001000 LPD_TYPE_COLORINDEX = 1 LPD_TYPE_RGBA = 0 LPTR = 64 LPTx = 0x80 LR_COLOR = 0x0002 LR_COPYDELETEORG = 0x0008 LR_COPYFROMRESOURCE = 0x4000 LR_COPYRETURNORG = 0x0004 LR_CREATEDIBSECTION = 0x2000 LR_DEFAULTCOLOR = 0x0000 LR_DEFAULTSIZE = 0x0040 LR_LOADFROMFILE = 0x0010 LR_LOADMAP3DCOLORS = 0x1000 LR_LOADTRANSPARENT = 0x0020 LR_MONOCHROME = 0x0001 LR_SHARED = 0x8000 LR_VGACOLOR = 0x0080 LSFW_LOCK = 1 LSFW_UNLOCK = 2 LTGRAY_BRUSH = 1 LTP_PC_SMT = 0x1 LUA_TOKEN = 0x4 LWA_ALPHA = 0x00000002 LWA_COLORKEY = 0x00000001 LZERROR_BADINHANDLE = -1 LZERROR_BADOUTHANDLE = -2 LZERROR_BADVALUE = -7 LZERROR_GLOBALLOC = -5 LZERROR_GLOBLOCK = -6 LZERROR_READ = -3 LZERROR_UNKNOWNALG = -8 LZERROR_WRITE = -4 M10d_Any = 1 M10d_No = 2 M10d_Yes = 0 MAC_CHARSET = 77 MAPVK_VK_TO_CHAR = 2 MAPVK_VK_TO_VSC = 0 MAPVK_VSC_TO_VK = 1 MAPVK_VSC_TO_VK_EX = 3 MAP_COMPOSITE = 0x00000040 MAP_EXPAND_LIGATURES = 0x00002000 MAP_FOLDCZONE = 0x00000010 MAP_FOLDDIGITS = 0x00000080 MAP_PRECOMPOSED = 0x00000020 MARKPARITY = 3 MARK_HANDLE_NOT_REALTIME = 64 MARK_HANDLE_NOT_TXF_SYSTEM_LOG = 8 MARK_HANDLE_PROTECT_CLUSTERS = 1 MARK_HANDLE_REALTIME = 32 MARK_HANDLE_TXF_SYSTEM_LOG = 4 MARSHALINTERFACE_MIN = 500 MARSHAL_E_FIRST = 2147746080 MARSHAL_E_LAST = 2147746095 MARSHAL_S_FIRST = 262432 MARSHAL_S_LAST = 262447 MASK_TO_RESET_TLB_BITS = -97 MAXBYTE = 0xff MAXCHAR = 0x7f MAXDWORD = 0xffffffff MAXERRORLENGTH = 256 MAXGETHOSTSTRUCT = 1024 MAXIMUM_ALLOWED = 33554432 MAXIMUM_ATTR_STRING_LENGTH = 32 MAXIMUM_ENCRYPTION_VALUE = 0x00000004 MAXIMUM_PROCESSORS = 64 MAXIMUM_PROC_PER_GROUP = 64 MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384 MAXIMUM_SMARTCARD_READERS = 10 MAXIMUM_SUSPEND_COUNT = 127 MAXIMUM_WAIT_OBJECTS = 64 MAXIMUM_XSTATE_FEATURES = 64 MAXINTATOM = 0xc000 MAXLOGICALLOGNAMESIZE = 256 MAXLONG = 0x7fffffff MAXLONGLONG = 9223372036854775807 MAXPNAMELEN = 32 MAXPROPPAGES = 100 MAXSHORT = 0x7fff MAXSTRETCHBLTMODE = 4 MAXUIDLEN = 64 MAXWORD = 0xffff MAX_ACL_REVISION = 4 MAX_COMPUTERNAME_LENGTH = 15 MAX_DEFAULTCHAR = 2 MAX_HW_COUNTERS = 16 MAX_JOYSTICKOEMVXDNAME = 260 MAX_LANA = 254 MAX_LEADBYTES = 12 MAX_MONITORS = 4 MAX_NUM_REASONS = 256 MAX_PATH = 260 MAX_PERF_OBJECTS_IN_QUERY_FUNCTION = 64 MAX_PRIORITY = 99 MAX_PROFILE_LEN = 80 MAX_REASON_BUGID_LEN = 32 MAX_REASON_COMMENT_LEN = 512 MAX_REASON_DESC_LEN = 256 MAX_REASON_NAME_LEN = 64 MAX_RESOURCEMANAGER_DESCRIPTION_LENGTH = 64 MAX_SECTOR_SIZE = 0x10000 MAX_SHUTDOWN_TIMEOUT = 315360000 MAX_SID_SIZE = 256 MAX_SIZE_SECURITY_ID = 512 MAX_STR_BLOCKREASON = 256 MAX_SUPPORTED_OS_NUM = 4 MAX_TRANSACTION_DESCRIPTION_LENGTH = 64 MAX_VOLUME_ID_SIZE = 36 MAX_VOLUME_TEMPLATE_SIZE = 40 MA_ACTIVATE = 1 MA_ACTIVATEANDEAT = 2 MA_NOACTIVATE = 3 MA_NOACTIVATEANDEAT = 4 MB_ABORTRETRYIGNORE = 2 MB_APPLMODAL = 0 MB_CANCELTRYCONTINUE = 6 MB_COMPOSITE = 0x00000002 MB_DEFAULT_DESKTOP_ONLY = 131072 MB_DEFBUTTON1 = 0 MB_DEFBUTTON2 = 256 MB_DEFBUTTON3 = 512 MB_DEFBUTTON4 = 768 MB_DEFMASK = 3840 MB_ERR_INVALID_CHARS = 0x00000008 MB_HELP = 16384 MB_ICONASTERISK = 64 MB_ICONERROR = 16 MB_ICONEXCLAMATION = 48 MB_ICONHAND = 16 MB_ICONINFORMATION = 64 MB_ICONMASK = 240 MB_ICONQUESTION = 32 MB_ICONSTOP = 16 MB_ICONWARNING = 48 MB_LEN_MAX = 5 MB_MISCMASK = 49152 MB_MODEMASK = 12288 MB_NOFOCUS = 32768 MB_OK = 0 MB_OKCANCEL = 1 MB_PRECOMPOSED = 0x00000001 MB_RETRYCANCEL = 5 MB_RIGHT = 524288 MB_RTLREADING = 1048576 MB_SERVICE_NOTIFICATION = 2097152 MB_SERVICE_NOTIFICATION_NT3X = 262144 MB_SETFOREGROUND = 65536 MB_SYSTEMMODAL = 4096 MB_TASKMODAL = 8192 MB_TOPMOST = 262144 MB_TYPEMASK = 15 MB_USEGLYPHCHARS = 0x00000004 MB_USERICON = 128 MB_YESNO = 4 MB_YESNOCANCEL = 3 MCIERR_BAD_CONSTANT = 290 MCIERR_BAD_INTEGER = 270 MCIERR_BAD_TIME_FORMAT = 293 MCIERR_BASE = 256 MCIERR_CANNOT_LOAD_DRIVER = 266 MCIERR_CANNOT_USE_ALL = 279 MCIERR_CREATEWINDOW = 347 MCIERR_CUSTOM_DRIVER_BASE = 512 MCIERR_DEVICE_LENGTH = 310 MCIERR_DEVICE_LOCKED = 288 MCIERR_DEVICE_NOT_INSTALLED = 306 MCIERR_DEVICE_NOT_READY = 276 MCIERR_DEVICE_OPEN = 265 MCIERR_DEVICE_ORD_LENGTH = 311 MCIERR_DEVICE_TYPE_REQUIRED = 287 MCIERR_DRIVER = 278 MCIERR_DRIVER_INTERNAL = 272 MCIERR_DUPLICATE_ALIAS = 289 MCIERR_DUPLICATE_FLAGS = 295 MCIERR_EXTENSION_NOT_FOUND = 281 MCIERR_EXTRA_CHARACTERS = 305 MCIERR_FILENAME_REQUIRED = 304 MCIERR_FILE_NOT_FOUND = 275 MCIERR_FILE_NOT_SAVED = 286 MCIERR_FILE_READ = 348 MCIERR_FILE_WRITE = 349 MCIERR_FLAGS_NOT_COMPATIBLE = 284 MCIERR_GET_CD = 307 MCIERR_HARDWARE = 262 MCIERR_ILLEGAL_FOR_AUTO_OPEN = 303 MCIERR_INTERNAL = 277 MCIERR_INVALID_DEVICE_ID = 257 MCIERR_INVALID_DEVICE_NAME = 263 MCIERR_INVALID_FILE = 296 MCIERR_MISSING_COMMAND_STRING = 267 MCIERR_MISSING_DEVICE_NAME = 292 MCIERR_MISSING_PARAMETER = 273 MCIERR_MISSING_STRING_ARGUMENT = 269 MCIERR_MULTIPLE = 280 MCIERR_MUST_USE_SHAREABLE = 291 MCIERR_NEW_REQUIRES_ALIAS = 299 MCIERR_NONAPPLICABLE_FUNCTION = 302 MCIERR_NOTIFY_ON_AUTO_OPEN = 300 MCIERR_NO_CLOSING_QUOTE = 294 MCIERR_NO_ELEMENT_ALLOWED = 301 MCIERR_NO_IDENTITY = 350 MCIERR_NO_INTEGER = 312 MCIERR_NO_WINDOW = 346 MCIERR_NULL_PARAMETER_BLOCK = 297 MCIERR_OUTOFRANGE = 282 MCIERR_OUT_OF_MEMORY = 264 MCIERR_PARAM_OVERFLOW = 268 MCIERR_PARSER_INTERNAL = 271 MCIERR_SEQ_DIV_INCOMPATIBLE = 336 MCIERR_SEQ_NOMIDIPRESENT = 343 MCIERR_SEQ_PORTUNSPECIFIED = 342 MCIERR_SEQ_PORT_INUSE = 337 MCIERR_SEQ_PORT_MAPNODEVICE = 339 MCIERR_SEQ_PORT_MISCERROR = 340 MCIERR_SEQ_PORT_NONEXISTENT = 338 MCIERR_SEQ_TIMER = 341 MCIERR_SET_CD = 308 MCIERR_SET_DRIVE = 309 MCIERR_UNNAMED_RESOURCE = 298 MCIERR_UNRECOGNIZED_COMMAND = 261 MCIERR_UNRECOGNIZED_KEYWORD = 259 MCIERR_UNSUPPORTED_FUNCTION = 274 MCIERR_WAVE_INPUTSINUSE = 322 MCIERR_WAVE_INPUTSUNSUITABLE = 328 MCIERR_WAVE_INPUTUNSPECIFIED = 325 MCIERR_WAVE_OUTPUTSINUSE = 320 MCIERR_WAVE_OUTPUTSUNSUITABLE = 326 MCIERR_WAVE_OUTPUTUNSPECIFIED = 324 MCIERR_WAVE_SETINPUTINUSE = 323 MCIERR_WAVE_SETINPUTUNSUITABLE = 329 MCIERR_WAVE_SETOUTPUTINUSE = 321 MCIERR_WAVE_SETOUTPUTUNSUITABLE = 327 MCI_ANIM_GETDEVCAPS_CAN_REVERSE = 16385 MCI_ANIM_GETDEVCAPS_CAN_STRETCH = 16391 MCI_ANIM_GETDEVCAPS_FAST_RATE = 16386 MCI_ANIM_GETDEVCAPS_MAX_WINDOWS = 16392 MCI_ANIM_GETDEVCAPS_NORMAL_RATE = 16388 MCI_ANIM_GETDEVCAPS_PALETTES = 16390 MCI_ANIM_GETDEVCAPS_SLOW_RATE = 16387 MCI_ANIM_INFO_TEXT = 65536 MCI_ANIM_OPEN_NOSTATIC = 262144 MCI_ANIM_OPEN_PARENT = 131072 MCI_ANIM_OPEN_WS = 65536 MCI_ANIM_PLAY_FAST = 262144 MCI_ANIM_PLAY_REVERSE = 131072 MCI_ANIM_PLAY_SCAN = 1048576 MCI_ANIM_PLAY_SLOW = 524288 MCI_ANIM_PLAY_SPEED = 65536 MCI_ANIM_PUT_DESTINATION = 262144 MCI_ANIM_PUT_SOURCE = 131072 MCI_ANIM_REALIZE_BKGD = 131072 MCI_ANIM_REALIZE_NORM = 65536 MCI_ANIM_RECT = 65536 MCI_ANIM_STATUS_FORWARD = 16386 MCI_ANIM_STATUS_HPAL = 16388 MCI_ANIM_STATUS_HWND = 16387 MCI_ANIM_STATUS_SPEED = 16385 MCI_ANIM_STATUS_STRETCH = 16389 MCI_ANIM_STEP_FRAMES = 131072 MCI_ANIM_STEP_REVERSE = 65536 MCI_ANIM_UPDATE_HDC = 131072 MCI_ANIM_WHERE_DESTINATION = 262144 MCI_ANIM_WHERE_SOURCE = 131072 MCI_ANIM_WINDOW_DEFAULT = 0 MCI_ANIM_WINDOW_DISABLE_STRETCH = 2097152 MCI_ANIM_WINDOW_ENABLE_STRETCH = 1048576 MCI_ANIM_WINDOW_HWND = 65536 MCI_ANIM_WINDOW_STATE = 262144 MCI_ANIM_WINDOW_TEXT = 524288 MCI_BREAK = 0x0811 MCI_BREAK_HWND = 512 MCI_BREAK_KEY = 256 MCI_BREAK_OFF = 1024 MCI_CDA_STATUS_TYPE_TRACK = 16385 MCI_CDA_TRACK_AUDIO = 1088 MCI_CDA_TRACK_OTHER = 1089 MCI_CD_OFFSET = 1088 MCI_CLOSE = 0x0804 MCI_COPY = 0x0852 MCI_CUE = 0x0830 MCI_CUT = 0x0851 MCI_DELETE = 0x0856 MCI_DEVTYPE_ANIMATION = 519 MCI_DEVTYPE_CD_AUDIO = 516 MCI_DEVTYPE_DAT = 517 MCI_DEVTYPE_DIGITAL_VIDEO = 520 MCI_DEVTYPE_FIRST = 513 MCI_DEVTYPE_FIRST_USER = 0x1000 MCI_DEVTYPE_LAST = 523 MCI_DEVTYPE_OTHER = 521 MCI_DEVTYPE_OVERLAY = 515 MCI_DEVTYPE_SCANNER = 518 MCI_DEVTYPE_SEQUENCER = 523 MCI_DEVTYPE_VCR = 513 MCI_DEVTYPE_VIDEODISC = 514 MCI_DEVTYPE_WAVEFORM_AUDIO = 522 MCI_ESCAPE = 0x0805 MCI_FIRST = 2048 MCI_FORMAT_BYTES = 8 MCI_FORMAT_FRAMES = 3 MCI_FORMAT_HMS = 1 MCI_FORMAT_MILLISECONDS = 0 MCI_FORMAT_MSF = 2 MCI_FORMAT_SAMPLES = 9 MCI_FORMAT_SMPTE_24 = 4 MCI_FORMAT_SMPTE_25 = 5 MCI_FORMAT_SMPTE_30 = 6 MCI_FORMAT_SMPTE_30DROP = 7 MCI_FORMAT_TMSF = 10 MCI_FREEZE = 0x0844 MCI_FROM = 4 MCI_GETDEVCAPS = 0x080B MCI_GETDEVCAPS_CAN_EJECT = 7 MCI_GETDEVCAPS_CAN_PLAY = 8 MCI_GETDEVCAPS_CAN_RECORD = 1 MCI_GETDEVCAPS_CAN_SAVE = 9 MCI_GETDEVCAPS_COMPOUND_DEVICE = 6 MCI_GETDEVCAPS_DEVICE_TYPE = 4 MCI_GETDEVCAPS_HAS_AUDIO = 2 MCI_GETDEVCAPS_HAS_VIDEO = 3 MCI_GETDEVCAPS_ITEM = 256 MCI_GETDEVCAPS_USES_FILES = 5 MCI_INFO = 0x080A MCI_INFO_COPYRIGHT = 8192 MCI_INFO_FILE = 512 MCI_INFO_MEDIA_IDENTITY = 2048 MCI_INFO_MEDIA_UPC = 1024 MCI_INFO_NAME = 4096 MCI_INFO_PRODUCT = 256 MCI_LAST = 0x0FFF MCI_LOAD = 0x0850 MCI_LOAD_FILE = 256 MCI_MODE_NOT_READY = 524 MCI_MODE_OPEN = 530 MCI_MODE_PAUSE = 529 MCI_MODE_PLAY = 526 MCI_MODE_RECORD = 527 MCI_MODE_SEEK = 528 MCI_MODE_STOP = 525 MCI_NOTIFY = 1 MCI_NOTIFY_ABORTED = 0x0004 MCI_NOTIFY_FAILURE = 0x0008 MCI_NOTIFY_SUCCESSFUL = 0x0001 MCI_NOTIFY_SUPERSEDED = 0x0002 MCI_OPEN = 0x0803 MCI_OPEN_ALIAS = 1024 MCI_OPEN_ELEMENT = 512 MCI_OPEN_ELEMENT_ID = 2048 MCI_OPEN_SHAREABLE = 256 MCI_OPEN_TYPE = 8192 MCI_OPEN_TYPE_ID = 4096 MCI_OVLY_GETDEVCAPS_CAN_FREEZE = 16386 MCI_OVLY_GETDEVCAPS_CAN_STRETCH = 16385 MCI_OVLY_GETDEVCAPS_MAX_WINDOWS = 16387 MCI_OVLY_INFO_TEXT = 65536 MCI_OVLY_OPEN_PARENT = 131072 MCI_OVLY_OPEN_WS = 65536 MCI_OVLY_PUT_DESTINATION = 262144 MCI_OVLY_PUT_FRAME = 524288 MCI_OVLY_PUT_SOURCE = 131072 MCI_OVLY_PUT_VIDEO = 1048576 MCI_OVLY_RECT = 65536 MCI_OVLY_STATUS_HWND = 16385 MCI_OVLY_STATUS_STRETCH = 16386 MCI_OVLY_WHERE_DESTINATION = 262144 MCI_OVLY_WHERE_FRAME = 524288 MCI_OVLY_WHERE_SOURCE = 131072 MCI_OVLY_WHERE_VIDEO = 1048576 MCI_OVLY_WINDOW_DEFAULT = 0 MCI_OVLY_WINDOW_DISABLE_STRETCH = 2097152 MCI_OVLY_WINDOW_ENABLE_STRETCH = 1048576 MCI_OVLY_WINDOW_HWND = 65536 MCI_OVLY_WINDOW_STATE = 262144 MCI_OVLY_WINDOW_TEXT = 524288 MCI_PASTE = 0x0853 MCI_PAUSE = 0x0809 MCI_PLAY = 0x0806 MCI_PUT = 0x0842 MCI_REALIZE = 0x0840 MCI_RECORD = 0x080F MCI_RECORD_INSERT = 256 MCI_RECORD_OVERWRITE = 512 MCI_RESUME = 0x0855 MCI_SAVE = 0x0813 MCI_SAVE_FILE = 256 MCI_SEEK = 0x0807 MCI_SEEK_TO_END = 512 MCI_SEEK_TO_START = 256 MCI_SEQ_DIV_PPQN = 1216 MCI_SEQ_DIV_SMPTE_24 = 1217 MCI_SEQ_DIV_SMPTE_25 = 1218 MCI_SEQ_DIV_SMPTE_30 = 1220 MCI_SEQ_DIV_SMPTE_30DROP = 1219 MCI_SEQ_FILE = 0x4002 MCI_SEQ_FORMAT_SONGPTR = 0x4001 MCI_SEQ_MAPPER = 65535 MCI_SEQ_MIDI = 0x4003 MCI_SEQ_NONE = 65533 MCI_SEQ_OFFSET = 1216 MCI_SEQ_SET_MASTER = 524288 MCI_SEQ_SET_OFFSET = 16777216 MCI_SEQ_SET_PORT = 131072 MCI_SEQ_SET_SLAVE = 262144 MCI_SEQ_SET_TEMPO = 65536 MCI_SEQ_SMPTE = 0x4004 MCI_SEQ_STATUS_COPYRIGHT = 16396 MCI_SEQ_STATUS_DIVTYPE = 16394 MCI_SEQ_STATUS_MASTER = 16392 MCI_SEQ_STATUS_NAME = 16395 MCI_SEQ_STATUS_OFFSET = 16393 MCI_SEQ_STATUS_PORT = 16387 MCI_SEQ_STATUS_SLAVE = 16391 MCI_SEQ_STATUS_TEMPO = 16386 MCI_SET = 0x080D MCI_SET_AUDIO = 2048 MCI_SET_AUDIO_ALL = 0 MCI_SET_AUDIO_LEFT = 1 MCI_SET_AUDIO_RIGHT = 2 MCI_SET_DOOR_CLOSED = 512 MCI_SET_DOOR_OPEN = 256 MCI_SET_OFF = 16384 MCI_SET_ON = 8192 MCI_SET_TIME_FORMAT = 1024 MCI_SET_VIDEO = 4096 MCI_SPIN = 0x080C MCI_STATUS = 0x0814 MCI_STATUS_CURRENT_TRACK = 8 MCI_STATUS_ITEM = 256 MCI_STATUS_LENGTH = 1 MCI_STATUS_MEDIA_PRESENT = 5 MCI_STATUS_MODE = 4 MCI_STATUS_NUMBER_OF_TRACKS = 3 MCI_STATUS_POSITION = 2 MCI_STATUS_READY = 7 MCI_STATUS_START = 512 MCI_STATUS_TIME_FORMAT = 6 MCI_STEP = 0x080E MCI_STOP = 0x0808 MCI_STRING_OFFSET = 512 MCI_SYSINFO = 0x0810 MCI_SYSINFO_INSTALLNAME = 2048 MCI_SYSINFO_NAME = 1024 MCI_SYSINFO_OPEN = 512 MCI_SYSINFO_QUANTITY = 256 MCI_TO = 8 MCI_TRACK = 16 MCI_UNFREEZE = 0x0845 MCI_UPDATE = 0x0854 MCI_USER_MESSAGES = 3072 MCI_VD_ESCAPE_STRING = 256 MCI_VD_FORMAT_TRACK = 0x4001 MCI_VD_GETDEVCAPS_CAN_REVERSE = 16386 MCI_VD_GETDEVCAPS_CAV = 131072 MCI_VD_GETDEVCAPS_CLV = 65536 MCI_VD_GETDEVCAPS_FAST_RATE = 16387 MCI_VD_GETDEVCAPS_NORMAL_RATE = 16389 MCI_VD_GETDEVCAPS_SLOW_RATE = 16388 MCI_VD_MEDIA_CAV = 1027 MCI_VD_MEDIA_CLV = 1026 MCI_VD_MEDIA_OTHER = 1028 MCI_VD_MODE_PARK = 1025 MCI_VD_OFFSET = 1024 MCI_VD_PLAY_FAST = 131072 MCI_VD_PLAY_REVERSE = 65536 MCI_VD_PLAY_SCAN = 524288 MCI_VD_PLAY_SLOW = 1048576 MCI_VD_PLAY_SPEED = 262144 MCI_VD_SEEK_REVERSE = 65536 MCI_VD_SPIN_DOWN = 131072 MCI_VD_SPIN_UP = 65536 MCI_VD_STATUS_DISC_SIZE = 16390 MCI_VD_STATUS_FORWARD = 16387 MCI_VD_STATUS_MEDIA_TYPE = 16388 MCI_VD_STATUS_SIDE = 16389 MCI_VD_STATUS_SPEED = 16386 MCI_VD_STEP_FRAMES = 65536 MCI_VD_STEP_REVERSE = 131072 MCI_WAIT = 2 MCI_WAVE_GETDEVCAPS_INPUTS = 16385 MCI_WAVE_GETDEVCAPS_OUTPUTS = 16386 MCI_WAVE_INPUT = 4194304 MCI_WAVE_MAPPER = 1153 MCI_WAVE_OFFSET = 1152 MCI_WAVE_OPEN_BUFFER = 65536 MCI_WAVE_OUTPUT = 8388608 MCI_WAVE_PCM = 1152 MCI_WAVE_SET_ANYINPUT = 67108864 MCI_WAVE_SET_ANYOUTPUT = 134217728 MCI_WAVE_SET_AVGBYTESPERSEC = 524288 MCI_WAVE_SET_BITSPERSAMPLE = 2097152 MCI_WAVE_SET_BLOCKALIGN = 1048576 MCI_WAVE_SET_CHANNELS = 131072 MCI_WAVE_SET_FORMATTAG = 65536 MCI_WAVE_SET_SAMPLESPERSEC = 262144 MCI_WAVE_STATUS_AVGBYTESPERSEC = 16388 MCI_WAVE_STATUS_BITSPERSAMPLE = 16390 MCI_WAVE_STATUS_BLOCKALIGN = 16389 MCI_WAVE_STATUS_CHANNELS = 16386 MCI_WAVE_STATUS_FORMATTAG = 16385 MCI_WAVE_STATUS_LEVEL = 16391 MCI_WAVE_STATUS_SAMPLESPERSEC = 16387 MCI_WHERE = 0x0843 MCI_WINDOW = 0x0841 MDIS_ALLCHILDSTYLES = 0x0001 MDITILE_HORIZONTAL = 0x0001 MDITILE_SKIPDISABLED = 0x0002 MDITILE_VERTICAL = 0x0000 MDITILE_ZORDER = 0x0004 MDMSPKRFLAG_CALLSETUP = 0x00000008 MDMSPKRFLAG_DIAL = 0x00000002 MDMSPKRFLAG_OFF = 0x00000001 MDMSPKRFLAG_ON = 0x00000004 MDMSPKR_CALLSETUP = 0x00000003 MDMSPKR_DIAL = 0x00000001 MDMSPKR_OFF = 0x00000000 MDMSPKR_ON = 0x00000002 MDMVOLFLAG_HIGH = 0x00000004 MDMVOLFLAG_LOW = 0x00000001 MDMVOLFLAG_MEDIUM = 0x00000002 MDMVOL_HIGH = 0x00000002 MDMVOL_LOW = 0x00000000 MDMVOL_MEDIUM = 0x00000001 MDM_ANALOG_RLP_OFF = 0x1 MDM_ANALOG_RLP_ON = 0x0 MDM_ANALOG_V34 = 0x2 MDM_AUTO_ML_2 = 0x2 MDM_AUTO_ML_DEFAULT = 0x0 MDM_AUTO_ML_NONE = 0x1 MDM_AUTO_SPEED_DEFAULT = 0x0 MDM_BEARERMODE_ANALOG = 0x0 MDM_BEARERMODE_GSM = 0x2 MDM_BEARERMODE_ISDN = 0x1 MDM_BLIND_DIAL = 0x00000200 MDM_CCITT_OVERRIDE = 0x00000040 MDM_CELLULAR = 0x00000008 MDM_COMPRESSION = 0x00000001 MDM_DIAGNOSTICS = 0x00000800 MDM_ERROR_CONTROL = 0x00000002 MDM_FLOWCONTROL_HARD = 0x00000010 MDM_FLOWCONTROL_SOFT = 0x00000020 MDM_FORCED_EC = 0x00000004 MDM_HDLCPPP_AUTH_CHAP = 0x3 MDM_HDLCPPP_AUTH_DEFAULT = 0x0 MDM_HDLCPPP_AUTH_MSCHAP = 0x4 MDM_HDLCPPP_AUTH_NONE = 0x1 MDM_HDLCPPP_AUTH_PAP = 0x2 MDM_HDLCPPP_ML_2 = 0x2 MDM_HDLCPPP_ML_DEFAULT = 0x0 MDM_HDLCPPP_ML_NONE = 0x1 MDM_HDLCPPP_SPEED_56K = 0x2 MDM_HDLCPPP_SPEED_64K = 0x1 MDM_HDLCPPP_SPEED_DEFAULT = 0x0 MDM_MASK_AUTO_ML = 192 MDM_MASK_AUTO_SPEED = 0x7 MDM_MASK_BEARERMODE = 0x0000f000 MDM_MASK_EXTENDEDINFO = 268431360 MDM_MASK_HDLCPPP_AUTH = 56 MDM_MASK_HDLCPPP_ML = 192 MDM_MASK_HDLCPPP_SPEED = 0x7 MDM_MASK_PROTOCOLDATA = 0x0ff00000 MDM_MASK_PROTOCOLID = 0x000f0000 MDM_MASK_PROTOCOLINFO = 268369920 MDM_MASK_V110_SPEED = 0xf MDM_MASK_V120_ML = 192 MDM_MASK_V120_SPEED = 0x7 MDM_MASK_X75_DATA = 0x7 MDM_PIAFS_INCOMING = 0 MDM_PIAFS_OUTGOING = 1 MDM_PROTOCOLID_ANALOG = 0x7 MDM_PROTOCOLID_AUTO = 0x6 MDM_PROTOCOLID_DEFAULT = 0x0 MDM_PROTOCOLID_GPRS = 0x8 MDM_PROTOCOLID_HDLCPPP = 0x1 MDM_PROTOCOLID_PIAFS = 0x9 MDM_PROTOCOLID_V110 = 0x4 MDM_PROTOCOLID_V120 = 0x5 MDM_PROTOCOLID_V128 = 0x2 MDM_PROTOCOLID_X75 = 0x3 MDM_PROTOCOL_ANALOG_NRLP = 1507328 MDM_PROTOCOL_ANALOG_RLP = 458752 MDM_PROTOCOL_ANALOG_V34 = 2555904 MDM_PROTOCOL_AUTO_1CH = 67502080 MDM_PROTOCOL_AUTO_2CH = 134610944 MDM_PROTOCOL_GPRS = 524288 MDM_PROTOCOL_HDLCPPP_112K = 136380416 MDM_PROTOCOL_HDLCPPP_112K_CHAP = 161546240 MDM_PROTOCOL_HDLCPPP_112K_MSCHAP = 169934848 MDM_PROTOCOL_HDLCPPP_112K_PAP = 153157632 MDM_PROTOCOL_HDLCPPP_128K = 135331840 MDM_PROTOCOL_HDLCPPP_128K_CHAP = 160497664 MDM_PROTOCOL_HDLCPPP_128K_MSCHAP = 168886272 MDM_PROTOCOL_HDLCPPP_128K_PAP = 152109056 MDM_PROTOCOL_HDLCPPP_56K = 2162688 MDM_PROTOCOL_HDLCPPP_64K = 1114112 MDM_PROTOCOL_PIAFS_INCOMING = 589824 MDM_PROTOCOL_PIAFS_OUTGOING = 1638400 MDM_PROTOCOL_V110_12DOT0K = 5505024 MDM_PROTOCOL_V110_14DOT4K = 6553600 MDM_PROTOCOL_V110_19DOT2K = 7602176 MDM_PROTOCOL_V110_1DOT2K = 1310720 MDM_PROTOCOL_V110_28DOT8K = 8650752 MDM_PROTOCOL_V110_2DOT4K = 2359296 MDM_PROTOCOL_V110_38DOT4K = 9699328 MDM_PROTOCOL_V110_4DOT8K = 3407872 MDM_PROTOCOL_V110_57DOT6K = 10747904 MDM_PROTOCOL_V110_9DOT6K = 4456448 MDM_PROTOCOL_V120_112K = 136642560 MDM_PROTOCOL_V120_128K = 135593984 MDM_PROTOCOL_V120_56K = 69533696 MDM_PROTOCOL_V120_64K = 68485120 MDM_PROTOCOL_X75_128K = 2293760 MDM_PROTOCOL_X75_64K = 1245184 MDM_PROTOCOL_X75_BTX = 4390912 MDM_PROTOCOL_X75_T_70 = 3342336 MDM_SHIFT_AUTO_ML = 0x6 MDM_SHIFT_AUTO_SPEED = 0x0 MDM_SHIFT_BEARERMODE = 12 MDM_SHIFT_EXTENDEDINFO = 12 MDM_SHIFT_HDLCPPP_AUTH = 0x3 MDM_SHIFT_HDLCPPP_ML = 0x6 MDM_SHIFT_HDLCPPP_SPEED = 0x0 MDM_SHIFT_PROTOCOLDATA = 20 MDM_SHIFT_PROTOCOLID = 16 MDM_SHIFT_PROTOCOLINFO = 16 MDM_SHIFT_V110_SPEED = 0x0 MDM_SHIFT_V120_ML = 0x6 MDM_SHIFT_V120_SPEED = 0x0 MDM_SHIFT_X75_DATA = 0x0 MDM_SPEED_ADJUST = 0x00000080 MDM_TONE_DIAL = 0x00000100 MDM_V110_SPEED_12DOT0K = 0x5 MDM_V110_SPEED_14DOT4K = 0x6 MDM_V110_SPEED_19DOT2K = 0x7 MDM_V110_SPEED_1DOT2K = 0x1 MDM_V110_SPEED_28DOT8K = 0x8 MDM_V110_SPEED_2DOT4K = 0x2 MDM_V110_SPEED_38DOT4K = 0x9 MDM_V110_SPEED_4DOT8K = 0x3 MDM_V110_SPEED_57DOT6K = 0xA MDM_V110_SPEED_9DOT6K = 0x4 MDM_V110_SPEED_DEFAULT = 0x0 MDM_V120_ML_2 = 0x2 MDM_V120_ML_DEFAULT = 0x0 MDM_V120_ML_NONE = 0x1 MDM_V120_SPEED_56K = 0x2 MDM_V120_SPEED_64K = 0x1 MDM_V120_SPEED_DEFAULT = 0x0 MDM_V23_OVERRIDE = 0x00000400 MDM_X75_DATA_128K = 0x2 MDM_X75_DATA_64K = 0x1 MDM_X75_DATA_BTX = 0x4 MDM_X75_DATA_DEFAULT = 0x0 MDM_X75_DATA_T_70 = 0x3 MEDIA_CURRENTLY_MOUNTED = 0x80000000 MEDIA_ERASEABLE = 0x00000001 MEDIA_READ_ONLY = 0x00000004 MEDIA_READ_WRITE = 0x00000008 MEDIA_WRITE_ONCE = 0x00000002 MEDIA_WRITE_PROTECTED = 0x00000100 MEMBERID_NIL = -1 MEMJOURNAL_DFLT_FILECHUNKSIZE = 1024 MEMORY_ALLOCATION_ALIGNMENT = 16 MEMORY_PRIORITY_BELOW_NORMAL = 4 MEMORY_PRIORITY_LOW = 2 MEMORY_PRIORITY_MEDIUM = 3 MEMORY_PRIORITY_NORMAL = 5 MEMORY_PRIORITY_VERY_LOW = 1 MEMTYPE_HEAP = 0x01 MEMTYPE_LOOKASIDE = 0x02 MEMTYPE_PCACHE = 0x04 MEM_4MB_PAGES = 0x80000000 MEM_64K_PAGES = 541065216 MEM_AffMask = 0x003f MEM_Agg = 0x8000 MEM_Blob = 0x0010 MEM_COMMIT = 0x1000 MEM_Cleared = 0x0100 MEM_DECOMMIT = 0x4000 MEM_DIFFERENT_IMAGE_BASE_OK = 0x800000 MEM_Dyn = 0x1000 MEM_EXTENDED_PARAMETER_GRAPHICS = 0x01 MEM_EXTENDED_PARAMETER_NONPAGED = 0x02 MEM_EXTENDED_PARAMETER_NONPAGED_HUGE = 0x10 MEM_EXTENDED_PARAMETER_NONPAGED_LARGE = 0x08 MEM_EXTENDED_PARAMETER_TYPE_BITS = 8 MEM_EXTENDED_PARAMETER_ZERO_PAGES_OPTIONAL = 0x04 MEM_Ephem = 0x4000 MEM_FREE = 0x10000 MEM_FromBind = 0x0040 MEM_IMAGE = 16777216 MEM_Int = 0x0004 MEM_IntReal = 0x0020 MEM_LARGE_PAGES = 0x20000000 MEM_MAPPED = 0x40000 MEM_Null = 0x0001 MEM_PHYSICAL = 0x400000 MEM_PRIVATE = 0x20000 MEM_RELEASE = 0x8000 MEM_RESERVE = 0x2000 MEM_RESET = 0x80000 MEM_RESET_UNDO = 0x1000000 MEM_ROTATE = 0x800000 MEM_Real = 0x0008 MEM_Static = 0x2000 MEM_Str = 0x0002 MEM_Subtype = 0x0800 MEM_TOP_DOWN = 0x100000 MEM_Term = 0x0200 MEM_TypeMask = 0x0dbf MEM_UNMAP_WITH_TRANSIENT_BOOST = 0x01 MEM_Undefined = 0x0000 MEM_WRITE_WATCH = 0x200000 MEM_Zero = 0x0400 MENU_EVENT = 0x8 MESSAGE_RESOURCE_UNICODE = 0x0001 METAFILE_DRIVER = 2049 META_ANIMATEPALETTE = 0x0436 META_ARC = 0x0817 META_BITBLT = 0x0922 META_CHORD = 0x0830 META_CREATEBRUSHINDIRECT = 0x02FC META_CREATEFONTINDIRECT = 0x02FB META_CREATEPALETTE = 0x00f7 META_CREATEPATTERNBRUSH = 0x01F9 META_CREATEPENINDIRECT = 0x02FA META_CREATEREGION = 0x06FF META_DELETEOBJECT = 0x01f0 META_DIBBITBLT = 0x0940 META_DIBCREATEPATTERNBRUSH = 0x0142 META_DIBSTRETCHBLT = 0x0b41 META_ELLIPSE = 0x0418 META_ESCAPE = 0x0626 META_EXCLUDECLIPRECT = 0x0415 META_EXTFLOODFILL = 0x0548 META_EXTTEXTOUT = 0x0a32 META_FILLREGION = 0x0228 META_FLOODFILL = 0x0419 META_FRAMEREGION = 0x0429 META_INTERSECTCLIPRECT = 0x0416 META_INVERTREGION = 0x012A META_LINETO = 0x0213 META_MOVETO = 0x0214 META_OFFSETCLIPRGN = 0x0220 META_OFFSETVIEWPORTORG = 0x0211 META_OFFSETWINDOWORG = 0x020F META_PAINTREGION = 0x012B META_PATBLT = 0x061D META_PIE = 0x081A META_POLYGON = 0x0324 META_POLYLINE = 0x0325 META_POLYPOLYGON = 0x0538 META_REALIZEPALETTE = 0x0035 META_RECTANGLE = 0x041B META_RESIZEPALETTE = 0x0139 META_RESTOREDC = 0x0127 META_ROUNDRECT = 0x061C META_SAVEDC = 0x001E META_SCALEVIEWPORTEXT = 0x0412 META_SCALEWINDOWEXT = 0x0410 META_SELECTCLIPREGION = 0x012C META_SELECTOBJECT = 0x012D META_SELECTPALETTE = 0x0234 META_SETBKCOLOR = 0x0201 META_SETBKMODE = 0x0102 META_SETDIBTODEV = 0x0d33 META_SETLAYOUT = 0x0149 META_SETMAPMODE = 0x0103 META_SETMAPPERFLAGS = 0x0231 META_SETPALENTRIES = 0x0037 META_SETPIXEL = 0x041F META_SETPOLYFILLMODE = 0x0106 META_SETRELABS = 0x0105 META_SETROP2 = 0x0104 META_SETSTRETCHBLTMODE = 0x0107 META_SETTEXTALIGN = 0x012E META_SETTEXTCHAREXTRA = 0x0108 META_SETTEXTCOLOR = 0x0209 META_SETTEXTJUSTIFICATION = 0x020A META_SETVIEWPORTEXT = 0x020E META_SETVIEWPORTORG = 0x020D META_SETWINDOWEXT = 0x020C META_SETWINDOWORG = 0x020B META_STRETCHBLT = 0x0B23 META_STRETCHDIB = 0x0f43 META_TEXTOUT = 0x0521 METHOD_BUFFERED = 0 METHOD_DIRECT_FROM_HARDWARE = 2 METHOD_DIRECT_TO_HARDWARE = 1 METHOD_IN_DIRECT = 1 METHOD_NEITHER = 3 METHOD_OUT_DIRECT = 2 METRICS_USEDEFAULT = -1 MEVT_F_CALLBACK = 1073741824 MEVT_F_LONG = 2147483648 MEVT_F_SHORT = 0 MFCOMMENT = 15 MFS_CHECKED = 8 MFS_DEFAULT = 4096 MFS_DISABLED = 3 MFS_ENABLED = 0 MFS_GRAYED = 3 MFS_HILITE = 128 MFS_UNCHECKED = 0 MFS_UNHILITE = 0 MFT_BITMAP = 4 MFT_MENUBARBREAK = 32 MFT_MENUBREAK = 64 MFT_OWNERDRAW = 256 MFT_RADIOCHECK = 512 MFT_RIGHTJUSTIFY = 16384 MFT_RIGHTORDER = 8192 MFT_SEPARATOR = 2048 MFT_STRING = 0 MF_APPEND = 256 MF_BITMAP = 4 MF_BYCOMMAND = 0 MF_BYPOSITION = 1024 MF_CALLBACKS = 0x08000000 MF_CHANGE = 128 MF_CHECKED = 8 MF_CONV = 0x40000000 MF_DEFAULT = 4096 MF_DELETE = 512 MF_DISABLED = 2 MF_ENABLED = 0 MF_END = 128 MF_ERRORS = 0x10000000 MF_GRAYED = 1 MF_HELP = 16384 MF_HILITE = 128 MF_HSZ_INFO = 0x01000000 MF_INSERT = 0 MF_LINKS = 0x20000000 MF_MASK = 0xFF000000 MF_MENUBARBREAK = 32 MF_MENUBREAK = 64 MF_MOUSESELECT = 32768 MF_OWNERDRAW = 256 MF_POPUP = 16 MF_POSTMSGS = 0x04000000 MF_REMOVE = 4096 MF_RIGHTJUSTIFY = 16384 MF_SENDMSGS = 0x02000000 MF_SEPARATOR = 2048 MF_STRING = 0 MF_SYSMENU = 8192 MF_UNCHECKED = 0 MF_UNHILITE = 0 MF_USECHECKBITMAPS = 512 MHDR_DONE = 0x00000001 MHDR_INQUEUE = 0x00000004 MHDR_ISSTRM = 0x00000008 MHDR_PREPARED = 0x00000002 MH_CLEANUP = 4 MH_CREATE = 1 MH_DELETE = 3 MH_KEEP = 2 MICROSOFT_ROOT_CERT_CHAIN_POLICY_CHECK_APPLICATION_ROOT_FLAG = 0x00020000 MICROSOFT_ROOT_CERT_CHAIN_POLICY_DISABLE_FLIGHT_ROOT_FLAG = 0x00040000 MICROSOFT_ROOT_CERT_CHAIN_POLICY_ENABLE_TEST_ROOT_FLAG = 0x00010000 MICROSOFT_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS = 0 MICROSOFT_WINDOWS_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS = 1 MICROSOFT_WINDOWS_WINBASE_INTERLOCKED_CPLUSPLUS_H_INCLUDED = 0 MIDICAPS_CACHE = 0x0004 MIDICAPS_LRVOLUME = 0x0002 MIDICAPS_STREAM = 0x0008 MIDICAPS_VOLUME = 0x0001 MIDIERR_BADOPENMODE = 70 MIDIERR_BASE = 64 MIDIERR_DONT_CONTINUE = 71 MIDIERR_INVALIDSETUP = 69 MIDIERR_LASTERROR = 71 MIDIERR_NODEVICE = 68 MIDIERR_NOMAP = 66 MIDIERR_NOTREADY = 67 MIDIERR_STILLPLAYING = 65 MIDIERR_UNPREPARED = 64 MIDIPATCHSIZE = 128 MIDIPROP_GET = 1073741824 MIDIPROP_SET = 2147483648 MIDIPROP_TEMPO = 2 MIDIPROP_TIMEDIV = 1 MIDISTRM_ERROR = -2 MIDI_CACHE_ALL = 1 MIDI_CACHE_BESTFIT = 2 MIDI_CACHE_QUERY = 3 MIDI_IO_STATUS = 32 MIDI_UNCACHE = 4 MIIM_BITMAP = 0x00000080 MIIM_CHECKMARKS = 0x00000008 MIIM_DATA = 0x00000020 MIIM_FTYPE = 0x00000100 MIIM_ID = 0x00000002 MIIM_STATE = 0x00000001 MIIM_STRING = 0x00000040 MIIM_SUBMENU = 0x00000004 MIIM_TYPE = 0x00000010 MIM_APPLYTOSUBMENUS = 0x80000000 MIM_BACKGROUND = 0x00000002 MIM_CLOSE = 962 MIM_DATA = 963 MIM_ERROR = 965 MIM_HELPID = 0x00000004 MIM_LONGDATA = 964 MIM_LONGERROR = 966 MIM_MAXHEIGHT = 0x00000001 MIM_MENUDATA = 0x00000008 MIM_MOREDATA = 972 MIM_OPEN = 961 MIM_STYLE = 0x00000010 MINCHAR = 0x80 MINGW_DDK_H = 0 MINGW_HAS_DDK_H = 1 MINGW_HAS_SECURE_API = 1 MINGW_SDK_INIT = 0 MINLONG = 0x80000000 MINSHORT = 0x8000 MIN_ACL_REVISION = 2 MIN_PRIORITY = 1 MIXERCONTROL_CONTROLF_DISABLED = 2147483648 MIXERCONTROL_CONTROLF_MULTIPLE = 2 MIXERCONTROL_CONTROLF_UNIFORM = 1 MIXERCONTROL_CONTROLTYPE_BASS = 1342373890 MIXERCONTROL_CONTROLTYPE_BASS_BOOST = 536945271 MIXERCONTROL_CONTROLTYPE_BOOLEAN = 536936448 MIXERCONTROL_CONTROLTYPE_BOOLEANMETER = 268500992 MIXERCONTROL_CONTROLTYPE_BUTTON = 553713664 MIXERCONTROL_CONTROLTYPE_CUSTOM = 0 MIXERCONTROL_CONTROLTYPE_DECIBELS = 805568512 MIXERCONTROL_CONTROLTYPE_EQUALIZER = 1342373892 MIXERCONTROL_CONTROLTYPE_FADER = 1342373888 MIXERCONTROL_CONTROLTYPE_LOUDNESS = 536936452 MIXERCONTROL_CONTROLTYPE_MICROTIME = 1610809344 MIXERCONTROL_CONTROLTYPE_MILLITIME = 1627586560 MIXERCONTROL_CONTROLTYPE_MIXER = 1895890945 MIXERCONTROL_CONTROLTYPE_MONO = 536936451 MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT = 1895890944 MIXERCONTROL_CONTROLTYPE_MUTE = 536936450 MIXERCONTROL_CONTROLTYPE_MUX = 1879113729 MIXERCONTROL_CONTROLTYPE_ONOFF = 536936449 MIXERCONTROL_CONTROLTYPE_PAN = 1073872897 MIXERCONTROL_CONTROLTYPE_PEAKMETER = 268566529 MIXERCONTROL_CONTROLTYPE_PERCENT = 805634048 MIXERCONTROL_CONTROLTYPE_QSOUNDPAN = 1073872898 MIXERCONTROL_CONTROLTYPE_SIGNED = 805437440 MIXERCONTROL_CONTROLTYPE_SIGNEDMETER = 268566528 MIXERCONTROL_CONTROLTYPE_SINGLESELECT = 1879113728 MIXERCONTROL_CONTROLTYPE_SLIDER = 1073872896 MIXERCONTROL_CONTROLTYPE_STEREOENH = 536936453 MIXERCONTROL_CONTROLTYPE_TREBLE = 1342373891 MIXERCONTROL_CONTROLTYPE_UNSIGNED = 805502976 MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER = 268632064 MIXERCONTROL_CONTROLTYPE_VOLUME = 1342373889 MIXERCONTROL_CT_CLASS_CUSTOM = 0 MIXERCONTROL_CT_CLASS_FADER = 1342177280 MIXERCONTROL_CT_CLASS_LIST = 1879048192 MIXERCONTROL_CT_CLASS_MASK = 4026531840 MIXERCONTROL_CT_CLASS_METER = 268435456 MIXERCONTROL_CT_CLASS_NUMBER = 805306368 MIXERCONTROL_CT_CLASS_SLIDER = 1073741824 MIXERCONTROL_CT_CLASS_SWITCH = 536870912 MIXERCONTROL_CT_CLASS_TIME = 1610612736 MIXERCONTROL_CT_SC_LIST_MULTIPLE = 16777216 MIXERCONTROL_CT_SC_LIST_SINGLE = 0 MIXERCONTROL_CT_SC_METER_POLLED = 0 MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = 0 MIXERCONTROL_CT_SC_SWITCH_BUTTON = 16777216 MIXERCONTROL_CT_SC_TIME_MICROSECS = 0 MIXERCONTROL_CT_SC_TIME_MILLISECS = 16777216 MIXERCONTROL_CT_SUBCLASS_MASK = 251658240 MIXERCONTROL_CT_UNITS_BOOLEAN = 65536 MIXERCONTROL_CT_UNITS_CUSTOM = 0 MIXERCONTROL_CT_UNITS_DECIBELS = 262144 MIXERCONTROL_CT_UNITS_MASK = 16711680 MIXERCONTROL_CT_UNITS_PERCENT = 327680 MIXERCONTROL_CT_UNITS_SIGNED = 131072 MIXERCONTROL_CT_UNITS_UNSIGNED = 196608 MIXERLINE_COMPONENTTYPE_DST_DIGITAL = 1 MIXERLINE_COMPONENTTYPE_DST_FIRST = 0 MIXERLINE_COMPONENTTYPE_DST_HEADPHONES = 5 MIXERLINE_COMPONENTTYPE_DST_LAST = 8 MIXERLINE_COMPONENTTYPE_DST_LINE = 2 MIXERLINE_COMPONENTTYPE_DST_MONITOR = 3 MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = 4 MIXERLINE_COMPONENTTYPE_DST_TELEPHONE = 6 MIXERLINE_COMPONENTTYPE_DST_UNDEFINED = 0 MIXERLINE_COMPONENTTYPE_DST_VOICEIN = 8 MIXERLINE_COMPONENTTYPE_DST_WAVEIN = 7 MIXERLINE_COMPONENTTYPE_SRC_ANALOG = 4106 MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY = 4105 MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = 4101 MIXERLINE_COMPONENTTYPE_SRC_DIGITAL = 4097 MIXERLINE_COMPONENTTYPE_SRC_FIRST = 4096 MIXERLINE_COMPONENTTYPE_SRC_LAST = 4106 MIXERLINE_COMPONENTTYPE_SRC_LINE = 4098 MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = 4099 MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER = 4103 MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER = 4100 MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE = 4102 MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED = 4096 MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = 4104 MIXERLINE_LINEF_ACTIVE = 1 MIXERLINE_LINEF_DISCONNECTED = 32768 MIXERLINE_LINEF_SOURCE = 2147483648 MIXERLINE_TARGETTYPE_AUX = 5 MIXERLINE_TARGETTYPE_MIDIIN = 4 MIXERLINE_TARGETTYPE_MIDIOUT = 3 MIXERLINE_TARGETTYPE_UNDEFINED = 0 MIXERLINE_TARGETTYPE_WAVEIN = 2 MIXERLINE_TARGETTYPE_WAVEOUT = 1 MIXERR_BASE = 1024 MIXERR_INVALCONTROL = 1025 MIXERR_INVALLINE = 1024 MIXERR_INVALVALUE = 1026 MIXERR_LASTERROR = 1026 MIXER_GETCONTROLDETAILSF_LISTTEXT = 1 MIXER_GETCONTROLDETAILSF_QUERYMASK = 15 MIXER_GETCONTROLDETAILSF_VALUE = 0 MIXER_GETLINECONTROLSF_ALL = 0 MIXER_GETLINECONTROLSF_ONEBYID = 1 MIXER_GETLINECONTROLSF_ONEBYTYPE = 2 MIXER_GETLINECONTROLSF_QUERYMASK = 15 MIXER_GETLINEINFOF_COMPONENTTYPE = 3 MIXER_GETLINEINFOF_DESTINATION = 0 MIXER_GETLINEINFOF_LINEID = 2 MIXER_GETLINEINFOF_QUERYMASK = 15 MIXER_GETLINEINFOF_SOURCE = 1 MIXER_GETLINEINFOF_TARGETTYPE = 4 MIXER_LONG_NAME_CHARS = 64 MIXER_OBJECTF_AUX = 1342177280 MIXER_OBJECTF_HANDLE = 2147483648 MIXER_OBJECTF_HMIDIIN = 3221225472 MIXER_OBJECTF_HMIDIOUT = 2952790016 MIXER_OBJECTF_HMIXER = 2147483648 MIXER_OBJECTF_HWAVEIN = 2684354560 MIXER_OBJECTF_HWAVEOUT = 2415919104 MIXER_OBJECTF_MIDIIN = 1073741824 MIXER_OBJECTF_MIDIOUT = 805306368 MIXER_OBJECTF_MIXER = 0 MIXER_OBJECTF_WAVEIN = 536870912 MIXER_OBJECTF_WAVEOUT = 268435456 MIXER_SETCONTROLDETAILSF_CUSTOM = 1 MIXER_SETCONTROLDETAILSF_QUERYMASK = 15 MIXER_SETCONTROLDETAILSF_VALUE = 0 MIXER_SHORT_NAME_CHARS = 16 MKF_AVAILABLE = 0x00000002 MKF_CONFIRMHOTKEY = 0x00000008 MKF_HOTKEYACTIVE = 0x00000004 MKF_HOTKEYSOUND = 0x00000010 MKF_INDICATOR = 0x00000020 MKF_LEFTBUTTONDOWN = 0x01000000 MKF_LEFTBUTTONSEL = 0x10000000 MKF_MODIFIERS = 0x00000040 MKF_MOUSEKEYSON = 0x00000001 MKF_MOUSEMODE = 0x80000000 MKF_REPLACENUMBERS = 0x00000080 MKF_RIGHTBUTTONDOWN = 0x02000000 MKF_RIGHTBUTTONSEL = 0x20000000 MKSYS_URLMONIKER = 6 MK_ALT = 32 MK_CONTROL = 0x0008 MK_E_FIRST = 2147746272 MK_E_LAST = 2147746287 MK_LBUTTON = 0x0001 MK_MBUTTON = 0x0010 MK_RBUTTON = 0x0002 MK_SHIFT = 0x0004 MK_S_FIRST = 262624 MK_S_LAST = 262639 MK_XBUTTON1 = 0x0020 MK_XBUTTON2 = 0x0040 MMIOERR_ACCESSDENIED = 268 MMIOERR_BASE = 256 MMIOERR_CANNOTCLOSE = 260 MMIOERR_CANNOTEXPAND = 264 MMIOERR_CANNOTOPEN = 259 MMIOERR_CANNOTREAD = 261 MMIOERR_CANNOTSEEK = 263 MMIOERR_CANNOTWRITE = 262 MMIOERR_CHUNKNOTFOUND = 265 MMIOERR_FILENOTFOUND = 257 MMIOERR_INVALIDFILE = 272 MMIOERR_NETWORKERROR = 270 MMIOERR_OUTOFMEMORY = 258 MMIOERR_PATHNOTFOUND = 267 MMIOERR_SHARINGVIOLATION = 269 MMIOERR_TOOMANYOPENFILES = 271 MMIOERR_UNBUFFERED = 266 MMIOM_CLOSE = 4 MMIOM_OPEN = 3 MMIOM_READ = 0 MMIOM_RENAME = 6 MMIOM_SEEK = 2 MMIOM_USER = 0x8000 MMIOM_WRITE = 1 MMIOM_WRITEFLUSH = 5 MMIO_ALLOCBUF = 0x00010000 MMIO_COMPAT = 0x00000000 MMIO_CREATE = 0x00001000 MMIO_CREATELIST = 0x0040 MMIO_CREATERIFF = 0x0020 MMIO_DEFAULTBUFFER = 8192 MMIO_DELETE = 0x00000200 MMIO_DENYNONE = 0x00000040 MMIO_DENYREAD = 0x00000030 MMIO_DENYWRITE = 0x00000020 MMIO_DIRTY = 0x10000000 MMIO_EMPTYBUF = 0x0010 MMIO_EXCLUSIVE = 0x00000010 MMIO_EXIST = 0x00004000 MMIO_FHOPEN = 0x0010 MMIO_FINDCHUNK = 0x0010 MMIO_FINDLIST = 0x0040 MMIO_FINDPROC = 0x00040000 MMIO_FINDRIFF = 0x0020 MMIO_GETTEMP = 0x00020000 MMIO_GLOBALPROC = 0x10000000 MMIO_INSTALLPROC = 0x00010000 MMIO_PARSE = 0x00000100 MMIO_READ = 0x00000000 MMIO_READWRITE = 0x00000002 MMIO_REMOVEPROC = 0x00020000 MMIO_RWMODE = 0x00000003 MMIO_SHAREMODE = 0x00000070 MMIO_TOUPPER = 0x0010 MMIO_UNICODEPROC = 0x01000000 MMIO_WRITE = 0x00000001 MMSYSERR_ALLOCATED = 4 MMSYSERR_BADDB = 14 MMSYSERR_BADDEVICEID = 2 MMSYSERR_BADERRNUM = 9 MMSYSERR_BASE = 0 MMSYSERR_DELETEERROR = 18 MMSYSERR_ERROR = 1 MMSYSERR_HANDLEBUSY = 12 MMSYSERR_INVALFLAG = 10 MMSYSERR_INVALHANDLE = 5 MMSYSERR_INVALIDALIAS = 13 MMSYSERR_INVALPARAM = 11 MMSYSERR_KEYNOTFOUND = 15 MMSYSERR_LASTERROR = 21 MMSYSERR_MOREDATA = 21 MMSYSERR_NODRIVER = 6 MMSYSERR_NODRIVERCB = 20 MMSYSERR_NOERROR = 0 MMSYSERR_NOMEM = 7 MMSYSERR_NOTENABLED = 3 MMSYSERR_NOTSUPPORTED = 8 MMSYSERR_READERROR = 16 MMSYSERR_VALNOTFOUND = 19 MMSYSERR_WRITEERROR = 17 MM_ANISOTROPIC = 8 MM_DRVM_CLOSE = 0x3D1 MM_DRVM_DATA = 0x3D2 MM_DRVM_ERROR = 0x3D3 MM_DRVM_OPEN = 0x3D0 MM_HIENGLISH = 5 MM_HIMETRIC = 3 MM_ISOTROPIC = 7 MM_JOY1BUTTONDOWN = 0x3B5 MM_JOY1BUTTONUP = 0x3B7 MM_JOY1MOVE = 0x3A0 MM_JOY1ZMOVE = 0x3A2 MM_JOY2BUTTONDOWN = 0x3B6 MM_JOY2BUTTONUP = 0x3B8 MM_JOY2MOVE = 0x3A1 MM_JOY2ZMOVE = 0x3A3 MM_LOENGLISH = 4 MM_LOMETRIC = 2 MM_MAX = 8 MM_MAX_AXES_NAMELEN = 16 MM_MAX_FIXEDSCALE = 6 MM_MAX_NUMAXES = 16 MM_MCINOTIFY = 0x3B9 MM_MCISIGNAL = 0x3CB MM_MIM_CLOSE = 0x3C2 MM_MIM_DATA = 0x3C3 MM_MIM_ERROR = 0x3C5 MM_MIM_LONGDATA = 0x3C4 MM_MIM_LONGERROR = 0x3C6 MM_MIM_MOREDATA = 0x3CC MM_MIM_OPEN = 0x3C1 MM_MIN = 1 MM_MIXM_CONTROL_CHANGE = 0x3D1 MM_MIXM_LINE_CHANGE = 0x3D0 MM_MOM_CLOSE = 0x3C8 MM_MOM_DONE = 0x3C9 MM_MOM_OPEN = 0x3C7 MM_MOM_POSITIONCB = 0x3CA MM_STREAM_CLOSE = 0x3D5 MM_STREAM_DONE = 0x3D6 MM_STREAM_ERROR = 0x3D7 MM_STREAM_OPEN = 0x3D4 MM_TEXT = 1 MM_TWIPS = 6 MM_WIM_CLOSE = 0x3BF MM_WIM_DATA = 0x3C0 MM_WIM_OPEN = 0x3BE MM_WOM_CLOSE = 0x3BC MM_WOM_DONE = 0x3BD MM_WOM_OPEN = 0x3BB MNC_CLOSE = 1 MNC_EXECUTE = 2 MNC_IGNORE = 0 MNC_SELECT = 3 MND_CONTINUE = 0 MND_ENDMENU = 1 MNGOF_BOTTOMGAP = 0x00000002 MNGOF_TOPGAP = 0x00000001 MNGO_NOERROR = 0x00000001 MNGO_NOINTERFACE = 0x00000000 MNS_AUTODISMISS = 0x10000000 MNS_CHECKORBMP = 0x04000000 MNS_DRAGDROP = 0x20000000 MNS_MODELESS = 0x40000000 MNS_NOCHECK = 0x80000000 MNS_NOTIFYBYPOS = 0x08000000 MN_GETHMENU = 0x01E1 MOD_ALT = 0x0001 MOD_CONTROL = 0x0002 MOD_FMSYNTH = 4 MOD_IGNORE_ALL_MODIFIER = 0x0400 MOD_LEFT = 0x8000 MOD_MAPPER = 5 MOD_MIDIPORT = 1 MOD_ON_KEYUP = 0x0800 MOD_RIGHT = 0x4000 MOD_SHIFT = 0x0004 MOD_SQSYNTH = 3 MOD_SWSYNTH = 7 MOD_SYNTH = 2 MOD_WAVETABLE = 6 MOD_WIN = 0x0008 MOM_CLOSE = 968 MOM_DONE = 969 MOM_OPEN = 967 MOM_POSITIONCB = 970 MONITORINFOF_PRIMARY = 0x00000001 MONITOR_DEFAULTTONEAREST = 0x00000002 MONITOR_DEFAULTTONULL = 0x00000000 MONITOR_DEFAULTTOPRIMARY = 0x00000001 MONO_FONT = 8 MOUSEEVENTF_ABSOLUTE = 0x8000 MOUSEEVENTF_LEFTDOWN = 0x0002 MOUSEEVENTF_LEFTUP = 0x0004 MOUSEEVENTF_MIDDLEDOWN = 0x0020 MOUSEEVENTF_MIDDLEUP = 0x0040 MOUSEEVENTF_MOVE = 0x0001 MOUSEEVENTF_RIGHTDOWN = 0x0008 MOUSEEVENTF_RIGHTUP = 0x0010 MOUSEEVENTF_VIRTUALDESK = 0x4000 MOUSEEVENTF_WHEEL = 0x0800 MOUSEEVENTF_XDOWN = 0x0080 MOUSEEVENTF_XUP = 0x0100 MOUSETRAILS = 39 MOUSE_ATTRIBUTES_CHANGED = 0x04 MOUSE_EVENT = 0x2 MOUSE_MOVED = 0x1 MOUSE_MOVE_ABSOLUTE = 1 MOUSE_MOVE_RELATIVE = 0 MOUSE_VIRTUAL_DESKTOP = 0x02 MOUSE_WHEELED = 0x4 MOVEFILE_COPY_ALLOWED = 0x00000002 MOVEFILE_CREATE_HARDLINK = 0x00000010 MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004 MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x00000020 MOVEFILE_REPLACE_EXISTING = 0x00000001 MOVEFILE_WRITE_THROUGH = 0x00000008 MSGF_DDEMGR = 0x8001 MSGF_DIALOGBOX = 0 MSGF_MAX = 8 MSGF_MENU = 2 MSGF_MESSAGEBOX = 1 MSGF_NEXTWINDOW = 6 MSGF_SCROLLBAR = 5 MSGF_USER = 4096 MSG_DONTROUTE = 0x4 MSG_MAXIOVLEN = 16 MSG_OOB = 0x1 MSG_PARTIAL = 0x8000 MSG_PEEK = 0x2 MSVC_VERSION = 1900 MS_DEF_DH_SCHANNEL_PROV_A = "Microsoft DH SChannel Cryptographic Provider" MS_DEF_DSS_DH_PROV_A = "Microsoft Base DSS and Diffie-Hellman Cryptographic Provider" MS_DEF_DSS_PROV_A = "Microsoft Base DSS Cryptographic Provider" MS_DEF_PROV_A = "Microsoft Base Cryptographic Provider v1.0" MS_DEF_RSA_SCHANNEL_PROV_A = "Microsoft RSA SChannel Cryptographic Provider" MS_DEF_RSA_SIG_PROV_A = "Microsoft RSA Signature Cryptographic Provider" MS_ENHANCED_PROV_A = "Microsoft Enhanced Cryptographic Provider v1.0" MS_ENH_DSS_DH_PROV_A = "Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider" MS_ENH_RSA_AES_PROV_A = "Microsoft Enhanced RSA and AES Cryptographic Provider" MS_ENH_RSA_AES_PROV_XP_A = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)" MS_NBF = "MNBF" MS_PPM_SOFTWARE_ALL = 0x1 MS_SCARD_PROV_A = "Microsoft Base Smart Card Crypto Provider" MS_STRONG_PROV_A = "Microsoft Strong Cryptographic Provider" MULTIFILEOPENORD = 1537 MUTANT_ALL_ACCESS = 2031617 MUTANT_QUERY_STATE = 0x0001 MUTEX_ALL_ACCESS = 2031617 MUTEX_MODIFY_STATE = 1 MUTZ_ACCEPT_WILDCARD_SCHEME = 0x80 MUTZ_DONT_UNESCAPE = 0x800 MUTZ_DONT_USE_CACHE = 0x1000 MUTZ_ENFORCERESTRICTED = 0x100 MUTZ_FORCE_INTRANET_FLAGS = 0x2000 MUTZ_IGNORE_ZONE_MAPPINGS = 0x4000 MUTZ_ISFILE = 0x2 MUTZ_NOSAVEDFILECHECK = 0x1 MUTZ_REQUIRESAVEDFILECHECK = 0x400 MUTZ_RESERVED = 0x200 MWMO_ALERTABLE = 0x0002 MWMO_INPUTAVAILABLE = 0x0004 MWMO_WAITALL = 0x0001 MWT_IDENTITY = 1 MWT_LEFTMULTIPLY = 2 MWT_MAX = 3 MWT_MIN = 1 MWT_RIGHTMULTIPLY = 3 MX_CLOSE_ATTEMPT = 3 M_1_PI = 0.31830988618379067154 M_2_PI = 0.63661977236758134308 M_2_SQRTPI = 1.12837916709551257390 M_E = 2.7182818284590452354 M_LN10 = 2.30258509299404568402 M_LN2 = 0.69314718055994530942 M_LOG10E = 0.43429448190325182765 M_LOG2E = 1.4426950408889634074 M_PI = 3.14159265358979323846 M_PI_2 = 1.57079632679489661923 M_PI_4 = 0.78539816339744830962 M_SQRT1_2 = 0.70710678118654752440 M_SQRT2 = 1.41421356237309504880 MaxNumberOfEEInfoParams = 4 NAME_FLAGS_MASK = 0x87 NB = 3 NCBACTION = 0x77 NCBADDGRNAME = 0x36 NCBADDNAME = 0x30 NCBASTAT = 0x33 NCBCALL = 0x10 NCBCANCEL = 0x35 NCBCHAINSEND = 0x17 NCBCHAINSENDNA = 0x72 NCBDELNAME = 0x31 NCBDGRECV = 0x21 NCBDGRECVBC = 0x23 NCBDGSEND = 0x20 NCBDGSENDBC = 0x22 NCBENUM = 0x37 NCBFINDNAME = 0x78 NCBHANGUP = 0x12 NCBLANSTALERT = 0x73 NCBLISTEN = 0x11 NCBNAMSZ = 16 NCBRECV = 0x15 NCBRECVANY = 0x16 NCBRESET = 0x32 NCBSEND = 0x14 NCBSENDNA = 0x71 NCBSSTAT = 0x34 NCBTRACE = 0x79 NCBUNLINK = 0x70 NCB_INCLUDED = 0 NCRYPTBUFFER_CERT_BLOB = 47 NCRYPTBUFFER_DATA = 1 NCRYPTBUFFER_EMPTY = 0 NCRYPTBUFFER_PKCS_ALG_ID = 43 NCRYPTBUFFER_PKCS_ALG_OID = 41 NCRYPTBUFFER_PKCS_ALG_PARAM = 42 NCRYPTBUFFER_PKCS_ATTRS = 44 NCRYPTBUFFER_PKCS_KEY_NAME = 45 NCRYPTBUFFER_PKCS_OID = 40 NCRYPTBUFFER_PKCS_SECRET = 46 NCRYPTBUFFER_PROTECTION_DESCRIPTOR_STRING = 3 NCRYPTBUFFER_PROTECTION_FLAGS = 4 NCRYPTBUFFER_SSL_CLEAR_KEY = 23 NCRYPTBUFFER_SSL_CLIENT_RANDOM = 20 NCRYPTBUFFER_SSL_HIGHEST_VERSION = 22 NCRYPTBUFFER_SSL_KEY_ARG_DATA = 24 NCRYPTBUFFER_SSL_SERVER_RANDOM = 21 NCRYPTBUFFER_VERSION = 0 NCRYPT_ALLOW_ALL_USAGES = 0x00ffffff NCRYPT_ALLOW_ARCHIVING_FLAG = 0x00000004 NCRYPT_ALLOW_DECRYPT_FLAG = 0x1 NCRYPT_ALLOW_EXPORT_FLAG = 0x1 NCRYPT_ALLOW_KEY_AGREEMENT_FLAG = 0x00000004 NCRYPT_ALLOW_PLAINTEXT_ARCHIVING_FLAG = 0x00000008 NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG = 0x2 NCRYPT_ALLOW_SIGNING_FLAG = 0x2 NCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE = 3 NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION = 4 NCRYPT_CIPHER_INTERFACE = 1 NCRYPT_CIPHER_OPERATION = 1 NCRYPT_DO_NOT_FINALIZE_FLAG = 0x400 NCRYPT_EXPORT_LEGACY_FLAG = 0x00000800 NCRYPT_HASH_INTERFACE = 2 NCRYPT_HASH_OPERATION = 2 NCRYPT_IMPL_HARDWARE_FLAG = 0x1 NCRYPT_IMPL_HARDWARE_RNG_FLAG = 0x00000010 NCRYPT_IMPL_REMOVABLE_FLAG = 0x00000008 NCRYPT_IMPL_SOFTWARE_FLAG = 0x2 NCRYPT_KEY_STORAGE_INTERFACE = 0x00010001 NCRYPT_MACHINE_KEY_FLAG = 0x20 NCRYPT_MAX_ALG_ID_LENGTH = 512 NCRYPT_MAX_KEY_NAME_LENGTH = 512 NCRYPT_MAX_PROPERTY_DATA = 0x100000 NCRYPT_MAX_PROPERTY_NAME = 64 NCRYPT_NO_KEY_VALIDATION = 8 NCRYPT_NO_PADDING_FLAG = 0x1 NCRYPT_OVERWRITE_KEY_FLAG = 0x80 NCRYPT_PAD_OAEP_FLAG = 0x4 NCRYPT_PAD_PKCS1_FLAG = 0x2 NCRYPT_PAD_PSS_FLAG = 0x8 NCRYPT_PERSIST_FLAG = 0x80000000 NCRYPT_PERSIST_ONLY_FLAG = 0x40000000 NCRYPT_REGISTER_NOTIFY_FLAG = 0x1 NCRYPT_RNG_OPERATION = 32 NCRYPT_SCHANNEL_INTERFACE = 0x00010002 NCRYPT_SCHANNEL_SIGNATURE_INTERFACE = 0x00010003 NCRYPT_SECRET_AGREEMENT_INTERFACE = 4 NCRYPT_SECRET_AGREEMENT_OPERATION = 8 NCRYPT_SIGNATURE_INTERFACE = 5 NCRYPT_SIGNATURE_OPERATION = 16 NCRYPT_SILENT_FLAG = 0x40 NCRYPT_UI_FORCE_HIGH_PROTECTION_FLAG = 0x2 NCRYPT_UI_PROTECT_KEY_FLAG = 0x1 NCRYPT_UNREGISTER_NOTIFY_FLAG = 0x2 NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG = 0x200 NC_AllowAgg = 0x000001 NC_AllowWin = 0x004000 NC_Complex = 0x002000 NC_FromDDL = 0x040000 NC_GenCol = 0x000008 NC_HasAgg = 0x000010 NC_HasWin = 0x008000 NC_IdxExpr = 0x000020 NC_InAggFunc = 0x020000 NC_IsCheck = 0x000004 NC_IsDDL = 0x010000 NC_MinMaxAgg = 0x001000 NC_NoSelect = 0x080000 NC_OrderAgg = 0x8000000 NC_PartIdx = 0x000002 NC_SelfRef = 0x00002e NC_Subquery = 0x000040 NC_UAggInfo = 0x000100 NC_UBaseReg = 0x000400 NC_UEList = 0x000080 NC_UUpsert = 0x000200 NDEBUG = 1 NDR_ASCII_CHAR = 0 NDR_BIG_ENDIAN = 0 NDR_CHAR_REP_MASK = 15 NDR_EBCDIC_CHAR = 1 NDR_FLOAT_REP_MASK = 65280 NDR_IBM_FLOAT = 768 NDR_IEEE_FLOAT = 0 NDR_INT_REP_MASK = 240 NDR_LITTLE_ENDIAN = 16 NDR_LOCAL_DATA_REPRESENTATION = 16 NDR_LOCAL_ENDIAN = 16 NDR_VAX_FLOAT = 256 NEAR = 0 NETINFO_DISKRED = 0x00000004 NETINFO_DLL16 = 0x00000001 NETINFO_PRINTERRED = 0x00000008 NETPROPERTY_PERSISTENT = 1 NETSCAPE_SIGN_CA_CERT_TYPE = 0x01 NETSCAPE_SIGN_CERT_TYPE = 0x10 NETSCAPE_SMIME_CA_CERT_TYPE = 0x02 NETSCAPE_SMIME_CERT_TYPE = 0x20 NETSCAPE_SSL_CA_CERT_TYPE = 0x04 NETSCAPE_SSL_CLIENT_AUTH_CERT_TYPE = 0x80 NETSCAPE_SSL_SERVER_AUTH_CERT_TYPE = 0x40 NEWFILEOPENORD = 1547 NEWFILEOPENV2ORD = 1552 NEWFRAME = 1 NEWTRANSPARENT = 3 NEXTBAND = 3 NFR_ANSI = 1 NFR_UNICODE = 2 NF_QUERY = 3 NF_REQUERY = 4 NIF_GUID = 0x00000020 NIF_ICON = 0x00000002 NIF_INFO = 0x00000010 NIF_MESSAGE = 0x00000001 NIF_STATE = 0x00000008 NIF_TIP = 0x00000004 NIIF_ERROR = 0x00000003 NIIF_ICON_MASK = 0x0000000f NIIF_INFO = 0x00000001 NIIF_NONE = 0x00000000 NIIF_NOSOUND = 0x00000010 NIIF_USER = 0x00000004 NIIF_WARNING = 0x00000002 NIM_ADD = 0x00000000 NIM_DELETE = 0x00000002 NIM_MODIFY = 0x00000001 NIM_SETFOCUS = 0x00000003 NIM_SETVERSION = 0x00000004 NINF_KEY = 0x1 NIN_BALLOONHIDE = 1027 NIN_BALLOONSHOW = 1026 NIN_BALLOONTIMEOUT = 1028 NIN_BALLOONUSERCLICK = 1029 NIN_KEYSELECT = 1025 NIN_SELECT = 1024 NIS_HIDDEN = 0x00000001 NIS_SHAREDICON = 0x00000002 NI_CHANGECANDIDATELIST = 0x0013 NI_CLOSECANDIDATE = 0x0011 NI_COMPOSITIONSTR = 0x0015 NI_FINALIZECONVERSIONRESULT = 0x0014 NI_IMEMENUSELECTED = 0x0018 NI_OPENCANDIDATE = 0x0010 NI_SELECTCANDIDATESTR = 0x0012 NI_SETCANDIDATE_PAGESIZE = 0x0017 NI_SETCANDIDATE_PAGESTART = 0x0016 NLS_ALPHANUMERIC = 0x0 NLS_DBCSCHAR = 0x10000 NLS_HIRAGANA = 0x40000 NLS_IME_CONVERSION = 0x800000 NLS_IME_DISABLE = 0x20000000 NLS_KATAKANA = 0x20000 NLS_ROMAN = 0x400000 NLS_VALID_LOCALE_MASK = 0x000fffff NMPWAIT_NOWAIT = 0x1 NMPWAIT_USE_DEFAULT_WAIT = 0x0 NMPWAIT_WAIT_FOREVER = 0xffffffff NN = 1 NOERROR = 0 NONAMELESSSTRUCT = 1 NONAMELESSUNION = 1 NONANTIALIASED_QUALITY = 3 NONZEROLHND = 2 NONZEROLPTR = 0 NON_PAGED_DEBUG_SIGNATURE = 0x494E NOPARITY = 0 NORMAL_PRINT = 0x00000000 NORMAL_PRIORITY_CLASS = 0x20 NORM_IGNORECASE = 0x00000001 NORM_IGNOREKANATYPE = 0x00010000 NORM_IGNORENONSPACE = 0x00000002 NORM_IGNORESYMBOLS = 0x00000004 NORM_IGNOREWIDTH = 0x00020000 NORM_LINGUISTIC_CASING = 0x08000000 NOTIFYICON_VERSION = 3 NOT_WITHIN = 0 NO_ADDRESS = 11004 NO_DATA = 11004 NO_ERROR = 0 NO_LOCK = 0 NO_PRIORITY = 0 NO_PROPAGATE_INHERIT_ACE = 4 NO_RECOVERY = 11003 NRC_ACTSES = 0x0f NRC_BADDR = 0x07 NRC_BRIDGE = 0x23 NRC_BUFLEN = 0x01 NRC_CANCEL = 0x26 NRC_CANOCCR = 0x24 NRC_CMDCAN = 0x0b NRC_CMDTMO = 0x05 NRC_DUPENV = 0x30 NRC_DUPNAME = 0x0d NRC_ENVNOTDEF = 0x34 NRC_GOODRET = 0x00 NRC_IFBUSY = 0x21 NRC_ILLCMD = 0x03 NRC_ILLNN = 0x13 NRC_INCOMP = 0x06 NRC_INUSE = 0x16 NRC_INVADDRESS = 0x39 NRC_INVDDID = 0x3B NRC_LOCKFAIL = 0x3C NRC_LOCTFUL = 0x11 NRC_MAXAPPS = 0x36 NRC_NAMCONF = 0x19 NRC_NAMERR = 0x17 NRC_NAMTFUL = 0x0e NRC_NOCALL = 0x14 NRC_NORES = 0x09 NRC_NORESOURCES = 0x38 NRC_NOSAPS = 0x37 NRC_NOWILD = 0x15 NRC_OPENERR = 0x3f NRC_OSRESNOTAV = 0x35 NRC_PENDING = 0xff NRC_REMTFUL = 0x12 NRC_SABORT = 0x18 NRC_SCLOSED = 0x0a NRC_SNUMOUT = 0x08 NRC_SYSTEM = 0x40 NRC_TOOMANY = 0x22 NT351_INTERFACE_SIZE = 0x40 NTAPI = 0 NTAPI_INLINE = 0 NTDDI_LONGHORN = 100663296 NTDDI_VERSION = 84017152 NTDDI_VISTA = 100663296 NTDDI_VISTASP1 = 100663552 NTDDI_VISTASP2 = 100663808 NTDDI_VISTASP3 = 100664064 NTDDI_VISTASP4 = 100664320 NTDDI_WIN10 = 0x0A000000 NTDDI_WIN10_19H1 = 0x0A000007 NTDDI_WIN10_FE = 0x0A00000A NTDDI_WIN10_MN = 0x0A000009 NTDDI_WIN10_RS1 = 0x0A000002 NTDDI_WIN10_RS2 = 0x0A000003 NTDDI_WIN10_RS3 = 0x0A000004 NTDDI_WIN10_RS4 = 0x0A000005 NTDDI_WIN10_RS5 = 0x0A000006 NTDDI_WIN10_TH2 = 0x0A000001 NTDDI_WIN10_VB = 0x0A000008 NTDDI_WIN2K = 0x05000000 NTDDI_WIN2KSP1 = 0x05000100 NTDDI_WIN2KSP2 = 0x05000200 NTDDI_WIN2KSP3 = 0x05000300 NTDDI_WIN2KSP4 = 0x05000400 NTDDI_WIN6 = 0x06000000 NTDDI_WIN6SP1 = 0x06000100 NTDDI_WIN6SP2 = 0x06000200 NTDDI_WIN6SP3 = 0x06000300 NTDDI_WIN6SP4 = 0x06000400 NTDDI_WIN7 = 0x06010000 NTDDI_WIN8 = 0x06020000 NTDDI_WINBLUE = 0x06030000 NTDDI_WINTHRESHOLD = 0x0A000000 NTDDI_WINXP = 0x05010000 NTDDI_WINXPSP1 = 0x05010100 NTDDI_WINXPSP2 = 0x05010200 NTDDI_WINXPSP3 = 0x05010300 NTDDI_WINXPSP4 = 0x05010400 NTDDI_WS03 = 0x05020000 NTDDI_WS03SP1 = 0x05020100 NTDDI_WS03SP2 = 0x05020200 NTDDI_WS03SP3 = 0x05020300 NTDDI_WS03SP4 = 0x05020400 NTDDI_WS08 = 100663552 NTDDI_WS08SP2 = 100663808 NTDDI_WS08SP3 = 100664064 NTDDI_WS08SP4 = 100664320 NTE_OP_OK = 0 NTM_BOLD = 32 NTM_DSIG = 0x00200000 NTM_ITALIC = 1 NTM_MULTIPLEMASTER = 0x00080000 NTM_NONNEGATIVE_AC = 0x00010000 NTM_PS_OPENTYPE = 0x00020000 NTM_REGULAR = 64 NTM_TT_OPENTYPE = 0x00040000 NTM_TYPE1 = 0x00100000 NULLREGION = 1 NULL_BRUSH = 5 NULL_PEN = 8 NUMBRUSHES = 16 NUMCOLORS = 24 NUMFONTS = 22 NUMLOCK_ON = 0x20 NUMMARKERS = 20 NUMPENS = 18 NUMPRS_CURRENCY = 0x0400 NUMPRS_DECIMAL = 0x0100 NUMPRS_EXPONENT = 0x0800 NUMPRS_HEX_OCT = 0x0040 NUMPRS_INEXACT = 0x20000 NUMPRS_LEADING_MINUS = 0x0010 NUMPRS_LEADING_PLUS = 0x0004 NUMPRS_LEADING_WHITE = 0x0001 NUMPRS_NEG = 0x10000 NUMPRS_PARENS = 0x0080 NUMPRS_STD = 0x1FFF NUMPRS_THOUSANDS = 0x0200 NUMPRS_TRAILING_MINUS = 0x0020 NUMPRS_TRAILING_PLUS = 0x0008 NUMPRS_TRAILING_WHITE = 0x0002 NUMPRS_USE_ALL = 0x1000 NUMRESERVED = 106 NUM_DISCHARGE_POLICIES = 4 N_BTMASK = 0x000F N_BTSHFT = 4 N_OR_COST = 3 N_SORT_BUCKET = 32 N_STATEMENT = 8 N_TMASK = 0x0030 N_TMASK1 = 0x00C0 N_TMASK2 = 0x00F0 N_TSHIFT = 2 OBJECT_INHERIT_ACE = 1 OBJ_BITMAP = 7 OBJ_BRUSH = 2 OBJ_COLORSPACE = 14 OBJ_DC = 3 OBJ_ENHMETADC = 12 OBJ_ENHMETAFILE = 13 OBJ_EXTPEN = 11 OBJ_FONT = 6 OBJ_MEMDC = 10 OBJ_METADC = 4 OBJ_METAFILE = 9 OBJ_PAL = 5 OBJ_PEN = 1 OBJ_REGION = 8 OBSOLETE_DISK_GET_WRITE_CACHE_STATE = 475356 OBSOLETE_IOCTL_STORAGE_RESET_BUS = 3002368 OBSOLETE_IOCTL_STORAGE_RESET_DEVICE = 3002372 OCSP_BASIC_BY_KEY_RESPONDER_ID = 2 OCSP_BASIC_BY_NAME_RESPONDER_ID = 1 OCSP_BASIC_GOOD_CERT_STATUS = 0 OCSP_BASIC_RESPONSE_V1 = 0 OCSP_BASIC_REVOKED_CERT_STATUS = 1 OCSP_BASIC_UNKNOWN_CERT_STATUS = 2 OCSP_INTERNAL_ERROR_RESPONSE = 2 OCSP_MALFORMED_REQUEST_RESPONSE = 1 OCSP_REQUEST_V1 = 0 OCSP_SIG_REQUIRED_RESPONSE = 5 OCSP_SUCCESSFUL_RESPONSE = 0 OCSP_TRY_LATER_RESPONSE = 3 OCSP_UNAUTHORIZED_RESPONSE = 6 ODA_DRAWENTIRE = 0x0001 ODA_FOCUS = 0x0004 ODA_SELECT = 0x0002 ODDPARITY = 1 ODS_CHECKED = 0x0008 ODS_COMBOBOXEDIT = 0x1000 ODS_DEFAULT = 0x0020 ODS_DISABLED = 0x0004 ODS_FOCUS = 0x0010 ODS_GRAYED = 0x0002 ODS_HOTLIGHT = 0x0040 ODS_INACTIVE = 0x0080 ODS_NOACCEL = 0x0100 ODS_NOFOCUSRECT = 0x0200 ODS_SELECTED = 0x0001 ODT_BUTTON = 4 ODT_COMBOBOX = 3 ODT_LISTBOX = 2 ODT_MENU = 1 ODT_STATIC = 5 OEM_CHARSET = 255 OEM_FIXED_FONT = 10 OE_Abort = 2 OE_Cascade = 10 OE_Default = 11 OE_Fail = 3 OE_Ignore = 4 OE_None = 0 OE_Replace = 5 OE_Restrict = 7 OE_Rollback = 1 OE_SetDflt = 9 OE_SetNull = 8 OE_Update = 6 OFFLINE_STATUS_INCOMPLETE = 0x0004 OFFLINE_STATUS_LOCAL = 0x0001 OFFLINE_STATUS_REMOTE = 0x0002 OFN_ALLOWMULTISELECT = 0x200 OFN_CREATEPROMPT = 0x2000 OFN_DONTADDTORECENT = 0x2000000 OFN_ENABLEHOOK = 0x20 OFN_ENABLEINCLUDENOTIFY = 0x400000 OFN_ENABLESIZING = 0x800000 OFN_ENABLETEMPLATE = 0x40 OFN_ENABLETEMPLATEHANDLE = 0x80 OFN_EXPLORER = 0x80000 OFN_EXTENSIONDIFFERENT = 0x400 OFN_EX_NOPLACESBAR = 0x1 OFN_FILEMUSTEXIST = 0x1000 OFN_FORCESHOWHIDDEN = 0x10000000 OFN_HIDEREADONLY = 0x4 OFN_LONGNAMES = 0x200000 OFN_NOCHANGEDIR = 0x8 OFN_NODEREFERENCELINKS = 0x100000 OFN_NOLONGNAMES = 0x40000 OFN_NONETWORKBUTTON = 0x20000 OFN_NOREADONLYRETURN = 0x8000 OFN_NOTESTFILECREATE = 0x10000 OFN_NOVALIDATE = 0x100 OFN_OVERWRITEPROMPT = 0x2 OFN_PATHMUSTEXIST = 0x800 OFN_READONLY = 0x1 OFN_SHAREAWARE = 0x4000 OFN_SHAREFALLTHROUGH = 2 OFN_SHARENOWARN = 1 OFN_SHAREWARN = 0 OFN_SHOWHELP = 0x10 OFS_MAXPATHNAME = 128 OF_CANCEL = 0x800 OF_CREATE = 0x1000 OF_DELETE = 0x200 OF_EXIST = 0x4000 OF_PARSE = 0x100 OF_PROMPT = 0x2000 OF_READ = 0x0 OF_READWRITE = 0x2 OF_REOPEN = 0x8000 OF_SHARE_COMPAT = 0x0 OF_SHARE_DENY_NONE = 0x40 OF_SHARE_DENY_READ = 0x30 OF_SHARE_DENY_WRITE = 0x20 OF_SHARE_EXCLUSIVE = 0x10 OF_VERIFY = 0x400 OF_WRITE = 0x1 OLD_P_OVERLAY = 2 OLECREATE_LEAVERUNNING = 0x1 OLEIVERB_DISCARDUNDOSTATE = -6 OLEIVERB_HIDE = -3 OLEIVERB_INPLACEACTIVATE = -5 OLEIVERB_OPEN = -2 OLEIVERB_PRIMARY = 0 OLEIVERB_SHOW = -1 OLEIVERB_UIACTIVATE = -4 OLEOBJ_E_FIRST = 2147746176 OLEOBJ_E_LAST = 2147746191 OLEOBJ_S_FIRST = 262528 OLEOBJ_S_LAST = 262543 OMIT_TEMPDB = 0 ONE5STOPBITS = 1 ONEPASS_MULTI = 2 ONEPASS_OFF = 0 ONEPASS_SINGLE = 1 ONESTOPBIT = 0 OPAQUE = 2 OPAQUEKEYBLOB = 0x9 OPENCHANNEL = 4110 OPEN_ALWAYS = 4 OPEN_EXISTING = 3 OPFLAG_APPEND = 0x08 OPFLAG_AUXDELETE = 0x04 OPFLAG_BULKCSR = 0x01 OPFLAG_EPHEM = 0x01 OPFLAG_FORDELETE = 0x08 OPFLAG_ISNOOP = 0x40 OPFLAG_ISUPDATE = 0x04 OPFLAG_LASTROWID = 0x20 OPFLAG_LENGTHARG = 0x40 OPFLAG_NCHANGE = 0x01 OPFLAG_NOCHNG = 0x01 OPFLAG_NOCHNG_MAGIC = 0x6d OPFLAG_P2ISREG = 0x10 OPFLAG_PERMUTE = 0x01 OPFLAG_PREFORMAT = 0x80 OPFLAG_SAVEPOSITION = 0x02 OPFLAG_SEEKEQ = 0x02 OPFLAG_TYPEOFARG = 0x80 OPFLAG_USESEEKRESULT = 0x10 OPFLG_IN1 = 0x02 OPFLG_IN2 = 0x04 OPFLG_IN3 = 0x08 OPFLG_JUMP = 0x01 OPFLG_NCYCLE = 0x40 OPFLG_OUT2 = 0x10 OPFLG_OUT3 = 0x20 OPTIONAL = 0 OP_Abortable = 186 OP_Add = 106 OP_AddImm = 86 OP_Affinity = 96 OP_AggFinal = 165 OP_AggInverse = 161 OP_AggStep = 162 OP_AggStep1 = 163 OP_AggValue = 164 OP_And = 44 OP_AutoCommit = 1 OP_BeginSubrtn = 74 OP_BitAnd = 102 OP_BitNot = 114 OP_BitOr = 103 OP_Blob = 77 OP_Cast = 88 OP_Checkpoint = 3 OP_Clear = 145 OP_Close = 122 OP_ClrSubtype = 179 OP_CollSeq = 85 OP_Column = 94 OP_ColumnsUsed = 123 OP_Compare = 90 OP_Concat = 111 OP_Copy = 80 OP_Count = 98 OP_CreateBtree = 147 OP_CursorHint = 182 OP_CursorLock = 167 OP_CursorUnlock = 168 OP_DecrJumpZero = 61 OP_DeferredSeek = 141 OP_Delete = 130 OP_Destroy = 144 OP_Divide = 109 OP_DropIndex = 152 OP_DropTable = 151 OP_DropTrigger = 154 OP_ElseEq = 58 OP_EndCoroutine = 68 OP_Eq = 53 OP_Expire = 166 OP_Explain = 185 OP_Filter = 64 OP_FilterAdd = 180 OP_FinishSeek = 143 OP_FkCheck = 83 OP_FkCounter = 158 OP_FkIfZero = 49 OP_Found = 29 OP_Function = 66 OP_Ge = 57 OP_Gosub = 10 OP_Goto = 9 OP_Gt = 54 OP_Halt = 70 OP_HaltIfNull = 69 OP_IdxDelete = 140 OP_IdxGE = 45 OP_IdxGT = 41 OP_IdxInsert = 138 OP_IdxLE = 40 OP_IdxLT = 42 OP_IdxRowid = 142 OP_If = 16 OP_IfNoHope = 26 OP_IfNot = 17 OP_IfNotOpen = 25 OP_IfNotZero = 60 OP_IfNullRow = 20 OP_IfPos = 59 OP_IfSmaller = 33 OP_IncrVacuum = 62 OP_Init = 8 OP_InitCoroutine = 11 OP_Insert = 128 OP_Int64 = 72 OP_IntCopy = 82 OP_Integer = 71 OP_IntegrityCk = 155 OP_IsNull = 50 OP_IsTrue = 91 OP_IsType = 18 OP_JournalMode = 4 OP_Jump = 14 OP_Last = 32 OP_Le = 55 OP_LoadAnalysis = 150 OP_Lt = 56 OP_MakeRecord = 97 OP_MaxPgcnt = 178 OP_MemMax = 159 OP_Move = 79 OP_Multiply = 108 OP_MustBeInt = 13 OP_Ne = 52 OP_NewRowid = 127 OP_Next = 39 OP_NoConflict = 27 OP_Noop = 184 OP_Not = 19 OP_NotExists = 31 OP_NotFound = 28 OP_NotNull = 51 OP_Null = 75 OP_NullRow = 136 OP_Offset = 93 OP_OffsetLimit = 160 OP_Once = 15 OP_OpenAutoindex = 116 OP_OpenDup = 115 OP_OpenEphemeral = 118 OP_OpenPseudo = 121 OP_OpenRead = 112 OP_OpenWrite = 113 OP_Or = 43 OP_Pagecount = 177 OP_Param = 157 OP_ParseSchema = 149 OP_Permutation = 89 OP_Prev = 38 OP_Program = 48 OP_PureFunc = 65 OP_ReadCookie = 99 OP_Real = 153 OP_RealAffinity = 87 OP_ReleaseReg = 183 OP_Remainder = 110 OP_ReopenIdx = 101 OP_ResetCount = 131 OP_ResetSorter = 146 OP_ResultRow = 84 OP_Return = 67 OP_Rewind = 36 OP_RowCell = 129 OP_RowData = 134 OP_RowSetAdd = 156 OP_RowSetRead = 46 OP_RowSetTest = 47 OP_Rowid = 135 OP_SCopy = 81 OP_Savepoint = 0 OP_SeekEnd = 137 OP_SeekGE = 23 OP_SeekGT = 24 OP_SeekHit = 125 OP_SeekLE = 22 OP_SeekLT = 21 OP_SeekRowid = 30 OP_SeekScan = 124 OP_Sequence = 126 OP_SequenceTest = 120 OP_SetCookie = 100 OP_ShiftLeft = 104 OP_ShiftRight = 105 OP_SoftNull = 76 OP_Sort = 35 OP_SorterCompare = 132 OP_SorterData = 133 OP_SorterInsert = 139 OP_SorterNext = 37 OP_SorterOpen = 119 OP_SorterSort = 34 OP_SqlExec = 148 OP_String = 73 OP_String8 = 117 OP_Subtract = 107 OP_TableLock = 169 OP_Trace = 181 OP_Transaction = 2 OP_TypeCheck = 95 OP_VBegin = 170 OP_VColumn = 175 OP_VCreate = 171 OP_VDestroy = 172 OP_VFilter = 6 OP_VInitIn = 174 OP_VNext = 63 OP_VOpen = 173 OP_VRename = 176 OP_VUpdate = 7 OP_Vacuum = 5 OP_Variable = 78 OP_Yield = 12 OP_ZeroOrNull = 92 ORD_LANGDRIVER = 1 OR_INVALID_OID = 1911 OR_INVALID_OXID = 1910 OR_INVALID_SET = 1912 OSVERSION_MASK = 0xFFFF0000 OS_VXWORKS = 0 OUT = 0 OUTPUT_DEBUG_STRING_EVENT = 8 OUT_CHARACTER_PRECIS = 2 OUT_DEFAULT_PRECIS = 0 OUT_DEVICE_PRECIS = 5 OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME = "OutOfProcessFunctionTableCallback" OUT_OUTLINE_PRECIS = 8 OUT_PS_ONLY_PRECIS = 10 OUT_RASTER_PRECIS = 6 OUT_SCREEN_OUTLINE_PRECIS = 9 OUT_STRING_PRECIS = 1 OUT_STROKE_PRECIS = 3 OUT_TT_ONLY_PRECIS = 7 OUT_TT_PRECIS = 4 OVERFLOW = 3 OVERWRITE_HIDDEN = 4 OWNER_SECURITY_INFORMATION = 1 P4_COLLSEQ = -2 P4_DYNAMIC = -6 P4_EXPR = -9 P4_FREE_IF_LE = -6 P4_FUNCCTX = -15 P4_FUNCDEF = -7 P4_INT32 = -3 P4_INT64 = -13 P4_INTARRAY = -14 P4_KEYINFO = -8 P4_MEM = -10 P4_NOTUSED = 0 P4_REAL = -12 P4_STATIC = -1 P4_SUBPROGRAM = -4 P4_TABLE = -5 P4_TRANSIENT = 0 P4_VTAB = -11 P5_ConstraintCheck = 3 P5_ConstraintFK = 4 P5_ConstraintNotNull = 1 P5_ConstraintUnique = 2 PAGER_CACHESPILL = 0x20 PAGER_CKPT_FULLFSYNC = 0x10 PAGER_ERROR = 6 PAGER_FLAGS_MASK = 0x38 PAGER_FULLFSYNC = 0x08 PAGER_GET_NOCONTENT = 0x01 PAGER_GET_READONLY = 0x02 PAGER_JOURNALMODE_DELETE = 0 PAGER_JOURNALMODE_MEMORY = 4 PAGER_JOURNALMODE_OFF = 2 PAGER_JOURNALMODE_PERSIST = 1 PAGER_JOURNALMODE_QUERY = -1 PAGER_JOURNALMODE_TRUNCATE = 3 PAGER_JOURNALMODE_WAL = 5 PAGER_LOCKINGMODE_EXCLUSIVE = 1 PAGER_LOCKINGMODE_NORMAL = 0 PAGER_LOCKINGMODE_QUERY = -1 PAGER_MEMORY = 0x0002 PAGER_OMIT_JOURNAL = 0x0001 PAGER_OPEN = 0 PAGER_READER = 1 PAGER_STAT_HIT = 0 PAGER_STAT_MISS = 1 PAGER_STAT_SPILL = 3 PAGER_STAT_WRITE = 2 PAGER_SYNCHRONOUS_EXTRA = 0x04 PAGER_SYNCHRONOUS_FULL = 0x03 PAGER_SYNCHRONOUS_MASK = 0x07 PAGER_SYNCHRONOUS_NORMAL = 0x02 PAGER_SYNCHRONOUS_OFF = 0x01 PAGER_WRITER_CACHEMOD = 3 PAGER_WRITER_DBMOD = 4 PAGER_WRITER_FINISHED = 5 PAGER_WRITER_LOCKED = 2 PAGESETUPDLGORD = 1546 PAGESETUPDLGORDMOTIF = 1550 PAGE_ENCLAVE_DECOMMIT = 0x10000000 PAGE_ENCLAVE_THREAD_CONTROL = 0x80000000 PAGE_ENCLAVE_UNVALIDATED = 0x20000000 PAGE_EXECUTE = 0x10 PAGE_EXECUTE_READ = 0x20 PAGE_EXECUTE_READWRITE = 0x40 PAGE_EXECUTE_WRITECOPY = 0x80 PAGE_GRAPHICS_COHERENT = 0x20000 PAGE_GRAPHICS_EXECUTE = 0x4000 PAGE_GRAPHICS_EXECUTE_READ = 0x8000 PAGE_GRAPHICS_EXECUTE_READWRITE = 0x10000 PAGE_GRAPHICS_NOACCESS = 0x0800 PAGE_GRAPHICS_READONLY = 0x1000 PAGE_GRAPHICS_READWRITE = 0x2000 PAGE_GUARD = 0x100 PAGE_NOACCESS = 0x01 PAGE_NOCACHE = 0x200 PAGE_READONLY = 0x02 PAGE_READWRITE = 0x04 PAGE_REVERT_TO_FILE_MAP = 0x80000000 PAGE_TARGETS_INVALID = 0x40000000 PAGE_TARGETS_NO_UPDATE = 0x40000000 PAGE_WRITECOMBINE = 0x400 PAGE_WRITECOPY = 0x08 PANOSE_COUNT = 10 PAN_ANY = 0 PAN_ARMSTYLE_INDEX = 6 PAN_BENT_ARMS_DOUBLE_SERIF = 11 PAN_BENT_ARMS_HORZ = 7 PAN_BENT_ARMS_SINGLE_SERIF = 10 PAN_BENT_ARMS_VERT = 9 PAN_BENT_ARMS_WEDGE = 8 PAN_CONTRAST_HIGH = 8 PAN_CONTRAST_INDEX = 4 PAN_CONTRAST_LOW = 4 PAN_CONTRAST_MEDIUM = 6 PAN_CONTRAST_MEDIUM_HIGH = 7 PAN_CONTRAST_MEDIUM_LOW = 5 PAN_CONTRAST_NONE = 2 PAN_CONTRAST_VERY_HIGH = 9 PAN_CONTRAST_VERY_LOW = 3 PAN_CULTURE_LATIN = 0 PAN_FAMILYTYPE_INDEX = 0 PAN_FAMILY_DECORATIVE = 4 PAN_FAMILY_PICTORIAL = 5 PAN_FAMILY_SCRIPT = 3 PAN_FAMILY_TEXT_DISPLAY = 2 PAN_LETTERFORM_INDEX = 7 PAN_LETT_NORMAL_BOXED = 4 PAN_LETT_NORMAL_CONTACT = 2 PAN_LETT_NORMAL_FLATTENED = 5 PAN_LETT_NORMAL_OFF_CENTER = 7 PAN_LETT_NORMAL_ROUNDED = 6 PAN_LETT_NORMAL_SQUARE = 8 PAN_LETT_NORMAL_WEIGHTED = 3 PAN_LETT_OBLIQUE_BOXED = 11 PAN_LETT_OBLIQUE_CONTACT = 9 PAN_LETT_OBLIQUE_FLATTENED = 12 PAN_LETT_OBLIQUE_OFF_CENTER = 14 PAN_LETT_OBLIQUE_ROUNDED = 13 PAN_LETT_OBLIQUE_SQUARE = 15 PAN_LETT_OBLIQUE_WEIGHTED = 10 PAN_MIDLINE_CONSTANT_POINTED = 9 PAN_MIDLINE_CONSTANT_SERIFED = 10 PAN_MIDLINE_CONSTANT_TRIMMED = 8 PAN_MIDLINE_HIGH_POINTED = 6 PAN_MIDLINE_HIGH_SERIFED = 7 PAN_MIDLINE_HIGH_TRIMMED = 5 PAN_MIDLINE_INDEX = 8 PAN_MIDLINE_LOW_POINTED = 12 PAN_MIDLINE_LOW_SERIFED = 13 PAN_MIDLINE_LOW_TRIMMED = 11 PAN_MIDLINE_STANDARD_POINTED = 3 PAN_MIDLINE_STANDARD_SERIFED = 4 PAN_MIDLINE_STANDARD_TRIMMED = 2 PAN_NO_FIT = 1 PAN_PROPORTION_INDEX = 3 PAN_PROP_CONDENSED = 6 PAN_PROP_EVEN_WIDTH = 4 PAN_PROP_EXPANDED = 5 PAN_PROP_MODERN = 3 PAN_PROP_MONOSPACED = 9 PAN_PROP_OLD_STYLE = 2 PAN_PROP_VERY_CONDENSED = 8 PAN_PROP_VERY_EXPANDED = 7 PAN_SERIFSTYLE_INDEX = 1 PAN_SERIF_BONE = 8 PAN_SERIF_COVE = 2 PAN_SERIF_EXAGGERATED = 9 PAN_SERIF_FLARED = 14 PAN_SERIF_NORMAL_SANS = 11 PAN_SERIF_OBTUSE_COVE = 3 PAN_SERIF_OBTUSE_SANS = 12 PAN_SERIF_OBTUSE_SQUARE_COVE = 5 PAN_SERIF_PERP_SANS = 13 PAN_SERIF_ROUNDED = 15 PAN_SERIF_SQUARE = 6 PAN_SERIF_SQUARE_COVE = 4 PAN_SERIF_THIN = 7 PAN_SERIF_TRIANGLE = 10 PAN_STRAIGHT_ARMS_DOUBLE_SERIF = 6 PAN_STRAIGHT_ARMS_HORZ = 2 PAN_STRAIGHT_ARMS_SINGLE_SERIF = 5 PAN_STRAIGHT_ARMS_VERT = 4 PAN_STRAIGHT_ARMS_WEDGE = 3 PAN_STROKEVARIATION_INDEX = 5 PAN_STROKE_GRADUAL_DIAG = 2 PAN_STROKE_GRADUAL_HORZ = 5 PAN_STROKE_GRADUAL_TRAN = 3 PAN_STROKE_GRADUAL_VERT = 4 PAN_STROKE_INSTANT_VERT = 8 PAN_STROKE_RAPID_HORZ = 7 PAN_STROKE_RAPID_VERT = 6 PAN_WEIGHT_BLACK = 10 PAN_WEIGHT_BOLD = 8 PAN_WEIGHT_BOOK = 5 PAN_WEIGHT_DEMI = 7 PAN_WEIGHT_HEAVY = 9 PAN_WEIGHT_INDEX = 2 PAN_WEIGHT_LIGHT = 3 PAN_WEIGHT_MEDIUM = 6 PAN_WEIGHT_NORD = 11 PAN_WEIGHT_THIN = 4 PAN_WEIGHT_VERY_LIGHT = 2 PAN_XHEIGHT_CONSTANT_LARGE = 4 PAN_XHEIGHT_CONSTANT_SMALL = 2 PAN_XHEIGHT_CONSTANT_STD = 3 PAN_XHEIGHT_DUCKING_LARGE = 7 PAN_XHEIGHT_DUCKING_SMALL = 5 PAN_XHEIGHT_DUCKING_STD = 6 PAN_XHEIGHT_INDEX = 9 PARAMFLAG_FHASCUSTDATA = 64 PARAMFLAG_FHASDEFAULT = 32 PARAMFLAG_FIN = 1 PARAMFLAG_FLCID = 4 PARAMFLAG_FOPT = 16 PARAMFLAG_FOUT = 2 PARAMFLAG_FRETVAL = 8 PARAMFLAG_NONE = 0 PARSE_MODE_DECLARE_VTAB = 1 PARSE_MODE_NORMAL = 0 PARSE_MODE_RENAME = 2 PARSE_MODE_UNMAP = 3 PARTITION_ENTRY_UNUSED = 0x00 PARTITION_EXTENDED = 0x05 PARTITION_FAT32 = 0x0B PARTITION_FAT32_XINT13 = 0x0C PARTITION_FAT_12 = 0x01 PARTITION_FAT_16 = 0x04 PARTITION_HUGE = 0x06 PARTITION_IFS = 0x07 PARTITION_LDM = 0x42 PARTITION_NTFT = 0x80 PARTITION_OS2BOOTMGR = 0x0A PARTITION_PREP = 0x41 PARTITION_UNIX = 0x63 PARTITION_XENIX_1 = 0x02 PARTITION_XENIX_2 = 0x03 PARTITION_XINT13 = 0x0E PARTITION_XINT13_EXTENDED = 0x0F PARTLY_WITHIN = 1 PASCAL = 0 PASSTHROUGH = 19 PATH_MAX = 260 PBTF_APMRESUMEFROMFAILURE = 0x00000001 PBT_APMBATTERYLOW = 0x0009 PBT_APMOEMEVENT = 0x000B PBT_APMPOWERSTATUSCHANGE = 0x000A PBT_APMQUERYSTANDBY = 0x0001 PBT_APMQUERYSTANDBYFAILED = 0x0003 PBT_APMQUERYSUSPEND = 0x0000 PBT_APMQUERYSUSPENDFAILED = 0x0002 PBT_APMRESUMEAUTOMATIC = 0x0012 PBT_APMRESUMECRITICAL = 0x0006 PBT_APMRESUMESTANDBY = 0x0008 PBT_APMRESUMESUSPEND = 0x0007 PBT_APMSTANDBY = 0x0005 PBT_APMSUSPEND = 0x0004 PBT_POWERSETTINGCHANGE = 32787 PCACHE1_MIGHT_USE_GROUP_MUTEX = 1 PCACHE_DIRTYLIST_ADD = 2 PCACHE_DIRTYLIST_FRONT = 3 PCACHE_DIRTYLIST_REMOVE = 1 PCLEANUI = 2214592512 PC_EXPLICIT = 0x02 PC_INTERIORS = 128 PC_NOCOLLAPSE = 0x04 PC_NONE = 0 PC_PATHS = 512 PC_POLYGON = 1 PC_POLYPOLYGON = 256 PC_RECTANGLE = 2 PC_RESERVED = 0x01 PC_SCANLINE = 8 PC_STYLED = 32 PC_TRAPEZOID = 4 PC_WIDE = 16 PC_WIDESTYLED = 64 PC_WINDPOLYGON = 4 PDCAP_D0_SUPPORTED = 0x00000001 PDCAP_D1_SUPPORTED = 0x00000002 PDCAP_D2_SUPPORTED = 0x00000004 PDCAP_D3_SUPPORTED = 0x00000008 PDCAP_WAKE_FROM_D0_SUPPORTED = 0x00000010 PDCAP_WAKE_FROM_D1_SUPPORTED = 0x00000020 PDCAP_WAKE_FROM_D2_SUPPORTED = 0x00000040 PDCAP_WAKE_FROM_D3_SUPPORTED = 0x00000080 PDCAP_WARM_EJECT_SUPPORTED = 0x00000100 PDERR_CREATEICFAILURE = 0x100A PDERR_DEFAULTDIFFERENT = 0x100C PDERR_DNDMMISMATCH = 0x1009 PDERR_GETDEVMODEFAIL = 0x1005 PDERR_INITFAILURE = 0x1006 PDERR_LOADDRVFAILURE = 0x1004 PDERR_NODEFAULTPRN = 0x1008 PDERR_NODEVICES = 0x1007 PDERR_PARSEFAILURE = 0x1002 PDERR_PRINTERCODES = 0x1000 PDERR_PRINTERNOTFOUND = 0x100B PDERR_RETDEFFAILURE = 0x1003 PDERR_SETUPFAILURE = 0x1001 PDEVICESIZE = 26 PDIRTYUI = 2281701376 PD_ALLPAGES = 0x0 PD_COLLATE = 0x10 PD_CURRENTPAGE = 0x400000 PD_DISABLEPRINTTOFILE = 0x80000 PD_ENABLEPRINTHOOK = 0x1000 PD_ENABLEPRINTTEMPLATE = 0x4000 PD_ENABLEPRINTTEMPLATEHANDLE = 0x10000 PD_ENABLESETUPHOOK = 0x2000 PD_ENABLESETUPTEMPLATE = 0x8000 PD_ENABLESETUPTEMPLATEHANDLE = 0x20000 PD_EXCLUSIONFLAGS = 0x1000000 PD_EXCL_COPIESANDCOLLATE = 33024 PD_HIDEPRINTTOFILE = 0x100000 PD_NOCURRENTPAGE = 0x800000 PD_NONETWORKBUTTON = 0x200000 PD_NOPAGENUMS = 0x8 PD_NOSELECTION = 0x4 PD_NOWARNING = 0x80 PD_PAGENUMS = 0x2 PD_PRINTSETUP = 0x40 PD_PRINTTOFILE = 0x20 PD_RESULT_APPLY = 2 PD_RESULT_CANCEL = 0 PD_RESULT_PRINT = 1 PD_RETURNDC = 0x100 PD_RETURNDEFAULT = 0x400 PD_RETURNIC = 0x200 PD_SELECTION = 0x1 PD_SHOWHELP = 0x800 PD_USEDEVMODECOPIES = 0x40000 PD_USEDEVMODECOPIESANDCOLLATE = 0x40000 PD_USELARGETEMPLATE = 0x10000000 PENDING_LOCK = 3 PERFORMANCE_DATA_VERSION = 1 PERFSTATE_POLICY_CHANGE_IDEAL = 0 PERFSTATE_POLICY_CHANGE_MAX = 2 PERFSTATE_POLICY_CHANGE_ROCKET = 2 PERFSTATE_POLICY_CHANGE_SINGLE = 1 PERF_100NSEC_MULTI_TIMER = 575735040 PERF_100NSEC_MULTI_TIMER_INV = 592512256 PERF_100NSEC_TIMER = 542180608 PERF_100NSEC_TIMER_INV = 558957824 PERF_AVERAGE_BASE = 1073939458 PERF_AVERAGE_BULK = 1073874176 PERF_AVERAGE_TIMER = 805438464 PERF_COUNTER_100NS_QUEUELEN_TYPE = 5571840 PERF_COUNTER_BASE = 0x00030000 PERF_COUNTER_BULK_COUNT = 272696576 PERF_COUNTER_COUNTER = 272696320 PERF_COUNTER_DELTA = 4195328 PERF_COUNTER_ELAPSED = 0x00040000 PERF_COUNTER_FRACTION = 0x00020000 PERF_COUNTER_HISTOGRAM = 0x00060000 PERF_COUNTER_HISTOGRAM_TYPE = 0x80000000 PERF_COUNTER_LARGE_DELTA = 4195584 PERF_COUNTER_LARGE_QUEUELEN_TYPE = 4523264 PERF_COUNTER_LARGE_RAWCOUNT = 65792 PERF_COUNTER_LARGE_RAWCOUNT_HEX = 256 PERF_COUNTER_MULTI_BASE = 1107494144 PERF_COUNTER_MULTI_TIMER = 574686464 PERF_COUNTER_MULTI_TIMER_INV = 591463680 PERF_COUNTER_NODATA = 1073742336 PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE = 6620416 PERF_COUNTER_PRECISION = 0x00070000 PERF_COUNTER_QUEUELEN = 0x00050000 PERF_COUNTER_QUEUELEN_TYPE = 4523008 PERF_COUNTER_RATE = 0x00010000 PERF_COUNTER_RAWCOUNT = 65536 PERF_COUNTER_RAWCOUNT_HEX = 0 PERF_COUNTER_TEXT = 2816 PERF_COUNTER_TIMER = 541132032 PERF_COUNTER_TIMER_INV = 557909248 PERF_COUNTER_VALUE = 0x00000000 PERF_DATA_REVISION = 1 PERF_DATA_VERSION = 1 PERF_DELTA_BASE = 0x00800000 PERF_DELTA_COUNTER = 0x00400000 PERF_DETAIL_ADVANCED = 200 PERF_DETAIL_EXPERT = 300 PERF_DETAIL_NOVICE = 100 PERF_DETAIL_WIZARD = 400 PERF_DISPLAY_NOSHOW = 0x40000000 PERF_DISPLAY_NO_SUFFIX = 0x00000000 PERF_DISPLAY_PERCENT = 0x20000000 PERF_DISPLAY_PER_SEC = 0x10000000 PERF_DISPLAY_SECONDS = 0x30000000 PERF_ELAPSED_TIME = 807666944 PERF_INVERSE_COUNTER = 0x01000000 PERF_LARGE_RAW_BASE = 1073939712 PERF_LARGE_RAW_FRACTION = 537003264 PERF_MULTI_COUNTER = 0x02000000 PERF_NO_INSTANCES = -1 PERF_NO_UNIQUE_ID = -1 PERF_NUMBER_DECIMAL = 0x00010000 PERF_NUMBER_DEC_1000 = 0x00020000 PERF_NUMBER_HEX = 0x00000000 PERF_OBJECT_TIMER = 0x00200000 PERF_OBJ_TIME_TIMER = 543229184 PERF_PRECISION_100NS_TIMER = 542573824 PERF_PRECISION_OBJECT_TIMER = 543622400 PERF_PRECISION_SYSTEM_TIMER = 541525248 PERF_PRECISION_TIMESTAMP = 1073939712 PERF_RAW_BASE = 1073939459 PERF_RAW_FRACTION = 537003008 PERF_SAMPLE_BASE = 1073939457 PERF_SAMPLE_COUNTER = 4260864 PERF_SAMPLE_FRACTION = 549585920 PERF_SIZE_DWORD = 0x00000000 PERF_SIZE_LARGE = 0x00000100 PERF_SIZE_VARIABLE_LEN = 0x00000300 PERF_SIZE_ZERO = 0x00000200 PERF_TEXT_ASCII = 0x00010000 PERF_TEXT_UNICODE = 0x00000000 PERF_TIMER_100NS = 0x00100000 PERF_TIMER_TICK = 0x00000000 PERF_TYPE_COUNTER = 0x00000400 PERF_TYPE_NUMBER = 0x00000000 PERF_TYPE_TEXT = 0x00000800 PERF_TYPE_ZERO = 0x00000C00 PFD_DEPTH_DONTCARE = 0x20000000 PFD_DIRECT3D_ACCELERATED = 0x00004000 PFD_DOUBLEBUFFER = 0x00000001 PFD_DOUBLEBUFFER_DONTCARE = 0x40000000 PFD_DRAW_TO_BITMAP = 0x00000008 PFD_DRAW_TO_WINDOW = 0x00000004 PFD_GENERIC_ACCELERATED = 0x00001000 PFD_GENERIC_FORMAT = 0x00000040 PFD_MAIN_PLANE = 0 PFD_NEED_PALETTE = 0x00000080 PFD_NEED_SYSTEM_PALETTE = 0x00000100 PFD_OVERLAY_PLANE = 1 PFD_STEREO = 0x00000002 PFD_STEREO_DONTCARE = 0x80000000 PFD_SUPPORT_COMPOSITION = 0x00008000 PFD_SUPPORT_DIRECTDRAW = 0x00002000 PFD_SUPPORT_GDI = 0x00000010 PFD_SUPPORT_OPENGL = 0x00000020 PFD_SWAP_COPY = 0x00000400 PFD_SWAP_EXCHANGE = 0x00000200 PFD_SWAP_LAYER_BUFFERS = 0x00000800 PFD_TYPE_COLORINDEX = 1 PFD_TYPE_RGBA = 0 PFD_UNDERLAY_PLANE = -1 PF_3DNOW_INSTRUCTIONS_AVAILABLE = 7 PF_ALPHA_BYTE_INSTRUCTIONS = 5 PF_APPLETALK = 16 PF_ARM_64BIT_LOADSTORE_ATOMIC = 25 PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE = 24 PF_ARM_EXTERNAL_CACHE_AVAILABLE = 26 PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE = 27 PF_ARM_NEON_INSTRUCTIONS_AVAILABLE = 19 PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE = 31 PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE = 30 PF_ARM_V8_INSTRUCTIONS_AVAILABLE = 29 PF_ARM_VFP_32_REGISTERS_AVAILABLE = 18 PF_BAN = 21 PF_CCITT = 10 PF_CHANNELS_ENABLED = 16 PF_CHAOS = 5 PF_COMPARE64_EXCHANGE128 = 15 PF_COMPARE_EXCHANGE128 = 14 PF_COMPARE_EXCHANGE_DOUBLE = 2 PF_DATAKIT = 9 PF_DECnet = 12 PF_DLI = 13 PF_ECMA = 8 PF_FASTFAIL_AVAILABLE = 23 PF_FIREFOX = 19 PF_FLOATING_POINT_EMULATED = 1 PF_FLOATING_POINT_PRECISION_ERRATA = 0 PF_HYLINK = 15 PF_IMPLINK = 3 PF_INET = 2 PF_IPX = 6 PF_ISO = 7 PF_LAT = 14 PF_MAX = 22 PF_MMX_INSTRUCTIONS_AVAILABLE = 3 PF_NS = 6 PF_NX_ENABLED = 12 PF_OSI = 7 PF_PAE_ENABLED = 9 PF_PPC_MOVEMEM_64BIT_OK = 4 PF_PUP = 4 PF_RDPID_INSTRUCTION_AVAILABLE = 33 PF_RDRAND_INSTRUCTION_AVAILABLE = 28 PF_RDTSCP_INSTRUCTION_AVAILABLE = 32 PF_RDTSC_INSTRUCTION_AVAILABLE = 8 PF_RDWRFSGSBASE_AVAILABLE = 22 PF_SECOND_LEVEL_ADDRESS_TRANSLATION = 20 PF_SNA = 11 PF_SSE3_INSTRUCTIONS_AVAILABLE = 13 PF_SSE_DAZ_MODE_AVAILABLE = 11 PF_UNIX = 1 PF_UNKNOWN1 = 20 PF_UNSPEC = 0 PF_VIRT_FIRMWARE_ENABLED = 21 PF_VOICEVIEW = 18 PF_XMMI64_INSTRUCTIONS_AVAILABLE = 10 PF_XMMI_INSTRUCTIONS_AVAILABLE = 6 PF_XSAVE_ENABLED = 17 PGHDR_CLEAN = 0x001 PGHDR_DIRTY = 0x002 PGHDR_DONT_WRITE = 0x010 PGHDR_MMAP = 0x020 PGHDR_NEED_SYNC = 0x008 PGHDR_WAL_APPEND = 0x040 PGHDR_WRITEABLE = 0x004 PHYSICALHEIGHT = 111 PHYSICALOFFSETX = 112 PHYSICALOFFSETY = 113 PHYSICALWIDTH = 110 PIDDI_THUMBNAIL = 2 PIDDSI_BYTECOUNT = 0x00000004 PIDDSI_CATEGORY = 0x00000002 PIDDSI_COMPANY = 0x0000000F PIDDSI_DOCPARTS = 0x0000000D PIDDSI_HEADINGPAIR = 0x0000000C PIDDSI_HIDDENCOUNT = 0x00000009 PIDDSI_LINECOUNT = 0x00000005 PIDDSI_LINKSDIRTY = 0x00000010 PIDDSI_MANAGER = 0x0000000E PIDDSI_MMCLIPCOUNT = 0x0000000A PIDDSI_NOTECOUNT = 0x00000008 PIDDSI_PARCOUNT = 0x00000006 PIDDSI_PRESFORMAT = 0x00000003 PIDDSI_SCALE = 0x0000000B PIDDSI_SLIDECOUNT = 0x00000007 PIDMSI_COPYRIGHT = 11 PIDMSI_EDITOR = 2 PIDMSI_OWNER = 8 PIDMSI_PRODUCTION = 10 PIDMSI_PROJECT = 6 PIDMSI_RATING = 9 PIDMSI_SEQUENCE_NO = 5 PIDMSI_SOURCE = 4 PIDMSI_STATUS = 7 PIDMSI_SUPPLIER = 3 PIDSI_APPNAME = 18 PIDSI_AUTHOR = 4 PIDSI_CHARCOUNT = 16 PIDSI_COMMENTS = 6 PIDSI_CREATE_DTM = 12 PIDSI_DOC_SECURITY = 19 PIDSI_EDITTIME = 10 PIDSI_KEYWORDS = 5 PIDSI_LASTAUTHOR = 8 PIDSI_LASTPRINTED = 11 PIDSI_LASTSAVE_DTM = 13 PIDSI_PAGECOUNT = 14 PIDSI_REVNUMBER = 9 PIDSI_SUBJECT = 3 PIDSI_TEMPLATE = 7 PIDSI_THUMBNAIL = 17 PIDSI_TITLE = 2 PIDSI_WORDCOUNT = 15 PID_BEHAVIOR = 2147483651 PID_CODEPAGE = 1 PID_DICTIONARY = 0 PID_FIRST_NAME_DEFAULT = 4095 PID_FIRST_USABLE = 2 PID_ILLEGAL = 4294967295 PID_LOCALE = 2147483648 PID_MAX_READONLY = 3221225471 PID_MIN_READONLY = 2147483648 PID_MODIFY_TIME = 2147483649 PID_SECURITY = 2147483650 PIPE_ACCEPT_REMOTE_CLIENTS = 0x0 PIPE_ACCESS_DUPLEX = 0x3 PIPE_ACCESS_INBOUND = 0x1 PIPE_ACCESS_OUTBOUND = 0x2 PIPE_CLIENT_END = 0x0 PIPE_NOWAIT = 0x1 PIPE_READMODE_BYTE = 0x0 PIPE_READMODE_MESSAGE = 0x2 PIPE_REJECT_REMOTE_CLIENTS = 0x8 PIPE_SERVER_END = 0x1 PIPE_TYPE_BYTE = 0x0 PIPE_TYPE_MESSAGE = 0x4 PIPE_UNLIMITED_INSTANCES = 255 PIPE_WAIT = 0x0 PKCS12_ALLOW_OVERWRITE_KEY = 0x4000 PKCS12_ALWAYS_CNG_KSP = 0x200 PKCS12_DISABLE_ENCRYPT_CERTIFICATES = 0x0100 PKCS12_ENCRYPT_CERTIFICATES = 0x0200 PKCS12_EXPORT_ECC_CURVE_OID = 0x2000 PKCS12_EXPORT_ECC_CURVE_PARAMETERS = 0x1000 PKCS12_EXPORT_PBES2_PARAMS = 0x0080 PKCS12_EXPORT_RESERVED_MASK = 0xffff0000 PKCS12_EXPORT_SILENT = 0x40 PKCS12_IMPORT_RESERVED_MASK = 0xffff0000 PKCS12_IMPORT_SILENT = 0x40 PKCS12_INCLUDE_EXTENDED_PROPERTIES = 0x10 PKCS12_NO_PERSIST_KEY = 0x8000 PKCS12_OBJECT_LOCATOR_ALL_IMPORT_FLAGS = 33360 PKCS12_ONLY_CERTIFICATES = 0x00000400 PKCS12_ONLY_CERTIFICATES_PROVIDER_TYPE = 0 PKCS12_ONLY_NOT_ENCRYPTED_CERTIFICATES = 0x00000800 PKCS12_PBKDF2_ID_HMAC_SHA1 = "1.2.840.113549.2.7" PKCS12_PBKDF2_ID_HMAC_SHA256 = "1.2.840.113549.2.9" PKCS12_PBKDF2_ID_HMAC_SHA384 = "1.2.840.113549.2.10" PKCS12_PBKDF2_ID_HMAC_SHA512 = "1.2.840.113549.2.11" PKCS12_PREFER_CNG_KSP = 0x100 PKCS12_PROTECT_TO_DOMAIN_SIDS = 0x20 PKCS12_VIRTUAL_ISOLATION_KEY = 0x00010000 PKCS5_PADDING = 1 PKCS_7_ASN_ENCODING = 0x10000 PKCS_7_NDR_ENCODING = 0x20000 PKCS_RSA_SSA_PSS_TRAILER_FIELD_BC = 1 PLAINTEXTKEYBLOB = 0x8 PLANES = 14 PLOSS = 6 PMB_ACTIVE = 0x00000001 PM_NOREMOVE = 0x0000 PM_NOYIELD = 0x0002 PM_QS_INPUT = 67567616 PM_QS_PAINT = 2097152 PM_QS_POSTMESSAGE = 9961472 PM_QS_SENDMESSAGE = 4194304 PM_REMOVE = 0x0001 POINTER_32 = 0 POINTER_64 = 0 POINTER_SIGNED = 0 POINTER_UNSIGNED = 0 POLICY_AUDIT_SUBCATEGORY_COUNT = 56 POLICY_SHOWREASONUI_ALWAYS = 1 POLICY_SHOWREASONUI_NEVER = 0 POLICY_SHOWREASONUI_SERVERONLY = 3 POLICY_SHOWREASONUI_WORKSTATIONONLY = 2 POLYFILL_LAST = 2 POLYGONALCAPS = 32 PORT_STATUS_DOOR_OPEN = 7 PORT_STATUS_NO_TONER = 6 PORT_STATUS_OFFLINE = 1 PORT_STATUS_OUTPUT_BIN_FULL = 4 PORT_STATUS_OUT_OF_MEMORY = 9 PORT_STATUS_PAPER_JAM = 2 PORT_STATUS_PAPER_OUT = 3 PORT_STATUS_PAPER_PROBLEM = 5 PORT_STATUS_POWER_SAVE = 12 PORT_STATUS_TONER_LOW = 10 PORT_STATUS_TYPE_ERROR = 1 PORT_STATUS_TYPE_INFO = 3 PORT_STATUS_TYPE_WARNING = 2 PORT_STATUS_USER_INTERVENTION = 8 PORT_STATUS_WARMING_UP = 11 PORT_TYPE_NET_ATTACHED = 0x0008 PORT_TYPE_READ = 0x0002 PORT_TYPE_REDIRECTED = 0x0004 PORT_TYPE_WRITE = 0x0001 POSTSCRIPT_DATA = 37 POSTSCRIPT_IDENTIFY = 4117 POSTSCRIPT_IGNORE = 38 POSTSCRIPT_INJECTION = 4118 POSTSCRIPT_PASSTHROUGH = 4115 POWERBUTTON_ACTION_INDEX_HIBERNATE = 2 POWERBUTTON_ACTION_INDEX_NOTHING = 0 POWERBUTTON_ACTION_INDEX_SHUTDOWN = 3 POWERBUTTON_ACTION_INDEX_SLEEP = 1 POWERBUTTON_ACTION_VALUE_HIBERNATE = 3 POWERBUTTON_ACTION_VALUE_NOTHING = 0 POWERBUTTON_ACTION_VALUE_SHUTDOWN = 6 POWERBUTTON_ACTION_VALUE_SLEEP = 2 POWER_ACTION_CRITICAL = 0x80000000 POWER_ACTION_DISABLE_WAKES = 0x40000000 POWER_ACTION_HIBERBOOT = 0x00000008 POWER_ACTION_LIGHTEST_FIRST = 0x10000000 POWER_ACTION_LOCK_CONSOLE = 0x20000000 POWER_ACTION_OVERRIDE_APPS = 0x00000004 POWER_ACTION_PSEUDO_TRANSITION = 0x08000000 POWER_ACTION_QUERY_ALLOWED = 0x00000001 POWER_ACTION_UI_ALLOWED = 0x00000002 POWER_DEVICE_IDLE_POLICY_CONSERVATIVE = 1 POWER_DEVICE_IDLE_POLICY_PERFORMANCE = 0 POWER_FORCE_TRIGGER_RESET = 0x80000000 POWER_LEVEL_USER_NOTIFY_EXEC = 0x00000004 POWER_LEVEL_USER_NOTIFY_SOUND = 0x00000002 POWER_LEVEL_USER_NOTIFY_TEXT = 0x00000001 POWER_PLATFORM_ROLE_V1 = 1 POWER_PLATFORM_ROLE_V2 = 2 POWER_PLATFORM_ROLE_VERSION = 1 POWER_REQUEST_CONTEXT_DETAILED_STRING = 0x00000002 POWER_REQUEST_CONTEXT_SIMPLE_STRING = 0x00000001 POWER_REQUEST_CONTEXT_VERSION = 0 POWER_SETTING_VALUE_VERSION = 1 POWER_SYSTEM_MAXIMUM = 7 POWER_USER_NOTIFY_BUTTON = 0x00000008 POWER_USER_NOTIFY_FORCED_SHUTDOWN = 0x00000020 POWER_USER_NOTIFY_SHUTDOWN = 0x00000010 PO_DELETE = 0x0013 PO_PORTCHANGE = 0x0020 PO_RENAME = 0x0014 PO_REN_PORT = 0x0034 PO_THROTTLE_ADAPTIVE = 3 PO_THROTTLE_CONSTANT = 1 PO_THROTTLE_DEGRADE = 2 PO_THROTTLE_MAXIMUM = 4 PO_THROTTLE_NONE = 0 PPM_FIRMWARE_ACPI1C2 = 0x1 PPM_FIRMWARE_ACPI1C3 = 0x2 PPM_FIRMWARE_ACPI1TSTATES = 0x4 PPM_FIRMWARE_CPC = 0x40000 PPM_FIRMWARE_CSD = 0x10 PPM_FIRMWARE_CST = 0x8 PPM_FIRMWARE_OSC = 0x10000 PPM_FIRMWARE_PCCH = 0x4000 PPM_FIRMWARE_PCCP = 0x8000 PPM_FIRMWARE_PCT = 0x20 PPM_FIRMWARE_PDC = 0x20000 PPM_FIRMWARE_PPC = 0x100 PPM_FIRMWARE_PSD = 0x200 PPM_FIRMWARE_PSS = 0x40 PPM_FIRMWARE_PTC = 0x400 PPM_FIRMWARE_TPC = 0x1000 PPM_FIRMWARE_TSD = 0x2000 PPM_FIRMWARE_TSS = 0x800 PPM_FIRMWARE_XPSS = 0x80 PPM_IDLE_IMPLEMENTATION_CSTATES = 0x1 PPM_IDLE_IMPLEMENTATION_NONE = 0x0 PPM_IDLE_IMPLEMENTATION_PEP = 0x2 PPM_PERFORMANCE_IMPLEMENTATION_CPPC = 3 PPM_PERFORMANCE_IMPLEMENTATION_NONE = 0 PPM_PERFORMANCE_IMPLEMENTATION_PCCV1 = 2 PPM_PERFORMANCE_IMPLEMENTATION_PEP = 4 PPM_PERFORMANCE_IMPLEMENTATION_PSTATES = 1 PP_ADMIN_PIN = 31 PP_APPLI_CERT = 18 PP_CERTCHAIN = 9 PP_CHANGE_PASSWORD = 7 PP_CLIENT_HWND = 1 PP_CONTAINER = 6 PP_CONTEXT_INFO = 11 PP_CRYPT_COUNT_KEY_USE = 41 PP_DELETEKEY = 24 PP_DISPLAYERRORS = 0x01 PP_ENUMALGS = 1 PP_ENUMALGS_EX = 22 PP_ENUMCONTAINERS = 2 PP_ENUMELECTROOTS = 26 PP_ENUMEX_SIGNING_PROT = 40 PP_ENUMMANDROOTS = 25 PP_IMPTYPE = 3 PP_KEYEXCHANGE_ALG = 14 PP_KEYEXCHANGE_KEYSIZE = 12 PP_KEYEXCHANGE_PIN = 32 PP_KEYSET_SEC_DESCR = 8 PP_KEYSET_TYPE = 27 PP_KEYSPEC = 39 PP_KEYSTORAGE = 17 PP_KEYX_KEYSIZE_INC = 35 PP_KEY_TYPE_SUBTYPE = 10 PP_NAME = 4 PP_PROVTYPE = 16 PP_SESSION_KEYSIZE = 20 PP_SGC_INFO = 37 PP_SIGNATURE_ALG = 15 PP_SIGNATURE_KEYSIZE = 13 PP_SIGNATURE_PIN = 33 PP_SIG_KEYSIZE_INC = 34 PP_SYM_KEYSIZE = 19 PP_UI_PROMPT = 21 PP_UNIQUE_CONTAINER = 36 PP_USE_HARDWARE_RNG = 38 PP_VERSION = 5 PRAGMA_DEPRECATED_DDK = 0 PREFERRED_SCHEMA_TABLE = "sqlite_schema" PREFERRED_TEMP_SCHEMA_TABLE = "sqlite_temp_schema" PRF_CHECKVISIBLE = 1 PRF_CHILDREN = 16 PRF_CLIENT = 4 PRF_ERASEBKGND = 8 PRF_NONCLIENT = 2 PRF_OWNED = 32 PRINTACTION_DOCUMENTDEFAULTS = 6 PRINTACTION_NETINSTALL = 2 PRINTACTION_NETINSTALLLINK = 3 PRINTACTION_OPEN = 0 PRINTACTION_OPENNETPRN = 5 PRINTACTION_PROPERTIES = 1 PRINTACTION_SERVERPROPERTIES = 7 PRINTACTION_TESTPAGE = 4 PRINTDLGEXORD = 1549 PRINTDLGORD = 1538 PRINTER_ACCESS_ADMINISTER = 0x00000004 PRINTER_ACCESS_USE = 0x00000008 PRINTER_ALL_ACCESS = 983052 PRINTER_ATTRIBUTE_DEFAULT = 0x00000004 PRINTER_ATTRIBUTE_DIRECT = 0x00000002 PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST = 0x00000200 PRINTER_ATTRIBUTE_ENABLE_BIDI = 0x00000800 PRINTER_ATTRIBUTE_ENABLE_DEVQ = 0x00000080 PRINTER_ATTRIBUTE_FAX = 0x00004000 PRINTER_ATTRIBUTE_HIDDEN = 0x00000020 PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS = 0x00000100 PRINTER_ATTRIBUTE_LOCAL = 0x00000040 PRINTER_ATTRIBUTE_NETWORK = 0x00000010 PRINTER_ATTRIBUTE_PUBLISHED = 0x00002000 PRINTER_ATTRIBUTE_QUEUED = 0x00000001 PRINTER_ATTRIBUTE_RAW_ONLY = 0x00001000 PRINTER_ATTRIBUTE_SHARED = 0x00000008 PRINTER_ATTRIBUTE_TS = 0x00008000 PRINTER_ATTRIBUTE_WORK_OFFLINE = 0x00000400 PRINTER_CHANGE_ADD_FORM = 0x00010000 PRINTER_CHANGE_ADD_JOB = 0x00000100 PRINTER_CHANGE_ADD_PORT = 0x00100000 PRINTER_CHANGE_ADD_PRINTER = 0x00000001 PRINTER_CHANGE_ADD_PRINTER_DRIVER = 0x10000000 PRINTER_CHANGE_ADD_PRINT_PROCESSOR = 0x01000000 PRINTER_CHANGE_ALL = 0x7777FFFF PRINTER_CHANGE_CONFIGURE_PORT = 0x00200000 PRINTER_CHANGE_DELETE_FORM = 0x00040000 PRINTER_CHANGE_DELETE_JOB = 0x00000400 PRINTER_CHANGE_DELETE_PORT = 0x00400000 PRINTER_CHANGE_DELETE_PRINTER = 0x00000004 PRINTER_CHANGE_DELETE_PRINTER_DRIVER = 0x40000000 PRINTER_CHANGE_DELETE_PRINT_PROCESSOR = 0x04000000 PRINTER_CHANGE_FAILED_CONNECTION_PRINTER = 0x00000008 PRINTER_CHANGE_FORM = 0x00070000 PRINTER_CHANGE_JOB = 0x0000FF00 PRINTER_CHANGE_PORT = 0x00700000 PRINTER_CHANGE_PRINTER = 0x000000FF PRINTER_CHANGE_PRINTER_DRIVER = 0x70000000 PRINTER_CHANGE_PRINT_PROCESSOR = 0x07000000 PRINTER_CHANGE_SET_FORM = 0x00020000 PRINTER_CHANGE_SET_JOB = 0x00000200 PRINTER_CHANGE_SET_PRINTER = 0x00000002 PRINTER_CHANGE_SET_PRINTER_DRIVER = 0x20000000 PRINTER_CHANGE_TIMEOUT = 0x80000000 PRINTER_CHANGE_WRITE_JOB = 0x00000800 PRINTER_CONTROL_PAUSE = 1 PRINTER_CONTROL_PURGE = 3 PRINTER_CONTROL_RESUME = 2 PRINTER_CONTROL_SET_STATUS = 4 PRINTER_ENUM_CONNECTIONS = 0x00000004 PRINTER_ENUM_CONTAINER = 0x00008000 PRINTER_ENUM_DEFAULT = 0x00000001 PRINTER_ENUM_EXPAND = 0x00004000 PRINTER_ENUM_FAVORITE = 0x00000004 PRINTER_ENUM_HIDE = 0x01000000 PRINTER_ENUM_ICON1 = 0x00010000 PRINTER_ENUM_ICON2 = 0x00020000 PRINTER_ENUM_ICON3 = 0x00040000 PRINTER_ENUM_ICON4 = 0x00080000 PRINTER_ENUM_ICON5 = 0x00100000 PRINTER_ENUM_ICON6 = 0x00200000 PRINTER_ENUM_ICON7 = 0x00400000 PRINTER_ENUM_ICON8 = 0x00800000 PRINTER_ENUM_ICONMASK = 0x00ff0000 PRINTER_ENUM_LOCAL = 0x00000002 PRINTER_ENUM_NAME = 0x00000008 PRINTER_ENUM_NETWORK = 0x00000040 PRINTER_ENUM_REMOTE = 0x00000010 PRINTER_ENUM_SHARED = 0x00000020 PRINTER_ERROR_INFORMATION = 0x80000000 PRINTER_ERROR_JAM = 0x00000002 PRINTER_ERROR_OUTOFPAPER = 0x00000001 PRINTER_ERROR_OUTOFTONER = 0x00000004 PRINTER_ERROR_SEVERE = 0x20000000 PRINTER_ERROR_WARNING = 0x40000000 PRINTER_EXECUTE = 131080 PRINTER_FONTTYPE = 0x4000 PRINTER_NOTIFY_FIELD_ATTRIBUTES = 0x0D PRINTER_NOTIFY_FIELD_AVERAGE_PPM = 0x15 PRINTER_NOTIFY_FIELD_BYTES_PRINTED = 0x19 PRINTER_NOTIFY_FIELD_CJOBS = 0x14 PRINTER_NOTIFY_FIELD_COMMENT = 0x05 PRINTER_NOTIFY_FIELD_DATATYPE = 0x0B PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY = 0x0F PRINTER_NOTIFY_FIELD_DEVMODE = 0x07 PRINTER_NOTIFY_FIELD_DRIVER_NAME = 0x04 PRINTER_NOTIFY_FIELD_LOCATION = 0x06 PRINTER_NOTIFY_FIELD_OBJECT_GUID = 0x1A PRINTER_NOTIFY_FIELD_PAGES_PRINTED = 0x17 PRINTER_NOTIFY_FIELD_PARAMETERS = 0x0A PRINTER_NOTIFY_FIELD_PORT_NAME = 0x03 PRINTER_NOTIFY_FIELD_PRINTER_NAME = 0x01 PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR = 0x09 PRINTER_NOTIFY_FIELD_PRIORITY = 0x0E PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR = 0x0C PRINTER_NOTIFY_FIELD_SEPFILE = 0x08 PRINTER_NOTIFY_FIELD_SERVER_NAME = 0x00 PRINTER_NOTIFY_FIELD_SHARE_NAME = 0x02 PRINTER_NOTIFY_FIELD_START_TIME = 0x10 PRINTER_NOTIFY_FIELD_STATUS = 0x12 PRINTER_NOTIFY_FIELD_STATUS_STRING = 0x13 PRINTER_NOTIFY_FIELD_TOTAL_BYTES = 0x18 PRINTER_NOTIFY_FIELD_TOTAL_PAGES = 0x16 PRINTER_NOTIFY_FIELD_UNTIL_TIME = 0x11 PRINTER_NOTIFY_INFO_DISCARDED = 0x01 PRINTER_NOTIFY_OPTIONS_REFRESH = 0x01 PRINTER_NOTIFY_TYPE = 0x00 PRINTER_READ = 131080 PRINTER_STATUS_BUSY = 0x00000200 PRINTER_STATUS_DOOR_OPEN = 0x00400000 PRINTER_STATUS_ERROR = 0x00000002 PRINTER_STATUS_INITIALIZING = 0x00008000 PRINTER_STATUS_IO_ACTIVE = 0x00000100 PRINTER_STATUS_MANUAL_FEED = 0x00000020 PRINTER_STATUS_NOT_AVAILABLE = 0x00001000 PRINTER_STATUS_NO_TONER = 0x00040000 PRINTER_STATUS_OFFLINE = 0x00000080 PRINTER_STATUS_OUTPUT_BIN_FULL = 0x00000800 PRINTER_STATUS_OUT_OF_MEMORY = 0x00200000 PRINTER_STATUS_PAGE_PUNT = 0x00080000 PRINTER_STATUS_PAPER_JAM = 0x00000008 PRINTER_STATUS_PAPER_OUT = 0x00000010 PRINTER_STATUS_PAPER_PROBLEM = 0x00000040 PRINTER_STATUS_PAUSED = 0x00000001 PRINTER_STATUS_PENDING_DELETION = 0x00000004 PRINTER_STATUS_POWER_SAVE = 0x01000000 PRINTER_STATUS_PRINTING = 0x00000400 PRINTER_STATUS_PROCESSING = 0x00004000 PRINTER_STATUS_SERVER_UNKNOWN = 0x00800000 PRINTER_STATUS_TONER_LOW = 0x00020000 PRINTER_STATUS_USER_INTERVENTION = 0x00100000 PRINTER_STATUS_WAITING = 0x00002000 PRINTER_STATUS_WARMING_UP = 0x00010000 PRINTER_WRITE = 131080 PRINTRATEUNIT_CPS = 2 PRINTRATEUNIT_IPM = 4 PRINTRATEUNIT_LPM = 3 PRINTRATEUNIT_PPM = 1 PRIVATEKEYBLOB = 0x7 PRIVATE_NAMESPACE_FLAG_DESTROY = 0x1 PRIVILEGE_SET_ALL_NECESSARY = 1 PRNSETUPDLGORD = 1539 PROCESSOR_ALPHA_21064 = 21064 PROCESSOR_AMD_X8664 = 8664 PROCESSOR_ARCHITECTURE_ALPHA = 2 PROCESSOR_ARCHITECTURE_ALPHA64 = 7 PROCESSOR_ARCHITECTURE_AMD64 = 9 PROCESSOR_ARCHITECTURE_ARM = 5 PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 = 13 PROCESSOR_ARCHITECTURE_ARM64 = 12 PROCESSOR_ARCHITECTURE_IA32_ON_ARM64 = 14 PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 = 10 PROCESSOR_ARCHITECTURE_IA64 = 6 PROCESSOR_ARCHITECTURE_INTEL = 0 PROCESSOR_ARCHITECTURE_MIPS = 1 PROCESSOR_ARCHITECTURE_MSIL = 8 PROCESSOR_ARCHITECTURE_NEUTRAL = 11 PROCESSOR_ARCHITECTURE_PPC = 3 PROCESSOR_ARCHITECTURE_SHX = 4 PROCESSOR_ARCHITECTURE_UNKNOWN = 0xffff PROCESSOR_ARM720 = 1824 PROCESSOR_ARM820 = 2080 PROCESSOR_ARM920 = 2336 PROCESSOR_ARM_7TDMI = 70001 PROCESSOR_HITACHI_SH3 = 10003 PROCESSOR_HITACHI_SH3E = 10004 PROCESSOR_HITACHI_SH4 = 10005 PROCESSOR_IDLESTATE_POLICY_COUNT = 0x3 PROCESSOR_INTEL_386 = 386 PROCESSOR_INTEL_486 = 486 PROCESSOR_INTEL_IA64 = 2200 PROCESSOR_INTEL_PENTIUM = 586 PROCESSOR_MIPS_R4000 = 4000 PROCESSOR_MOTOROLA_821 = 821 PROCESSOR_OPTIL = 0x494f PROCESSOR_PERF_BOOST_MODE_AGGRESSIVE = 2 PROCESSOR_PERF_BOOST_MODE_DISABLED = 0 PROCESSOR_PERF_BOOST_MODE_EFFICIENT_AGGRESSIVE = 4 PROCESSOR_PERF_BOOST_MODE_EFFICIENT_ENABLED = 3 PROCESSOR_PERF_BOOST_MODE_ENABLED = 1 PROCESSOR_PERF_BOOST_MODE_MAX = 4 PROCESSOR_PERF_BOOST_POLICY_DISABLED = 0 PROCESSOR_PERF_BOOST_POLICY_MAX = 100 PROCESSOR_PPC_601 = 601 PROCESSOR_PPC_603 = 603 PROCESSOR_PPC_604 = 604 PROCESSOR_PPC_620 = 620 PROCESSOR_SHx_SH3 = 103 PROCESSOR_SHx_SH4 = 104 PROCESSOR_STRONGARM = 2577 PROCESS_ALL_ACCESS = 2035711 PROCESS_CREATE_PROCESS = 128 PROCESS_CREATE_THREAD = 2 PROCESS_DUP_HANDLE = 64 PROCESS_HEAP_ENTRY_BUSY = 0x4 PROCESS_HEAP_ENTRY_DDESHARE = 0x20 PROCESS_HEAP_ENTRY_MOVEABLE = 0x10 PROCESS_HEAP_REGION = 0x1 PROCESS_HEAP_SEG_ALLOC = 0x8 PROCESS_HEAP_UNCOMMITTED_RANGE = 0x2 PROCESS_MODE_BACKGROUND_BEGIN = 0x100000 PROCESS_MODE_BACKGROUND_END = 0x200000 PROCESS_QUERY_INFORMATION = 1024 PROCESS_QUERY_LIMITED_INFORMATION = 4096 PROCESS_SET_INFORMATION = 512 PROCESS_SET_QUOTA = 256 PROCESS_SET_SESSIONID = 4 PROCESS_SUSPEND_RESUME = 2048 PROCESS_TERMINATE = 1 PROCESS_VM_OPERATION = 8 PROCESS_VM_READ = 16 PROCESS_VM_WRITE = 32 PROC_IDLE_BUCKET_COUNT = 6 PROC_IDLE_BUCKET_COUNT_EX = 16 PRODUCT_ARM64_SERVER = 0x78 PRODUCT_BUSINESS = 0x6 PRODUCT_BUSINESS_N = 0x10 PRODUCT_CLOUD_HOST_INFRASTRUCTURE_SERVER = 0x7C PRODUCT_CLOUD_STORAGE_SERVER = 0x6E PRODUCT_CLUSTER_SERVER = 0x12 PRODUCT_CLUSTER_SERVER_V = 0x40 PRODUCT_CONNECTED_CAR = 0x75 PRODUCT_CORE = 0x65 PRODUCT_CORE_ARM = 0x61 PRODUCT_CORE_CONNECTED = 0x6F PRODUCT_CORE_CONNECTED_COUNTRYSPECIFIC = 0x74 PRODUCT_CORE_CONNECTED_N = 0x71 PRODUCT_CORE_CONNECTED_SINGLELANGUAGE = 0x73 PRODUCT_CORE_COUNTRYSPECIFIC = 0x63 PRODUCT_CORE_LANGUAGESPECIFIC = 0x64 PRODUCT_CORE_N = 0x62 PRODUCT_CORE_SINGLELANGUAGE = 0x64 PRODUCT_DATACENTER_EVALUATION_SERVER = 0x50 PRODUCT_DATACENTER_SERVER = 0x8 PRODUCT_DATACENTER_SERVER_CORE = 0xc PRODUCT_DATACENTER_SERVER_CORE_V = 0x27 PRODUCT_DATACENTER_SERVER_V = 0x25 PRODUCT_EDUCATION = 0x79 PRODUCT_EDUCATION_N = 0x7a PRODUCT_EMBEDDED = 0x41 PRODUCT_EMBEDDED_A = 0x58 PRODUCT_EMBEDDED_AUTOMOTIVE = 0x55 PRODUCT_EMBEDDED_E = 0x5A PRODUCT_EMBEDDED_EVAL = 0x6B PRODUCT_EMBEDDED_E_EVAL = 0x6C PRODUCT_EMBEDDED_INDUSTRY = 0x59 PRODUCT_EMBEDDED_INDUSTRY_A = 0x56 PRODUCT_EMBEDDED_INDUSTRY_A_E = 0x5C PRODUCT_EMBEDDED_INDUSTRY_E = 0x5B PRODUCT_EMBEDDED_INDUSTRY_EVAL = 0x69 PRODUCT_EMBEDDED_INDUSTRY_E_EVAL = 0x6A PRODUCT_ENTERPRISE = 0x4 PRODUCT_ENTERPRISE_E = 0x46 PRODUCT_ENTERPRISE_EVALUATION = 0x48 PRODUCT_ENTERPRISE_N = 0x1b PRODUCT_ENTERPRISE_N_EVALUATION = 0x54 PRODUCT_ENTERPRISE_S = 0x7D PRODUCT_ENTERPRISE_SERVER = 0xa PRODUCT_ENTERPRISE_SERVER_CORE = 0xe PRODUCT_ENTERPRISE_SERVER_CORE_V = 0x29 PRODUCT_ENTERPRISE_SERVER_IA64 = 0xf PRODUCT_ENTERPRISE_SERVER_V = 0x26 PRODUCT_ENTERPRISE_S_EVALUATION = 0x81 PRODUCT_ENTERPRISE_S_N = 0x7E PRODUCT_ENTERPRISE_S_N_EVALUATION = 0x82 PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL = 0x3C PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC = 0x3E PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT = 0x3B PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC = 0x3D PRODUCT_HOME_BASIC = 0x2 PRODUCT_HOME_BASIC_E = 0x43 PRODUCT_HOME_BASIC_N = 0x5 PRODUCT_HOME_PREMIUM = 0x3 PRODUCT_HOME_PREMIUM_E = 0x44 PRODUCT_HOME_PREMIUM_N = 0x1a PRODUCT_HOME_PREMIUM_SERVER = 0x22 PRODUCT_HOME_SERVER = 0x13 PRODUCT_HYPERV = 0x2a PRODUCT_ID_LENGTH = 16 PRODUCT_INDUSTRY_HANDHELD = 0x76 PRODUCT_IOTUAP = 0x7B PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = 0x1e PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING = 0x20 PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY = 0x1f PRODUCT_MOBILE_CORE = 0x68 PRODUCT_MOBILE_ENTERPRISE = 0x85 PRODUCT_MULTIPOINT_PREMIUM_SERVER = 0x4D PRODUCT_MULTIPOINT_STANDARD_SERVER = 0x4C PRODUCT_NANO_SERVER = 0x6D PRODUCT_PPI_PRO = 0x77 PRODUCT_PROFESSIONAL = 0x30 PRODUCT_PROFESSIONAL_E = 0x45 PRODUCT_PROFESSIONAL_EMBEDDED = 0x3A PRODUCT_PROFESSIONAL_N = 0x31 PRODUCT_PROFESSIONAL_S = 0x7F PRODUCT_PROFESSIONAL_STUDENT = 0x70 PRODUCT_PROFESSIONAL_STUDENT_N = 0x72 PRODUCT_PROFESSIONAL_S_N = 0x80 PRODUCT_PROFESSIONAL_WMC = 0x67 PRODUCT_SB_SOLUTION_SERVER = 0x32 PRODUCT_SB_SOLUTION_SERVER_EM = 0x36 PRODUCT_SERVER_FOR_SB_SOLUTIONS = 0x33 PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM = 0x37 PRODUCT_SERVER_FOR_SMALLBUSINESS = 0x18 PRODUCT_SERVER_FOR_SMALLBUSINESS_V = 0x23 PRODUCT_SERVER_FOUNDATION = 0x21 PRODUCT_SERVER_V = 0x25 PRODUCT_SMALLBUSINESS_SERVER = 0x9 PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = 0x19 PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE = 0x3f PRODUCT_SOLUTION_EMBEDDEDSERVER = 0x38 PRODUCT_SOLUTION_EMBEDDEDSERVER_CORE = 0x39 PRODUCT_STANDARD_EVALUATION_SERVER = 0x4F PRODUCT_STANDARD_SERVER = 0x7 PRODUCT_STANDARD_SERVER_CORE = 0xd PRODUCT_STANDARD_SERVER_CORE_V = 0x28 PRODUCT_STANDARD_SERVER_SOLUTIONS = 0x34 PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE = 0x35 PRODUCT_STANDARD_SERVER_V = 0x24 PRODUCT_STARTER = 0xb PRODUCT_STARTER_E = 0x42 PRODUCT_STARTER_N = 0x2f PRODUCT_STORAGE_ENTERPRISE_SERVER = 0x17 PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE = 0x2e PRODUCT_STORAGE_EXPRESS_SERVER = 0x14 PRODUCT_STORAGE_EXPRESS_SERVER_CORE = 0x2b PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER = 0x60 PRODUCT_STORAGE_STANDARD_SERVER = 0x15 PRODUCT_STORAGE_STANDARD_SERVER_CORE = 0x2c PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER = 0x5F PRODUCT_STORAGE_WORKGROUP_SERVER = 0x16 PRODUCT_STORAGE_WORKGROUP_SERVER_CORE = 0x2d PRODUCT_THINPC = 0x57 PRODUCT_ULTIMATE = 0x1 PRODUCT_ULTIMATE_E = 0x47 PRODUCT_ULTIMATE_N = 0x1c PRODUCT_UNDEFINED = 0x0 PRODUCT_UNLICENSED = 0xabcdabcd PRODUCT_WEB_SERVER = 0x11 PRODUCT_WEB_SERVER_CORE = 0x1d PROFILE_EMBEDDED = 77 PROFILE_KERNEL = 0x20000000 PROFILE_LINKED = 76 PROFILE_SERVER = 0x40000000 PROFILE_USER = 0x10000000 PROGRESS_CANCEL = 1 PROGRESS_CONTINUE = 0 PROGRESS_QUIET = 3 PROGRESS_STOP = 2 PROOF_QUALITY = 2 PROPERTYKEY_DEFINED = 0 PROPSETFLAG_ANSI = 2 PROPSETFLAG_CASE_SENSITIVE = 8 PROPSETFLAG_DEFAULT = 0 PROPSETFLAG_NONSIMPLE = 1 PROPSETFLAG_UNBUFFERED = 4 PROPSETHDR_OSVERSION_UNKNOWN = 0xffffffff PROPSET_BEHAVIOR_CASE_SENSITIVE = 1 PROP_LG_CXDLG = 252 PROP_LG_CYDLG = 218 PROP_MED_CXDLG = 227 PROP_MED_CYDLG = 215 PROP_SM_CXDLG = 212 PROP_SM_CYDLG = 188 PROTECTED_DACL_SECURITY_INFORMATION = 2147483648 PROTECTED_SACL_SECURITY_INFORMATION = 1073741824 PROTOCOLFLAG_NO_PICS_CHECK = 0x1 PROVIDER_KEEPS_VALUE_LENGTH = 0x1 PROV_DH_SCHANNEL = 18 PROV_DSS = 3 PROV_DSS_DH = 13 PROV_EC_ECDSA_FULL = 16 PROV_EC_ECDSA_SIG = 14 PROV_EC_ECNRA_FULL = 17 PROV_EC_ECNRA_SIG = 15 PROV_FORTEZZA = 4 PROV_INTEL_SEC = 22 PROV_MS_EXCHANGE = 5 PROV_REPLACE_OWF = 23 PROV_RNG = 21 PROV_RSA_AES = 24 PROV_RSA_FULL = 1 PROV_RSA_SCHANNEL = 12 PROV_RSA_SIG = 2 PROV_SPYRUS_LYNKS = 20 PROV_SSL = 6 PROV_STT_ACQ = 8 PROV_STT_BRND = 9 PROV_STT_ISS = 11 PROV_STT_MER = 7 PROV_STT_ROOT = 10 PRSPEC_INVALID = 4294967295 PRSPEC_LPWSTR = 0 PRSPEC_PROPID = 1 PR_JOBSTATUS = 0x0000 PSBTN_APPLYNOW = 4 PSBTN_BACK = 0 PSBTN_CANCEL = 5 PSBTN_FINISH = 2 PSBTN_HELP = 6 PSBTN_MAX = 6 PSBTN_NEXT = 1 PSBTN_OK = 3 PSCB_BUTTONPRESSED = 3 PSCB_INITIALIZED = 1 PSCB_PRECREATE = 2 PSD_DEFAULTMINMARGINS = 0x0 PSD_DISABLEMARGINS = 0x10 PSD_DISABLEORIENTATION = 0x100 PSD_DISABLEPAGEPAINTING = 0x80000 PSD_DISABLEPAPER = 0x200 PSD_DISABLEPRINTER = 0x20 PSD_ENABLEPAGEPAINTHOOK = 0x40000 PSD_ENABLEPAGESETUPHOOK = 0x2000 PSD_ENABLEPAGESETUPTEMPLATE = 0x8000 PSD_ENABLEPAGESETUPTEMPLATEHANDLE = 0x20000 PSD_INHUNDREDTHSOFMILLIMETERS = 0x8 PSD_INTHOUSANDTHSOFINCHES = 0x4 PSD_INWININIINTLMEASURE = 0x0 PSD_MARGINS = 0x2 PSD_MINMARGINS = 0x1 PSD_NONETWORKBUTTON = 0x200000 PSD_NOWARNING = 0x80 PSD_RETURNDEFAULT = 0x400 PSD_SHOWHELP = 0x800 PSH_DEFAULT = 0x00000000 PSH_HASHELP = 0x00000200 PSH_HEADER = 0x00080000 PSH_MODELESS = 0x00000400 PSH_NOAPPLYNOW = 0x00000080 PSH_NOCONTEXTHELP = 0x02000000 PSH_PROPSHEETPAGE = 0x00000008 PSH_PROPTITLE = 0x00000001 PSH_RTLREADING = 0x00000800 PSH_STRETCHWATERMARK = 0x00040000 PSH_USECALLBACK = 0x00000100 PSH_USEHBMHEADER = 0x00100000 PSH_USEHBMWATERMARK = 0x00010000 PSH_USEHICON = 0x00000002 PSH_USEHPLWATERMARK = 0x00020000 PSH_USEICONID = 0x00000004 PSH_USEPAGELANG = 0x00200000 PSH_USEPSTARTPAGE = 0x00000040 PSH_WATERMARK = 0x00008000 PSH_WIZARD = 0x00000020 PSH_WIZARD97 = 0x01000000 PSH_WIZARDCONTEXTHELP = 0x00001000 PSH_WIZARDHASFINISH = 0x00000010 PSH_WIZARD_LITE = 0x00400000 PSIDENT_GDICENTRIC = 0 PSIDENT_PSCENTRIC = 1 PSINJECT_BEGINDEFAULTS = 12 PSINJECT_BEGINPAGESETUP = 101 PSINJECT_BEGINPROLOG = 14 PSINJECT_BEGINSETUP = 16 PSINJECT_BEGINSTREAM = 1 PSINJECT_BOUNDINGBOX = 9 PSINJECT_COMMENTS = 11 PSINJECT_DLFONT = 0xdddddddd PSINJECT_DOCNEEDEDRES = 5 PSINJECT_DOCSUPPLIEDRES = 6 PSINJECT_DOCUMENTPROCESSCOLORS = 10 PSINJECT_DOCUMENTPROCESSCOLORSATEND = 21 PSINJECT_ENDDEFAULTS = 13 PSINJECT_ENDPAGECOMMENTS = 107 PSINJECT_ENDPAGESETUP = 102 PSINJECT_ENDPROLOG = 15 PSINJECT_ENDSETUP = 17 PSINJECT_ENDSTREAM = 20 PSINJECT_EOF = 19 PSINJECT_ORIENTATION = 8 PSINJECT_PAGEBBOX = 106 PSINJECT_PAGENUMBER = 100 PSINJECT_PAGEORDER = 7 PSINJECT_PAGES = 4 PSINJECT_PAGESATEND = 3 PSINJECT_PAGETRAILER = 103 PSINJECT_PLATECOLOR = 104 PSINJECT_PSADOBE = 2 PSINJECT_SHOWPAGE = 105 PSINJECT_TRAILER = 18 PSINJECT_VMRESTORE = 201 PSINJECT_VMSAVE = 200 PSM_ADDPAGE = 1127 PSM_APPLY = 1134 PSM_CANCELTOCLOSE = 1131 PSM_CHANGED = 1128 PSM_GETCURRENTPAGEHWND = 1142 PSM_GETRESULT = 1159 PSM_GETTABCONTROL = 1140 PSM_HWNDTOINDEX = 1153 PSM_IDTOINDEX = 1157 PSM_INDEXTOHWND = 1154 PSM_INDEXTOID = 1158 PSM_INDEXTOPAGE = 1156 PSM_INSERTPAGE = 1143 PSM_ISDIALOGMESSAGE = 1141 PSM_PAGETOINDEX = 1155 PSM_PRESSBUTTON = 1137 PSM_QUERYSIBLINGS = 1132 PSM_REBOOTSYSTEM = 1130 PSM_RECALCPAGESIZES = 1160 PSM_REMOVEPAGE = 1126 PSM_RESTARTWINDOWS = 1129 PSM_SETCURSEL = 1125 PSM_SETCURSELID = 1138 PSM_SETFINISHTEXT = 1139 PSM_SETFINISHTEXTA = 1139 PSM_SETFINISHTEXTW = 1145 PSM_SETHEADERSUBTITLE = 1151 PSM_SETHEADERSUBTITLEA = 1151 PSM_SETHEADERSUBTITLEW = 1152 PSM_SETHEADERTITLE = 1149 PSM_SETHEADERTITLEA = 1149 PSM_SETHEADERTITLEW = 1150 PSM_SETTITLE = 1135 PSM_SETTITLEA = 1135 PSM_SETTITLEW = 1144 PSM_SETWIZBUTTONS = 1136 PSM_UNCHANGED = 1133 PSNRET_INVALID = 1 PSNRET_INVALID_NOCHANGEPAGE = 2 PSNRET_MESSAGEHANDLED = 3 PSNRET_NOERROR = 0 PSN_APPLY = 18446744073709551414 PSN_FIRST = 18446744073709551416 PSN_GETOBJECT = 18446744073709551406 PSN_HELP = 18446744073709551411 PSN_KILLACTIVE = 18446744073709551415 PSN_LAST = 18446744073709551317 PSN_QUERYCANCEL = 18446744073709551407 PSN_QUERYINITIALFOCUS = 18446744073709551403 PSN_RESET = 18446744073709551413 PSN_SETACTIVE = 18446744073709551416 PSN_TRANSLATEACCELERATOR = 18446744073709551404 PSN_WIZBACK = 18446744073709551410 PSN_WIZFINISH = 18446744073709551408 PSN_WIZNEXT = 18446744073709551409 PSPCB_ADDREF = 0 PSPCB_CREATE = 2 PSPCB_RELEASE = 1 PSPROTOCOL_ASCII = 0 PSPROTOCOL_BCP = 1 PSPROTOCOL_BINARY = 3 PSPROTOCOL_TBCP = 2 PSP_DEFAULT = 0x00000000 PSP_DLGINDIRECT = 0x00000001 PSP_HASHELP = 0x00000020 PSP_HIDEHEADER = 0x00000800 PSP_PREMATURE = 0x00000400 PSP_RTLREADING = 0x00000010 PSP_USECALLBACK = 0x00000080 PSP_USEFUSIONCONTEXT = 0x00004000 PSP_USEHEADERSUBTITLE = 0x00002000 PSP_USEHEADERTITLE = 0x00001000 PSP_USEHICON = 0x00000002 PSP_USEICONID = 0x00000004 PSP_USEREFPARENT = 0x00000040 PSP_USETITLE = 0x00000008 PSWIZB_BACK = 0x00000001 PSWIZB_DISABLEDFINISH = 0x00000008 PSWIZB_FINISH = 0x00000004 PSWIZB_NEXT = 0x00000002 PS_ALTERNATE = 8 PS_COSMETIC = 0x00000000 PS_DASH = 1 PS_DASHDOT = 3 PS_DASHDOTDOT = 4 PS_DOT = 2 PS_ENDCAP_FLAT = 0x00000200 PS_ENDCAP_MASK = 0x00000F00 PS_ENDCAP_ROUND = 0x00000000 PS_ENDCAP_SQUARE = 0x00000100 PS_GEOMETRIC = 0x00010000 PS_INSIDEFRAME = 6 PS_JOIN_BEVEL = 0x00001000 PS_JOIN_MASK = 0x0000F000 PS_JOIN_MITER = 0x00002000 PS_JOIN_ROUND = 0x00000000 PS_NULL = 5 PS_OPENTYPE_FONTTYPE = 0x10000 PS_SOLID = 0 PS_STYLE_MASK = 0x0000000F PS_TYPE_MASK = 0x000F0000 PS_USERSTYLE = 7 PTF_INTKEY = 0x01 PTF_LEAF = 0x08 PTF_LEAFDATA = 0x04 PTF_ZERODATA = 0x02 PTRMAP_BTREE = 5 PTRMAP_FREEPAGE = 2 PTRMAP_OVERFLOW1 = 3 PTRMAP_OVERFLOW2 = 4 PTRMAP_ROOTPAGE = 1 PT_BEZIERTO = 0x04 PT_CLOSEFIGURE = 0x01 PT_LINETO = 0x02 PT_MOVETO = 0x06 PUBLICKEYBLOB = 0x6 PUBLICKEYBLOBEX = 0xa PURE = 0 PURGE_RXABORT = 0x2 PURGE_RXCLEAR = 0x8 PURGE_TXABORT = 0x1 PURGE_TXCLEAR = 0x4 PWR_CRITICALRESUME = 3 PWR_FAIL = -1 PWR_OK = 1 PWR_SUSPENDREQUEST = 1 PWR_SUSPENDRESUME = 2 PW_CLIENTONLY = 0x00000001 P_DETACH = 4 P_NOWAIT = 1 P_NOWAITO = 3 P_OVERLAY = 2 P_WAIT = 0 PragFlg_NeedSchema = 0x01 PragFlg_NoColumns = 0x02 PragFlg_NoColumns1 = 0x04 PragFlg_ReadOnly = 0x08 PragFlg_Result0 = 0x10 PragFlg_Result1 = 0x20 PragFlg_SchemaOpt = 0x40 PragFlg_SchemaReq = 0x80 PragTyp_ACTIVATE_EXTENSIONS = 0 PragTyp_ANALYSIS_LIMIT = 1 PragTyp_AUTO_VACUUM = 3 PragTyp_BUSY_TIMEOUT = 5 PragTyp_CACHE_SIZE = 6 PragTyp_CACHE_SPILL = 7 PragTyp_CASE_SENSITIVE_LIKE = 8 PragTyp_COLLATION_LIST = 9 PragTyp_COMPILE_OPTIONS = 10 PragTyp_DATABASE_LIST = 12 PragTyp_DATA_STORE_DIRECTORY = 11 PragTyp_DEFAULT_CACHE_SIZE = 13 PragTyp_ENCODING = 14 PragTyp_FLAG = 4 PragTyp_FOREIGN_KEY_CHECK = 15 PragTyp_FOREIGN_KEY_LIST = 16 PragTyp_FUNCTION_LIST = 17 PragTyp_HARD_HEAP_LIMIT = 18 PragTyp_HEADER_VALUE = 2 PragTyp_INCREMENTAL_VACUUM = 19 PragTyp_INDEX_INFO = 20 PragTyp_INDEX_LIST = 21 PragTyp_INTEGRITY_CHECK = 22 PragTyp_JOURNAL_MODE = 23 PragTyp_JOURNAL_SIZE_LIMIT = 24 PragTyp_LOCKING_MODE = 26 PragTyp_LOCK_PROXY_FILE = 25 PragTyp_LOCK_STATUS = 44 PragTyp_MMAP_SIZE = 28 PragTyp_MODULE_LIST = 29 PragTyp_OPTIMIZE = 30 PragTyp_PAGE_COUNT = 27 PragTyp_PAGE_SIZE = 31 PragTyp_PRAGMA_LIST = 32 PragTyp_SECURE_DELETE = 33 PragTyp_SHRINK_MEMORY = 34 PragTyp_SOFT_HEAP_LIMIT = 35 PragTyp_STATS = 45 PragTyp_SYNCHRONOUS = 36 PragTyp_TABLE_INFO = 37 PragTyp_TABLE_LIST = 38 PragTyp_TEMP_STORE = 39 PragTyp_TEMP_STORE_DIRECTORY = 40 PragTyp_THREADS = 41 PragTyp_WAL_AUTOCHECKPOINT = 42 PragTyp_WAL_CHECKPOINT = 43 QDI_DIBTOSCREEN = 4 QDI_GETDIBITS = 2 QDI_SETDIBITS = 1 QDI_STRETCHDIB = 8 QID_SYNC = 0xFFFFFFFF QS_ALLEVENTS = 1215 QS_ALLINPUT = 1279 QS_ALLPOSTMESSAGE = 0x0100 QS_HOTKEY = 0x0080 QS_INPUT = 1031 QS_KEY = 0x0001 QS_MOUSE = 6 QS_MOUSEBUTTON = 0x0004 QS_MOUSEMOVE = 0x0002 QS_PAINT = 0x0020 QS_POSTMESSAGE = 0x0008 QS_RAWINPUT = 0x0400 QS_SENDMESSAGE = 0x0040 QS_TIMER = 0x0010 QUERYDIBSUPPORT = 3073 QUERYESCSUPPORT = 8 QUERYROPSUPPORT = 40 QUERY_ACTCTX_FLAG_ACTCTX_IS_ADDRESS = 16 QUERY_ACTCTX_FLAG_ACTCTX_IS_HMODULE = 8 QUERY_ACTCTX_FLAG_NO_ADDREF = 2147483648 QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX = 4 QUOTA_LIMITS_HARDWS_MAX_DISABLE = 0x00000008 QUOTA_LIMITS_HARDWS_MAX_ENABLE = 0x00000004 QUOTA_LIMITS_HARDWS_MIN_DISABLE = 0x00000002 QUOTA_LIMITS_HARDWS_MIN_ENABLE = 0x00000001 QUOTA_LIMITS_USE_DEFAULT_LIMITS = 0x00000010 R2_BLACK = 1 R2_COPYPEN = 13 R2_LAST = 16 R2_MASKNOTPEN = 3 R2_MASKPEN = 9 R2_MASKPENNOT = 5 R2_MERGENOTPEN = 12 R2_MERGEPEN = 15 R2_MERGEPENNOT = 14 R2_NOP = 11 R2_NOT = 6 R2_NOTCOPYPEN = 4 R2_NOTMASKPEN = 8 R2_NOTMERGEPEN = 2 R2_NOTXORPEN = 10 R2_WHITE = 16 R2_XORPEN = 7 RANDOM_PADDING = 2 RAND_MAX = 0x7fff RASTERCAPS = 38 RASTER_FONTTYPE = 0x0001 RBU_CREATE_STATE = "CREATE TABLE IF NOT EXISTS %s.rbu_state(k INTEGER PRIMARY KEY, v)" RBU_DELETE = 2 RBU_ENABLE_DELTA_CKSUM = 0 RBU_EXCLUSIVE_CHECKPOINT = "rbu_exclusive_checkpoint" RBU_IDX_DELETE = 4 RBU_IDX_INSERT = 5 RBU_INSERT = 1 RBU_PK_EXTERNAL = 3 RBU_PK_IPK = 2 RBU_PK_NONE = 1 RBU_PK_NOTABLE = 0 RBU_PK_VTAB = 5 RBU_PK_WITHOUT_ROWID = 4 RBU_REPLACE = 3 RBU_STAGE_CAPTURE = 3 RBU_STAGE_CKPT = 4 RBU_STAGE_DONE = 5 RBU_STAGE_MOVE = 2 RBU_STAGE_OAL = 1 RBU_STATE_CKPT = 6 RBU_STATE_COOKIE = 7 RBU_STATE_DATATBL = 10 RBU_STATE_IDX = 3 RBU_STATE_OALSZ = 8 RBU_STATE_PHASEONESTEP = 9 RBU_STATE_PROGRESS = 5 RBU_STATE_ROW = 4 RBU_STATE_STAGE = 1 RBU_STATE_TBL = 2 RBU_UPDATE = 6 RC_BANDING = 2 RC_BIGFONT = 0x0400 RC_BITBLT = 1 RC_BITMAP64 = 8 RC_DEVBITS = 0x8000 RC_DIBTODEV = 0x0200 RC_DI_BITMAP = 0x0080 RC_FLOODFILL = 0x1000 RC_GDI20_OUTPUT = 0x0010 RC_GDI20_STATE = 0x0020 RC_NONE = 0 RC_OP_DX_OUTPUT = 0x4000 RC_PALETTE = 0x0100 RC_SAVEBITMAP = 0x0040 RC_SCALING = 4 RC_STRETCHBLT = 0x0800 RC_STRETCHDIB = 0x2000 RDH_RECTANGLES = 1 RDW_ALLCHILDREN = 0x0080 RDW_ERASE = 0x0004 RDW_ERASENOW = 0x0200 RDW_FRAME = 0x0400 RDW_INTERNALPAINT = 0x0002 RDW_INVALIDATE = 0x0001 RDW_NOCHILDREN = 0x0040 RDW_NOERASE = 0x0020 RDW_NOFRAME = 0x0800 RDW_NOINTERNALPAINT = 0x0010 RDW_UPDATENOW = 0x0100 RDW_VALIDATE = 0x0008 READMARK_NOT_USED = 0xffffffff READ_ATTRIBUTES = 0xD0 READ_ATTRIBUTE_BUFFER_SIZE = 512 READ_COMPRESSION_INFO_VALID = 0x00000020 READ_CONTROL = 131072 READ_LOCK = 1 READ_THREAD_PROFILING_FLAG_DISPATCHING = 0x00000001 READ_THREAD_PROFILING_FLAG_HARDWARE_COUNTERS = 0x00000002 READ_THRESHOLDS = 0xD1 READ_THRESHOLD_BUFFER_SIZE = 512 REALTIME_PRIORITY_CLASS = 0x100 REASON_HWINSTALL = 65538 REASON_LEGACY_API = 2147942400 REASON_OTHER = 0 REASON_PLANNED_FLAG = 2147483648 REASON_SERVICEHANG = 196613 REASON_SWHWRECONF = 196612 REASON_SWINSTALL = 196610 REASON_UNKNOWN = 255 REASON_UNSTABLE = 327686 RECOVERED_READS_VALID = 0x00000004 RECOVERED_WRITES_VALID = 0x00000001 RECOVERY_DEFAULT_PING_INTERVAL = 5000 RECOVERY_MAX_PING_INTERVAL = 300000 REGDB_E_FIRST = 2147746128 REGDB_E_LAST = 2147746143 REGDB_S_FIRST = 262480 REGDB_S_LAST = 262495 REGISTERED = 0x04 REGISTERING = 0x00 REGULAR_FONTTYPE = 0x400 REG_APP_HIVE = 16 REG_BINARY = 3 REG_BOOT_HIVE = 1024 REG_CREATED_NEW_KEY = 1 REG_DWORD = 4 REG_DWORD_BIG_ENDIAN = 5 REG_DWORD_LITTLE_ENDIAN = 4 REG_EXPAND_SZ = 2 REG_FORCE_RESTORE = 8 REG_FORCE_UNLOAD = 1 REG_FULL_RESOURCE_DESCRIPTOR = 9 REG_HIVE_EXACT_FILE_GROWTH = 128 REG_HIVE_NO_RM = 256 REG_HIVE_SINGLE_LOG = 512 REG_LATEST_FORMAT = 2 REG_LEGAL_CHANGE_FILTER = 268435471 REG_LEGAL_OPTION = 15 REG_LINK = 6 REG_MUI_STRING_TRUNCATE = 0x00000001 REG_MULTI_SZ = 7 REG_NONE = 0 REG_NOTIFY_CHANGE_ATTRIBUTES = 2 REG_NOTIFY_CHANGE_LAST_SET = 4 REG_NOTIFY_CHANGE_NAME = 1 REG_NOTIFY_CHANGE_SECURITY = 8 REG_NOTIFY_THREAD_AGNOSTIC = 268435456 REG_NO_COMPRESSION = 4 REG_NO_LAZY_FLUSH = 4 REG_OPENED_EXISTING_KEY = 2 REG_OPTION_BACKUP_RESTORE = 4 REG_OPTION_CREATE_LINK = 2 REG_OPTION_NON_VOLATILE = 0 REG_OPTION_OPEN_LINK = 8 REG_OPTION_RESERVED = 0 REG_OPTION_VOLATILE = 1 REG_PROCESS_APPKEY = 0x00000001 REG_PROCESS_PRIVATE = 32 REG_QWORD = 11 REG_QWORD_LITTLE_ENDIAN = 11 REG_REFRESH_HIVE = 2 REG_RESOURCE_LIST = 8 REG_RESOURCE_REQUIREMENTS_LIST = 10 REG_SECURE_CONNECTION = 1 REG_STANDARD_FORMAT = 1 REG_START_JOURNAL = 64 REG_SZ = 1 REG_WHOLE_HIVE_VOLATILE = 1 RELATIVE = 2 REMOTE_NAME_INFO_LEVEL = 0x00000002 REPLACEDLGORD = 1541 REPLACEFILE_IGNORE_MERGE_ERRORS = 0x2 REPLACEFILE_WRITE_THROUGH = 0x1 REPLACE_ALTERNATE = 0xB REPLACE_PRIMARY = 0xA REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY = 0x2 REPORT_NO_PRIVATE_KEY = 0x1 RESERVED_LOCK = 2 RESETDEV = 7 RESOURCEDISPLAYTYPE_DIRECTORY = 0x00000009 RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001 RESOURCEDISPLAYTYPE_FILE = 0x00000004 RESOURCEDISPLAYTYPE_GENERIC = 0x00000000 RESOURCEDISPLAYTYPE_GROUP = 0x00000005 RESOURCEDISPLAYTYPE_NDSCONTAINER = 0x0000000b RESOURCEDISPLAYTYPE_NETWORK = 0x00000006 RESOURCEDISPLAYTYPE_ROOT = 0x00000007 RESOURCEDISPLAYTYPE_SERVER = 0x00000002 RESOURCEDISPLAYTYPE_SHARE = 0x00000003 RESOURCEDISPLAYTYPE_SHAREADMIN = 0x00000008 RESOURCEDISPLAYTYPE_TREE = 0x0000000a RESOURCEMANAGER_ALL_ACCESS = 2031743 RESOURCEMANAGER_COMPLETE_PROPAGATION = 64 RESOURCEMANAGER_ENLIST = 8 RESOURCEMANAGER_GENERIC_EXECUTE = 1179740 RESOURCEMANAGER_GENERIC_READ = 1179649 RESOURCEMANAGER_GENERIC_WRITE = 1179774 RESOURCEMANAGER_GET_NOTIFICATION = 16 RESOURCEMANAGER_QUERY_INFORMATION = 1 RESOURCEMANAGER_RECOVER = 4 RESOURCEMANAGER_REGISTER_PROTOCOL = 32 RESOURCEMANAGER_SET_INFORMATION = 2 RESOURCETYPE_ANY = 0x00000000 RESOURCETYPE_DISK = 0x00000001 RESOURCETYPE_PRINT = 0x00000002 RESOURCETYPE_RESERVED = 0x00000008 RESOURCETYPE_UNKNOWN = 0xFFFFFFFF RESOURCEUSAGE_ALL = 19 RESOURCEUSAGE_ATTACHED = 0x00000010 RESOURCEUSAGE_CONNECTABLE = 0x00000001 RESOURCEUSAGE_CONTAINER = 0x00000002 RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004 RESOURCEUSAGE_RESERVED = 0x80000000 RESOURCEUSAGE_SIBLING = 0x00000008 RESOURCE_CONNECTED = 0x00000001 RESOURCE_CONTEXT = 0x00000005 RESOURCE_ENUM_LN = 1 RESOURCE_ENUM_MODULE_EXACT = 16 RESOURCE_ENUM_MUI = 2 RESOURCE_ENUM_MUI_SYSTEM = 4 RESOURCE_ENUM_VALIDATE = 8 RESOURCE_GLOBALNET = 0x00000002 RESOURCE_MANAGER_COMMUNICATION = 0x00000002 RESOURCE_MANAGER_MAXIMUM_OPTION = 0x00000003 RESOURCE_MANAGER_VOLATILE = 0x00000001 RESOURCE_RECENT = 0x00000004 RESOURCE_REMEMBERED = 0x00000003 RESTART_MAX_CMD_LINE = 1024 RESTART_NO_CRASH = 1 RESTART_NO_HANG = 2 RESTART_NO_PATCH = 4 RESTART_NO_REBOOT = 8 RESTORE_CTM = 4100 RESTRICTED_POINTER = 0 RES_CURSOR = 2 RES_ICON = 1 RETRACT_IEPORT = 3 RETURNING_TRIGGER_NAME = "sqlite_returning" RETURN_SMART_STATUS = 0xDA REVERSE_PRINT = 0x00000001 REVISION_LENGTH = 4 RGN_AND = 1 RGN_COPY = 5 RGN_DIFF = 4 RGN_ERROR = 0 RGN_MAX = 5 RGN_MIN = 1 RGN_OR = 2 RGN_XOR = 3 RIDEV_APPKEYS = 0x00000400 RIDEV_CAPTUREMOUSE = 0x00000200 RIDEV_DEVNOTIFY = 0x00002000 RIDEV_EXCLUDE = 0x00000010 RIDEV_EXINPUTSINK = 0x00001000 RIDEV_EXMODEMASK = 0x000000F0 RIDEV_INPUTSINK = 0x00000100 RIDEV_NOHOTKEYS = 0x00000200 RIDEV_NOLEGACY = 0x00000030 RIDEV_PAGEONLY = 0x00000020 RIDEV_REMOVE = 0x00000001 RIDI_DEVICEINFO = 0x2000000b RIDI_DEVICENAME = 0x20000007 RIDI_PREPARSEDDATA = 0x20000005 RID_HEADER = 0x10000005 RID_INPUT = 0x10000003 RIGHTMOST_BUTTON_PRESSED = 0x2 RIGHT_ALT_PRESSED = 0x1 RIGHT_CTRL_PRESSED = 0x4 RIM_INPUT = 0 RIM_INPUTSINK = 1 RIM_TYPEHID = 2 RIM_TYPEKEYBOARD = 1 RIM_TYPEMAX = 2 RIM_TYPEMOUSE = 0 RIP_EVENT = 9 RI_KEY_BREAK = 1 RI_KEY_E0 = 2 RI_KEY_E1 = 4 RI_KEY_MAKE = 0 RI_KEY_TERMSRV_SET_LED = 8 RI_KEY_TERMSRV_SHADOW = 0x10 RI_MOUSE_BUTTON_1_DOWN = 1 RI_MOUSE_BUTTON_1_UP = 2 RI_MOUSE_BUTTON_2_DOWN = 4 RI_MOUSE_BUTTON_2_UP = 8 RI_MOUSE_BUTTON_3_DOWN = 16 RI_MOUSE_BUTTON_3_UP = 32 RI_MOUSE_BUTTON_4_DOWN = 0x0040 RI_MOUSE_BUTTON_4_UP = 0x0080 RI_MOUSE_BUTTON_5_DOWN = 0x0100 RI_MOUSE_BUTTON_5_UP = 0x0200 RI_MOUSE_LEFT_BUTTON_DOWN = 0x0001 RI_MOUSE_LEFT_BUTTON_UP = 0x0002 RI_MOUSE_MIDDLE_BUTTON_DOWN = 0x0010 RI_MOUSE_MIDDLE_BUTTON_UP = 0x0020 RI_MOUSE_RIGHT_BUTTON_DOWN = 0x0004 RI_MOUSE_RIGHT_BUTTON_UP = 0x0008 RI_MOUSE_WHEEL = 0x0400 RNDAWAY = 0 RNDTOWARDS = 0 ROTFLAGS_ALLOWANYCLIENT = 0x2 ROTFLAGS_REGISTRATIONKEEPSALIVE = 0x1 ROTREGFLAGS_ALLOWANYCLIENT = 0x1 ROT_COMPARE_MAX = 2048 ROWSET_ALLOCATION_SIZE = 1024 ROWSET_NEXT = 0x02 ROWSET_SORTED = 0x01 RPCFLG_ASYNCHRONOUS = 1073741824 RPCFLG_AUTO_COMPLETE = 134217728 RPCFLG_HAS_CALLBACK = 67108864 RPCFLG_HAS_MULTI_SYNTAXES = 33554432 RPCFLG_INPUT_SYNCHRONOUS = 536870912 RPCFLG_LOCAL_CALL = 268435456 RPCFLG_MESSAGE = 16777216 RPCFLG_NON_NDR = 2147483648 RPC_BUFFER_ASYNC = 0x00008000 RPC_BUFFER_COMPLETE = 0x00001000 RPC_BUFFER_EXTRA = 0x00004000 RPC_BUFFER_NONOTIFY = 0x00010000 RPC_BUFFER_PARTIAL = 0x00002000 RPC_CALL_ATTRIBUTES_VERSION = 1 RPC_CONTEXT_HANDLE_DEFAULT_FLAGS = 0 RPC_CONTEXT_HANDLE_DONT_SERIALIZE = 536870912 RPC_CONTEXT_HANDLE_FLAGS = 805306368 RPC_CONTEXT_HANDLE_SERIALIZE = 268435456 RPC_C_AUTHN_DCE_PRIVATE = 1 RPC_C_AUTHN_DCE_PUBLIC = 2 RPC_C_AUTHN_DEC_PUBLIC = 4 RPC_C_AUTHN_DEFAULT = 4294967295 RPC_C_AUTHN_DIGEST = 21 RPC_C_AUTHN_DPA = 17 RPC_C_AUTHN_GSS_KERBEROS = 16 RPC_C_AUTHN_GSS_NEGOTIATE = 9 RPC_C_AUTHN_GSS_SCHANNEL = 14 RPC_C_AUTHN_INFO_TYPE_HTTP = 1 RPC_C_AUTHN_LEVEL_CALL = 3 RPC_C_AUTHN_LEVEL_CONNECT = 2 RPC_C_AUTHN_LEVEL_DEFAULT = 0 RPC_C_AUTHN_LEVEL_NONE = 1 RPC_C_AUTHN_LEVEL_PKT = 4 RPC_C_AUTHN_LEVEL_PKT_INTEGRITY = 5 RPC_C_AUTHN_LEVEL_PKT_PRIVACY = 6 RPC_C_AUTHN_MQ = 100 RPC_C_AUTHN_MSN = 18 RPC_C_AUTHN_NONE = 0 RPC_C_AUTHN_WINNT = 10 RPC_C_AUTHZ_DCE = 2 RPC_C_AUTHZ_DEFAULT = 0xffffffff RPC_C_AUTHZ_NAME = 1 RPC_C_AUTHZ_NONE = 0 RPC_C_BINDING_DEFAULT_TIMEOUT = 5 RPC_C_BINDING_INFINITE_TIMEOUT = 10 RPC_C_BINDING_MAX_TIMEOUT = 9 RPC_C_BINDING_MIN_TIMEOUT = 0 RPC_C_BIND_TO_ALL_NICS = 1 RPC_C_CANCEL_INFINITE_TIMEOUT = -1 RPC_C_DONT_FAIL = 0x4 RPC_C_EP_ALL_ELTS = 0 RPC_C_EP_MATCH_BY_BOTH = 3 RPC_C_EP_MATCH_BY_IF = 1 RPC_C_EP_MATCH_BY_OBJ = 2 RPC_C_FULL_CERT_CHAIN = 0x0001 RPC_C_HTTP_AUTHN_SCHEME_BASIC = 0x00000001 RPC_C_HTTP_AUTHN_SCHEME_CERT = 0x00010000 RPC_C_HTTP_AUTHN_SCHEME_DIGEST = 0x00000008 RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE = 0x00000010 RPC_C_HTTP_AUTHN_SCHEME_NTLM = 0x00000002 RPC_C_HTTP_AUTHN_SCHEME_PASSPORT = 0x00000004 RPC_C_HTTP_AUTHN_TARGET_PROXY = 2 RPC_C_HTTP_AUTHN_TARGET_SERVER = 1 RPC_C_HTTP_FLAG_IGNORE_CERT_CN_INVALID = 8 RPC_C_HTTP_FLAG_USE_FIRST_AUTH_SCHEME = 2 RPC_C_HTTP_FLAG_USE_SSL = 1 RPC_C_IMP_LEVEL_ANONYMOUS = 1 RPC_C_IMP_LEVEL_DEFAULT = 0 RPC_C_IMP_LEVEL_DELEGATE = 4 RPC_C_IMP_LEVEL_IDENTIFY = 2 RPC_C_IMP_LEVEL_IMPERSONATE = 3 RPC_C_INFINITE_TIMEOUT = 4294967295 RPC_C_LISTEN_MAX_CALLS_DEFAULT = 1234 RPC_C_MGMT_INQ_IF_IDS = 0 RPC_C_MGMT_INQ_PRINC_NAME = 1 RPC_C_MGMT_INQ_STATS = 2 RPC_C_MGMT_IS_SERVER_LISTEN = 3 RPC_C_MGMT_STOP_SERVER_LISTEN = 4 RPC_C_MQ_AUTHN_LEVEL_NONE = 0x0000 RPC_C_MQ_AUTHN_LEVEL_PKT_INTEGRITY = 0x0008 RPC_C_MQ_AUTHN_LEVEL_PKT_PRIVACY = 0x0010 RPC_C_MQ_CLEAR_ON_OPEN = 0x0002 RPC_C_MQ_EXPRESS = 0 RPC_C_MQ_JOURNAL_ALWAYS = 2 RPC_C_MQ_JOURNAL_DEADLETTER = 1 RPC_C_MQ_JOURNAL_NONE = 0 RPC_C_MQ_PERMANENT = 0x0001 RPC_C_MQ_RECOVERABLE = 1 RPC_C_MQ_TEMPORARY = 0x0000 RPC_C_MQ_USE_EXISTING_SECURITY = 0x0004 RPC_C_NOTIFY_ON_SEND_COMPLETE = 0x1 RPC_C_NS_DEFAULT_EXP_AGE = -1 RPC_C_NS_SYNTAX_DCE = 3 RPC_C_NS_SYNTAX_DEFAULT = 0 RPC_C_OPT_BINDING_NONCAUSAL = 9 RPC_C_OPT_CALL_TIMEOUT = 12 RPC_C_OPT_DONT_LINGER = 13 RPC_C_OPT_MAX_OPTIONS = 14 RPC_C_OPT_MQ_ACKNOWLEDGE = 4 RPC_C_OPT_MQ_AUTHN_LEVEL = 6 RPC_C_OPT_MQ_AUTHN_SERVICE = 5 RPC_C_OPT_MQ_DELIVERY = 1 RPC_C_OPT_MQ_JOURNAL = 3 RPC_C_OPT_MQ_PRIORITY = 2 RPC_C_OPT_MQ_TIME_TO_BE_RECEIVED = 8 RPC_C_OPT_MQ_TIME_TO_REACH_QUEUE = 7 RPC_C_OPT_SECURITY_CALLBACK = 10 RPC_C_OPT_UNIQUE_BINDING = 11 RPC_C_PARM_BUFFER_LENGTH = 2 RPC_C_PARM_MAX_PACKET_LENGTH = 1 RPC_C_PROFILE_ALL_ELT = 1 RPC_C_PROFILE_ALL_ELTS = 1 RPC_C_PROFILE_DEFAULT_ELT = 0 RPC_C_PROFILE_MATCH_BY_BOTH = 4 RPC_C_PROFILE_MATCH_BY_IF = 2 RPC_C_PROFILE_MATCH_BY_MBR = 3 RPC_C_PROTECT_LEVEL_CALL = 3 RPC_C_PROTECT_LEVEL_CONNECT = 2 RPC_C_PROTECT_LEVEL_DEFAULT = 0 RPC_C_PROTECT_LEVEL_NONE = 1 RPC_C_PROTECT_LEVEL_PKT = 4 RPC_C_PROTECT_LEVEL_PKT_INTEGRITY = 5 RPC_C_PROTECT_LEVEL_PKT_PRIVACY = 6 RPC_C_PROTSEQ_MAX_REQS_DEFAULT = 10 RPC_C_QOS_CAPABILITIES_ANY_AUTHORITY = 0x4 RPC_C_QOS_CAPABILITIES_DEFAULT = 0x0 RPC_C_QOS_CAPABILITIES_IGNORE_DELEGATE_FAILURE = 0x8 RPC_C_QOS_CAPABILITIES_LOCAL_MA_HINT = 0x10 RPC_C_QOS_CAPABILITIES_MAKE_FULLSIC = 0x2 RPC_C_QOS_CAPABILITIES_MUTUAL_AUTH = 0x1 RPC_C_QOS_IDENTITY_DYNAMIC = 1 RPC_C_QOS_IDENTITY_STATIC = 0 RPC_C_SECURITY_QOS_VERSION = 1 RPC_C_SECURITY_QOS_VERSION_1 = 1 RPC_C_SECURITY_QOS_VERSION_2 = 2 RPC_C_SECURITY_QOS_VERSION_3 = 3 RPC_C_STATS_CALLS_IN = 0 RPC_C_STATS_CALLS_OUT = 1 RPC_C_STATS_PKTS_IN = 2 RPC_C_STATS_PKTS_OUT = 3 RPC_C_USE_INTERNET_PORT = 0x1 RPC_C_USE_INTRANET_PORT = 0x2 RPC_C_VERS_ALL = 1 RPC_C_VERS_COMPATIBLE = 2 RPC_C_VERS_EXACT = 3 RPC_C_VERS_MAJOR_ONLY = 4 RPC_C_VERS_UPTO = 5 RPC_EEINFO_VERSION = 1 RPC_ENTRY = 0 RPC_FLAGS_VALID_BIT = 0x00008000 RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH = 0x0010 RPC_IF_ALLOW_LOCAL_ONLY = 0x0020 RPC_IF_ALLOW_SECURE_ONLY = 0x0008 RPC_IF_ALLOW_UNKNOWN_AUTHORITY = 0x0004 RPC_IF_AUTOLISTEN = 0x0001 RPC_IF_OLE = 0x0002 RPC_IF_SEC_NO_CACHE = 0x0040 RPC_INTERFACE_HAS_PIPES = 0x0001 RPC_NCA_FLAGS_BROADCAST = 0x00000002 RPC_NCA_FLAGS_DEFAULT = 0x00000000 RPC_NCA_FLAGS_IDEMPOTENT = 0x00000001 RPC_NCA_FLAGS_MAYBE = 0x00000004 RPC_PROXY_CONNECTION_TYPE_IN_PROXY = 0 RPC_PROXY_CONNECTION_TYPE_OUT_PROXY = 1 RPC_P_ADDR_FORMAT_TCP_IPV4 = 1 RPC_P_ADDR_FORMAT_TCP_IPV6 = 2 RPC_QUERY_CLIENT_PRINCIPAL_NAME = 4 RPC_QUERY_SERVER_PRINCIPAL_NAME = 2 RPC_S_ACCESS_DENIED = 5 RPC_S_ADDRESS_ERROR = 1768 RPC_S_ALREADY_LISTENING = 1713 RPC_S_ALREADY_REGISTERED = 1711 RPC_S_ASYNC_CALL_PENDING = 997 RPC_S_BINDING_HAS_NO_AUTH = 1746 RPC_S_BINDING_INCOMPLETE = 1819 RPC_S_BUFFER_TOO_SMALL = 122 RPC_S_CALL_CANCELLED = 1818 RPC_S_CALL_FAILED = 1726 RPC_S_CALL_FAILED_DNE = 1727 RPC_S_CALL_IN_PROGRESS = 1791 RPC_S_CANNOT_SUPPORT = 1764 RPC_S_CANT_CREATE_ENDPOINT = 1720 RPC_S_COMM_FAILURE = 1820 RPC_S_DUPLICATE_ENDPOINT = 1740 RPC_S_ENTRY_ALREADY_EXISTS = 1760 RPC_S_ENTRY_NOT_FOUND = 1761 RPC_S_ENTRY_TYPE_MISMATCH = 1922 RPC_S_FP_DIV_ZERO = 1769 RPC_S_FP_OVERFLOW = 1771 RPC_S_FP_UNDERFLOW = 1770 RPC_S_GROUP_MEMBER_NOT_FOUND = 1898 RPC_S_GRP_ELT_NOT_ADDED = 1928 RPC_S_GRP_ELT_NOT_REMOVED = 1929 RPC_S_INCOMPLETE_NAME = 1755 RPC_S_INTERFACE_NOT_EXPORTED = 1924 RPC_S_INTERFACE_NOT_FOUND = 1759 RPC_S_INTERNAL_ERROR = 1766 RPC_S_INVALID_ARG = 87 RPC_S_INVALID_ASYNC_CALL = 1915 RPC_S_INVALID_ASYNC_HANDLE = 1914 RPC_S_INVALID_AUTH_IDENTITY = 1749 RPC_S_INVALID_BINDING = 1702 RPC_S_INVALID_BOUND = 1734 RPC_S_INVALID_ENDPOINT_FORMAT = 1706 RPC_S_INVALID_LEVEL = 87 RPC_S_INVALID_NAF_ID = 1763 RPC_S_INVALID_NAME_SYNTAX = 1736 RPC_S_INVALID_NETWORK_OPTIONS = 1724 RPC_S_INVALID_NET_ADDR = 1707 RPC_S_INVALID_OBJECT = 1900 RPC_S_INVALID_RPC_PROTSEQ = 1704 RPC_S_INVALID_SECURITY_DESC = 1338 RPC_S_INVALID_STRING_BINDING = 1700 RPC_S_INVALID_STRING_UUID = 1705 RPC_S_INVALID_TAG = 1733 RPC_S_INVALID_TIMEOUT = 1709 RPC_S_INVALID_VERS_OPTION = 1756 RPC_S_MAX_CALLS_TOO_SMALL = 1742 RPC_S_NAME_SERVICE_UNAVAILABLE = 1762 RPC_S_NOTHING_TO_EXPORT = 1754 RPC_S_NOT_ALL_OBJS_EXPORTED = 1923 RPC_S_NOT_ALL_OBJS_UNEXPORTED = 1758 RPC_S_NOT_CANCELLED = 1826 RPC_S_NOT_LISTENING = 1715 RPC_S_NOT_RPC_ERROR = 1823 RPC_S_NO_BINDINGS = 1718 RPC_S_NO_CALL_ACTIVE = 1725 RPC_S_NO_CONTEXT_AVAILABLE = 1765 RPC_S_NO_ENDPOINT_FOUND = 1708 RPC_S_NO_ENTRY_NAME = 1735 RPC_S_NO_INTERFACES = 1817 RPC_S_NO_MORE_BINDINGS = 1806 RPC_S_NO_MORE_MEMBERS = 1757 RPC_S_NO_PRINC_NAME = 1822 RPC_S_NO_PROTSEQS = 1719 RPC_S_NO_PROTSEQS_REGISTERED = 1714 RPC_S_OBJECT_NOT_FOUND = 1710 RPC_S_OK = 0 RPC_S_OUT_OF_MEMORY = 14 RPC_S_OUT_OF_RESOURCES = 1721 RPC_S_OUT_OF_THREADS = 164 RPC_S_PRF_ELT_NOT_ADDED = 1926 RPC_S_PRF_ELT_NOT_REMOVED = 1927 RPC_S_PROCNUM_OUT_OF_RANGE = 1745 RPC_S_PROFILE_NOT_ADDED = 1925 RPC_S_PROTOCOL_ERROR = 1728 RPC_S_PROTSEQ_NOT_FOUND = 1744 RPC_S_PROTSEQ_NOT_SUPPORTED = 1703 RPC_S_SEC_PKG_ERROR = 1825 RPC_S_SEND_INCOMPLETE = 1913 RPC_S_SERVER_OUT_OF_MEMORY = 1130 RPC_S_SERVER_TOO_BUSY = 1723 RPC_S_SERVER_UNAVAILABLE = 1722 RPC_S_STRING_TOO_LONG = 1743 RPC_S_TIMEOUT = 1460 RPC_S_TYPE_ALREADY_REGISTERED = 1712 RPC_S_UNKNOWN_AUTHN_LEVEL = 1748 RPC_S_UNKNOWN_AUTHN_SERVICE = 1747 RPC_S_UNKNOWN_AUTHN_TYPE = 1741 RPC_S_UNKNOWN_AUTHZ_SERVICE = 1750 RPC_S_UNKNOWN_IF = 1717 RPC_S_UNKNOWN_MGR_TYPE = 1716 RPC_S_UNKNOWN_PRINCIPAL = 1332 RPC_S_UNSUPPORTED_AUTHN_LEVEL = 1821 RPC_S_UNSUPPORTED_NAME_SYNTAX = 1737 RPC_S_UNSUPPORTED_TRANS_SYN = 1730 RPC_S_UNSUPPORTED_TYPE = 1732 RPC_S_UUID_LOCAL_ONLY = 1824 RPC_S_UUID_NO_ADDRESS = 1739 RPC_S_WRONG_KIND_OF_BINDING = 1701 RPC_S_ZERO_DIVIDE = 1767 RPC_UNICODE_SUPPORTED = 0 RPC_X_BAD_STUB_DATA = 1783 RPC_X_BYTE_COUNT_TOO_SMALL = 1782 RPC_X_ENUM_VALUE_OUT_OF_RANGE = 1781 RPC_X_ENUM_VALUE_TOO_LARGE = 1781 RPC_X_INVALID_BOUND = 1734 RPC_X_INVALID_BUFFER = 1784 RPC_X_INVALID_ES_ACTION = 1827 RPC_X_INVALID_PIPE_OBJECT = 1830 RPC_X_INVALID_PIPE_OPERATION = 1831 RPC_X_INVALID_TAG = 1733 RPC_X_NO_MEMORY = 14 RPC_X_NO_MORE_ENTRIES = 1772 RPC_X_NULL_REF_POINTER = 1780 RPC_X_PIPE_APP_MEMORY = 14 RPC_X_PIPE_CLOSED = 1916 RPC_X_PIPE_DISCIPLINE_ERROR = 1917 RPC_X_PIPE_EMPTY = 1918 RPC_X_SS_CANNOT_GET_CALL_HANDLE = 1779 RPC_X_SS_CHAR_TRANS_OPEN_FAIL = 1773 RPC_X_SS_CHAR_TRANS_SHORT_FILE = 1774 RPC_X_SS_CONTEXT_DAMAGED = 1777 RPC_X_SS_CONTEXT_MISMATCH = 6 RPC_X_SS_HANDLES_MISMATCH = 1778 RPC_X_SS_IN_NULL_CONTEXT = 1775 RPC_X_WRONG_ES_VERSION = 1828 RPC_X_WRONG_PIPE_ORDER = 1831 RPC_X_WRONG_PIPE_VERSION = 1832 RPC_X_WRONG_STUB_VERSION = 1829 RP_INIFILE = 0x02 RP_LOGON = 0x01 RRF_NOEXPAND = 0x10000000 RRF_RT_ANY = 0x0000ffff RRF_RT_DWORD = 24 RRF_RT_QWORD = 72 RRF_RT_REG_BINARY = 0x00000008 RRF_RT_REG_DWORD = 0x00000010 RRF_RT_REG_EXPAND_SZ = 0x00000004 RRF_RT_REG_MULTI_SZ = 0x00000020 RRF_RT_REG_NONE = 0x00000001 RRF_RT_REG_QWORD = 0x00000040 RRF_RT_REG_SZ = 0x00000002 RRF_ZEROONFAILURE = 0x20000000 RSA1024BIT_KEY = 0x4000000 RTL_CONDITION_VARIABLE_LOCKMODE_SHARED = 0x1 RTL_CRITICAL_SECTION_ALL_FLAG_BITS = 0xff000000 RTL_CRITICAL_SECTION_DEBUG_FLAG_STATIC_INIT = 0x00000001 RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN = 0x02000000 RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO = 0x10000000 RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO = 0x01000000 RTL_CRITICAL_SECTION_FLAG_RESERVED = 3758096384 RTL_CRITICAL_SECTION_FLAG_RESOURCE_TYPE = 0x08000000 RTL_CRITICAL_SECTION_FLAG_STATIC_INIT = 0x04000000 RTL_CRITSECT_TYPE = 0 RTL_RESOURCE_TYPE = 1 RTL_RUN_ONCE_ASYNC = 2 RTL_RUN_ONCE_CHECK_ONLY = 1 RTL_RUN_ONCE_CTX_RESERVED_BITS = 2 RTL_RUN_ONCE_INIT_FAILED = 4 RTL_UMS_VERSION = 256 RTL_VRF_FLG_APPCOMPAT_CHECKS = 0x00000010 RTL_VRF_FLG_COM_CHECKS = 0x00000100 RTL_VRF_FLG_DANGEROUS_APIS = 0x00000200 RTL_VRF_FLG_DEADLOCK_CHECKS = 0x00000800 RTL_VRF_FLG_DIRTY_STACKS = 0x00000040 RTL_VRF_FLG_ENABLED_SYSTEM_WIDE = 0x00020000 RTL_VRF_FLG_ENABLE_LOGGING = 0x00004000 RTL_VRF_FLG_FAST_FILL_HEAP = 0x00008000 RTL_VRF_FLG_FIRST_CHANCE_EXCEPTION_CHECKS = 0x00001000 RTL_VRF_FLG_FULL_PAGE_HEAP = 0x00000001 RTL_VRF_FLG_HANDLE_CHECKS = 0x00000004 RTL_VRF_FLG_LOCK_CHECKS = 0x00040000 RTL_VRF_FLG_MISCELLANEOUS_CHECKS = 0x00020000 RTL_VRF_FLG_RACE_CHECKS = 0x00000400 RTL_VRF_FLG_RESERVED_DONOTUSE = 0x00000002 RTL_VRF_FLG_RPC_CHECKS = 0x00000080 RTL_VRF_FLG_STACK_CHECKS = 0x00000008 RTL_VRF_FLG_TLS_CHECKS = 0x00000020 RTL_VRF_FLG_VIRTUAL_MEM_CHECKS = 0x00002000 RTL_VRF_FLG_VIRTUAL_SPACE_TRACKING = 0x00010000 RTREE_CACHE_SZ = 5 RTREE_CHECK_MAX_ERROR = 100 RTREE_COORD_INT32 = 1 RTREE_COORD_REAL32 = 0 RTREE_DEFAULT_ROWEST = 1048576 RTREE_EQ = 0x41 RTREE_FALSE = 0x40 RTREE_GE = 0x44 RTREE_GT = 0x45 RTREE_LE = 0x42 RTREE_LT = 0x43 RTREE_MATCH = 0x46 RTREE_MAXCELLS = 51 RTREE_MAX_AUX_COLUMN = 100 RTREE_MAX_DEPTH = 40 RTREE_MAX_DIMENSIONS = 5 RTREE_MIN_ROWEST = 100 RTREE_QUERY = 0x47 RTREE_TRUE = 0x3f RTREE_ZERO = 0.0 RTS_CONTROL_DISABLE = 0x0 RTS_CONTROL_ENABLE = 0x1 RTS_CONTROL_HANDSHAKE = 0x2 RTS_CONTROL_TOGGLE = 0x3 RUNDLGORD = 1545 RUNTIME_FUNCTION_INDIRECT = 0x1 RUSSIAN_CHARSET = 204 SACL_SECURITY_INFORMATION = 8 SAL_HXX = 0 SAL__callback = 0 SAL__checkReturn = 0 SAL__deref = 0 SAL__deref_in = 0 SAL__deref_in_opt = 0 SAL__deref_inout = 0 SAL__deref_inout_nz = 0 SAL__deref_inout_nz_opt = 0 SAL__deref_inout_opt = 0 SAL__deref_inout_z = 0 SAL__deref_inout_z_opt = 0 SAL__deref_opt_in = 0 SAL__deref_opt_in_opt = 0 SAL__deref_opt_inout = 0 SAL__deref_opt_inout_nz = 0 SAL__deref_opt_inout_nz_opt = 0 SAL__deref_opt_inout_opt = 0 SAL__deref_opt_inout_z = 0 SAL__deref_opt_inout_z_opt = 0 SAL__deref_opt_out = 0 SAL__deref_opt_out_nz_opt = 0 SAL__deref_opt_out_opt = 0 SAL__deref_opt_out_z = 0 SAL__deref_opt_out_z_opt = 0 SAL__deref_out = 0 SAL__deref_out_nz = 0 SAL__deref_out_nz_opt = 0 SAL__deref_out_opt = 0 SAL__deref_out_z = 0 SAL__deref_out_z_opt = 0 SAL__exceptthat = 0 SAL__execeptthat = 0 SAL__format_string = 0 SAL__in = 0 SAL__in_nz = 0 SAL__in_nz_opt = 0 SAL__in_opt = 0 SAL__in_z = 0 SAL__in_z_opt = 0 SAL__inner_callback = 0 SAL__inner_checkReturn = 0 SAL__inner_fallthrough = 0 SAL__inner_fallthrough_dec = 0 SAL__inner_override = 0 SAL__inout = 0 SAL__inout_nz = 0 SAL__inout_nz_opt = 0 SAL__inout_opt = 0 SAL__inout_z = 0 SAL__inout_z_opt = 0 SAL__maybenull = 0 SAL__maybereadonly = 0 SAL__maybevalid = 0 SAL__notnull = 0 SAL__notreadonly = 0 SAL__notvalid = 0 SAL__null = 0 SAL__nullnullterminated = 0 SAL__nullterminated = 0 SAL__out = 0 SAL__out_nz = 0 SAL__out_nz_opt = 0 SAL__out_opt = 0 SAL__out_z = 0 SAL__out_z_opt = 0 SAL__override = 0 SAL__post = 0 SAL__pre = 0 SAL__readonly = 0 SAL__reserved = 0 SAL__valid = 0 SANDBOX_INERT = 0x2 SAVEPOINT_BEGIN = 0 SAVEPOINT_RELEASE = 1 SAVEPOINT_ROLLBACK = 2 SAVE_ATTRIBUTE_VALUES = 0xD3 SAVE_CTM = 4101 SBM_ENABLE_ARROWS = 0x00E4 SBM_GETPOS = 0x00E1 SBM_GETRANGE = 0x00E3 SBM_GETSCROLLBARINFO = 0x00EB SBM_GETSCROLLINFO = 0x00EA SBM_SETPOS = 0x00E0 SBM_SETRANGE = 0x00E2 SBM_SETRANGEREDRAW = 0x00E6 SBM_SETSCROLLINFO = 0x00E9 SBS_BOTTOMALIGN = 4 SBS_HORZ = 0 SBS_LEFTALIGN = 2 SBS_RIGHTALIGN = 4 SBS_SIZEBOX = 8 SBS_SIZEBOXBOTTOMRIGHTALIGN = 4 SBS_SIZEBOXTOPLEFTALIGN = 2 SBS_SIZEGRIP = 16 SBS_TOPALIGN = 2 SBS_VERT = 1 SB_BOTH = 3 SB_BOTTOM = 7 SB_CONST_ALPHA = 0x00000001 SB_CTL = 2 SB_ENDSCROLL = 8 SB_GRAD_RECT = 0x00000010 SB_GRAD_TRI = 0x00000020 SB_HORZ = 0 SB_LEFT = 6 SB_LINEDOWN = 1 SB_LINELEFT = 0 SB_LINERIGHT = 1 SB_LINEUP = 0 SB_NONE = 0x00000000 SB_PAGEDOWN = 3 SB_PAGELEFT = 2 SB_PAGERIGHT = 3 SB_PAGEUP = 2 SB_PIXEL_ALPHA = 0x00000002 SB_PREMULT_ALPHA = 0x00000004 SB_RIGHT = 7 SB_THUMBPOSITION = 4 SB_THUMBTRACK = 5 SB_TOP = 6 SB_VERT = 1 SCALINGFACTORX = 114 SCALINGFACTORY = 115 SCARD_ABSENT = 1 SCARD_ATR_LENGTH = 33 SCARD_CLASS_COMMUNICATIONS = 2 SCARD_CLASS_ICC_STATE = 9 SCARD_CLASS_IFD_PROTOCOL = 8 SCARD_CLASS_MECHANICAL = 6 SCARD_CLASS_PERF = 0x7ffe SCARD_CLASS_POWER_MGMT = 4 SCARD_CLASS_PROTOCOL = 3 SCARD_CLASS_SECURITY = 5 SCARD_CLASS_SYSTEM = 0x7fff SCARD_CLASS_VENDOR_DEFINED = 7 SCARD_CLASS_VENDOR_INFO = 1 SCARD_COLD_RESET = 1 SCARD_EJECT_CARD = 3 SCARD_LEAVE_CARD = 0 SCARD_NEGOTIABLE = 5 SCARD_POWERED = 4 SCARD_POWER_DOWN = 0 SCARD_PRESENT = 2 SCARD_PROTOCOL_DEFAULT = 0x80000000 SCARD_PROTOCOL_OPTIMAL = 0x00000000 SCARD_PROTOCOL_RAW = 0x00010000 SCARD_PROTOCOL_T0 = 0x00000001 SCARD_PROTOCOL_T1 = 0x00000002 SCARD_PROTOCOL_Tx = 3 SCARD_PROTOCOL_UNDEFINED = 0x00000000 SCARD_PROVIDER_CSP = 2 SCARD_PROVIDER_PRIMARY = 1 SCARD_READER_CONFISCATES = 0x00000004 SCARD_READER_EJECTS = 0x00000002 SCARD_READER_SWALLOWS = 0x00000001 SCARD_READER_TYPE_IDE = 0x10 SCARD_READER_TYPE_KEYBOARD = 0x04 SCARD_READER_TYPE_PARALELL = 0x02 SCARD_READER_TYPE_PCMCIA = 0x40 SCARD_READER_TYPE_SCSI = 0x08 SCARD_READER_TYPE_SERIAL = 0x01 SCARD_READER_TYPE_USB = 0x20 SCARD_READER_TYPE_VENDOR = 0xF0 SCARD_RESET_CARD = 1 SCARD_SCOPE_SYSTEM = 2 SCARD_SCOPE_TERMINAL = 1 SCARD_SCOPE_USER = 0 SCARD_SHARE_DIRECT = 3 SCARD_SHARE_EXCLUSIVE = 1 SCARD_SHARE_SHARED = 2 SCARD_SPECIFIC = 6 SCARD_STATE_ATRMATCH = 0x00000040 SCARD_STATE_CHANGED = 0x00000002 SCARD_STATE_EMPTY = 0x00000010 SCARD_STATE_EXCLUSIVE = 0x00000080 SCARD_STATE_IGNORE = 0x00000001 SCARD_STATE_INUSE = 0x00000100 SCARD_STATE_MUTE = 0x00000200 SCARD_STATE_PRESENT = 0x00000020 SCARD_STATE_UNAVAILABLE = 0x00000008 SCARD_STATE_UNAWARE = 0x00000000 SCARD_STATE_UNKNOWN = 0x00000004 SCARD_STATE_UNPOWERED = 0x00000400 SCARD_SWALLOWED = 3 SCARD_S_SUCCESS = 0 SCARD_T0_CMD_LENGTH = 5 SCARD_T0_HEADER_LENGTH = 7 SCARD_T1_EPILOGUE_LENGTH = 2 SCARD_T1_MAX_IFS = 254 SCARD_T1_PROLOGUE_LENGTH = 3 SCARD_UNKNOWN = 0 SCARD_UNPOWER_CARD = 2 SCARD_WARM_RESET = 2 SCERR_NOCARDNAME = 0x4000 SCERR_NOGUIDS = 0x8000 SCHANNEL_ENC_KEY = 0x1 SCHANNEL_MAC_KEY = 0x0 SCHAR_MAX = 127 SCHAR_MIN = -128 SCHED_E_SERVICE_NOT_LOCALSYSTEM = 6200 SCHEMA_ROOT = 1 SCHEME_OID_RETRIEVE_ENCODED_OBJECTW_FUNC = "SchemeDllRetrieveEncodedObjectW" SCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNC = "SchemeDllRetrieveEncodedObject" SCOPE_SECURITY_INFORMATION = 64 SCREEN_FONTTYPE = 0x2000 SCROLLLOCK_ON = 0x40 SCS_32BIT_BINARY = 0 SCS_64BIT_BINARY = 6 SCS_CAP_COMPSTR = 0x00000001 SCS_CAP_MAKEREAD = 0x00000002 SCS_CAP_SETRECONVERTSTRING = 0x00000004 SCS_CHANGEATTR = 18 SCS_CHANGECLAUSE = 36 SCS_DOS_BINARY = 1 SCS_OS216_BINARY = 5 SCS_PIF_BINARY = 3 SCS_POSIX_BINARY = 4 SCS_QUERYRECONVERTSTRING = 0x00020000 SCS_SETRECONVERTSTRING = 0x00010000 SCS_SETSTR = 9 SCS_THIS_PLATFORM_BINARY = 6 SCS_WOW_BINARY = 2 SC_ARRANGE = 0xF110 SC_CLOSE = 0xF060 SC_CONTEXTHELP = 0xF180 SC_DEFAULT = 0xF160 SC_DLG_FORCE_UI = 0x04 SC_DLG_MINIMAL_UI = 0x01 SC_DLG_NO_UI = 0x02 SC_GROUP_IDENTIFIER = 43 SC_GROUP_IDENTIFIERA = 43 SC_GROUP_IDENTIFIERW = 43 SC_HOTKEY = 0xF150 SC_HSCROLL = 0xF080 SC_ICON = 61472 SC_KEYMENU = 0xF100 SC_MANAGER_ALL_ACCESS = 983103 SC_MANAGER_CONNECT = 0x0001 SC_MANAGER_CREATE_SERVICE = 0x0002 SC_MANAGER_ENUMERATE_SERVICE = 0x0004 SC_MANAGER_LOCK = 0x0008 SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020 SC_MANAGER_QUERY_LOCK_STATUS = 0x0010 SC_MAXIMIZE = 0xF030 SC_MINIMIZE = 0xF020 SC_MONITORPOWER = 0xF170 SC_MOUSEMENU = 0xF090 SC_MOVE = 0xF010 SC_NEXTWINDOW = 0xF040 SC_PREVWINDOW = 0xF050 SC_RESTORE = 0xF120 SC_SCREENSAVE = 0xF140 SC_SEPARATOR = 0xF00F SC_SIZE = 0xF000 SC_TASKLIST = 0xF130 SC_VSCROLL = 0xF070 SC_ZOOM = 61488 SEARCH_ALL = 0x0 SEARCH_ALL_NO_SEQ = 0x4 SEARCH_ALTERNATE = 0x2 SEARCH_ALT_NO_SEQ = 0x6 SEARCH_PRIMARY = 0x1 SEARCH_PRI_NO_SEQ = 0x5 SECTION_ALL_ACCESS = 983071 SECTION_EXTEND_SIZE = 0x0010 SECTION_MAP_EXECUTE = 0x0008 SECTION_MAP_EXECUTE_EXPLICIT = 0x0020 SECTION_MAP_READ = 0x0004 SECTION_MAP_WRITE = 0x0002 SECTION_QUERY = 0x0001 SECURITY_ANONYMOUS_LOGON_RID = 7 SECURITY_APPPOOL_ID_BASE_RID = 82 SECURITY_APPPOOL_ID_RID_COUNT = 6 SECURITY_APP_PACKAGE_BASE_RID = 2 SECURITY_APP_PACKAGE_RID_COUNT = 8 SECURITY_AUTHENTICATED_USER_RID = 11 SECURITY_AUTHENTICATION_AUTHORITY_ASSERTED_RID = 1 SECURITY_AUTHENTICATION_AUTHORITY_RID_COUNT = 1 SECURITY_AUTHENTICATION_SERVICE_ASSERTED_RID = 2 SECURITY_BATCH_RID = 3 SECURITY_BUILTIN_APP_PACKAGE_RID_COUNT = 2 SECURITY_BUILTIN_CAPABILITY_RID_COUNT = 2 SECURITY_BUILTIN_DOMAIN_RID = 32 SECURITY_BUILTIN_PACKAGE_ANY_PACKAGE = 1 SECURITY_BUILTIN_PACKAGE_ANY_RESTRICTED_PACKAGE = 2 SECURITY_CAPABILITY_APPOINTMENTS = 11 SECURITY_CAPABILITY_BASE_RID = 3 SECURITY_CAPABILITY_CONTACTS = 12 SECURITY_CAPABILITY_DOCUMENTS_LIBRARY = 7 SECURITY_CAPABILITY_ENTERPRISE_AUTHENTICATION = 8 SECURITY_CAPABILITY_INTERNET_CLIENT = 1 SECURITY_CAPABILITY_INTERNET_CLIENT_SERVER = 2 SECURITY_CAPABILITY_INTERNET_EXPLORER = 4096 SECURITY_CAPABILITY_MUSIC_LIBRARY = 6 SECURITY_CAPABILITY_PICTURES_LIBRARY = 4 SECURITY_CAPABILITY_PRIVATE_NETWORK_CLIENT_SERVER = 3 SECURITY_CAPABILITY_REMOVABLE_STORAGE = 10 SECURITY_CAPABILITY_RID_COUNT = 5 SECURITY_CAPABILITY_SHARED_USER_CERTIFICATES = 9 SECURITY_CAPABILITY_VIDEOS_LIBRARY = 5 SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_BASE_RID = 85 SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_RID_COUNT = 6 SECURITY_COM_ID_BASE_RID = 89 SECURITY_CONTEXT_TRACKING = 0x40000 SECURITY_CREATOR_GROUP_RID = 1 SECURITY_CREATOR_GROUP_SERVER_RID = 3 SECURITY_CREATOR_OWNER_RID = 0 SECURITY_CREATOR_OWNER_RIGHTS_RID = 4 SECURITY_CREATOR_OWNER_SERVER_RID = 2 SECURITY_CRED_TYPE_BASE_RID = 65 SECURITY_CRED_TYPE_RID_COUNT = 2 SECURITY_CRED_TYPE_THIS_ORG_CERT_RID = 1 SECURITY_DASHOST_ID_BASE_RID = 92 SECURITY_DASHOST_ID_RID_COUNT = 6 SECURITY_DESCRIPTOR_REVISION = 1 SECURITY_DESCRIPTOR_REVISION1 = 1 SECURITY_DIALUP_RID = 1 SECURITY_DYNAMIC_TRACKING = 1 SECURITY_EFFECTIVE_ONLY = 0x80000 SECURITY_ENTERPRISE_CONTROLLERS_RID = 9 SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID = 22 SECURITY_INTERACTIVE_RID = 4 SECURITY_IUSER_RID = 17 SECURITY_LOCAL_LOGON_RID = 1 SECURITY_LOCAL_RID = 0 SECURITY_LOCAL_SERVICE_RID = 19 SECURITY_LOCAL_SYSTEM_RID = 18 SECURITY_LOGON_IDS_RID = 5 SECURITY_LOGON_IDS_RID_COUNT = 3 SECURITY_MANDATORY_HIGH_RID = 12288 SECURITY_MANDATORY_LOW_RID = 4096 SECURITY_MANDATORY_MAXIMUM_USER_RID = 16384 SECURITY_MANDATORY_MEDIUM_RID = 8192 SECURITY_MANDATORY_PROTECTED_PROCESS_RID = 20480 SECURITY_MANDATORY_SYSTEM_RID = 16384 SECURITY_MANDATORY_UNTRUSTED_RID = 0 SECURITY_MAX_ALWAYS_FILTERED = 999 SECURITY_MAX_BASE_RID = 111 SECURITY_MIN_BASE_RID = 80 SECURITY_MIN_NEVER_FILTERED = 1000 SECURITY_NETWORK_RID = 2 SECURITY_NETWORK_SERVICE_RID = 20 SECURITY_NFS_ID_BASE_RID = 88 SECURITY_NT_NON_UNIQUE = 21 SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT = 3 SECURITY_NULL_RID = 0 SECURITY_OTHER_ORGANIZATION_RID = 1000 SECURITY_PACKAGE_BASE_RID = 64 SECURITY_PACKAGE_DIGEST_RID = 21 SECURITY_PACKAGE_NTLM_RID = 10 SECURITY_PACKAGE_RID_COUNT = 2 SECURITY_PACKAGE_SCHANNEL_RID = 14 SECURITY_PRINCIPAL_SELF_RID = 10 SECURITY_PROXY_RID = 8 SECURITY_RDV_GFX_BASE_RID = 91 SECURITY_REMOTE_LOGON_RID = 14 SECURITY_RESERVED_ID_BASE_RID = 81 SECURITY_RESTRICTED_CODE_RID = 12 SECURITY_SERVER_LOGON_RID = 9 SECURITY_SERVICE_ID_BASE_RID = 80 SECURITY_SERVICE_ID_RID_COUNT = 6 SECURITY_SERVICE_RID = 6 SECURITY_SQOS_PRESENT = 0x100000 SECURITY_STATIC_TRACKING = 0 SECURITY_TASK_ID_BASE_RID = 87 SECURITY_TERMINAL_SERVER_RID = 13 SECURITY_THIS_ORGANIZATION_RID = 15 SECURITY_TRUSTED_INSTALLER_RID1 = 956008885 SECURITY_TRUSTED_INSTALLER_RID2 = 3418522649 SECURITY_TRUSTED_INSTALLER_RID3 = 1831038044 SECURITY_TRUSTED_INSTALLER_RID4 = 1853292631 SECURITY_TRUSTED_INSTALLER_RID5 = 2271478464 SECURITY_USERMODEDRIVERHOST_ID_BASE_RID = 84 SECURITY_USERMODEDRIVERHOST_ID_RID_COUNT = 6 SECURITY_VALID_SQOS_FLAGS = 0x1f0000 SECURITY_VIRTUALACCOUNT_ID_RID_COUNT = 6 SECURITY_VIRTUALSERVER_ID_BASE_RID = 83 SECURITY_VIRTUALSERVER_ID_RID_COUNT = 6 SECURITY_WINDOWSMOBILE_ID_BASE_RID = 112 SECURITY_WINDOW_MANAGER_BASE_RID = 90 SECURITY_WMIHOST_ID_BASE_RID = 86 SECURITY_WMIHOST_ID_RID_COUNT = 6 SECURITY_WORLD_RID = 0 SECURITY_WRITE_RESTRICTED_CODE_RID = 33 SEC_64K_PAGES = 0x80000 SEC_COMMIT = 0x8000000 SEC_FILE = 0x800000 SEC_IMAGE = 0x1000000 SEC_IMAGE_NO_EXECUTE = 285212672 SEC_LARGE_PAGES = 0x80000000 SEC_NOCACHE = 0x10000000 SEC_PARTITION_OWNER_HANDLE = 0x40000 SEC_PROTECTED_IMAGE = 0x2000000 SEC_RESERVE = 0x4000000 SEC_WINNT_AUTH_IDENTITY_ANSI = 0x1 SEC_WINNT_AUTH_IDENTITY_UNICODE = 0x2 SEC_WRITECOMBINE = 0x40000000 SEEK_CUR = 1 SEEK_END = 2 SEEK_SET = 0 SEE_MASK_ASYNCOK = 0x100000 SEE_MASK_CLASSKEY = 0x3 SEE_MASK_CLASSNAME = 0x1 SEE_MASK_CONNECTNETDRV = 0x80 SEE_MASK_DEFAULT = 0x0 SEE_MASK_DOENVSUBST = 0x200 SEE_MASK_FLAG_DDEWAIT = 256 SEE_MASK_FLAG_LOG_USAGE = 0x4000000 SEE_MASK_FLAG_NO_UI = 0x400 SEE_MASK_HMONITOR = 0x200000 SEE_MASK_HOTKEY = 0x20 SEE_MASK_ICON = 0x10 SEE_MASK_IDLIST = 0x4 SEE_MASK_INVOKEIDLIST = 0xc SEE_MASK_NOASYNC = 0x100 SEE_MASK_NOCLOSEPROCESS = 0x40 SEE_MASK_NOQUERYCLASSSTORE = 0x1000000 SEE_MASK_NOZONECHECKS = 0x800000 SEE_MASK_NO_CONSOLE = 0x8000 SEE_MASK_UNICODE = 0x4000 SEE_MASK_WAITFORINPUTIDLE = 0x2000000 SEF_AVOID_OWNER_CHECK = 0x10 SEF_AVOID_OWNER_RESTRICTION = 0x1000 SEF_AVOID_PRIVILEGE_CHECK = 0x08 SEF_DACL_AUTO_INHERIT = 0x01 SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT = 0x04 SEF_DEFAULT_GROUP_FROM_PARENT = 0x40 SEF_DEFAULT_OWNER_FROM_PARENT = 0x20 SEF_MACL_NO_EXECUTE_UP = 0x400 SEF_MACL_NO_READ_UP = 0x200 SEF_MACL_NO_WRITE_UP = 0x100 SEF_MACL_VALID_FLAGS = 1792 SEF_SACL_AUTO_INHERIT = 0x02 SELECTDIB = 41 SELECTPAPERSOURCE = 18 SELECT_CAP_CONVERSION = 0x00000001 SELECT_CAP_SENTENCE = 0x00000002 SEMAPHORE_ALL_ACCESS = 2031619 SEMAPHORE_MODIFY_STATE = 0x0002 SEM_FAILCRITICALERRORS = 0x0001 SEM_NOALIGNMENTFAULTEXCEPT = 0x0004 SEM_NOGPFAULTERRORBOX = 0x0002 SEM_NOOPENFILEERRORBOX = 0x8000 SENTINEL_Reason = 0 SERIAL_NUMBER_LENGTH = 32 SERKF_AVAILABLE = 0x00000002 SERKF_INDICATOR = 0x00000004 SERKF_SERIALKEYSON = 0x00000001 SERVER_ACCESS_ADMINISTER = 0x00000001 SERVER_ACCESS_ENUMERATE = 0x00000002 SERVER_ALL_ACCESS = 983043 SERVER_EXECUTE = 131074 SERVER_READ = 131074 SERVER_WRITE = 131075 SERVICES_ACTIVE_DATABASEA = "ServicesActive" SERVICES_FAILED_DATABASEA = "ServicesFailed" SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x00000020 SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010 SERVICE_ACCEPT_PARAMCHANGE = 0x00000008 SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002 SERVICE_ACCEPT_POWEREVENT = 0x00000040 SERVICE_ACCEPT_SESSIONCHANGE = 0x00000080 SERVICE_ACCEPT_SHUTDOWN = 0x00000004 SERVICE_ACCEPT_STOP = 0x00000001 SERVICE_ACTIVE = 0x00000001 SERVICE_ADAPTER = 0x00000004 SERVICE_ALL_ACCESS = 983551 SERVICE_AUTO_START = 0x00000002 SERVICE_BOOT_START = 0x00000000 SERVICE_CHANGE_CONFIG = 0x0002 SERVICE_CONFIG_DESCRIPTION = 1 SERVICE_CONFIG_FAILURE_ACTIONS = 2 SERVICE_CONTINUE_PENDING = 0x00000005 SERVICE_CONTROL_CONTINUE = 0x00000003 SERVICE_CONTROL_DEVICEEVENT = 0x0000000B SERVICE_CONTROL_HARDWAREPROFILECHANGE = 0x0000000C SERVICE_CONTROL_INTERROGATE = 0x00000004 SERVICE_CONTROL_NETBINDADD = 0x00000007 SERVICE_CONTROL_NETBINDDISABLE = 0x0000000A SERVICE_CONTROL_NETBINDENABLE = 0x00000009 SERVICE_CONTROL_NETBINDREMOVE = 0x00000008 SERVICE_CONTROL_PARAMCHANGE = 0x00000006 SERVICE_CONTROL_PAUSE = 0x00000002 SERVICE_CONTROL_POWEREVENT = 0x0000000D SERVICE_CONTROL_SESSIONCHANGE = 0x0000000E SERVICE_CONTROL_SHUTDOWN = 0x00000005 SERVICE_CONTROL_STOP = 0x00000001 SERVICE_DEMAND_START = 0x00000003 SERVICE_DISABLED = 0x00000004 SERVICE_DRIVER = 11 SERVICE_ENUMERATE_DEPENDENTS = 0x0008 SERVICE_ERROR_CRITICAL = 0x00000003 SERVICE_ERROR_IGNORE = 0x00000000 SERVICE_ERROR_NORMAL = 0x00000001 SERVICE_ERROR_SEVERE = 0x00000002 SERVICE_FILE_SYSTEM_DRIVER = 0x00000002 SERVICE_INACTIVE = 0x00000002 SERVICE_INTERACTIVE_PROCESS = 0x00000100 SERVICE_INTERROGATE = 0x0080 SERVICE_KERNEL_DRIVER = 0x00000001 SERVICE_NO_CHANGE = 0xffffffff SERVICE_PAUSED = 0x00000007 SERVICE_PAUSE_CONTINUE = 0x0040 SERVICE_PAUSE_PENDING = 0x00000006 SERVICE_QUERY_CONFIG = 0x0001 SERVICE_QUERY_STATUS = 0x0004 SERVICE_RECOGNIZER_DRIVER = 0x00000008 SERVICE_RUNNING = 0x00000004 SERVICE_RUNS_IN_SYSTEM_PROCESS = 0x00000001 SERVICE_START = 0x0010 SERVICE_START_PENDING = 0x00000002 SERVICE_STATE_ALL = 3 SERVICE_STOP = 0x0020 SERVICE_STOPPED = 0x00000001 SERVICE_STOP_PENDING = 0x00000003 SERVICE_SYSTEM_START = 0x00000001 SERVICE_TYPE_ALL = 319 SERVICE_USER_DEFINED_CONTROL = 0x0100 SERVICE_WIN32 = 48 SERVICE_WIN32_OWN_PROCESS = 0x00000010 SERVICE_WIN32_SHARE_PROCESS = 0x00000020 SESSIONS_STRM_CHUNK_SIZE = 1024 SESSION_ABORTED = 0x06 SESSION_ALL_ACCESS = 983043 SESSION_ESTABLISHED = 0x03 SESSION_MAX_BUFFER_SZ = 2147483391 SESSION_MODIFY_ACCESS = 0x2 SESSION_QUERY_ACCESS = 0x1 SESSION_UPDATE_CACHE_SZ = 12 SETABORTPROC = 9 SETALLJUSTVALUES = 771 SETBREAK = 8 SETCHARSET = 772 SETCOLORTABLE = 4 SETCOPYCOUNT = 17 SETDIBSCALING = 32 SETDTR = 5 SETICMPROFILE_EMBEDED = 0x00000001 SETKERNTRACK = 770 SETLINECAP = 21 SETLINEJOIN = 22 SETMITERLIMIT = 23 SETRGBSTRINGA = "commdlg_SetRGBColor" SETRTS = 3 SETXOFF = 1 SETXON = 2 SET_ARC_DIRECTION = 4102 SET_BACKGROUND_COLOR = 4103 SET_BOUNDS = 4109 SET_CLIP_BOX = 4108 SET_MIRROR_MODE = 4110 SET_POLY_MODE = 4104 SET_SCREEN_ANGLE = 4105 SET_SPREAD = 4106 SET_TAPE_DRIVE_INFORMATION = 1 SET_TAPE_MEDIA_INFORMATION = 0 SEVERITY_ERROR = 1 SEVERITY_SUCCESS = 0 SE_DACL_AUTO_INHERITED = 1024 SE_DACL_AUTO_INHERIT_REQ = 256 SE_DACL_DEFAULTED = 8 SE_DACL_PRESENT = 4 SE_DACL_PROTECTED = 4096 SE_ERR_ACCESSDENIED = 5 SE_ERR_ASSOCINCOMPLETE = 27 SE_ERR_DDEBUSY = 30 SE_ERR_DDEFAIL = 29 SE_ERR_DDETIMEOUT = 28 SE_ERR_DLLNOTFOUND = 32 SE_ERR_FNF = 2 SE_ERR_NOASSOC = 31 SE_ERR_OOM = 8 SE_ERR_PNF = 3 SE_ERR_SHARE = 26 SE_GROUP_DEFAULTED = 2 SE_GROUP_ENABLED = 4 SE_GROUP_ENABLED_BY_DEFAULT = 2 SE_GROUP_INTEGRITY = 32 SE_GROUP_INTEGRITY_ENABLED = 64 SE_GROUP_LOGON_ID = 3221225472 SE_GROUP_MANDATORY = 1 SE_GROUP_OWNER = 8 SE_GROUP_RESOURCE = 536870912 SE_GROUP_USE_FOR_DENY_ONLY = 16 SE_GROUP_VALID_ATTRIBUTES = 3758096511 SE_LEARNING_MODE_FLAG_PERMISSIVE = 0x00000001 SE_OWNER_DEFAULTED = 1 SE_PRIVILEGE_ENABLED = 2 SE_PRIVILEGE_ENABLED_BY_DEFAULT = 1 SE_PRIVILEGE_REMOVED = 4 SE_PRIVILEGE_USED_FOR_ACCESS = 2147483648 SE_PRIVILEGE_VALID_ATTRIBUTES = 2147483655 SE_RM_CONTROL_VALID = 16384 SE_SACL_AUTO_INHERITED = 2048 SE_SACL_AUTO_INHERIT_REQ = 512 SE_SACL_DEFAULTED = 32 SE_SACL_PRESENT = 16 SE_SACL_PROTECTED = 8192 SE_SECURITY_DESCRIPTOR_FLAG_NO_LABEL_ACE = 0x00000002 SE_SECURITY_DESCRIPTOR_FLAG_NO_OWNER_ACE = 0x00000001 SE_SECURITY_DESCRIPTOR_VALID_FLAGS = 0x00000003 SE_SELF_RELATIVE = 32768 SF_Aggregate = 0x0000008 SF_All = 0x0000002 SF_ComplexResult = 0x0040000 SF_Compound = 0x0000100 SF_Converted = 0x0010000 SF_CopyCte = 0x4000000 SF_Distinct = 0x0000001 SF_Expanded = 0x0000040 SF_FixedLimit = 0x0004000 SF_HasAgg = 0x0000010 SF_HasTypeInfo = 0x0000080 SF_IncludeHidden = 0x0020000 SF_MaybeConvert = 0x0008000 SF_MinMaxAgg = 0x0001000 SF_MultiPart = 0x2000000 SF_MultiValue = 0x0000400 SF_NestedFrom = 0x0000800 SF_NoopOrderBy = 0x0400000 SF_OrderByReqd = 0x8000000 SF_PushDown = 0x1000000 SF_Recursive = 0x0002000 SF_Resolved = 0x0000004 SF_UFSrcCheck = 0x0800000 SF_UpdateFrom = 0x10000000 SF_UsesEphemeral = 0x0000020 SF_Values = 0x0000200 SF_View = 0x0200000 SF_WhereBegin = 0x0080000 SF_WinRewrite = 0x0100000 SHADEBLENDCAPS = 120 SHARED_LOCK = 1 SHARED_SIZE = 510 SHAREVISTRINGA = "commdlg_ShareViolation" SHERB_NOCONFIRMATION = 0x00000001 SHERB_NOPROGRESSUI = 0x00000002 SHERB_NOSOUND = 0x00000004 SHFILEINFO_DEFINED = 0 SHGFI_ADDOVERLAYS = 0x000000020 SHGFI_ATTRIBUTES = 0x000000800 SHGFI_ATTR_SPECIFIED = 0x000020000 SHGFI_DISPLAYNAME = 0x000000200 SHGFI_EXETYPE = 0x000002000 SHGFI_ICON = 0x000000100 SHGFI_ICONLOCATION = 0x000001000 SHGFI_LARGEICON = 0x000000000 SHGFI_LINKOVERLAY = 0x000008000 SHGFI_OPENICON = 0x000000002 SHGFI_OVERLAYINDEX = 0x000000040 SHGFI_PIDL = 0x000000008 SHGFI_SELECTED = 0x000010000 SHGFI_SHELLICONSIZE = 0x000000004 SHGFI_SMALLICON = 0x000000001 SHGFI_SYSICONINDEX = 0x000004000 SHGFI_TYPENAME = 0x000000400 SHGFI_USEFILEATTRIBUTES = 0x000000010 SHGNLI_NOLNK = 0x000000008 SHGNLI_NOLOCNAME = 0x000000010 SHGNLI_NOUNIQUE = 0x000000004 SHGNLI_PIDL = 0x000000001 SHGNLI_PREFIXNAME = 0x000000002 SHIFTJIS_CHARSET = 128 SHIFT_PRESSED = 0x10 SHIL_EXTRALARGE = 2 SHIL_LARGE = 0 SHIL_LAST = 3 SHIL_SMALL = 1 SHIL_SYSSMALL = 3 SHOW_FULLSCREEN = 3 SHOW_ICONWINDOW = 2 SHOW_OPENNOACTIVATE = 4 SHOW_OPENWINDOW = 1 SHRT_MAX = 32767 SHRT_MIN = -32768 SHTDN_REASON_FLAG_CLEAN_UI = 0x04000000 SHTDN_REASON_FLAG_COMMENT_REQUIRED = 0x01000000 SHTDN_REASON_FLAG_DIRTY_PROBLEM_ID_REQUIRED = 0x02000000 SHTDN_REASON_FLAG_DIRTY_UI = 0x08000000 SHTDN_REASON_FLAG_PLANNED = 0x80000000 SHTDN_REASON_FLAG_USER_DEFINED = 0x40000000 SHTDN_REASON_LEGACY_API = 2147942400 SHTDN_REASON_MAJOR_APPLICATION = 0x00040000 SHTDN_REASON_MAJOR_HARDWARE = 0x00010000 SHTDN_REASON_MAJOR_LEGACY_API = 0x00070000 SHTDN_REASON_MAJOR_NONE = 0x00000000 SHTDN_REASON_MAJOR_OPERATINGSYSTEM = 0x00020000 SHTDN_REASON_MAJOR_OTHER = 0x00000000 SHTDN_REASON_MAJOR_POWER = 0x00060000 SHTDN_REASON_MAJOR_SOFTWARE = 0x00030000 SHTDN_REASON_MAJOR_SYSTEM = 0x00050000 SHTDN_REASON_MINOR_BLUESCREEN = 0x0000000F SHTDN_REASON_MINOR_CORDUNPLUGGED = 0x0000000b SHTDN_REASON_MINOR_DC_DEMOTION = 0x00000022 SHTDN_REASON_MINOR_DC_PROMOTION = 0x00000021 SHTDN_REASON_MINOR_DISK = 0x00000007 SHTDN_REASON_MINOR_ENVIRONMENT = 0x0000000c SHTDN_REASON_MINOR_HARDWARE_DRIVER = 0x0000000d SHTDN_REASON_MINOR_HOTFIX = 0x00000011 SHTDN_REASON_MINOR_HOTFIX_UNINSTALL = 0x00000017 SHTDN_REASON_MINOR_HUNG = 0x00000005 SHTDN_REASON_MINOR_INSTALLATION = 0x00000002 SHTDN_REASON_MINOR_MAINTENANCE = 0x00000001 SHTDN_REASON_MINOR_MMC = 0x00000019 SHTDN_REASON_MINOR_NETWORKCARD = 0x00000009 SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY = 0x00000014 SHTDN_REASON_MINOR_NONE = 0x000000ff SHTDN_REASON_MINOR_OTHER = 0x00000000 SHTDN_REASON_MINOR_OTHERDRIVER = 0x0000000e SHTDN_REASON_MINOR_POWER_SUPPLY = 0x0000000a SHTDN_REASON_MINOR_PROCESSOR = 0x00000008 SHTDN_REASON_MINOR_RECONFIG = 0x00000004 SHTDN_REASON_MINOR_SECURITY = 0x00000013 SHTDN_REASON_MINOR_SECURITYFIX = 0x00000012 SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL = 0x00000018 SHTDN_REASON_MINOR_SERVICEPACK = 0x00000010 SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL = 0x00000016 SHTDN_REASON_MINOR_SYSTEMRESTORE = 0x0000001a SHTDN_REASON_MINOR_TERMSRV = 0x00000020 SHTDN_REASON_MINOR_UNSTABLE = 0x00000006 SHTDN_REASON_MINOR_UPGRADE = 0x00000003 SHTDN_REASON_MINOR_WMI = 0x00000015 SHTDN_REASON_UNKNOWN = 255 SHTDN_REASON_VALID_BIT_MASK = 0xc0ffffff SHUTDOWN_NORETRY = 0x1 SHUTDOWN_TYPE_LEN = 32 SID_DEFINED = 0 SID_HASH_SIZE = 32 SID_IDENTIFIER_AUTHORITY_DEFINED = 0 SID_MAX_SUB_AUTHORITIES = 15 SID_RECOMMENDED_SUB_AUTHORITIES = 1 SID_REVISION = 1 SIF_ALL = 23 SIF_DISABLENOSCROLL = 0x0008 SIF_PAGE = 0x0002 SIF_POS = 0x0004 SIF_RANGE = 0x0001 SIF_TRACKPOS = 0x0010 SIMPLEBLOB = 0x1 SIMPLEREGION = 2 SIMULATED_FONTTYPE = 0x8000 SING = 2 SITE_PIN_RULES_ALL_SUBDOMAINS_FLAG = 0x1 SIZEFULLSCREEN = 2 SIZEICONIC = 1 SIZENORMAL = 0 SIZEOF_RFPO_DATA = 16 SIZEPALETTE = 104 SIZEZOOMHIDE = 4 SIZEZOOMSHOW = 3 SIZE_MAX = 18446744073709551615 SIZE_MAXHIDE = 4 SIZE_MAXIMIZED = 2 SIZE_MAXSHOW = 3 SIZE_MINIMIZED = 1 SIZE_RESTORED = 0 SKF_AUDIBLEFEEDBACK = 0x00000040 SKF_AVAILABLE = 0x00000002 SKF_CONFIRMHOTKEY = 0x00000008 SKF_HOTKEYACTIVE = 0x00000004 SKF_HOTKEYSOUND = 0x00000010 SKF_INDICATOR = 0x00000020 SKF_LALTLATCHED = 0x10000000 SKF_LALTLOCKED = 0x00100000 SKF_LCTLLATCHED = 0x04000000 SKF_LCTLLOCKED = 0x00040000 SKF_LSHIFTLATCHED = 0x01000000 SKF_LSHIFTLOCKED = 0x00010000 SKF_LWINLATCHED = 0x40000000 SKF_LWINLOCKED = 0x00400000 SKF_RALTLATCHED = 0x20000000 SKF_RALTLOCKED = 0x00200000 SKF_RCTLLATCHED = 0x08000000 SKF_RCTLLOCKED = 0x00080000 SKF_RSHIFTLATCHED = 0x02000000 SKF_RSHIFTLOCKED = 0x00020000 SKF_RWINLATCHED = 0x80000000 SKF_RWINLOCKED = 0x00800000 SKF_STICKYKEYSON = 0x00000001 SKF_TRISTATE = 0x00000080 SKF_TWOKEYSOFF = 0x00000100 SLE_ERROR = 0x00000001 SLE_MINORERROR = 0x00000002 SLE_WARNING = 0x00000003 SLOT_2_0 = 0x001fc07f SLOT_4_2_0 = 0xf01fc07f SMART_ABORT_OFFLINE_SELFTEST = 127 SMART_CMD = 0xB0 SMART_CYL_HI = 0xC2 SMART_CYL_LOW = 0x4F SMART_ERROR_NO_MEM = 7 SMART_EXTENDED_SELFTEST_CAPTIVE = 130 SMART_EXTENDED_SELFTEST_OFFLINE = 2 SMART_GET_VERSION = 475264 SMART_IDE_ERROR = 1 SMART_INVALID_BUFFER = 4 SMART_INVALID_COMMAND = 3 SMART_INVALID_DRIVE = 5 SMART_INVALID_FLAG = 2 SMART_INVALID_IOCTL = 6 SMART_INVALID_REGISTER = 8 SMART_LOG_SECTOR_SIZE = 512 SMART_NOT_SUPPORTED = 9 SMART_NO_ERROR = 0 SMART_NO_IDE_DEVICE = 10 SMART_OFFLINE_ROUTINE_OFFLINE = 0 SMART_RCV_DRIVE_DATA = 508040 SMART_READ_LOG = 0xD5 SMART_SEND_DRIVE_COMMAND = 508036 SMART_SHORT_SELFTEST_CAPTIVE = 129 SMART_SHORT_SELFTEST_OFFLINE = 1 SMART_WRITE_LOG = 0xd6 SMTO_ABORTIFHUNG = 0x0002 SMTO_BLOCK = 0x0001 SMTO_NORMAL = 0x0000 SMTO_NOTIMEOUTIFNOTHUNG = 0x0008 SM_ARRANGE = 56 SM_CARETBLINKINGENABLED = 0x2002 SM_CLEANBOOT = 67 SM_CMETRICS = 97 SM_CMONITORS = 80 SM_CMOUSEBUTTONS = 43 SM_CXBORDER = 5 SM_CXCURSOR = 13 SM_CXDLGFRAME = 7 SM_CXDOUBLECLK = 36 SM_CXDRAG = 68 SM_CXEDGE = 45 SM_CXFIXEDFRAME = 7 SM_CXFOCUSBORDER = 83 SM_CXFRAME = 32 SM_CXFULLSCREEN = 16 SM_CXHSCROLL = 21 SM_CXHTHUMB = 10 SM_CXICON = 11 SM_CXICONSPACING = 38 SM_CXMAXIMIZED = 61 SM_CXMAXTRACK = 59 SM_CXMENUCHECK = 71 SM_CXMENUSIZE = 54 SM_CXMIN = 28 SM_CXMINIMIZED = 57 SM_CXMINSPACING = 47 SM_CXMINTRACK = 34 SM_CXSCREEN = 0 SM_CXSIZE = 30 SM_CXSIZEFRAME = 32 SM_CXSMICON = 49 SM_CXSMSIZE = 52 SM_CXVIRTUALSCREEN = 78 SM_CXVSCROLL = 2 SM_CYBORDER = 6 SM_CYCAPTION = 4 SM_CYCURSOR = 14 SM_CYDLGFRAME = 8 SM_CYDOUBLECLK = 37 SM_CYDRAG = 69 SM_CYEDGE = 46 SM_CYFIXEDFRAME = 8 SM_CYFOCUSBORDER = 84 SM_CYFRAME = 33 SM_CYFULLSCREEN = 17 SM_CYHSCROLL = 3 SM_CYICON = 12 SM_CYICONSPACING = 39 SM_CYKANJIWINDOW = 18 SM_CYMAXIMIZED = 62 SM_CYMAXTRACK = 60 SM_CYMENU = 15 SM_CYMENUCHECK = 72 SM_CYMENUSIZE = 55 SM_CYMIN = 29 SM_CYMINIMIZED = 58 SM_CYMINSPACING = 48 SM_CYMINTRACK = 35 SM_CYSCREEN = 1 SM_CYSIZE = 31 SM_CYSIZEFRAME = 33 SM_CYSMCAPTION = 51 SM_CYSMICON = 50 SM_CYSMSIZE = 53 SM_CYVIRTUALSCREEN = 79 SM_CYVSCROLL = 20 SM_CYVTHUMB = 9 SM_DBCSENABLED = 42 SM_DEBUG = 22 SM_IMMENABLED = 82 SM_MEDIACENTER = 87 SM_MENUDROPALIGNMENT = 40 SM_MIDEASTENABLED = 74 SM_MOUSEPRESENT = 19 SM_MOUSEWHEELPRESENT = 75 SM_NETWORK = 63 SM_PENWINDOWS = 41 SM_REMOTECONTROL = 0x2001 SM_REMOTESESSION = 0x1000 SM_RESERVED1 = 24 SM_RESERVED2 = 25 SM_RESERVED3 = 26 SM_RESERVED4 = 27 SM_SAMEDISPLAYFORMAT = 81 SM_SECURE = 44 SM_SERVERR2 = 89 SM_SHOWSOUNDS = 70 SM_SHUTTINGDOWN = 0x2000 SM_SLOWMACHINE = 73 SM_STARTER = 88 SM_SWAPBUTTON = 23 SM_TABLETPC = 86 SM_XVIRTUALSCREEN = 76 SM_YVIRTUALSCREEN = 77 SNAPSHOT_POLICY_ALWAYS = 1 SNAPSHOT_POLICY_NEVER = 0 SNAPSHOT_POLICY_UNPLANNED = 2 SND_ALIAS = 65536 SND_ALIAS_ID = 1114112 SND_ALIAS_START = 0 SND_APPLICATION = 0x0080 SND_ASYNC = 0x0001 SND_FILENAME = 131072 SND_LOOP = 0x0008 SND_MEMORY = 0x0004 SND_NODEFAULT = 0x0002 SND_NOSTOP = 0x0010 SND_NOWAIT = 8192 SND_PURGE = 0x0040 SND_RESOURCE = 262148 SND_SYNC = 0x0000 SOCKET_ERROR = -1 SOCK_DGRAM = 2 SOCK_RAW = 3 SOCK_RDM = 4 SOCK_SEQPACKET = 5 SOCK_STREAM = 1 SOFTDIST_ADSTATE_AVAILABLE = 0x1 SOFTDIST_ADSTATE_DOWNLOADED = 0x2 SOFTDIST_ADSTATE_INSTALLED = 0x3 SOFTDIST_ADSTATE_NONE = 0x0 SOFTDIST_FLAG_DELETE_SUBSCRIPTION = 0x8 SOFTDIST_FLAG_USAGE_AUTOINSTALL = 0x4 SOFTDIST_FLAG_USAGE_EMAIL = 0x1 SOFTDIST_FLAG_USAGE_PRECACHE = 0x2 SOFTKEYBOARD_TYPE_C1 = 0x0002 SOFTKEYBOARD_TYPE_T1 = 0x0001 SOL_SOCKET = 0xffff SOMAXCONN = 5 SORTED_CTL_EXT_COUNT_OFFSET = 4 SORTED_CTL_EXT_FLAGS_OFFSET = 0 SORTED_CTL_EXT_HASHED_SUBJECT_IDENTIFIER_FLAG = 0x1 SORTED_CTL_EXT_HASH_BUCKET_OFFSET = 12 SORTED_CTL_EXT_MAX_COLLISION_OFFSET = 8 SORTER_MAX_MERGE_COUNT = 16 SORTER_TYPE_INTEGER = 0x01 SORTER_TYPE_TEXT = 0x02 SORTFLAG_UseSorter = 0x01 SORT_CHINESE_BIG5 = 0x0 SORT_CHINESE_BOPOMOFO = 0x3 SORT_CHINESE_PRC = 0x2 SORT_CHINESE_PRCP = 0x0 SORT_CHINESE_RADICALSTROKE = 0x4 SORT_CHINESE_UNICODE = 0x1 SORT_DEFAULT = 0x0 SORT_GEORGIAN_MODERN = 0x1 SORT_GEORGIAN_TRADITIONAL = 0x0 SORT_GERMAN_PHONE_BOOK = 0x1 SORT_HUNGARIAN_DEFAULT = 0x0 SORT_HUNGARIAN_TECHNICAL = 0x1 SORT_INVARIANT_MATH = 0x1 SORT_JAPANESE_RADICALSTROKE = 0x4 SORT_JAPANESE_UNICODE = 0x1 SORT_JAPANESE_XJIS = 0x0 SORT_KOREAN_KSC = 0x0 SORT_KOREAN_UNICODE = 0x1 SORT_STRINGSORT = 0x00001000 SOUND_SYSTEM_APPEND = 14 SOUND_SYSTEM_APPSTART = 12 SOUND_SYSTEM_BEEP = 3 SOUND_SYSTEM_ERROR = 4 SOUND_SYSTEM_FAULT = 13 SOUND_SYSTEM_INFORMATION = 7 SOUND_SYSTEM_MAXIMIZE = 8 SOUND_SYSTEM_MENUCOMMAND = 15 SOUND_SYSTEM_MENUPOPUP = 16 SOUND_SYSTEM_MINIMIZE = 9 SOUND_SYSTEM_QUESTION = 5 SOUND_SYSTEM_RESTOREDOWN = 11 SOUND_SYSTEM_RESTOREUP = 10 SOUND_SYSTEM_SHUTDOWN = 2 SOUND_SYSTEM_STARTUP = 1 SOUND_SYSTEM_WARNING = 6 SO_ACCEPTCONN = 0x0002 SO_BROADCAST = 0x0020 SO_CONNDATA = 0x7000 SO_CONNDATALEN = 0x7004 SO_CONNECT_TIME = 0x700C SO_CONNOPT = 0x7001 SO_CONNOPTLEN = 0x7005 SO_DEBUG = 0x0001 SO_DISCDATA = 0x7002 SO_DISCDATALEN = 0x7006 SO_DISCOPT = 0x7003 SO_DISCOPTLEN = 0x7007 SO_DONTROUTE = 0x0010 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x0008 SO_LINGER = 0x0080 SO_MAXDG = 0x7009 SO_MAXPATHDG = 0x700A SO_OOBINLINE = 0x0100 SO_OPENTYPE = 0x7008 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x0004 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_SYNCHRONOUS_ALERT = 0x10 SO_SYNCHRONOUS_NONALERT = 0x20 SO_TYPE = 0x1008 SO_UPDATE_ACCEPT_CONTEXT = 0x700B SO_USELOOPBACK = 0x0040 SPACEPARITY = 4 SPCLPASSTHROUGH2 = 4568 SPECIFIC_RIGHTS_ALL = 65535 SPECSTRINGS_H = 0 SPIF_SENDCHANGE = 2 SPIF_SENDWININICHANGE = 0x0002 SPIF_UPDATEINIFILE = 0x0001 SPILLFLAG_NOSYNC = 0x04 SPILLFLAG_OFF = 0x01 SPILLFLAG_ROLLBACK = 0x02 SPI_GETACCESSTIMEOUT = 0x003C SPI_GETACTIVEWINDOWTRACKING = 0x1000 SPI_GETACTIVEWNDTRKTIMEOUT = 0x2002 SPI_GETACTIVEWNDTRKZORDER = 0x100C SPI_GETANIMATION = 0x0048 SPI_GETBEEP = 0x0001 SPI_GETBLOCKSENDINPUTRESETS = 0x1026 SPI_GETBORDER = 0x0005 SPI_GETCARETWIDTH = 0x2006 SPI_GETCOMBOBOXANIMATION = 0x1004 SPI_GETCURSORSHADOW = 0x101A SPI_GETDEFAULTINPUTLANG = 0x0059 SPI_GETDESKWALLPAPER = 0x0073 SPI_GETDRAGFULLWINDOWS = 0x0026 SPI_GETDROPSHADOW = 0x1024 SPI_GETFASTTASKSWITCH = 0x0023 SPI_GETFILTERKEYS = 0x0032 SPI_GETFLATMENU = 0x1022 SPI_GETFOCUSBORDERHEIGHT = 0x2010 SPI_GETFOCUSBORDERWIDTH = 0x200E SPI_GETFONTSMOOTHING = 0x004A SPI_GETFONTSMOOTHINGCONTRAST = 0x200C SPI_GETFONTSMOOTHINGORIENTATION = 0x2012 SPI_GETFONTSMOOTHINGTYPE = 0x200A SPI_GETFOREGROUNDFLASHCOUNT = 0x2004 SPI_GETFOREGROUNDLOCKTIMEOUT = 0x2000 SPI_GETGRADIENTCAPTIONS = 0x1008 SPI_GETGRIDGRANULARITY = 0x0012 SPI_GETHIGHCONTRAST = 0x0042 SPI_GETHOTTRACKING = 0x100E SPI_GETICONMETRICS = 0x002D SPI_GETICONTITLELOGFONT = 0x001F SPI_GETICONTITLEWRAP = 0x0019 SPI_GETKEYBOARDCUES = 0x100A SPI_GETKEYBOARDDELAY = 0x0016 SPI_GETKEYBOARDPREF = 0x0044 SPI_GETKEYBOARDSPEED = 0x000A SPI_GETLISTBOXSMOOTHSCROLLING = 0x1006 SPI_GETLOWPOWERACTIVE = 0x0053 SPI_GETLOWPOWERTIMEOUT = 0x004F SPI_GETMENUANIMATION = 0x1002 SPI_GETMENUDROPALIGNMENT = 0x001B SPI_GETMENUFADE = 0x1012 SPI_GETMENUSHOWDELAY = 0x006A SPI_GETMENUUNDERLINES = 4106 SPI_GETMINIMIZEDMETRICS = 0x002B SPI_GETMOUSE = 0x0003 SPI_GETMOUSECLICKLOCK = 0x101E SPI_GETMOUSECLICKLOCKTIME = 0x2008 SPI_GETMOUSEHOVERHEIGHT = 0x0064 SPI_GETMOUSEHOVERTIME = 0x0066 SPI_GETMOUSEHOVERWIDTH = 0x0062 SPI_GETMOUSEKEYS = 0x0036 SPI_GETMOUSESONAR = 0x101C SPI_GETMOUSESPEED = 0x0070 SPI_GETMOUSETRAILS = 0x005E SPI_GETMOUSEVANISH = 0x1020 SPI_GETNONCLIENTMETRICS = 0x0029 SPI_GETPOWEROFFACTIVE = 0x0054 SPI_GETPOWEROFFTIMEOUT = 0x0050 SPI_GETSCREENREADER = 0x0046 SPI_GETSCREENSAVEACTIVE = 0x0010 SPI_GETSCREENSAVERRUNNING = 0x0072 SPI_GETSCREENSAVETIMEOUT = 0x000E SPI_GETSELECTIONFADE = 0x1014 SPI_GETSERIALKEYS = 0x003E SPI_GETSHOWIMEUI = 0x006E SPI_GETSHOWSOUNDS = 0x0038 SPI_GETSNAPTODEFBUTTON = 0x005F SPI_GETSOUNDSENTRY = 0x0040 SPI_GETSTICKYKEYS = 0x003A SPI_GETTOGGLEKEYS = 0x0034 SPI_GETTOOLTIPANIMATION = 0x1016 SPI_GETTOOLTIPFADE = 0x1018 SPI_GETUIEFFECTS = 0x103E SPI_GETWHEELSCROLLLINES = 0x0068 SPI_GETWINDOWSEXTENSION = 0x005C SPI_GETWORKAREA = 0x0030 SPI_ICONHORIZONTALSPACING = 0x000D SPI_ICONVERTICALSPACING = 0x0018 SPI_LANGDRIVER = 0x000C SPI_SCREENSAVERRUNNING = 97 SPI_SETACCESSTIMEOUT = 0x003D SPI_SETACTIVEWINDOWTRACKING = 0x1001 SPI_SETACTIVEWNDTRKTIMEOUT = 0x2003 SPI_SETACTIVEWNDTRKZORDER = 0x100D SPI_SETANIMATION = 0x0049 SPI_SETBEEP = 0x0002 SPI_SETBLOCKSENDINPUTRESETS = 0x1027 SPI_SETBORDER = 0x0006 SPI_SETCARETWIDTH = 0x2007 SPI_SETCOMBOBOXANIMATION = 0x1005 SPI_SETCURSORS = 0x0057 SPI_SETCURSORSHADOW = 0x101B SPI_SETDEFAULTINPUTLANG = 0x005A SPI_SETDESKPATTERN = 0x0015 SPI_SETDESKWALLPAPER = 0x0014 SPI_SETDOUBLECLICKTIME = 0x0020 SPI_SETDOUBLECLKHEIGHT = 0x001E SPI_SETDOUBLECLKWIDTH = 0x001D SPI_SETDRAGFULLWINDOWS = 0x0025 SPI_SETDRAGHEIGHT = 0x004D SPI_SETDRAGWIDTH = 0x004C SPI_SETDROPSHADOW = 0x1025 SPI_SETFASTTASKSWITCH = 0x0024 SPI_SETFILTERKEYS = 0x0033 SPI_SETFLATMENU = 0x1023 SPI_SETFOCUSBORDERHEIGHT = 0x2011 SPI_SETFOCUSBORDERWIDTH = 0x200F SPI_SETFONTSMOOTHING = 0x004B SPI_SETFONTSMOOTHINGCONTRAST = 0x200D SPI_SETFONTSMOOTHINGORIENTATION = 0x2013 SPI_SETFONTSMOOTHINGTYPE = 0x200B SPI_SETFOREGROUNDFLASHCOUNT = 0x2005 SPI_SETFOREGROUNDLOCKTIMEOUT = 0x2001 SPI_SETGRADIENTCAPTIONS = 0x1009 SPI_SETGRIDGRANULARITY = 0x0013 SPI_SETHANDHELD = 0x004E SPI_SETHIGHCONTRAST = 0x0043 SPI_SETHOTTRACKING = 0x100F SPI_SETICONMETRICS = 0x002E SPI_SETICONS = 0x0058 SPI_SETICONTITLELOGFONT = 0x0022 SPI_SETICONTITLEWRAP = 0x001A SPI_SETKEYBOARDCUES = 0x100B SPI_SETKEYBOARDDELAY = 0x0017 SPI_SETKEYBOARDPREF = 0x0045 SPI_SETKEYBOARDSPEED = 0x000B SPI_SETLANGTOGGLE = 0x005B SPI_SETLISTBOXSMOOTHSCROLLING = 0x1007 SPI_SETLOWPOWERACTIVE = 0x0055 SPI_SETLOWPOWERTIMEOUT = 0x0051 SPI_SETMENUANIMATION = 0x1003 SPI_SETMENUDROPALIGNMENT = 0x001C SPI_SETMENUFADE = 0x1013 SPI_SETMENUSHOWDELAY = 0x006B SPI_SETMENUUNDERLINES = 4107 SPI_SETMINIMIZEDMETRICS = 0x002C SPI_SETMOUSE = 0x0004 SPI_SETMOUSEBUTTONSWAP = 0x0021 SPI_SETMOUSECLICKLOCK = 0x101F SPI_SETMOUSECLICKLOCKTIME = 0x2009 SPI_SETMOUSEHOVERHEIGHT = 0x0065 SPI_SETMOUSEHOVERTIME = 0x0067 SPI_SETMOUSEHOVERWIDTH = 0x0063 SPI_SETMOUSEKEYS = 0x0037 SPI_SETMOUSESONAR = 0x101D SPI_SETMOUSESPEED = 0x0071 SPI_SETMOUSETRAILS = 0x005D SPI_SETMOUSEVANISH = 0x1021 SPI_SETNONCLIENTMETRICS = 0x002A SPI_SETPENWINDOWS = 0x0031 SPI_SETPOWEROFFACTIVE = 0x0056 SPI_SETPOWEROFFTIMEOUT = 0x0052 SPI_SETSCREENREADER = 0x0047 SPI_SETSCREENSAVEACTIVE = 0x0011 SPI_SETSCREENSAVERRUNNING = 0x0061 SPI_SETSCREENSAVETIMEOUT = 0x000F SPI_SETSELECTIONFADE = 0x1015 SPI_SETSERIALKEYS = 0x003F SPI_SETSHOWIMEUI = 0x006F SPI_SETSHOWSOUNDS = 0x0039 SPI_SETSNAPTODEFBUTTON = 0x0060 SPI_SETSOUNDSENTRY = 0x0041 SPI_SETSTICKYKEYS = 0x003B SPI_SETTOGGLEKEYS = 0x0035 SPI_SETTOOLTIPANIMATION = 0x1017 SPI_SETTOOLTIPFADE = 0x1019 SPI_SETUIEFFECTS = 0x103F SPI_SETWHEELSCROLLLINES = 0x0069 SPI_SETWORKAREA = 0x002F SPOINTER_32 = 0 SPOOL_FILE_PERSISTENT = 0x00000001 SPOOL_FILE_TEMPORARY = 0x00000002 SPVERSION_MASK = 0x0000FF00 SP_APPABORT = -2 SP_ERROR = -1 SP_NOTREPORTED = 0x4000 SP_OUTOFDISK = -4 SP_OUTOFMEMORY = -5 SP_USERABORT = -3 SQLITE3EXT_H = 0 SQLITE3_H = 0 SQLITE3_TEXT = 3 SQLITEINT_H = 0 SQLITE_ABORT = 4 SQLITE_ABORT_ROLLBACK = 516 SQLITE_ACCESS_EXISTS = 0 SQLITE_ACCESS_READ = 2 SQLITE_ACCESS_READWRITE = 1 SQLITE_AFF_BLOB = 0x41 SQLITE_AFF_FLEXNUM = 0x46 SQLITE_AFF_INTEGER = 0x44 SQLITE_AFF_MASK = 0x47 SQLITE_AFF_NONE = 0x40 SQLITE_AFF_NUMERIC = 0x43 SQLITE_AFF_REAL = 0x45 SQLITE_AFF_TEXT = 0x42 SQLITE_ALLOW_COVERING_INDEX_SCAN = 1 SQLITE_ALTER_TABLE = 26 SQLITE_AMALGAMATION = 1 SQLITE_ANALYZE = 28 SQLITE_ANY = 5 SQLITE_API = 0 SQLITE_APICALL = 0 SQLITE_ASCII = 1 SQLITE_ATOMIC_INTRINSICS = 1 SQLITE_ATTACH = 24 SQLITE_AUTH = 23 SQLITE_AUTH_USER = 279 SQLITE_AllOpts = 0xffffffff SQLITE_AutoIndex = 0x00008000 SQLITE_BIGENDIAN = 0 SQLITE_BIG_DBL = 0 SQLITE_BLDF1_INDEXED = 0x0001 SQLITE_BLDF1_UNIQUE = 0x0002 SQLITE_BLDF2_2NDPASS = 0x0004 SQLITE_BLOB = 4 SQLITE_BTREE_H = 0 SQLITE_BUSY = 5 SQLITE_BUSY_RECOVERY = 261 SQLITE_BUSY_SNAPSHOT = 517 SQLITE_BUSY_TIMEOUT = 773 SQLITE_BYTEORDER = 1234 SQLITE_BalancedMerge = 0x00200000 SQLITE_BloomFilter = 0x00080000 SQLITE_BloomPulldown = 0x00100000 SQLITE_CALLBACK = 0 SQLITE_CANTOPEN = 14 SQLITE_CANTOPEN_CONVPATH = 1038 SQLITE_CANTOPEN_DIRTYWAL = 1294 SQLITE_CANTOPEN_FULLPATH = 782 SQLITE_CANTOPEN_ISDIR = 526 SQLITE_CANTOPEN_NOTEMPDIR = 270 SQLITE_CANTOPEN_SYMLINK = 1550 SQLITE_CDECL = 0 SQLITE_CHANGESETAPPLY_INVERT = 0x0002 SQLITE_CHANGESETAPPLY_NOSAVEPOINT = 0x0001 SQLITE_CHANGESETSTART_INVERT = 0x0002 SQLITE_CHANGESET_ABORT = 2 SQLITE_CHANGESET_CONFLICT = 3 SQLITE_CHANGESET_CONSTRAINT = 4 SQLITE_CHANGESET_DATA = 1 SQLITE_CHANGESET_FOREIGN_KEY = 5 SQLITE_CHANGESET_NOTFOUND = 2 SQLITE_CHANGESET_OMIT = 0 SQLITE_CHANGESET_REPLACE = 1 SQLITE_CHECKPOINT_FULL = 1 SQLITE_CHECKPOINT_PASSIVE = 0 SQLITE_CHECKPOINT_RESTART = 2 SQLITE_CHECKPOINT_TRUNCATE = 3 SQLITE_CONFIG_COVERING_INDEX_SCAN = 20 SQLITE_CONFIG_GETMALLOC = 5 SQLITE_CONFIG_GETMUTEX = 11 SQLITE_CONFIG_GETPCACHE = 15 SQLITE_CONFIG_GETPCACHE2 = 19 SQLITE_CONFIG_HEAP = 8 SQLITE_CONFIG_LOG = 16 SQLITE_CONFIG_LOOKASIDE = 13 SQLITE_CONFIG_MALLOC = 4 SQLITE_CONFIG_MEMDB_MAXSIZE = 29 SQLITE_CONFIG_MEMSTATUS = 9 SQLITE_CONFIG_MMAP_SIZE = 22 SQLITE_CONFIG_MULTITHREAD = 2 SQLITE_CONFIG_MUTEX = 10 SQLITE_CONFIG_PAGECACHE = 7 SQLITE_CONFIG_PCACHE = 14 SQLITE_CONFIG_PCACHE2 = 18 SQLITE_CONFIG_PCACHE_HDRSZ = 24 SQLITE_CONFIG_PMASZ = 25 SQLITE_CONFIG_SCRATCH = 6 SQLITE_CONFIG_SERIALIZED = 3 SQLITE_CONFIG_SINGLETHREAD = 1 SQLITE_CONFIG_SMALL_MALLOC = 27 SQLITE_CONFIG_SORTERREF_SIZE = 28 SQLITE_CONFIG_SQLLOG = 21 SQLITE_CONFIG_STMTJRNL_SPILL = 26 SQLITE_CONFIG_URI = 17 SQLITE_CONFIG_WIN32_HEAPSIZE = 23 SQLITE_CONSTRAINT = 19 SQLITE_CONSTRAINT_CHECK = 275 SQLITE_CONSTRAINT_COMMITHOOK = 531 SQLITE_CONSTRAINT_DATATYPE = 3091 SQLITE_CONSTRAINT_FOREIGNKEY = 787 SQLITE_CONSTRAINT_FUNCTION = 1043 SQLITE_CONSTRAINT_NOTNULL = 1299 SQLITE_CONSTRAINT_PINNED = 2835 SQLITE_CONSTRAINT_PRIMARYKEY = 1555 SQLITE_CONSTRAINT_ROWID = 2579 SQLITE_CONSTRAINT_TRIGGER = 1811 SQLITE_CONSTRAINT_UNIQUE = 2067 SQLITE_CONSTRAINT_VTAB = 2323 SQLITE_COPY = 0 SQLITE_CORE = 1 SQLITE_CORRUPT = 11 SQLITE_CORRUPT_INDEX = 779 SQLITE_CORRUPT_SEQUENCE = 523 SQLITE_CORRUPT_VTAB = 267 SQLITE_CREATE_INDEX = 1 SQLITE_CREATE_TABLE = 2 SQLITE_CREATE_TEMP_INDEX = 3 SQLITE_CREATE_TEMP_TABLE = 4 SQLITE_CREATE_TEMP_TRIGGER = 5 SQLITE_CREATE_TEMP_VIEW = 6 SQLITE_CREATE_TRIGGER = 7 SQLITE_CREATE_VIEW = 8 SQLITE_CREATE_VTABLE = 29 SQLITE_CacheSpill = 0x00000020 SQLITE_CellSizeCk = 0x00200000 SQLITE_CkptFullFSync = 0x00000010 SQLITE_Coroutines = 0x02000000 SQLITE_CountOfView = 0x00000200 SQLITE_CoverIdxScan = 0x00000020 SQLITE_CursorHints = 0x00000400 SQLITE_DBCONFIG_DEFENSIVE = 1010 SQLITE_DBCONFIG_DQS_DDL = 1014 SQLITE_DBCONFIG_DQS_DML = 1013 SQLITE_DBCONFIG_ENABLE_FKEY = 1002 SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER = 1004 SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION = 1005 SQLITE_DBCONFIG_ENABLE_QPSG = 1007 SQLITE_DBCONFIG_ENABLE_TRIGGER = 1003 SQLITE_DBCONFIG_ENABLE_VIEW = 1015 SQLITE_DBCONFIG_LEGACY_ALTER_TABLE = 1012 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT = 1016 SQLITE_DBCONFIG_LOOKASIDE = 1001 SQLITE_DBCONFIG_MAINDBNAME = 1000 SQLITE_DBCONFIG_MAX = 1017 SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE = 1006 SQLITE_DBCONFIG_RESET_DATABASE = 1009 SQLITE_DBCONFIG_TRIGGER_EQP = 1008 SQLITE_DBCONFIG_TRUSTED_SCHEMA = 1017 SQLITE_DBCONFIG_WRITABLE_SCHEMA = 1011 SQLITE_DBSTATUS_CACHE_HIT = 7 SQLITE_DBSTATUS_CACHE_MISS = 8 SQLITE_DBSTATUS_CACHE_SPILL = 12 SQLITE_DBSTATUS_CACHE_USED = 1 SQLITE_DBSTATUS_CACHE_USED_SHARED = 11 SQLITE_DBSTATUS_CACHE_WRITE = 9 SQLITE_DBSTATUS_DEFERRED_FKS = 10 SQLITE_DBSTATUS_LOOKASIDE_HIT = 4 SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL = 6 SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE = 5 SQLITE_DBSTATUS_LOOKASIDE_USED = 0 SQLITE_DBSTATUS_MAX = 12 SQLITE_DBSTATUS_SCHEMA_USED = 2 SQLITE_DBSTATUS_STMT_USED = 3 SQLITE_DEFAULT_AUTOVACUUM = 0 SQLITE_DEFAULT_CACHE_SIZE = -2000 SQLITE_DEFAULT_FILE_FORMAT = 4 SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT = -1 SQLITE_DEFAULT_LOOKASIDE = 40 SQLITE_DEFAULT_MEMSTATUS = 0 SQLITE_DEFAULT_MMAP_SIZE = 0 SQLITE_DEFAULT_PAGE_SIZE = 4096 SQLITE_DEFAULT_PCACHE_INITSZ = 20 SQLITE_DEFAULT_RECURSIVE_TRIGGERS = 0 SQLITE_DEFAULT_SECTOR_SIZE = 4096 SQLITE_DEFAULT_SORTERREF_SIZE = 0x7fffffff SQLITE_DEFAULT_SYNCHRONOUS = 2 SQLITE_DEFAULT_WAL_AUTOCHECKPOINT = 1000 SQLITE_DEFAULT_WAL_SYNCHRONOUS = 2 SQLITE_DEFAULT_WORKER_THREADS = 0 SQLITE_DELETE = 9 SQLITE_DENY = 1 SQLITE_DEPRECATED = 0 SQLITE_DESERIALIZE_FREEONCLOSE = 1 SQLITE_DESERIALIZE_READONLY = 4 SQLITE_DESERIALIZE_RESIZEABLE = 2 SQLITE_DETACH = 25 SQLITE_DETERMINISTIC = 0x000000800 SQLITE_DIRECTONLY = 0x000080000 SQLITE_DONE = 101 SQLITE_DQS = 3 SQLITE_DROP_INDEX = 10 SQLITE_DROP_TABLE = 11 SQLITE_DROP_TEMP_INDEX = 12 SQLITE_DROP_TEMP_TABLE = 13 SQLITE_DROP_TEMP_TRIGGER = 14 SQLITE_DROP_TEMP_VIEW = 15 SQLITE_DROP_TRIGGER = 16 SQLITE_DROP_VIEW = 17 SQLITE_DROP_VTABLE = 30 SQLITE_Defensive = 0x10000000 SQLITE_DeferFKs = 0x00080000 SQLITE_DistinctOpt = 0x00000010 SQLITE_DqsDDL = 0x20000000 SQLITE_DqsDML = 0x40000000 SQLITE_ECEL_DUP = 0x01 SQLITE_ECEL_FACTOR = 0x02 SQLITE_ECEL_OMITREF = 0x08 SQLITE_ECEL_REF = 0x04 SQLITE_EMPTY = 16 SQLITE_ENABLE_COLUMN_METADATA = 1 SQLITE_ENABLE_FTS5 = 1 SQLITE_ENABLE_GEOPOLY = 1 SQLITE_ENABLE_LOCKING_STYLE = 0 SQLITE_ENABLE_MATH_FUNCTIONS = 1 SQLITE_ENABLE_MEMORY_MANAGEMENT = 1 SQLITE_ENABLE_OFFSET_SQL_FUNC = 1 SQLITE_ENABLE_PREUPDATE_HOOK = 1 SQLITE_ENABLE_RBU = 1 SQLITE_ENABLE_RTREE = 1 SQLITE_ENABLE_SESSION = 1 SQLITE_ENABLE_SNAPSHOT = 1 SQLITE_ENABLE_STAT4 = 1 SQLITE_ENABLE_UNLOCK_NOTIFY = 1 SQLITE_ERROR = 1 SQLITE_ERROR_MISSING_COLLSEQ = 257 SQLITE_ERROR_RETRY = 513 SQLITE_ERROR_SNAPSHOT = 769 SQLITE_EXPERIMENTAL = 0 SQLITE_EXTENSION_INIT1 = 0 SQLITE_EXTENSION_INIT3 = 0 SQLITE_EnableQPSG = 0x00800000 SQLITE_EnableTrigger = 0x00040000 SQLITE_EnableView = 0x80000000 SQLITE_FAIL = 3 SQLITE_FAULTINJECTOR_COUNT = 1 SQLITE_FAULTINJECTOR_MALLOC = 0 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE = 31 SQLITE_FCNTL_BUSYHANDLER = 15 SQLITE_FCNTL_CHUNK_SIZE = 6 SQLITE_FCNTL_CKPT_DONE = 37 SQLITE_FCNTL_CKPT_START = 39 SQLITE_FCNTL_CKSM_FILE = 41 SQLITE_FCNTL_COMMIT_ATOMIC_WRITE = 32 SQLITE_FCNTL_COMMIT_PHASETWO = 22 SQLITE_FCNTL_DATA_VERSION = 35 SQLITE_FCNTL_DB_UNCHANGED = 0xca093fa0 SQLITE_FCNTL_EXTERNAL_READER = 40 SQLITE_FCNTL_FILE_POINTER = 7 SQLITE_FCNTL_GET_LOCKPROXYFILE = 2 SQLITE_FCNTL_HAS_MOVED = 20 SQLITE_FCNTL_JOURNAL_POINTER = 28 SQLITE_FCNTL_LAST_ERRNO = 4 SQLITE_FCNTL_LOCKSTATE = 1 SQLITE_FCNTL_LOCK_TIMEOUT = 34 SQLITE_FCNTL_MMAP_SIZE = 18 SQLITE_FCNTL_OVERWRITE = 11 SQLITE_FCNTL_PDB = 30 SQLITE_FCNTL_PERSIST_WAL = 10 SQLITE_FCNTL_POWERSAFE_OVERWRITE = 13 SQLITE_FCNTL_PRAGMA = 14 SQLITE_FCNTL_RBU = 26 SQLITE_FCNTL_RBUCNT = 5149216 SQLITE_FCNTL_RESERVE_BYTES = 38 SQLITE_FCNTL_RESET_CACHE = 42 SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE = 33 SQLITE_FCNTL_SET_LOCKPROXYFILE = 3 SQLITE_FCNTL_SIZE_HINT = 5 SQLITE_FCNTL_SIZE_LIMIT = 36 SQLITE_FCNTL_SYNC = 21 SQLITE_FCNTL_SYNC_OMITTED = 8 SQLITE_FCNTL_TEMPFILENAME = 16 SQLITE_FCNTL_TRACE = 19 SQLITE_FCNTL_VFSNAME = 12 SQLITE_FCNTL_VFS_POINTER = 27 SQLITE_FCNTL_WAL_BLOCK = 24 SQLITE_FCNTL_WIN32_AV_RETRY = 9 SQLITE_FCNTL_WIN32_GET_HANDLE = 29 SQLITE_FCNTL_WIN32_SET_HANDLE = 23 SQLITE_FCNTL_ZIPVFS = 25 SQLITE_FILE_HEADER = "SQLite format 3" SQLITE_FLOAT = 2 SQLITE_FORMAT = 24 SQLITE_FP_PRECISION_LIMIT = 100000000 SQLITE_FRAME_MAGIC = 0x879fb71e SQLITE_FULL = 13 SQLITE_FUNCTION = 31 SQLITE_FUNC_ANYORDER = 0x08000000 SQLITE_FUNC_BUILTIN = 0x00800000 SQLITE_FUNC_CASE = 0x0008 SQLITE_FUNC_CONSTANT = 0x0800 SQLITE_FUNC_COUNT = 0x0100 SQLITE_FUNC_DIRECT = 0x00080000 SQLITE_FUNC_ENCMASK = 0x0003 SQLITE_FUNC_EPHEM = 0x0010 SQLITE_FUNC_HASH_SZ = 23 SQLITE_FUNC_INLINE = 0x00400000 SQLITE_FUNC_INTERNAL = 0x00040000 SQLITE_FUNC_LENGTH = 0x0040 SQLITE_FUNC_LIKE = 0x0004 SQLITE_FUNC_MINMAX = 0x1000 SQLITE_FUNC_NEEDCOLL = 0x0020 SQLITE_FUNC_SLOCHNG = 0x2000 SQLITE_FUNC_SUBTYPE = 0x00100000 SQLITE_FUNC_TEST = 0x4000 SQLITE_FUNC_TYPEOF = 0x0080 SQLITE_FUNC_UNLIKELY = 0x0400 SQLITE_FUNC_UNSAFE = 0x00200000 SQLITE_FUNC_WINDOW = 0x00010000 SQLITE_FactorOutConst = 0x00000008 SQLITE_FlttnUnionAll = 0x00800000 SQLITE_ForeignKeys = 0x00004000 SQLITE_Fts3Tokenizer = 0x00400000 SQLITE_FullColNames = 0x00000004 SQLITE_FullFSync = 0x00000008 SQLITE_GET_LOCKPROXYFILE = 2 SQLITE_GroupByOrder = 0x00000004 SQLITE_HASH_H = 0 SQLITE_HAVE_C99_MATH_FUNCS = 1 SQLITE_IDXTYPE_APPDEF = 0 SQLITE_IDXTYPE_IPK = 3 SQLITE_IDXTYPE_PRIMARYKEY = 2 SQLITE_IDXTYPE_UNIQUE = 1 SQLITE_IGNORE = 2 SQLITE_INDEX_CONSTRAINT_EQ = 2 SQLITE_INDEX_CONSTRAINT_FUNCTION = 150 SQLITE_INDEX_CONSTRAINT_GE = 32 SQLITE_INDEX_CONSTRAINT_GLOB = 66 SQLITE_INDEX_CONSTRAINT_GT = 4 SQLITE_INDEX_CONSTRAINT_IS = 72 SQLITE_INDEX_CONSTRAINT_ISNOT = 69 SQLITE_INDEX_CONSTRAINT_ISNOTNULL = 70 SQLITE_INDEX_CONSTRAINT_ISNULL = 71 SQLITE_INDEX_CONSTRAINT_LE = 8 SQLITE_INDEX_CONSTRAINT_LIKE = 65 SQLITE_INDEX_CONSTRAINT_LIMIT = 73 SQLITE_INDEX_CONSTRAINT_LT = 16 SQLITE_INDEX_CONSTRAINT_MATCH = 64 SQLITE_INDEX_CONSTRAINT_NE = 68 SQLITE_INDEX_CONSTRAINT_OFFSET = 74 SQLITE_INDEX_CONSTRAINT_REGEXP = 67 SQLITE_INDEX_SCAN_UNIQUE = 1 SQLITE_INNOCUOUS = 0x000200000 SQLITE_INSERT = 18 SQLITE_INTEGER = 1 SQLITE_INTEGRITY_CHECK_ERROR_MAX = 100 SQLITE_INTERNAL = 2 SQLITE_INTERRUPT = 9 SQLITE_IOCAP_ATOMIC = 0x00000001 SQLITE_IOCAP_ATOMIC16K = 0x00000040 SQLITE_IOCAP_ATOMIC1K = 0x00000004 SQLITE_IOCAP_ATOMIC2K = 0x00000008 SQLITE_IOCAP_ATOMIC32K = 0x00000080 SQLITE_IOCAP_ATOMIC4K = 0x00000010 SQLITE_IOCAP_ATOMIC512 = 0x00000002 SQLITE_IOCAP_ATOMIC64K = 0x00000100 SQLITE_IOCAP_ATOMIC8K = 0x00000020 SQLITE_IOCAP_BATCH_ATOMIC = 0x00004000 SQLITE_IOCAP_IMMUTABLE = 0x00002000 SQLITE_IOCAP_POWERSAFE_OVERWRITE = 0x00001000 SQLITE_IOCAP_SAFE_APPEND = 0x00000200 SQLITE_IOCAP_SEQUENTIAL = 0x00000400 SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN = 0x00000800 SQLITE_IOERR = 10 SQLITE_IOERR_ACCESS = 3338 SQLITE_IOERR_AUTH = 7178 SQLITE_IOERR_BEGIN_ATOMIC = 7434 SQLITE_IOERR_BLOCKED = 2826 SQLITE_IOERR_CHECKRESERVEDLOCK = 3594 SQLITE_IOERR_CLOSE = 4106 SQLITE_IOERR_COMMIT_ATOMIC = 7690 SQLITE_IOERR_CONVPATH = 6666 SQLITE_IOERR_CORRUPTFS = 8458 SQLITE_IOERR_DATA = 8202 SQLITE_IOERR_DELETE = 2570 SQLITE_IOERR_DELETE_NOENT = 5898 SQLITE_IOERR_DIR_CLOSE = 4362 SQLITE_IOERR_DIR_FSYNC = 1290 SQLITE_IOERR_FSTAT = 1802 SQLITE_IOERR_FSYNC = 1034 SQLITE_IOERR_GETTEMPPATH = 6410 SQLITE_IOERR_LOCK = 3850 SQLITE_IOERR_MMAP = 6154 SQLITE_IOERR_NOMEM = 3082 SQLITE_IOERR_NOMEM_BKPT = 3082 SQLITE_IOERR_RDLOCK = 2314 SQLITE_IOERR_READ = 266 SQLITE_IOERR_ROLLBACK_ATOMIC = 7946 SQLITE_IOERR_SEEK = 5642 SQLITE_IOERR_SHMLOCK = 5130 SQLITE_IOERR_SHMMAP = 5386 SQLITE_IOERR_SHMOPEN = 4618 SQLITE_IOERR_SHMSIZE = 4874 SQLITE_IOERR_SHORT_READ = 522 SQLITE_IOERR_TRUNCATE = 1546 SQLITE_IOERR_UNLOCK = 2058 SQLITE_IOERR_VNODE = 6922 SQLITE_IOERR_WRITE = 778 SQLITE_IgnoreChecks = 0x00000200 SQLITE_IndexedExpr = 0x01000000 SQLITE_JUMPIFNULL = 0x10 SQLITE_LAST_ERRNO = 4 SQLITE_LIKE_DOESNT_MATCH_BLOBS = 1 SQLITE_LIMIT_ATTACHED = 7 SQLITE_LIMIT_COLUMN = 2 SQLITE_LIMIT_COMPOUND_SELECT = 4 SQLITE_LIMIT_EXPR_DEPTH = 3 SQLITE_LIMIT_FUNCTION_ARG = 6 SQLITE_LIMIT_LENGTH = 0 SQLITE_LIMIT_LIKE_PATTERN_LENGTH = 8 SQLITE_LIMIT_SQL_LENGTH = 1 SQLITE_LIMIT_TRIGGER_DEPTH = 10 SQLITE_LIMIT_VARIABLE_NUMBER = 9 SQLITE_LIMIT_VDBE_OP = 5 SQLITE_LIMIT_WORKER_THREADS = 11 SQLITE_LITTLEENDIAN = 1 SQLITE_LOCKED = 6 SQLITE_LOCKED_SHAREDCACHE = 262 SQLITE_LOCKED_VTAB = 518 SQLITE_LOCKFILEEX_FLAGS = 1 SQLITE_LOCKFILE_FLAGS = 3 SQLITE_LOCK_EXCLUSIVE = 4 SQLITE_LOCK_NONE = 0 SQLITE_LOCK_PENDING = 3 SQLITE_LOCK_RESERVED = 2 SQLITE_LOCK_SHARED = 1 SQLITE_LegacyAlter = 0x04000000 SQLITE_LegacyFileFmt = 0x00000002 SQLITE_LoadExtFunc = 0x00020000 SQLITE_LoadExtension = 0x00010000 SQLITE_MALLOC_SOFT_LIMIT = 1024 SQLITE_MATCH = 0 SQLITE_MAX_ALLOCATION_SIZE = 2147483391 SQLITE_MAX_ATTACHED = 10 SQLITE_MAX_COLUMN = 2000 SQLITE_MAX_COMPOUND_SELECT = 500 SQLITE_MAX_DB = 12 SQLITE_MAX_DEFAULT_PAGE_SIZE = 8192 SQLITE_MAX_EXPR_DEPTH = 1000 SQLITE_MAX_FILE_FORMAT = 4 SQLITE_MAX_FUNCTION_ARG = 127 SQLITE_MAX_LENGTH = 1000000000 SQLITE_MAX_LIKE_PATTERN_LENGTH = 50000 SQLITE_MAX_MEMORY = 0 SQLITE_MAX_MMAP_SIZE = 0x7fff0000 SQLITE_MAX_PAGE_COUNT = 1073741823 SQLITE_MAX_PAGE_SIZE = 65536 SQLITE_MAX_PATHLEN = 260 SQLITE_MAX_PMASZ = 536870912 SQLITE_MAX_PREPARE_RETRY = 25 SQLITE_MAX_SCHEMA_RETRY = 50 SQLITE_MAX_SQL_LENGTH = 1000000000 SQLITE_MAX_SRCLIST = 200 SQLITE_MAX_SYMLINK = 200 SQLITE_MAX_TRIGGER_DEPTH = 1000 SQLITE_MAX_VARIABLE_NUMBER = 32766 SQLITE_MAX_VDBE_OP = 250000000 SQLITE_MAX_WORKER_THREADS = 8 SQLITE_MEMDB_DEFAULT_MAXSIZE = 1073741824 SQLITE_MISMATCH = 20 SQLITE_MISUSE = 21 SQLITE_MSVC_H = 0 SQLITE_MUTEX_APPDEF = 1 SQLITE_MUTEX_FAST = 0 SQLITE_MUTEX_NOOP = 1 SQLITE_MUTEX_RECURSIVE = 1 SQLITE_MUTEX_STATIC_APP1 = 8 SQLITE_MUTEX_STATIC_APP2 = 9 SQLITE_MUTEX_STATIC_APP3 = 10 SQLITE_MUTEX_STATIC_LRU = 6 SQLITE_MUTEX_STATIC_LRU2 = 7 SQLITE_MUTEX_STATIC_MAIN = 2 SQLITE_MUTEX_STATIC_MASTER = 2 SQLITE_MUTEX_STATIC_MEM = 3 SQLITE_MUTEX_STATIC_MEM2 = 4 SQLITE_MUTEX_STATIC_OPEN = 4 SQLITE_MUTEX_STATIC_PMEM = 7 SQLITE_MUTEX_STATIC_PRNG = 5 SQLITE_MUTEX_STATIC_TEMPDIR = 11 SQLITE_MUTEX_STATIC_VFS1 = 11 SQLITE_MUTEX_STATIC_VFS2 = 12 SQLITE_MUTEX_STATIC_VFS3 = 13 SQLITE_MX_JUMP_OPCODE = 64 SQLITE_MinMaxOpt = 0x00010000 SQLITE_NOLFS = 22 SQLITE_NOMATCH = 1 SQLITE_NOMEM = 7 SQLITE_NOMEM_BKPT = 7 SQLITE_NOTADB = 26 SQLITE_NOTFOUND = 12 SQLITE_NOTICE = 27 SQLITE_NOTICE_RBU = 795 SQLITE_NOTICE_RECOVER_ROLLBACK = 539 SQLITE_NOTICE_RECOVER_WAL = 283 SQLITE_NOTNULL = 0x90 SQLITE_NOWILDCARDMATCH = 2 SQLITE_NO_TSAN = 0 SQLITE_NTUNE = 6 SQLITE_NULL = 5 SQLITE_NULLEQ = 0x80 SQLITE_N_BTREE_META = 16 SQLITE_N_KEYWORD = 147 SQLITE_N_LIMIT = 12 SQLITE_N_STDTYPE = 6 SQLITE_NoCkptOnClose = 0x00000800 SQLITE_NoSchemaError = 0x08000000 SQLITE_NullCallback = 0x00000100 SQLITE_OK = 0 SQLITE_OK_LOAD_PERMANENTLY = 256 SQLITE_OK_SYMLINK = 512 SQLITE_OPEN_AUTOPROXY = 0x00000020 SQLITE_OPEN_CREATE = 0x00000004 SQLITE_OPEN_DELETEONCLOSE = 0x00000008 SQLITE_OPEN_EXCLUSIVE = 0x00000010 SQLITE_OPEN_EXRESCODE = 0x02000000 SQLITE_OPEN_FULLMUTEX = 0x00010000 SQLITE_OPEN_MAIN_DB = 0x00000100 SQLITE_OPEN_MAIN_JOURNAL = 0x00000800 SQLITE_OPEN_MASTER_JOURNAL = 0x00004000 SQLITE_OPEN_MEMORY = 0x00000080 SQLITE_OPEN_NOFOLLOW = 0x01000000 SQLITE_OPEN_NOMUTEX = 0x00008000 SQLITE_OPEN_PRIVATECACHE = 0x00040000 SQLITE_OPEN_READONLY = 0x00000001 SQLITE_OPEN_READWRITE = 0x00000002 SQLITE_OPEN_SHAREDCACHE = 0x00020000 SQLITE_OPEN_SUBJOURNAL = 0x00002000 SQLITE_OPEN_SUPER_JOURNAL = 0x00004000 SQLITE_OPEN_TEMP_DB = 0x00000200 SQLITE_OPEN_TEMP_JOURNAL = 0x00001000 SQLITE_OPEN_TRANSIENT_DB = 0x00000400 SQLITE_OPEN_URI = 0x00000040 SQLITE_OPEN_WAL = 0x00080000 SQLITE_OS_KV = 0 SQLITE_OS_OTHER = 0 SQLITE_OS_SETUP_H = 0 SQLITE_OS_UNIX = 0 SQLITE_OS_WIN = 1 SQLITE_OS_WINCE = 0 SQLITE_OS_WINNT = 1 SQLITE_OS_WINRT = 0 SQLITE_OS_WIN_H = 0 SQLITE_OS_WIN_THREADS = 1 SQLITE_OmitNoopJoin = 0x00000100 SQLITE_OmitOrderBy = 0x00040000 SQLITE_OrderByIdxJoin = 0x00000040 SQLITE_PAGER_H = 0 SQLITE_PERM = 3 SQLITE_POWERSAFE_OVERWRITE = 1 SQLITE_PRAGMA = 19 SQLITE_PREPARE_MASK = 0x0f SQLITE_PREPARE_NORMALIZE = 0x02 SQLITE_PREPARE_NO_VTAB = 0x04 SQLITE_PREPARE_PERSISTENT = 0x01 SQLITE_PREPARE_SAVESQL = 0x80 SQLITE_PRINTF_INTERNAL = 0x01 SQLITE_PRINTF_MALLOCED = 0x04 SQLITE_PRINTF_SQLFUNC = 0x02 SQLITE_PRINT_BUF_SIZE = 70 SQLITE_PRIVATE = 0 SQLITE_PROTOCOL = 15 SQLITE_PTRSIZE = 8 SQLITE_PropagateConst = 0x00008000 SQLITE_PushDown = 0x00001000 SQLITE_QUERY_PLANNER_LIMIT = 20000 SQLITE_QUERY_PLANNER_LIMIT_INCR = 1000 SQLITE_QueryFlattener = 0x00000001 SQLITE_QueryOnly = 0x00100000 SQLITE_RANGE = 25 SQLITE_RBU_STATE_CHECKPOINT = 3 SQLITE_RBU_STATE_DONE = 4 SQLITE_RBU_STATE_ERROR = 5 SQLITE_RBU_STATE_MOVE = 2 SQLITE_RBU_STATE_OAL = 1 SQLITE_RBU_UPDATE_CACHESIZE = 16 SQLITE_READ = 20 SQLITE_READONLY = 8 SQLITE_READONLY_CANTINIT = 1288 SQLITE_READONLY_CANTLOCK = 520 SQLITE_READONLY_DBMOVED = 1032 SQLITE_READONLY_DIRECTORY = 1544 SQLITE_READONLY_RECOVERY = 264 SQLITE_READONLY_ROLLBACK = 776 SQLITE_RECURSIVE = 33 SQLITE_REINDEX = 27 SQLITE_REPLACE = 5 SQLITE_ROLLBACK = 1 SQLITE_ROW = 100 SQLITE_ReadUncommit = 0x00000400 SQLITE_RecTriggers = 0x00002000 SQLITE_ReleaseReg = 0x00400000 SQLITE_ResetDatabase = 0x02000000 SQLITE_ReverseOrder = 0x00001000 SQLITE_SAVEPOINT = 32 SQLITE_SCANSTAT_COMPLEX = 0x0001 SQLITE_SCANSTAT_EST = 2 SQLITE_SCANSTAT_EXPLAIN = 4 SQLITE_SCANSTAT_NAME = 3 SQLITE_SCANSTAT_NCYCLE = 7 SQLITE_SCANSTAT_NLOOP = 0 SQLITE_SCANSTAT_NVISIT = 1 SQLITE_SCANSTAT_PARENTID = 6 SQLITE_SCANSTAT_SELECTID = 5 SQLITE_SCHEMA = 17 SQLITE_SELECT = 21 SQLITE_SERIALIZE_NOCOPY = 0x001 SQLITE_SESSION_CONFIG_STRMSIZE = 1 SQLITE_SESSION_OBJCONFIG_SIZE = 1 SQLITE_SET_LOCKPROXYFILE = 3 SQLITE_SHM_EXCLUSIVE = 8 SQLITE_SHM_LOCK = 2 SQLITE_SHM_NLOCK = 8 SQLITE_SHM_SHARED = 4 SQLITE_SHM_UNLOCK = 1 SQLITE_SORTER_PMASZ = 250 SQLITE_SOUNDEX = 1 SQLITE_SOURCE_ID = "2023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da" SQLITE_SO_ASC = 0 SQLITE_SO_DESC = 1 SQLITE_SO_UNDEFINED = -1 SQLITE_STAT4_SAMPLES = 24 SQLITE_STATE_BUSY = 0x6d SQLITE_STATE_CLOSED = 0xce SQLITE_STATE_ERROR = 0xd5 SQLITE_STATE_OPEN = 0x76 SQLITE_STATE_SICK = 0xba SQLITE_STATE_ZOMBIE = 0xa7 SQLITE_STATUS_MALLOC_COUNT = 9 SQLITE_STATUS_MALLOC_SIZE = 5 SQLITE_STATUS_MEMORY_USED = 0 SQLITE_STATUS_PAGECACHE_OVERFLOW = 2 SQLITE_STATUS_PAGECACHE_SIZE = 7 SQLITE_STATUS_PAGECACHE_USED = 1 SQLITE_STATUS_PARSER_STACK = 6 SQLITE_STATUS_SCRATCH_OVERFLOW = 4 SQLITE_STATUS_SCRATCH_SIZE = 8 SQLITE_STATUS_SCRATCH_USED = 3 SQLITE_STDCALL = 0 SQLITE_STMTJRNL_SPILL = 65536 SQLITE_STMTSTATUS_AUTOINDEX = 3 SQLITE_STMTSTATUS_FILTER_HIT = 8 SQLITE_STMTSTATUS_FILTER_MISS = 7 SQLITE_STMTSTATUS_FULLSCAN_STEP = 1 SQLITE_STMTSTATUS_MEMUSED = 99 SQLITE_STMTSTATUS_REPREPARE = 5 SQLITE_STMTSTATUS_RUN = 6 SQLITE_STMTSTATUS_SORT = 2 SQLITE_STMTSTATUS_VM_STEP = 4 SQLITE_SUBTYPE = 0x000100000 SQLITE_SYNC_DATAONLY = 0x00010 SQLITE_SYNC_FULL = 0x00003 SQLITE_SYNC_NORMAL = 0x00002 SQLITE_SYSAPI = 0 SQLITE_SYSTEM_MALLOC = 1 SQLITE_SeekScan = 0x00020000 SQLITE_ShortColNames = 0x00000040 SQLITE_SimplifyJoin = 0x00002000 SQLITE_SkipScan = 0x00004000 SQLITE_Stat4 = 0x00000800 SQLITE_TCLAPI = 0 SQLITE_TEMP_FILE_PREFIX = "etilqs_" SQLITE_TEMP_STORE = 1 SQLITE_TESTCTRL_ALWAYS = 13 SQLITE_TESTCTRL_ASSERT = 12 SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS = 10 SQLITE_TESTCTRL_BITVEC_TEST = 8 SQLITE_TESTCTRL_BYTEORDER = 22 SQLITE_TESTCTRL_EXPLAIN_STMT = 19 SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS = 29 SQLITE_TESTCTRL_FAULT_INSTALL = 9 SQLITE_TESTCTRL_FIRST = 5 SQLITE_TESTCTRL_IMPOSTER = 25 SQLITE_TESTCTRL_INTERNAL_FUNCTIONS = 17 SQLITE_TESTCTRL_ISINIT = 23 SQLITE_TESTCTRL_ISKEYWORD = 16 SQLITE_TESTCTRL_LAST = 33 SQLITE_TESTCTRL_LOCALTIME_FAULT = 18 SQLITE_TESTCTRL_LOGEST = 33 SQLITE_TESTCTRL_NEVER_CORRUPT = 20 SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD = 19 SQLITE_TESTCTRL_OPTIMIZATIONS = 15 SQLITE_TESTCTRL_PARSER_COVERAGE = 26 SQLITE_TESTCTRL_PENDING_BYTE = 11 SQLITE_TESTCTRL_PRNG_RESET = 7 SQLITE_TESTCTRL_PRNG_RESTORE = 6 SQLITE_TESTCTRL_PRNG_SAVE = 5 SQLITE_TESTCTRL_PRNG_SEED = 28 SQLITE_TESTCTRL_RESERVE = 14 SQLITE_TESTCTRL_RESULT_INTREAL = 27 SQLITE_TESTCTRL_SCRATCHMALLOC = 17 SQLITE_TESTCTRL_SEEK_COUNT = 30 SQLITE_TESTCTRL_SORTER_MMAP = 24 SQLITE_TESTCTRL_TRACEFLAGS = 31 SQLITE_TESTCTRL_TUNE = 32 SQLITE_TESTCTRL_VDBE_COVERAGE = 21 SQLITE_TEXT = 3 SQLITE_THREADSAFE = 1 SQLITE_THREADS_IMPLEMENTED = 1 SQLITE_TOKEN_KEYWORD = 0x2 SQLITE_TOKEN_QUOTED = 0x1 SQLITE_TOOBIG = 18 SQLITE_TRACE_CLOSE = 0x08 SQLITE_TRACE_LEGACY = 0x40 SQLITE_TRACE_NONLEGACY_MASK = 0x0f SQLITE_TRACE_PROFILE = 0x02 SQLITE_TRACE_ROW = 0x04 SQLITE_TRACE_STMT = 0x01 SQLITE_TRACE_XPROFILE = 0x80 SQLITE_TRANSACTION = 22 SQLITE_TXN_NONE = 0 SQLITE_TXN_READ = 1 SQLITE_TXN_WRITE = 2 SQLITE_Transitive = 0x00000080 SQLITE_TriggerEQP = 0x01000000 SQLITE_TrustedSchema = 0x00000080 SQLITE_UPDATE = 23 SQLITE_USE_MALLOC_H = 0 SQLITE_USE_MSIZE = 0 SQLITE_USE_URI = 0 SQLITE_UTF16 = 4 SQLITE_UTF16BE = 3 SQLITE_UTF16LE = 2 SQLITE_UTF16NATIVE = 2 SQLITE_UTF16_ALIGNED = 8 SQLITE_UTF8 = 1 SQLITE_VDBEINT_H = 0 SQLITE_VDBE_H = 0 SQLITE_VERSION = "3.41.2" SQLITE_VERSION_NUMBER = 3041002 SQLITE_VTABRISK_High = 2 SQLITE_VTABRISK_Low = 0 SQLITE_VTABRISK_Normal = 1 SQLITE_VTAB_CONSTRAINT_SUPPORT = 1 SQLITE_VTAB_DIRECTONLY = 3 SQLITE_VTAB_INNOCUOUS = 2 SQLITE_WAL_H = 0 SQLITE_WARNING = 28 SQLITE_WARNING_AUTOINDEX = 284 SQLITE_WHEREINT_H = 0 SQLITE_WIN32_CREATEFILEMAPPINGA = 1 SQLITE_WIN32_DATA_DIRECTORY_TYPE = 1 SQLITE_WIN32_GETVERSIONEX = 1 SQLITE_WIN32_HAS_ANSI = 0 SQLITE_WIN32_HAS_WIDE = 0 SQLITE_WIN32_IOERR_RETRY = 10 SQLITE_WIN32_IOERR_RETRY_DELAY = 25 SQLITE_WIN32_MAX_ERRMSG_CHARS = 1024 SQLITE_WIN32_MAX_PATH_BYTES = 1040 SQLITE_WIN32_MAX_PATH_CHARS = 260 SQLITE_WIN32_TEMP_DIRECTORY_TYPE = 2 SQLITE_WINNT_MAX_PATH_CHARS = 32767 SQLITE_WSD = 0 SQLITE_WindowFunc = 0x00000002 SQLITE_WriteSchema = 0x00000001 SRT_Coroutine = 13 SRT_Discard = 4 SRT_DistFifo = 5 SRT_DistQueue = 6 SRT_EphemTab = 12 SRT_Except = 2 SRT_Exists = 3 SRT_Fifo = 8 SRT_Mem = 10 SRT_Output = 9 SRT_Queue = 7 SRT_Set = 11 SRT_Table = 14 SRT_Union = 1 SRT_Upfrom = 15 SSF_AVAILABLE = 0x00000002 SSF_INDICATOR = 0x00000004 SSF_SOUNDSENTRYON = 0x00000001 SSGF_DISPLAY = 3 SSGF_NONE = 0 SSIZE_MAX = 9223372036854775807 SSL_F12_ERROR_TEXT_LENGTH = 256 SSL_HPKP_HEADER_COUNT = 2 SSL_HPKP_PKP_HEADER_INDEX = 0 SSL_HPKP_PKP_RO_HEADER_INDEX = 1 SSL_KEY_PIN_ERROR_TEXT_LENGTH = 512 SSTF_BORDER = 2 SSTF_CHARS = 1 SSTF_DISPLAY = 3 SSTF_NONE = 0 SSWF_CUSTOM = 4 SSWF_DISPLAY = 3 SSWF_NONE = 0 SSWF_TITLE = 1 SSWF_WINDOW = 2 SS_BITMAP = 14 SS_BLACKFRAME = 7 SS_BLACKRECT = 4 SS_CENTER = 1 SS_CENTERIMAGE = 512 SS_EDITCONTROL = 8192 SS_ELLIPSISMASK = 49152 SS_ENDELLIPSIS = 16384 SS_ENHMETAFILE = 15 SS_ETCHEDFRAME = 18 SS_ETCHEDHORZ = 16 SS_ETCHEDVERT = 17 SS_GRAYFRAME = 8 SS_GRAYRECT = 5 SS_ICON = 3 SS_LEFT = 0 SS_LEFTNOWORDWRAP = 12 SS_NOPREFIX = 128 SS_NOTIFY = 256 SS_OWNERDRAW = 13 SS_PATHELLIPSIS = 32768 SS_REALSIZECONTROL = 64 SS_REALSIZEIMAGE = 2048 SS_RIGHT = 2 SS_RIGHTJUST = 1024 SS_SIMPLE = 11 SS_SUNKEN = 4096 SS_TYPEMASK = 31 SS_USERITEM = 10 SS_WHITEFRAME = 9 SS_WHITERECT = 6 SS_WORDELLIPSIS = 49152 STACK_SIZE_PARAM_IS_A_RESERVATION = 0x10000 STAMP_AXESLIST = 134245473 STAMP_CFF2 = 134248035 STAMP_DESIGNVECTOR = 134248036 STAMP_TRUETYPE_VARIATION = 134248052 STANDARD_RIGHTS_ALL = 2031616 STANDARD_RIGHTS_EXECUTE = 131072 STANDARD_RIGHTS_READ = 131072 STANDARD_RIGHTS_REQUIRED = 983040 STANDARD_RIGHTS_WRITE = 131072 STARTDOC = 10 STARTF_FORCEOFFFEEDBACK = 0x00000080 STARTF_FORCEONFEEDBACK = 0x00000040 STARTF_PREVENTPINNING = 0x00002000 STARTF_RUNFULLSCREEN = 0x00000020 STARTF_TITLEISAPPID = 0x00001000 STARTF_TITLEISLINKNAME = 0x00000800 STARTF_USECOUNTCHARS = 0x00000008 STARTF_USEFILLATTRIBUTE = 0x00000010 STARTF_USEHOTKEY = 0x00000200 STARTF_USEPOSITION = 0x00000004 STARTF_USESHOWWINDOW = 0x00000001 STARTF_USESIZE = 0x00000002 STARTF_USESTDHANDLES = 0x00000100 START_PAGE_GENERAL = 0xffffffff STATE_SYSTEM_ALERT_HIGH = 0x10000000 STATE_SYSTEM_ALERT_LOW = 0x04000000 STATE_SYSTEM_ALERT_MEDIUM = 0x08000000 STATE_SYSTEM_ANIMATED = 0x00004000 STATE_SYSTEM_BUSY = 0x00000800 STATE_SYSTEM_CHECKED = 0x00000010 STATE_SYSTEM_COLLAPSED = 0x00000400 STATE_SYSTEM_DEFAULT = 0x00000100 STATE_SYSTEM_EXPANDED = 0x00000200 STATE_SYSTEM_EXTSELECTABLE = 0x02000000 STATE_SYSTEM_FLOATING = 0x00001000 STATE_SYSTEM_FOCUSABLE = 0x00100000 STATE_SYSTEM_FOCUSED = 0x00000004 STATE_SYSTEM_HOTTRACKED = 0x00000080 STATE_SYSTEM_INDETERMINATE = 32 STATE_SYSTEM_INVISIBLE = 0x00008000 STATE_SYSTEM_LINKED = 0x00400000 STATE_SYSTEM_MARQUEED = 0x00002000 STATE_SYSTEM_MIXED = 0x00000020 STATE_SYSTEM_MOVEABLE = 0x00040000 STATE_SYSTEM_MULTISELECTABLE = 0x01000000 STATE_SYSTEM_OFFSCREEN = 0x00010000 STATE_SYSTEM_PRESSED = 0x00000008 STATE_SYSTEM_PROTECTED = 0x20000000 STATE_SYSTEM_READONLY = 0x00000040 STATE_SYSTEM_SELECTABLE = 0x00200000 STATE_SYSTEM_SELECTED = 0x00000002 STATE_SYSTEM_SELFVOICING = 0x00080000 STATE_SYSTEM_SIZEABLE = 0x00020000 STATE_SYSTEM_TRAVERSED = 0x00800000 STATE_SYSTEM_UNAVAILABLE = 0x00000001 STATE_SYSTEM_VALID = 0x3FFFFFFF STAT_GET_NDLT = 4 STAT_GET_NEQ = 2 STAT_GET_NLT = 3 STAT_GET_ROWID = 1 STAT_GET_STAT1 = 0 STDAPICALLTYPE = 0 STDERR_FILENO = 2 STDIN_FILENO = 0 STDMETHODCALLTYPE = 0 STDOLE2_LCID = 0x0000 STDOLE2_MAJORVERNUM = 0x2 STDOLE2_MINORVERNUM = 0x0 STDOLE_LCID = 0x0000 STDOLE_MAJORVERNUM = 0x1 STDOLE_MINORVERNUM = 0x0 STDOUT_FILENO = 1 STGFMT_ANY = 4 STGFMT_DOCFILE = 5 STGFMT_DOCUMENT = 0 STGFMT_FILE = 3 STGFMT_NATIVE = 1 STGFMT_STORAGE = 0 STGM_CONVERT = 131072 STGM_CREATE = 4096 STGM_DELETEONRELEASE = 67108864 STGM_DIRECT = 0 STGM_DIRECT_SWMR = 4194304 STGM_FAILIFTHERE = 0 STGM_NOSCRATCH = 1048576 STGM_NOSNAPSHOT = 2097152 STGM_PRIORITY = 262144 STGM_READ = 0 STGM_READWRITE = 2 STGM_SHARE_DENY_NONE = 64 STGM_SHARE_DENY_READ = 48 STGM_SHARE_DENY_WRITE = 32 STGM_SHARE_EXCLUSIVE = 16 STGM_SIMPLE = 134217728 STGM_TRANSACTED = 65536 STGM_WRITE = 1 STGOPTIONS_VERSION = 2 STGTY_REPEAT = 256 STG_LAYOUT_INTERLEAVED = 1 STG_LAYOUT_SEQUENTIAL = 0 STG_TOEND = 4294967295 STM_GETICON = 0x0171 STM_GETIMAGE = 0x0173 STM_MSGMAX = 0x0174 STM_SETICON = 0x0170 STM_SETIMAGE = 0x0172 STN_CLICKED = 0 STN_DBLCLK = 1 STN_DISABLE = 3 STN_ENABLE = 2 STOCK_LAST = 19 STREAM_CLEAR_ENCRYPTION = 0x00000004 STREAM_CONTAINS_PROPERTIES = 0x00000004 STREAM_CONTAINS_SECURITY = 0x00000002 STREAM_MODIFIED_WHEN_READ = 0x00000001 STREAM_NORMAL_ATTRIBUTE = 0x00000000 STREAM_SET_ENCRYPTION = 0x00000003 STREAM_SPARSE_ATTRIBUTE = 0x00000008 STRETCHBLT = 2048 STRETCH_ANDSCANS = 1 STRETCH_DELETESCANS = 3 STRETCH_HALFTONE = 4 STRETCH_ORSCANS = 2 STRICT = 1 STRUNCATE = 80 STYLE_DESCRIPTION_SIZE = 32 ST_ADVISE = 0x0002 ST_BLOCKED = 0x0008 ST_BLOCKNEXT = 0x0080 ST_CLIENT = 0x0010 ST_CONNECTED = 0x0001 ST_INLIST = 0x0040 ST_ISLOCAL = 0x0004 ST_ISSELF = 0x0100 ST_TERMINATED = 0x0020 SUBLANG_AFRIKAANS_SOUTH_AFRICA = 0x01 SUBLANG_ALBANIAN_ALBANIA = 0x01 SUBLANG_ALSATIAN_FRANCE = 0x01 SUBLANG_AMHARIC_ETHIOPIA = 0x01 SUBLANG_ARABIC_ALGERIA = 0x05 SUBLANG_ARABIC_BAHRAIN = 0x0f SUBLANG_ARABIC_EGYPT = 0x03 SUBLANG_ARABIC_IRAQ = 0x02 SUBLANG_ARABIC_JORDAN = 0x0b SUBLANG_ARABIC_KUWAIT = 0x0d SUBLANG_ARABIC_LEBANON = 0x0c SUBLANG_ARABIC_LIBYA = 0x04 SUBLANG_ARABIC_MOROCCO = 0x06 SUBLANG_ARABIC_OMAN = 0x08 SUBLANG_ARABIC_QATAR = 0x10 SUBLANG_ARABIC_SAUDI_ARABIA = 0x01 SUBLANG_ARABIC_SYRIA = 0x0a SUBLANG_ARABIC_TUNISIA = 0x07 SUBLANG_ARABIC_UAE = 0x0e SUBLANG_ARABIC_YEMEN = 0x09 SUBLANG_ARMENIAN_ARMENIA = 0x01 SUBLANG_ASSAMESE_INDIA = 0x01 SUBLANG_AZERBAIJANI_AZERBAIJAN_CYRILLIC = 0x02 SUBLANG_AZERBAIJANI_AZERBAIJAN_LATIN = 0x01 SUBLANG_AZERI_CYRILLIC = 0x02 SUBLANG_AZERI_LATIN = 0x01 SUBLANG_BANGLA_BANGLADESH = 0x02 SUBLANG_BANGLA_INDIA = 0x01 SUBLANG_BASHKIR_RUSSIA = 0x01 SUBLANG_BASQUE_BASQUE = 0x01 SUBLANG_BELARUSIAN_BELARUS = 0x01 SUBLANG_BENGALI_BANGLADESH = 0x02 SUBLANG_BENGALI_INDIA = 0x01 SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC = 0x08 SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN = 0x05 SUBLANG_BRETON_FRANCE = 0x01 SUBLANG_BULGARIAN_BULGARIA = 0x01 SUBLANG_CATALAN_CATALAN = 0x01 SUBLANG_CENTRAL_KURDISH_IRAQ = 0x01 SUBLANG_CHEROKEE_CHEROKEE = 0x01 SUBLANG_CHINESE_HONGKONG = 0x03 SUBLANG_CHINESE_MACAU = 0x05 SUBLANG_CHINESE_SIMPLIFIED = 0x02 SUBLANG_CHINESE_SINGAPORE = 0x04 SUBLANG_CHINESE_TRADITIONAL = 0x01 SUBLANG_CORSICAN_FRANCE = 0x01 SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN = 0x04 SUBLANG_CROATIAN_CROATIA = 0x01 SUBLANG_CUSTOM_DEFAULT = 0x03 SUBLANG_CUSTOM_UNSPECIFIED = 0x04 SUBLANG_CZECH_CZECH_REPUBLIC = 0x01 SUBLANG_DANISH_DENMARK = 0x01 SUBLANG_DARI_AFGHANISTAN = 0x01 SUBLANG_DEFAULT = 0x01 SUBLANG_DIVEHI_MALDIVES = 0x01 SUBLANG_DUTCH = 0x01 SUBLANG_DUTCH_BELGIAN = 0x02 SUBLANG_ENGLISH_AUS = 0x03 SUBLANG_ENGLISH_BELIZE = 0x0a SUBLANG_ENGLISH_CAN = 0x04 SUBLANG_ENGLISH_CARIBBEAN = 0x09 SUBLANG_ENGLISH_EIRE = 0x06 SUBLANG_ENGLISH_INDIA = 0x10 SUBLANG_ENGLISH_IRELAND = 0x06 SUBLANG_ENGLISH_JAMAICA = 0x08 SUBLANG_ENGLISH_MALAYSIA = 0x11 SUBLANG_ENGLISH_NZ = 0x05 SUBLANG_ENGLISH_PHILIPPINES = 0x0d SUBLANG_ENGLISH_SINGAPORE = 0x12 SUBLANG_ENGLISH_SOUTH_AFRICA = 0x07 SUBLANG_ENGLISH_TRINIDAD = 0x0b SUBLANG_ENGLISH_UK = 0x02 SUBLANG_ENGLISH_US = 0x01 SUBLANG_ENGLISH_ZIMBABWE = 0x0c SUBLANG_ESTONIAN_ESTONIA = 0x01 SUBLANG_FAEROESE_FAROE_ISLANDS = 0x01 SUBLANG_FILIPINO_PHILIPPINES = 0x01 SUBLANG_FINNISH_FINLAND = 0x01 SUBLANG_FRENCH = 0x01 SUBLANG_FRENCH_BELGIAN = 0x02 SUBLANG_FRENCH_CANADIAN = 0x03 SUBLANG_FRENCH_LUXEMBOURG = 0x05 SUBLANG_FRENCH_MONACO = 0x06 SUBLANG_FRENCH_SWISS = 0x04 SUBLANG_FRISIAN_NETHERLANDS = 0x01 SUBLANG_FULAH_SENEGAL = 0x02 SUBLANG_GALICIAN_GALICIAN = 0x01 SUBLANG_GEORGIAN_GEORGIA = 0x01 SUBLANG_GERMAN = 0x01 SUBLANG_GERMAN_AUSTRIAN = 0x03 SUBLANG_GERMAN_LIECHTENSTEIN = 0x05 SUBLANG_GERMAN_LUXEMBOURG = 0x04 SUBLANG_GERMAN_SWISS = 0x02 SUBLANG_GREEK_GREECE = 0x01 SUBLANG_GREENLANDIC_GREENLAND = 0x01 SUBLANG_GUJARATI_INDIA = 0x01 SUBLANG_HAUSA_NIGERIA = 1 SUBLANG_HAUSA_NIGERIA_LATIN = 0x01 SUBLANG_HAWAIIAN_US = 0x01 SUBLANG_HEBREW_ISRAEL = 0x01 SUBLANG_HINDI_INDIA = 0x01 SUBLANG_HUNGARIAN_HUNGARY = 0x01 SUBLANG_ICELANDIC_ICELAND = 0x01 SUBLANG_IGBO_NIGERIA = 0x01 SUBLANG_INDONESIAN_INDONESIA = 0x01 SUBLANG_INUKTITUT_CANADA = 0x01 SUBLANG_INUKTITUT_CANADA_LATIN = 0x02 SUBLANG_IRISH_IRELAND = 0x02 SUBLANG_ITALIAN = 0x01 SUBLANG_ITALIAN_SWISS = 0x02 SUBLANG_JAPANESE_JAPAN = 0x01 SUBLANG_KANNADA_INDIA = 0x01 SUBLANG_KASHMIRI_INDIA = 0x02 SUBLANG_KASHMIRI_SASIA = 0x02 SUBLANG_KAZAK_KAZAKHSTAN = 0x01 SUBLANG_KHMER_CAMBODIA = 0x01 SUBLANG_KICHE_GUATEMALA = 0x01 SUBLANG_KINYARWANDA_RWANDA = 0x01 SUBLANG_KONKANI_INDIA = 0x01 SUBLANG_KOREAN = 0x01 SUBLANG_KYRGYZ_KYRGYZSTAN = 0x01 SUBLANG_LAO_LAO = 0x01 SUBLANG_LAO_LAO_PDR = 1 SUBLANG_LATVIAN_LATVIA = 0x01 SUBLANG_LITHUANIAN = 0x01 SUBLANG_LOWER_SORBIAN_GERMANY = 0x02 SUBLANG_LUXEMBOURGISH_LUXEMBOURG = 0x01 SUBLANG_MACEDONIAN_MACEDONIA = 0x01 SUBLANG_MALAYALAM_INDIA = 0x01 SUBLANG_MALAY_BRUNEI_DARUSSALAM = 0x02 SUBLANG_MALAY_MALAYSIA = 0x01 SUBLANG_MALTESE_MALTA = 0x01 SUBLANG_MAORI_NEW_ZEALAND = 0x01 SUBLANG_MAPUDUNGUN_CHILE = 0x01 SUBLANG_MARATHI_INDIA = 0x01 SUBLANG_MOHAWK_MOHAWK = 0x01 SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA = 0x01 SUBLANG_MONGOLIAN_PRC = 0x02 SUBLANG_NEPALI_INDIA = 0x02 SUBLANG_NEPALI_NEPAL = 0x01 SUBLANG_NEUTRAL = 0x00 SUBLANG_NORWEGIAN_BOKMAL = 0x01 SUBLANG_NORWEGIAN_NYNORSK = 0x02 SUBLANG_OCCITAN_FRANCE = 0x01 SUBLANG_ORIYA_INDIA = 0x01 SUBLANG_PASHTO_AFGHANISTAN = 0x01 SUBLANG_PERSIAN_IRAN = 0x01 SUBLANG_POLISH_POLAND = 0x01 SUBLANG_PORTUGUESE = 0x02 SUBLANG_PORTUGUESE_BRAZILIAN = 0x01 SUBLANG_PULAR_SENEGAL = 0x02 SUBLANG_PUNJABI_INDIA = 0x01 SUBLANG_PUNJABI_PAKISTAN = 0x02 SUBLANG_QUECHUA_BOLIVIA = 0x01 SUBLANG_QUECHUA_ECUADOR = 0x02 SUBLANG_QUECHUA_PERU = 0x03 SUBLANG_ROMANIAN_ROMANIA = 0x01 SUBLANG_ROMANSH_SWITZERLAND = 0x01 SUBLANG_RUSSIAN_RUSSIA = 0x01 SUBLANG_SAKHA_RUSSIA = 0x01 SUBLANG_SAMI_INARI_FINLAND = 0x09 SUBLANG_SAMI_LULE_NORWAY = 0x04 SUBLANG_SAMI_LULE_SWEDEN = 0x05 SUBLANG_SAMI_NORTHERN_FINLAND = 0x03 SUBLANG_SAMI_NORTHERN_NORWAY = 0x01 SUBLANG_SAMI_NORTHERN_SWEDEN = 0x02 SUBLANG_SAMI_SKOLT_FINLAND = 0x08 SUBLANG_SAMI_SOUTHERN_NORWAY = 0x06 SUBLANG_SAMI_SOUTHERN_SWEDEN = 0x07 SUBLANG_SANSKRIT_INDIA = 0x01 SUBLANG_SCOTTISH_GAELIC = 0x01 SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC = 0x07 SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN = 0x06 SUBLANG_SERBIAN_CYRILLIC = 0x03 SUBLANG_SERBIAN_LATIN = 0x02 SUBLANG_SERBIAN_MONTENEGRO_CYRILLIC = 0x0c SUBLANG_SERBIAN_MONTENEGRO_LATIN = 0x0b SUBLANG_SERBIAN_SERBIA_CYRILLIC = 0x0a SUBLANG_SERBIAN_SERBIA_LATIN = 0x09 SUBLANG_SINDHI_AFGHANISTAN = 0x02 SUBLANG_SINDHI_INDIA = 0x01 SUBLANG_SINDHI_PAKISTAN = 0x02 SUBLANG_SINHALESE_SRI_LANKA = 0x01 SUBLANG_SLOVAK_SLOVAKIA = 0x01 SUBLANG_SLOVENIAN_SLOVENIA = 0x01 SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA = 0x01 SUBLANG_SPANISH = 0x01 SUBLANG_SPANISH_ARGENTINA = 0x0b SUBLANG_SPANISH_BOLIVIA = 0x10 SUBLANG_SPANISH_CHILE = 0x0d SUBLANG_SPANISH_COLOMBIA = 0x09 SUBLANG_SPANISH_COSTA_RICA = 0x05 SUBLANG_SPANISH_DOMINICAN_REPUBLIC = 0x07 SUBLANG_SPANISH_ECUADOR = 0x0c SUBLANG_SPANISH_EL_SALVADOR = 0x11 SUBLANG_SPANISH_GUATEMALA = 0x04 SUBLANG_SPANISH_HONDURAS = 0x12 SUBLANG_SPANISH_MEXICAN = 0x02 SUBLANG_SPANISH_MODERN = 0x03 SUBLANG_SPANISH_NICARAGUA = 0x13 SUBLANG_SPANISH_PANAMA = 0x06 SUBLANG_SPANISH_PARAGUAY = 0x0f SUBLANG_SPANISH_PERU = 0x0a SUBLANG_SPANISH_PUERTO_RICO = 0x14 SUBLANG_SPANISH_URUGUAY = 0x0e SUBLANG_SPANISH_US = 0x15 SUBLANG_SPANISH_VENEZUELA = 0x08 SUBLANG_SWAHILI_KENYA = 0x01 SUBLANG_SWEDISH = 0x01 SUBLANG_SWEDISH_FINLAND = 0x02 SUBLANG_SYRIAC = 0x01 SUBLANG_SYRIAC_SYRIA = 1 SUBLANG_SYS_DEFAULT = 0x02 SUBLANG_TAJIK_TAJIKISTAN = 0x01 SUBLANG_TAMAZIGHT_ALGERIA_LATIN = 0x02 SUBLANG_TAMAZIGHT_MOROCCO_TIFINAGH = 0x04 SUBLANG_TAMIL_INDIA = 0x01 SUBLANG_TAMIL_SRI_LANKA = 0x02 SUBLANG_TATAR_RUSSIA = 0x01 SUBLANG_TELUGU_INDIA = 0x01 SUBLANG_THAI_THAILAND = 0x01 SUBLANG_TIBETAN_BHUTAN = 0x02 SUBLANG_TIBETAN_PRC = 0x01 SUBLANG_TIGRIGNA_ERITREA = 0x02 SUBLANG_TIGRINYA_ERITREA = 0x02 SUBLANG_TIGRINYA_ETHIOPIA = 0x01 SUBLANG_TSWANA_BOTSWANA = 0x02 SUBLANG_TSWANA_SOUTH_AFRICA = 0x01 SUBLANG_TURKISH_TURKEY = 0x01 SUBLANG_TURKMEN_TURKMENISTAN = 0x01 SUBLANG_UIGHUR_PRC = 0x01 SUBLANG_UI_CUSTOM_DEFAULT = 0x05 SUBLANG_UKRAINIAN_UKRAINE = 0x01 SUBLANG_UPPER_SORBIAN_GERMANY = 0x01 SUBLANG_URDU_INDIA = 0x02 SUBLANG_URDU_PAKISTAN = 0x01 SUBLANG_UZBEK_CYRILLIC = 0x02 SUBLANG_UZBEK_LATIN = 0x01 SUBLANG_VALENCIAN_VALENCIA = 0x02 SUBLANG_VIETNAMESE_VIETNAM = 0x01 SUBLANG_WELSH_UNITED_KINGDOM = 0x01 SUBLANG_WOLOF_SENEGAL = 0x01 SUBLANG_XHOSA_SOUTH_AFRICA = 0x01 SUBLANG_YAKUT_RUSSIA = 0x01 SUBLANG_YI_PRC = 0x01 SUBLANG_YORUBA_NIGERIA = 0x01 SUBLANG_ZULU_SOUTH_AFRICA = 0x01 SUBVERSION_MASK = 0x000000FF SUCCESSFUL_ACCESS_ACE_FLAG = 64 SUPPORT_LANG_NUMBER = 32 SWP_ASYNCWINDOWPOS = 0x4000 SWP_DEFERERASE = 0x2000 SWP_DRAWFRAME = 32 SWP_FRAMECHANGED = 0x0020 SWP_HIDEWINDOW = 0x0080 SWP_NOACTIVATE = 0x0010 SWP_NOCOPYBITS = 0x0100 SWP_NOMOVE = 0x0002 SWP_NOOWNERZORDER = 0x0200 SWP_NOREDRAW = 0x0008 SWP_NOREPOSITION = 512 SWP_NOSENDCHANGING = 0x0400 SWP_NOSIZE = 0x0001 SWP_NOZORDER = 0x0004 SWP_SHOWWINDOW = 0x0040 SW_ERASE = 0x0004 SW_FORCEMINIMIZE = 11 SW_HIDE = 0 SW_INVALIDATE = 0x0002 SW_MAX = 11 SW_MAXIMIZE = 3 SW_MINIMIZE = 6 SW_NORMAL = 1 SW_OTHERUNZOOM = 4 SW_OTHERZOOM = 2 SW_PARENTCLOSING = 1 SW_PARENTOPENING = 3 SW_RESTORE = 9 SW_SCROLLCHILDREN = 0x0001 SW_SHOW = 5 SW_SHOWDEFAULT = 10 SW_SHOWMAXIMIZED = 3 SW_SHOWMINIMIZED = 2 SW_SHOWMINNOACTIVE = 7 SW_SHOWNA = 8 SW_SHOWNOACTIVATE = 4 SW_SHOWNORMAL = 1 SW_SMOOTHSCROLL = 0x0010 SYMBOL_CHARSET = 2 SYMLINK_FLAG_RELATIVE = 1 SYMMETRICWRAPKEYBLOB = 0xb SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY = 0x02 SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE = 0x04 SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY = 0x01 SYNCHRONIZE = 1048576 SYSPAL_ERROR = 0 SYSPAL_NOSTATIC = 2 SYSPAL_NOSTATIC256 = 3 SYSPAL_STATIC = 1 SYSRGN = 4 SYSTEM_ALARM_ACE_TYPE = 3 SYSTEM_ALARM_CALLBACK_ACE_TYPE = 14 SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE = 16 SYSTEM_ALARM_OBJECT_ACE_TYPE = 8 SYSTEM_AUDIT_ACE_TYPE = 2 SYSTEM_AUDIT_CALLBACK_ACE_TYPE = 13 SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE = 15 SYSTEM_AUDIT_OBJECT_ACE_TYPE = 7 SYSTEM_CACHE_ALIGNMENT_SIZE = 64 SYSTEM_FIXED_FONT = 16 SYSTEM_FONT = 13 SYSTEM_MANDATORY_LABEL_ACE_TYPE = 17 SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP = 0x4 SYSTEM_MANDATORY_LABEL_NO_READ_UP = 0x2 SYSTEM_MANDATORY_LABEL_NO_WRITE_UP = 0x1 SYSTEM_MANDATORY_LABEL_VALID_MASK = 7 SYSTEM_RESOURCE_ATTRIBUTE_ACE_TYPE = 18 SYSTEM_SCOPED_POLICY_ID_ACE_TYPE = 19 SYS_OPEN = 20 S_ALLTHRESHOLD = 2 S_LEGATO = 1 S_NORMAL = 0 S_PERIOD1024 = 1 S_PERIOD2048 = 2 S_PERIOD512 = 0 S_PERIODVOICE = 3 S_QUEUEEMPTY = 0 S_SERBDNT = -5 S_SERDCC = -7 S_SERDDR = -14 S_SERDFQ = -13 S_SERDLN = -6 S_SERDMD = -10 S_SERDPT = -12 S_SERDSH = -11 S_SERDSR = -15 S_SERDST = -16 S_SERDTP = -8 S_SERDVL = -9 S_SERDVNA = -1 S_SERMACT = -3 S_SEROFM = -2 S_SERQFUL = -4 S_STACCATO = 2 S_THRESHOLD = 1 S_WHITE1024 = 5 S_WHITE2048 = 6 S_WHITE512 = 4 S_WHITEVOICE = 7 TABTYP_NORM = 0 TABTYP_VIEW = 2 TABTYP_VTAB = 1 TAPE_ABSOLUTE_BLOCK = 1 TAPE_ABSOLUTE_POSITION = 0 TAPE_CHECK_FOR_DRIVE_PROBLEM = 2 TAPE_DRIVE_ABSOLUTE_BLK = 0x80001000 TAPE_DRIVE_ABS_BLK_IMMED = 0x80002000 TAPE_DRIVE_CLEAN_REQUESTS = 0x02000000 TAPE_DRIVE_COMPRESSION = 0x00020000 TAPE_DRIVE_ECC = 0x00010000 TAPE_DRIVE_EJECT_MEDIA = 0x01000000 TAPE_DRIVE_END_OF_DATA = 0x80010000 TAPE_DRIVE_EOT_WZ_SIZE = 0x00002000 TAPE_DRIVE_ERASE_BOP_ONLY = 0x00000040 TAPE_DRIVE_ERASE_IMMEDIATE = 0x00000080 TAPE_DRIVE_ERASE_LONG = 0x00000020 TAPE_DRIVE_ERASE_SHORT = 0x00000010 TAPE_DRIVE_FILEMARKS = 0x80040000 TAPE_DRIVE_FIXED = 0x00000001 TAPE_DRIVE_FIXED_BLOCK = 0x00000400 TAPE_DRIVE_FORMAT = 0xA0000000 TAPE_DRIVE_FORMAT_IMMEDIATE = 0xC0000000 TAPE_DRIVE_GET_ABSOLUTE_BLK = 0x00100000 TAPE_DRIVE_GET_LOGICAL_BLK = 0x00200000 TAPE_DRIVE_HIGH_FEATURES = 0x80000000 TAPE_DRIVE_INITIATOR = 0x00000004 TAPE_DRIVE_LOAD_UNLD_IMMED = 0x80000020 TAPE_DRIVE_LOAD_UNLOAD = 0x80000001 TAPE_DRIVE_LOCK_UNLK_IMMED = 0x80000080 TAPE_DRIVE_LOCK_UNLOCK = 0x80000004 TAPE_DRIVE_LOGICAL_BLK = 0x80004000 TAPE_DRIVE_LOG_BLK_IMMED = 0x80008000 TAPE_DRIVE_PADDING = 0x00040000 TAPE_DRIVE_RELATIVE_BLKS = 0x80020000 TAPE_DRIVE_REPORT_SMKS = 0x00080000 TAPE_DRIVE_RESERVED_BIT = 0x80000000 TAPE_DRIVE_REVERSE_POSITION = 0x80400000 TAPE_DRIVE_REWIND_IMMEDIATE = 0x80000008 TAPE_DRIVE_SELECT = 0x00000002 TAPE_DRIVE_SEQUENTIAL_FMKS = 0x80080000 TAPE_DRIVE_SEQUENTIAL_SMKS = 0x80200000 TAPE_DRIVE_SETMARKS = 0x80100000 TAPE_DRIVE_SET_BLOCK_SIZE = 0x80000010 TAPE_DRIVE_SET_CMP_BOP_ONLY = 0x04000000 TAPE_DRIVE_SET_COMPRESSION = 0x80000200 TAPE_DRIVE_SET_ECC = 0x80000100 TAPE_DRIVE_SET_EOT_WZ_SIZE = 0x00400000 TAPE_DRIVE_SET_PADDING = 0x80000400 TAPE_DRIVE_SET_REPORT_SMKS = 0x80000800 TAPE_DRIVE_SPACE_IMMEDIATE = 0x80800000 TAPE_DRIVE_TAPE_CAPACITY = 0x00000100 TAPE_DRIVE_TAPE_REMAINING = 0x00000200 TAPE_DRIVE_TENSION = 0x80000002 TAPE_DRIVE_TENSION_IMMED = 0x80000040 TAPE_DRIVE_VARIABLE_BLOCK = 0x00000800 TAPE_DRIVE_WRITE_FILEMARKS = 0x82000000 TAPE_DRIVE_WRITE_LONG_FMKS = 0x88000000 TAPE_DRIVE_WRITE_MARK_IMMED = 0x90000000 TAPE_DRIVE_WRITE_PROTECT = 0x00001000 TAPE_DRIVE_WRITE_SETMARKS = 0x81000000 TAPE_DRIVE_WRITE_SHORT_FMKS = 0x84000000 TAPE_ERASE_LONG = 1 TAPE_ERASE_SHORT = 0 TAPE_FILEMARKS = 1 TAPE_FIXED_PARTITIONS = 0 TAPE_FORMAT = 5 TAPE_INITIATOR_PARTITIONS = 2 TAPE_LOAD = 0 TAPE_LOCK = 3 TAPE_LOGICAL_BLOCK = 2 TAPE_LOGICAL_POSITION = 1 TAPE_LONG_FILEMARKS = 3 TAPE_PSEUDO_LOGICAL_BLOCK = 3 TAPE_PSEUDO_LOGICAL_POSITION = 2 TAPE_QUERY_DEVICE_ERROR_DATA = 4 TAPE_QUERY_DRIVE_PARAMETERS = 0 TAPE_QUERY_IO_ERROR_DATA = 3 TAPE_QUERY_MEDIA_CAPACITY = 1 TAPE_RESET_STATISTICS = 2 TAPE_RETURN_ENV_INFO = 1 TAPE_RETURN_STATISTICS = 0 TAPE_REWIND = 0 TAPE_SELECT_PARTITIONS = 1 TAPE_SETMARKS = 0 TAPE_SHORT_FILEMARKS = 2 TAPE_SPACE_END_OF_DATA = 4 TAPE_SPACE_FILEMARKS = 6 TAPE_SPACE_RELATIVE_BLOCKS = 5 TAPE_SPACE_SEQUENTIAL_FMKS = 7 TAPE_SPACE_SEQUENTIAL_SMKS = 9 TAPE_SPACE_SETMARKS = 8 TAPE_TENSION = 2 TAPE_UNLOAD = 1 TAPE_UNLOCK = 4 TARGET_IS_NT351_OR_WIN95_OR_LATER = 1 TARGET_IS_NT40_OR_LATER = 1 TARGET_IS_NT50_OR_LATER = 1 TARGET_IS_NT51_OR_LATER = 1 TARGET_IS_NT60_OR_LATER = 0 TARGET_IS_NT61_OR_LATER = 0 TA_BASELINE = 24 TA_BOTTOM = 8 TA_CENTER = 6 TA_LEFT = 0 TA_MASK = 287 TA_NOUPDATECP = 0 TA_RIGHT = 2 TA_RTLREADING = 256 TA_TOP = 0 TA_UPDATECP = 1 TCI_SRCCHARSET = 1 TCI_SRCCODEPAGE = 2 TCI_SRCFONTSIG = 3 TCI_SRCLOCALE = 0x1000 TCP_BSDURGENT = 0x7000 TCP_NODELAY = 0x0001 TC_CP_STROKE = 0x00000004 TC_CR_90 = 0x00000008 TC_CR_ANY = 0x00000010 TC_EA_DOUBLE = 0x00000200 TC_GP_TRAP = 2 TC_HARDERR = 1 TC_IA_ABLE = 0x00000400 TC_NORMAL = 0 TC_OP_CHARACTER = 0x00000001 TC_OP_STROKE = 0x00000002 TC_RA_ABLE = 0x00002000 TC_RESERVED = 0x00008000 TC_SA_CONTIN = 0x00000100 TC_SA_DOUBLE = 0x00000040 TC_SA_INTEGER = 0x00000080 TC_SCROLLBLT = 0x00010000 TC_SF_X_YINDEP = 0x00000020 TC_SIGNAL = 3 TC_SO_ABLE = 0x00001000 TC_UA_ABLE = 0x00000800 TC_VA_ABLE = 0x00004000 TECHNOLOGY = 2 TERM_ANDINFO = 0x0020 TERM_CODED = 0x0004 TERM_COPIED = 0x0008 TERM_DYNAMIC = 0x0001 TERM_HEURTRUTH = 0x2000 TERM_HIGHTRUTH = 0x4000 TERM_IS = 0x0800 TERM_LIKE = 0x0400 TERM_LIKECOND = 0x0200 TERM_LIKEOPT = 0x0100 TERM_OK = 0x0040 TERM_ORINFO = 0x0010 TERM_SLICE = 0x8000 TERM_VARSELECT = 0x1000 TERM_VIRTUAL = 0x0002 TERM_VNULL = 0x0080 TEXTCAPS = 34 TF_Autoincrement = 0x00000008 TF_DISCONNECT = 0x01 TF_Ephemeral = 0x00004000 TF_Eponymous = 0x00008000 TF_HasGenerated = 0x00000060 TF_HasHidden = 0x00000002 TF_HasNotNull = 0x00000800 TF_HasPrimaryKey = 0x00000004 TF_HasStat1 = 0x00000010 TF_HasStat4 = 0x00002000 TF_HasStored = 0x00000040 TF_HasVirtual = 0x00000020 TF_NoVisibleRowid = 0x00000200 TF_OOOHidden = 0x00000400 TF_REUSE_SOCKET = 0x02 TF_Readonly = 0x00000001 TF_Shadow = 0x00001000 TF_StatsUsed = 0x00000100 TF_Strict = 0x00010000 TF_WRITE_BEHIND = 0x04 TF_WithoutRowid = 0x00000080 THAI_CHARSET = 222 THREAD_ALL_ACCESS = 2032639 THREAD_BASE_PRIORITY_IDLE = -15 THREAD_BASE_PRIORITY_LOWRT = 15 THREAD_BASE_PRIORITY_MAX = 2 THREAD_BASE_PRIORITY_MIN = -2 THREAD_DIRECT_IMPERSONATION = 512 THREAD_GET_CONTEXT = 8 THREAD_IMPERSONATE = 256 THREAD_MODE_BACKGROUND_BEGIN = 0x00010000 THREAD_MODE_BACKGROUND_END = 0x00020000 THREAD_PRIORITY_ABOVE_NORMAL = 1 THREAD_PRIORITY_BELOW_NORMAL = -1 THREAD_PRIORITY_ERROR_RETURN = 2147483647 THREAD_PRIORITY_HIGHEST = 2 THREAD_PRIORITY_IDLE = -15 THREAD_PRIORITY_LOWEST = -2 THREAD_PRIORITY_NORMAL = 0 THREAD_PRIORITY_TIME_CRITICAL = 15 THREAD_PROFILING_FLAG_DISPATCH = 0x1 THREAD_QUERY_INFORMATION = 64 THREAD_QUERY_LIMITED_INFORMATION = 2048 THREAD_SET_CONTEXT = 16 THREAD_SET_INFORMATION = 32 THREAD_SET_LIMITED_INFORMATION = 1024 THREAD_SET_THREAD_TOKEN = 128 THREAD_SUSPEND_RESUME = 2 THREAD_TERMINATE = 1 TIMEOUT_ASYNC = 0xFFFFFFFF TIMERR_BASE = 96 TIMERR_NOCANDO = 97 TIMERR_NOERROR = 0 TIMERR_STRUCT = 129 TIMER_ABSTIME = 1 TIMER_ALL_ACCESS = 2031619 TIMER_END = 0 TIMER_MODIFY_STATE = 0x0002 TIMER_QUERY_STATE = 0x0001 TIMER_START = 0 TIME_BYTES = 0x0004 TIME_CALLBACK_EVENT_PULSE = 0x0020 TIME_CALLBACK_EVENT_SET = 0x0010 TIME_CALLBACK_FUNCTION = 0x0000 TIME_FORCE24HOURFORMAT = 0x00000008 TIME_KILL_SYNCHRONOUS = 0x0100 TIME_MIDI = 0x0010 TIME_MS = 0x0001 TIME_NOMINUTESORSECONDS = 0x00000001 TIME_NOSECONDS = 0x00000002 TIME_NOTIMEMARKER = 0x00000004 TIME_ONESHOT = 0x0000 TIME_PERIODIC = 0x0001 TIME_SAMPLES = 0x0002 TIME_SMPTE = 0x0008 TIME_TICKS = 0x0020 TIME_VALID_OID_FLUSH_OBJECT_FUNC = "TimeValidDllFlushObject" TIME_VALID_OID_GET_OBJECT_FUNC = "TimeValidDllGetObject" TIME_ZONE_ID_DAYLIGHT = 2 TIME_ZONE_ID_STANDARD = 1 TIME_ZONE_ID_UNKNOWN = 0 TKF_AVAILABLE = 0x00000002 TKF_CONFIRMHOTKEY = 0x00000008 TKF_HOTKEYACTIVE = 0x00000004 TKF_HOTKEYSOUND = 0x00000010 TKF_INDICATOR = 0x00000020 TKF_TOGGLEKEYSON = 0x00000001 TK_ABORT = 27 TK_ACTION = 28 TK_ADD = 163 TK_AFTER = 29 TK_AGG_COLUMN = 169 TK_AGG_FUNCTION = 168 TK_ALL = 135 TK_ALTER = 162 TK_ALWAYS = 96 TK_ANALYZE = 30 TK_AND = 44 TK_ANY = 101 TK_AS = 24 TK_ASC = 31 TK_ASTERISK = 180 TK_ATTACH = 32 TK_AUTOINCR = 126 TK_BEFORE = 33 TK_BEGIN = 5 TK_BETWEEN = 48 TK_BITAND = 102 TK_BITNOT = 114 TK_BITOR = 103 TK_BLOB = 154 TK_BY = 34 TK_CASCADE = 35 TK_CASE = 157 TK_CAST = 36 TK_CHECK = 124 TK_COLLATE = 113 TK_COLUMN = 167 TK_COLUMNKW = 60 TK_COMMA = 25 TK_COMMIT = 10 TK_CONCAT = 111 TK_CONFLICT = 37 TK_CONSTRAINT = 119 TK_CREATE = 17 TK_CTIME_KW = 100 TK_CURRENT = 85 TK_DATABASE = 38 TK_DEFAULT = 120 TK_DEFERRABLE = 131 TK_DEFERRED = 7 TK_DELETE = 128 TK_DESC = 39 TK_DETACH = 40 TK_DISTINCT = 140 TK_DO = 61 TK_DOT = 141 TK_DROP = 133 TK_EACH = 41 TK_ELSE = 160 TK_END = 11 TK_EQ = 53 TK_ERROR = 182 TK_ESCAPE = 58 TK_EXCEPT = 136 TK_EXCLUDE = 91 TK_EXCLUSIVE = 9 TK_EXISTS = 20 TK_EXPLAIN = 2 TK_FAIL = 42 TK_FILTER = 166 TK_FIRST = 83 TK_FLOAT = 153 TK_FOLLOWING = 86 TK_FOR = 62 TK_FOREIGN = 132 TK_FROM = 142 TK_FUNCTION = 172 TK_GE = 57 TK_GENERATED = 95 TK_GROUP = 146 TK_GROUPS = 92 TK_GT = 54 TK_HAVING = 147 TK_ID = 59 TK_IF = 18 TK_IF_NULL_ROW = 179 TK_IGNORE = 63 TK_ILLEGAL = 184 TK_IMMEDIATE = 8 TK_IN = 49 TK_INDEX = 161 TK_INDEXED = 116 TK_INITIALLY = 64 TK_INSERT = 127 TK_INSTEAD = 65 TK_INTEGER = 155 TK_INTERSECT = 137 TK_INTO = 151 TK_IS = 45 TK_ISNOT = 171 TK_ISNULL = 50 TK_JOIN = 143 TK_JOIN_KW = 118 TK_KEY = 67 TK_LAST = 84 TK_LE = 55 TK_LIKE_KW = 47 TK_LIMIT = 148 TK_LP = 22 TK_LSHIFT = 104 TK_LT = 56 TK_MATCH = 46 TK_MATERIALIZED = 97 TK_MINUS = 107 TK_NE = 52 TK_NO = 66 TK_NOT = 19 TK_NOTHING = 152 TK_NOTNULL = 51 TK_NULL = 121 TK_NULLS = 82 TK_OF = 68 TK_OFFSET = 69 TK_ON = 115 TK_OR = 43 TK_ORDER = 145 TK_OTHERS = 93 TK_OVER = 165 TK_PARTITION = 87 TK_PLAN = 4 TK_PLUS = 106 TK_PRAGMA = 70 TK_PRECEDING = 88 TK_PRIMARY = 122 TK_PTR = 112 TK_QUERY = 3 TK_RAISE = 71 TK_RANGE = 89 TK_RECURSIVE = 72 TK_REFERENCES = 125 TK_REGISTER = 176 TK_REINDEX = 98 TK_RELEASE = 14 TK_REM = 110 TK_RENAME = 99 TK_REPLACE = 73 TK_RESTRICT = 74 TK_RETURNING = 150 TK_ROLLBACK = 12 TK_ROW = 75 TK_ROWS = 76 TK_RP = 23 TK_RSHIFT = 105 TK_SAVEPOINT = 13 TK_SELECT = 138 TK_SELECT_COLUMN = 178 TK_SEMI = 1 TK_SET = 130 TK_SLASH = 109 TK_SPACE = 183 TK_SPAN = 181 TK_STAR = 108 TK_STRING = 117 TK_TABLE = 16 TK_TEMP = 21 TK_THEN = 159 TK_TIES = 94 TK_TO = 15 TK_TRANSACTION = 6 TK_TRIGGER = 77 TK_TRUEFALSE = 170 TK_TRUTH = 175 TK_UMINUS = 173 TK_UNBOUNDED = 90 TK_UNION = 134 TK_UNIQUE = 123 TK_UPDATE = 129 TK_UPLUS = 174 TK_USING = 144 TK_VACUUM = 78 TK_VALUES = 139 TK_VARIABLE = 156 TK_VECTOR = 177 TK_VIEW = 79 TK_VIRTUAL = 80 TK_WHEN = 158 TK_WHERE = 149 TK_WINDOW = 164 TK_WITH = 81 TK_WITHOUT = 26 TLOSS = 5 TLS_MINIMUM_AVAILABLE = 64 TME_CANCEL = 0x80000000 TME_HOVER = 0x00000001 TME_LEAVE = 0x00000002 TME_NONCLIENT = 0x00000010 TME_QUERY = 0x40000000 TMPF_DEVICE = 0x08 TMPF_FIXED_PITCH = 0x01 TMPF_TRUETYPE = 0x04 TMPF_VECTOR = 0x02 TMP_MAX = 32767 TMP_MAX_S = 32767 TOKEN_ADJUST_DEFAULT = 128 TOKEN_ADJUST_GROUPS = 64 TOKEN_ADJUST_PRIVILEGES = 32 TOKEN_ADJUST_SESSIONID = 256 TOKEN_ALL_ACCESS = 983551 TOKEN_ALL_ACCESS_P = 983295 TOKEN_ASSIGN_PRIMARY = 1 TOKEN_DUPLICATE = 2 TOKEN_EXECUTE = 131072 TOKEN_IMPERSONATE = 4 TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN = 0x2 TOKEN_MANDATORY_POLICY_NO_WRITE_UP = 0x1 TOKEN_MANDATORY_POLICY_OFF = 0x0 TOKEN_MANDATORY_POLICY_VALID_MASK = 3 TOKEN_QUERY = 8 TOKEN_QUERY_SOURCE = 16 TOKEN_READ = 131080 TOKEN_SOURCE_LENGTH = 8 TOKEN_WRITE = 131296 TPM_BOTTOMALIGN = 32 TPM_CENTERALIGN = 4 TPM_HORIZONTAL = 0 TPM_HORNEGANIMATION = 2048 TPM_HORPOSANIMATION = 1024 TPM_LAYOUTRTL = 32768 TPM_LEFTALIGN = 0 TPM_LEFTBUTTON = 0 TPM_NOANIMATION = 16384 TPM_NONOTIFY = 128 TPM_RECURSE = 1 TPM_RETURNCMD = 256 TPM_RIGHTALIGN = 8 TPM_RIGHTBUTTON = 2 TPM_TOPALIGN = 0 TPM_VCENTERALIGN = 16 TPM_VERNEGANIMATION = 8192 TPM_VERPOSANIMATION = 4096 TPM_VERTICAL = 64 TRANSACTIONMANAGER_ALL_ACCESS = 983103 TRANSACTIONMANAGER_BIND_TRANSACTION = 0x00020 TRANSACTIONMANAGER_CREATE_RM = 0x00010 TRANSACTIONMANAGER_GENERIC_EXECUTE = 131072 TRANSACTIONMANAGER_GENERIC_READ = 131073 TRANSACTIONMANAGER_GENERIC_WRITE = 131102 TRANSACTIONMANAGER_QUERY_INFORMATION = 0x00001 TRANSACTIONMANAGER_RECOVER = 0x00004 TRANSACTIONMANAGER_RENAME = 0x00008 TRANSACTIONMANAGER_SET_INFORMATION = 0x00002 TRANSACTION_ALL_ACCESS = 2031679 TRANSACTION_COMMIT = 8 TRANSACTION_DO_NOT_PROMOTE = 0x00000001 TRANSACTION_ENLIST = 4 TRANSACTION_GENERIC_EXECUTE = 1179672 TRANSACTION_GENERIC_READ = 1179649 TRANSACTION_GENERIC_WRITE = 1179710 TRANSACTION_MANAGER_COMMIT_DEFAULT = 0x00000000 TRANSACTION_MANAGER_COMMIT_LOWEST = 0x00000008 TRANSACTION_MANAGER_COMMIT_SYSTEM_HIVES = 0x00000004 TRANSACTION_MANAGER_COMMIT_SYSTEM_VOLUME = 0x00000002 TRANSACTION_MANAGER_CORRUPT_FOR_PROGRESS = 0x00000020 TRANSACTION_MANAGER_CORRUPT_FOR_RECOVERY = 0x00000010 TRANSACTION_MANAGER_MAXIMUM_OPTION = 0x0000003f TRANSACTION_MANAGER_VOLATILE = 0x00000001 TRANSACTION_MAXIMUM_OPTION = 0x00000001 TRANSACTION_NOTIFICATION_TM_ONLINE_FLAG_IS_CLUSTERED = 0x1 TRANSACTION_NOTIFY_COMMIT = 0x00000004 TRANSACTION_NOTIFY_COMMIT_COMPLETE = 0x00000040 TRANSACTION_NOTIFY_COMMIT_FINALIZE = 0x40000000 TRANSACTION_NOTIFY_COMMIT_REQUEST = 0x04000000 TRANSACTION_NOTIFY_DELEGATE_COMMIT = 0x00000400 TRANSACTION_NOTIFY_ENLIST_MASK = 0x00040000 TRANSACTION_NOTIFY_ENLIST_PREPREPARE = 0x00001000 TRANSACTION_NOTIFY_INDOUBT = 0x00004000 TRANSACTION_NOTIFY_LAST_RECOVER = 0x00002000 TRANSACTION_NOTIFY_MARSHAL = 0x00020000 TRANSACTION_NOTIFY_MASK = 0x3fffffff TRANSACTION_NOTIFY_PREPARE = 0x00000002 TRANSACTION_NOTIFY_PREPARE_COMPLETE = 0x00000020 TRANSACTION_NOTIFY_PREPREPARE = 0x00000001 TRANSACTION_NOTIFY_PREPREPARE_COMPLETE = 0x00000010 TRANSACTION_NOTIFY_PROMOTE = 0x08000000 TRANSACTION_NOTIFY_PROMOTE_NEW = 0x10000000 TRANSACTION_NOTIFY_PROPAGATE_PULL = 0x00008000 TRANSACTION_NOTIFY_PROPAGATE_PUSH = 0x00010000 TRANSACTION_NOTIFY_RECOVER = 0x00000100 TRANSACTION_NOTIFY_RECOVER_QUERY = 0x00000800 TRANSACTION_NOTIFY_REQUEST_OUTCOME = 0x20000000 TRANSACTION_NOTIFY_RM_DISCONNECTED = 0x01000000 TRANSACTION_NOTIFY_ROLLBACK = 0x00000008 TRANSACTION_NOTIFY_ROLLBACK_COMPLETE = 0x00000080 TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT = 0x00000200 TRANSACTION_NOTIFY_TM_ONLINE = 0x02000000 TRANSACTION_PROPAGATE = 32 TRANSACTION_QUERY_INFORMATION = 1 TRANSACTION_RESOURCE_MANAGER_RIGHTS = 1179703 TRANSACTION_RIGHT_RESERVED1 = 64 TRANSACTION_ROLLBACK = 16 TRANSACTION_SET_INFORMATION = 2 TRANSFORM_CTM = 4107 TRANSPARENT = 1 TRANSPORT_TYPE_CN = 0x01 TRANSPORT_TYPE_DG = 0x02 TRANSPORT_TYPE_LPC = 0x04 TRANSPORT_TYPE_WMSG = 0x08 TRANS_NONE = 0 TRANS_READ = 1 TRANS_WRITE = 2 TREETRACE_ENABLED = 0 TRIGGER_AFTER = 2 TRIGGER_BEFORE = 1 TRUE = 1 TRUETYPE_FONTTYPE = 0x004 TRUNCATE_EXISTING = 5 TRY_AGAIN = 11002 TT_AVAILABLE = 0x0001 TT_ENABLED = 0x0002 TT_OPENTYPE_FONTTYPE = 0x20000 TT_POLYGON_TYPE = 24 TT_PRIM_CSPLINE = 3 TT_PRIM_LINE = 1 TT_PRIM_QSPLINE = 2 TURKISH_CHARSET = 162 TWOSTOPBITS = 2 TYPE1_FONTTYPE = 0x40000 UAS_EXACTLEGACY = 0x1000 UCHAR_MAX = 255 UCLEANUI = 67108864 UDIRTYUI = 134217728 UINT_MAX = 4294967295 UISF_ACTIVE = 0x4 UISF_HIDEACCEL = 0x2 UISF_HIDEFOCUS = 0x1 UIS_CLEAR = 2 UIS_INITIALIZE = 3 UIS_SET = 1 UI_CAP_2700 = 0x00000001 UI_CAP_ROT90 = 0x00000002 UI_CAP_ROTANY = 0x00000004 ULLONG_MAX = 18446744073709551615 ULONG_LONG_MAX = 18446744073709551615 ULONG_MAX = 4294967295 ULW_ALPHA = 0x00000002 ULW_COLORKEY = 0x00000001 ULW_EX_NORESIZE = 0x00000008 ULW_OPAQUE = 0x00000004 UNALIGNED = 0 UNALIGNED64 = 0 UNDEFINE_ALTERNATE = 0xD UNDEFINE_PRIMARY = 0xC UNDERFLOW = 4 UNICODE_NOCHAR = 0xFFFF UNICODE_STRING_MAX_CHARS = 32767 UNIQUE_NAME = 0x00 UNIVERSAL_NAME_INFO_LEVEL = 0x00000001 UNKNOWN_LOCK = 5 UNLOAD_DLL_DEBUG_EVENT = 7 UNLOCK_ELEMENT = 1 UNPROTECTED_DACL_SECURITY_INFORMATION = 536870912 UNPROTECTED_SACL_SECURITY_INFORMATION = 268435456 UNRECOVERED_READS_VALID = 0x00000008 UNRECOVERED_WRITES_VALID = 0x00000002 UNWIND_HISTORY_TABLE_GLOBAL = 1 UNWIND_HISTORY_TABLE_LOCAL = 2 UNWIND_HISTORY_TABLE_NONE = 0 UNWIND_HISTORY_TABLE_SIZE = 12 UNW_FLAG_CHAININFO = 0x4 UNW_FLAG_EHANDLER = 0x1 UNW_FLAG_NHANDLER = 0x0 UNW_FLAG_UHANDLER = 0x2 UOI_FLAGS = 1 UOI_NAME = 2 UOI_TIMERPROC_EXCEPTION_SUPPRESSION = 7 UOI_TYPE = 3 UOI_USER_SID = 4 UPDFCACHE_IFBLANK = 16 UPDFCACHE_IFBLANKORONSAVECACHE = 18 UPDFCACHE_NODATACACHE = 1 UPDFCACHE_NORMALCACHE = 8 UPDFCACHE_ONLYIFBLANK = 2147483648 UPDFCACHE_ONSAVECACHE = 2 UPDFCACHE_ONSTOPCACHE = 4 UPOINTER_32 = 0 URLACTION_ACTIVEX_CONFIRM_NOOBJECTSAFETY = 0x1204 URLACTION_ACTIVEX_CURR_MAX = 0x120B URLACTION_ACTIVEX_DYNSRC_VIDEO_AND_ANIMATION = 0x120A URLACTION_ACTIVEX_MAX = 0x13ff URLACTION_ACTIVEX_MIN = 0x1200 URLACTION_ACTIVEX_NO_WEBOC_SCRIPT = 0x1206 URLACTION_ACTIVEX_OVERRIDE_DATA_SAFETY = 0x1202 URLACTION_ACTIVEX_OVERRIDE_DOMAINLIST = 0x120B URLACTION_ACTIVEX_OVERRIDE_OBJECT_SAFETY = 0x1201 URLACTION_ACTIVEX_OVERRIDE_OPTIN = 0x1208 URLACTION_ACTIVEX_OVERRIDE_REPURPOSEDETECTION = 0x1207 URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETY = 0x1203 URLACTION_ACTIVEX_RUN = 0x1200 URLACTION_ACTIVEX_SCRIPTLET_RUN = 0x1209 URLACTION_ACTIVEX_TREATASUNTRUSTED = 0x1205 URLACTION_ALLOW_ACTIVEX_FILTERING = 0x2702 URLACTION_ALLOW_AUDIO_VIDEO = 0x2701 URLACTION_ALLOW_AUDIO_VIDEO_PLUGINS = 0x2704 URLACTION_ALLOW_CROSSDOMAIN_APPCACHE_MANIFEST = 0x270A URLACTION_ALLOW_CROSSDOMAIN_DROP_ACROSS_WINDOWS = 0x2709 URLACTION_ALLOW_CROSSDOMAIN_DROP_WITHIN_WINDOW = 0x2708 URLACTION_ALLOW_RENDER_LEGACY_DXTFILTERS = 0x270B URLACTION_ALLOW_STRUCTURED_STORAGE_SNIFFING = 0x2703 URLACTION_ALLOW_XDOMAIN_SUBFRAME_RESIZE = 0x1408 URLACTION_ALLOW_ZONE_ELEVATION_OPT_OUT_ADDITION = 0x2706 URLACTION_ALLOW_ZONE_ELEVATION_VIA_OPT_OUT = 0x2705 URLACTION_AUTHENTICATE_CLIENT = 0x1A01 URLACTION_CHANNEL_SOFTDIST_MAX = 0x1Eff URLACTION_CHANNEL_SOFTDIST_MIN = 0x1E00 URLACTION_CHANNEL_SOFTDIST_PERMISSIONS = 0x1E05 URLACTION_CLIENT_CERT_PROMPT = 0x1A04 URLACTION_COOKIES = 0x1A02 URLACTION_COOKIES_ENABLED = 0x1A10 URLACTION_COOKIES_SESSION = 0x1A03 URLACTION_COOKIES_SESSION_THIRD_PARTY = 0x1A06 URLACTION_COOKIES_THIRD_PARTY = 0x1A05 URLACTION_CREDENTIALS_USE = 0x1A00 URLACTION_CROSS_DOMAIN_DATA = 0x1406 URLACTION_DOWNLOAD_CURR_MAX = 0x1004 URLACTION_DOWNLOAD_MAX = 0x11FF URLACTION_DOWNLOAD_MIN = 0x1000 URLACTION_DOWNLOAD_SIGNED_ACTIVEX = 0x1001 URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX = 0x1004 URLACTION_HTML_ALLOW_CROSS_DOMAIN_CANVAS = 0x160D URLACTION_HTML_ALLOW_CROSS_DOMAIN_TEXTTRACK = 0x1610 URLACTION_HTML_ALLOW_CROSS_DOMAIN_WEBWORKER = 0x160F URLACTION_HTML_ALLOW_INDEXEDDB = 0x1611 URLACTION_HTML_ALLOW_INJECTED_DYNAMIC_HTML = 0x160B URLACTION_HTML_ALLOW_WINDOW_CLOSE = 0x160E URLACTION_HTML_FONT_DOWNLOAD = 0x1604 URLACTION_HTML_INCLUDE_FILE_PATH = 0x160A URLACTION_HTML_JAVA_RUN = 0x1605 URLACTION_HTML_MAX = 0x17ff URLACTION_HTML_META_REFRESH = 0x1608 URLACTION_HTML_MIN = 0x1600 URLACTION_HTML_MIXED_CONTENT = 0x1609 URLACTION_HTML_REQUIRE_UTF8_DOCUMENT_CODEPAGE = 0x160C URLACTION_HTML_SUBFRAME_NAVIGATE = 0x1607 URLACTION_HTML_SUBMIT_FORMS = 0x1601 URLACTION_HTML_SUBMIT_FORMS_FROM = 0x1602 URLACTION_HTML_SUBMIT_FORMS_TO = 0x1603 URLACTION_HTML_USERDATA_SAVE = 0x1606 URLACTION_INFODELIVERY_CURR_MAX = 0x1D06 URLACTION_INFODELIVERY_MAX = 0x1Dff URLACTION_INFODELIVERY_MIN = 0x1D00 URLACTION_INFODELIVERY_NO_ADDING_CHANNELS = 0x1D00 URLACTION_INFODELIVERY_NO_ADDING_SUBSCRIPTIONS = 0x1D03 URLACTION_INFODELIVERY_NO_CHANNEL_LOGGING = 0x1D06 URLACTION_INFODELIVERY_NO_EDITING_CHANNELS = 0x1D01 URLACTION_INFODELIVERY_NO_EDITING_SUBSCRIPTIONS = 0x1D04 URLACTION_INFODELIVERY_NO_REMOVING_CHANNELS = 0x1D02 URLACTION_INFODELIVERY_NO_REMOVING_SUBSCRIPTIONS = 0x1D05 URLACTION_JAVA_CURR_MAX = 0x1C00 URLACTION_JAVA_MAX = 0x1Cff URLACTION_JAVA_MIN = 0x1C00 URLACTION_JAVA_PERMISSIONS = 0x1C00 URLACTION_MIN = 0x1000 URLACTION_NETWORK_CURR_MAX = 0x1A10 URLACTION_NETWORK_MAX = 0x1Bff URLACTION_NETWORK_MIN = 0x1A00 URLACTION_PLUGGABLE_PROTOCOL_XHR = 0x140B URLACTION_SCRIPT_CURR_MAX = 0x140B URLACTION_SCRIPT_JAVA_USE = 0x1402 URLACTION_SCRIPT_MAX = 0x15ff URLACTION_SCRIPT_MIN = 0x1400 URLACTION_SCRIPT_NAVIGATE = 0x140A URLACTION_SCRIPT_OVERRIDE_SAFETY = 0x1401 URLACTION_SCRIPT_PASTE = 0x1407 URLACTION_SCRIPT_RUN = 0x1400 URLACTION_SCRIPT_SAFE_ACTIVEX = 0x1405 URLACTION_SCRIPT_XSSFILTER = 0x1409 URLACTION_SHELL_CURR_MAX = 0x1811 URLACTION_SHELL_FILE_DOWNLOAD = 0x1803 URLACTION_SHELL_INSTALL_DTITEMS = 0x1800 URLACTION_SHELL_MAX = 0x19ff URLACTION_SHELL_MIN = 0x1800 URLACTION_SHELL_MOVE_OR_COPY = 0x1802 URLACTION_SHELL_SHELLEXECUTE = 0x1806 URLACTION_SHELL_VERB = 0x1804 URLACTION_SHELL_WEBVIEW_VERB = 0x1805 URLMON_OPTION_URL_ENCODING = 0x10000004 URLMON_OPTION_USERAGENT = 0x10000001 URLMON_OPTION_USERAGENT_REFRESH = 0x10000002 URLOSTRM_GETNEWESTVERSION = 0x3 URLOSTRM_USECACHEDCOPY = 0x2 URLOSTRM_USECACHEDCOPY_ONLY = 0x1 URLPOLICY_ACTIVEX_CHECK_LIST = 0x10000 URLPOLICY_ALLOW = 0x0 URLPOLICY_AUTHENTICATE_CHALLENGE_RESPONSE = 0x10000 URLPOLICY_AUTHENTICATE_CLEARTEXT_OK = 0x0 URLPOLICY_AUTHENTICATE_MUTUAL_ONLY = 0x30000 URLPOLICY_CHANNEL_SOFTDIST_AUTOINSTALL = 0x30000 URLPOLICY_CHANNEL_SOFTDIST_PRECACHE = 0x20000 URLPOLICY_CHANNEL_SOFTDIST_PROHIBIT = 0x10000 URLPOLICY_CREDENTIALS_ANONYMOUS_ONLY = 0x30000 URLPOLICY_CREDENTIALS_CONDITIONAL_PROMPT = 0x20000 URLPOLICY_CREDENTIALS_MUST_PROMPT_USER = 0x10000 URLPOLICY_CREDENTIALS_SILENT_LOGON_OK = 0x0 URLPOLICY_DISALLOW = 0x3 URLPOLICY_DONTCHECKDLGBOX = 0x100 URLPOLICY_JAVA_CUSTOM = 0x800000 URLPOLICY_JAVA_HIGH = 0x10000 URLPOLICY_JAVA_LOW = 0x30000 URLPOLICY_JAVA_MEDIUM = 0x20000 URLPOLICY_JAVA_PROHIBIT = 0x0 URLPOLICY_LOG_ON_ALLOW = 0x40 URLPOLICY_LOG_ON_DISALLOW = 0x80 URLPOLICY_MASK_PERMISSIONS = 0x0f URLPOLICY_NOTIFY_ON_ALLOW = 0x10 URLPOLICY_NOTIFY_ON_DISALLOW = 0x20 URLPOLICY_QUERY = 0x1 URLZONE_ESC_FLAG = 0x100 URL_MK_LEGACY = 0 URL_MK_NO_CANONICALIZE = 2 URL_MK_UNIFORM = 1 URL_OID_GET_OBJECT_URL_FUNC = "UrlDllGetObjectUrl" USAGE_MATCH_TYPE_AND = 0x0 USAGE_MATCH_TYPE_OR = 0x1 USER_CALL_IS_ASYNC = 0x0100 USER_CALL_NEW_CORRELATION_DESC = 0x0200 USER_MARSHAL_CB_SIGNATURE = 85 USER_MARSHAL_FC_BYTE = 1 USER_MARSHAL_FC_CHAR = 2 USER_MARSHAL_FC_DOUBLE = 12 USER_MARSHAL_FC_FLOAT = 10 USER_MARSHAL_FC_HYPER = 11 USER_MARSHAL_FC_LONG = 8 USER_MARSHAL_FC_SHORT = 6 USER_MARSHAL_FC_SMALL = 3 USER_MARSHAL_FC_ULONG = 9 USER_MARSHAL_FC_USHORT = 7 USER_MARSHAL_FC_USMALL = 4 USER_MARSHAL_FC_WCHAR = 5 USER_TIMER_MAXIMUM = 0x7FFFFFFF USER_TIMER_MINIMUM = 0x0000000A USE___UUIDOF = 1 USHRT_MAX = 65535 USN_DELETE_FLAG_DELETE = 1 USN_DELETE_FLAG_NOTIFY = 2 USN_DELETE_VALID_FLAGS = 3 USN_PAGE_SIZE = 4096 USN_REASON_BASIC_INFO_CHANGE = 32768 USN_REASON_CLOSE = 2147483648 USN_REASON_COMPRESSION_CHANGE = 131072 USN_REASON_DATA_EXTEND = 2 USN_REASON_DATA_OVERWRITE = 1 USN_REASON_DATA_TRUNCATION = 4 USN_REASON_EA_CHANGE = 1024 USN_REASON_ENCRYPTION_CHANGE = 262144 USN_REASON_FILE_CREATE = 256 USN_REASON_FILE_DELETE = 512 USN_REASON_HARD_LINK_CHANGE = 65536 USN_REASON_INDEXABLE_CHANGE = 16384 USN_REASON_NAMED_DATA_EXTEND = 32 USN_REASON_NAMED_DATA_OVERWRITE = 16 USN_REASON_NAMED_DATA_TRUNCATION = 64 USN_REASON_OBJECT_ID_CHANGE = 524288 USN_REASON_RENAME_NEW_NAME = 8192 USN_REASON_RENAME_OLD_NAME = 4096 USN_REASON_REPARSE_POINT_CHANGE = 1048576 USN_REASON_SECURITY_CHANGE = 2048 USN_REASON_STREAM_CHANGE = 2097152 USN_SOURCE_AUXILIARY_DATA = 2 USN_SOURCE_DATA_MANAGEMENT = 1 USN_SOURCE_REPLICATION_MANAGEMENT = 4 UUID_DEFINED = 0 VALID_INHERIT_FLAGS = 31 VALID_NTFT = 0xC0 VARCMP_EQ = 1 VARCMP_GT = 2 VARCMP_LT = 0 VARCMP_NULL = 3 VARIABLE_PITCH = 2 VARIANT_ALPHABOOL = 0x02 VARIANT_CALENDAR_GREGORIAN = 0x40 VARIANT_CALENDAR_HIJRI = 0x08 VARIANT_CALENDAR_THAI = 0x20 VARIANT_LOCALBOOL = 0x10 VARIANT_NOUSEROVERRIDE = 0x04 VARIANT_NOVALUEPROP = 0x01 VARIANT_USE_NLS = 0x80 VDBE_DISPLAY_P4 = 1 VDBE_HALT_STATE = 3 VDBE_INIT_STATE = 0 VDBE_READY_STATE = 1 VDBE_RUN_STATE = 2 VENDOR_ID_LENGTH = 8 VERTRES = 10 VERTSIZE = 6 VER_AND = 6 VER_BUILDNUMBER = 0x0000004 VER_CONDITION_MASK = 7 VER_EQUAL = 1 VER_GREATER = 2 VER_GREATER_EQUAL = 3 VER_H = 0 VER_LESS = 4 VER_LESS_EQUAL = 5 VER_MAJORVERSION = 0x0000002 VER_MINORVERSION = 0x0000001 VER_NT_DOMAIN_CONTROLLER = 0x0000002 VER_NT_SERVER = 0x0000003 VER_NT_WORKSTATION = 0x0000001 VER_NUM_BITS_PER_CONDITION_MASK = 3 VER_OR = 7 VER_PLATFORMID = 0x0000008 VER_PLATFORM_WIN32_NT = 2 VER_PLATFORM_WIN32_WINDOWS = 1 VER_PLATFORM_WIN32s = 0 VER_PRODUCT_TYPE = 0x0000080 VER_SERVER_NT = 0x80000000 VER_SERVICEPACKMAJOR = 0x0000020 VER_SERVICEPACKMINOR = 0x0000010 VER_SUITENAME = 0x0000040 VER_SUITE_BACKOFFICE = 0x00000004 VER_SUITE_BLADE = 0x00000400 VER_SUITE_COMMUNICATIONS = 0x00000008 VER_SUITE_COMPUTE_SERVER = 0x00004000 VER_SUITE_DATACENTER = 0x00000080 VER_SUITE_EMBEDDEDNT = 0x00000040 VER_SUITE_EMBEDDED_RESTRICTED = 0x00000800 VER_SUITE_ENTERPRISE = 0x00000002 VER_SUITE_PERSONAL = 0x00000200 VER_SUITE_SECURITY_APPLIANCE = 0x00001000 VER_SUITE_SINGLEUSERTS = 0x00000100 VER_SUITE_SMALLBUSINESS = 0x00000001 VER_SUITE_SMALLBUSINESS_RESTRICTED = 0x00000020 VER_SUITE_STORAGE_SERVER = 0x00002000 VER_SUITE_TERMINAL = 0x00000010 VER_SUITE_WH_SERVER = 0x00008000 VER_WORKSTATION_NT = 0x40000000 VFFF_ISSHAREDFILE = 0x0001 VFF_BUFFTOOSMALL = 0x0004 VFF_CURNEDEST = 0x0001 VFF_FILEINUSE = 0x0002 VFT2_DRV_COMM = 10 VFT2_DRV_DISPLAY = 4 VFT2_DRV_INPUTMETHOD = 11 VFT2_DRV_INSTALLABLE = 8 VFT2_DRV_KEYBOARD = 2 VFT2_DRV_LANGUAGE = 3 VFT2_DRV_MOUSE = 5 VFT2_DRV_NETWORK = 6 VFT2_DRV_PRINTER = 1 VFT2_DRV_SOUND = 9 VFT2_DRV_SYSTEM = 7 VFT2_DRV_VERSIONED_PRINTER = 12 VFT2_FONT_RASTER = 1 VFT2_FONT_TRUETYPE = 3 VFT2_FONT_VECTOR = 2 VFT2_UNKNOWN = 0 VFT_APP = 1 VFT_DLL = 2 VFT_DRV = 3 VFT_FONT = 4 VFT_STATIC_LIB = 7 VFT_UNKNOWN = 0 VFT_VXD = 5 VIETNAMESE_CHARSET = 163 VIEW_E_FIRST = 2147746112 VIEW_E_LAST = 2147746127 VIEW_S_FIRST = 262464 VIEW_S_LAST = 262479 VIFF_DONTDELETEOLD = 0x0002 VIFF_FORCEINSTALL = 0x0001 VIF_ACCESSVIOLATION = 512 VIF_BUFFTOOSMALL = 262144 VIF_CANNOTCREATE = 2048 VIF_CANNOTDELETE = 4096 VIF_CANNOTDELETECUR = 16384 VIF_CANNOTLOADCABINET = 1048576 VIF_CANNOTLOADLZ32 = 524288 VIF_CANNOTREADDST = 131072 VIF_CANNOTREADSRC = 65536 VIF_CANNOTRENAME = 8192 VIF_DIFFCODEPG = 16 VIF_DIFFLANG = 8 VIF_DIFFTYPE = 32 VIF_FILEINUSE = 128 VIF_MISMATCH = 2 VIF_OUTOFMEMORY = 32768 VIF_OUTOFSPACE = 256 VIF_SHARINGVIOLATION = 1024 VIF_SRCOLD = 4 VIF_TEMPFILE = 1 VIF_WRITEPROT = 64 VK_ACCEPT = 0x1E VK_ADD = 0x6B VK_APPS = 0x5D VK_ATTN = 0xF6 VK_BACK = 0x08 VK_BROWSER_BACK = 0xA6 VK_BROWSER_FAVORITES = 0xAB VK_BROWSER_FORWARD = 0xA7 VK_BROWSER_HOME = 0xAC VK_BROWSER_REFRESH = 0xA8 VK_BROWSER_SEARCH = 0xAA VK_BROWSER_STOP = 0xA9 VK_CANCEL = 0x03 VK_CAPITAL = 0x14 VK_CLEAR = 0x0C VK_CONTROL = 0x11 VK_CONVERT = 0x1C VK_CRSEL = 0xF7 VK_DECIMAL = 0x6E VK_DELETE = 0x2E VK_DIVIDE = 0x6F VK_DOWN = 0x28 VK_END = 0x23 VK_EREOF = 0xF9 VK_ESCAPE = 0x1B VK_EXECUTE = 0x2B VK_EXSEL = 0xF8 VK_F1 = 0x70 VK_F10 = 0x79 VK_F11 = 0x7A VK_F12 = 0x7B VK_F13 = 0x7C VK_F14 = 0x7D VK_F15 = 0x7E VK_F16 = 0x7F VK_F17 = 0x80 VK_F18 = 0x81 VK_F19 = 0x82 VK_F2 = 0x71 VK_F20 = 0x83 VK_F21 = 0x84 VK_F22 = 0x85 VK_F23 = 0x86 VK_F24 = 0x87 VK_F3 = 0x72 VK_F4 = 0x73 VK_F5 = 0x74 VK_F6 = 0x75 VK_F7 = 0x76 VK_F8 = 0x77 VK_F9 = 0x78 VK_FINAL = 0x18 VK_HANGEUL = 0x15 VK_HANGUL = 0x15 VK_HANJA = 0x19 VK_HELP = 0x2F VK_HOME = 0x24 VK_ICO_00 = 0xE4 VK_ICO_CLEAR = 0xE6 VK_ICO_HELP = 0xE3 VK_IME_OFF = 0x1A VK_IME_ON = 0x16 VK_INSERT = 0x2D VK_JUNJA = 0x17 VK_KANA = 0x15 VK_KANJI = 0x19 VK_LAUNCH_APP1 = 0xB6 VK_LAUNCH_APP2 = 0xB7 VK_LAUNCH_MAIL = 0xB4 VK_LAUNCH_MEDIA_SELECT = 0xB5 VK_LBUTTON = 0x01 VK_LCONTROL = 0xA2 VK_LEFT = 0x25 VK_LMENU = 0xA4 VK_LSHIFT = 0xA0 VK_LWIN = 0x5B VK_MBUTTON = 0x04 VK_MEDIA_NEXT_TRACK = 0xB0 VK_MEDIA_PLAY_PAUSE = 0xB3 VK_MEDIA_PREV_TRACK = 0xB1 VK_MEDIA_STOP = 0xB2 VK_MENU = 0x12 VK_MODECHANGE = 0x1F VK_MULTIPLY = 0x6A VK_NEXT = 0x22 VK_NONAME = 0xFC VK_NONCONVERT = 0x1D VK_NUMLOCK = 0x90 VK_NUMPAD0 = 0x60 VK_NUMPAD1 = 0x61 VK_NUMPAD2 = 0x62 VK_NUMPAD3 = 0x63 VK_NUMPAD4 = 0x64 VK_NUMPAD5 = 0x65 VK_NUMPAD6 = 0x66 VK_NUMPAD7 = 0x67 VK_NUMPAD8 = 0x68 VK_NUMPAD9 = 0x69 VK_OEM_1 = 0xBA VK_OEM_102 = 0xE2 VK_OEM_2 = 0xBF VK_OEM_3 = 0xC0 VK_OEM_4 = 0xDB VK_OEM_5 = 0xDC VK_OEM_6 = 0xDD VK_OEM_7 = 0xDE VK_OEM_8 = 0xDF VK_OEM_ATTN = 0xF0 VK_OEM_AUTO = 0xF3 VK_OEM_AX = 0xE1 VK_OEM_BACKTAB = 0xF5 VK_OEM_CLEAR = 0xFE VK_OEM_COMMA = 0xBC VK_OEM_COPY = 0xF2 VK_OEM_CUSEL = 0xEF VK_OEM_ENLW = 0xF4 VK_OEM_FINISH = 0xF1 VK_OEM_FJ_JISHO = 0x92 VK_OEM_FJ_LOYA = 0x95 VK_OEM_FJ_MASSHOU = 0x93 VK_OEM_FJ_ROYA = 0x96 VK_OEM_FJ_TOUROKU = 0x94 VK_OEM_JUMP = 0xEA VK_OEM_MINUS = 0xBD VK_OEM_NEC_EQUAL = 0x92 VK_OEM_PA1 = 0xEB VK_OEM_PA2 = 0xEC VK_OEM_PA3 = 0xED VK_OEM_PERIOD = 0xBE VK_OEM_PLUS = 0xBB VK_OEM_RESET = 0xE9 VK_OEM_WSCTRL = 0xEE VK_PA1 = 0xFD VK_PACKET = 0xE7 VK_PAUSE = 0x13 VK_PLAY = 0xFA VK_PRINT = 0x2A VK_PRIOR = 0x21 VK_PROCESSKEY = 0xE5 VK_RBUTTON = 0x02 VK_RCONTROL = 0xA3 VK_RETURN = 0x0D VK_RIGHT = 0x27 VK_RMENU = 0xA5 VK_RSHIFT = 0xA1 VK_RWIN = 0x5C VK_SCROLL = 0x91 VK_SELECT = 0x29 VK_SEPARATOR = 0x6C VK_SHIFT = 0x10 VK_SLEEP = 0x5F VK_SNAPSHOT = 0x2C VK_SPACE = 0x20 VK_SUBTRACT = 0x6D VK_TAB = 0x09 VK_UP = 0x26 VK_VOLUME_DOWN = 0xAE VK_VOLUME_MUTE = 0xAD VK_VOLUME_UP = 0xAF VK_XBUTTON1 = 0x05 VK_XBUTTON2 = 0x06 VK_ZOOM = 0xFB VOLUME_IS_DIRTY = 1 VOLUME_NAME_DOS = 0x0 VOLUME_NAME_GUID = 0x1 VOLUME_NAME_NONE = 0x4 VOLUME_NAME_NT = 0x2 VOLUME_UPGRADE_SCHEDULED = 2 VOS_DOS = 65536 VOS_DOS_WINDOWS16 = 65537 VOS_DOS_WINDOWS32 = 65540 VOS_NT = 262144 VOS_NT_WINDOWS32 = 262148 VOS_OS216 = 131072 VOS_OS216_PM16 = 131074 VOS_OS232 = 196608 VOS_OS232_PM32 = 196611 VOS_UNKNOWN = 0 VOS_WINCE = 327680 VOS__BASE = 0 VOS__PM16 = 2 VOS__PM32 = 3 VOS__WINDOWS16 = 1 VOS__WINDOWS32 = 4 VP_COMMAND_GET = 0x0001 VP_COMMAND_SET = 0x0002 VP_CP_CMD_ACTIVATE = 0x0001 VP_CP_CMD_CHANGE = 0x0004 VP_CP_CMD_DEACTIVATE = 0x0002 VP_CP_TYPE_APS_TRIGGER = 0x0001 VP_CP_TYPE_MACROVISION = 0x0002 VP_FLAGS_BRIGHTNESS = 0x0040 VP_FLAGS_CONTRAST = 0x0080 VP_FLAGS_COPYPROTECT = 0x0100 VP_FLAGS_FLICKER = 0x0004 VP_FLAGS_MAX_UNSCALED = 0x0010 VP_FLAGS_OVERSCAN = 0x0008 VP_FLAGS_POSITION = 0x0020 VP_FLAGS_TV_MODE = 0x0001 VP_FLAGS_TV_STANDARD = 0x0002 VP_MODE_TV_PLAYBACK = 0x0002 VP_MODE_WIN_GRAPHICS = 0x0001 VP_TV_STANDARD_NTSC_433 = 0x00010000 VP_TV_STANDARD_NTSC_M = 0x0001 VP_TV_STANDARD_NTSC_M_J = 0x0002 VP_TV_STANDARD_PAL_60 = 0x00040000 VP_TV_STANDARD_PAL_B = 0x0004 VP_TV_STANDARD_PAL_D = 0x0008 VP_TV_STANDARD_PAL_G = 0x00020000 VP_TV_STANDARD_PAL_H = 0x0010 VP_TV_STANDARD_PAL_I = 0x0020 VP_TV_STANDARD_PAL_M = 0x0040 VP_TV_STANDARD_PAL_N = 0x0080 VP_TV_STANDARD_SECAM_B = 0x0100 VP_TV_STANDARD_SECAM_D = 0x0200 VP_TV_STANDARD_SECAM_G = 0x0400 VP_TV_STANDARD_SECAM_H = 0x0800 VP_TV_STANDARD_SECAM_K = 0x1000 VP_TV_STANDARD_SECAM_K1 = 0x2000 VP_TV_STANDARD_SECAM_L = 0x4000 VP_TV_STANDARD_SECAM_L1 = 0x00080000 VP_TV_STANDARD_WIN_VGA = 0x8000 VREFRESH = 116 VS_FFI_FILEFLAGSMASK = 63 VS_FFI_SIGNATURE = 4277077181 VS_FFI_STRUCVERSION = 65536 VS_FF_DEBUG = 1 VS_FF_INFOINFERRED = 16 VS_FF_PATCHED = 4 VS_FF_PRERELEASE = 2 VS_FF_PRIVATEBUILD = 8 VS_FF_SPECIALBUILD = 32 VS_USER_DEFINED = 100 VS_VERSION_INFO = 1 VTA_BASELINE = 24 VTA_BOTTOM = 2 VTA_CENTER = 6 VTA_LEFT = 8 VTA_RIGHT = 0 VTA_TOP = 0 VTDATEGRE_MAX = 2958465 VTDATEGRE_MIN = -657434 WAIT_CHILD = 0 WAIT_GRANDCHILD = 1 WAIT_TIMEOUT = 258 WALINDEX_MAX_VERSION = 3007000 WAL_ALL_BUT_WRITE = 1 WAL_CKPT_LOCK = 1 WAL_EXCLUSIVE_MODE = 1 WAL_FRAME_HDRSIZE = 24 WAL_HDRSIZE = 32 WAL_HEAPMEMORY_MODE = 2 WAL_LOCK_CKPT = 1 WAL_LOCK_READ0 = 3 WAL_LOCK_WRITE = 0 WAL_MAGIC = 0x377f0682 WAL_MAX_VERSION = 3007000 WAL_NORMAL_MODE = 0 WAL_NREADER = 5 WAL_RDONLY = 1 WAL_RDWR = 0 WAL_RECOVER_LOCK = 2 WAL_RETRY = -1 WAL_SAVEPOINT_NDATA = 4 WAL_SHM_RDONLY = 2 WAL_WRITE_LOCK = 0 WARNING_IPSEC_MM_POLICY_PRUNED = 13024 WARNING_IPSEC_QM_POLICY_PRUNED = 13025 WAVECAPS_LRVOLUME = 0x0008 WAVECAPS_PITCH = 0x0001 WAVECAPS_PLAYBACKRATE = 0x0002 WAVECAPS_SAMPLEACCURATE = 0x0020 WAVECAPS_SYNC = 0x0010 WAVECAPS_VOLUME = 0x0004 WAVERR_BADFORMAT = 32 WAVERR_BASE = 32 WAVERR_LASTERROR = 35 WAVERR_STILLPLAYING = 33 WAVERR_SYNC = 35 WAVERR_UNPREPARED = 34 WAVE_ALLOWSYNC = 0x0002 WAVE_FORMAT_1M08 = 0x00000001 WAVE_FORMAT_1M16 = 0x00000004 WAVE_FORMAT_1S08 = 0x00000002 WAVE_FORMAT_1S16 = 0x00000008 WAVE_FORMAT_2M08 = 0x00000010 WAVE_FORMAT_2M16 = 0x00000040 WAVE_FORMAT_2S08 = 0x00000020 WAVE_FORMAT_2S16 = 0x00000080 WAVE_FORMAT_44M08 = 0x00000100 WAVE_FORMAT_44M16 = 0x00000400 WAVE_FORMAT_44S08 = 0x00000200 WAVE_FORMAT_44S16 = 0x00000800 WAVE_FORMAT_48M08 = 0x00001000 WAVE_FORMAT_48M16 = 0x00004000 WAVE_FORMAT_48S08 = 0x00002000 WAVE_FORMAT_48S16 = 0x00008000 WAVE_FORMAT_4M08 = 0x00000100 WAVE_FORMAT_4M16 = 0x00000400 WAVE_FORMAT_4S08 = 0x00000200 WAVE_FORMAT_4S16 = 0x00000800 WAVE_FORMAT_96M08 = 0x00010000 WAVE_FORMAT_96M16 = 0x00040000 WAVE_FORMAT_96S08 = 0x00020000 WAVE_FORMAT_96S16 = 0x00080000 WAVE_FORMAT_DIRECT = 0x0008 WAVE_FORMAT_DIRECT_QUERY = 9 WAVE_FORMAT_PCM = 1 WAVE_FORMAT_QUERY = 0x0001 WAVE_INVALIDFORMAT = 0x00000000 WAVE_MAPPED = 0x0004 WA_ACTIVE = 1 WA_CLICKACTIVE = 2 WA_INACTIVE = 0 WB_ISDELIMITER = 2 WB_LEFT = 0 WB_RIGHT = 1 WC_COMPOSITECHECK = 0x00000200 WC_DEFAULTCHAR = 0x00000040 WC_DISCARDNS = 0x00000010 WC_NO_BEST_FIT_CHARS = 0x00000400 WC_SEPCHARS = 0x00000020 WDK_NTDDI_VERSION = 167772170 WDT_INPROC64_CALL = 1349805143 WDT_INPROC_CALL = 1215587415 WDT_REMOTE_CALL = 1383359575 WGL_FONT_LINES = 0 WGL_FONT_POLYGONS = 1 WGL_SWAPMULTIPLE_MAX = 16 WGL_SWAP_MAIN_PLANE = 0x00000001 WGL_SWAP_OVERLAY1 = 0x00000002 WGL_SWAP_OVERLAY10 = 0x00000400 WGL_SWAP_OVERLAY11 = 0x00000800 WGL_SWAP_OVERLAY12 = 0x00001000 WGL_SWAP_OVERLAY13 = 0x00002000 WGL_SWAP_OVERLAY14 = 0x00004000 WGL_SWAP_OVERLAY15 = 0x00008000 WGL_SWAP_OVERLAY2 = 0x00000004 WGL_SWAP_OVERLAY3 = 0x00000008 WGL_SWAP_OVERLAY4 = 0x00000010 WGL_SWAP_OVERLAY5 = 0x00000020 WGL_SWAP_OVERLAY6 = 0x00000040 WGL_SWAP_OVERLAY7 = 0x00000080 WGL_SWAP_OVERLAY8 = 0x00000100 WGL_SWAP_OVERLAY9 = 0x00000200 WGL_SWAP_UNDERLAY1 = 0x00010000 WGL_SWAP_UNDERLAY10 = 0x02000000 WGL_SWAP_UNDERLAY11 = 0x04000000 WGL_SWAP_UNDERLAY12 = 0x08000000 WGL_SWAP_UNDERLAY13 = 0x10000000 WGL_SWAP_UNDERLAY14 = 0x20000000 WGL_SWAP_UNDERLAY15 = 0x40000000 WGL_SWAP_UNDERLAY2 = 0x00020000 WGL_SWAP_UNDERLAY3 = 0x00040000 WGL_SWAP_UNDERLAY4 = 0x00080000 WGL_SWAP_UNDERLAY5 = 0x00100000 WGL_SWAP_UNDERLAY6 = 0x00200000 WGL_SWAP_UNDERLAY7 = 0x00400000 WGL_SWAP_UNDERLAY8 = 0x00800000 WGL_SWAP_UNDERLAY9 = 0x01000000 WHDR_BEGINLOOP = 0x00000004 WHDR_DONE = 0x00000001 WHDR_ENDLOOP = 0x00000008 WHDR_INQUEUE = 0x00000010 WHDR_PREPARED = 0x00000002 WHEEL_DELTA = 120 WHEEL_PAGESCROLL = 4294967295 WHERE_AGG_DISTINCT = 0x0400 WHERE_AUTO_INDEX = 0x00004000 WHERE_BIGNULL_SORT = 0x00080000 WHERE_BLOOMFILTER = 0x00400000 WHERE_BOTH_LIMIT = 0x00000030 WHERE_BTM_LIMIT = 0x00000020 WHERE_COLUMN_EQ = 0x00000001 WHERE_COLUMN_IN = 0x00000004 WHERE_COLUMN_NULL = 0x00000008 WHERE_COLUMN_RANGE = 0x00000002 WHERE_CONSTRAINT = 0x0000000f WHERE_DISTINCTBY = 0x0080 WHERE_DISTINCT_NOOP = 0 WHERE_DISTINCT_ORDERED = 2 WHERE_DISTINCT_UNIQUE = 1 WHERE_DISTINCT_UNORDERED = 3 WHERE_DUPLICATES_OK = 0x0010 WHERE_EXPRIDX = 0x04000000 WHERE_GROUPBY = 0x0040 WHERE_IDX_ONLY = 0x00000040 WHERE_INDEXED = 0x00000200 WHERE_IN_ABLE = 0x00000800 WHERE_IN_EARLYOUT = 0x00040000 WHERE_IN_SEEKSCAN = 0x00100000 WHERE_IPK = 0x00000100 WHERE_MULTI_OR = 0x00002000 WHERE_OMIT_OFFSET = 0x01000000 WHERE_ONEPASS_DESIRED = 0x0004 WHERE_ONEPASS_MULTIROW = 0x0008 WHERE_ONEROW = 0x00001000 WHERE_ORDERBY_LIMIT = 0x0800 WHERE_ORDERBY_MAX = 0x0002 WHERE_ORDERBY_MIN = 0x0001 WHERE_ORDERBY_NORMAL = 0x0000 WHERE_OR_SUBCLAUSE = 0x0020 WHERE_PARTIALIDX = 0x00020000 WHERE_RIGHT_JOIN = 0x1000 WHERE_SELFCULL = 0x00800000 WHERE_SKIPSCAN = 0x00008000 WHERE_SORTBYGROUP = 0x0200 WHERE_TOP_LIMIT = 0x00000010 WHERE_TRANSCONS = 0x00200000 WHERE_UNQ_WANTED = 0x00010000 WHERE_USE_LIMIT = 0x4000 WHERE_VIEWSCAN = 0x02000000 WHERE_VIRTUALTABLE = 0x00000400 WHERE_WANT_DISTINCT = 0x0100 WHITEONBLACK = 2 WHITE_BRUSH = 0 WHITE_PEN = 6 WH_CALLWNDPROC = 4 WH_CALLWNDPROCRET = 12 WH_CBT = 5 WH_DEBUG = 9 WH_FOREGROUNDIDLE = 11 WH_GETMESSAGE = 3 WH_HARDWARE = 8 WH_JOURNALPLAYBACK = 1 WH_JOURNALRECORD = 0 WH_KEYBOARD = 2 WH_KEYBOARD_LL = 13 WH_MAX = 14 WH_MAXHOOK = 14 WH_MIN = -1 WH_MINHOOK = -1 WH_MOUSE = 7 WH_MOUSE_LL = 14 WH_MSGFILTER = -1 WH_SHELL = 10 WH_SYSMSGFILTER = 6 WIM_CLOSE = 959 WIM_DATA = 960 WIM_OPEN = 958 WIN32 = 1 WIN64 = 1 WINAPI = 0 WINAPI_FAMILY = 3 WINAPI_FAMILY_APP = 2 WINAPI_FAMILY_DESKTOP_APP = 3 WINAPI_INLINE = 0 WINAPI_PARTITION_APP = 0x2 WINAPI_PARTITION_DESKTOP = 0x1 WINCRYPT_DWORD_CPP_ONLY = 0 WINDING = 2 WINDOW_AGGINVERSE = 2 WINDOW_AGGSTEP = 3 WINDOW_BUFFER_SIZE_EVENT = 0x4 WINDOW_ENDING_INT = 1 WINDOW_ENDING_NUM = 4 WINDOW_NTH_VALUE_INT = 2 WINDOW_RETURN_ROW = 1 WINDOW_STARTING_INT = 0 WINDOW_STARTING_NUM = 3 WINEVENT_INCONTEXT = 0x0004 WINEVENT_OUTOFCONTEXT = 0x0000 WINEVENT_SKIPOWNPROCESS = 0x0002 WINEVENT_SKIPOWNTHREAD = 0x0001 WINFILE_PERSIST_WAL = 0x04 WINFILE_PSOW = 0x10 WINFILE_RDONLY = 0x02 WININETINFO_OPTION_LOCK_HANDLE = 65534 WINNT = 1 WINPERF_LOG_DEBUG = 2 WINPERF_LOG_NONE = 0 WINPERF_LOG_USER = 1 WINPERF_LOG_VERBOSE = 3 WINPTHREAD_API = 0 WINSCARDAPI = 0 WINSHM_RDLCK = 2 WINSHM_UNLCK = 1 WINSHM_WRLCK = 3 WINSTA_ACCESSCLIPBOARD = 4 WINSTA_ACCESSGLOBALATOMS = 32 WINSTA_ALL_ACCESS = 895 WINSTA_CREATEDESKTOP = 8 WINSTA_ENUMDESKTOPS = 1 WINSTA_ENUMERATE = 256 WINSTA_EXITWINDOWS = 64 WINSTA_READATTRIBUTES = 2 WINSTA_READSCREEN = 512 WINSTA_WRITEATTRIBUTES = 16 WINVER = 1282 WIN_PTHREADS_TIME_H = 0 WIN_SHM_BASE = 120 WIN_SHM_DMS = 128 WIZ_BODYCX = 184 WIZ_BODYX = 92 WIZ_CXBMP = 80 WIZ_CXDLG = 276 WIZ_CYDLG = 140 WMSZ_BOTTOM = 6 WMSZ_BOTTOMLEFT = 7 WMSZ_BOTTOMRIGHT = 8 WMSZ_LEFT = 1 WMSZ_RIGHT = 2 WMSZ_TOP = 3 WMSZ_TOPLEFT = 4 WMSZ_TOPRIGHT = 5 WM_ACTIVATE = 0x0006 WM_ACTIVATEAPP = 0x001C WM_AFXFIRST = 0x0360 WM_AFXLAST = 0x037F WM_APP = 0x8000 WM_APPCOMMAND = 0x0319 WM_ASKCBFORMATNAME = 0x030C WM_CANCELJOURNAL = 0x004B WM_CANCELMODE = 0x001F WM_CAPTURECHANGED = 0x0215 WM_CHANGECBCHAIN = 0x030D WM_CHANGEUISTATE = 0x0127 WM_CHAR = 0x0102 WM_CHARTOITEM = 0x002F WM_CHILDACTIVATE = 0x0022 WM_CHOOSEFONT_GETLOGFONT = 1025 WM_CHOOSEFONT_SETFLAGS = 1126 WM_CHOOSEFONT_SETLOGFONT = 1125 WM_CLEAR = 0x0303 WM_CLIPBOARDUPDATE = 0x031d WM_CLOSE = 0x0010 WM_COMMAND = 0x0111 WM_COMMNOTIFY = 0x0044 WM_COMPACTING = 0x0041 WM_COMPAREITEM = 0x0039 WM_CONTEXTMENU = 0x007B WM_COPY = 0x0301 WM_COPYDATA = 0x004A WM_CREATE = 0x0001 WM_CTLCOLORBTN = 0x0135 WM_CTLCOLORDLG = 0x0136 WM_CTLCOLOREDIT = 0x0133 WM_CTLCOLORLISTBOX = 0x0134 WM_CTLCOLORMSGBOX = 0x0132 WM_CTLCOLORSCROLLBAR = 0x0137 WM_CTLCOLORSTATIC = 0x0138 WM_CUT = 0x0300 WM_DDE_ACK = 996 WM_DDE_ADVISE = 994 WM_DDE_DATA = 997 WM_DDE_EXECUTE = 1000 WM_DDE_FIRST = 0x03E0 WM_DDE_INITIATE = 992 WM_DDE_LAST = 1000 WM_DDE_POKE = 999 WM_DDE_REQUEST = 998 WM_DDE_TERMINATE = 993 WM_DDE_UNADVISE = 995 WM_DEADCHAR = 0x0103 WM_DELETEITEM = 0x002D WM_DESTROY = 0x0002 WM_DESTROYCLIPBOARD = 0x0307 WM_DEVICECHANGE = 0x0219 WM_DEVMODECHANGE = 0x001B WM_DISPLAYCHANGE = 0x007E WM_DRAWCLIPBOARD = 0x0308 WM_DRAWITEM = 0x002B WM_DROPFILES = 0x0233 WM_ENABLE = 0x000A WM_ENDSESSION = 0x0016 WM_ENTERIDLE = 0x0121 WM_ENTERMENULOOP = 0x0211 WM_ENTERSIZEMOVE = 0x0231 WM_ERASEBKGND = 0x0014 WM_EXITMENULOOP = 0x0212 WM_EXITSIZEMOVE = 0x0232 WM_FONTCHANGE = 0x001D WM_GETDLGCODE = 0x0087 WM_GETFONT = 0x0031 WM_GETHOTKEY = 0x0033 WM_GETICON = 0x007F WM_GETMINMAXINFO = 0x0024 WM_GETOBJECT = 0x003D WM_GETTEXT = 0x000D WM_GETTEXTLENGTH = 0x000E WM_HANDHELDFIRST = 0x0358 WM_HANDHELDLAST = 0x035F WM_HELP = 0x0053 WM_HOTKEY = 0x0312 WM_HSCROLL = 0x0114 WM_HSCROLLCLIPBOARD = 0x030E WM_ICONERASEBKGND = 0x0027 WM_IME_CHAR = 0x0286 WM_IME_COMPOSITION = 0x010F WM_IME_COMPOSITIONFULL = 0x0284 WM_IME_CONTROL = 0x0283 WM_IME_ENDCOMPOSITION = 0x010E WM_IME_KEYDOWN = 0x0290 WM_IME_KEYLAST = 0x010F WM_IME_KEYUP = 0x0291 WM_IME_NOTIFY = 0x0282 WM_IME_REQUEST = 0x0288 WM_IME_SELECT = 0x0285 WM_IME_SETCONTEXT = 0x0281 WM_IME_STARTCOMPOSITION = 0x010D WM_INITDIALOG = 0x0110 WM_INITMENU = 0x0116 WM_INITMENUPOPUP = 0x0117 WM_INPUT = 0x00FF WM_INPUTLANGCHANGE = 0x0051 WM_INPUTLANGCHANGEREQUEST = 0x0050 WM_INPUT_DEVICE_CHANGE = 0x00fe WM_KEYDOWN = 0x0100 WM_KEYFIRST = 0x0100 WM_KEYLAST = 0x0109 WM_KEYUP = 0x0101 WM_KILLFOCUS = 0x0008 WM_LBUTTONDBLCLK = 0x0203 WM_LBUTTONDOWN = 0x0201 WM_LBUTTONUP = 0x0202 WM_MBUTTONDBLCLK = 0x0209 WM_MBUTTONDOWN = 0x0207 WM_MBUTTONUP = 0x0208 WM_MDIACTIVATE = 0x0222 WM_MDICASCADE = 0x0227 WM_MDICREATE = 0x0220 WM_MDIDESTROY = 0x0221 WM_MDIGETACTIVE = 0x0229 WM_MDIICONARRANGE = 0x0228 WM_MDIMAXIMIZE = 0x0225 WM_MDINEXT = 0x0224 WM_MDIREFRESHMENU = 0x0234 WM_MDIRESTORE = 0x0223 WM_MDISETMENU = 0x0230 WM_MDITILE = 0x0226 WM_MEASUREITEM = 0x002C WM_MENUCHAR = 0x0120 WM_MENUCOMMAND = 0x0126 WM_MENUDRAG = 0x0123 WM_MENUGETOBJECT = 0x0124 WM_MENURBUTTONUP = 0x0122 WM_MENUSELECT = 0x011F WM_MOUSEACTIVATE = 0x0021 WM_MOUSEFIRST = 0x0200 WM_MOUSEHOVER = 0x02A1 WM_MOUSELAST = 0x020d WM_MOUSELEAVE = 0x02A3 WM_MOUSEMOVE = 0x0200 WM_MOUSEWHEEL = 0x020A WM_MOVE = 0x0003 WM_MOVING = 0x0216 WM_NCACTIVATE = 0x0086 WM_NCCALCSIZE = 0x0083 WM_NCCREATE = 0x0081 WM_NCDESTROY = 0x0082 WM_NCHITTEST = 0x0084 WM_NCLBUTTONDBLCLK = 0x00A3 WM_NCLBUTTONDOWN = 0x00A1 WM_NCLBUTTONUP = 0x00A2 WM_NCMBUTTONDBLCLK = 0x00A9 WM_NCMBUTTONDOWN = 0x00A7 WM_NCMBUTTONUP = 0x00A8 WM_NCMOUSEHOVER = 0x02A0 WM_NCMOUSELEAVE = 0x02A2 WM_NCMOUSEMOVE = 0x00A0 WM_NCPAINT = 0x0085 WM_NCRBUTTONDBLCLK = 0x00A6 WM_NCRBUTTONDOWN = 0x00A4 WM_NCRBUTTONUP = 0x00A5 WM_NCXBUTTONDBLCLK = 0x00AD WM_NCXBUTTONDOWN = 0x00AB WM_NCXBUTTONUP = 0x00AC WM_NEXTDLGCTL = 0x0028 WM_NEXTMENU = 0x0213 WM_NOTIFY = 0x004E WM_NOTIFYFORMAT = 0x0055 WM_NULL = 0x0000 WM_PAINT = 0x000F WM_PAINTCLIPBOARD = 0x0309 WM_PAINTICON = 0x0026 WM_PALETTECHANGED = 0x0311 WM_PALETTEISCHANGING = 0x0310 WM_PARENTNOTIFY = 0x0210 WM_PASTE = 0x0302 WM_PENWINFIRST = 0x0380 WM_PENWINLAST = 0x038F WM_POWER = 0x0048 WM_POWERBROADCAST = 0x0218 WM_PRINT = 0x0317 WM_PRINTCLIENT = 0x0318 WM_PSD_ENVSTAMPRECT = 1029 WM_PSD_FULLPAGERECT = 1025 WM_PSD_GREEKTEXTRECT = 1028 WM_PSD_MARGINRECT = 1027 WM_PSD_MINMARGINRECT = 1026 WM_PSD_PAGESETUPDLG = 1024 WM_PSD_YAFULLPAGERECT = 1030 WM_QUERYDRAGICON = 0x0037 WM_QUERYENDSESSION = 0x0011 WM_QUERYNEWPALETTE = 0x030F WM_QUERYOPEN = 0x0013 WM_QUERYUISTATE = 0x0129 WM_QUEUESYNC = 0x0023 WM_QUIT = 0x0012 WM_RBUTTONDBLCLK = 0x0206 WM_RBUTTONDOWN = 0x0204 WM_RBUTTONUP = 0x0205 WM_RENDERALLFORMATS = 0x0306 WM_RENDERFORMAT = 0x0305 WM_SETCURSOR = 0x0020 WM_SETFOCUS = 0x0007 WM_SETFONT = 0x0030 WM_SETHOTKEY = 0x0032 WM_SETICON = 0x0080 WM_SETREDRAW = 0x000B WM_SETTEXT = 0x000C WM_SETTINGCHANGE = 26 WM_SHOWWINDOW = 0x0018 WM_SIZE = 0x0005 WM_SIZECLIPBOARD = 0x030B WM_SIZING = 0x0214 WM_SPOOLERSTATUS = 0x002A WM_STYLECHANGED = 0x007D WM_STYLECHANGING = 0x007C WM_SYNCPAINT = 0x0088 WM_SYSCHAR = 0x0106 WM_SYSCOLORCHANGE = 0x0015 WM_SYSCOMMAND = 0x0112 WM_SYSDEADCHAR = 0x0107 WM_SYSKEYDOWN = 0x0104 WM_SYSKEYUP = 0x0105 WM_TABLET_FIRST = 0x02c0 WM_TABLET_LAST = 0x02df WM_TCARD = 0x0052 WM_THEMECHANGED = 0x031A WM_TIMECHANGE = 0x001E WM_TIMER = 0x0113 WM_UNDO = 0x0304 WM_UNICHAR = 0x0109 WM_UNINITMENUPOPUP = 0x0125 WM_UPDATEUISTATE = 0x0128 WM_USER = 0x0400 WM_USERCHANGED = 0x0054 WM_VKEYTOITEM = 0x002E WM_VSCROLL = 0x0115 WM_VSCROLLCLIPBOARD = 0x030A WM_WINDOWPOSCHANGED = 0x0047 WM_WINDOWPOSCHANGING = 0x0046 WM_WININICHANGE = 0x001A WM_WTSSESSION_CHANGE = 0x02B1 WM_XBUTTONDBLCLK = 0x020D WM_XBUTTONDOWN = 0x020B WM_XBUTTONUP = 0x020C WNCON_DYNAMIC = 0x00000008 WNCON_FORNETCARD = 0x00000001 WNCON_NOTROUTED = 0x00000002 WNCON_SLOWLINK = 0x00000004 WNFMT_ABBREVIATED = 0x02 WNFMT_CONNECTION = 0x20 WNFMT_INENUM = 0x10 WNFMT_MULTILINE = 0x01 WNNC_CRED_MANAGER = 0xffff0000 WNNC_NET_10NET = 0x00050000 WNNC_NET_3IN1 = 0x00270000 WNNC_NET_9TILES = 0x00090000 WNNC_NET_APPLETALK = 0x00130000 WNNC_NET_AS400 = 0x000b0000 WNNC_NET_AVID = 0x001a0000 WNNC_NET_AVID1 = 0x003a0000 WNNC_NET_BMC = 0x00180000 WNNC_NET_BWNFS = 0x00100000 WNNC_NET_CLEARCASE = 0x00160000 WNNC_NET_COGENT = 0x00110000 WNNC_NET_CSC = 0x00260000 WNNC_NET_DAV = 0x002e0000 WNNC_NET_DCE = 0x00190000 WNNC_NET_DECORB = 0x00200000 WNNC_NET_DFS = 0x003b0000 WNNC_NET_DISTINCT = 0x00230000 WNNC_NET_DOCUSPACE = 0x001b0000 WNNC_NET_DRIVEONWEB = 0x003e0000 WNNC_NET_EXIFS = 0x002d0000 WNNC_NET_EXTENDNET = 0x00290000 WNNC_NET_FARALLON = 0x00120000 WNNC_NET_FJ_REDIR = 0x00220000 WNNC_NET_FOXBAT = 0x002b0000 WNNC_NET_FRONTIER = 0x00170000 WNNC_NET_FTP_NFS = 0x000c0000 WNNC_NET_GOOGLE = 0x00430000 WNNC_NET_HOB_NFS = 0x00320000 WNNC_NET_IBMAL = 0x00340000 WNNC_NET_INTERGRAPH = 0x00140000 WNNC_NET_KNOWARE = 0x002f0000 WNNC_NET_KWNP = 0x003c0000 WNNC_NET_LANMAN = 131072 WNNC_NET_LANSTEP = 0x00080000 WNNC_NET_LANTASTIC = 0x000a0000 WNNC_NET_LIFENET = 0x000e0000 WNNC_NET_LOCK = 0x00350000 WNNC_NET_LOCUS = 0x00060000 WNNC_NET_MANGOSOFT = 0x001c0000 WNNC_NET_MASFAX = 0x00310000 WNNC_NET_MFILES = 0x00410000 WNNC_NET_MSNET = 0x00010000 WNNC_NET_MS_NFS = 0x00420000 WNNC_NET_NDFS = 0x00440000 WNNC_NET_NETWARE = 0x00030000 WNNC_NET_OBJECT_DIRE = 0x00300000 WNNC_NET_OPENAFS = 0x00390000 WNNC_NET_PATHWORKS = 0x000d0000 WNNC_NET_POWERLAN = 0x000f0000 WNNC_NET_PROTSTOR = 0x00210000 WNNC_NET_QUINCY = 0x00380000 WNNC_NET_RDR2SAMPLE = 0x00250000 WNNC_NET_RIVERFRONT1 = 0x001e0000 WNNC_NET_RIVERFRONT2 = 0x001f0000 WNNC_NET_RSFX = 0x00400000 WNNC_NET_SERNET = 0x001d0000 WNNC_NET_SHIVA = 0x00330000 WNNC_NET_SMB = 0x00020000 WNNC_NET_SRT = 0x00370000 WNNC_NET_STAC = 0x002a0000 WNNC_NET_SUN_PC_NFS = 0x00070000 WNNC_NET_SYMFONET = 0x00150000 WNNC_NET_TERMSRV = 0x00360000 WNNC_NET_TWINS = 0x00240000 WNNC_NET_VINES = 0x00040000 WNNC_NET_VMWARE = 0x003f0000 WNNC_NET_YAHOO = 0x002c0000 WNNC_NET_ZENWORKS = 0x003d0000 WN_ACCESS_DENIED = 5 WN_ALREADY_CONNECTED = 85 WN_BAD_DEV_TYPE = 66 WN_BAD_HANDLE = 6 WN_BAD_LEVEL = 124 WN_BAD_LOCALNAME = 1200 WN_BAD_NETNAME = 67 WN_BAD_PASSWORD = 86 WN_BAD_POINTER = 487 WN_BAD_PROFILE = 1206 WN_BAD_PROVIDER = 1204 WN_BAD_USER = 2202 WN_BAD_VALUE = 87 WN_CANCEL = 1223 WN_CANNOT_OPEN_PROFILE = 1205 WN_CONNECTED_OTHER_PASSWORD = 2108 WN_CONNECTED_OTHER_PASSWORD_DEFAULT = 2109 WN_CONNECTION_CLOSED = 1201 WN_DEVICE_ALREADY_REMEMBERED = 1202 WN_DEVICE_ERROR = 31 WN_DEVICE_IN_USE = 2404 WN_EXTENDED_ERROR = 1208 WN_FUNCTION_BUSY = 170 WN_MORE_DATA = 234 WN_NET_ERROR = 59 WN_NOT_AUTHENTICATED = 1244 WN_NOT_CONNECTED = 2250 WN_NOT_CONTAINER = 1207 WN_NOT_INITIALIZING = 1247 WN_NOT_LOGGED_ON = 1245 WN_NOT_SUPPORTED = 50 WN_NOT_VALIDATED = 1311 WN_NO_ERROR = 0 WN_NO_MORE_DEVICES = 1248 WN_NO_MORE_ENTRIES = 259 WN_NO_NETWORK = 1222 WN_NO_NET_OR_BAD_PATH = 1203 WN_OPEN_FILES = 2401 WN_OUT_OF_MEMORY = 8 WN_RETRY = 1237 WN_SUCCESS = 0 WN_WINDOWS_ERROR = 59 WOM_CLOSE = 956 WOM_DONE = 957 WOM_OPEN = 955 WOW64_CONTEXT_ALL = 65599 WOW64_CONTEXT_CONTROL = 65537 WOW64_CONTEXT_DEBUG_REGISTERS = 65552 WOW64_CONTEXT_EXCEPTION_ACTIVE = 0x08000000 WOW64_CONTEXT_EXCEPTION_REPORTING = 0x80000000 WOW64_CONTEXT_EXCEPTION_REQUEST = 0x40000000 WOW64_CONTEXT_EXTENDED_REGISTERS = 65568 WOW64_CONTEXT_FLOATING_POINT = 65544 WOW64_CONTEXT_FULL = 65543 WOW64_CONTEXT_INTEGER = 65538 WOW64_CONTEXT_SEGMENTS = 65540 WOW64_CONTEXT_SERVICE_ACTIVE = 0x10000000 WOW64_CONTEXT_XSTATE = 65600 WOW64_CONTEXT_i386 = 0x00010000 WOW64_CONTEXT_i486 = 0x00010000 WOW64_MAXIMUM_SUPPORTED_EXTENSION = 512 WOW64_SIZE_OF_80387_REGISTERS = 80 WO_ALL = 0x3fff WO_AND = 0x0400 WO_AUX = 0x0040 WO_EQ = 0x0002 WO_EQUIV = 0x0800 WO_GE = 32 WO_GT = 4 WO_IN = 0x0001 WO_IS = 0x0080 WO_ISNULL = 0x0100 WO_LE = 8 WO_LT = 16 WO_NOOP = 0x1000 WO_OR = 0x0200 WO_ROWVAL = 0x2000 WO_SINGLE = 0x01ff WPF_ASYNCWINDOWPLACEMENT = 0x0004 WPF_RESTORETOMAXIMIZED = 0x0002 WPF_SETMINPOSITION = 0x0001 WRC_Abort = 2 WRC_Continue = 0 WRC_Prune = 1 WRITE_COMPRESSION_INFO_VALID = 0x00000010 WRITE_DAC = 262144 WRITE_LOCK = 2 WRITE_OWNER = 524288 WRITE_RESTRICTED = 0x8 WRITE_WATCH_FLAG_RESET = 0x01 WSABASEERR = 10000 WSADESCRIPTION_LEN = 256 WSAEACCES = 10013 WSAEADDRINUSE = 10048 WSAEADDRNOTAVAIL = 10049 WSAEAFNOSUPPORT = 10047 WSAEALREADY = 10037 WSAEBADF = 10009 WSAECANCELLED = 10103 WSAECONNABORTED = 10053 WSAECONNREFUSED = 10061 WSAECONNRESET = 10054 WSAEDESTADDRREQ = 10039 WSAEDISCON = 10101 WSAEDQUOT = 10069 WSAEFAULT = 10014 WSAEHOSTDOWN = 10064 WSAEHOSTUNREACH = 10065 WSAEINPROGRESS = 10036 WSAEINTR = 10004 WSAEINVAL = 10022 WSAEINVALIDPROCTABLE = 10104 WSAEINVALIDPROVIDER = 10105 WSAEISCONN = 10056 WSAELOOP = 10062 WSAEMFILE = 10024 WSAEMSGSIZE = 10040 WSAENAMETOOLONG = 10063 WSAENETDOWN = 10050 WSAENETRESET = 10052 WSAENETUNREACH = 10051 WSAENOBUFS = 10055 WSAENOMORE = 10102 WSAENOPROTOOPT = 10042 WSAENOTCONN = 10057 WSAENOTEMPTY = 10066 WSAENOTSOCK = 10038 WSAEOPNOTSUPP = 10045 WSAEPFNOSUPPORT = 10046 WSAEPROCLIM = 10067 WSAEPROTONOSUPPORT = 10043 WSAEPROTOTYPE = 10041 WSAEPROVIDERFAILEDINIT = 10106 WSAEREFUSED = 10112 WSAEREMOTE = 10071 WSAESHUTDOWN = 10058 WSAESOCKTNOSUPPORT = 10044 WSAESTALE = 10070 WSAETIMEDOUT = 10060 WSAETOOMANYREFS = 10059 WSAEUSERS = 10068 WSAEWOULDBLOCK = 10035 WSAHOST_NOT_FOUND = 11001 WSANOTINITIALISED = 10093 WSANO_ADDRESS = 11004 WSANO_DATA = 11004 WSANO_RECOVERY = 11003 WSASERVICE_NOT_FOUND = 10108 WSASYSCALLFAILURE = 10107 WSASYSNOTREADY = 10091 WSASYS_STATUS_LEN = 128 WSATRY_AGAIN = 11002 WSATYPE_NOT_FOUND = 10109 WSAVERNOTSUPPORTED = 10092 WSA_E_CANCELLED = 10111 WSA_E_NO_MORE = 10110 WSA_QOS_ADMISSION_FAILURE = 11010 WSA_QOS_BAD_OBJECT = 11013 WSA_QOS_BAD_STYLE = 11012 WSA_QOS_EFILTERCOUNT = 11021 WSA_QOS_EFILTERSTYLE = 11019 WSA_QOS_EFILTERTYPE = 11020 WSA_QOS_EFLOWCOUNT = 11023 WSA_QOS_EFLOWDESC = 11026 WSA_QOS_EFLOWSPEC = 11017 WSA_QOS_EOBJLENGTH = 11022 WSA_QOS_EPOLICYOBJ = 11025 WSA_QOS_EPROVSPECBUF = 11018 WSA_QOS_EPSFILTERSPEC = 11028 WSA_QOS_EPSFLOWSPEC = 11027 WSA_QOS_ESDMODEOBJ = 11029 WSA_QOS_ESERVICETYPE = 11016 WSA_QOS_ESHAPERATEOBJ = 11030 WSA_QOS_EUNKNOWNPSOBJ = 11024 WSA_QOS_EUNKOWNPSOBJ = 11024 WSA_QOS_GENERIC_ERROR = 11015 WSA_QOS_NO_RECEIVERS = 11008 WSA_QOS_NO_SENDERS = 11007 WSA_QOS_POLICY_FAILURE = 11011 WSA_QOS_RECEIVERS = 11005 WSA_QOS_REQUEST_CONFIRMED = 11009 WSA_QOS_RESERVED_PETYPE = 11031 WSA_QOS_SENDERS = 11006 WSA_QOS_TRAFFIC_CTRL_ERROR = 11014 WSF_VISIBLE = 1 WS_ACTIVECAPTION = 0x0001 WS_BORDER = 8388608 WS_CAPTION = 12582912 WS_CHILD = 1073741824 WS_CHILDWINDOW = 1073741824 WS_CLIPCHILDREN = 33554432 WS_CLIPSIBLINGS = 67108864 WS_DISABLED = 134217728 WS_DLGFRAME = 4194304 WS_EX_ACCEPTFILES = 16 WS_EX_APPWINDOW = 262144 WS_EX_CLIENTEDGE = 512 WS_EX_COMPOSITED = 33554432 WS_EX_CONTEXTHELP = 1024 WS_EX_CONTROLPARENT = 65536 WS_EX_DLGMODALFRAME = 1 WS_EX_LAYERED = 0x00080000 WS_EX_LAYOUTRTL = 4194304 WS_EX_LEFT = 0 WS_EX_LEFTSCROLLBAR = 16384 WS_EX_LTRREADING = 0 WS_EX_MDICHILD = 64 WS_EX_NOACTIVATE = 134217728 WS_EX_NOINHERITLAYOUT = 1048576 WS_EX_NOPARENTNOTIFY = 4 WS_EX_OVERLAPPEDWINDOW = 768 WS_EX_PALETTEWINDOW = 392 WS_EX_RIGHT = 4096 WS_EX_RIGHTSCROLLBAR = 0 WS_EX_RTLREADING = 8192 WS_EX_STATICEDGE = 131072 WS_EX_TOOLWINDOW = 128 WS_EX_TOPMOST = 8 WS_EX_TRANSPARENT = 32 WS_EX_WINDOWEDGE = 256 WS_GROUP = 131072 WS_HSCROLL = 1048576 WS_ICONIC = 536870912 WS_MAXIMIZE = 16777216 WS_MAXIMIZEBOX = 65536 WS_MINIMIZE = 536870912 WS_MINIMIZEBOX = 131072 WS_OVERLAPPED = 0 WS_OVERLAPPEDWINDOW = 13565952 WS_POPUP = 2147483648 WS_POPUPWINDOW = 2156396544 WS_SIZEBOX = 262144 WS_SYSMENU = 524288 WS_TABSTOP = 65536 WS_THICKFRAME = 262144 WS_TILED = 0 WS_TILEDWINDOW = 13565952 WS_VISIBLE = 268435456 WS_VSCROLL = 2097152 WTS_CONSOLE_CONNECT = 0x1 WTS_CONSOLE_DISCONNECT = 0x2 WTS_REMOTE_CONNECT = 0x3 WTS_REMOTE_DISCONNECT = 0x4 WTS_SESSION_CREATE = 0xa WTS_SESSION_LOCK = 0x7 WTS_SESSION_LOGOFF = 0x6 WTS_SESSION_LOGON = 0x5 WTS_SESSION_REMOTE_CONTROL = 0x9 WTS_SESSION_TERMINATE = 0xb WTS_SESSION_UNLOCK = 0x8 WT_EXECUTEDEFAULT = 0x00000000 WT_EXECUTEDELETEWAIT = 0x00000008 WT_EXECUTEINIOTHREAD = 0x00000001 WT_EXECUTEINLONGTHREAD = 0x00000010 WT_EXECUTEINPERSISTENTIOTHREAD = 0x00000040 WT_EXECUTEINPERSISTENTTHREAD = 0x00000080 WT_EXECUTEINTIMERTHREAD = 0x00000020 WT_EXECUTEINUITHREAD = 0x00000002 WT_EXECUTEINWAITTHREAD = 0x00000004 WT_EXECUTELONGFUNCTION = 0x00000010 WT_EXECUTEONLYONCE = 0x00000008 WT_TRANSFER_IMPERSONATION = 0x00000100 WVR_ALIGNBOTTOM = 0x0040 WVR_ALIGNLEFT = 0x0020 WVR_ALIGNRIGHT = 0x0080 WVR_ALIGNTOP = 0x0010 WVR_HREDRAW = 0x0100 WVR_REDRAW = 768 WVR_VALIDRECTS = 0x0400 WVR_VREDRAW = 0x0200 X3_BTYPE_QP_INST_VAL_POS_X = 0 X3_BTYPE_QP_INST_WORD_POS_X = 23 X3_BTYPE_QP_INST_WORD_X = 2 X3_BTYPE_QP_SIZE_X = 9 X3_D_WH_INST_WORD_POS_X = 24 X3_D_WH_INST_WORD_X = 3 X3_D_WH_SIGN_VAL_POS_X = 0 X3_D_WH_SIZE_X = 3 X3_EMPTY_INST_VAL_POS_X = 0 X3_EMPTY_INST_WORD_POS_X = 14 X3_EMPTY_INST_WORD_X = 1 X3_EMPTY_SIZE_X = 2 X3_IMM20_INST_WORD_POS_X = 4 X3_IMM20_INST_WORD_X = 3 X3_IMM20_SIGN_VAL_POS_X = 0 X3_IMM20_SIZE_X = 20 X3_IMM39_1_INST_WORD_POS_X = 0 X3_IMM39_1_INST_WORD_X = 2 X3_IMM39_1_SIGN_VAL_POS_X = 36 X3_IMM39_1_SIZE_X = 23 X3_IMM39_2_INST_WORD_POS_X = 16 X3_IMM39_2_INST_WORD_X = 1 X3_IMM39_2_SIGN_VAL_POS_X = 20 X3_IMM39_2_SIZE_X = 16 X3_I_INST_WORD_POS_X = 27 X3_I_INST_WORD_X = 3 X3_I_SIGN_VAL_POS_X = 59 X3_I_SIZE_X = 1 X3_OPCODE_INST_WORD_POS_X = 28 X3_OPCODE_INST_WORD_X = 3 X3_OPCODE_SIGN_VAL_POS_X = 0 X3_OPCODE_SIZE_X = 4 X3_P_INST_WORD_POS_X = 0 X3_P_INST_WORD_X = 3 X3_P_SIGN_VAL_POS_X = 0 X3_P_SIZE_X = 4 X3_TMPLT_INST_WORD_POS_X = 0 X3_TMPLT_INST_WORD_X = 0 X3_TMPLT_SIGN_VAL_POS_X = 0 X3_TMPLT_SIZE_X = 4 X509_ASN_ENCODING = 0x1 X509_NDR_ENCODING = 0x2 XACT_E_FIRST = 0x8004D000 XACT_E_LAST = 0x8004D029 XACT_S_FIRST = 0x0004D000 XACT_S_LAST = 0x0004D010 XBUTTON1 = 0x0001 XBUTTON2 = 0x0002 XCLASS_BOOL = 0x1000 XCLASS_DATA = 0x2000 XCLASS_FLAGS = 0x4000 XCLASS_MASK = 0xFC00 XCLASS_NOTIFICATION = 0x8000 XN_EXPR = -2 XN_ROWID = -1 XSTATE_AVX = 2 XSTATE_GSSE = 2 XSTATE_LEGACY_FLOATING_POINT = 0 XSTATE_LEGACY_SSE = 1 XSTATE_MASK_AVX = 4 XSTATE_MASK_GSSE = 4 XSTATE_MASK_LEGACY = 3 XSTATE_MASK_LEGACY_FLOATING_POINT = 1 XSTATE_MASK_LEGACY_SSE = 2 XST_ADVACKRCVD = 13 XST_ADVDATAACKRCVD = 16 XST_ADVDATASENT = 15 XST_ADVSENT = 11 XST_CONNECTED = 2 XST_DATARCVD = 6 XST_EXECACKRCVD = 10 XST_EXECSENT = 9 XST_INCOMPLETE = 1 XST_INIT1 = 3 XST_INIT2 = 4 XST_NULL = 0 XST_POKEACKRCVD = 8 XST_POKESENT = 7 XST_REQSENT = 5 XST_UNADVACKRCVD = 14 XST_UNADVSENT = 12 XTYPF_ACKREQ = 0x0008 XTYPF_NOBLOCK = 0x0002 XTYPF_NODATA = 0x0004 XTYP_ADVDATA = 16400 XTYP_ADVREQ = 8226 XTYP_ADVSTART = 4144 XTYP_ADVSTOP = 32832 XTYP_CONNECT = 4194 XTYP_CONNECT_CONFIRM = 32882 XTYP_DISCONNECT = 32962 XTYP_ERROR = 32770 XTYP_EXECUTE = 16464 XTYP_MASK = 0x00F0 XTYP_MONITOR = 33010 XTYP_POKE = 16528 XTYP_REGISTER = 32930 XTYP_REQUEST = 8368 XTYP_SHIFT = 4 XTYP_UNREGISTER = 32978 XTYP_WILDCONNECT = 8418 XTYP_XACT_COMPLETE = 32896 YYFALLBACK = 1 YYNOCODE = 319 YYNOERRORRECOVERY = 1 YYNRULE = 405 YYNRULE_WITH_ACTION = 342 YYNSTATE = 576 YYNTOKEN = 185 YYPARSEFREENEVERNULL = 1 YYSTACKDEPTH = 100 YYWILDCARD = 101 YY_ACCEPT_ACTION = 1241 YY_ACTTAB_COUNT = 2098 YY_ERROR_ACTION = 1240 YY_MAX_REDUCE = 1647 YY_MAX_SHIFT = 575 YY_MAX_SHIFTREDUCE = 1239 YY_MIN_REDUCE = 1243 YY_MIN_SHIFTREDUCE = 835 YY_NO_ACTION = 1242 YY_REDUCE_COUNT = 408 YY_REDUCE_MAX = 1740 YY_REDUCE_MIN = -271 YY_SHIFT_COUNT = 575 YY_SHIFT_MAX = 2074 YY_SHIFT_MIN = 0 ZERO_PADDING = 3 X_ADXINTRIN_H_INCLUDED = 0 X_AGLOBAL = 0 X_ALLOCA_S_HEAP_MARKER = 0xDDDD X_ALLOCA_S_MARKER_SIZE = 16 X_ALLOCA_S_STACK_MARKER = 0xCCCC X_ALLOCA_S_THRESHOLD = 1024 X_ALPHA = 259 X_AMD64_ = 0 X_AMMINTRIN_H_INCLUDED = 0 X_ANONYMOUS_STRUCT = 0 X_ANONYMOUS_UNION = 0 X_ANSI_STDARG_H_ = 0 X_ANSI_STDDEF_H = 0 X_APIAPPCONTAINER_ = 0 X_APISECUREBASE_ = 0 X_APISETCCONV_ = 0 X_APISETDEBUG_ = 0 X_APISETFILE_ = 0 X_APISETHANDLE_ = 0 X_APISETLIBLOADER_ = 0 X_APISETNAMESPACE_ = 0 X_APISETREALTIME_ = 0 X_APISETSTRING_ = 0 X_APISETUTIL_ = 0 X_API_SET_H_ = 0 X_APPIDREGFLAGS_DEFINED = 0 X_ARGMAX = 100 X_AUTH_IDENTITY_DEFINED = 0 X_AVX2INTRIN_H_INCLUDED = 0 X_AVX5124FMAPSINTRIN_H_INCLUDED = 0 X_AVX5124VNNIWINTRIN_H_INCLUDED = 0 X_AVX512BF16INTRIN_H_INCLUDED = 0 X_AVX512BF16VLINTRIN_H_INCLUDED = 0 X_AVX512BITALGINTRIN_H_INCLUDED = 0 X_AVX512BWINTRIN_H_INCLUDED = 0 X_AVX512CDINTRIN_H_INCLUDED = 0 X_AVX512DQINTRIN_H_INCLUDED = 0 X_AVX512ERINTRIN_H_INCLUDED = 0 X_AVX512FINTRIN_H_INCLUDED = 0 X_AVX512IFMAINTRIN_H_INCLUDED = 0 X_AVX512IFMAVLINTRIN_H_INCLUDED = 0 X_AVX512PFINTRIN_H_INCLUDED = 0 X_AVX512VBMI2VLINTRIN_H_INCLUDED = 0 X_AVX512VBMIINTRIN_H_INCLUDED = 0 X_AVX512VBMIVLINTRIN_H_INCLUDED = 0 X_AVX512VLBWINTRIN_H_INCLUDED = 0 X_AVX512VLDQINTRIN_H_INCLUDED = 0 X_AVX512VLINTRIN_H_INCLUDED = 0 X_AVX512VNNIVLINTRIN_H_INCLUDED = 0 X_AVX512VP2INTERSECTINTRIN_H_INCLUDED = 0 X_AVX512VP2INTERSECTVLINTRIN_H_INCLUDED = 0 X_AVX512VPOPCNTDQINTRIN_H_INCLUDED = 0 X_AVX512VPOPCNTDQVLINTRIN_H_INCLUDED = 0 X_AVXINTRIN_H_INCLUDED = 0 X_BASETSD_H_ = 0 X_BEM_H_ = 0 X_BLANK = 0x40 X_BLOB_DEFINED = 0 X_BMI2INTRIN_H_INCLUDED = 0 X_BMIINTRIN_H_INCLUDED = 0 X_BOOLEAN_ = 0 X_BSDTYPES_DEFINED = 0 X_Benign_race_begin_ = 0 X_Benign_race_end_ = 0 X_CALL_REPORTFAULT = 0x2 X_CETINTRIN_H_INCLUDED = 0 X_CLDEMOTE_H_INCLUDED = 0 X_CLFLUSHOPTINTRIN_H_INCLUDED = 0 X_CLOCK_T_DEFINED = 0 X_CLWBINTRIN_H_INCLUDED = 0 X_CLZEROINTRIN_H_INCLUDED = 0 X_CMP_EQ_OQ = 0x00 X_CMP_EQ_OS = 0x10 X_CMP_EQ_UQ = 0x08 X_CMP_EQ_US = 0x18 X_CMP_FALSE_OQ = 0x0b X_CMP_FALSE_OS = 0x1b X_CMP_GE_OQ = 0x1d X_CMP_GE_OS = 0x0d X_CMP_GT_OQ = 0x1e X_CMP_GT_OS = 0x0e X_CMP_LE_OQ = 0x12 X_CMP_LE_OS = 0x02 X_CMP_LT_OQ = 0x11 X_CMP_LT_OS = 0x01 X_CMP_NEQ_OQ = 0x0c X_CMP_NEQ_OS = 0x1c X_CMP_NEQ_UQ = 0x04 X_CMP_NEQ_US = 0x14 X_CMP_NGE_UQ = 0x19 X_CMP_NGE_US = 0x09 X_CMP_NGT_UQ = 0x1a X_CMP_NGT_US = 0x0a X_CMP_NLE_UQ = 0x16 X_CMP_NLE_US = 0x06 X_CMP_NLT_UQ = 0x15 X_CMP_NLT_US = 0x05 X_CMP_ORD_Q = 0x07 X_CMP_ORD_S = 0x17 X_CMP_TRUE_UQ = 0x0f X_CMP_TRUE_US = 0x1f X_CMP_UNORD_Q = 0x03 X_CMP_UNORD_S = 0x13 X_COMBASEAPI_H_ = 0 X_COMPLEX_DEFINED = 0 X_COM_Outptr_ = 0 X_COM_Outptr_opt_ = 0 X_COM_Outptr_opt_result_maybenull_ = 0 X_COM_Outptr_result_maybenull_ = 0 X_CONST_RETURN = 0 X_CONTROL = 0x20 X_CRTNOALIAS = 0 X_CRTRESTRICT = 0 X_CRT_ABS_DEFINED = 0 X_CRT_ALGO_DEFINED = 0 X_CRT_ALLOCATION_DEFINED = 0 X_CRT_ALTERNATIVE_IMPORTED = 0 X_CRT_ATOF_DEFINED = 0 X_CRT_CTYPEDATA_DEFINED = 0 X_CRT_DIRECTORY_DEFINED = 0 X_CRT_DOUBLE_DEC = 0 X_CRT_ERRNO_DEFINED = 0 X_CRT_GETPID_DEFINED = 0 X_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS = 4 X_CRT_INTERNAL_LOCAL_SCANF_OPTIONS = 2 X_CRT_INTERNAL_PRINTF_LEGACY_MSVCRT_COMPATIBILITY = 0x0008 X_CRT_INTERNAL_PRINTF_LEGACY_THREE_DIGIT_EXPONENTS = 0x0010 X_CRT_INTERNAL_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION = 0x0001 X_CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS = 0x0004 X_CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR = 0x0002 X_CRT_INTERNAL_SCANF_LEGACY_MSVCRT_COMPATIBILITY = 0x0004 X_CRT_INTERNAL_SCANF_LEGACY_WIDE_SPECIFIERS = 0x0002 X_CRT_INTERNAL_SCANF_SECURECRT = 0x0001 X_CRT_MANAGED_HEAP_DEPRECATE = 0 X_CRT_MATHERR_DEFINED = 0 X_CRT_MEMORY_DEFINED = 0 X_CRT_PACKING = 8 X_CRT_PERROR_DEFINED = 0 X_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES = 0 X_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES_MEMORY = 0 X_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES = 0 X_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT = 0 X_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY = 0 X_CRT_SECURE_NO_DEPRECATE = 0 X_CRT_SWAB_DEFINED = 0 X_CRT_SYSTEM_DEFINED = 0 X_CRT_TERMINATE_DEFINED = 0 X_CRT_USE_WINAPI_FAMILY_DESKTOP_APP = 0 X_CRT_WCTYPEDATA_DEFINED = 0 X_CRT_WPERROR_DEFINED = 0 X_CRT_WSYSTEM_DEFINED = 0 X_CTYPE_DEFINED = 0 X_CVTBUFSIZE = 349 X_CY_DEFINED = 0 X_Const_ = 0 X_DATETIMEAPI_H_ = 0 X_DCOMSCM_REMOTECALL_FLAGS_DEFINED = 0 X_DDEHEADER_INCLUDED_ = 0 X_DEF_WINBOOL_ = 0 X_DEVIOCTL_ = 0 X_DEV_T_DEFINED = 0 X_DIGIT = 0x4 X_DIV_T_DEFINED = 0 X_DLGSH_INCLUDED_ = 0 X_DLL = 0 X_DOMAIN = 1 X_DPI_AWARENESS_CONTEXTS_ = 0 X_DWORDLONG_ = 0 X_EMMINTRIN_H_INCLUDED = 0 X_ENQCMDINTRIN_H_INCLUDED = 0 X_ERRCODE_DEFINED = 0 X_ERRHANDLING_H_ = 0 X_ERROR_STATUS_T_DEFINED = 0 X_EXCEPTION_DEFINED = 0 X_F16CINTRIN_H_INCLUDED = 0 X_FD_SET_WINSOCK_DEFINED = 0 X_FIBERS_H_ = 0 X_FILESYSTEMFSCTL_ = 0 X_FILETIME_ = 0 X_FILE_DEFINED = 0 X_FILE_OFFSET_BITS = 64 X_FILE_OFFSET_BITS_SET_FSEEKO = 0 X_FILE_OFFSET_BITS_SET_FTELLO = 0 X_FILE_OFFSET_BITS_SET_OFFT = 0 X_FLT_WINERROR_ = 0 X_FMA4INTRIN_H_INCLUDED = 0 X_FMAINTRIN_H_INCLUDED = 0 X_FORCENAMELESSUNION = 1 X_FPCLASS_ND = 0x0010 X_FPCLASS_NINF = 0x0004 X_FPCLASS_NN = 0x0008 X_FPCLASS_NZ = 0x0020 X_FPCLASS_PD = 0x0080 X_FPCLASS_PINF = 0x0200 X_FPCLASS_PN = 0x0100 X_FPCLASS_PZ = 0x0040 X_FPCLASS_QNAN = 0x0002 X_FPCLASS_SNAN = 0x0001 X_FPOS_T_DEFINED = 0 X_FREEA_INLINE = 0 X_FREEENTRY = 0 X_FTS5INT_H = 0 X_FTS5_H = 0 X_FTSINT_H = 0 X_FXSRINTRIN_H_INCLUDED = 0 X_Field_z_ = 0 X_GCC_LIMITS_H_ = 0 X_GCC_MAX_ALIGN_T = 0 X_GFNIINTRIN_H_INCLUDED = 0 X_GNU_SOURCE = 0 X_GUIDDEF_H_ = 0 X_HEAPAPI_H_ = 0 X_HEAPBADBEGIN = -3 X_HEAPBADNODE = -4 X_HEAPBADPTR = -6 X_HEAPEMPTY = -1 X_HEAPEND = -5 X_HEAPINFO_DEFINED = 0 X_HEAPOK = -2 X_HEAP_MAXREQ = 0xFFFFFFFFFFFFFFE0 X_HEX = 0x80 X_HITLOGGING_DEFINED = 0 X_HPOWERNOTIFY_DEF_ = 0 X_HRESULT_DEFINED = 0 X_HYPER_DEFINED = 0 X_I16_MAX = 32767 X_I16_MIN = -32768 X_I32_MAX = 2147483647 X_I32_MIN = -2147483648 X_I64_MAX = 9223372036854775807 X_I64_MIN = -9223372036854775808 X_I8_MAX = 127 X_I8_MIN = -128 X_IMMINTRIN_H_INCLUDED = 0 X_IMM_ = 0 X_IMM_SDK_DEFINED_ = 0 X_INC_CDERR = 0 X_INC_COMMDLG = 0 X_INC_CORECRT = 0 X_INC_CORECRT_STARTUP = 0 X_INC_CORECRT_WSTDLIB = 0 X_INC_CRTDEFS = 0 X_INC_CRTDEFS_MACRO = 0 X_INC_CRT_UNICODE_MACROS = 2 X_INC_CTYPE = 0 X_INC_DDEMLH = 0 X_INC_ERRNO = 0 X_INC_EXCPT = 0 X_INC_LIMITS = 0 X_INC_MINGW_SECAPI = 0 X_INC_MMSYSTEM = 0 X_INC_PROCESS = 0 X_INC_SDKDDKVER = 0 X_INC_SETJMP = 0 X_INC_SHELLAPI = 0 X_INC_STDARG = 0 X_INC_STDDEF = 0 X_INC_STDIO = 0 X_INC_STDIO_S = 0 X_INC_STDLIB = 0 X_INC_STDLIB_S = 0 X_INC_STRING = 0 X_INC_STRING_S = 0 X_INC_SWPRINTF_INL = 0 X_INC_TYPES = 0 X_INC_VADEFS = 0 X_INC_VIRTDISK = 0 X_INC_WINAPIFAMILY = 0 X_INC_WINDOWS = 0 X_INC_WTIME_INL = 0 X_INC_WTIME_S_INL = 0 X_INC__MINGW_H = 0 X_INO_T_DEFINED = 0 X_INT128_DEFINED = 0 X_INTEGRAL_MAX_BITS = 64 X_INTERLOCKAPI_H_ = 0 X_INTPTR_T_DEFINED = 0 X_INTRIN_MAC_ = 0 X_IOB_ENTRIES = 20 X_IOEOF = 0x0010 X_IOERR = 0x0020 X_IOFBF = 0x0000 X_IOLBF = 0x0040 X_IOMYBUF = 0x0008 X_IONBF = 0x0004 X_IOREAD = 0x0001 X_IORW = 0x0080 X_IOSTRG = 0x0040 X_IOWRT = 0x0002 X_IO_APISET_H_ = 0 X_IRQL_requires_same_ = 0 X_IRQL_restores_ = 0 X_IRQL_saves_ = 0 X_In_ = 0 X_In_opt_ = 0 X_In_opt_z_ = 0 X_In_z_ = 0 X_Inout_ = 0 X_Inout_opt_ = 0 X_Inout_opt_z_ = 0 X_Inout_z_ = 0 X_Interlocked_ = 0 X_JBLEN = 16 X_JMP_BUF_DEFINED = 0 X_JOBAPISET_H_ = 0 X_KTMTYPES_ = 0 X_LANGID_DEFINED = 0 X_LARGEFILE_SOURCE = 1 X_LARGE_FILE = 1 X_LARGE_INTEGER_DEFINED = 0 X_LCID_DEFINED = 0 X_LDT_ENTRY_DEFINED = 0 X_LEADBYTE = 0x8000 X_LIMITS_H___ = 0 X_LIST_ENTRY_DEFINED = 0 X_LOGPALETTE_DEFINED = 0 X_LOWER = 0x2 X_LPAUTHENTICATIONEX_DEFINED = 0 X_LPAUTHENTICATION_DEFINED = 0 X_LPBINDCALLBACKREDIRECT_DEFINED = 0 X_LPBINDHOST_DEFINED = 0 X_LPBINDING_DEFINED = 0 X_LPBINDPROTOCOL_DEFINED = 0 X_LPBINDSTATUSCALLBACKEX_DEFINED = 0 X_LPBINDSTATUSCALLBACK_DEFINED = 0 X_LPBLOB_DEFINED = 0 X_LPCATALOGFILEINFO_DEFINED = 0 X_LPCBYTE_DEFINED = 0 X_LPCODEINSTALL_DEFINED = 0 X_LPCVOID_DEFINED = 0 X_LPDATAFILTER_DEFINED = 0 X_LPENCODINGFILTERFACTORY_DEFINED = 0 X_LPGETBINDHANDLE_DEFINED = 0 X_LPHTTPNEGOTIATE2_DEFINED = 0 X_LPHTTPNEGOTIATE3_DEFINED = 0 X_LPHTTPNEGOTIATE_DEFINED = 0 X_LPHTTPSECURITY_DEFINED = 0 X_LPIINTERNET = 0 X_LPIINTERNETBINDINFO = 0 X_LPIINTERNETBINDINFOEX = 0 X_LPIINTERNETPRIORITY_DEFINED = 0 X_LPIINTERNETPROTOCOLINFO_DEFINED = 0 X_LPIINTERNETPROTOCOLROOT_DEFINED = 0 X_LPIINTERNETPROTOCOLSINKSTACKABLE_DEFINED = 0 X_LPIINTERNETPROTOCOLSINK_DEFINED = 0 X_LPIINTERNETPROTOCOL_DEFINED = 0 X_LPIINTERNETSESSION_DEFINED = 0 X_LPIINTERNETTHREADSWITCH_DEFINED = 0 X_LPINTERNETHOSTSECURITYMANANGER_DEFINED = 0 X_LPINTERNETSECURITYMANANGER_DEFINED = 0 X_LPINTERNETSECURITYMGRSITE_DEFINED = 0 X_LPINTERNETZONEMANAGER_DEFINED = 0 X_LPIWRAPPEDPROTOCOL_DEFINED = 0 X_LPMONIKERPROP_DEFINED = 0 X_LPPERSISTMONIKER_DEFINED = 0 X_LPSOFTDISTEXT_DEFINED = 0 X_LPWINDOWFORBINDINGUI_DEFINED = 0 X_LPWININETFILESTREAM_DEFINED = 0 X_LPWININETHTTPINFO_DEFINED = 0 X_LPWININETHTTPTIMEOUTS_DEFINED = 0 X_LPWININETINFO_DEFINED = 0 X_LWPINTRIN_H_INCLUDED = 0 X_LZCNTINTRIN_H_INCLUDED = 0 X_LZEXPAND_ = 0 X_Literal_ = 0 X_MALLOC_H_ = 0 X_MATH_H_ = 0 X_MAX_DIR = 256 X_MAX_DRIVE = 3 X_MAX_ENV = 32767 X_MAX_EXT = 256 X_MAX_FNAME = 256 X_MAX_PATH = 260 X_MAX_WAIT_MALLOC_CRT = 60000 X_MCIDEVICEID_ = 0 X_MCIERROR_ = 0 X_MCX_H_ = 0 X_MEMORYAPI_H_ = 0 X_MINGW_IP_MREQ1_H = 0 X_MINGW_IP_TYPES_H = 0 X_MINWINBASE_ = 0 X_MINWINDEF_ = 0 X_MM3DNOW_H_INCLUDED = 0 X_MMINTRIN_H_INCLUDED = 0 X_MMRESULT_ = 0 X_MM_CMPINT_EQ = 0x0 X_MM_CMPINT_GE = 0x5 X_MM_CMPINT_GT = 0x6 X_MM_CMPINT_LE = 0x2 X_MM_CMPINT_LT = 0x1 X_MM_CMPINT_NE = 0x4 X_MM_CMPINT_NLE = 0x6 X_MM_CMPINT_NLT = 0x5 X_MM_CMPINT_UNUSED = 0x3 X_MM_DENORMALS_ZERO_MASK = 0x0040 X_MM_DENORMALS_ZERO_OFF = 0x0000 X_MM_DENORMALS_ZERO_ON = 0x0040 X_MM_EXCEPT_DENORM = 0x0002 X_MM_EXCEPT_DIV_ZERO = 0x0004 X_MM_EXCEPT_INEXACT = 0x0020 X_MM_EXCEPT_INVALID = 0x0001 X_MM_EXCEPT_MASK = 0x003f X_MM_EXCEPT_OVERFLOW = 0x0008 X_MM_EXCEPT_UNDERFLOW = 0x0010 X_MM_FLUSH_ZERO_MASK = 0x8000 X_MM_FLUSH_ZERO_OFF = 0x0000 X_MM_FLUSH_ZERO_ON = 0x8000 X_MM_FROUND_CEIL = 2 X_MM_FROUND_CUR_DIRECTION = 0x04 X_MM_FROUND_FLOOR = 1 X_MM_FROUND_NEARBYINT = 12 X_MM_FROUND_NINT = 0 X_MM_FROUND_NO_EXC = 0x08 X_MM_FROUND_RAISE_EXC = 0x00 X_MM_FROUND_RINT = 4 X_MM_FROUND_TO_NEAREST_INT = 0x00 X_MM_FROUND_TO_NEG_INF = 0x01 X_MM_FROUND_TO_POS_INF = 0x02 X_MM_FROUND_TO_ZERO = 0x03 X_MM_FROUND_TRUNC = 3 X_MM_MALLOC_H_INCLUDED = 0 X_MM_MASK_DENORM = 0x0100 X_MM_MASK_DIV_ZERO = 0x0200 X_MM_MASK_INEXACT = 0x1000 X_MM_MASK_INVALID = 0x0080 X_MM_MASK_MASK = 0x1f80 X_MM_MASK_OVERFLOW = 0x0400 X_MM_MASK_UNDERFLOW = 0x0800 X_MM_ROUND_DOWN = 0x2000 X_MM_ROUND_MASK = 0x6000 X_MM_ROUND_NEAREST = 0x0000 X_MM_ROUND_TOWARD_ZERO = 0x6000 X_MM_ROUND_UP = 0x4000 X_MODE_T_ = 0 X_MOVDIRINTRIN_H_INCLUDED = 0 X_MSC_VER = 1900 X_MT = 0 X_MWAITXINTRIN_H_INCLUDED = 0 X_M_AMD64 = 100 X_M_X64 = 100 X_Maybe_raises_SEH_exception_ = 0 X_Must_inspect_result_ = 0 X_NAMEDPIPE_H_ = 0 X_NFILE = 512 X_NLSCMPERROR = 2147483647 X_NLSCMP_DEFINED = 0 X_NSTREAM_ = 512 X_NTDDDISK_H_ = 0 X_NTDDSCRD_H2_ = 0 X_NTDDSTOR_H_ = 0 X_NTDDTAPE_WINNT_ = 0 X_NTSTATUS_PSDK = 0 X_NTTMAPI_ = 0 X_NT_TIB_DEFINED = 0 X_No_competing_thread_ = 0 X_No_competing_thread_begin_ = 0 X_No_competing_thread_end_ = 0 X_Notliteral_ = 0 X_NullNull_terminated_ = 0 X_Null_terminated_ = 0 X_OBJBASE_H_ = 0 X_OBJIDLBASE_ = 0 X_OFF64_T_DEFINED = 0 X_OFF_T_ = 0 X_OFF_T_DEFINED = 0 X_OLD_P_OVERLAY = 2 X_OLE2_H_ = 0 X_OLEAUTO_H_ = 0 X_ONEXIT_T_DEFINED = 0 X_OS_COMMON_H_ = 0 X_OUT_TO_DEFAULT = 0 X_OUT_TO_MSGBOX = 2 X_OUT_TO_STDERR = 1 X_OVERFLOW = 3 X_Out_ = 0 X_Out_opt_ = 0 X_Outptr_ = 0 X_Outptr_opt_ = 0 X_Outptr_opt_result_maybenull_ = 0 X_Outptr_opt_result_maybenull_z_ = 0 X_Outptr_opt_result_nullonfailure_ = 0 X_Outptr_opt_result_z_ = 0 X_Outptr_result_maybenull_ = 0 X_Outptr_result_maybenull_z_ = 0 X_Outptr_result_nullonfailure_ = 0 X_Outptr_result_z_ = 0 X_Outref_ = 0 X_Outref_result_maybenull_ = 0 X_Outref_result_nullonfailure_ = 0 X_PALETTEENTRY_DEFINED = 0 X_PCONFIGINTRIN_H_INCLUDED = 0 X_PGLOBAL = 0 X_PID_T_ = 0 X_PKUINTRIN_H_INCLUDED = 0 X_PLOSS = 6 X_PMMINTRIN_H_INCLUDED = 0 X_POPCNTINTRIN_H_INCLUDED = 0 X_POSIX_CPUTIME = 200809 X_POSIX_MONOTONIC_CLOCK = 200809 X_POSIX_THREAD_CPUTIME = 200809 X_POSIX_TIMERS = 200809 X_PRFCHWINTRIN_H_INCLUDED = 0 X_PROCESSENV_ = 0 X_PROCESSTHREADSAPI_H_ = 0 X_PROCESSTOPOLOGYAPI_H_ = 0 X_PROFILEAPI_H_ = 0 X_PROPVARIANTINIT_DEFINED_ = 0 X_PROVIDER_STRUCTS_DEFINED = 0 X_PRSHT_H_ = 0 X_PTRDIFF_T_ = 0 X_PTRDIFF_T_DEFINED = 0 X_PUNCT = 0x10 X_P_DETACH = 4 X_P_NOWAIT = 1 X_P_NOWAITO = 3 X_P_OVERLAY = 2 X_P_WAIT = 0 X_P_tmpdir = "\\" X_Points_to_data_ = 0 X_Post_ = 0 X_Post_equals_last_error_ = 0 X_Pre_notnull_ = 0 X_Printf_format_string_ = 0 X_QSORT_S_DEFINED = 0 X_RDSEEDINTRIN_H_INCLUDED = 0 X_REFCLSID_DEFINED = 0 X_REFFMTID_DEFINED = 0 X_REFGUID_DEFINED = 0 X_REFIID_DEFINED = 0 X_REFPROPVARIANT_DEFINED = 0 X_REFVARIANT_DEFINED = 0 X_REPORT_ERRMODE = 3 X_ROTFLAGS_DEFINED = 0 X_ROTREGFLAGS_DEFINED = 0 X_ROT_COMPARE_MAX_DEFINED = 0 X_RSIZE_T_DEFINED = 0 X_RTL_RUN_ONCE_DEF = 1 X_RTMINTRIN_H_INCLUDED = 0 X_Raises_SEH_exception_ = 0 X_Requires_no_locks_held_ = 0 X_Reserved_ = 0 X_Result_nullonfailure_ = 0 X_Result_zeroonfailure_ = 0 X_Ret_maybenull_ = 0 X_Ret_maybenull_z_ = 0 X_Ret_notnull_ = 0 X_Ret_null_ = 0 X_Ret_valid_ = 0 X_Ret_z_ = 0 X_SECURECRT_ERRCODE_VALUES_DEFINED = 0 X_SECURECRT_FILL_BUFFER_PATTERN = 0xFD X_SERIALIZEDPROPERTYVALUE_DEFINED_ = 0 X_SGXINTRIN_H_INCLUDED = 0 X_SHAINTRIN_H_INCLUDED = 0 X_SIDD_BIT_MASK = 0x00 X_SIDD_CMP_EQUAL_ANY = 0x00 X_SIDD_CMP_EQUAL_EACH = 0x08 X_SIDD_CMP_EQUAL_ORDERED = 0x0c X_SIDD_CMP_RANGES = 0x04 X_SIDD_LEAST_SIGNIFICANT = 0x00 X_SIDD_MASKED_NEGATIVE_POLARITY = 0x30 X_SIDD_MASKED_POSITIVE_POLARITY = 0x20 X_SIDD_MOST_SIGNIFICANT = 0x40 X_SIDD_NEGATIVE_POLARITY = 0x10 X_SIDD_POSITIVE_POLARITY = 0x00 X_SIDD_SBYTE_OPS = 0x02 X_SIDD_SWORD_OPS = 0x03 X_SIDD_UBYTE_OPS = 0x00 X_SIDD_UNIT_MASK = 0x40 X_SIDD_UWORD_OPS = 0x01 X_SIGN_DEFINED = 0 X_SIGSET_T_ = 0 X_SING = 2 X_SIZE_T_DEFINED = 0 X_SLIST_HEADER_ = 0 X_SMMINTRIN_H_INCLUDED = 0 X_SPACE = 0x8 X_SPAWNV_DEFINED = 0 X_SQLITE3RBU_H = 0 X_SQLITE3RTREE_H_ = 0 X_SQLITE_OS_H_ = 0 X_SSIZE_T_DEFINED = 0 X_STDARG_H = 0 X_STDDEF_H = 0 X_STDDEF_H_ = 0 X_STDIO_CONFIG_DEFINED = 0 X_STDIO_DEFINED = 0 X_STDIO_S_DEFINED = 0 X_STDSTREAM_DEFINED = 0 X_STRALIGN_USE_SECURE_CRT = 0 X_SYNCHAPI_H_ = 0 X_SYSINFOAPI_H_ = 0 X_SYSTEMTIME_ = 0 X_SYSTEMTOPOLOGY_H_ = 0 X_SYS_GUID_OPERATORS_ = 0 X_SYS_GUID_OPERATOR_EQ_ = 0 X_SYS_OPEN = 20 X_Scanf_format_string_ = 0 X_Scanf_s_format_string_ = 0 X_Strict_type_match_ = 0 X_TAGLC_ID_DEFINED = 0 X_TBMINTRIN_H_INCLUDED = 0 X_TCHAR_DEFINED = 0 X_TEXTMETRIC_DEFINED = 0 X_THREADLOCALEINFO = 0 X_THREADPOOLAPISET_H_ = 0 X_THREADPOOLLEGACYAPISET_H_ = 0 X_TIME32_T_DEFINED = 0 X_TIME64_T_DEFINED = 0 X_TIMEB_DEFINED = 0 X_TIMEB_H_ = 0 X_TIMEB_H_S = 0 X_TIMESPEC_DEFINED = 0 X_TIMEVAL_DEFINED = 0 X_TIMEZONEAPI_H_ = 0 X_TIMEZONE_DEFINED = 0 X_TIME_H_ = 0 X_TIME_T_DEFINED = 0 X_TLOSS = 5 X_TMMINTRIN_H_INCLUDED = 0 X_TM_DEFINED = 0 X_TWO_DIGIT_EXPONENT = 0x1 X_UI16_MAX = 0xffff X_UI32_MAX = 0xffffffff X_UI64_MAX = 0xffffffffffffffff X_UI8_MAX = 0xff X_UINTPTR_T_DEFINED = 0 X_ULONGLONG_ = 0 X_UNDERFLOW = 4 X_UPPER = 0x1 X_USEDENTRY = 1 X_Use_decl_annotations_ = 0 X_VA_LIST = 0 X_VA_LIST_ = 0 X_VA_LIST_DEFINED = 0 X_VA_LIST_T_H = 0 X_VPCLMULQDQINTRIN_H_INCLUDED = 0 X_W64 = 0 X_WAITPKG_H_INCLUDED = 0 X_WAIT_CHILD = 0 X_WAIT_GRANDCHILD = 1 X_WAVEFORMATEX_ = 0 X_WBNOINVDINTRIN_H_INCLUDED = 0 X_WCHAR_T_DEFINED = 0 X_WCTYPE_DEFINED = 0 X_WCTYPE_INLINE_DEFINED = 0 X_WCTYPE_T_DEFINED = 0 X_WConst_return = 0 X_WEXEC_DEFINED = 0 X_WIN32 = 1 X_WIN32_IE = 1538 X_WIN32_IE_IE100 = 0x0a00 X_WIN32_IE_IE110 = 0x0A00 X_WIN32_IE_IE20 = 0x0200 X_WIN32_IE_IE30 = 0x0300 X_WIN32_IE_IE302 = 0x0302 X_WIN32_IE_IE40 = 0x0400 X_WIN32_IE_IE401 = 0x0401 X_WIN32_IE_IE50 = 0x0500 X_WIN32_IE_IE501 = 0x0501 X_WIN32_IE_IE55 = 0x0550 X_WIN32_IE_IE60 = 0x0600 X_WIN32_IE_IE60SP1 = 0x0601 X_WIN32_IE_IE60SP2 = 0x0603 X_WIN32_IE_IE70 = 0x0700 X_WIN32_IE_IE80 = 0x0800 X_WIN32_IE_IE90 = 0x0900 X_WIN32_IE_LONGHORN = 1792 X_WIN32_IE_NT4 = 512 X_WIN32_IE_NT4SP1 = 512 X_WIN32_IE_NT4SP2 = 512 X_WIN32_IE_NT4SP3 = 770 X_WIN32_IE_NT4SP4 = 1025 X_WIN32_IE_NT4SP5 = 1025 X_WIN32_IE_NT4SP6 = 1280 X_WIN32_IE_WIN10 = 2560 X_WIN32_IE_WIN2K = 1281 X_WIN32_IE_WIN2KSP1 = 1281 X_WIN32_IE_WIN2KSP2 = 1281 X_WIN32_IE_WIN2KSP3 = 1281 X_WIN32_IE_WIN2KSP4 = 1281 X_WIN32_IE_WIN6 = 1792 X_WIN32_IE_WIN7 = 2048 X_WIN32_IE_WIN8 = 2560 X_WIN32_IE_WIN98 = 1025 X_WIN32_IE_WIN98SE = 1280 X_WIN32_IE_WINBLUE = 2560 X_WIN32_IE_WINME = 1360 X_WIN32_IE_WINTHRESHOLD = 2560 X_WIN32_IE_WS03 = 0x0602 X_WIN32_IE_WS03SP1 = 1539 X_WIN32_IE_XP = 1536 X_WIN32_IE_XPSP1 = 1537 X_WIN32_IE_XPSP2 = 1539 X_WIN32_WINNT = 0x502 X_WIN32_WINNT_LONGHORN = 0x0600 X_WIN32_WINNT_NT4 = 0x0400 X_WIN32_WINNT_VISTA = 0x0600 X_WIN32_WINNT_WIN10 = 0x0A00 X_WIN32_WINNT_WIN2K = 0x0500 X_WIN32_WINNT_WIN6 = 0x0600 X_WIN32_WINNT_WIN7 = 0x0601 X_WIN32_WINNT_WIN8 = 0x0602 X_WIN32_WINNT_WINBLUE = 0x0603 X_WIN32_WINNT_WINTHRESHOLD = 0x0A00 X_WIN32_WINNT_WINXP = 0x0501 X_WIN32_WINNT_WS03 = 0x0502 X_WIN32_WINNT_WS08 = 0x0600 X_WIN64 = 1 X_WINBASE_ = 0 X_WINCON_ = 0 X_WINDEF_ = 0 X_WINDOWS_ = 0 X_WINERROR_ = 0 X_WINGDI_ = 0 X_WINIOCTL_ = 0 X_WINNETWK_ = 0 X_WINNLS_ = 0 X_WINNT_ = 0 X_WINPERF_ = 0 X_WINREG_ = 0 X_WINSCARD_H_ = 0 X_WINSOCKAPI_ = 0 X_WINSPOOL_ = 0 X_WINSVC_ = 0 X_WINT_T = 0 X_WINUSER_ = 0 X_WMMINTRIN_H_INCLUDED = 0 X_WNNC_ = 0 X_WOW64APISET_H_ = 0 X_WRITE_ABORT_MSG = 0x1 X_WSPAWN_DEFINED = 0 X_WSTDIO_DEFINED = 0 X_WSTDIO_S_DEFINED = 0 X_WSTDLIBP_DEFINED = 0 X_WSTDLIB_DEFINED = 0 X_WSTRING_DEFINED = 0 X_WSTRING_S_DEFINED = 0 X_WTIME_DEFINED = 0 X_X86INTRIN_H_INCLUDED = 0 X_XABORT_CAPACITY = 8 X_XABORT_CONFLICT = 4 X_XABORT_DEBUG = 16 X_XABORT_EXPLICIT = 1 X_XABORT_NESTED = 32 X_XABORT_RETRY = 2 X_XBEGIN_STARTED = 18446744073709551615 X_XFORM_ = 0 X_XHRPLUGGABLEPROTOCOL_DEFINED = 0 X_XMMINTRIN_H_INCLUDED = 0 X_XOPEN_SOURCE = 600 X_XOPMMINTRIN_H_INCLUDED = 0 X_XSAVECINTRIN_H_INCLUDED = 0 X_XSAVEINTRIN_H_INCLUDED = 0 X_XSAVEOPTINTRIN_H_INCLUDED = 0 X_XSAVESINTRIN_H_INCLUDED = 0 X_XTESTINTRIN_H_INCLUDED = 0 X_huge = 0 X_loadds = 0 X_tagBLOB_DEFINED = 0 X_tagBSTRBLOB_DEFINED = 0 X_tagCY_DEFINED = 0 BBatch = 0 CPRIV_KEY_CACHE_MAX_ITEMS_DEFAULT = 20 CPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS_DEFAULT = 86400 CbNDRContext = 20 Cdecl = 0 Chx1 = 0x0410 Chx10 = 0x0419 Chx11 = 0x041a Chx12 = 0x041b Chx13 = 0x041c Chx14 = 0x041d Chx15 = 0x041e Chx16 = 0x041f Chx2 = 0x0411 Chx3 = 0x0412 Chx4 = 0x0413 Chx5 = 0x0414 Chx6 = 0x0415 Chx7 = 0x0416 Chx8 = 0x0417 Chx9 = 0x0418 Cmb1 = 0x0470 Cmb10 = 0x0479 Cmb11 = 0x047a Cmb12 = 0x047b Cmb13 = 0x047c Cmb14 = 0x047d Cmb15 = 0x047e Cmb16 = 0x047f Cmb2 = 0x0471 Cmb3 = 0x0472 Cmb4 = 0x0473 Cmb5 = 0x0474 Cmb6 = 0x0475 Cmb7 = 0x0476 Cmb8 = 0x0477 Cmb9 = 0x0478 Ctl1 = 0x04A0 CtlFirst = 0x0400 CtlLast = 0x04ff DwFORCE_KEY_PROTECTION_DISABLED = 0x0 DwFORCE_KEY_PROTECTION_HIGH = 0x2 DwFORCE_KEY_PROTECTION_USER_SELECT = 0x1 Edt1 = 0x0480 Edt10 = 0x0489 Edt11 = 0x048a Edt12 = 0x048b Edt13 = 0x048c Edt14 = 0x048d Edt15 = 0x048e Edt16 = 0x048f Edt2 = 0x0481 Edt3 = 0x0482 Edt4 = 0x0483 Edt5 = 0x0484 Edt6 = 0x0485 Edt7 = 0x0486 Edt8 = 0x0487 Edt9 = 0x0488 EtBUFSIZE = 70 EtCHARX = 8 EtDECIMAL = 16 EtDYNSTRING = 6 EtEXP = 2 EtFLOAT = 1 EtGENERIC = 3 EtINVALID = 17 EtORDINAL = 15 EtPERCENT = 7 EtPOINTER = 13 EtRADIX = 0 EtSIZE = 4 EtSQLESCAPE = 9 EtSQLESCAPE2 = 10 EtSQLESCAPE3 = 14 EtSRCITEM = 12 EtSTRING = 5 EtTOKEN = 11 Far = 0 Frm1 = 0x0434 Frm2 = 0x0435 Frm3 = 0x0436 Frm4 = 0x0437 Fts5YYNFTS5TOKEN = 16 Fts5YYNOCODE = 27 Fts5YYNOERRORRECOVERY = 1 Fts5YYNRULE = 28 Fts5YYNRULE_WITH_ACTION = 28 Fts5YYNSTATE = 35 Fts5YYPARSEFREENOTNULL = 1 Fts5YYSTACKDEPTH = 100 Fts5YY_ACCEPT_ACTION = 81 Fts5YY_ACTTAB_COUNT = 105 Fts5YY_ERROR_ACTION = 80 Fts5YY_MAX_REDUCE = 110 Fts5YY_MAX_SHIFT = 34 Fts5YY_MAX_SHIFTREDUCE = 79 Fts5YY_MIN_REDUCE = 83 Fts5YY_MIN_SHIFTREDUCE = 52 Fts5YY_NO_ACTION = 82 Fts5YY_REDUCE_COUNT = 17 Fts5YY_REDUCE_MAX = 67 Fts5YY_REDUCE_MIN = -17 Fts5YY_SHIFT_COUNT = 34 Fts5YY_SHIFT_MAX = 93 Fts5YY_SHIFT_MIN = 0 Grp1 = 0x0430 Grp2 = 0x0431 Grp3 = 0x0432 Grp4 = 0x0433 Ico1 = 0x043c Ico2 = 0x043d Ico3 = 0x043e Ico4 = 0x043f Lst1 = 0x0460 Lst10 = 0x0469 Lst11 = 0x046a Lst12 = 0x046b Lst13 = 0x046c Lst14 = 0x046d Lst15 = 0x046e Lst16 = 0x046f Lst2 = 0x0461 Lst3 = 0x0462 Lst4 = 0x0463 Lst5 = 0x0464 Lst6 = 0x0465 Lst7 = 0x0466 Lst8 = 0x0467 Lst9 = 0x0468 Near = 0 Pascal = 0 Psh1 = 0x0400 Psh10 = 0x0409 Psh11 = 0x040a Psh12 = 0x040b Psh13 = 0x040c Psh14 = 0x040d Psh15 = 0x040e Psh16 = 0x040f Psh2 = 0x0401 Psh3 = 0x0402 Psh4 = 0x0403 Psh5 = 0x0404 Psh6 = 0x0405 Psh7 = 0x0406 Psh8 = 0x0407 Psh9 = 0x0408 PshHelp = 1038 Rad1 = 0x0420 Rad10 = 0x0429 Rad11 = 0x042a Rad12 = 0x042b Rad13 = 0x042c Rad14 = 0x042d Rad15 = 0x042e Rad16 = 0x042f Rad2 = 0x0421 Rad3 = 0x0422 Rad4 = 0x0423 Rad5 = 0x0424 Rad6 = 0x0425 Rad7 = 0x0426 Rad8 = 0x0427 Rad9 = 0x0428 Rct1 = 0x0438 Rct2 = 0x0439 Rct3 = 0x043a Rct4 = 0x043b Scr1 = 0x0490 Scr2 = 0x0491 Scr3 = 0x0492 Scr4 = 0x0493 Scr5 = 0x0494 Scr6 = 0x0495 Scr7 = 0x0496 Scr8 = 0x0497 Sqlite3Fts5ParserCTX_FETCH = 0 Sqlite3Fts5ParserCTX_PARAM = 0 Sqlite3Fts5ParserCTX_PDECL = 0 Sqlite3Fts5ParserCTX_SDECL = 0 Sqlite3Fts5ParserCTX_STORE = 0 Sqlite3ParserARG_FETCH = 0 Sqlite3ParserARG_PARAM = 0 Sqlite3ParserARG_PDECL = 0 Sqlite3ParserARG_SDECL = 0 Sqlite3ParserARG_STORE = 0 Sqlite3Parser_ENGINEALWAYSONSTACK = 1 Stc1 = 0x0440 Stc10 = 0x0449 Stc11 = 0x044a Stc12 = 0x044b Stc13 = 0x044c Stc14 = 0x044d Stc15 = 0x044e Stc16 = 0x044f Stc17 = 0x0450 Stc18 = 0x0451 Stc19 = 0x0452 Stc2 = 0x0441 Stc20 = 0x0453 Stc21 = 0x0454 Stc22 = 0x0455 Stc23 = 0x0456 Stc24 = 0x0457 Stc25 = 0x0458 Stc26 = 0x0459 Stc27 = 0x045a Stc28 = 0x045b Stc29 = 0x045c Stc3 = 0x0442 Stc30 = 0x045d Stc31 = 0x045e Stc32 = 0x045f Stc4 = 0x0443 Stc5 = 0x0444 Stc6 = 0x0445 Stc7 = 0x0446 Stc8 = 0x0447 Stc9 = 0x0448 SzFORCE_KEY_PROTECTION = "ForceKeyProtection" SzKEY_CACHE_ENABLED = "CachePrivateKeys" SzKEY_CACHE_SECONDS = "PrivateKeyLifetimeSeconds" SzKEY_CRYPTOAPI_PRIVATE_KEY_OPTIONS = "Software\\Policies\\Microsoft\\Cryptography" SzOIDVerisign_FailInfo = "2.16.840.1.113733.1.9.4" SzOIDVerisign_MessageType = "2.16.840.1.113733.1.9.2" SzOIDVerisign_PkiStatus = "2.16.840.1.113733.1.9.3" SzOIDVerisign_RecipientNonce = "2.16.840.1.113733.1.9.6" SzOIDVerisign_SenderNonce = "2.16.840.1.113733.1.9.5" SzOIDVerisign_TransactionID = "2.16.840.1.113733.1.9.7" SzOID_ANSI_X942 = "1.2.840.10046" SzOID_ANSI_X942_DH = "1.2.840.10046.2.1" SzOID_ANY_APPLICATION_POLICY = "1.3.6.1.4.1.311.10.12.1" SzOID_ANY_CERT_POLICY = "2.5.29.32.0" SzOID_ANY_ENHANCED_KEY_USAGE = "2.5.29.37.0" SzOID_APPLICATION_CERT_POLICIES = "1.3.6.1.4.1.311.21.10" SzOID_APPLICATION_POLICY_CONSTRAINTS = "1.3.6.1.4.1.311.21.12" SzOID_APPLICATION_POLICY_MAPPINGS = "1.3.6.1.4.1.311.21.11" SzOID_ARCHIVED_KEY_ATTR = "1.3.6.1.4.1.311.21.13" SzOID_ARCHIVED_KEY_CERT_HASH = "1.3.6.1.4.1.311.21.16" SzOID_ATTEST_WHQL_CRYPTO = "1.3.6.1.4.1.311.10.3.5.1" SzOID_ATTR_PLATFORM_SPECIFICATION = "2.23.133.2.17" SzOID_ATTR_SUPPORTED_ALGORITHMS = "2.5.4.52" SzOID_ATTR_TPM_SECURITY_ASSERTIONS = "2.23.133.2.18" SzOID_ATTR_TPM_SPECIFICATION = "2.23.133.2.16" SzOID_AUTHORITY_INFO_ACCESS = "1.3.6.1.5.5.7.1.1" SzOID_AUTHORITY_KEY_IDENTIFIER = "2.5.29.1" SzOID_AUTHORITY_KEY_IDENTIFIER2 = "2.5.29.35" SzOID_AUTHORITY_REVOCATION_LIST = "2.5.4.38" SzOID_AUTO_ENROLL_CTL_USAGE = "1.3.6.1.4.1.311.20.1" SzOID_BACKGROUND_OTHER_LOGOTYPE = "1.3.6.1.5.5.7.20.2" SzOID_BASIC_CONSTRAINTS = "2.5.29.10" SzOID_BASIC_CONSTRAINTS2 = "2.5.29.19" SzOID_BIOMETRIC_EXT = "1.3.6.1.5.5.7.1.2" SzOID_BIOMETRIC_SIGNING = "1.3.6.1.4.1.311.10.3.41" SzOID_BUSINESS_CATEGORY = "2.5.4.15" SzOID_CA_CERTIFICATE = "2.5.4.37" SzOID_CERTIFICATE_REVOCATION_LIST = "2.5.4.39" SzOID_CERTIFICATE_TEMPLATE = "1.3.6.1.4.1.311.21.7" SzOID_CERTSRV_CA_VERSION = "1.3.6.1.4.1.311.21.1" SzOID_CERTSRV_CROSSCA_VERSION = "1.3.6.1.4.1.311.21.22" SzOID_CERTSRV_PREVIOUS_CERT_HASH = "1.3.6.1.4.1.311.21.2" SzOID_CERT_DISALLOWED_FILETIME_PROP_ID = "1.3.6.1.4.1.311.10.11.104" SzOID_CERT_EXTENSIONS = "1.3.6.1.4.1.311.2.1.14" SzOID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID = "1.3.6.1.4.1.311.10.11.28" SzOID_CERT_KEY_IDENTIFIER_PROP_ID = "1.3.6.1.4.1.311.10.11.20" SzOID_CERT_MANIFOLD = "1.3.6.1.4.1.311.20.3" SzOID_CERT_MD5_HASH_PROP_ID = "1.3.6.1.4.1.311.10.11.4" SzOID_CERT_POLICIES = "2.5.29.32" SzOID_CERT_POLICIES_95 = "2.5.29.3" SzOID_CERT_POLICIES_95_QUALIFIER1 = "2.16.840.1.113733.1.7.1.1" SzOID_CERT_PROP_ID_PREFIX = "1.3.6.1.4.1.311.10.11." SzOID_CERT_SIGNATURE_HASH_PROP_ID = "1.3.6.1.4.1.311.10.11.15" SzOID_CERT_STRONG_KEY_OS_1 = "1.3.6.1.4.1.311.72.2.1" SzOID_CERT_STRONG_KEY_OS_PREFIX = "1.3.6.1.4.1.311.72.2." SzOID_CERT_STRONG_SIGN_OS_1 = "1.3.6.1.4.1.311.72.1.1" SzOID_CERT_STRONG_SIGN_OS_PREFIX = "1.3.6.1.4.1.311.72.1." SzOID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID = "1.3.6.1.4.1.311.10.11.29" SzOID_CMC = "1.3.6.1.5.5.7.7" SzOID_CMC_ADD_ATTRIBUTES = "1.3.6.1.4.1.311.10.10.1" SzOID_CMC_ADD_EXTENSIONS = "1.3.6.1.5.5.7.7.8" SzOID_CMC_DATA_RETURN = "1.3.6.1.5.5.7.7.4" SzOID_CMC_DECRYPTED_POP = "1.3.6.1.5.5.7.7.10" SzOID_CMC_ENCRYPTED_POP = "1.3.6.1.5.5.7.7.9" SzOID_CMC_GET_CERT = "1.3.6.1.5.5.7.7.15" SzOID_CMC_GET_CRL = "1.3.6.1.5.5.7.7.16" SzOID_CMC_IDENTIFICATION = "1.3.6.1.5.5.7.7.2" SzOID_CMC_IDENTITY_PROOF = "1.3.6.1.5.5.7.7.3" SzOID_CMC_ID_CONFIRM_CERT_ACCEPTANCE = "1.3.6.1.5.5.7.7.24" SzOID_CMC_ID_POP_LINK_RANDOM = "1.3.6.1.5.5.7.7.22" SzOID_CMC_ID_POP_LINK_WITNESS = "1.3.6.1.5.5.7.7.23" SzOID_CMC_LRA_POP_WITNESS = "1.3.6.1.5.5.7.7.11" SzOID_CMC_QUERY_PENDING = "1.3.6.1.5.5.7.7.21" SzOID_CMC_RECIPIENT_NONCE = "1.3.6.1.5.5.7.7.7" SzOID_CMC_REG_INFO = "1.3.6.1.5.5.7.7.18" SzOID_CMC_RESPONSE_INFO = "1.3.6.1.5.5.7.7.19" SzOID_CMC_REVOKE_REQUEST = "1.3.6.1.5.5.7.7.17" SzOID_CMC_SENDER_NONCE = "1.3.6.1.5.5.7.7.6" SzOID_CMC_STATUS_INFO = "1.3.6.1.5.5.7.7.1" SzOID_CMC_TRANSACTION_ID = "1.3.6.1.5.5.7.7.5" SzOID_CN_ECDSA_SHA256 = "1.2.156.11235.1.1.1" SzOID_COMMON_NAME = "2.5.4.3" SzOID_COUNTRY_NAME = "2.5.4.6" SzOID_CRL_DIST_POINTS = "2.5.29.31" SzOID_CRL_NEXT_PUBLISH = "1.3.6.1.4.1.311.21.4" SzOID_CRL_NUMBER = "2.5.29.20" SzOID_CRL_REASON_CODE = "2.5.29.21" SzOID_CRL_SELF_CDP = "1.3.6.1.4.1.311.21.14" SzOID_CRL_VIRTUAL_BASE = "1.3.6.1.4.1.311.21.3" SzOID_CROSS_CERTIFICATE_PAIR = "2.5.4.40" SzOID_CROSS_CERT_DIST_POINTS = "1.3.6.1.4.1.311.10.9.1" SzOID_CTL = "1.3.6.1.4.1.311.10.1" SzOID_CT_CERT_SCTLIST = "1.3.6.1.4.1.11129.2.4.2" SzOID_CT_PKI_DATA = "1.3.6.1.5.5.7.12.2" SzOID_CT_PKI_RESPONSE = "1.3.6.1.5.5.7.12.3" SzOID_DELTA_CRL_INDICATOR = "2.5.29.27" SzOID_DESCRIPTION = "2.5.4.13" SzOID_DESTINATION_INDICATOR = "2.5.4.27" SzOID_DEVICE_SERIAL_NUMBER = "2.5.4.5" SzOID_DH_SINGLE_PASS_STDDH_SHA1_KDF = "1.3.133.16.840.63.0.2" SzOID_DH_SINGLE_PASS_STDDH_SHA256_KDF = "1.3.132.1.11.1" SzOID_DH_SINGLE_PASS_STDDH_SHA384_KDF = "1.3.132.1.11.2" SzOID_DISALLOWED_LIST = "1.3.6.1.4.1.311.10.3.30" SzOID_DN_QUALIFIER = "2.5.4.46" SzOID_DOMAIN_COMPONENT = "0.9.2342.19200300.100.1.25" SzOID_DRM = "1.3.6.1.4.1.311.10.5.1" SzOID_DRM_INDIVIDUALIZATION = "1.3.6.1.4.1.311.10.5.2" SzOID_DS = "2.5" SzOID_DSALG = "2.5.8" SzOID_DSALG_CRPT = "2.5.8.1" SzOID_DSALG_HASH = "2.5.8.2" SzOID_DSALG_RSA = "2.5.8.1.1" SzOID_DSALG_SIGN = "2.5.8.3" SzOID_DS_EMAIL_REPLICATION = "1.3.6.1.4.1.311.21.19" SzOID_DYNAMIC_CODE_GEN_SIGNER = "1.3.6.1.4.1.311.76.5.1" SzOID_ECC_CURVE_BRAINPOOLP160R1 = "1.3.36.3.3.2.8.1.1.1" SzOID_ECC_CURVE_BRAINPOOLP160T1 = "1.3.36.3.3.2.8.1.1.2" SzOID_ECC_CURVE_BRAINPOOLP192R1 = "1.3.36.3.3.2.8.1.1.3" SzOID_ECC_CURVE_BRAINPOOLP192T1 = "1.3.36.3.3.2.8.1.1.4" SzOID_ECC_CURVE_BRAINPOOLP224R1 = "1.3.36.3.3.2.8.1.1.5" SzOID_ECC_CURVE_BRAINPOOLP224T1 = "1.3.36.3.3.2.8.1.1.6" SzOID_ECC_CURVE_BRAINPOOLP256R1 = "1.3.36.3.3.2.8.1.1.7" SzOID_ECC_CURVE_BRAINPOOLP256T1 = "1.3.36.3.3.2.8.1.1.8" SzOID_ECC_CURVE_BRAINPOOLP320R1 = "1.3.36.3.3.2.8.1.1.9" SzOID_ECC_CURVE_BRAINPOOLP320T1 = "1.3.36.3.3.2.8.1.1.10" SzOID_ECC_CURVE_BRAINPOOLP384R1 = "1.3.36.3.3.2.8.1.1.11" SzOID_ECC_CURVE_BRAINPOOLP384T1 = "1.3.36.3.3.2.8.1.1.12" SzOID_ECC_CURVE_BRAINPOOLP512R1 = "1.3.36.3.3.2.8.1.1.13" SzOID_ECC_CURVE_BRAINPOOLP512T1 = "1.3.36.3.3.2.8.1.1.14" SzOID_ECC_CURVE_EC192WAPI = "1.2.156.11235.1.1.2.1" SzOID_ECC_CURVE_NISTP192 = "1.2.840.10045.3.1.1" SzOID_ECC_CURVE_NISTP224 = "1.3.132.0.33" SzOID_ECC_CURVE_P256 = "1.2.840.10045.3.1.7" SzOID_ECC_CURVE_P384 = "1.3.132.0.34" SzOID_ECC_CURVE_P521 = "1.3.132.0.35" SzOID_ECC_CURVE_SECP160K1 = "1.3.132.0.9" SzOID_ECC_CURVE_SECP160R1 = "1.3.132.0.8" SzOID_ECC_CURVE_SECP160R2 = "1.3.132.0.30" SzOID_ECC_CURVE_SECP192K1 = "1.3.132.0.31" SzOID_ECC_CURVE_SECP224K1 = "1.3.132.0.32" SzOID_ECC_CURVE_SECP256K1 = "1.3.132.0.10" SzOID_ECC_CURVE_WTLS9 = "2.23.43.1.4.9" SzOID_ECC_CURVE_X962P192V1 = "1.2.840.10045.3.1.1" SzOID_ECC_CURVE_X962P192V2 = "1.2.840.10045.3.1.2" SzOID_ECC_CURVE_X962P192V3 = "1.2.840.10045.3.1.3" SzOID_ECC_CURVE_X962P239V1 = "1.2.840.10045.3.1.4" SzOID_ECC_CURVE_X962P239V2 = "1.2.840.10045.3.1.5" SzOID_ECC_CURVE_X962P239V3 = "1.2.840.10045.3.1.6" SzOID_ECC_PUBLIC_KEY = "1.2.840.10045.2.1" SzOID_ECDSA_SHA1 = "1.2.840.10045.4.1" SzOID_ECDSA_SHA256 = "1.2.840.10045.4.3.2" SzOID_ECDSA_SHA384 = "1.2.840.10045.4.3.3" SzOID_ECDSA_SHA512 = "1.2.840.10045.4.3.4" SzOID_ECDSA_SPECIFIED = "1.2.840.10045.4.3" SzOID_EFS_RECOVERY = "1.3.6.1.4.1.311.10.3.4.1" SzOID_EMBEDDED_NT_CRYPTO = "1.3.6.1.4.1.311.10.3.8" SzOID_ENCLAVE_SIGNING = "1.3.6.1.4.1.311.10.3.42" SzOID_ENCRYPTED_KEY_HASH = "1.3.6.1.4.1.311.21.21" SzOID_ENHANCED_KEY_USAGE = "2.5.29.37" SzOID_ENROLLMENT_AGENT = "1.3.6.1.4.1.311.20.2.1" SzOID_ENROLLMENT_CSP_PROVIDER = "1.3.6.1.4.1.311.13.2.2" SzOID_ENROLLMENT_NAME_VALUE_PAIR = "1.3.6.1.4.1.311.13.2.1" SzOID_ENROLL_AIK_INFO = "1.3.6.1.4.1.311.21.39" SzOID_ENROLL_ATTESTATION_CHALLENGE = "1.3.6.1.4.1.311.21.28" SzOID_ENROLL_ATTESTATION_STATEMENT = "1.3.6.1.4.1.311.21.24" SzOID_ENROLL_CAXCHGCERT_HASH = "1.3.6.1.4.1.311.21.27" SzOID_ENROLL_CERTTYPE_EXTENSION = "1.3.6.1.4.1.311.20.2" SzOID_ENROLL_EKPUB_CHALLENGE = "1.3.6.1.4.1.311.21.26" SzOID_ENROLL_EKVERIFYCERT = "1.3.6.1.4.1.311.21.31" SzOID_ENROLL_EKVERIFYCREDS = "1.3.6.1.4.1.311.21.32" SzOID_ENROLL_EKVERIFYKEY = "1.3.6.1.4.1.311.21.30" SzOID_ENROLL_EK_CA_KEYID = "1.3.6.1.4.1.311.21.43" SzOID_ENROLL_EK_INFO = "1.3.6.1.4.1.311.21.23" SzOID_ENROLL_ENCRYPTION_ALGORITHM = "1.3.6.1.4.1.311.21.29" SzOID_ENROLL_KEY_AFFINITY = "1.3.6.1.4.1.311.21.41" SzOID_ENROLL_KSP_NAME = "1.3.6.1.4.1.311.21.25" SzOID_ENROLL_SCEP_CHALLENGE_ANSWER = "1.3.6.1.4.1.311.21.35" SzOID_ENROLL_SCEP_CLIENT_REQUEST = "1.3.6.1.4.1.311.21.37" SzOID_ENROLL_SCEP_ERROR = "1.3.6.1.4.1.311.21.33" SzOID_ENROLL_SCEP_SERVER_MESSAGE = "1.3.6.1.4.1.311.21.38" SzOID_ENROLL_SCEP_SERVER_SECRET = "1.3.6.1.4.1.311.21.40" SzOID_ENROLL_SCEP_SERVER_STATE = "1.3.6.1.4.1.311.21.34" SzOID_ENROLL_SCEP_SIGNER_HASH = "1.3.6.1.4.1.311.21.42" SzOID_ENTERPRISE_OID_ROOT = "1.3.6.1.4.1.311.21.8" SzOID_EV_RDN_COUNTRY = "1.3.6.1.4.1.311.60.2.1.3" SzOID_EV_RDN_LOCALE = "1.3.6.1.4.1.311.60.2.1.1" SzOID_EV_RDN_STATE_OR_PROVINCE = "1.3.6.1.4.1.311.60.2.1.2" SzOID_EV_WHQL_CRYPTO = "1.3.6.1.4.1.311.10.3.39" SzOID_FACSIMILE_TELEPHONE_NUMBER = "2.5.4.23" SzOID_FRESHEST_CRL = "2.5.29.46" SzOID_GIVEN_NAME = "2.5.4.42" SzOID_HPKP_DOMAIN_NAME_CTL = "1.3.6.1.4.1.311.10.3.60" SzOID_HPKP_HEADER_VALUE_CTL = "1.3.6.1.4.1.311.10.3.61" SzOID_INFOSEC = "2.16.840.1.101.2.1" SzOID_INFOSEC_SuiteAConfidentiality = "2.16.840.1.101.2.1.1.14" SzOID_INFOSEC_SuiteAIntegrity = "2.16.840.1.101.2.1.1.15" SzOID_INFOSEC_SuiteAKMandSig = "2.16.840.1.101.2.1.1.18" SzOID_INFOSEC_SuiteAKeyManagement = "2.16.840.1.101.2.1.1.17" SzOID_INFOSEC_SuiteASignature = "2.16.840.1.101.2.1.1.13" SzOID_INFOSEC_SuiteATokenProtection = "2.16.840.1.101.2.1.1.16" SzOID_INFOSEC_mosaicConfidentiality = "2.16.840.1.101.2.1.1.4" SzOID_INFOSEC_mosaicIntegrity = "2.16.840.1.101.2.1.1.6" SzOID_INFOSEC_mosaicKMandSig = "2.16.840.1.101.2.1.1.12" SzOID_INFOSEC_mosaicKMandUpdSig = "2.16.840.1.101.2.1.1.20" SzOID_INFOSEC_mosaicKeyManagement = "2.16.840.1.101.2.1.1.10" SzOID_INFOSEC_mosaicSignature = "2.16.840.1.101.2.1.1.2" SzOID_INFOSEC_mosaicTokenProtection = "2.16.840.1.101.2.1.1.8" SzOID_INFOSEC_mosaicUpdatedInteg = "2.16.840.1.101.2.1.1.21" SzOID_INFOSEC_mosaicUpdatedSig = "2.16.840.1.101.2.1.1.19" SzOID_INFOSEC_sdnsConfidentiality = "2.16.840.1.101.2.1.1.3" SzOID_INFOSEC_sdnsIntegrity = "2.16.840.1.101.2.1.1.5" SzOID_INFOSEC_sdnsKMandSig = "2.16.840.1.101.2.1.1.11" SzOID_INFOSEC_sdnsKeyManagement = "2.16.840.1.101.2.1.1.9" SzOID_INFOSEC_sdnsSignature = "2.16.840.1.101.2.1.1.1" SzOID_INFOSEC_sdnsTokenProtection = "2.16.840.1.101.2.1.1.7" SzOID_INHIBIT_ANY_POLICY = "2.5.29.54" SzOID_INITIALS = "2.5.4.43" SzOID_INTERNATIONALIZED_EMAIL_ADDRESS = "1.3.6.1.4.1.311.20.2.4" SzOID_INTERNATIONAL_ISDN_NUMBER = "2.5.4.25" SzOID_IPSEC_KP_IKE_INTERMEDIATE = "1.3.6.1.5.5.8.2.2" SzOID_ISSUED_CERT_HASH = "1.3.6.1.4.1.311.21.17" SzOID_ISSUER_ALT_NAME = "2.5.29.8" SzOID_ISSUER_ALT_NAME2 = "2.5.29.18" SzOID_ISSUING_DIST_POINT = "2.5.29.28" SzOID_IUM_SIGNING = "1.3.6.1.4.1.311.10.3.37" SzOID_KEYID_RDN = "1.3.6.1.4.1.311.10.7.1" SzOID_KEY_ATTRIBUTES = "2.5.29.2" SzOID_KEY_USAGE = "2.5.29.15" SzOID_KEY_USAGE_RESTRICTION = "2.5.29.4" SzOID_KP_CA_EXCHANGE = "1.3.6.1.4.1.311.21.5" SzOID_KP_CSP_SIGNATURE = "1.3.6.1.4.1.311.10.3.16" SzOID_KP_CTL_USAGE_SIGNING = "1.3.6.1.4.1.311.10.3.1" SzOID_KP_DOCUMENT_SIGNING = "1.3.6.1.4.1.311.10.3.12" SzOID_KP_EFS = "1.3.6.1.4.1.311.10.3.4" SzOID_KP_FLIGHT_SIGNING = "1.3.6.1.4.1.311.10.3.27" SzOID_KP_KERNEL_MODE_CODE_SIGNING = "1.3.6.1.4.1.311.61.1.1" SzOID_KP_KERNEL_MODE_HAL_EXTENSION_SIGNING = "1.3.6.1.4.1.311.61.5.1" SzOID_KP_KERNEL_MODE_TRUSTED_BOOT_SIGNING = "1.3.6.1.4.1.311.61.4.1" SzOID_KP_KEY_RECOVERY = "1.3.6.1.4.1.311.10.3.11" SzOID_KP_KEY_RECOVERY_AGENT = "1.3.6.1.4.1.311.21.6" SzOID_KP_LIFETIME_SIGNING = "1.3.6.1.4.1.311.10.3.13" SzOID_KP_MOBILE_DEVICE_SOFTWARE = "1.3.6.1.4.1.311.10.3.14" SzOID_KP_QUALIFIED_SUBORDINATION = "1.3.6.1.4.1.311.10.3.10" SzOID_KP_SMARTCARD_LOGON = "1.3.6.1.4.1.311.20.2.2" SzOID_KP_SMART_DISPLAY = "1.3.6.1.4.1.311.10.3.15" SzOID_KP_TIME_STAMP_SIGNING = "1.3.6.1.4.1.311.10.3.2" SzOID_KP_TPM_AIK_CERTIFICATE = "2.23.133.8.3" SzOID_KP_TPM_EK_CERTIFICATE = "2.23.133.8.1" SzOID_KP_TPM_PLATFORM_CERTIFICATE = "2.23.133.8.2" SzOID_LEGACY_POLICY_MAPPINGS = "2.5.29.5" SzOID_LICENSES = "1.3.6.1.4.1.311.10.6.1" SzOID_LICENSE_SERVER = "1.3.6.1.4.1.311.10.6.2" SzOID_LOCALITY_NAME = "2.5.4.7" SzOID_LOCAL_MACHINE_KEYSET = "1.3.6.1.4.1.311.17.2" SzOID_LOGOTYPE_EXT = "1.3.6.1.5.5.7.1.12" SzOID_LOYALTY_OTHER_LOGOTYPE = "1.3.6.1.5.5.7.20.1" SzOID_MEMBER = "2.5.4.31" SzOID_MICROSOFT_PUBLISHER_SIGNER = "1.3.6.1.4.1.311.76.8.1" SzOID_NAME_CONSTRAINTS = "2.5.29.30" SzOID_NETSCAPE = "2.16.840.1.113730" SzOID_NETSCAPE_BASE_URL = "2.16.840.1.113730.1.2" SzOID_NETSCAPE_CA_POLICY_URL = "2.16.840.1.113730.1.8" SzOID_NETSCAPE_CA_REVOCATION_URL = "2.16.840.1.113730.1.4" SzOID_NETSCAPE_CERT_EXTENSION = "2.16.840.1.113730.1" SzOID_NETSCAPE_CERT_RENEWAL_URL = "2.16.840.1.113730.1.7" SzOID_NETSCAPE_CERT_SEQUENCE = "2.16.840.1.113730.2.5" SzOID_NETSCAPE_CERT_TYPE = "2.16.840.1.113730.1.1" SzOID_NETSCAPE_COMMENT = "2.16.840.1.113730.1.13" SzOID_NETSCAPE_DATA_TYPE = "2.16.840.1.113730.2" SzOID_NETSCAPE_REVOCATION_URL = "2.16.840.1.113730.1.3" SzOID_NETSCAPE_SSL_SERVER_NAME = "2.16.840.1.113730.1.12" SzOID_NEXT_UPDATE_LOCATION = "1.3.6.1.4.1.311.10.2" SzOID_NIST_AES128_CBC = "2.16.840.1.101.3.4.1.2" SzOID_NIST_AES128_WRAP = "2.16.840.1.101.3.4.1.5" SzOID_NIST_AES192_CBC = "2.16.840.1.101.3.4.1.22" SzOID_NIST_AES192_WRAP = "2.16.840.1.101.3.4.1.25" SzOID_NIST_AES256_CBC = "2.16.840.1.101.3.4.1.42" SzOID_NIST_AES256_WRAP = "2.16.840.1.101.3.4.1.45" SzOID_NIST_sha256 = "2.16.840.1.101.3.4.2.1" SzOID_NIST_sha384 = "2.16.840.1.101.3.4.2.2" SzOID_NIST_sha512 = "2.16.840.1.101.3.4.2.3" SzOID_NT5_CRYPTO = "1.3.6.1.4.1.311.10.3.6" SzOID_NTDS_REPLICATION = "1.3.6.1.4.1.311.25.1" SzOID_NT_PRINCIPAL_NAME = "1.3.6.1.4.1.311.20.2.3" SzOID_OEM_WHQL_CRYPTO = "1.3.6.1.4.1.311.10.3.7" SzOID_OIW = "1.3.14" SzOID_OIWDIR = "1.3.14.7.2" SzOID_OIWDIR_CRPT = "1.3.14.7.2.1" SzOID_OIWDIR_HASH = "1.3.14.7.2.2" SzOID_OIWDIR_SIGN = "1.3.14.7.2.3" SzOID_OIWDIR_md2 = "1.3.14.7.2.2.1" SzOID_OIWDIR_md2RSA = "1.3.14.7.2.3.1" SzOID_OIWSEC = "1.3.14.3.2" SzOID_OIWSEC_desCBC = "1.3.14.3.2.7" SzOID_OIWSEC_desCFB = "1.3.14.3.2.9" SzOID_OIWSEC_desECB = "1.3.14.3.2.6" SzOID_OIWSEC_desEDE = "1.3.14.3.2.17" SzOID_OIWSEC_desMAC = "1.3.14.3.2.10" SzOID_OIWSEC_desOFB = "1.3.14.3.2.8" SzOID_OIWSEC_dhCommMod = "1.3.14.3.2.16" SzOID_OIWSEC_dsa = "1.3.14.3.2.12" SzOID_OIWSEC_dsaComm = "1.3.14.3.2.20" SzOID_OIWSEC_dsaCommSHA = "1.3.14.3.2.21" SzOID_OIWSEC_dsaCommSHA1 = "1.3.14.3.2.28" SzOID_OIWSEC_dsaSHA1 = "1.3.14.3.2.27" SzOID_OIWSEC_keyHashSeal = "1.3.14.3.2.23" SzOID_OIWSEC_md2RSASign = "1.3.14.3.2.24" SzOID_OIWSEC_md4RSA = "1.3.14.3.2.2" SzOID_OIWSEC_md4RSA2 = "1.3.14.3.2.4" SzOID_OIWSEC_md5RSA = "1.3.14.3.2.3" SzOID_OIWSEC_md5RSASign = "1.3.14.3.2.25" SzOID_OIWSEC_mdc2 = "1.3.14.3.2.19" SzOID_OIWSEC_mdc2RSA = "1.3.14.3.2.14" SzOID_OIWSEC_rsaSign = "1.3.14.3.2.11" SzOID_OIWSEC_rsaXchg = "1.3.14.3.2.22" SzOID_OIWSEC_sha = "1.3.14.3.2.18" SzOID_OIWSEC_sha1 = "1.3.14.3.2.26" SzOID_OIWSEC_sha1RSASign = "1.3.14.3.2.29" SzOID_OIWSEC_shaDSA = "1.3.14.3.2.13" SzOID_OIWSEC_shaRSA = "1.3.14.3.2.15" SzOID_ORGANIZATIONAL_UNIT_NAME = "2.5.4.11" SzOID_ORGANIZATION_NAME = "2.5.4.10" SzOID_OS_VERSION = "1.3.6.1.4.1.311.13.2.3" SzOID_OWNER = "2.5.4.32" SzOID_PHYSICAL_DELIVERY_OFFICE_NAME = "2.5.4.19" SzOID_PIN_RULES_CTL = "1.3.6.1.4.1.311.10.3.32" SzOID_PIN_RULES_DOMAIN_NAME = "1.3.6.1.4.1.311.10.3.34" SzOID_PIN_RULES_EXT = "1.3.6.1.4.1.311.10.3.33" SzOID_PIN_RULES_LOG_END_DATE_EXT = "1.3.6.1.4.1.311.10.3.35" SzOID_PIN_RULES_SIGNER = "1.3.6.1.4.1.311.10.3.31" SzOID_PKCS = "1.2.840.113549.1" SzOID_PKCS_1 = "1.2.840.113549.1.1" SzOID_PKCS_10 = "1.2.840.113549.1.10" SzOID_PKCS_12 = "1.2.840.113549.1.12" SzOID_PKCS_12_EXTENDED_ATTRIBUTES = "1.3.6.1.4.1.311.17.3" SzOID_PKCS_12_FRIENDLY_NAME_ATTR = "1.2.840.113549.1.9.20" SzOID_PKCS_12_KEY_PROVIDER_NAME_ATTR = "1.3.6.1.4.1.311.17.1" SzOID_PKCS_12_LOCAL_KEY_ID = "1.2.840.113549.1.9.21" SzOID_PKCS_12_PROTECTED_PASSWORD_SECRET_BAG_TYPE_ID = "1.3.6.1.4.1.311.17.4" SzOID_PKCS_12_PbeIds = "1.2.840.113549.1.12.1" SzOID_PKCS_12_pbeWithSHA1And128BitRC2 = "1.2.840.113549.1.12.1.5" SzOID_PKCS_12_pbeWithSHA1And128BitRC4 = "1.2.840.113549.1.12.1.1" SzOID_PKCS_12_pbeWithSHA1And2KeyTripleDES = "1.2.840.113549.1.12.1.4" SzOID_PKCS_12_pbeWithSHA1And3KeyTripleDES = "1.2.840.113549.1.12.1.3" SzOID_PKCS_12_pbeWithSHA1And40BitRC2 = "1.2.840.113549.1.12.1.6" SzOID_PKCS_12_pbeWithSHA1And40BitRC4 = "1.2.840.113549.1.12.1.2" SzOID_PKCS_2 = "1.2.840.113549.1.2" SzOID_PKCS_3 = "1.2.840.113549.1.3" SzOID_PKCS_4 = "1.2.840.113549.1.4" SzOID_PKCS_5 = "1.2.840.113549.1.5" SzOID_PKCS_5_PBES2 = "1.2.840.113549.1.5.13" SzOID_PKCS_5_PBKDF2 = "1.2.840.113549.1.5.12" SzOID_PKCS_6 = "1.2.840.113549.1.6" SzOID_PKCS_7 = "1.2.840.113549.1.7" SzOID_PKCS_7_DATA = "1.2.840.113549.1.7.1" SzOID_PKCS_7_DIGESTED = "1.2.840.113549.1.7.5" SzOID_PKCS_7_ENCRYPTED = "1.2.840.113549.1.7.6" SzOID_PKCS_7_ENVELOPED = "1.2.840.113549.1.7.3" SzOID_PKCS_7_SIGNED = "1.2.840.113549.1.7.2" SzOID_PKCS_7_SIGNEDANDENVELOPED = "1.2.840.113549.1.7.4" SzOID_PKCS_8 = "1.2.840.113549.1.8" SzOID_PKCS_9 = "1.2.840.113549.1.9" SzOID_PKCS_9_CONTENT_TYPE = "1.2.840.113549.1.9.3" SzOID_PKCS_9_MESSAGE_DIGEST = "1.2.840.113549.1.9.4" SzOID_PKINIT_KP_KDC = "1.3.6.1.5.2.3.5" SzOID_PKIX = "1.3.6.1.5.5.7" SzOID_PKIX_ACC_DESCR = "1.3.6.1.5.5.7.48" SzOID_PKIX_CA_ISSUERS = "1.3.6.1.5.5.7.48.2" SzOID_PKIX_CA_REPOSITORY = "1.3.6.1.5.5.7.48.5" SzOID_PKIX_KP = "1.3.6.1.5.5.7.3" SzOID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2" SzOID_PKIX_KP_CODE_SIGNING = "1.3.6.1.5.5.7.3.3" SzOID_PKIX_KP_EMAIL_PROTECTION = "1.3.6.1.5.5.7.3.4" SzOID_PKIX_KP_IPSEC_END_SYSTEM = "1.3.6.1.5.5.7.3.5" SzOID_PKIX_KP_IPSEC_TUNNEL = "1.3.6.1.5.5.7.3.6" SzOID_PKIX_KP_IPSEC_USER = "1.3.6.1.5.5.7.3.7" SzOID_PKIX_KP_OCSP_SIGNING = "1.3.6.1.5.5.7.3.9" SzOID_PKIX_KP_SERVER_AUTH = "1.3.6.1.5.5.7.3.1" SzOID_PKIX_KP_TIMESTAMP_SIGNING = "1.3.6.1.5.5.7.3.8" SzOID_PKIX_NO_SIGNATURE = "1.3.6.1.5.5.7.6.2" SzOID_PKIX_OCSP = "1.3.6.1.5.5.7.48.1" SzOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE = "1.3.6.1.5.5.7.48.1.1" SzOID_PKIX_OCSP_NOCHECK = "1.3.6.1.5.5.7.48.1.5" SzOID_PKIX_OCSP_NONCE = "1.3.6.1.5.5.7.48.1.2" SzOID_PKIX_PE = "1.3.6.1.5.5.7.1" SzOID_PKIX_POLICY_QUALIFIER_CPS = "1.3.6.1.5.5.7.2.1" SzOID_PKIX_POLICY_QUALIFIER_USERNOTICE = "1.3.6.1.5.5.7.2.2" SzOID_PKIX_TIME_STAMPING = "1.3.6.1.5.5.7.48.3" SzOID_PLATFORM_MANIFEST_BINARY_ID = "1.3.6.1.4.1.311.10.3.28" SzOID_POLICY_CONSTRAINTS = "2.5.29.36" SzOID_POLICY_MAPPINGS = "2.5.29.33" SzOID_POSTAL_ADDRESS = "2.5.4.16" SzOID_POSTAL_CODE = "2.5.4.17" SzOID_POST_OFFICE_BOX = "2.5.4.18" SzOID_PREFERRED_DELIVERY_METHOD = "2.5.4.28" SzOID_PRESENTATION_ADDRESS = "2.5.4.29" SzOID_PRIVATEKEY_USAGE_PERIOD = "2.5.29.16" SzOID_PRODUCT_UPDATE = "1.3.6.1.4.1.311.31.1" SzOID_PROTECTED_PROCESS_LIGHT_SIGNER = "1.3.6.1.4.1.311.10.3.22" SzOID_PROTECTED_PROCESS_SIGNER = "1.3.6.1.4.1.311.10.3.24" SzOID_QC_EU_COMPLIANCE = "0.4.0.1862.1.1" SzOID_QC_SSCD = "0.4.0.1862.1.4" SzOID_QC_STATEMENTS_EXT = "1.3.6.1.5.5.7.1.3" SzOID_RDN_DUMMY_SIGNER = "1.3.6.1.4.1.311.21.9" SzOID_RDN_TCG_PLATFORM_MANUFACTURER = "2.23.133.2.4" SzOID_RDN_TCG_PLATFORM_MODEL = "2.23.133.2.5" SzOID_RDN_TCG_PLATFORM_VERSION = "2.23.133.2.6" SzOID_RDN_TPM_MANUFACTURER = "2.23.133.2.1" SzOID_RDN_TPM_MODEL = "2.23.133.2.2" SzOID_RDN_TPM_VERSION = "2.23.133.2.3" SzOID_REASON_CODE_HOLD = "2.5.29.23" SzOID_REGISTERED_ADDRESS = "2.5.4.26" SzOID_REMOVE_CERTIFICATE = "1.3.6.1.4.1.311.10.8.1" SzOID_RENEWAL_CERTIFICATE = "1.3.6.1.4.1.311.13.1" SzOID_REQUEST_CLIENT_INFO = "1.3.6.1.4.1.311.21.20" SzOID_REQUIRE_CERT_CHAIN_POLICY = "1.3.6.1.4.1.311.21.15" SzOID_REVOKED_LIST_SIGNER = "1.3.6.1.4.1.311.10.3.19" SzOID_RFC3161_counterSign = "1.3.6.1.4.1.311.3.3.1" SzOID_ROLE_OCCUPANT = "2.5.4.33" SzOID_ROOT_LIST_SIGNER = "1.3.6.1.4.1.311.10.3.9" SzOID_ROOT_PROGRAM_AUTO_UPDATE_CA_REVOCATION = "1.3.6.1.4.1.311.60.3.1" SzOID_ROOT_PROGRAM_AUTO_UPDATE_END_REVOCATION = "1.3.6.1.4.1.311.60.3.2" SzOID_ROOT_PROGRAM_FLAGS = "1.3.6.1.4.1.311.60.1.1" SzOID_ROOT_PROGRAM_NO_OCSP_FAILOVER_TO_CRL = "1.3.6.1.4.1.311.60.3.3" SzOID_RSA = "1.2.840.113549" SzOID_RSAES_OAEP = "1.2.840.113549.1.1.7" SzOID_RSA_DES_EDE3_CBC = "1.2.840.113549.3.7" SzOID_RSA_DH = "1.2.840.113549.1.3.1" SzOID_RSA_ENCRYPT = "1.2.840.113549.3" SzOID_RSA_HASH = "1.2.840.113549.2" SzOID_RSA_MD2 = "1.2.840.113549.2.2" SzOID_RSA_MD2RSA = "1.2.840.113549.1.1.2" SzOID_RSA_MD4 = "1.2.840.113549.2.4" SzOID_RSA_MD4RSA = "1.2.840.113549.1.1.3" SzOID_RSA_MD5 = "1.2.840.113549.2.5" SzOID_RSA_MD5RSA = "1.2.840.113549.1.1.4" SzOID_RSA_MGF1 = "1.2.840.113549.1.1.8" SzOID_RSA_PSPECIFIED = "1.2.840.113549.1.1.9" SzOID_RSA_RC2CBC = "1.2.840.113549.3.2" SzOID_RSA_RC4 = "1.2.840.113549.3.4" SzOID_RSA_RC5_CBCPad = "1.2.840.113549.3.9" SzOID_RSA_RSA = "1.2.840.113549.1.1.1" SzOID_RSA_SETOAEP_RSA = "1.2.840.113549.1.1.6" SzOID_RSA_SHA1RSA = "1.2.840.113549.1.1.5" SzOID_RSA_SHA256RSA = "1.2.840.113549.1.1.11" SzOID_RSA_SHA384RSA = "1.2.840.113549.1.1.12" SzOID_RSA_SHA512RSA = "1.2.840.113549.1.1.13" SzOID_RSA_SMIMECapabilities = "1.2.840.113549.1.9.15" SzOID_RSA_SMIMEalg = "1.2.840.113549.1.9.16.3" SzOID_RSA_SMIMEalgCMS3DESwrap = "1.2.840.113549.1.9.16.3.6" SzOID_RSA_SMIMEalgCMSRC2wrap = "1.2.840.113549.1.9.16.3.7" SzOID_RSA_SMIMEalgESDH = "1.2.840.113549.1.9.16.3.5" SzOID_RSA_SSA_PSS = "1.2.840.113549.1.1.10" SzOID_RSA_certExtensions = "1.2.840.113549.1.9.14" SzOID_RSA_challengePwd = "1.2.840.113549.1.9.7" SzOID_RSA_contentType = "1.2.840.113549.1.9.3" SzOID_RSA_counterSign = "1.2.840.113549.1.9.6" SzOID_RSA_data = "1.2.840.113549.1.7.1" SzOID_RSA_digestedData = "1.2.840.113549.1.7.5" SzOID_RSA_emailAddr = "1.2.840.113549.1.9.1" SzOID_RSA_encryptedData = "1.2.840.113549.1.7.6" SzOID_RSA_envelopedData = "1.2.840.113549.1.7.3" SzOID_RSA_extCertAttrs = "1.2.840.113549.1.9.9" SzOID_RSA_hashedData = "1.2.840.113549.1.7.5" SzOID_RSA_messageDigest = "1.2.840.113549.1.9.4" SzOID_RSA_preferSignedData = "1.2.840.113549.1.9.15.1" SzOID_RSA_signEnvData = "1.2.840.113549.1.7.4" SzOID_RSA_signedData = "1.2.840.113549.1.7.2" SzOID_RSA_signingTime = "1.2.840.113549.1.9.5" SzOID_RSA_unstructAddr = "1.2.840.113549.1.9.8" SzOID_RSA_unstructName = "1.2.840.113549.1.9.2" SzOID_SEARCH_GUIDE = "2.5.4.14" SzOID_SEE_ALSO = "2.5.4.34" SzOID_SERIALIZED = "1.3.6.1.4.1.311.10.3.3.1" SzOID_SERVER_GATED_CRYPTO = "1.3.6.1.4.1.311.10.3.3" SzOID_SGC_NETSCAPE = "2.16.840.1.113730.4.1" SzOID_SITE_PIN_RULES_FLAGS_ATTR = "1.3.6.1.4.1.311.10.4.3" SzOID_SITE_PIN_RULES_INDEX_ATTR = "1.3.6.1.4.1.311.10.4.2" SzOID_SORTED_CTL = "1.3.6.1.4.1.311.10.1.1" SzOID_STATE_OR_PROVINCE_NAME = "2.5.4.8" SzOID_STREET_ADDRESS = "2.5.4.9" SzOID_SUBJECT_ALT_NAME = "2.5.29.7" SzOID_SUBJECT_ALT_NAME2 = "2.5.29.17" SzOID_SUBJECT_DIR_ATTRS = "2.5.29.9" SzOID_SUBJECT_INFO_ACCESS = "1.3.6.1.5.5.7.1.11" SzOID_SUBJECT_KEY_IDENTIFIER = "2.5.29.14" SzOID_SUPPORTED_APPLICATION_CONTEXT = "2.5.4.30" SzOID_SUR_NAME = "2.5.4.4" SzOID_SYNC_ROOT_CTL_EXT = "1.3.6.1.4.1.311.10.3.50" SzOID_TELEPHONE_NUMBER = "2.5.4.20" SzOID_TELETEXT_TERMINAL_IDENTIFIER = "2.5.4.22" SzOID_TELEX_NUMBER = "2.5.4.21" SzOID_TIMESTAMP_TOKEN = "1.2.840.113549.1.9.16.1.4" SzOID_TITLE = "2.5.4.12" SzOID_TLS_FEATURES_EXT = "1.3.6.1.5.5.7.1.24" SzOID_USER_CERTIFICATE = "2.5.4.36" SzOID_USER_PASSWORD = "2.5.4.35" SzOID_VERISIGN_BITSTRING_6_13 = "2.16.840.1.113733.1.6.13" SzOID_VERISIGN_ISS_STRONG_CRYPTO = "2.16.840.1.113733.1.8.1" SzOID_VERISIGN_ONSITE_JURISDICTION_HASH = "2.16.840.1.113733.1.6.11" SzOID_VERISIGN_PRIVATE_6_9 = "2.16.840.1.113733.1.6.9" SzOID_WHQL_CRYPTO = "1.3.6.1.4.1.311.10.3.5" SzOID_WINDOWS_KITS_SIGNER = "1.3.6.1.4.1.311.10.3.20" SzOID_WINDOWS_RT_SIGNER = "1.3.6.1.4.1.311.10.3.21" SzOID_WINDOWS_SOFTWARE_EXTENSION_SIGNER = "1.3.6.1.4.1.311.10.3.26" SzOID_WINDOWS_STORE_SIGNER = "1.3.6.1.4.1.311.76.3.1" SzOID_WINDOWS_TCB_SIGNER = "1.3.6.1.4.1.311.10.3.23" SzOID_WINDOWS_THIRD_PARTY_COMPONENT_SIGNER = "1.3.6.1.4.1.311.10.3.25" SzOID_X21_ADDRESS = "2.5.4.24" SzOID_X957 = "1.2.840.10040" SzOID_X957_DSA = "1.2.840.10040.4.1" SzOID_X957_SHA1DSA = "1.2.840.10040.4.3" SzOID_YESNO_TRUST_ATTR = "1.3.6.1.4.1.311.10.4.1" SzPRIV_KEY_CACHE_MAX_ITEMS = "PrivKeyCacheMaxItems" SzPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS = "PrivKeyCachePurgeIntervalSeconds" Sz_CERT_STORE_PROV_COLLECTION = "Collection" Sz_CERT_STORE_PROV_FILENAME_W = "File" Sz_CERT_STORE_PROV_LDAP_W = "Ldap" Sz_CERT_STORE_PROV_MEMORY = "Memory" Sz_CERT_STORE_PROV_PHYSICAL_W = "Physical" Sz_CERT_STORE_PROV_PKCS12 = "PKCS12" Sz_CERT_STORE_PROV_PKCS7 = "PKCS7" Sz_CERT_STORE_PROV_SERIALIZED = "Serialized" Sz_CERT_STORE_PROV_SMART_CARD_W = "SmartCard" Sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W = "SystemRegistry" Sz_CERT_STORE_PROV_SYSTEM_W = "System" Tag_inner_PROPVARIANT = 0 TkCREATE = 4 TkEND = 7 TkEXPLAIN = 3 TkOTHER = 2 TkSEMI = 0 TkTEMP = 5 TkTRIGGER = 6 TkWS = 1 WsdAutoextInit = 0 WsdHooksInit = 0 WsdStatInit = 0 ) const ( X_MM_PERM_AAAA = 0 X_MM_PERM_AAAB = 1 X_MM_PERM_AAAC = 2 X_MM_PERM_AAAD = 3 X_MM_PERM_AABA = 4 X_MM_PERM_AABB = 5 X_MM_PERM_AABC = 6 X_MM_PERM_AABD = 7 X_MM_PERM_AACA = 8 X_MM_PERM_AACB = 9 X_MM_PERM_AACC = 10 X_MM_PERM_AACD = 11 X_MM_PERM_AADA = 12 X_MM_PERM_AADB = 13 X_MM_PERM_AADC = 14 X_MM_PERM_AADD = 15 X_MM_PERM_ABAA = 16 X_MM_PERM_ABAB = 17 X_MM_PERM_ABAC = 18 X_MM_PERM_ABAD = 19 X_MM_PERM_ABBA = 20 X_MM_PERM_ABBB = 21 X_MM_PERM_ABBC = 22 X_MM_PERM_ABBD = 23 X_MM_PERM_ABCA = 24 X_MM_PERM_ABCB = 25 X_MM_PERM_ABCC = 26 X_MM_PERM_ABCD = 27 X_MM_PERM_ABDA = 28 X_MM_PERM_ABDB = 29 X_MM_PERM_ABDC = 30 X_MM_PERM_ABDD = 31 X_MM_PERM_ACAA = 32 X_MM_PERM_ACAB = 33 X_MM_PERM_ACAC = 34 X_MM_PERM_ACAD = 35 X_MM_PERM_ACBA = 36 X_MM_PERM_ACBB = 37 X_MM_PERM_ACBC = 38 X_MM_PERM_ACBD = 39 X_MM_PERM_ACCA = 40 X_MM_PERM_ACCB = 41 X_MM_PERM_ACCC = 42 X_MM_PERM_ACCD = 43 X_MM_PERM_ACDA = 44 X_MM_PERM_ACDB = 45 X_MM_PERM_ACDC = 46 X_MM_PERM_ACDD = 47 X_MM_PERM_ADAA = 48 X_MM_PERM_ADAB = 49 X_MM_PERM_ADAC = 50 X_MM_PERM_ADAD = 51 X_MM_PERM_ADBA = 52 X_MM_PERM_ADBB = 53 X_MM_PERM_ADBC = 54 X_MM_PERM_ADBD = 55 X_MM_PERM_ADCA = 56 X_MM_PERM_ADCB = 57 X_MM_PERM_ADCC = 58 X_MM_PERM_ADCD = 59 X_MM_PERM_ADDA = 60 X_MM_PERM_ADDB = 61 X_MM_PERM_ADDC = 62 X_MM_PERM_ADDD = 63 X_MM_PERM_BAAA = 64 X_MM_PERM_BAAB = 65 X_MM_PERM_BAAC = 66 X_MM_PERM_BAAD = 67 X_MM_PERM_BABA = 68 X_MM_PERM_BABB = 69 X_MM_PERM_BABC = 70 X_MM_PERM_BABD = 71 X_MM_PERM_BACA = 72 X_MM_PERM_BACB = 73 X_MM_PERM_BACC = 74 X_MM_PERM_BACD = 75 X_MM_PERM_BADA = 76 X_MM_PERM_BADB = 77 X_MM_PERM_BADC = 78 X_MM_PERM_BADD = 79 X_MM_PERM_BBAA = 80 X_MM_PERM_BBAB = 81 X_MM_PERM_BBAC = 82 X_MM_PERM_BBAD = 83 X_MM_PERM_BBBA = 84 X_MM_PERM_BBBB = 85 X_MM_PERM_BBBC = 86 X_MM_PERM_BBBD = 87 X_MM_PERM_BBCA = 88 X_MM_PERM_BBCB = 89 X_MM_PERM_BBCC = 90 X_MM_PERM_BBCD = 91 X_MM_PERM_BBDA = 92 X_MM_PERM_BBDB = 93 X_MM_PERM_BBDC = 94 X_MM_PERM_BBDD = 95 X_MM_PERM_BCAA = 96 X_MM_PERM_BCAB = 97 X_MM_PERM_BCAC = 98 X_MM_PERM_BCAD = 99 X_MM_PERM_BCBA = 100 X_MM_PERM_BCBB = 101 X_MM_PERM_BCBC = 102 X_MM_PERM_BCBD = 103 X_MM_PERM_BCCA = 104 X_MM_PERM_BCCB = 105 X_MM_PERM_BCCC = 106 X_MM_PERM_BCCD = 107 X_MM_PERM_BCDA = 108 X_MM_PERM_BCDB = 109 X_MM_PERM_BCDC = 110 X_MM_PERM_BCDD = 111 X_MM_PERM_BDAA = 112 X_MM_PERM_BDAB = 113 X_MM_PERM_BDAC = 114 X_MM_PERM_BDAD = 115 X_MM_PERM_BDBA = 116 X_MM_PERM_BDBB = 117 X_MM_PERM_BDBC = 118 X_MM_PERM_BDBD = 119 X_MM_PERM_BDCA = 120 X_MM_PERM_BDCB = 121 X_MM_PERM_BDCC = 122 X_MM_PERM_BDCD = 123 X_MM_PERM_BDDA = 124 X_MM_PERM_BDDB = 125 X_MM_PERM_BDDC = 126 X_MM_PERM_BDDD = 127 X_MM_PERM_CAAA = 128 X_MM_PERM_CAAB = 129 X_MM_PERM_CAAC = 130 X_MM_PERM_CAAD = 131 X_MM_PERM_CABA = 132 X_MM_PERM_CABB = 133 X_MM_PERM_CABC = 134 X_MM_PERM_CABD = 135 X_MM_PERM_CACA = 136 X_MM_PERM_CACB = 137 X_MM_PERM_CACC = 138 X_MM_PERM_CACD = 139 X_MM_PERM_CADA = 140 X_MM_PERM_CADB = 141 X_MM_PERM_CADC = 142 X_MM_PERM_CADD = 143 X_MM_PERM_CBAA = 144 X_MM_PERM_CBAB = 145 X_MM_PERM_CBAC = 146 X_MM_PERM_CBAD = 147 X_MM_PERM_CBBA = 148 X_MM_PERM_CBBB = 149 X_MM_PERM_CBBC = 150 X_MM_PERM_CBBD = 151 X_MM_PERM_CBCA = 152 X_MM_PERM_CBCB = 153 X_MM_PERM_CBCC = 154 X_MM_PERM_CBCD = 155 X_MM_PERM_CBDA = 156 X_MM_PERM_CBDB = 157 X_MM_PERM_CBDC = 158 X_MM_PERM_CBDD = 159 X_MM_PERM_CCAA = 160 X_MM_PERM_CCAB = 161 X_MM_PERM_CCAC = 162 X_MM_PERM_CCAD = 163 X_MM_PERM_CCBA = 164 X_MM_PERM_CCBB = 165 X_MM_PERM_CCBC = 166 X_MM_PERM_CCBD = 167 X_MM_PERM_CCCA = 168 X_MM_PERM_CCCB = 169 X_MM_PERM_CCCC = 170 X_MM_PERM_CCCD = 171 X_MM_PERM_CCDA = 172 X_MM_PERM_CCDB = 173 X_MM_PERM_CCDC = 174 X_MM_PERM_CCDD = 175 X_MM_PERM_CDAA = 176 X_MM_PERM_CDAB = 177 X_MM_PERM_CDAC = 178 X_MM_PERM_CDAD = 179 X_MM_PERM_CDBA = 180 X_MM_PERM_CDBB = 181 X_MM_PERM_CDBC = 182 X_MM_PERM_CDBD = 183 X_MM_PERM_CDCA = 184 X_MM_PERM_CDCB = 185 X_MM_PERM_CDCC = 186 X_MM_PERM_CDCD = 187 X_MM_PERM_CDDA = 188 X_MM_PERM_CDDB = 189 X_MM_PERM_CDDC = 190 X_MM_PERM_CDDD = 191 X_MM_PERM_DAAA = 192 X_MM_PERM_DAAB = 193 X_MM_PERM_DAAC = 194 X_MM_PERM_DAAD = 195 X_MM_PERM_DABA = 196 X_MM_PERM_DABB = 197 X_MM_PERM_DABC = 198 X_MM_PERM_DABD = 199 X_MM_PERM_DACA = 200 X_MM_PERM_DACB = 201 X_MM_PERM_DACC = 202 X_MM_PERM_DACD = 203 X_MM_PERM_DADA = 204 X_MM_PERM_DADB = 205 X_MM_PERM_DADC = 206 X_MM_PERM_DADD = 207 X_MM_PERM_DBAA = 208 X_MM_PERM_DBAB = 209 X_MM_PERM_DBAC = 210 X_MM_PERM_DBAD = 211 X_MM_PERM_DBBA = 212 X_MM_PERM_DBBB = 213 X_MM_PERM_DBBC = 214 X_MM_PERM_DBBD = 215 X_MM_PERM_DBCA = 216 X_MM_PERM_DBCB = 217 X_MM_PERM_DBCC = 218 X_MM_PERM_DBCD = 219 X_MM_PERM_DBDA = 220 X_MM_PERM_DBDB = 221 X_MM_PERM_DBDC = 222 X_MM_PERM_DBDD = 223 X_MM_PERM_DCAA = 224 X_MM_PERM_DCAB = 225 X_MM_PERM_DCAC = 226 X_MM_PERM_DCAD = 227 X_MM_PERM_DCBA = 228 X_MM_PERM_DCBB = 229 X_MM_PERM_DCBC = 230 X_MM_PERM_DCBD = 231 X_MM_PERM_DCCA = 232 X_MM_PERM_DCCB = 233 X_MM_PERM_DCCC = 234 X_MM_PERM_DCCD = 235 X_MM_PERM_DCDA = 236 X_MM_PERM_DCDB = 237 X_MM_PERM_DCDC = 238 X_MM_PERM_DCDD = 239 X_MM_PERM_DDAA = 240 X_MM_PERM_DDAB = 241 X_MM_PERM_DDAC = 242 X_MM_PERM_DDAD = 243 X_MM_PERM_DDBA = 244 X_MM_PERM_DDBB = 245 X_MM_PERM_DDBC = 246 X_MM_PERM_DDBD = 247 X_MM_PERM_DDCA = 248 X_MM_PERM_DDCB = 249 X_MM_PERM_DDCC = 250 X_MM_PERM_DDCD = 251 X_MM_PERM_DDDA = 252 X_MM_PERM_DDDB = 253 X_MM_PERM_DDDC = 254 X_MM_PERM_DDDD = 255 ) const ( X_MM_MANT_NORM_1_2 = 0 X_MM_MANT_NORM_p5_2 = 1 X_MM_MANT_NORM_p5_1 = 2 X_MM_MANT_NORM_p75_1p5 = 3 ) const ( X_MM_MANT_SIGN_src = 0 X_MM_MANT_SIGN_zero = 1 X_MM_MANT_SIGN_nan = 2 ) const ( X_MM_HINT_ET0 = 7 X_MM_HINT_ET1 = 6 X_MM_HINT_T0 = 3 X_MM_HINT_T1 = 2 X_MM_HINT_T2 = 1 X_MM_HINT_NTA = 0 ) const ( DSA_HASH_ALGORITHM_SHA1 = 0 DSA_HASH_ALGORITHM_SHA256 = 1 DSA_HASH_ALGORITHM_SHA512 = 2 ) const ( DSA_FIPS186_2 = 0 DSA_FIPS186_3 = 1 ) const ( REGCLS_SINGLEUSE = 0 REGCLS_MULTIPLEUSE = 1 REGCLS_MULTI_SEPARATE = 2 REGCLS_SUSPENDED = 4 REGCLS_SURROGATE = 8 ) const ( COINITBASE_MULTITHREADED = 0 ) const ( SMEXF_SERVER = 1 SMEXF_HANDLER = 2 ) const ( COWAIT_DEFAULT = 0 COWAIT_WAITALL = 1 COWAIT_ALERTABLE = 2 COWAIT_INPUTAVAILABLE = 4 COWAIT_DISPATCH_CALLS = 8 COWAIT_DISPATCH_WINDOW_MESSAGES = 16 ) const ( LowMemoryResourceNotification = 0 HighMemoryResourceNotification = 1 ) const ( FindExInfoStandard = 0 FindExInfoBasic = 1 FindExInfoMaxInfoLevel = 2 ) const ( FindExSearchNameMatch = 0 FindExSearchLimitToDirectories = 1 FindExSearchLimitToDevices = 2 FindExSearchMaxSearchOp = 3 ) const ( GetFileExInfoStandard = 0 GetFileExMaxInfoLevel = 1 ) const ( NODE_INVALID = 0 NODE_ELEMENT = 1 NODE_ATTRIBUTE = 2 NODE_TEXT = 3 NODE_CDATA_SECTION = 4 NODE_ENTITY_REFERENCE = 5 NODE_ENTITY = 6 NODE_PROCESSING_INSTRUCTION = 7 NODE_COMMENT = 8 NODE_DOCUMENT = 9 NODE_DOCUMENT_TYPE = 10 NODE_DOCUMENT_FRAGMENT = 11 NODE_NOTATION = 12 ) const ( XMLELEMTYPE_ELEMENT = 0 XMLELEMTYPE_TEXT = 1 XMLELEMTYPE_COMMENT = 2 XMLELEMTYPE_DOCUMENT = 3 XMLELEMTYPE_DTD = 4 XMLELEMTYPE_PI = 5 XMLELEMTYPE_OTHER = 6 ) const ( DESCKIND_NONE = 0 DESCKIND_FUNCDESC = 1 DESCKIND_VARDESC = 2 DESCKIND_TYPECOMP = 3 DESCKIND_IMPLICITAPPOBJ = 4 DESCKIND_MAX = 5 ) const ( SYS_WIN16 = 0 SYS_WIN32 = 1 SYS_MAC = 2 SYS_WIN64 = 3 ) const ( LIBFLAG_FRESTRICTED = 1 LIBFLAG_FCONTROL = 2 LIBFLAG_FHIDDEN = 4 LIBFLAG_FHASDISKIMAGE = 8 ) const ( SF_ERROR = 10 SF_I1 = 16 SF_I2 = 2 SF_I4 = 3 SF_I8 = 20 SF_BSTR = 8 SF_UNKNOWN = 13 SF_DISPATCH = 9 SF_VARIANT = 12 SF_RECORD = 36 SF_HAVEIID = 32781 ) const ( CHANGEKIND_ADDMEMBER = 0 CHANGEKIND_DELETEMEMBER = 1 CHANGEKIND_SETNAMES = 2 CHANGEKIND_SETDOCUMENTATION = 3 CHANGEKIND_GENERAL = 4 CHANGEKIND_INVALIDATE = 5 CHANGEKIND_CHANGEFAILED = 6 CHANGEKIND_MAX = 7 ) const ( TKIND_ENUM = 0 TKIND_RECORD = 1 TKIND_MODULE = 2 TKIND_INTERFACE = 3 TKIND_DISPATCH = 4 TKIND_COCLASS = 5 TKIND_ALIAS = 6 TKIND_UNION = 7 TKIND_MAX = 8 ) const ( CC_FASTCALL = 0 CC_CDECL = 1 CC_MSCPASCAL = 2 CC_PASCAL = 2 CC_MACPASCAL = 3 CC_STDCALL = 4 CC_FPFASTCALL = 5 CC_SYSCALL = 6 CC_MPWCDECL = 7 CC_MPWPASCAL = 8 CC_MAX = 9 ) const ( FUNC_VIRTUAL = 0 FUNC_PUREVIRTUAL = 1 FUNC_NONVIRTUAL = 2 FUNC_STATIC = 3 FUNC_DISPATCH = 4 ) const ( INVOKE_FUNC = 1 INVOKE_PROPERTYGET = 2 INVOKE_PROPERTYPUT = 4 INVOKE_PROPERTYPUTREF = 8 ) const ( VAR_PERINSTANCE = 0 VAR_STATIC = 1 VAR_CONST = 2 VAR_DISPATCH = 3 ) const ( TYPEFLAG_FAPPOBJECT = 1 TYPEFLAG_FCANCREATE = 2 TYPEFLAG_FLICENSED = 4 TYPEFLAG_FPREDECLID = 8 TYPEFLAG_FHIDDEN = 16 TYPEFLAG_FCONTROL = 32 TYPEFLAG_FDUAL = 64 TYPEFLAG_FNONEXTENSIBLE = 128 TYPEFLAG_FOLEAUTOMATION = 256 TYPEFLAG_FRESTRICTED = 512 TYPEFLAG_FAGGREGATABLE = 1024 TYPEFLAG_FREPLACEABLE = 2048 TYPEFLAG_FDISPATCHABLE = 4096 TYPEFLAG_FREVERSEBIND = 8192 TYPEFLAG_FPROXY = 16384 ) const ( FUNCFLAG_FRESTRICTED = 1 FUNCFLAG_FSOURCE = 2 FUNCFLAG_FBINDABLE = 4 FUNCFLAG_FREQUESTEDIT = 8 FUNCFLAG_FDISPLAYBIND = 16 FUNCFLAG_FDEFAULTBIND = 32 FUNCFLAG_FHIDDEN = 64 FUNCFLAG_FUSESGETLASTERROR = 128 FUNCFLAG_FDEFAULTCOLLELEM = 256 FUNCFLAG_FUIDEFAULT = 512 FUNCFLAG_FNONBROWSABLE = 1024 FUNCFLAG_FREPLACEABLE = 2048 FUNCFLAG_FIMMEDIATEBIND = 4096 ) const ( VARFLAG_FREADONLY = 1 VARFLAG_FSOURCE = 2 VARFLAG_FBINDABLE = 4 VARFLAG_FREQUESTEDIT = 8 VARFLAG_FDISPLAYBIND = 16 VARFLAG_FDEFAULTBIND = 32 VARFLAG_FHIDDEN = 64 VARFLAG_FRESTRICTED = 128 VARFLAG_FDEFAULTCOLLELEM = 256 VARFLAG_FUIDEFAULT = 512 VARFLAG_FNONBROWSABLE = 1024 VARFLAG_FREPLACEABLE = 2048 VARFLAG_FIMMEDIATEBIND = 4096 ) const ( COINIT_APARTMENTTHREADED = 2 COINIT_MULTITHREADED = 0 COINIT_DISABLE_OLE1DDE = 4 COINIT_SPEED_OVER_MEMORY = 8 ) const ( SD_LAUNCHPERMISSIONS = 0 SD_ACCESSPERMISSIONS = 1 SD_LAUNCHRESTRICTIONS = 2 SD_ACCESSRESTRICTIONS = 3 ) const ( ADVF_NODATA = 1 ADVF_PRIMEFIRST = 2 ADVF_ONLYONCE = 4 ADVF_DATAONSTOP = 64 ADVFCACHE_NOHANDLER = 8 ADVFCACHE_FORCEBUILTIN = 16 ADVFCACHE_ONSAVE = 32 ) const ( TYMED_HGLOBAL = 1 TYMED_FILE = 2 TYMED_ISTREAM = 4 TYMED_ISTORAGE = 8 TYMED_GDI = 16 TYMED_MFPICT = 32 TYMED_ENHMF = 64 TYMED_NULL = 0 ) const ( DATADIR_GET = 1 DATADIR_SET = 2 ) const ( CALLTYPE_TOPLEVEL = 1 CALLTYPE_NESTED = 2 CALLTYPE_ASYNC = 3 CALLTYPE_TOPLEVEL_CALLPENDING = 4 CALLTYPE_ASYNC_CALLPENDING = 5 ) const ( SERVERCALL_ISHANDLED = 0 SERVERCALL_REJECTED = 1 SERVERCALL_RETRYLATER = 2 ) const ( PENDINGTYPE_TOPLEVEL = 1 PENDINGTYPE_NESTED = 2 ) const ( PENDINGMSG_CANCELCALL = 0 PENDINGMSG_WAITNOPROCESS = 1 PENDINGMSG_WAITDEFPROCESS = 2 ) const ( ServerApplication = 0 LibraryApplication = 1 ) const ( IdleShutdown = 0 ForcedShutdown = 1 ) const ( BIND_MAYBOTHERUSER = 1 BIND_JUSTTESTEXISTENCE = 2 ) const ( MKSYS_NONE = 0 MKSYS_GENERICCOMPOSITE = 1 MKSYS_FILEMONIKER = 2 MKSYS_ANTIMONIKER = 3 MKSYS_ITEMMONIKER = 4 MKSYS_POINTERMONIKER = 5 MKSYS_CLASSMONIKER = 7 MKSYS_OBJREFMONIKER = 8 MKSYS_SESSIONMONIKER = 9 MKSYS_LUAMONIKER = 10 ) const ( MKRREDUCE_ONE = 196608 MKRREDUCE_TOUSER = 131072 MKRREDUCE_THROUGHUSER = 65536 MKRREDUCE_ALL = 0 ) const ( EXTCONN_STRONG = 1 EXTCONN_WEAK = 2 EXTCONN_CALLABLE = 4 ) const ( STGTY_STORAGE = 1 STGTY_STREAM = 2 STGTY_LOCKBYTES = 3 STGTY_PROPERTY = 4 ) const ( STREAM_SEEK_SET = 0 STREAM_SEEK_CUR = 1 STREAM_SEEK_END = 2 ) const ( LOCK_WRITE = 1 LOCK_EXCLUSIVE = 2 LOCK_ONLYONCE = 4 ) const ( EOAC_NONE = 0 EOAC_MUTUAL_AUTH = 1 EOAC_STATIC_CLOAKING = 32 EOAC_DYNAMIC_CLOAKING = 64 EOAC_ANY_AUTHORITY = 128 EOAC_MAKE_FULLSIC = 256 EOAC_DEFAULT = 2048 EOAC_SECURE_REFS = 2 EOAC_ACCESS_CONTROL = 4 EOAC_APPID = 8 EOAC_DYNAMIC = 16 EOAC_REQUIRE_FULLSIC = 512 EOAC_AUTO_IMPERSONATE = 1024 EOAC_NO_CUSTOM_MARSHAL = 8192 EOAC_DISABLE_AAA = 4096 ) const ( COMBND_RPCTIMEOUT = 1 COMBND_SERVER_LOCALITY = 2 COMBND_RESERVED1 = 4 ) const ( SERVER_LOCALITY_PROCESS_LOCAL = 0 SERVER_LOCALITY_MACHINE_LOCAL = 1 SERVER_LOCALITY_REMOTE = 2 ) const ( COMGLB_EXCEPTION_HANDLING = 1 COMGLB_APPID = 2 COMGLB_RPC_THREADPOOL_SETTING = 3 COMGLB_RO_SETTINGS = 4 COMGLB_UNMARSHALING_POLICY = 5 ) const ( COMGLB_EXCEPTION_HANDLE = 0 COMGLB_EXCEPTION_DONOT_HANDLE_FATAL = 1 COMGLB_EXCEPTION_DONOT_HANDLE = 1 COMGLB_EXCEPTION_DONOT_HANDLE_ANY = 2 ) const ( COMGLB_RPC_THREADPOOL_SETTING_DEFAULT_POOL = 0 COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL = 1 ) const ( COMGLB_STA_MODALLOOP_REMOVE_TOUCH_MESSAGES = 1 COMGLB_STA_MODALLOOP_SHARED_QUEUE_REMOVE_INPUT_MESSAGES = 2 COMGLB_STA_MODALLOOP_SHARED_QUEUE_DONOT_REMOVE_INPUT_MESSAGES = 4 COMGLB_FAST_RUNDOWN = 8 COMGLB_RESERVED1 = 16 COMGLB_RESERVED2 = 32 COMGLB_RESERVED3 = 64 COMGLB_STA_MODALLOOP_SHARED_QUEUE_REORDER_POINTER_MESSAGES = 128 ) const ( COMGLB_UNMARSHALING_POLICY_NORMAL = 0 COMGLB_UNMARSHALING_POLICY_STRONG = 1 COMGLB_UNMARSHALING_POLICY_HYBRID = 2 ) const ( DCOM_NONE = 0 DCOM_CALL_COMPLETE = 1 DCOM_CALL_CANCELED = 2 ) const ( APTTYPEQUALIFIER_NONE = 0 APTTYPEQUALIFIER_IMPLICIT_MTA = 1 APTTYPEQUALIFIER_NA_ON_MTA = 2 APTTYPEQUALIFIER_NA_ON_STA = 3 APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA = 4 APTTYPEQUALIFIER_NA_ON_MAINSTA = 5 APTTYPEQUALIFIER_APPLICATION_STA = 6 ) const ( APTTYPE_CURRENT = -1 APTTYPE_STA = 0 APTTYPE_MTA = 1 APTTYPE_NA = 2 APTTYPE_MAINSTA = 3 ) const ( THDTYPE_BLOCKMESSAGES = 0 THDTYPE_PROCESSMESSAGES = 1 ) const ( CO_MARSHALING_SOURCE_IS_APP_CONTAINER = 0 ) const ( REGKIND_DEFAULT = 0 REGKIND_REGISTER = 1 REGKIND_NONE = 2 ) const ( OLEGETMONIKER_ONLYIFTHERE = 1 OLEGETMONIKER_FORCEASSIGN = 2 OLEGETMONIKER_UNASSIGN = 3 OLEGETMONIKER_TEMPFORUSER = 4 ) const ( OLEWHICHMK_CONTAINER = 1 OLEWHICHMK_OBJREL = 2 OLEWHICHMK_OBJFULL = 3 ) const ( USERCLASSTYPE_FULL = 1 USERCLASSTYPE_SHORT = 2 USERCLASSTYPE_APPNAME = 3 ) const ( OLEMISC_RECOMPOSEONRESIZE = 1 OLEMISC_ONLYICONIC = 2 OLEMISC_INSERTNOTREPLACE = 4 OLEMISC_STATIC = 8 OLEMISC_CANTLINKINSIDE = 16 OLEMISC_CANLINKBYOLE1 = 32 OLEMISC_ISLINKOBJECT = 64 OLEMISC_INSIDEOUT = 128 OLEMISC_ACTIVATEWHENVISIBLE = 256 OLEMISC_RENDERINGISDEVICEINDEPENDENT = 512 OLEMISC_INVISIBLEATRUNTIME = 1024 OLEMISC_ALWAYSRUN = 2048 OLEMISC_ACTSLIKEBUTTON = 4096 OLEMISC_ACTSLIKELABEL = 8192 OLEMISC_NOUIACTIVATE = 16384 OLEMISC_ALIGNABLE = 32768 OLEMISC_SIMPLEFRAME = 65536 OLEMISC_SETCLIENTSITEFIRST = 131072 OLEMISC_IMEMODE = 262144 OLEMISC_IGNOREACTIVATEWHENVISIBLE = 524288 OLEMISC_WANTSTOMENUMERGE = 1048576 OLEMISC_SUPPORTSMULTILEVELUNDO = 2097152 ) const ( OLECLOSE_SAVEIFDIRTY = 0 OLECLOSE_NOSAVE = 1 OLECLOSE_PROMPTSAVE = 2 ) const ( OLERENDER_NONE = 0 OLERENDER_DRAW = 1 OLERENDER_FORMAT = 2 OLERENDER_ASIS = 3 ) const ( OLEUPDATE_ALWAYS = 1 OLEUPDATE_ONCALL = 3 ) const ( OLELINKBIND_EVENIFCLASSDIFF = 1 ) const ( BINDSPEED_INDEFINITE = 1 BINDSPEED_MODERATE = 2 BINDSPEED_IMMEDIATE = 3 ) const ( OLECONTF_EMBEDDINGS = 1 OLECONTF_LINKS = 2 OLECONTF_OTHERS = 4 OLECONTF_ONLYUSER = 8 OLECONTF_ONLYIFRUNNING = 16 ) const ( OLEVERBATTRIB_NEVERDIRTIES = 1 OLEVERBATTRIB_ONCONTAINERMENU = 2 ) const ( DISCARDCACHE_SAVEIFDIRTY = 0 DISCARDCACHE_NOSAVE = 1 ) const ( PIDMSI_STATUS_NORMAL = 0 PIDMSI_STATUS_NEW = 1 PIDMSI_STATUS_PRELIM = 2 PIDMSI_STATUS_DRAFT = 3 PIDMSI_STATUS_INPROGRESS = 4 PIDMSI_STATUS_EDIT = 5 PIDMSI_STATUS_REVIEW = 6 PIDMSI_STATUS_PROOF = 7 PIDMSI_STATUS_FINAL = 8 PIDMSI_STATUS_OTHER = 32767 ) const ( RpcNotificationTypeNone = 0 RpcNotificationTypeEvent = 1 RpcNotificationTypeApc = 2 RpcNotificationTypeIoc = 3 RpcNotificationTypeHwnd = 4 RpcNotificationTypeCallback = 5 ) const ( RctInvalid = 0 RctNormal = 1 RctTraining = 2 RctGuaranteed = 3 ) const ( RlafInvalid = 0 RlafIPv4 = 1 RlafIPv6 = 2 ) const ( RpcNotificationCallNone = 0 RpcNotificationClientDisconnect = 1 RpcNotificationCallCancel = 2 ) const ( RcclInvalid = 0 RcclLocal = 1 RcclRemote = 2 RcclClientUnknownLocality = 3 ) const ( RpcCallComplete = 0 RpcSendComplete = 1 RpcReceiveComplete = 2 ) const ( EeptAnsiString = 1 EeptUnicodeString = 2 EeptLongVal = 3 EeptShortVal = 4 EeptPointerVal = 5 EeptNone = 6 EeptBinary = 7 ) const ( RPCHTTP_RS_REDIRECT = 1 RPCHTTP_RS_ACCESS_1 = 2 RPCHTTP_RS_SESSION = 3 RPCHTTP_RS_ACCESS_2 = 4 RPCHTTP_RS_INTERFACE = 5 ) const ( PROTOCOL_NOT_LOADED = 1 PROTOCOL_LOADED = 2 PROTOCOL_ADDRESS_CHANGE = 3 ) const ( USER_MARSHAL_CB_BUFFER_SIZE = 0 USER_MARSHAL_CB_MARSHALL = 1 USER_MARSHAL_CB_UNMARSHALL = 2 USER_MARSHAL_CB_FREE = 3 ) const ( IDL_CS_NO_CONVERT = 0 IDL_CS_IN_PLACE_CONVERT = 1 IDL_CS_NEW_BUFFER_CONVERT = 2 ) const ( XLAT_SERVER = 1 XLAT_CLIENT = 2 ) const ( STUB_UNMARSHAL = 0 STUB_CALL_SERVER = 1 STUB_MARSHAL = 2 STUB_CALL_SERVER_NO_HRESULT = 3 ) const ( PROXY_CALCSIZE = 0 PROXY_GETBUFFER = 1 PROXY_MARSHAL = 2 PROXY_SENDRECEIVE = 3 PROXY_UNMARSHAL = 4 ) const ( ComputerNameNetBIOS = 0 ComputerNameDnsHostname = 1 ComputerNameDnsDomain = 2 ComputerNameDnsFullyQualified = 3 ComputerNamePhysicalNetBIOS = 4 ComputerNamePhysicalDnsHostname = 5 ComputerNamePhysicalDnsDomain = 6 ComputerNamePhysicalDnsFullyQualified = 7 ComputerNameMax = 8 ) const ( BINDVERB_GET = 0 BINDVERB_POST = 1 BINDVERB_PUT = 2 BINDVERB_CUSTOM = 3 BINDVERB_RESERVED1 = 4 ) const ( BINDINFOF_URLENCODESTGMEDDATA = 1 BINDINFOF_URLENCODEDEXTRAINFO = 2 ) const ( BINDF_ASYNCHRONOUS = 1 BINDF_ASYNCSTORAGE = 2 BINDF_NOPROGRESSIVERENDERING = 4 BINDF_OFFLINEOPERATION = 8 BINDF_GETNEWESTVERSION = 16 BINDF_NOWRITECACHE = 32 BINDF_NEEDFILE = 64 BINDF_PULLDATA = 128 BINDF_IGNORESECURITYPROBLEM = 256 BINDF_RESYNCHRONIZE = 512 BINDF_HYPERLINK = 1024 BINDF_NO_UI = 2048 BINDF_SILENTOPERATION = 4096 BINDF_PRAGMA_NO_CACHE = 8192 BINDF_GETCLASSOBJECT = 16384 BINDF_RESERVED_1 = 32768 BINDF_FREE_THREADED = 65536 BINDF_DIRECT_READ = 131072 BINDF_FORMS_SUBMIT = 262144 BINDF_GETFROMCACHE_IF_NET_FAIL = 524288 BINDF_FROMURLMON = 1048576 BINDF_FWD_BACK = 2097152 BINDF_PREFERDEFAULTHANDLER = 4194304 BINDF_ENFORCERESTRICTED = 8388608 BINDF_RESERVED_2 = 2147483648 BINDF_RESERVED_3 = 16777216 BINDF_RESERVED_4 = 33554432 BINDF_RESERVED_5 = 67108864 BINDF_RESERVED_6 = 134217728 BINDF_RESERVED_7 = 1073741824 BINDF_RESERVED_8 = 536870912 ) const ( URL_ENCODING_NONE = 0 URL_ENCODING_ENABLE_UTF8 = 268435456 URL_ENCODING_DISABLE_UTF8 = 536870912 ) const ( BINDINFO_OPTIONS_WININETFLAG = 65536 BINDINFO_OPTIONS_ENABLE_UTF8 = 131072 BINDINFO_OPTIONS_DISABLE_UTF8 = 262144 BINDINFO_OPTIONS_USE_IE_ENCODING = 524288 BINDINFO_OPTIONS_BINDTOOBJECT = 1048576 BINDINFO_OPTIONS_SECURITYOPTOUT = 2097152 BINDINFO_OPTIONS_IGNOREMIMETEXTPLAIN = 4194304 BINDINFO_OPTIONS_USEBINDSTRINGCREDS = 8388608 BINDINFO_OPTIONS_IGNOREHTTPHTTPSREDIRECTS = 16777216 BINDINFO_OPTIONS_IGNORE_SSLERRORS_ONCE = 33554432 BINDINFO_WPC_DOWNLOADBLOCKED = 134217728 BINDINFO_WPC_LOGGING_ENABLED = 268435456 BINDINFO_OPTIONS_ALLOWCONNECTDATA = 536870912 BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS = 1073741824 BINDINFO_OPTIONS_SHDOCVW_NAVIGATE = -2147483648 ) const ( BSCF_FIRSTDATANOTIFICATION = 1 BSCF_INTERMEDIATEDATANOTIFICATION = 2 BSCF_LASTDATANOTIFICATION = 4 BSCF_DATAFULLYAVAILABLE = 8 BSCF_AVAILABLEDATASIZEUNKNOWN = 16 BSCF_SKIPDRAINDATAFORFILEURLS = 32 BSCF_64BITLENGTHDOWNLOAD = 64 ) const ( BINDSTATUS_FINDINGRESOURCE = 1 BINDSTATUS_CONNECTING = 2 BINDSTATUS_REDIRECTING = 3 BINDSTATUS_BEGINDOWNLOADDATA = 4 BINDSTATUS_DOWNLOADINGDATA = 5 BINDSTATUS_ENDDOWNLOADDATA = 6 BINDSTATUS_BEGINDOWNLOADCOMPONENTS = 7 BINDSTATUS_INSTALLINGCOMPONENTS = 8 BINDSTATUS_ENDDOWNLOADCOMPONENTS = 9 BINDSTATUS_USINGCACHEDCOPY = 10 BINDSTATUS_SENDINGREQUEST = 11 BINDSTATUS_CLASSIDAVAILABLE = 12 BINDSTATUS_MIMETYPEAVAILABLE = 13 BINDSTATUS_CACHEFILENAMEAVAILABLE = 14 BINDSTATUS_BEGINSYNCOPERATION = 15 BINDSTATUS_ENDSYNCOPERATION = 16 BINDSTATUS_BEGINUPLOADDATA = 17 BINDSTATUS_UPLOADINGDATA = 18 BINDSTATUS_ENDUPLOADDATA = 19 BINDSTATUS_PROTOCOLCLASSID = 20 BINDSTATUS_ENCODING = 21 BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE = 22 BINDSTATUS_CLASSINSTALLLOCATION = 23 BINDSTATUS_DECODING = 24 BINDSTATUS_LOADINGMIMEHANDLER = 25 BINDSTATUS_CONTENTDISPOSITIONATTACH = 26 BINDSTATUS_FILTERREPORTMIMETYPE = 27 BINDSTATUS_CLSIDCANINSTANTIATE = 28 BINDSTATUS_IUNKNOWNAVAILABLE = 29 BINDSTATUS_DIRECTBIND = 30 BINDSTATUS_RAWMIMETYPE = 31 BINDSTATUS_PROXYDETECTING = 32 BINDSTATUS_ACCEPTRANGES = 33 BINDSTATUS_COOKIE_SENT = 34 BINDSTATUS_COMPACT_POLICY_RECEIVED = 35 BINDSTATUS_COOKIE_SUPPRESSED = 36 BINDSTATUS_COOKIE_STATE_UNKNOWN = 37 BINDSTATUS_COOKIE_STATE_ACCEPT = 38 BINDSTATUS_COOKIE_STATE_REJECT = 39 BINDSTATUS_COOKIE_STATE_PROMPT = 40 BINDSTATUS_COOKIE_STATE_LEASH = 41 BINDSTATUS_COOKIE_STATE_DOWNGRADE = 42 BINDSTATUS_POLICY_HREF = 43 BINDSTATUS_P3P_HEADER = 44 BINDSTATUS_SESSION_COOKIE_RECEIVED = 45 BINDSTATUS_PERSISTENT_COOKIE_RECEIVED = 46 BINDSTATUS_SESSION_COOKIES_ALLOWED = 47 BINDSTATUS_CACHECONTROL = 48 BINDSTATUS_CONTENTDISPOSITIONFILENAME = 49 BINDSTATUS_MIMETEXTPLAINMISMATCH = 50 BINDSTATUS_PUBLISHERAVAILABLE = 51 BINDSTATUS_DISPLAYNAMEAVAILABLE = 52 BINDSTATUS_SSLUX_NAVBLOCKED = 53 BINDSTATUS_SERVER_MIMETYPEAVAILABLE = 54 BINDSTATUS_SNIFFED_CLASSIDAVAILABLE = 55 BINDSTATUS_64BIT_PROGRESS = 56 BINDSTATUS_LAST = 56 BINDSTATUS_RESERVED_0 = 57 BINDSTATUS_RESERVED_1 = 58 BINDSTATUS_RESERVED_2 = 59 BINDSTATUS_RESERVED_3 = 60 BINDSTATUS_RESERVED_4 = 61 BINDSTATUS_RESERVED_5 = 62 BINDSTATUS_RESERVED_6 = 63 BINDSTATUS_RESERVED_7 = 64 BINDSTATUS_RESERVED_8 = 65 BINDSTATUS_RESERVED_9 = 66 BINDSTATUS_LAST_PRIVATE = 66 ) const ( BINDF2_DISABLEBASICOVERHTTP = 1 BINDF2_DISABLEAUTOCOOKIEHANDLING = 2 BINDF2_READ_DATA_GREATER_THAN_4GB = 4 BINDF2_DISABLE_HTTP_REDIRECT_XSECURITYID = 8 BINDF2_SETDOWNLOADMODE = 32 BINDF2_DISABLE_HTTP_REDIRECT_CACHING = 64 BINDF2_KEEP_CALLBACK_MODULE_LOADED = 128 BINDF2_ALLOW_PROXY_CRED_PROMPT = 256 BINDF2_RESERVED_F = 131072 BINDF2_RESERVED_E = 262144 BINDF2_RESERVED_D = 524288 BINDF2_RESERVED_C = 1048576 BINDF2_RESERVED_B = 2097152 BINDF2_RESERVED_A = 4194304 BINDF2_RESERVED_9 = 8388608 BINDF2_RESERVED_8 = 16777216 BINDF2_RESERVED_7 = 33554432 BINDF2_RESERVED_6 = 67108864 BINDF2_RESERVED_5 = 134217728 BINDF2_RESERVED_4 = 268435456 BINDF2_RESERVED_3 = 536870912 BINDF2_RESERVED_2 = 1073741824 BINDF2_RESERVED_1 = 2147483648 ) const ( AUTHENTICATEF_PROXY = 1 AUTHENTICATEF_BASIC = 2 AUTHENTICATEF_HTTP = 4 ) const ( CIP_DISK_FULL = 0 CIP_ACCESS_DENIED = 1 CIP_NEWER_VERSION_EXISTS = 2 CIP_OLDER_VERSION_EXISTS = 3 CIP_NAME_CONFLICT = 4 CIP_TRUST_VERIFICATION_COMPONENT_MISSING = 5 CIP_EXE_SELF_REGISTERATION_TIMEOUT = 6 CIP_UNSAFE_TO_ABORT = 7 CIP_NEED_REBOOT = 8 CIP_NEED_REBOOT_UI_PERMISSION = 9 ) const ( BINDSTRING_HEADERS = 1 BINDSTRING_ACCEPT_MIMES = 2 BINDSTRING_EXTRA_URL = 3 BINDSTRING_LANGUAGE = 4 BINDSTRING_USERNAME = 5 BINDSTRING_PASSWORD = 6 BINDSTRING_UA_PIXELS = 7 BINDSTRING_UA_COLOR = 8 BINDSTRING_OS = 9 BINDSTRING_USER_AGENT = 10 BINDSTRING_ACCEPT_ENCODINGS = 11 BINDSTRING_POST_COOKIE = 12 BINDSTRING_POST_DATA_MIME = 13 BINDSTRING_URL = 14 BINDSTRING_IID = 15 BINDSTRING_FLAG_BIND_TO_OBJECT = 16 BINDSTRING_PTR_BIND_CONTEXT = 17 BINDSTRING_XDR_ORIGIN = 18 BINDSTRING_DOWNLOADPATH = 19 BINDSTRING_ROOTDOC_URL = 20 BINDSTRING_INITIAL_FILENAME = 21 BINDSTRING_PROXY_USERNAME = 22 BINDSTRING_PROXY_PASSWORD = 23 ) const ( PI_PARSE_URL = 1 PI_FILTER_MODE = 2 PI_FORCE_ASYNC = 4 PI_USE_WORKERTHREAD = 8 PI_MIMEVERIFICATION = 16 PI_CLSIDLOOKUP = 32 PI_DATAPROGRESS = 64 PI_SYNCHRONOUS = 128 PI_APARTMENTTHREADED = 256 PI_CLASSINSTALL = 512 PI_PASSONBINDCTX = 8192 PI_NOMIMEHANDLER = 32768 PI_LOADAPPDIRECT = 16384 PD_FORCE_SWITCH = 65536 PI_PREFERDEFAULTHANDLER = 131072 ) const ( OIBDG_APARTMENTTHREADED = 256 OIBDG_DATAONLY = 4096 ) const ( PARSE_CANONICALIZE = 1 PARSE_FRIENDLY = 2 PARSE_SECURITY_URL = 3 PARSE_ROOTDOCUMENT = 4 PARSE_DOCUMENT = 5 PARSE_ANCHOR = 6 PARSE_ENCODE_IS_UNESCAPE = 7 PARSE_DECODE_IS_ESCAPE = 8 PARSE_PATH_FROM_URL = 9 PARSE_URL_FROM_PATH = 10 PARSE_MIME = 11 PARSE_SERVER = 12 PARSE_SCHEMA = 13 PARSE_SITE = 14 PARSE_DOMAIN = 15 PARSE_LOCATION = 16 PARSE_SECURITY_DOMAIN = 17 PARSE_ESCAPE = 18 PARSE_UNESCAPE = 19 ) const ( PSU_DEFAULT = 1 PSU_SECURITY_URL_ONLY = 2 ) const ( QUERY_EXPIRATION_DATE = 1 QUERY_TIME_OF_LAST_CHANGE = 2 QUERY_CONTENT_ENCODING = 3 QUERY_CONTENT_TYPE = 4 QUERY_REFRESH = 5 QUERY_RECOMBINE = 6 QUERY_CAN_NAVIGATE = 7 QUERY_USES_NETWORK = 8 QUERY_IS_CACHED = 9 QUERY_IS_INSTALLEDENTRY = 10 QUERY_IS_CACHED_OR_MAPPED = 11 QUERY_USES_CACHE = 12 QUERY_IS_SECURE = 13 QUERY_IS_SAFE = 14 QUERY_USES_HISTORYFOLDER = 15 QUERY_IS_CACHED_AND_USABLE_OFFLINE = 16 ) const ( PUAF_DEFAULT = 0 PUAF_NOUI = 1 PUAF_ISFILE = 2 PUAF_WARN_IF_DENIED = 4 PUAF_FORCEUI_FOREGROUND = 8 PUAF_CHECK_TIFS = 16 PUAF_DONTCHECKBOXINDIALOG = 32 PUAF_TRUSTED = 64 PUAF_ACCEPT_WILDCARD_SCHEME = 128 PUAF_ENFORCERESTRICTED = 256 PUAF_NOSAVEDFILECHECK = 512 PUAF_REQUIRESAVEDFILECHECK = 1024 PUAF_DONT_USE_CACHE = 4096 PUAF_RESERVED1 = 8192 PUAF_RESERVED2 = 16384 PUAF_LMZ_UNLOCKED = 65536 PUAF_LMZ_LOCKED = 131072 PUAF_DEFAULTZONEPOL = 262144 PUAF_NPL_USE_LOCKED_IF_RESTRICTED = 524288 PUAF_NOUIIFLOCKED = 1048576 PUAF_DRAGPROTOCOLCHECK = 2097152 ) const ( PUAFOUT_DEFAULT = 0 PUAFOUT_ISLOCKZONEPOLICY = 1 ) const ( SZM_CREATE = 0 SZM_DELETE = 1 ) const ( URLZONE_INVALID = -1 URLZONE_PREDEFINED_MIN = 0 URLZONE_LOCAL_MACHINE = 0 URLZONE_INTRANET = 1 URLZONE_TRUSTED = 2 URLZONE_INTERNET = 3 URLZONE_UNTRUSTED = 4 URLZONE_PREDEFINED_MAX = 999 URLZONE_USER_MIN = 1000 URLZONE_USER_MAX = 10000 ) const ( URLTEMPLATE_CUSTOM = 0 URLTEMPLATE_PREDEFINED_MIN = 65536 URLTEMPLATE_LOW = 65536 URLTEMPLATE_MEDLOW = 66816 URLTEMPLATE_MEDIUM = 69632 URLTEMPLATE_MEDHIGH = 70912 URLTEMPLATE_HIGH = 73728 URLTEMPLATE_PREDEFINED_MAX = 131072 ) const ( MAX_ZONE_PATH = 260 MAX_ZONE_DESCRIPTION = 200 ) const ( ZAFLAGS_CUSTOM_EDIT = 1 ZAFLAGS_ADD_SITES = 2 ZAFLAGS_REQUIRE_VERIFICATION = 4 ZAFLAGS_INCLUDE_PROXY_OVERRIDE = 8 ZAFLAGS_INCLUDE_INTRANET_SITES = 16 ZAFLAGS_NO_UI = 32 ZAFLAGS_SUPPORTS_VERIFICATION = 64 ZAFLAGS_UNC_AS_INTRANET = 128 ZAFLAGS_DETECT_INTRANET = 256 ZAFLAGS_USE_LOCKED_ZONES = 65536 ZAFLAGS_VERIFY_TEMPLATE_SETTINGS = 131072 ZAFLAGS_NO_CACHE = 262144 ) const ( URLZONEREG_DEFAULT = 0 URLZONEREG_HKLM = 1 URLZONEREG_HKCU = 2 ) const ( BINDHANDLETYPES_APPCACHE = 0 BINDHANDLETYPES_DEPENDENCY = 1 BINDHANDLETYPES_COUNT = 2 ) const ( MIMETYPEPROP = 0 USE_SRC_URL = 1 CLASSIDPROP = 2 TRUSTEDDOWNLOADPROP = 3 POPUPLEVELPROP = 4 ) const ( ThreadMemoryPriority = 0 ThreadAbsoluteCpuPriority = 1 ThreadInformationClassMax = 2 ) const ( DEPPolicyAlwaysOff = 0 DEPPolicyAlwaysOn = 1 DEPPolicyOptIn = 2 DEPPolicyOptOut = 3 DEPTotalPolicyCount = 4 ) const ( ProcessMemoryPriority = 0 ProcessInformationClassMax = 1 ) const ( FindStreamInfoStandard = 0 FindStreamInfoMaxInfoLevel = 1 ) const ( KeyTypeOther = 0 KeyTypeVirtualSmartCard = 1 KeyTypePhysicalSmartCard = 2 KeyTypePassport = 3 KeyTypePassportRemote = 4 KeyTypePassportSmartCard = 5 KeyTypeHardware = 6 KeyTypeSoftware = 7 KeyTypeSelfSigned = 8 ) const ( DPI_AWARENESS_INVALID = -1 DPI_AWARENESS_UNAWARE = 0 DPI_AWARENESS_SYSTEM_AWARE = 1 DPI_AWARENESS_PER_MONITOR_AWARE = 2 ) const ( DPI_HOSTING_BEHAVIOR_INVALID = -1 DPI_HOSTING_BEHAVIOR_DEFAULT = 0 DPI_HOSTING_BEHAVIOR_MIXED = 1 ) const ( DeviceProblemNone = 0 DeviceProblemHardware = 1 DeviceProblemCHMError = 2 DeviceProblemDoorOpen = 3 DeviceProblemCalibrationError = 4 DeviceProblemTargetFailure = 5 DeviceProblemCHMMoveError = 6 DeviceProblemCHMZeroError = 7 DeviceProblemCartridgeInsertError = 8 DeviceProblemPositionError = 9 DeviceProblemSensorError = 10 DeviceProblemCartridgeEjectError = 11 DeviceProblemGripperError = 12 DeviceProblemDriveError = 13 ) const ( StorageDeviceProperty = 0 StorageAdapterProperty = 1 StorageDeviceIdProperty = 2 StorageDeviceUniqueIdProperty = 3 StorageDeviceWriteCacheProperty = 4 StorageMiniportProperty = 5 StorageAccessAlignmentProperty = 6 StorageDeviceSeekPenaltyProperty = 7 StorageDeviceTrimProperty = 8 ) const ( PropertyStandardQuery = 0 PropertyExistsQuery = 1 PropertyMaskQuery = 2 PropertyQueryMaxDefined = 3 ) const ( DDS_4mm = 32 MiniQic = 33 Travan = 34 QIC = 35 MP_8mm = 36 AME_8mm = 37 AIT1_8mm = 38 DLT = 39 NCTP = 40 IBM_3480 = 41 IBM_3490E = 42 IBM_Magstar_3590 = 43 IBM_Magstar_MP = 44 STK_DATA_D3 = 45 SONY_DTF = 46 DV_6mm = 47 DMI = 48 SONY_D2 = 49 CLEANER_CARTRIDGE = 50 CD_ROM = 51 CD_R = 52 CD_RW = 53 DVD_ROM = 54 DVD_R = 55 DVD_RW = 56 MO_3_RW = 57 MO_5_WO = 58 MO_5_RW = 59 MO_5_LIMDOW = 60 PC_5_WO = 61 PC_5_RW = 62 PD_5_RW = 63 ABL_5_WO = 64 PINNACLE_APEX_5_RW = 65 SONY_12_WO = 66 PHILIPS_12_WO = 67 HITACHI_12_WO = 68 CYGNET_12_WO = 69 KODAK_14_WO = 70 MO_NFR_525 = 71 NIKON_12_RW = 72 IOMEGA_ZIP = 73 IOMEGA_JAZ = 74 SYQUEST_EZ135 = 75 SYQUEST_EZFLYER = 76 SYQUEST_SYJET = 77 AVATAR_F2 = 78 MP2_8mm = 79 DST_S = 80 DST_M = 81 DST_L = 82 VXATape_1 = 83 VXATape_2 = 84 STK_9840 = 85 LTO_Ultrium = 86 LTO_Accelis = 87 DVD_RAM = 88 AIT_8mm = 89 ADR_1 = 90 ADR_2 = 91 STK_9940 = 92 SAIT = 93 VXATape = 94 ) const ( BusTypeUnknown = 0 BusTypeScsi = 1 BusTypeAtapi = 2 BusTypeAta = 3 BusType1394 = 4 BusTypeSsa = 5 BusTypeFibre = 6 BusTypeUsb = 7 BusTypeRAID = 8 BusTypeMax = 9 BusTypeMaxReserved = 127 ) const ( Unknown = 0 F5_1Pt2_512 = 1 F3_1Pt44_512 = 2 F3_2Pt88_512 = 3 F3_20Pt8_512 = 4 F3_720_512 = 5 F5_360_512 = 6 F5_320_512 = 7 F5_320_1024 = 8 F5_180_512 = 9 F5_160_512 = 10 RemovableMedia = 11 FixedMedia = 12 F3_120M_512 = 13 F3_640_512 = 14 F5_640_512 = 15 F5_720_512 = 16 F3_1Pt2_512 = 17 F3_1Pt23_1024 = 18 F5_1Pt23_1024 = 19 F3_128Mb_512 = 20 F3_230Mb_512 = 21 F8_256_128 = 22 F3_200Mb_512 = 23 F3_240M_512 = 24 F3_32M_512 = 25 ) const ( PARTITION_STYLE_MBR = 0 PARTITION_STYLE_GPT = 1 PARTITION_STYLE_RAW = 2 ) const ( DetectNone = 0 DetectInt13 = 1 DetectExInt13 = 2 ) const ( EqualPriority = 0 KeepPrefetchedData = 1 KeepReadData = 2 ) const ( RequestSize = 0 RequestLocation = 1 ) const ( AllElements = 0 ChangerTransport = 1 ChangerSlot = 2 ChangerIEPort = 3 ChangerDrive = 4 ChangerDoor = 5 ChangerKeypad = 6 ChangerMaxElement = 7 ) const ( COMPARE_STRING = 1 ) const ( GEO_NATION = 1 GEO_LATITUDE = 2 GEO_LONGITUDE = 3 GEO_ISO2 = 4 GEO_ISO3 = 5 GEO_RFC1766 = 6 GEO_LCID = 7 GEO_FRIENDLYNAME = 8 GEO_OFFICIALNAME = 9 GEO_TIMEZONES = 10 GEO_OFFICIALLANGUAGES = 11 GEO_ISO_UN_NUMBER = 12 GEO_PARENT = 13 ) const ( GEOCLASS_NATION = 16 GEOCLASS_REGION = 14 GEOCLASS_ALL = 0 ) const ( SidTypeUser = 1 SidTypeGroup = 2 SidTypeDomain = 3 SidTypeAlias = 4 SidTypeWellKnownGroup = 5 SidTypeDeletedAccount = 6 SidTypeInvalid = 7 SidTypeUnknown = 8 SidTypeComputer = 9 SidTypeLabel = 10 SidTypeLogonSession = 11 ) const ( WinNullSid = 0 WinWorldSid = 1 WinLocalSid = 2 WinCreatorOwnerSid = 3 WinCreatorGroupSid = 4 WinCreatorOwnerServerSid = 5 WinCreatorGroupServerSid = 6 WinNtAuthoritySid = 7 WinDialupSid = 8 WinNetworkSid = 9 WinBatchSid = 10 WinInteractiveSid = 11 WinServiceSid = 12 WinAnonymousSid = 13 WinProxySid = 14 WinEnterpriseControllersSid = 15 WinSelfSid = 16 WinAuthenticatedUserSid = 17 WinRestrictedCodeSid = 18 WinTerminalServerSid = 19 WinRemoteLogonIdSid = 20 WinLogonIdsSid = 21 WinLocalSystemSid = 22 WinLocalServiceSid = 23 WinNetworkServiceSid = 24 WinBuiltinDomainSid = 25 WinBuiltinAdministratorsSid = 26 WinBuiltinUsersSid = 27 WinBuiltinGuestsSid = 28 WinBuiltinPowerUsersSid = 29 WinBuiltinAccountOperatorsSid = 30 WinBuiltinSystemOperatorsSid = 31 WinBuiltinPrintOperatorsSid = 32 WinBuiltinBackupOperatorsSid = 33 WinBuiltinReplicatorSid = 34 WinBuiltinPreWindows2000CompatibleAccessSid = 35 WinBuiltinRemoteDesktopUsersSid = 36 WinBuiltinNetworkConfigurationOperatorsSid = 37 WinAccountAdministratorSid = 38 WinAccountGuestSid = 39 WinAccountKrbtgtSid = 40 WinAccountDomainAdminsSid = 41 WinAccountDomainUsersSid = 42 WinAccountDomainGuestsSid = 43 WinAccountComputersSid = 44 WinAccountControllersSid = 45 WinAccountCertAdminsSid = 46 WinAccountSchemaAdminsSid = 47 WinAccountEnterpriseAdminsSid = 48 WinAccountPolicyAdminsSid = 49 WinAccountRasAndIasServersSid = 50 WinNTLMAuthenticationSid = 51 WinDigestAuthenticationSid = 52 WinSChannelAuthenticationSid = 53 WinThisOrganizationSid = 54 WinOtherOrganizationSid = 55 WinBuiltinIncomingForestTrustBuildersSid = 56 WinBuiltinPerfMonitoringUsersSid = 57 WinBuiltinPerfLoggingUsersSid = 58 WinBuiltinAuthorizationAccessSid = 59 WinBuiltinTerminalServerLicenseServersSid = 60 WinBuiltinDCOMUsersSid = 61 WinBuiltinIUsersSid = 62 WinIUserSid = 63 WinBuiltinCryptoOperatorsSid = 64 WinUntrustedLabelSid = 65 WinLowLabelSid = 66 WinMediumLabelSid = 67 WinHighLabelSid = 68 WinSystemLabelSid = 69 WinWriteRestrictedCodeSid = 70 WinCreatorOwnerRightsSid = 71 WinCacheablePrincipalsGroupSid = 72 WinNonCacheablePrincipalsGroupSid = 73 WinEnterpriseReadonlyControllersSid = 74 WinAccountReadonlyControllersSid = 75 WinBuiltinEventLogReadersGroup = 76 WinNewEnterpriseReadonlyControllersSid = 77 WinBuiltinCertSvcDComAccessGroup = 78 WinMediumPlusLabelSid = 79 WinLocalLogonSid = 80 WinConsoleLogonSid = 81 WinThisOrganizationCertificateSid = 82 WinApplicationPackageAuthoritySid = 83 WinBuiltinAnyPackageSid = 84 WinCapabilityInternetClientSid = 85 WinCapabilityInternetClientServerSid = 86 WinCapabilityPrivateNetworkClientServerSid = 87 WinCapabilityPicturesLibrarySid = 88 WinCapabilityVideosLibrarySid = 89 WinCapabilityMusicLibrarySid = 90 WinCapabilityDocumentsLibrarySid = 91 WinCapabilitySharedUserCertificatesSid = 92 WinCapabilityEnterpriseAuthenticationSid = 93 WinCapabilityRemovableStorageSid = 94 WinBuiltinRDSRemoteAccessServersSid = 95 WinBuiltinRDSEndpointServersSid = 96 WinBuiltinRDSManagementServersSid = 97 WinUserModeDriversSid = 98 WinBuiltinHyperVAdminsSid = 99 WinAccountCloneableControllersSid = 100 WinBuiltinAccessControlAssistanceOperatorsSid = 101 WinBuiltinRemoteManagementUsersSid = 102 WinAuthenticationAuthorityAssertedSid = 103 WinAuthenticationServiceAssertedSid = 104 WinLocalAccountSid = 105 WinLocalAccountAndAdministratorSid = 106 WinAccountProtectedUsersSid = 107 WinCapabilityAppointmentsSid = 108 WinCapabilityContactsSid = 109 WinAccountDefaultSystemManagedSid = 110 WinBuiltinDefaultSystemManagedGroupSid = 111 WinBuiltinStorageReplicaAdminsSid = 112 WinAccountKeyAdminsSid = 113 WinAccountEnterpriseKeyAdminsSid = 114 WinAuthenticationKeyTrustSid = 115 WinAuthenticationKeyPropertyMFASid = 116 WinAuthenticationKeyPropertyAttestationSid = 117 ) const ( AclRevisionInformation = 1 AclSizeInformation = 2 ) const ( AuditEventObjectAccess = 0 AuditEventDirectoryServiceAccess = 1 ) const ( AccessReasonNone = 0 AccessReasonAllowedAce = 65536 AccessReasonDeniedAce = 131072 AccessReasonAllowedParentAce = 196608 AccessReasonDeniedParentAce = 262144 AccessReasonNotGrantedByCape = 327680 AccessReasonNotGrantedByParentCape = 393216 AccessReasonNotGrantedToAppContainer = 458752 AccessReasonMissingPrivilege = 1048576 AccessReasonFromPrivilege = 2097152 AccessReasonIntegrityLevel = 3145728 AccessReasonOwnership = 4194304 AccessReasonNullDacl = 5242880 AccessReasonEmptyDacl = 6291456 AccessReasonNoSD = 7340032 AccessReasonNoGrant = 8388608 ) const ( SecurityAnonymous = 0 SecurityIdentification = 1 SecurityImpersonation = 2 SecurityDelegation = 3 ) const ( TokenPrimary = 1 TokenImpersonation = 2 ) const ( TokenElevationTypeDefault = 1 TokenElevationTypeFull = 2 TokenElevationTypeLimited = 3 ) const ( TokenUser = 1 TokenGroups = 2 TokenPrivileges = 3 TokenOwner = 4 TokenPrimaryGroup = 5 TokenDefaultDacl = 6 TokenSource = 7 TokenType = 8 TokenImpersonationLevel = 9 TokenStatistics = 10 TokenRestrictedSids = 11 TokenSessionId = 12 TokenGroupsAndPrivileges = 13 TokenSessionReference = 14 TokenSandBoxInert = 15 TokenAuditPolicy = 16 TokenOrigin = 17 TokenElevationType = 18 TokenLinkedToken = 19 TokenElevation = 20 TokenHasRestrictions = 21 TokenAccessInformation = 22 TokenVirtualizationAllowed = 23 TokenVirtualizationEnabled = 24 TokenIntegrityLevel = 25 TokenUIAccess = 26 TokenMandatoryPolicy = 27 TokenLogonSid = 28 TokenIsAppContainer = 29 TokenCapabilities = 30 TokenAppContainerSid = 31 TokenAppContainerNumber = 32 TokenUserClaimAttributes = 33 TokenDeviceClaimAttributes = 34 TokenRestrictedUserClaimAttributes = 35 TokenRestrictedDeviceClaimAttributes = 36 TokenDeviceGroups = 37 TokenRestrictedDeviceGroups = 38 TokenSecurityAttributes = 39 TokenIsRestricted = 40 MaxTokenInfoClass = 41 ) const ( MandatoryLevelUntrusted = 0 MandatoryLevelLow = 1 MandatoryLevelMedium = 2 MandatoryLevelHigh = 3 MandatoryLevelSystem = 4 MandatoryLevelSecureProcess = 5 MandatoryLevelCount = 6 ) const ( SeLearningModeInvalidType = 0 SeLearningModeSettings = 1 SeLearningModeMax = 2 ) const ( PMCCounter = 0 MaxHardwareCounterType = 1 ) const ( ProcessDEPPolicy = 0 ProcessASLRPolicy = 1 ProcessDynamicCodePolicy = 2 ProcessStrictHandleCheckPolicy = 3 ProcessSystemCallDisablePolicy = 4 ProcessMitigationOptionsMask = 5 ProcessExtensionPointDisablePolicy = 6 ProcessControlFlowGuardPolicy = 7 ProcessSignaturePolicy = 8 ProcessFontDisablePolicy = 9 ProcessImageLoadPolicy = 10 MaxProcessMitigationPolicy = 11 ) const ( ToleranceLow = 1 ToleranceMedium = 2 ToleranceHigh = 3 ) const ( ToleranceIntervalShort = 1 ToleranceIntervalMedium = 2 ToleranceIntervalLong = 3 ) const ( JobObjectBasicAccountingInformation = 1 JobObjectBasicLimitInformation = 2 JobObjectBasicProcessIdList = 3 JobObjectBasicUIRestrictions = 4 JobObjectSecurityLimitInformation = 5 JobObjectEndOfJobTimeInformation = 6 JobObjectAssociateCompletionPortInformation = 7 JobObjectBasicAndIoAccountingInformation = 8 JobObjectExtendedLimitInformation = 9 JobObjectJobSetInformation = 10 JobObjectGroupInformation = 11 JobObjectNotificationLimitInformation = 12 JobObjectLimitViolationInformation = 13 JobObjectGroupInformationEx = 14 JobObjectCpuRateControlInformation = 15 JobObjectCompletionFilter = 16 JobObjectCompletionCounter = 17 JobObjectReserved1Information = 18 JobObjectReserved2Information = 19 JobObjectReserved3Information = 20 JobObjectReserved4Information = 21 JobObjectReserved5Information = 22 JobObjectReserved6Information = 23 JobObjectReserved7Information = 24 JobObjectReserved8Information = 25 MaxJobObjectInfoClass = 26 ) const ( FirmwareTypeUnknown = 0 FirmwareTypeBios = 1 FirmwareTypeUefi = 2 FirmwareTypeMax = 3 ) const ( RelationProcessorCore = 0 RelationNumaNode = 1 RelationCache = 2 RelationProcessorPackage = 3 RelationGroup = 4 RelationAll = 65535 ) const ( CacheUnified = 0 CacheInstruction = 1 CacheData = 2 CacheTrace = 3 ) const ( UNSPECIFIED_COMPARTMENT_ID = 0 DEFAULT_COMPARTMENT_ID = 1 ) const ( MemExtendedParameterInvalidType = 0 MemExtendedParameterAddressRequirements = 1 MemExtendedParameterNumaNode = 2 MemExtendedParameterPartitionHandle = 3 MemExtendedParameterUserPhysicalHandle = 4 MemExtendedParameterAttributeFlags = 5 MemExtendedParameterMax = 6 ) const ( MemSectionExtendedParameterInvalidType = 0 MemSectionExtendedParameterUserPhysicalFlags = 1 MemSectionExtendedParameterNumaNode = 2 MemSectionExtendedParameterMax = 3 ) const ( PowerSystemUnspecified = 0 PowerSystemWorking = 1 PowerSystemSleeping1 = 2 PowerSystemSleeping2 = 3 PowerSystemSleeping3 = 4 PowerSystemHibernate = 5 PowerSystemShutdown = 6 PowerSystemMaximum = 7 ) const ( PowerActionNone = 0 PowerActionReserved = 1 PowerActionSleep = 2 PowerActionHibernate = 3 PowerActionShutdown = 4 PowerActionShutdownReset = 5 PowerActionShutdownOff = 6 PowerActionWarmEject = 7 ) const ( PowerDeviceUnspecified = 0 PowerDeviceD0 = 1 PowerDeviceD1 = 2 PowerDeviceD2 = 3 PowerDeviceD3 = 4 PowerDeviceMaximum = 5 ) const ( PowerMonitorOff = 0 PowerMonitorOn = 1 PowerMonitorDim = 2 ) const ( PowerUserPresent = 0 PowerUserNotPresent = 1 PowerUserInactive = 2 PowerUserMaximum = 3 PowerUserInvalid = 3 ) const ( LT_DONT_CARE = 0 LT_LOWEST_LATENCY = 1 ) const ( PowerRequestDisplayRequired = 0 PowerRequestSystemRequired = 1 PowerRequestAwayModeRequired = 2 PowerRequestExecutionRequired = 3 ) const ( SystemPowerPolicyAc = 0 SystemPowerPolicyDc = 1 VerifySystemPolicyAc = 2 VerifySystemPolicyDc = 3 SystemPowerCapabilities = 4 SystemBatteryState = 5 SystemPowerStateHandler = 6 ProcessorStateHandler = 7 SystemPowerPolicyCurrent = 8 AdministratorPowerPolicy = 9 SystemReserveHiberFile = 10 ProcessorInformation = 11 SystemPowerInformation = 12 ProcessorStateHandler2 = 13 LastWakeTime = 14 LastSleepTime = 15 SystemExecutionState = 16 SystemPowerStateNotifyHandler = 17 ProcessorPowerPolicyAc = 18 ProcessorPowerPolicyDc = 19 VerifyProcessorPowerPolicyAc = 20 VerifyProcessorPowerPolicyDc = 21 ProcessorPowerPolicyCurrent = 22 SystemPowerStateLogging = 23 SystemPowerLoggingEntry = 24 SetPowerSettingValue = 25 NotifyUserPowerSetting = 26 PowerInformationLevelUnused0 = 27 SystemMonitorHiberBootPowerOff = 28 SystemVideoState = 29 TraceApplicationPowerMessage = 30 TraceApplicationPowerMessageEnd = 31 ProcessorPerfStates = 32 ProcessorIdleStates = 33 ProcessorCap = 34 SystemWakeSource = 35 SystemHiberFileInformation = 36 TraceServicePowerMessage = 37 ProcessorLoad = 38 PowerShutdownNotification = 39 MonitorCapabilities = 40 SessionPowerInit = 41 SessionDisplayState = 42 PowerRequestCreate = 43 PowerRequestAction = 44 GetPowerRequestList = 45 ProcessorInformationEx = 46 NotifyUserModeLegacyPowerEvent = 47 GroupPark = 48 ProcessorIdleDomains = 49 WakeTimerList = 50 SystemHiberFileSize = 51 ProcessorIdleStatesHv = 52 ProcessorPerfStatesHv = 53 ProcessorPerfCapHv = 54 ProcessorSetIdle = 55 LogicalProcessorIdling = 56 UserPresence = 57 PowerSettingNotificationName = 58 GetPowerSettingValue = 59 IdleResiliency = 60 SessionRITState = 61 SessionConnectNotification = 62 SessionPowerCleanup = 63 SessionLockState = 64 SystemHiberbootState = 65 PlatformInformation = 66 PdcInvocation = 67 MonitorInvocation = 68 FirmwareTableInformationRegistered = 69 SetShutdownSelectedTime = 70 SuspendResumeInvocation = 71 PlmPowerRequestCreate = 72 ScreenOff = 73 CsDeviceNotification = 74 PlatformRole = 75 LastResumePerformance = 76 DisplayBurst = 77 ExitLatencySamplingPercentage = 78 ApplyLowPowerScenarioSettings = 79 PowerInformationLevelMaximum = 80 ) const ( UserNotPresent = 0 UserPresent = 1 UserUnknown = 255 ) const ( MonitorRequestReasonUnknown = 0 MonitorRequestReasonPowerButton = 1 MonitorRequestReasonRemoteConnection = 2 MonitorRequestReasonScMonitorpower = 3 MonitorRequestReasonUserInput = 4 MonitorRequestReasonAcDcDisplayBurst = 5 MonitorRequestReasonUserDisplayBurst = 6 MonitorRequestReasonPoSetSystemState = 7 MonitorRequestReasonSetThreadExecutionState = 8 MonitorRequestReasonFullWake = 9 MonitorRequestReasonSessionUnlock = 10 MonitorRequestReasonScreenOffRequest = 11 MonitorRequestReasonIdleTimeout = 12 MonitorRequestReasonPolicyChange = 13 MonitorRequestReasonMax = 14 ) const ( PoAc = 0 PoDc = 1 PoHot = 2 PoConditionMaximum = 3 ) const ( PlatformRoleUnspecified = 0 PlatformRoleDesktop = 1 PlatformRoleMobile = 2 PlatformRoleWorkstation = 3 PlatformRoleEnterpriseServer = 4 PlatformRoleSOHOServer = 5 PlatformRoleAppliancePC = 6 PlatformRolePerformanceServer = 7 PlatformRoleSlate = 8 PlatformRoleMaximum = 9 ) const ( IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1 ) const ( IMPORT_OBJECT_CODE = 0 IMPORT_OBJECT_DATA = 1 IMPORT_OBJECT_CONST = 2 ) const ( IMPORT_OBJECT_ORDINAL = 0 IMPORT_OBJECT_NAME = 1 IMPORT_OBJECT_NAME_NO_PREFIX = 2 IMPORT_OBJECT_NAME_UNDECORATE = 3 ) const ( COMIMAGE_FLAGS_ILONLY = 1 COMIMAGE_FLAGS_32BITREQUIRED = 2 COMIMAGE_FLAGS_IL_LIBRARY = 4 COMIMAGE_FLAGS_STRONGNAMESIGNED = 8 COMIMAGE_FLAGS_TRACKDEBUGDATA = 65536 COR_VERSION_MAJOR_V2 = 2 COR_VERSION_MAJOR = 2 COR_VERSION_MINOR = 0 COR_DELETED_NAME_LENGTH = 8 COR_VTABLEGAP_NAME_LENGTH = 8 NATIVE_TYPE_MAX_CB = 1 COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE = 255 IMAGE_COR_MIH_METHODRVA = 1 IMAGE_COR_MIH_EHRVA = 2 IMAGE_COR_MIH_BASICBLOCK = 8 COR_VTABLE_32BIT = 1 COR_VTABLE_64BIT = 2 COR_VTABLE_FROM_UNMANAGED = 4 COR_VTABLE_CALL_MOST_DERIVED = 16 IMAGE_COR_EATJ_THUNK_SIZE = 32 MAX_CLASS_NAME = 1024 MAX_PACKAGE_NAME = 1024 ) const ( UmsThreadInvalidInfoClass = 0 UmsThreadUserContext = 1 UmsThreadPriority = 2 UmsThreadAffinity = 3 UmsThreadTeb = 4 UmsThreadIsSuspended = 5 UmsThreadIsTerminated = 6 UmsThreadMaxInfoClass = 7 ) const ( UmsSchedulerStartup = 0 UmsSchedulerThreadBlocked = 1 UmsSchedulerThreadYield = 2 ) const ( HeapCompatibilityInformation = 0 HeapEnableTerminationOnCorruption = 1 ) const ( ActivationContextBasicInformation = 1 ActivationContextDetailedInformation = 2 AssemblyDetailedInformationInActivationContext = 3 FileInformationInAssemblyOfAssemblyInActivationContext = 4 RunlevelInformationInActivationContext = 5 CompatibilityInformationInActivationContext = 6 ActivationContextManifestResourceName = 7 MaxActivationContextInfoClass = 8 AssemblyDetailedInformationInActivationContxt = 3 FileInformationInAssemblyOfAssemblyInActivationContxt = 4 ) const ( ACTCTX_RUN_LEVEL_UNSPECIFIED = 0 ACTCTX_RUN_LEVEL_AS_INVOKER = 1 ACTCTX_RUN_LEVEL_HIGHEST_AVAILABLE = 2 ACTCTX_RUN_LEVEL_REQUIRE_ADMIN = 3 ACTCTX_RUN_LEVEL_NUMBERS = 4 ) const ( ACTCTX_COMPATIBILITY_ELEMENT_TYPE_UNKNOWN = 0 ACTCTX_COMPATIBILITY_ELEMENT_TYPE_OS = 1 ACTCTX_COMPATIBILITY_ELEMENT_TYPE_MITIGATION = 2 ) const ( DriverType = 1 FileSystemType = 2 Win32ServiceOwnProcess = 16 Win32ServiceShareProcess = 32 AdapterType = 4 RecognizerType = 8 ) const ( BootLoad = 0 SystemLoad = 1 AutoLoad = 2 DemandLoad = 3 DisableLoad = 4 ) const ( IgnoreError = 0 NormalError = 1 SevereError = 2 CriticalError = 3 ) const ( TapeDriveProblemNone = 0 TapeDriveReadWriteWarning = 1 TapeDriveReadWriteError = 2 TapeDriveReadWarning = 3 TapeDriveWriteWarning = 4 TapeDriveReadError = 5 TapeDriveWriteError = 6 TapeDriveHardwareError = 7 TapeDriveUnsupportedMedia = 8 TapeDriveScsiConnectionError = 9 TapeDriveTimetoClean = 10 TapeDriveCleanDriveNow = 11 TapeDriveMediaLifeExpired = 12 TapeDriveSnappedTape = 13 ) const ( TP_CALLBACK_PRIORITY_HIGH = 0 TP_CALLBACK_PRIORITY_NORMAL = 1 TP_CALLBACK_PRIORITY_LOW = 2 TP_CALLBACK_PRIORITY_INVALID = 3 TP_CALLBACK_PRIORITY_COUNT = 3 ) const ( TransactionOutcomeUndetermined = 1 TransactionOutcomeCommitted = 2 TransactionOutcomeAborted = 3 ) const ( TransactionStateNormal = 1 TransactionStateIndoubt = 2 TransactionStateCommittedNotify = 3 ) const ( TransactionBasicInformation = 0 TransactionPropertiesInformation = 1 TransactionEnlistmentInformation = 2 TransactionSuperiorEnlistmentInformation = 3 TransactionBindInformation = 4 TransactionDTCPrivateInformation = 5 ) const ( TransactionManagerBasicInformation = 0 TransactionManagerLogInformation = 1 TransactionManagerLogPathInformation = 2 TransactionManagerOnlineProbeInformation = 3 TransactionManagerRecoveryInformation = 4 TransactionManagerOldestTransactionInformation = 5 ) const ( ResourceManagerBasicInformation = 0 ResourceManagerCompletionInformation = 1 ) const ( EnlistmentBasicInformation = 0 EnlistmentRecoveryInformation = 1 EnlistmentCrmInformation = 2 ) const ( KTMOBJECT_TRANSACTION = 0 KTMOBJECT_TRANSACTION_MANAGER = 1 KTMOBJECT_RESOURCE_MANAGER = 2 KTMOBJECT_ENLISTMENT = 3 KTMOBJECT_INVALID = 4 ) const ( BIDI_NULL = 0 BIDI_INT = 1 BIDI_FLOAT = 2 BIDI_BOOL = 3 BIDI_STRING = 4 BIDI_TEXT = 5 BIDI_ENUM = 6 BIDI_BLOB = 7 ) const ( SC_ACTION_NONE = 0 SC_ACTION_RESTART = 1 SC_ACTION_REBOOT = 2 SC_ACTION_RUN_COMMAND = 3 ) const ( SC_STATUS_PROCESS_INFO = 0 ) const ( SC_ENUM_PROCESS_INFO = 0 ) const ( DCDC_DEFAULT = 0 DCDC_DISABLE_FONT_UPDATE = 1 DCDC_DISABLE_RELAYOUT = 2 ) const ( DDC_DEFAULT = 0 DDC_DISABLE_ALL = 1 DDC_DISABLE_RESIZE = 2 DDC_DISABLE_CONTROL_RELAYOUT = 4 ) const ( DVASPECT_CONTENT = 1 DVASPECT_THUMBNAIL = 2 DVASPECT_ICON = 4 DVASPECT_DOCPRINT = 8 ) const ( STGC_DEFAULT = 0 STGC_OVERWRITE = 1 STGC_ONLYIFCURRENT = 2 STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE = 4 STGC_CONSOLIDATE = 8 ) const ( STGMOVE_MOVE = 0 STGMOVE_COPY = 1 STGMOVE_SHALLOWCOPY = 2 ) const ( STATFLAG_DEFAULT = 0 STATFLAG_NONAME = 1 STATFLAG_NOOPEN = 2 ) const ( VT_EMPTY = 0 VT_NULL = 1 VT_I2 = 2 VT_I4 = 3 VT_R4 = 4 VT_R8 = 5 VT_CY = 6 VT_DATE = 7 VT_BSTR = 8 VT_DISPATCH = 9 VT_ERROR = 10 VT_BOOL = 11 VT_VARIANT = 12 VT_UNKNOWN = 13 VT_DECIMAL = 14 VT_I1 = 16 VT_UI1 = 17 VT_UI2 = 18 VT_UI4 = 19 VT_I8 = 20 VT_UI8 = 21 VT_INT = 22 VT_UINT = 23 VT_VOID = 24 VT_HRESULT = 25 VT_PTR = 26 VT_SAFEARRAY = 27 VT_CARRAY = 28 VT_USERDEFINED = 29 VT_LPSTR = 30 VT_LPWSTR = 31 VT_RECORD = 36 VT_INT_PTR = 37 VT_UINT_PTR = 38 VT_FILETIME = 64 VT_BLOB = 65 VT_STREAM = 66 VT_STORAGE = 67 VT_STREAMED_OBJECT = 68 VT_STORED_OBJECT = 69 VT_BLOB_OBJECT = 70 VT_CF = 71 VT_CLSID = 72 VT_VERSIONED_STREAM = 73 VT_BSTR_BLOB = 4095 VT_VECTOR = 4096 VT_ARRAY = 8192 VT_BYREF = 16384 VT_RESERVED = 32768 VT_ILLEGAL = 65535 VT_ILLEGALMASKED = 4095 VT_TYPEMASK = 4095 ) const ( TYSPEC_CLSID = 0 TYSPEC_FILEEXT = 1 TYSPEC_MIMETYPE = 2 TYSPEC_FILENAME = 3 TYSPEC_PROGID = 4 TYSPEC_PACKAGENAME = 5 TYSPEC_OBJECTID = 6 ) const ( MEMCTX_TASK = 1 MEMCTX_SHARED = 2 MEMCTX_MACSYSTEM = 3 MEMCTX_UNKNOWN = -1 MEMCTX_SAME = -2 ) const ( CLSCTX_INPROC_SERVER = 1 CLSCTX_INPROC_HANDLER = 2 CLSCTX_LOCAL_SERVER = 4 CLSCTX_INPROC_SERVER16 = 8 CLSCTX_REMOTE_SERVER = 16 CLSCTX_INPROC_HANDLER16 = 32 CLSCTX_RESERVED1 = 64 CLSCTX_RESERVED2 = 128 CLSCTX_RESERVED3 = 256 CLSCTX_RESERVED4 = 512 CLSCTX_NO_CODE_DOWNLOAD = 1024 CLSCTX_RESERVED5 = 2048 CLSCTX_NO_CUSTOM_MARSHAL = 4096 CLSCTX_ENABLE_CODE_DOWNLOAD = 8192 CLSCTX_NO_FAILURE_LOG = 16384 CLSCTX_DISABLE_AAA = 32768 CLSCTX_ENABLE_AAA = 65536 CLSCTX_FROM_DEFAULT_CONTEXT = 131072 CLSCTX_ACTIVATE_32_BIT_SERVER = 262144 CLSCTX_ACTIVATE_64_BIT_SERVER = 524288 CLSCTX_ENABLE_CLOAKING = 1048576 CLSCTX_APPCONTAINER = 4194304 CLSCTX_ACTIVATE_AAA_AS_IU = 8388608 CLSCTX_PS_DLL = -2147483648 ) const ( MSHLFLAGS_NORMAL = 0 MSHLFLAGS_TABLESTRONG = 1 MSHLFLAGS_TABLEWEAK = 2 MSHLFLAGS_NOPING = 4 MSHLFLAGS_RESERVED1 = 8 MSHLFLAGS_RESERVED2 = 16 MSHLFLAGS_RESERVED3 = 32 MSHLFLAGS_RESERVED4 = 64 ) const ( MSHCTX_LOCAL = 0 MSHCTX_NOSHAREDMEM = 1 MSHCTX_DIFFERENTMACHINE = 2 MSHCTX_INPROC = 3 MSHCTX_CROSSCTX = 4 ) type Ptrdiff_t = int64 type Size_t = uint64 type Wchar_t = uint16 type X__int128_t = struct { Flo int64 Fhi int64 } type X__uint128_t = struct { Flo uint64 Fhi uint64 } type X__builtin_va_list = uintptr type X__float128 = float64 type Va_list = X__builtin_va_list type X__gnuc_va_list = X__builtin_va_list // 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. // // assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER ); // assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 ); // assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 ); // // ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] // macro. ^The sqlite3_libversion() function returns a pointer to the // 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]int8)(unsafe.Pointer(ts)) type sqlite3 = struct { FpVfs uintptr FpVdbe uintptr FpDfltColl uintptr Fmutex uintptr FaDb uintptr FnDb int32 FmDbFlags U32 Fflags U64 FlastRowid I64 FszMmap I64 FnSchemaLock U32 FopenFlags uint32 FerrCode int32 FerrByteOffset int32 FerrMask int32 FiSysErrno int32 FdbOptFlags U32 Fenc U8 FautoCommit U8 Ftemp_store U8 FmallocFailed U8 FbBenignMalloc U8 FdfltLockMode U8 FnextAutovac int8 FsuppressErr U8 FvtabOnConflict U8 FisTransactionSavepoint U8 FmTrace U8 FnoSharedCache U8 FnSqlExec U8 FeOpenState U8 F__ccgo_pad1 [2]byte FnextPagesize int32 FnChange I64 FnTotalChange I64 FaLimit [12]int32 FnMaxSorterMmap int32 F__ccgo_pad2 [4]byte Finit struct { FnewTnum Pgno FiDb U8 Fbusy U8 F__ccgo_pad1 [2]byte ForphanTrigger uint8 F__ccgo_pad2 [7]byte FazInit uintptr } FnVdbeActive int32 FnVdbeRead int32 FnVdbeWrite int32 FnVdbeExec int32 FnVDestroy int32 FnExtension int32 FaExtension uintptr Ftrace struct{ FxLegacy uintptr } FpTraceArg uintptr FxProfile uintptr FpProfileArg uintptr FpCommitArg uintptr FxCommitCallback uintptr FpRollbackArg uintptr FxRollbackCallback uintptr FpUpdateArg uintptr FxUpdateCallback uintptr FpAutovacPagesArg uintptr FxAutovacDestr uintptr FxAutovacPages uintptr FpParse uintptr FpPreUpdateArg uintptr FxPreUpdateCallback uintptr FpPreUpdate uintptr FxWalCallback uintptr FpWalArg uintptr FxCollNeeded uintptr FxCollNeeded16 uintptr FpCollNeededArg uintptr FpErr uintptr Fu1 struct { F__ccgo_pad1 [0]uint64 FisInterrupted int32 F__ccgo_pad2 [4]byte } Flookaside Lookaside FxAuth Sqlite3_xauth FpAuthArg uintptr FxProgress uintptr FpProgressArg uintptr FnProgressOps uint32 FnVTrans int32 FaModule Hash FpVtabCtx uintptr FaVTrans uintptr FpDisconnect uintptr FaFunc Hash FaCollSeq Hash FbusyHandler BusyHandler FaDbStatic [2]Db FpSavepoint uintptr FnAnalysisLimit int32 FbusyTimeout int32 FnSavepoint int32 FnStatement int32 FnDeferredCons I64 FnDeferredImmCons I64 FpnBytesFreed uintptr FpBlockingConnection uintptr FpUnlockConnection uintptr FpUnlockArg uintptr FxUnlockNotify uintptr FpNextBlocked uintptr } // CAPI3REF: Database Connection Handle // KEYWORDS: {database connection} {database connections} // // Each open SQLite database is represented by a pointer to an instance of // the opaque structure named "sqlite3". It is useful to think of an sqlite3 // pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and // [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] // and [sqlite3_close_v2()] are its destructors. There are many other // interfaces (such as // [sqlite3_prepare_v2()], [sqlite3_create_function()], and // [sqlite3_busy_timeout()] to name but three) that are methods on an // sqlite3 object. type Sqlite3 = sqlite3 // CAPI3REF: 64-Bit Integer Types // KEYWORDS: sqlite_int64 sqlite_uint64 // // Because there is no cross-platform way to specify 64-bit integer types // SQLite includes typedefs for 64-bit signed and unsigned integers. // // The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. // The sqlite_int64 and sqlite_uint64 types are supported for backwards // compatibility only. // // ^The sqlite3_int64 and sqlite_int64 types can store integer values // between -9223372036854775808 and +9223372036854775807 inclusive. ^The // sqlite3_uint64 and sqlite_uint64 types can store integer values // between 0 and +18446744073709551615 inclusive. type Sqlite_int64 = int64 type Sqlite_uint64 = uint64 type Sqlite3_int64 = Sqlite_int64 type Sqlite3_uint64 = Sqlite_uint64 // The type for a callback function. // This is legacy and deprecated. It is included for historical // compatibility and is not documented. type Sqlite3_callback = uintptr type sqlite3_file = struct{ FpMethods uintptr } // CAPI3REF: OS Interface Open File Handle // // An [sqlite3_file] object represents an open file in the // [sqlite3_vfs | OS interface layer]. Individual OS interface // implementations will // want to subclass this object by appending additional fields // for their own use. The pMethods entry is a pointer to an // [sqlite3_io_methods] object that defines methods for performing // I/O operations on the open file. type Sqlite3_file = sqlite3_file type sqlite3_io_methods = struct { FiVersion int32 F__ccgo_pad1 [4]byte FxClose uintptr FxRead uintptr FxWrite uintptr FxTruncate uintptr FxSync uintptr FxFileSize uintptr FxLock uintptr FxUnlock uintptr FxCheckReservedLock uintptr FxFileControl uintptr FxSectorSize uintptr FxDeviceCharacteristics uintptr FxShmMap uintptr FxShmLock uintptr FxShmBarrier uintptr FxShmUnmap uintptr FxFetch uintptr FxUnfetch uintptr } // CAPI3REF: OS Interface File Virtual Methods Object // // Every file opened by the [sqlite3_vfs.xOpen] method populates an // [sqlite3_file] object (or, more commonly, a subclass of the // [sqlite3_file] object) with a pointer to an instance of this object. // This object defines the methods used to perform various operations // against the open file represented by the [sqlite3_file] object. // // If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element // to a non-NULL pointer, then the sqlite3_io_methods.xClose method // may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The // only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] // is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element // to NULL. // // The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or // [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). // The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] // flag may be ORed in to indicate that only the data of the file // and not its inode needs to be synced. // // The integer values to xLock() and xUnlock() are one of // // xLock() upgrades the database file lock. In other words, xLock() moves the // database file lock in the direction NONE toward EXCLUSIVE. The argument to // xLock() is always on of SHARED, RESERVED, PENDING, or EXCLUSIVE, never // SQLITE_LOCK_NONE. If the database file lock is already at or above the // requested lock, then the call to xLock() is a no-op. // xUnlock() downgrades the database file lock to either SHARED or NONE. // // If the lock is already at or below the requested lock state, then the call // // to xUnlock() is a no-op. // The xCheckReservedLock() method checks whether any database connection, // either in this process or in some other process, is holding a RESERVED, // PENDING, or EXCLUSIVE lock on the file. It returns true // if such a lock exists and false otherwise. // // The xFileControl() method is a generic interface that allows custom // VFS implementations to directly control an open file using the // [sqlite3_file_control()] interface. The second "op" argument is an // integer opcode. The third argument is a generic pointer intended to // point to a structure that may contain arguments or space in which to // write return values. Potential uses for xFileControl() might be // functions to enable blocking locks with timeouts, to change the // locking strategy (for example to use dot-file locks), to inquire // about the status of a lock, or to break stale locks. The SQLite // core reserves all opcodes less than 100 for its own use. // A [file control opcodes | list of opcodes] less than 100 is available. // Applications that define a custom xFileControl method should use opcodes // greater than 100 to avoid conflicts. VFS implementations should // return [SQLITE_NOTFOUND] for file control opcodes that they do not // recognize. // // The xSectorSize() method returns the sector size of the // device that underlies the file. The sector size is the // minimum write that can be performed without disturbing // other bytes in the file. The xDeviceCharacteristics() // method returns a bit vector describing behaviors of the // underlying device: // // // // The SQLITE_IOCAP_ATOMIC property means that all writes of // any size are atomic. The SQLITE_IOCAP_ATOMICnnn values // mean that writes of blocks that are nnn bytes in size and // are aligned to an address which is an integer multiple of // nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means // that when data is appended to a file, the data is appended // first then the size of the file is extended, never the other // way around. The SQLITE_IOCAP_SEQUENTIAL property means that // information is written to disk in the same order as calls // to xWrite(). // // If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill // in the unread portions of the buffer with zeros. A VFS that // fails to zero-fill short reads might seem to work. However, // failure to zero-fill short reads will eventually lead to // database corruption. type Sqlite3_io_methods = sqlite3_io_methods type sqlite3_api_routines = struct { Faggregate_context uintptr Faggregate_count uintptr Fbind_blob uintptr Fbind_double uintptr Fbind_int uintptr Fbind_int64 uintptr Fbind_null uintptr Fbind_parameter_count uintptr Fbind_parameter_index uintptr Fbind_parameter_name uintptr Fbind_text uintptr Fbind_text16 uintptr Fbind_value uintptr Fbusy_handler uintptr Fbusy_timeout uintptr Fchanges uintptr Fclose uintptr Fcollation_needed uintptr Fcollation_needed16 uintptr Fcolumn_blob uintptr Fcolumn_bytes uintptr Fcolumn_bytes16 uintptr Fcolumn_count uintptr Fcolumn_database_name uintptr Fcolumn_database_name16 uintptr Fcolumn_decltype uintptr Fcolumn_decltype16 uintptr Fcolumn_double uintptr Fcolumn_int uintptr Fcolumn_int64 uintptr Fcolumn_name uintptr Fcolumn_name16 uintptr Fcolumn_origin_name uintptr Fcolumn_origin_name16 uintptr Fcolumn_table_name uintptr Fcolumn_table_name16 uintptr Fcolumn_text uintptr Fcolumn_text16 uintptr Fcolumn_type uintptr Fcolumn_value uintptr Fcommit_hook uintptr Fcomplete uintptr Fcomplete16 uintptr Fcreate_collation uintptr Fcreate_collation16 uintptr Fcreate_function uintptr Fcreate_function16 uintptr Fcreate_module uintptr Fdata_count uintptr Fdb_handle uintptr Fdeclare_vtab uintptr Fenable_shared_cache uintptr Ferrcode uintptr Ferrmsg uintptr Ferrmsg16 uintptr Fexec uintptr Fexpired uintptr Ffinalize uintptr Ffree uintptr Ffree_table uintptr Fget_autocommit uintptr Fget_auxdata uintptr Fget_table uintptr Fglobal_recover uintptr Finterruptx uintptr Flast_insert_rowid uintptr Flibversion uintptr Flibversion_number uintptr Fmalloc uintptr Fmprintf uintptr Fopen uintptr Fopen16 uintptr Fprepare uintptr Fprepare16 uintptr Fprofile uintptr Fprogress_handler uintptr Frealloc uintptr Freset uintptr Fresult_blob uintptr Fresult_double uintptr Fresult_error uintptr Fresult_error16 uintptr Fresult_int uintptr Fresult_int64 uintptr Fresult_null uintptr Fresult_text uintptr Fresult_text16 uintptr Fresult_text16be uintptr Fresult_text16le uintptr Fresult_value uintptr Frollback_hook uintptr Fset_authorizer uintptr Fset_auxdata uintptr Fxsnprintf uintptr Fstep uintptr Ftable_column_metadata uintptr Fthread_cleanup uintptr Ftotal_changes uintptr Ftrace uintptr Ftransfer_bindings uintptr Fupdate_hook uintptr Fuser_data uintptr Fvalue_blob uintptr Fvalue_bytes uintptr Fvalue_bytes16 uintptr Fvalue_double uintptr Fvalue_int uintptr Fvalue_int64 uintptr Fvalue_numeric_type uintptr Fvalue_text uintptr Fvalue_text16 uintptr Fvalue_text16be uintptr Fvalue_text16le uintptr Fvalue_type uintptr Fvmprintf uintptr Foverload_function uintptr Fprepare_v2 uintptr Fprepare16_v2 uintptr Fclear_bindings uintptr Fcreate_module_v2 uintptr Fbind_zeroblob uintptr Fblob_bytes uintptr Fblob_close uintptr Fblob_open uintptr Fblob_read uintptr Fblob_write uintptr Fcreate_collation_v2 uintptr Ffile_control uintptr Fmemory_highwater uintptr Fmemory_used uintptr Fmutex_alloc uintptr Fmutex_enter uintptr Fmutex_free uintptr Fmutex_leave uintptr Fmutex_try uintptr Fopen_v2 uintptr Frelease_memory uintptr Fresult_error_nomem uintptr Fresult_error_toobig uintptr Fsleep uintptr Fsoft_heap_limit uintptr Fvfs_find uintptr Fvfs_register uintptr Fvfs_unregister uintptr Fxthreadsafe uintptr Fresult_zeroblob uintptr Fresult_error_code uintptr Ftest_control uintptr Frandomness uintptr Fcontext_db_handle uintptr Fextended_result_codes uintptr Flimit uintptr Fnext_stmt uintptr Fsql uintptr Fstatus uintptr Fbackup_finish uintptr Fbackup_init uintptr Fbackup_pagecount uintptr Fbackup_remaining uintptr Fbackup_step uintptr Fcompileoption_get uintptr Fcompileoption_used uintptr Fcreate_function_v2 uintptr Fdb_config uintptr Fdb_mutex uintptr Fdb_status uintptr Fextended_errcode uintptr Flog uintptr Fsoft_heap_limit64 uintptr Fsourceid uintptr Fstmt_status uintptr Fstrnicmp uintptr Funlock_notify uintptr Fwal_autocheckpoint uintptr Fwal_checkpoint uintptr Fwal_hook uintptr Fblob_reopen uintptr Fvtab_config uintptr Fvtab_on_conflict uintptr Fclose_v2 uintptr Fdb_filename uintptr Fdb_readonly uintptr Fdb_release_memory uintptr Ferrstr uintptr Fstmt_busy uintptr Fstmt_readonly uintptr Fstricmp uintptr Furi_boolean uintptr Furi_int64 uintptr Furi_parameter uintptr Fxvsnprintf uintptr Fwal_checkpoint_v2 uintptr Fauto_extension uintptr Fbind_blob64 uintptr Fbind_text64 uintptr Fcancel_auto_extension uintptr Fload_extension uintptr Fmalloc64 uintptr Fmsize uintptr Frealloc64 uintptr Freset_auto_extension uintptr Fresult_blob64 uintptr Fresult_text64 uintptr Fstrglob uintptr Fvalue_dup uintptr Fvalue_free uintptr Fresult_zeroblob64 uintptr Fbind_zeroblob64 uintptr Fvalue_subtype uintptr Fresult_subtype uintptr Fstatus64 uintptr Fstrlike uintptr Fdb_cacheflush uintptr Fsystem_errno uintptr Ftrace_v2 uintptr Fexpanded_sql uintptr Fset_last_insert_rowid uintptr Fprepare_v3 uintptr Fprepare16_v3 uintptr Fbind_pointer uintptr Fresult_pointer uintptr Fvalue_pointer uintptr Fvtab_nochange uintptr Fvalue_nochange uintptr Fvtab_collation uintptr Fkeyword_count uintptr Fkeyword_name uintptr Fkeyword_check uintptr Fstr_new uintptr Fstr_finish uintptr Fstr_appendf uintptr Fstr_vappendf uintptr Fstr_append uintptr Fstr_appendall uintptr Fstr_appendchar uintptr Fstr_reset uintptr Fstr_errcode uintptr Fstr_length uintptr Fstr_value uintptr Fcreate_window_function uintptr Fnormalized_sql uintptr Fstmt_isexplain uintptr Fvalue_frombind uintptr Fdrop_modules uintptr Fhard_heap_limit64 uintptr Furi_key uintptr Ffilename_database uintptr Ffilename_journal uintptr Ffilename_wal uintptr Fcreate_filename uintptr Ffree_filename uintptr Fdatabase_file_object uintptr Ftxn_state uintptr Fchanges64 uintptr Ftotal_changes64 uintptr Fautovacuum_pages uintptr Ferror_offset uintptr Fvtab_rhs_value uintptr Fvtab_distinct uintptr Fvtab_in uintptr Fvtab_in_first uintptr Fvtab_in_next uintptr Fdeserialize uintptr Fserialize uintptr Fdb_name uintptr Fvalue_encoding uintptr Fis_interrupted uintptr } // CAPI3REF: Loadable Extension Thunk // // A pointer to the opaque sqlite3_api_routines structure is passed as // the third parameter to entry points of [loadable extensions]. This // structure must be typedefed in order to work around compiler warnings // on some platforms. type Sqlite3_api_routines = sqlite3_api_routines // CAPI3REF: File Name // // Type [sqlite3_filename] is used by SQLite to pass filenames to the // xOpen method of a [VFS]. It may be cast to (const char*) and treated // as a normal, nul-terminated, UTF-8 buffer containing the filename, but // may also be passed to special APIs such as: // // type Sqlite3_filename = uintptr type sqlite3_vfs = struct { FiVersion int32 FszOsFile int32 FmxPathname int32 F__ccgo_pad1 [4]byte FpNext uintptr FzName uintptr FpAppData uintptr FxOpen uintptr FxDelete uintptr FxAccess uintptr FxFullPathname uintptr FxDlOpen uintptr FxDlError uintptr FxDlSym uintptr FxDlClose uintptr FxRandomness uintptr FxSleep uintptr FxCurrentTime uintptr FxGetLastError uintptr FxCurrentTimeInt64 uintptr FxSetSystemCall uintptr FxGetSystemCall uintptr FxNextSystemCall uintptr } // CAPI3REF: OS Interface Object // // An instance of the sqlite3_vfs object defines the interface between // the SQLite core and the underlying operating system. The "vfs" // in the name of the object stands for "virtual file system". See // the [VFS | VFS documentation] for further information. // // The VFS interface is sometimes extended by adding new methods onto // the end. Each time such an extension occurs, the iVersion field // is incremented. The iVersion value started out as 1 in // SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2 // with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased // to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields // may be appended to the sqlite3_vfs object and the iVersion value // may increase again in future versions of SQLite. // Note that due to an oversight, the structure // of the sqlite3_vfs object changed in the transition from // SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] // and yet the iVersion field was not increased. // // The szOsFile field is the size of the subclassed [sqlite3_file] // structure used by this VFS. mxPathname is the maximum length of // a pathname in this VFS. // // Registered sqlite3_vfs objects are kept on a linked list formed by // the pNext pointer. The [sqlite3_vfs_register()] // and [sqlite3_vfs_unregister()] interfaces manage this list // in a thread-safe way. The [sqlite3_vfs_find()] interface // searches the list. Neither the application code nor the VFS // implementation should use the pNext pointer. // // The pNext field is the only field in the sqlite3_vfs // structure that SQLite will ever modify. SQLite will only access // or modify this field while holding a particular static mutex. // The application should never modify anything within the sqlite3_vfs // object once the object has been registered. // // The zName field holds the name of the VFS module. The name must // be unique across all VFS modules. // // [[sqlite3_vfs.xOpen]] // ^SQLite guarantees that the zFilename parameter to xOpen // is either a NULL pointer or string obtained // from xFullPathname() with an optional suffix added. // ^If a suffix is added to the zFilename parameter, it will // consist of a single "-" character followed by no more than // 11 alphanumeric and/or "-" characters. // ^SQLite further guarantees that // the string will be valid and unchanged until xClose() is // called. Because of the previous sentence, // the [sqlite3_file] can safely store a pointer to the // filename if it needs to remember the filename for some reason. // If the zFilename parameter to xOpen is a NULL pointer then xOpen // must invent its own temporary name for the file. ^Whenever the // xFilename parameter is NULL it will also be the case that the // flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. // // The flags argument to xOpen() includes all bits set in // the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] // or [sqlite3_open16()] is used, then flags includes at least // [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. // If xOpen() opens a file read-only then it sets *pOutFlags to // include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. // // ^(SQLite will also add one of the following flags to the xOpen() // call, depending on the object being opened: // // )^ // // The file I/O implementation can use the object type flags to // change the way it deals with files. For example, an application // that does not care about crash recovery or rollback might make // the open of a journal file a no-op. Writes to this journal would // also be no-ops, and any attempt to read the journal would return // SQLITE_IOERR. Or the implementation might recognize that a database // file will be doing page-aligned sector reads and writes in a random // order and set up its I/O subsystem accordingly. // // SQLite might also add one of the following flags to the xOpen method: // // // // The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be // deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] // will be set for TEMP databases and their journals, transient // databases, and subjournals. // // ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction // with the [SQLITE_OPEN_CREATE] flag, which are both directly // analogous to the O_EXCL and O_CREAT flags of the POSIX open() // API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the // SQLITE_OPEN_CREATE, is used to indicate that file should always // be created, and that it is an error if it already exists. // It is not used to indicate the file should be opened // for exclusive access. // // ^At least szOsFile bytes of memory are allocated by SQLite // to hold the [sqlite3_file] structure passed as the third // argument to xOpen. The xOpen method does not have to // allocate the structure; it should just fill it in. Note that // the xOpen method must set the sqlite3_file.pMethods to either // a valid [sqlite3_io_methods] object or to NULL. xOpen must do // this even if the open fails. SQLite expects that the sqlite3_file.pMethods // element will be valid after xOpen returns regardless of the success // or failure of the xOpen call. // // [[sqlite3_vfs.xAccess]] // ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] // to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to // test whether a file is readable and writable, or [SQLITE_ACCESS_READ] // to test whether a file is at least readable. The SQLITE_ACCESS_READ // flag is never actually used and is not implemented in the built-in // VFSes of SQLite. The file is named by the second argument and can be a // directory. The xAccess method returns [SQLITE_OK] on success or some // non-zero error code if there is an I/O error or if the name of // the file given in the second argument is illegal. If SQLITE_OK // is returned, then non-zero or zero is written into *pResOut to indicate // whether or not the file is accessible. // // ^SQLite will always allocate at least mxPathname+1 bytes for the // output buffer xFullPathname. The exact size of the output buffer // is also passed as a parameter to both methods. If the output buffer // is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is // handled as a fatal error by SQLite, vfs implementations should endeavor // to prevent this by setting mxPathname to a sufficiently large value. // // The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() // interfaces are not strictly a part of the filesystem, but they are // included in the VFS structure for completeness. // The xRandomness() function attempts to return nBytes bytes // of good-quality randomness into zOut. The return value is // the actual number of bytes of randomness obtained. // The xSleep() method causes the calling thread to sleep for at // least the number of microseconds given. ^The xCurrentTime() // method returns a Julian Day Number for the current date and time as // a floating point value. // ^The xCurrentTimeInt64() method returns, as an integer, the Julian // Day Number multiplied by 86400000 (the number of milliseconds in // a 24-hour day). // ^SQLite will use the xCurrentTimeInt64() method to get the current // date and time if that method is available (if iVersion is 2 or // greater and the function pointer is not NULL) and will fall back // to xCurrentTime() if xCurrentTimeInt64() is unavailable. // // ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces // are not used by the SQLite core. These optional interfaces are provided // by some VFSes to facilitate testing of the VFS code. By overriding // system calls with functions under its control, a test program can // simulate faults and error conditions that would otherwise be difficult // or impossible to induce. The set of system calls that can be overridden // varies from one VFS to another, and from one version of the same VFS to the // next. Applications that use these interfaces must be prepared for any // or all of these interfaces to be NULL or for their behavior to change // from one release to the next. Applications must not attempt to access // any of these methods if the iVersion of the VFS is less than 3. type Sqlite3_vfs = sqlite3_vfs type Sqlite3_syscall_ptr = uintptr type sqlite3_mem_methods = struct { FxMalloc uintptr FxFree uintptr FxRealloc uintptr FxSize uintptr FxRoundup uintptr FxInit uintptr FxShutdown uintptr FpAppData uintptr } // CAPI3REF: Memory Allocation Routines // // An instance of this object defines the interface between SQLite // and low-level memory allocation routines. // // This object is used in only one place in the SQLite interface. // A pointer to an instance of this object is the argument to // [sqlite3_config()] when the configuration option is // [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. // By creating an instance of this object // and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) // during configuration, an application can specify an alternative // memory allocation subsystem for SQLite to use for all of its // dynamic memory needs. // // Note that SQLite comes with several [built-in memory allocators] // that are perfectly adequate for the overwhelming majority of applications // and that this object is only useful to a tiny minority of applications // with specialized memory allocation requirements. This object is // also used during testing of SQLite in order to specify an alternative // memory allocator that simulates memory out-of-memory conditions in // order to verify that SQLite recovers gracefully from such // conditions. // // The xMalloc, xRealloc, and xFree methods must work like the // malloc(), realloc() and free() functions from the standard C library. // ^SQLite guarantees that the second argument to // xRealloc is always a value returned by a prior call to xRoundup. // // xSize should return the allocated size of a memory allocation // previously obtained from xMalloc or xRealloc. The allocated size // is always at least as big as the requested size but may be larger. // // The xRoundup method returns what would be the allocated size of // a memory allocation given a particular requested size. Most memory // allocators round up memory allocations at least to the next multiple // of 8. Some allocators round up to a larger multiple or to a power of 2. // Every memory allocation request coming in through [sqlite3_malloc()] // or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, // that causes the corresponding memory allocation to fail. // // The xInit method initializes the memory allocator. For example, // it might allocate any required mutexes or initialize internal data // structures. The xShutdown method is invoked (indirectly) by // [sqlite3_shutdown()] and should deallocate any resources acquired // by xInit. The pAppData pointer is used as the only parameter to // xInit and xShutdown. // // SQLite holds the [SQLITE_MUTEX_STATIC_MAIN] mutex when it invokes // the xInit method, so the xInit method need not be threadsafe. The // xShutdown method is only called from [sqlite3_shutdown()] so it does // not need to be threadsafe either. For all other methods, SQLite // holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the // [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which // it is by default) and so the methods are automatically serialized. // However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other // methods must be threadsafe or else make their own arrangements for // serialization. // // SQLite will never invoke xInit() more than once without an intervening // call to xShutdown(). type Sqlite3_mem_methods = sqlite3_mem_methods type sqlite3_value = struct { Fu struct{ Fr float64 } Fz uintptr Fn int32 Fflags U16 Fenc U8 FeSubtype U8 Fdb uintptr FszMalloc int32 FuTemp U32 FzMalloc uintptr FxDel uintptr } // CAPI3REF: Dynamically Typed Value Object // KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} // // SQLite uses the sqlite3_value object to represent all values // that can be stored in a database table. SQLite uses dynamic typing // for the values it stores. ^Values stored in sqlite3_value objects // can be integers, floating point values, strings, BLOBs, or NULL. // // An sqlite3_value object may be either "protected" or "unprotected". // Some interfaces require a protected sqlite3_value. Other interfaces // will accept either a protected or an unprotected sqlite3_value. // Every interface that accepts sqlite3_value arguments specifies // whether or not it requires a protected sqlite3_value. The // [sqlite3_value_dup()] interface can be used to construct a new // protected sqlite3_value from an unprotected sqlite3_value. // // The terms "protected" and "unprotected" refer to whether or not // a mutex is held. An internal mutex is held for a protected // sqlite3_value object but no mutex is held for an unprotected // sqlite3_value object. If SQLite is compiled to be single-threaded // (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) // or if SQLite is run in one of reduced mutex modes // [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] // then there is no distinction between protected and unprotected // sqlite3_value objects and they can be used interchangeably. However, // for maximum code portability it is recommended that applications // still make the distinction between protected and unprotected // sqlite3_value objects even when not strictly required. // // ^The sqlite3_value objects that are passed as parameters into the // implementation of [application-defined SQL functions] are protected. // ^The sqlite3_value objects returned by [sqlite3_vtab_rhs_value()] // are protected. // ^The sqlite3_value object returned by // [sqlite3_column_value()] is unprotected. // Unprotected sqlite3_value objects may only be used as arguments // to [sqlite3_result_value()], [sqlite3_bind_value()], and // [sqlite3_value_dup()]. // The [sqlite3_value_blob | sqlite3_value_type()] family of // interfaces require protected sqlite3_value objects. type Sqlite3_value = sqlite3_value type sqlite3_context = struct { FpOut uintptr FpFunc uintptr FpMem uintptr FpVdbe uintptr FiOp int32 FisError int32 Fenc U8 FskipFlag U8 Fargc U8 F__ccgo_pad1 [5]byte Fargv [1]uintptr } // CAPI3REF: SQL Function Context Object // // The context in which an SQL function executes is stored in an // sqlite3_context object. ^A pointer to an sqlite3_context object // is always first parameter to [application-defined SQL functions]. // The application-defined SQL function implementation will pass this // pointer through into calls to [sqlite3_result_int | sqlite3_result()], // [sqlite3_aggregate_context()], [sqlite3_user_data()], // [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], // and/or [sqlite3_set_auxdata()]. type Sqlite3_context = sqlite3_context // CAPI3REF: Constants Defining Special Destructor Behavior // // These are special values for the destructor that is passed in as the // final argument to routines like [sqlite3_result_blob()]. ^If the destructor // argument is SQLITE_STATIC, it means that the content pointer is constant // and will never change. It does not need to be destroyed. ^The // SQLITE_TRANSIENT value means that the content will likely change in // the near future and that SQLite should make its own private copy of // the content before returning. // // The typedef is necessary to work around problems in certain // C++ compilers. type Sqlite3_destructor_type = uintptr type sqlite3_vtab = struct { FpModule uintptr FnRef int32 F__ccgo_pad1 [4]byte FzErrMsg uintptr } // Structures used by the virtual table interface type Sqlite3_vtab = sqlite3_vtab type sqlite3_index_info = struct { FnConstraint int32 F__ccgo_pad1 [4]byte FaConstraint uintptr FnOrderBy int32 F__ccgo_pad2 [4]byte FaOrderBy uintptr FaConstraintUsage uintptr FidxNum int32 F__ccgo_pad3 [4]byte FidxStr uintptr FneedToFreeIdxStr int32 ForderByConsumed int32 FestimatedCost float64 FestimatedRows Sqlite3_int64 FidxFlags int32 F__ccgo_pad4 [4]byte FcolUsed Sqlite3_uint64 } type Sqlite3_index_info = sqlite3_index_info type sqlite3_vtab_cursor = struct{ FpVtab uintptr } type Sqlite3_vtab_cursor = sqlite3_vtab_cursor type sqlite3_module = struct { FiVersion int32 F__ccgo_pad1 [4]byte FxCreate uintptr FxConnect uintptr FxBestIndex uintptr FxDisconnect uintptr FxDestroy uintptr FxOpen uintptr FxClose uintptr FxFilter uintptr FxNext uintptr FxEof uintptr FxColumn uintptr FxRowid uintptr FxUpdate uintptr FxBegin uintptr FxSync uintptr FxCommit uintptr FxRollback uintptr FxFindFunction uintptr FxRename uintptr FxSavepoint uintptr FxRelease uintptr FxRollbackTo uintptr FxShadowName uintptr } type Sqlite3_module = sqlite3_module type sqlite3_index_constraint = struct { FiColumn int32 Fop uint8 Fusable uint8 F__ccgo_pad1 [2]byte FiTermOffset int32 } type sqlite3_index_orderby = struct { FiColumn int32 Fdesc uint8 F__ccgo_pad1 [3]byte } type sqlite3_index_constraint_usage = struct { FargvIndex int32 Fomit uint8 F__ccgo_pad1 [3]byte } type sqlite3_mutex_methods = struct { FxMutexInit uintptr FxMutexEnd uintptr FxMutexAlloc uintptr FxMutexFree uintptr FxMutexEnter uintptr FxMutexTry uintptr FxMutexLeave uintptr FxMutexHeld uintptr FxMutexNotheld uintptr } // CAPI3REF: Mutex Methods Object // // An instance of this structure defines the low-level routines // used to allocate and use mutexes. // // Usually, the default mutex implementations provided by SQLite are // sufficient, however the application has the option of substituting a custom // implementation for specialized deployments or systems for which SQLite // does not provide a suitable implementation. In this case, the application // creates and populates an instance of this structure to pass // to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. // Additionally, an instance of this structure can be used as an // output variable when querying the system for the current mutex // implementation, using the [SQLITE_CONFIG_GETMUTEX] option. // // ^The xMutexInit method defined by this structure is invoked as // part of system initialization by the sqlite3_initialize() function. // ^The xMutexInit routine is called by SQLite exactly once for each // effective call to [sqlite3_initialize()]. // // ^The xMutexEnd method defined by this structure is invoked as // part of system shutdown by the sqlite3_shutdown() function. The // implementation of this method is expected to release all outstanding // resources obtained by the mutex methods implementation, especially // those obtained by the xMutexInit method. ^The xMutexEnd() // interface is invoked exactly once for each call to [sqlite3_shutdown()]. // // ^(The remaining seven methods defined by this structure (xMutexAlloc, // xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and // xMutexNotheld) implement the following interfaces (respectively): // // )^ // // The only difference is that the public sqlite3_XXX functions enumerated // above silently ignore any invocations that pass a NULL pointer instead // of a valid mutex handle. The implementations of the methods defined // by this structure are not required to handle this case. The results // of passing a NULL pointer instead of a valid mutex handle are undefined // (i.e. it is acceptable to provide an implementation that segfaults if // it is passed a NULL pointer). // // The xMutexInit() method must be threadsafe. It must be harmless to // invoke xMutexInit() multiple times within the same process and without // intervening calls to xMutexEnd(). Second and subsequent calls to // xMutexInit() must be no-ops. // // xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] // and its associates). Similarly, xMutexAlloc() must not use SQLite memory // allocation for a static mutex. ^However xMutexAlloc() may use SQLite // memory allocation for a fast or recursive mutex. // // ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is // called, but only if the prior call to xMutexInit returned SQLITE_OK. // If xMutexInit fails in any way, it is expected to clean up after itself // prior to returning. type Sqlite3_mutex_methods = sqlite3_mutex_methods type sqlite3_str = struct { Fdb uintptr FzText uintptr FnAlloc U32 FmxAlloc U32 FnChar U32 FaccError U8 FprintfFlags U8 F__ccgo_pad1 [2]byte } // CAPI3REF: Dynamic String Object // KEYWORDS: {dynamic string} // // An instance of the sqlite3_str object contains a dynamically-sized // string under construction. // // The lifecycle of an sqlite3_str object is as follows: //
    //
  1. ^The sqlite3_str object is created using [sqlite3_str_new()]. //
  2. ^Text is appended to the sqlite3_str object using various // methods, such as [sqlite3_str_appendf()]. //
  3. ^The sqlite3_str object is destroyed and the string it created // is returned using the [sqlite3_str_finish()] interface. //
type Sqlite3_str = sqlite3_str type sqlite3_pcache_page = struct { FpBuf uintptr FpExtra uintptr } // CAPI3REF: Custom Page Cache Object // // The sqlite3_pcache_page object represents a single page in the // page cache. The page cache will allocate instances of this // object. Various methods of the page cache use pointers to instances // of this object as parameters or as their return value. // // See [sqlite3_pcache_methods2] for additional information. type Sqlite3_pcache_page = sqlite3_pcache_page type sqlite3_pcache_methods2 = struct { FiVersion int32 F__ccgo_pad1 [4]byte FpArg uintptr FxInit uintptr FxShutdown uintptr FxCreate uintptr FxCachesize uintptr FxPagecount uintptr FxFetch uintptr FxUnpin uintptr FxRekey uintptr FxTruncate uintptr FxDestroy uintptr FxShrink uintptr } // CAPI3REF: Application Defined Page Cache. // KEYWORDS: {page cache} // // ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can // register an alternative page cache implementation by passing in an // instance of the sqlite3_pcache_methods2 structure.)^ // In many applications, most of the heap memory allocated by // SQLite is used for the page cache. // By implementing a // custom page cache using this API, an application can better control // the amount of memory consumed by SQLite, the way in which // that memory is allocated and released, and the policies used to // determine exactly which parts of a database file are cached and for // how long. // // The alternative page cache mechanism is an // extreme measure that is only needed by the most demanding applications. // The built-in page cache is recommended for most uses. // // ^(The contents of the sqlite3_pcache_methods2 structure are copied to an // internal buffer by SQLite within the call to [sqlite3_config]. Hence // the application may discard the parameter after the call to // [sqlite3_config()] returns.)^ // // [[the xInit() page cache method]] // ^(The xInit() method is called once for each effective // call to [sqlite3_initialize()])^ // (usually only once during the lifetime of the process). ^(The xInit() // method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ // The intent of the xInit() method is to set up global data structures // required by the custom page cache implementation. // ^(If the xInit() method is NULL, then the // built-in default page cache is used instead of the application defined // page cache.)^ // // [[the xShutdown() page cache method]] // ^The xShutdown() method is called by [sqlite3_shutdown()]. // It can be used to clean up // any outstanding resources before process shutdown, if required. // ^The xShutdown() method may be NULL. // // ^SQLite automatically serializes calls to the xInit method, // so the xInit method need not be threadsafe. ^The // xShutdown method is only called from [sqlite3_shutdown()] so it does // not need to be threadsafe either. All other methods must be threadsafe // in multithreaded applications. // // ^SQLite will never invoke xInit() more than once without an intervening // call to xShutdown(). // // [[the xCreate() page cache methods]] // ^SQLite invokes the xCreate() method to construct a new cache instance. // SQLite will typically create one cache instance for each open database file, // though this is not guaranteed. ^The // first parameter, szPage, is the size in bytes of the pages that must // be allocated by the cache. ^szPage will always a power of two. ^The // second parameter szExtra is a number of bytes of extra storage // associated with each page cache entry. ^The szExtra parameter will // a number less than 250. SQLite will use the // extra szExtra bytes on each page to store metadata about the underlying // database page on disk. The value passed into szExtra depends // on the SQLite version, the target platform, and how SQLite was compiled. // ^The third argument to xCreate(), bPurgeable, is true if the cache being // created will be used to cache database pages of a file stored on disk, or // false if it is used for an in-memory database. The cache implementation // does not have to do anything special based with the value of bPurgeable; // it is purely advisory. ^On a cache where bPurgeable is false, SQLite will // never invoke xUnpin() except to deliberately delete a page. // ^In other words, calls to xUnpin() on a cache with bPurgeable set to // false will always have the "discard" flag set to true. // ^Hence, a cache created with bPurgeable false will // never contain any unpinned pages. // // [[the xCachesize() page cache method]] // ^(The xCachesize() method may be called at any time by SQLite to set the // suggested maximum cache-size (number of pages stored by) the cache // instance passed as the first argument. This is the value configured using // the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable // parameter, the implementation is not required to do anything with this // value; it is advisory only. // // [[the xPagecount() page cache methods]] // The xPagecount() method must return the number of pages currently // stored in the cache, both pinned and unpinned. // // [[the xFetch() page cache methods]] // The xFetch() method locates a page in the cache and returns a pointer to // an sqlite3_pcache_page object associated with that page, or a NULL pointer. // The pBuf element of the returned sqlite3_pcache_page object will be a // pointer to a buffer of szPage bytes used to store the content of a // single database page. The pExtra element of sqlite3_pcache_page will be // a pointer to the szExtra bytes of extra storage that SQLite has requested // for each entry in the page cache. // // The page to be fetched is determined by the key. ^The minimum key value // is 1. After it has been retrieved using xFetch, the page is considered // to be "pinned". // // If the requested page is already in the page cache, then the page cache // implementation must return a pointer to the page buffer with its content // intact. If the requested page is not already in the cache, then the // cache implementation should use the value of the createFlag // parameter to help it determined what action to take: // // //
createFlag Behavior when page is not already in cache //
0 Do not allocate a new page. Return NULL. //
1 Allocate a new page if it easy and convenient to do so. // // Otherwise return NULL. // //
2 Make every effort to allocate a new page. Only return // // NULL if allocating a new page is effectively impossible. // //
// // ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite // will only use a createFlag of 2 after a prior call with a createFlag of 1 // failed.)^ In between the xFetch() calls, SQLite may // attempt to unpin one or more cache pages by spilling the content of // pinned pages to disk and synching the operating system disk cache. // // [[the xUnpin() page cache method]] // ^xUnpin() is called by SQLite with a pointer to a currently pinned page // as its second argument. If the third parameter, discard, is non-zero, // then the page must be evicted from the cache. // ^If the discard parameter is // zero, then the page may be discarded or retained at the discretion of // page cache implementation. ^The page cache implementation // may choose to evict unpinned pages at any time. // // The cache must not perform any reference counting. A single // call to xUnpin() unpins the page regardless of the number of prior calls // to xFetch(). // // [[the xRekey() page cache methods]] // The xRekey() method is used to change the key value associated with the // page passed as the second argument. If the cache // previously contains an entry associated with newKey, it must be // discarded. ^Any prior cache entry associated with newKey is guaranteed not // to be pinned. // // When SQLite calls the xTruncate() method, the cache must discard all // existing cache entries with page numbers (keys) greater than or equal // to the value of the iLimit parameter passed to xTruncate(). If any // of these pages are pinned, they are implicitly unpinned, meaning that // they can be safely discarded. // // [[the xDestroy() page cache method]] // ^The xDestroy() method is used to delete a cache allocated by xCreate(). // All resources associated with the specified cache should be freed. ^After // calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] // handle invalid, and will not use it with any other sqlite3_pcache_methods2 // functions. // // [[the xShrink() page cache method]] // ^SQLite invokes the xShrink() method when it wants the page cache to // free up as much of heap memory as possible. The page cache implementation // is not obligated to free any memory, but well-behaved implementations should // do their best. type Sqlite3_pcache_methods2 = sqlite3_pcache_methods2 type sqlite3_pcache_methods = struct { FpArg uintptr FxInit uintptr FxShutdown uintptr FxCreate uintptr FxCachesize uintptr FxPagecount uintptr FxFetch uintptr FxUnpin uintptr FxRekey uintptr FxTruncate uintptr FxDestroy uintptr } // This is the obsolete pcache_methods object that has now been replaced // by sqlite3_pcache_methods2. This object is not used by SQLite. It is // retained in the header file for backwards compatibility only. type Sqlite3_pcache_methods = sqlite3_pcache_methods type sqlite3_backup = struct { FpDestDb uintptr FpDest uintptr FiDestSchema U32 FbDestLocked int32 FiNext Pgno F__ccgo_pad1 [4]byte FpSrcDb uintptr FpSrc uintptr Frc int32 FnRemaining Pgno FnPagecount Pgno FisAttached int32 FpNext uintptr } // CAPI3REF: Online Backup Object // // The sqlite3_backup object records state information about an ongoing // online backup operation. ^The sqlite3_backup object is created by // a call to [sqlite3_backup_init()] and is destroyed by a call to // [sqlite3_backup_finish()]. // // See Also: [Using the SQLite Online Backup API] type Sqlite3_backup = sqlite3_backup type sqlite3_snapshot = struct{ Fhidden [48]uint8 } // CAPI3REF: Database Snapshot // KEYWORDS: {snapshot} {sqlite3_snapshot} // // An instance of the snapshot object records the state of a [WAL mode] // database for some specific point in history. // // In [WAL mode], multiple [database connections] that are open on the // same database file can each be reading a different historical version // of the database file. When a [database connection] begins a read // transaction, that connection sees an unchanging copy of the database // as it existed for the point in time when the transaction first started. // Subsequent changes to the database from other connections are not seen // by the reader until a new read transaction is started. // // The sqlite3_snapshot object records state information about an historical // version of the database file so that it is possible to later open a new read // transaction that sees that historical version of the database rather than // the most recent version. type Sqlite3_snapshot = sqlite3_snapshot type sqlite3_rtree_geometry = struct { FpContext uintptr FnParam int32 F__ccgo_pad1 [4]byte FaParam uintptr FpUser uintptr FxDelUser uintptr } type Sqlite3_rtree_geometry = sqlite3_rtree_geometry type sqlite3_rtree_query_info = struct { FpContext uintptr FnParam int32 F__ccgo_pad1 [4]byte FaParam uintptr FpUser uintptr FxDelUser uintptr FaCoord uintptr FanQueue uintptr FnCoord int32 FiLevel int32 FmxLevel int32 F__ccgo_pad2 [4]byte FiRowid Sqlite3_int64 FrParentScore Sqlite3_rtree_dbl FeParentWithin int32 FeWithin int32 FrScore Sqlite3_rtree_dbl FapSqlParam uintptr } type Sqlite3_rtree_query_info = sqlite3_rtree_query_info // The double-precision datatype used by RTree depends on the // SQLITE_RTREE_INT_ONLY compile-time option. type Sqlite3_rtree_dbl = float64 type sqlite3_session = struct { Fdb uintptr FzDb uintptr FbEnableSize int32 FbEnable int32 FbIndirect int32 FbAutoAttach int32 Frc int32 F__ccgo_pad1 [4]byte FpFilterCtx uintptr FxTableFilter uintptr FnMalloc I64 FnMaxChangesetSize I64 FpZeroBlob uintptr FpNext uintptr FpTable uintptr Fhook SessionHook } // CAPI3REF: Session Object Handle // // An instance of this object is a [session] that can be used to // record changes to a database. type Sqlite3_session = sqlite3_session type sqlite3_changeset_iter = struct { Fin SessionInput Ftblhdr SessionBuffer FbPatchset int32 FbInvert int32 FbSkipEmpty int32 Frc int32 FpConflict uintptr FzTab uintptr FnCol int32 Fop int32 FbIndirect int32 F__ccgo_pad1 [4]byte FabPK uintptr FapValue uintptr } // CAPI3REF: Changeset Iterator Handle // // An instance of this object acts as a cursor for iterating // over the elements of a [changeset] or [patchset]. type Sqlite3_changeset_iter = sqlite3_changeset_iter type sqlite3_changegroup = struct { Frc int32 FbPatch int32 FpList uintptr } // CAPI3REF: Changegroup Handle // // A changegroup is an object used to combine two or more // [changesets] or [patchsets] type Sqlite3_changegroup = sqlite3_changegroup type sqlite3_rebaser = struct{ Fgrp Sqlite3_changegroup } // CAPI3REF: Rebasing changesets // EXPERIMENTAL // // Suppose there is a site hosting a database in state S0. And that // modifications are made that move that database to state S1 and a // changeset recorded (the "local" changeset). Then, a changeset based // on S0 is received from another site (the "remote" changeset) and // applied to the database. The database is then in state // (S1+"remote"), where the exact state depends on any conflict // resolution decisions (OMIT or REPLACE) made while applying "remote". // Rebasing a changeset is to update it to take those conflict // resolution decisions into account, so that the same conflicts // do not have to be resolved elsewhere in the network. // // For example, if both the local and remote changesets contain an // INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)": // // local: INSERT INTO t1 VALUES(1, 'v1'); // remote: INSERT INTO t1 VALUES(1, 'v2'); // // and the conflict resolution is REPLACE, then the INSERT change is // removed from the local changeset (it was overridden). Or, if the // conflict resolution was "OMIT", then the local changeset is modified // to instead contain: // // UPDATE t1 SET b = 'v2' WHERE a=1; // // Changes within the local changeset are rebased as follows: // //
//
Local INSERT
// // This may only conflict with a remote INSERT. If the conflict // resolution was OMIT, then add an UPDATE change to the rebased // changeset. Or, if the conflict resolution was REPLACE, add // nothing to the rebased changeset. // //
Local DELETE
// // This may conflict with a remote UPDATE or DELETE. In both cases the // only possible resolution is OMIT. If the remote operation was a // DELETE, then add no change to the rebased changeset. If the remote // operation was an UPDATE, then the old.* fields of change are updated // to reflect the new.* values in the UPDATE. // //
Local UPDATE
// // This may conflict with a remote UPDATE or DELETE. If it conflicts // with a DELETE, and the conflict resolution was OMIT, then the update // is changed into an INSERT. Any undefined values in the new.* record // from the update change are filled in using the old.* values from // the conflicting DELETE. Or, if the conflict resolution was REPLACE, // the UPDATE change is simply omitted from the rebased changeset. // // If conflict is with a remote UPDATE and the resolution is OMIT, then // the old.* values are rebased using the new.* values in the remote // change. Or, if the resolution is REPLACE, then the change is copied // into the rebased changeset with updates to columns also updated by // the conflicting remote UPDATE removed. If this means no columns would // be updated, the change is omitted. // //
// // A local change may be rebased against multiple remote changes // simultaneously. If a single key is modified by multiple remote // changesets, they are combined as follows before the local changeset // is rebased: // // // // Note that conflict resolutions from multiple remote changesets are // combined on a per-field basis, not per-row. This means that in the // case of multiple remote UPDATE operations, some fields of a single // local change may be rebased for REPLACE while others are rebased for // OMIT. // // In order to rebase a local changeset, the remote changeset must first // be applied to the local database using sqlite3changeset_apply_v2() and // the buffer of rebase information captured. Then: // //
    // //
  1. An sqlite3_rebaser object is created by calling // sqlite3rebaser_create(). //
  2. The new object is configured with the rebase buffer obtained from // sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure(). // If the local changeset is to be rebased against multiple remote // changesets, then sqlite3rebaser_configure() should be called // multiple times, in the same order that the multiple // sqlite3changeset_apply_v2() calls were made. //
  3. Each local changeset is rebased by calling sqlite3rebaser_rebase(). //
  4. The sqlite3_rebaser object is deleted by calling // sqlite3rebaser_delete(). // //
type Sqlite3_rebaser = sqlite3_rebaser type Fts5ExtensionApi1 = struct { FiVersion int32 F__ccgo_pad1 [4]byte FxUserData uintptr FxColumnCount uintptr FxRowCount uintptr FxColumnTotalSize uintptr FxTokenize uintptr FxPhraseCount uintptr FxPhraseSize uintptr FxInstCount uintptr FxInst uintptr FxRowid uintptr FxColumnText uintptr FxColumnSize uintptr FxQueryPhrase uintptr FxSetAuxdata uintptr FxGetAuxdata uintptr FxPhraseFirst uintptr FxPhraseNext uintptr FxPhraseFirstColumn uintptr FxPhraseNextColumn uintptr } type Fts5ExtensionApi = Fts5ExtensionApi1 type Fts5PhraseIter1 = struct { Fa uintptr Fb uintptr } type Fts5PhraseIter = Fts5PhraseIter1 type Fts5_extension_function = uintptr type fts5_tokenizer = struct { FxCreate uintptr FxDelete uintptr FxTokenize uintptr } type Fts5_tokenizer = fts5_tokenizer type fts5_api = struct { FiVersion int32 F__ccgo_pad1 [4]byte FxCreateTokenizer uintptr FxFindTokenizer uintptr FxCreateFunction uintptr } // ************************************************************************ // // FTS5 EXTENSION REGISTRATION API type Fts5_api = fts5_api type Ssize_t = int64 type Rsize_t = Size_t type Intptr_t = int64 type Uintptr_t = uint64 type Wint_t = uint16 type Wctype_t = uint16 type Errno_t = int32 type X__time32_t = int32 type X__time64_t = int64 type Time_t = X__time64_t type threadlocaleinfostruct = struct { Frefcount int32 Flc_codepage uint32 Flc_collate_cp uint32 Flc_handle [6]uint32 Flc_id [6]LC_ID Flc_category [6]struct { Flocale uintptr Fwlocale uintptr Frefcount uintptr Fwrefcount uintptr } Flc_clike int32 Fmb_cur_max int32 Flconv_intl_refcount uintptr Flconv_num_refcount uintptr Flconv_mon_refcount uintptr Flconv uintptr Fctype1_refcount uintptr Fctype1 uintptr Fpctype uintptr Fpclmap uintptr Fpcumap uintptr Flc_time_curr uintptr } type Pthreadlocinfo = uintptr type Pthreadmbcinfo = uintptr type localeinfo_struct = struct { Flocinfo Pthreadlocinfo Fmbcinfo Pthreadmbcinfo } type X_locale_tstruct = localeinfo_struct type X_locale_t = uintptr type tagLC_ID = struct { FwLanguage uint16 FwCountry uint16 FwCodePage uint16 } type LC_ID = tagLC_ID type LPLC_ID = uintptr type Threadlocinfo = threadlocaleinfostruct type _SETJMP_FLOAT128 = struct{ FPart [2]uint64 } type SETJMP_FLOAT128 = _SETJMP_FLOAT128 type X_JBTYPE = SETJMP_FLOAT128 type _JUMP_BUFFER = struct { FFrame uint64 FRbx uint64 FRsp uint64 FRbp uint64 FRsi uint64 FRdi uint64 FR12 uint64 FR13 uint64 FR14 uint64 FR15 uint64 FRip uint64 FSpare uint64 FXmm6 SETJMP_FLOAT128 FXmm7 SETJMP_FLOAT128 FXmm8 SETJMP_FLOAT128 FXmm9 SETJMP_FLOAT128 FXmm10 SETJMP_FLOAT128 FXmm11 SETJMP_FLOAT128 FXmm12 SETJMP_FLOAT128 FXmm13 SETJMP_FLOAT128 FXmm14 SETJMP_FLOAT128 FXmm15 SETJMP_FLOAT128 } type X_JUMP_BUFFER = _JUMP_BUFFER type Jmp_buf = [16]X_JBTYPE // Type whose alignment is supported in every context and is at least // // as great as that of any standard type not using alignment // specifiers. type Max_align_t = struct { F__max_align_ll int64 F__max_align_ld float64 } type X_onexit_t = uintptr type _div_t = struct { Fquot int32 Frem int32 } type Div_t = _div_t type _ldiv_t = struct { Fquot int32 Frem int32 } type Ldiv_t = _ldiv_t type X_LDOUBLE = struct{ Fld [10]uint8 } type X_CRT_DOUBLE = struct{ Fx float64 } type X_CRT_FLOAT = struct{ Ff float32 } type X_LONGDOUBLE = struct{ Fx float64 } type X_LDBL12 = struct{ Fld12 [12]uint8 } type X_purecall_handler = uintptr type X_invalid_parameter_handler = uintptr type Lldiv_t = struct { Fquot int64 Frem int64 } type _heapinfo = struct { F_pentry uintptr F_size Size_t F_useflag int32 F__ccgo_pad1 [4]byte } // The structure used to walk through the heap with _heapwalk. type X_HEAPINFO = _heapinfo // The Intel API is flexible enough that we must allow aliasing with other // // vector types, and their scalar components. type X__m64 = [2]int32 // Unaligned version of the same type type X__m64_u = [2]int32 // Internal data types for implementing the intrinsics. type X__v2si = [2]int32 type X__v4hi = [4]int16 type X__v8qi = [8]int8 type X__v1di = [1]int64 type X__v2sf = [2]float32 // The Intel API is flexible enough that we must allow aliasing with other // // vector types, and their scalar components. type X__m128 = [4]float32 // Unaligned version of the same type. type X__m128_u = [4]float32 // Internal data types for implementing the intrinsics. type X__v4sf = [4]float32 // SSE2 type X__v2df = [2]float64 type X__v2di = [2]int64 type X__v2du = [2]uint64 type X__v4si = [4]int32 type X__v4su = [4]uint32 type X__v8hi = [8]int16 type X__v8hu = [8]uint16 type X__v16qi = [16]int8 type X__v16qs = [16]int8 type X__v16qu = [16]uint8 // The Intel API is flexible enough that we must allow aliasing with other // // vector types, and their scalar components. type X__m128i = [2]int64 type X__m128d = [2]float64 // Unaligned version of the same types. type X__m128i_u = [2]int64 type X__m128d_u = [2]float64 // Internal data types for implementing the intrinsics. type X__v4df = [4]float64 type X__v8sf = [8]float32 type X__v4di = [4]int64 type X__v4du = [4]uint64 type X__v8si = [8]int32 type X__v8su = [8]uint32 type X__v16hi = [16]int16 type X__v16hu = [16]uint16 type X__v32qi = [32]int8 type X__v32qs = [32]int8 type X__v32qu = [32]uint8 // The Intel API is flexible enough that we must allow aliasing with other // // vector types, and their scalar components. type X__m256 = [8]float32 type X__m256i = [4]int64 type X__m256d = [4]float64 // Unaligned version of the same types. type X__m256_u = [8]float32 type X__m256i_u = [4]int64 type X__m256d_u = [4]float64 // Internal data types for implementing the intrinsics. type X__v8df = [8]float64 type X__v16sf = [16]float32 type X__v8di = [8]int64 type X__v8du = [8]uint64 type X__v16si = [16]int32 type X__v16su = [16]uint32 type X__v32hi = [32]int16 type X__v32hu = [32]uint16 type X__v64qi = [64]int8 type X__v64qu = [64]uint8 // The Intel API is flexible enough that we must allow aliasing with other // // vector types, and their scalar components. type X__m512 = [16]float32 type X__m512i = [8]int64 type X__m512d = [8]float64 // Unaligned version of the same type. type X__m512_u = [16]float32 type X__m512i_u = [8]int64 type X__m512d_u = [8]float64 type X__mmask8 = uint8 type X__mmask16 = uint16 type X_MM_PERM_ENUM = uint32 // Constants for mantissa extraction type X_MM_MANTISSA_NORM_ENUM = uint32 type X_MM_MANTISSA_SIGN_ENUM = uint32 // Internal data types for implementing the intrinsics. type X__mmask32 = uint32 type X__mmask64 = uint64 // Internal data types for implementing the intrinsics. type X__v16bh = [16]int16 type X__v8bh = [8]int16 // The Intel API is flexible enough that we must allow aliasing with other // // vector types, and their scalar components. type X__m256bh = [16]int16 type X__m128bh = [8]int16 // Internal data types for implementing the intrinsics. type X__v32bh = [32]int16 // The Intel API is flexible enough that we must allow aliasing with other // // vector types, and their scalar components. type X__m512bh = [32]int16 // Forward declarations of structures. type Hash1 = struct { Fhtsize uint32 Fcount uint32 Ffirst uintptr Fht uintptr } // Forward declarations of structures. type Hash = Hash1 type HashElem1 = struct { Fnext uintptr Fprev uintptr Fdata uintptr FpKey uintptr } type HashElem = HashElem1 type _ht = struct { Fcount uint32 F__ccgo_pad1 [4]byte Fchain uintptr } type _iobuf = struct { F_ptr uintptr F_cnt int32 F__ccgo_pad1 [4]byte F_base uintptr F_flag int32 F_file int32 F_charbuf int32 F_bufsiz int32 F_tmpfname uintptr } type FILE = _iobuf type X_off_t = int32 type Off32_t = int32 type X_off64_t = int64 type Off64_t = int64 type Off_t = Off64_t type Fpos_t = int64 func vsnwprintf(tls *libc.TLS, __stream uintptr, __n Size_t, __format uintptr, __local_argv X__builtin_va_list) int32 { return libc.X__mingw_vsnwprintf(tls, __stream, __n, __format, __local_argv) } func vswprintf(tls *libc.TLS, __stream uintptr, __count Size_t, __format uintptr, __local_argv X__builtin_va_list) int32 { return vsnwprintf(tls, __stream, __count, __format, __local_argv) } // Integers of known sizes. These typedefs might change for architectures // where the sizes very. Preprocessor macros are available so that the // types can be conveniently redefined at compile-type. Like this: // // cc '-DUINTPTR_TYPE=long long int' ... type I64 = Sqlite_int64 type U64 = Sqlite_uint64 type U32 = uint32 type U16 = uint16 type I16 = int16 type U8 = uint8 type I8 = int8 // The datatype used to store estimates of the number of rows in a // table or index. type TRowcnt = U64 // Estimated quantities used for query planning are stored as 16-bit // logarithms. For quantity X, the value stored is 10*log2(X). This // gives a possible range of values of approximately 1.0e986 to 1e-986. // But the allowed values are "grainy". Not every value is representable. // For example, quantities 16 and 17 are both represented by a LogEst // of 40. However, since LogEst quantities are suppose to be estimates, // not exact values, this imprecision is not a problem. // // "LogEst" is short for "Logarithmic Estimate". // // Examples: // // 1 -> 0 20 -> 43 10000 -> 132 // 2 -> 10 25 -> 46 25000 -> 146 // 3 -> 16 100 -> 66 1000000 -> 199 // 4 -> 20 1000 -> 99 1048576 -> 200 // 10 -> 33 1024 -> 100 4294967296 -> 320 // // The LogEst can be negative to indicate fractional values. // Examples: // // 0.5 -> -10 0.1 -> -33 0.0625 -> -40 type LogEst = int16 // The uptr type is an unsigned integer large enough to hold a pointer type Uptr = U64 // An instance of the following structure is used to store the busy-handler // callback for a given sqlite handle. // // The sqlite.busyHandler member of the sqlite struct contains the busy // callback for the database handle. Each pager opened via the sqlite // handle is passed a pointer to sqlite.busyHandler. The busy-handler // callback is currently invoked only from within pager.c. type BusyHandler1 = struct { FxBusyHandler uintptr FpBusyArg uintptr FnBusy int32 F__ccgo_pad1 [4]byte } // An instance of the following structure is used to store the busy-handler // callback for a given sqlite handle. // // The sqlite.busyHandler member of the sqlite struct contains the busy // callback for the database handle. Each pager opened via the sqlite // handle is passed a pointer to sqlite.busyHandler. The busy-handler // callback is currently invoked only from within pager.c. type BusyHandler = BusyHandler1 // Forward references to structures type AggInfo1 = struct { FdirectMode U8 FuseSortingIdx U8 FnSortingColumn U16 FsortingIdx int32 FsortingIdxPTab int32 FiFirstReg int32 FpGroupBy uintptr FaCol uintptr FnColumn int32 FnAccumulator int32 FaFunc uintptr FnFunc int32 FselId U32 } // Forward references to structures type AggInfo = AggInfo1 type AuthContext1 = struct { FzAuthContext uintptr FpParse uintptr } type AuthContext = AuthContext1 type AutoincInfo1 = struct { FpNext uintptr FpTab uintptr FiDb int32 FregCtr int32 } type AutoincInfo = AutoincInfo1 type Bitvec1 = struct { FiSize U32 FnSet U32 FiDivisor U32 F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FaBitmap [496]U8 } } type Bitvec = Bitvec1 type CollSeq1 = struct { FzName uintptr Fenc U8 F__ccgo_pad1 [7]byte FpUser uintptr FxCmp uintptr FxDel uintptr } type CollSeq = CollSeq1 type Column1 = struct { FzCnName uintptr FnotNull uint8 F__ccgo_pad1 [1]byte Faffinity int8 FszEst U8 FhName U8 F__ccgo_pad2 [1]byte FiDflt U16 FcolFlags U16 F__ccgo_pad3 [6]byte } type Column = Column1 type Cte1 = struct { FzName uintptr FpCols uintptr FpSelect uintptr FzCteErr uintptr FpUse uintptr FeM10d U8 F__ccgo_pad1 [7]byte } type Cte = Cte1 type CteUse1 = struct { FnUse int32 FaddrM9e int32 FregRtn int32 FiCur int32 FnRowEst LogEst FeM10d U8 F__ccgo_pad1 [1]byte } type CteUse = CteUse1 type Db1 = struct { FzDbSName uintptr FpBt uintptr Fsafety_level U8 FbSyncSet U8 F__ccgo_pad1 [6]byte FpSchema uintptr } type Db = Db1 type DbFixer1 = struct { FpParse uintptr Fw Walker FpSchema uintptr FbTemp U8 F__ccgo_pad1 [7]byte FzDb uintptr FzType uintptr FpName uintptr } type DbFixer = DbFixer1 type Schema1 = struct { Fschema_cookie int32 FiGeneration int32 FtblHash Hash FidxHash Hash FtrigHash Hash FfkeyHash Hash FpSeqTab uintptr Ffile_format U8 Fenc U8 FschemaFlags U16 Fcache_size int32 } type Schema = Schema1 type Expr1 = struct { Fop U8 FaffExpr int8 Fop2 U8 F__ccgo_pad1 [1]byte Fflags U32 Fu struct{ FzToken uintptr } FpLeft uintptr FpRight uintptr Fx struct{ FpList uintptr } FnHeight int32 FiTable int32 FiColumn YnVar FiAgg I16 Fw struct{ FiJoin int32 } FpAggInfo uintptr Fy struct{ FpTab uintptr } } type Expr = Expr1 type ExprList1 = struct { FnExpr int32 FnAlloc int32 Fa [1]struct { FpExpr uintptr FzEName uintptr Ffg struct { F__ccgo_pad1 [0]uint32 FsortFlags U8 F__ccgo_pad2 [3]byte FeEName uint16 F__ccgo_pad3 [2]byte } Fu struct { F__ccgo_pad1 [0]uint32 Fx struct { FiOrderByCol U16 FiAlias U16 } } F__ccgo_pad1 [4]byte } } type ExprList = ExprList1 type FKey1 = struct { FpFrom uintptr FpNextFrom uintptr FzTo uintptr FpNextTo uintptr FpPrevTo uintptr FnCol int32 FisDeferred U8 FaAction [2]U8 F__ccgo_pad1 [1]byte FapTrigger [2]uintptr FaCol [1]struct { FiFrom int32 F__ccgo_pad1 [4]byte FzCol uintptr } } type FKey = FKey1 type FuncDestructor1 = struct { FnRef int32 F__ccgo_pad1 [4]byte FxDestroy uintptr FpUserData uintptr } type FuncDestructor = FuncDestructor1 type FuncDef1 = struct { FnArg I8 F__ccgo_pad1 [3]byte FfuncFlags U32 FpUserData uintptr FpNext uintptr FxSFunc uintptr FxFinalize uintptr FxValue uintptr FxInverse uintptr FzName uintptr Fu struct{ FpHash uintptr } } type FuncDef = FuncDef1 type FuncDefHash1 = struct{ Fa [23]uintptr } type FuncDefHash = FuncDefHash1 type IdList1 = struct { FnId int32 FeU4 U8 F__ccgo_pad1 [3]byte Fa [1]struct { FzName uintptr Fu4 struct { F__ccgo_pad1 [0]uint64 Fidx int32 F__ccgo_pad2 [4]byte } } } type IdList = IdList1 type Index1 = struct { FzName uintptr FaiColumn uintptr FaiRowLogEst uintptr FpTable uintptr FzColAff uintptr FpNext uintptr FpSchema uintptr FaSortOrder uintptr FazColl uintptr FpPartIdxWhere uintptr FaColExpr uintptr Ftnum Pgno FszIdxRow LogEst FnKeyCol U16 FnColumn U16 FonError U8 F__ccgo_pad1 [1]byte FidxType uint16 F__ccgo_pad2 [2]byte FnSample int32 FnSampleCol int32 FaAvgEq uintptr FaSample uintptr FaiRowEst uintptr FnRowEst0 TRowcnt FcolNotIdxed Bitmask } type Index = Index1 type IndexedExpr1 = struct { FpExpr uintptr FiDataCur int32 FiIdxCur int32 FiIdxCol int32 FbMaybeNullRow U8 Faff U8 F__ccgo_pad1 [2]byte FpIENext uintptr } type IndexedExpr = IndexedExpr1 type IndexSample1 = struct { Fp uintptr Fn int32 F__ccgo_pad1 [4]byte FanEq uintptr FanLt uintptr FanDLt uintptr } type IndexSample = IndexSample1 type KeyInfo1 = struct { FnRef U32 Fenc U8 F__ccgo_pad1 [1]byte FnKeyField U16 FnAllField U16 F__ccgo_pad2 [6]byte Fdb uintptr FaSortFlags uintptr FaColl [1]uintptr } type KeyInfo = KeyInfo1 type Lookaside1 = struct { FbDisable U32 Fsz U16 FszTrue U16 FbMalloced U8 F__ccgo_pad1 [3]byte FnSlot U32 FanStat [3]U32 F__ccgo_pad2 [4]byte FpInit uintptr FpFree uintptr FpSmallInit uintptr FpSmallFree uintptr FpMiddle uintptr FpStart uintptr FpEnd uintptr FpTrueEnd uintptr } type Lookaside = Lookaside1 type LookasideSlot1 = struct{ FpNext uintptr } type LookasideSlot = LookasideSlot1 type Module1 = struct { FpModule uintptr FzName uintptr FnRefModule int32 F__ccgo_pad1 [4]byte FpAux uintptr FxDestroy uintptr FpEpoTab uintptr } type Module = Module1 type NameContext1 = struct { FpParse uintptr FpSrcList uintptr FuNC struct{ FpEList uintptr } FpNext uintptr FnRef int32 FnNcErr int32 FncFlags int32 F__ccgo_pad1 [4]byte FpWinSelect uintptr } type NameContext = NameContext1 type OnOrUsing1 = struct { FpOn uintptr FpUsing uintptr } type OnOrUsing = OnOrUsing1 type Parse1 = struct { Fdb uintptr FzErrMsg uintptr FpVdbe uintptr Frc int32 FcolNamesSet U8 FcheckSchema U8 Fnested U8 FnTempReg U8 FisMultiWrite U8 FmayAbort U8 FhasCompound U8 FokConstFactor U8 FdisableLookaside U8 FprepFlags U8 FwithinRJSubrtn U8 F__ccgo_pad1 [1]byte FnRangeReg int32 FiRangeReg int32 FnErr int32 FnTab int32 FnMem int32 FszOpAlloc int32 FiSelfTab int32 FnLabel int32 FnLabelAlloc int32 F__ccgo_pad2 [4]byte FaLabel uintptr FpConstExpr uintptr FpIdxEpr uintptr FconstraintName Token FwriteMask YDbMask FcookieMask YDbMask FregRowid int32 FregRoot int32 FnMaxArg int32 FnSelect int32 FnTableLock int32 F__ccgo_pad3 [4]byte FaTableLock uintptr FpAinc uintptr FpToplevel uintptr FpTriggerTab uintptr FpTriggerPrg uintptr FpCleanup uintptr Fu1 struct { F__ccgo_pad1 [0]uint64 FaddrCrTab int32 F__ccgo_pad2 [4]byte } FnQueryLoop U32 Foldmask U32 Fnewmask U32 FnProgressSteps U32 FeTriggerOp U8 FbReturning U8 FeOrconf U8 FdisableTriggers U8 FaTempReg [8]int32 F__ccgo_pad4 [4]byte FpOuterParse uintptr FsNameToken Token FsLastToken Token FnVar YnVar FiPkSortOrder U8 Fexplain U8 FeParseMode U8 F__ccgo_pad5 [3]byte FnVtabLock int32 FnHeight int32 FaddrExplain int32 F__ccgo_pad6 [4]byte FpVList uintptr FpReprepare uintptr FzTail uintptr FpNewTable uintptr FpNewIndex uintptr FpNewTrigger uintptr FzAuthContext uintptr FsArg Token FapVtabLock uintptr FpWith uintptr FpRename uintptr } type Parse = Parse1 type ParseCleanup1 = struct { FpNext uintptr FpPtr uintptr FxCleanup uintptr } type ParseCleanup = ParseCleanup1 type PreUpdate1 = struct { Fv uintptr FpCsr uintptr Fop int32 F__ccgo_pad1 [4]byte FaRecord uintptr Fkeyinfo KeyInfo FpUnpacked uintptr FpNewUnpacked uintptr FiNewReg int32 FiBlobWrite int32 FiKey1 I64 FiKey2 I64 FaNew uintptr FpTab uintptr FpPk uintptr } type PreUpdate = PreUpdate1 type PrintfArguments1 = struct { FnArg int32 FnUsed int32 FapArg uintptr } type PrintfArguments = PrintfArguments1 type RenameToken1 = struct { Fp uintptr Ft Token FpNext uintptr } type RenameToken = RenameToken1 type Returning1 = struct { FpParse uintptr FpReturnEL uintptr FretTrig Trigger FretTStep TriggerStep FiRetCur int32 FnRetCol int32 FiRetReg int32 F__ccgo_pad1 [4]byte } type Returning = Returning1 type RowSet1 = struct { FpChunk uintptr Fdb uintptr FpEntry uintptr FpLast uintptr FpFresh uintptr FpForest uintptr FnFresh U16 FrsFlags U16 FiBatch int32 } type RowSet = RowSet1 type Savepoint1 = struct { FzName uintptr FnDeferredCons I64 FnDeferredImmCons I64 FpNext uintptr } type Savepoint = Savepoint1 type Select1 = struct { Fop U8 F__ccgo_pad1 [1]byte FnSelectRow LogEst FselFlags U32 FiLimit int32 FiOffset int32 FselId U32 FaddrOpenEphm [2]int32 F__ccgo_pad2 [4]byte FpEList uintptr FpSrc uintptr FpWhere uintptr FpGroupBy uintptr FpHaving uintptr FpOrderBy uintptr FpPrior uintptr FpNext uintptr FpLimit uintptr FpWith uintptr FpWin uintptr FpWinDefn uintptr } type Select = Select1 type SQLiteThread1 = struct { Ftid uintptr Fid uint32 F__ccgo_pad1 [4]byte FxTask uintptr FpIn uintptr FpResult uintptr } type SQLiteThread = SQLiteThread1 type SelectDest1 = struct { FeDest U8 F__ccgo_pad1 [3]byte FiSDParm int32 FiSDParm2 int32 FiSdst int32 FnSdst int32 F__ccgo_pad2 [4]byte FzAffSdst uintptr FpOrderBy uintptr } type SelectDest = SelectDest1 type SrcItem1 = struct { FpSchema uintptr FzDatabase uintptr FzName uintptr FzAlias uintptr FpTab uintptr FpSelect uintptr FaddrFillSub int32 FregReturn int32 FregResult int32 Ffg struct { F__ccgo_pad1 [0]uint32 Fjointype U8 F__ccgo_pad2 [3]byte FnotIndexed uint16 F__ccgo_pad3 [2]byte } FiCursor int32 Fu3 struct{ FpOn uintptr } FcolUsed Bitmask Fu1 struct{ FzIndexedBy uintptr } Fu2 struct{ FpIBIndex uintptr } } type SrcItem = SrcItem1 type SrcList1 = struct { FnSrc int32 FnAlloc U32 Fa [1]SrcItem } type SrcList = SrcList1 type StrAccum = sqlite3_str type Table1 = struct { FzName uintptr FaCol uintptr FpIndex uintptr FzColAff uintptr FpCheck uintptr Ftnum Pgno FnTabRef U32 FtabFlags U32 FiPKey I16 FnCol I16 FnNVCol I16 FnRowLogEst LogEst FszTabRow LogEst FkeyConf U8 FeTabType U8 Fu struct { Ftab struct { FaddColOffset int32 F__ccgo_pad1 [4]byte FpFKey uintptr FpDfltList uintptr } } FpTrigger uintptr FpSchema uintptr } // Internal alias for sqlite3_str type Table = Table1 type TableLock1 = struct { FiDb int32 FiTab Pgno FisWriteLock U8 F__ccgo_pad1 [7]byte FzLockName uintptr } type TableLock = TableLock1 type Token1 = struct { Fz uintptr Fn uint32 F__ccgo_pad1 [4]byte } type Token = Token1 type Trigger1 = struct { FzName uintptr Ftable uintptr Fop U8 Ftr_tm U8 FbReturning U8 F__ccgo_pad1 [5]byte FpWhen uintptr FpColumns uintptr FpSchema uintptr FpTabSchema uintptr Fstep_list uintptr FpNext uintptr } type Trigger = Trigger1 type TriggerPrg1 = struct { FpTrigger uintptr FpNext uintptr FpProgram uintptr Forconf int32 FaColmask [2]U32 F__ccgo_pad1 [4]byte } type TriggerPrg = TriggerPrg1 type TriggerStep1 = struct { Fop U8 Forconf U8 F__ccgo_pad1 [6]byte FpTrig uintptr FpSelect uintptr FzTarget uintptr FpFrom uintptr FpWhere uintptr FpExprList uintptr FpIdList uintptr FpUpsert uintptr FzSpan uintptr FpNext uintptr FpLast uintptr } type TriggerStep = TriggerStep1 type UnpackedRecord1 = struct { FpKeyInfo uintptr FaMem uintptr Fu struct{ Fz uintptr } Fn int32 FnField U16 Fdefault_rc I8 FerrCode U8 Fr1 I8 Fr2 I8 FeqSeen U8 F__ccgo_pad1 [5]byte } type UnpackedRecord = UnpackedRecord1 type Upsert1 = struct { FpUpsertTarget uintptr FpUpsertTargetWhere uintptr FpUpsertSet uintptr FpUpsertWhere uintptr FpNextUpsert uintptr FisDoUpdate U8 F__ccgo_pad1 [7]byte FpToFree uintptr FpUpsertIdx uintptr FpUpsertSrc uintptr FregData int32 FiDataCur int32 FiIdxCur int32 F__ccgo_pad2 [4]byte } type Upsert = Upsert1 type VTable1 = struct { Fdb uintptr FpMod uintptr FpVtab uintptr FnRef int32 FbConstraint U8 FeVtabRisk U8 F__ccgo_pad1 [2]byte FiSavepoint int32 F__ccgo_pad2 [4]byte FpNext uintptr } type VTable = VTable1 type VtabCtx1 = struct { FpVTable uintptr FpTab uintptr FpPrior uintptr FbDeclared int32 F__ccgo_pad1 [4]byte } type VtabCtx = VtabCtx1 type Walker1 = struct { FpParse uintptr FxExprCallback uintptr FxSelectCallback uintptr FxSelectCallback2 uintptr FwalkerDepth int32 FeCode U16 F__ccgo_pad1 [2]byte Fu struct{ FpNC uintptr } } type Walker = Walker1 type WhereInfo1 = struct { FpParse uintptr FpTabList uintptr FpOrderBy uintptr FpResultSet uintptr FpSelect uintptr FaiCurOnePass [2]int32 FiContinue int32 FiBreak int32 FsavedNQueryLoop int32 FwctrlFlags U16 FiLimit LogEst FnLevel U8 FnOBSat I8 FeOnePass U8 FeDistinct U8 FbDeferredSeek uint8 F__ccgo_pad1 [1]byte FnRowOut LogEst FiTop int32 FiEndWhere int32 FpLoops uintptr FpMemToFree uintptr FrevMask Bitmask FsWC WhereClause FsMaskSet WhereMaskSet Fa [1]WhereLevel } type WhereInfo = WhereInfo1 type Window1 = struct { FzName uintptr FzBase uintptr FpPartition uintptr FpOrderBy uintptr FeFrmType U8 FeStart U8 FeEnd U8 FbImplicitFrame U8 FeExclude U8 F__ccgo_pad1 [3]byte FpStart uintptr FpEnd uintptr FppThis uintptr FpNextWin uintptr FpFilter uintptr FpWFunc uintptr FiEphCsr int32 FregAccum int32 FregResult int32 FcsrApp int32 FregApp int32 FregPart int32 FpOwner uintptr FnBufferCol int32 FiArgCol int32 FregOne int32 FregStartRowid int32 FregEndRowid int32 FbExprArgs U8 F__ccgo_pad2 [3]byte } type Window = Window1 type With1 = struct { FnCte int32 FbView int32 FpOuter uintptr Fa [1]Cte } type With = With1 // The bitmask datatype defined below is used for various optimizations. // // Changing this from a 64-bit to a 32-bit type limits the number of // tables in a join to 32 instead of 64. But it also reduces the size // of the library by 738 bytes on ix86. type Bitmask = U64 // A VList object records a mapping between parameters/variables/wildcards // in the SQL statement (such as $abc, @pqr, or :xyz) and the integer // variable number associated with that parameter. See the format description // on the sqlite3VListAdd() routine for more information. A VList is really // just an array of integers. type VList = int32 // The type used to represent a page number. The first page in a file // is called page 1. 0 is used to represent "not a page". type Pgno = U32 // Each open file is managed by a separate instance of the "Pager" structure. type Pager1 = struct { FpVfs uintptr FexclusiveMode U8 FjournalMode U8 FuseJournal U8 FnoSync U8 FfullSync U8 FextraSync U8 FsyncFlags U8 FwalSyncFlags U8 FtempFile U8 FnoLock U8 FreadOnly U8 FmemDb U8 FmemVfs U8 FeState U8 FeLock U8 FchangeCountDone U8 FsetSuper U8 FdoNotSpill U8 FsubjInMemory U8 FbUseFetch U8 FhasHeldSharedLock U8 F__ccgo_pad1 [3]byte FdbSize Pgno FdbOrigSize Pgno FdbFileSize Pgno FdbHintSize Pgno FerrCode int32 FnRec int32 FcksumInit U32 FnSubRec U32 FpInJournal uintptr Ffd uintptr Fjfd uintptr Fsjfd uintptr FjournalOff I64 FjournalHdr I64 FpBackup uintptr FaSavepoint uintptr FnSavepoint int32 FiDataVersion U32 FdbFileVers [16]int8 FnMmapOut int32 F__ccgo_pad2 [4]byte FszMmap Sqlite3_int64 FpMmapFreelist uintptr FnExtra U16 FnReserve I16 FvfsFlags U32 FsectorSize U32 FmxPgno Pgno FlckPgno Pgno F__ccgo_pad3 [4]byte FpageSize I64 FjournalSizeLimit I64 FzFilename uintptr FzJournal uintptr FxBusyHandler uintptr FpBusyHandlerArg uintptr FaStat [4]int32 FxReiniter uintptr FxGet uintptr FpTmpSpace uintptr FpPCache uintptr FpWal uintptr FzWal uintptr } // Each open file is managed by a separate instance of the "Pager" structure. type Pager = Pager1 // Handle type for pages. type PgHdr2 = struct { FpPage uintptr FpData uintptr FpExtra uintptr FpCache uintptr FpDirty uintptr FpPager uintptr Fpgno Pgno Fflags U16 F__ccgo_pad1 [2]byte FnRef I64 FpDirtyNext uintptr FpDirtyPrev uintptr } // Handle type for pages. type DbPage = PgHdr2 // Forward declarations of structure type Btree1 = struct { Fdb uintptr FpBt uintptr FinTrans U8 Fsharable U8 Flocked U8 FhasIncrblobCur U8 FwantToLock int32 FnBackup int32 FiBDataVersion U32 FpNext uintptr FpPrev uintptr Flock BtLock } // Forward declarations of structure type Btree = Btree1 type BtCursor1 = struct { FeState U8 FcurFlags U8 FcurPagerFlags U8 Fhints U8 FskipNext int32 FpBtree uintptr FaOverflow uintptr FpKey uintptr FpBt uintptr FpNext uintptr Finfo CellInfo FnKey I64 FpgnoRoot Pgno FiPage I8 FcurIntKey U8 Fix U16 FaiIdx [19]U16 F__ccgo_pad1 [2]byte FpKeyInfo uintptr FpPage uintptr FapPage [19]uintptr } type BtCursor = BtCursor1 type BtShared1 = struct { FpPager uintptr Fdb uintptr FpCursor uintptr FpPage1 uintptr FopenFlags U8 FautoVacuum U8 FincrVacuum U8 FbDoTruncate U8 FinTransaction U8 Fmax1bytePayload U8 FnReserveWanted U8 F__ccgo_pad1 [1]byte FbtsFlags U16 FmaxLocal U16 FminLocal U16 FmaxLeaf U16 FminLeaf U16 F__ccgo_pad2 [2]byte FpageSize U32 FusableSize U32 FnTransaction int32 FnPage U32 F__ccgo_pad3 [4]byte FpSchema uintptr FxFreeSchema uintptr Fmutex uintptr FpHasContent uintptr FnRef int32 F__ccgo_pad4 [4]byte FpNext uintptr FpLock uintptr FpWriter uintptr FpTmpSpace uintptr FnPreformatSize int32 F__ccgo_pad5 [4]byte } type BtShared = BtShared1 type BtreePayload1 = struct { FpKey uintptr FnKey Sqlite3_int64 FpData uintptr FaMem uintptr FnMem U16 F__ccgo_pad1 [2]byte FnData int32 FnZero int32 F__ccgo_pad2 [4]byte } type BtreePayload = BtreePayload1 // A single VDBE is an opaque structure named "Vdbe". Only routines // in the source file sqliteVdbe.c are allowed to see the insides // of this structure. type Vdbe1 = struct { Fdb uintptr FppVPrev uintptr FpVNext uintptr FpParse uintptr FnVar YnVar F__ccgo_pad1 [2]byte FnMem int32 FnCursor int32 FcacheCtr U32 Fpc int32 Frc int32 FnChange I64 FiStatement int32 F__ccgo_pad2 [4]byte FiCurrentTime I64 FnFkConstraint I64 FnStmtDefCons I64 FnStmtDefImmCons I64 FaMem uintptr FapArg uintptr FapCsr uintptr FaVar uintptr FaOp uintptr FnOp int32 FnOpAlloc int32 FaColName uintptr FpResultRow uintptr FzErrMsg uintptr FpVList uintptr FstartTime I64 FnResColumn U16 FerrorAction U8 FminWriteFileFormat U8 FprepFlags U8 FeVdbeState U8 F__ccgo_pad3 [2]byte Fexpired uint8 F__ccgo_pad4 [3]byte FbtreeMask YDbMask FlockMask YDbMask FaCounter [9]U32 FzSql uintptr FpFree uintptr FpFrame uintptr FpDelFrame uintptr FnFrame int32 Fexpmask U32 FpProgram uintptr FpAuxData uintptr } // A single VDBE is an opaque structure named "Vdbe". Only routines // in the source file sqliteVdbe.c are allowed to see the insides // of this structure. type Vdbe = Vdbe1 // The names of the following types declared in vdbeInt.h are required // for the VdbeOp definition. type Mem = sqlite3_value type SubProgram1 = struct { FaOp uintptr FnOp int32 FnMem int32 FnCsr int32 F__ccgo_pad1 [4]byte FaOnce uintptr Ftoken uintptr FpNext uintptr } type SubProgram = SubProgram1 // A single instruction of the virtual machine has an opcode // and as many as three operands. The instruction is recorded // as an instance of the following structure: type VdbeOp1 = struct { Fopcode U8 Fp4type int8 Fp5 U16 Fp1 int32 Fp2 int32 Fp3 int32 Fp4 struct { F__ccgo_pad1 [0]uint64 Fi int32 F__ccgo_pad2 [4]byte } } type p4union = struct { F__ccgo_pad1 [0]uint64 Fi int32 F__ccgo_pad2 [4]byte } type VdbeOp = VdbeOp1 // A smaller version of VdbeOp used for the VdbeAddOpList() function because // it takes up less space. type VdbeOpList1 = struct { Fopcode U8 Fp1 int8 Fp2 int8 Fp3 int8 } type VdbeOpList = VdbeOpList1 type RecordCompare = uintptr type PgHdr = PgHdr2 type PCache2 = struct { FpDirty uintptr FpDirtyTail uintptr FpSynced uintptr FnRefSum I64 FszCache int32 FszSpill int32 FszPage int32 FszExtra int32 FbPurgeable U8 FeCreate U8 F__ccgo_pad1 [6]byte FxStress uintptr FpStress uintptr FpCache uintptr } type PCache = PCache2 // typedef for the authorization callback function. type Sqlite3_xauth = uintptr type sqlite3InitInfo = struct { FnewTnum Pgno FiDb U8 Fbusy U8 F__ccgo_pad1 [2]byte ForphanTrigger uint8 F__ccgo_pad2 [7]byte FazInit uintptr } type sColMap = struct { FiFrom int32 F__ccgo_pad1 [4]byte FzCol uintptr } // An instance of this structure contains information needed to generate // code for a SELECT that contains aggregate functions. // // If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a // pointer to this structure. The Expr.iAgg field is the index in // AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate // code for that node. // // AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the // original Select structure that describes the SELECT statement. These // fields do not need to be freed when deallocating the AggInfo structure. type AggInfo_col = struct { FpTab uintptr FpCExpr uintptr FiTable int32 FiColumn I16 FiSorterColumn I16 } // An instance of this structure contains information needed to generate // code for a SELECT that contains aggregate functions. // // If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a // pointer to this structure. The Expr.iAgg field is the index in // AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate // code for that node. // // AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the // original Select structure that describes the SELECT statement. These // fields do not need to be freed when deallocating the AggInfo structure. type AggInfo_func = struct { FpFExpr uintptr FpFunc uintptr FiDistinct int32 FiDistAddr int32 } // The datatype ynVar is a signed integer, either 16-bit or 32-bit. // Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater // than 32767 we have to make it 32-bit. 16-bit is preferred because // it uses less memory in the Expr object, which is a big memory user // in systems with lots of prepared statements. And few applications // need more than about 10 or 20 variables. But some extreme users want // to have prepared statements with over 32766 variables, and for them // the option is available (at compile-time). type YnVar = I16 // A list of expressions. Each expression may optionally have a // name. An expr/name combination can be used in several ways, such // as the list of "expr AS ID" fields following a "SELECT" or in the // list of "ID = expr" items in an UPDATE. A list of expressions can // also be used as the argument to a function, in which case the a.zName // field is not used. // // In order to try to keep memory usage down, the Expr.a.zEName field // is used for multiple purposes: // // eEName Usage // ---------- ------------------------- // ENAME_NAME (1) the AS of result set column // (2) COLUMN= of an UPDATE // // ENAME_TAB DB.TABLE.NAME used to resolve names // of subqueries // // ENAME_SPAN Text of the original result set // expression. type ExprList_item = struct { FpExpr uintptr FzEName uintptr Ffg struct { F__ccgo_pad1 [0]uint32 FsortFlags U8 F__ccgo_pad2 [3]byte FeEName uint16 F__ccgo_pad3 [2]byte } Fu struct { F__ccgo_pad1 [0]uint32 Fx struct { FiOrderByCol U16 FiAlias U16 } } F__ccgo_pad1 [4]byte } // An instance of this structure can hold a simple list of identifiers, // such as the list "a,b,c" in the following statements: // // INSERT INTO t(a,b,c) VALUES ...; // CREATE INDEX idx ON t(a,b,c); // CREATE TRIGGER trig BEFORE UPDATE ON t(a,b,c) ...; // // The IdList.a.idx field is used when the IdList represents the list of // column names after a table name in an INSERT statement. In the statement // // INSERT INTO t(a,b,c) ... // // If "a" is the k-th column of table "t", then IdList.a[0].idx==k. type IdList_item = struct { FzName uintptr Fu4 struct { F__ccgo_pad1 [0]uint64 Fidx int32 F__ccgo_pad2 [4]byte } } // The yDbMask datatype for the bitmask of all attached databases. type YDbMask = uint32 // A pointer to this structure is used to communicate information // from sqlite3Init and OP_ParseSchema into the sqlite3InitCallback. type InitData = struct { Fdb uintptr FpzErrMsg uintptr FiDb int32 Frc int32 FmInitFlags U32 FnInitRow U32 FmxPage Pgno F__ccgo_pad1 [4]byte } // Structure containing global configuration data for the SQLite library. // // This structure also contains some state information. type Sqlite3Config = struct { FbMemstat int32 FbCoreMutex U8 FbFullMutex U8 FbOpenUri U8 FbUseCis U8 FbSmallMalloc U8 FbExtraSchemaChecks U8 F__ccgo_pad1 [2]byte FmxStrlen int32 FneverCorrupt int32 FszLookaside int32 FnLookaside int32 FnStmtSpill int32 Fm Sqlite3_mem_methods Fmutex Sqlite3_mutex_methods Fpcache2 Sqlite3_pcache_methods2 FpHeap uintptr FnHeap int32 FmnReq int32 FmxReq int32 F__ccgo_pad2 [4]byte FszMmap Sqlite3_int64 FmxMmap Sqlite3_int64 FpPage uintptr FszPage int32 FnPage int32 FmxParserStack int32 FsharedCacheEnabled int32 FszPma U32 FisInit int32 FinProgress int32 FisMutexInit int32 FisMallocInit int32 FisPCacheInit int32 FnRefInitMutex int32 F__ccgo_pad3 [4]byte FpInitMutex uintptr FxLog uintptr FpLogArg uintptr FmxMemdbSize Sqlite3_int64 FxTestCallback uintptr FbLocaltimeFault int32 F__ccgo_pad4 [4]byte FxAltLocaltime uintptr FiOnceResetThreshold int32 FszSorterRef U32 FiPrngSeed uint32 F__ccgo_pad5 [4]byte } // Context pointer passed down through the tree-walk. type RefSrcList = struct { Fdb uintptr FpRef uintptr FnExclude I64 FaiExclude uintptr } // Context pointer passed down through the tree-walk. type IdxCover = struct { FpIdx uintptr FiCur int32 F__ccgo_pad1 [4]byte } // Context pointer passed down through the tree-walk. type WindowRewrite1 = struct { FpWin uintptr FpSrc uintptr FpSub uintptr FpTab uintptr FpSubSelect uintptr } // Context pointer passed down through the tree-walk. type WhereConst1 = struct { FpParse uintptr FpOomFault uintptr FnConst int32 FnChng int32 FbHasAffBlob int32 FmExcludeOn U32 FapExpr uintptr } // Context pointer passed down through the tree-walk. type RenameCtx1 = struct { FpList uintptr FnList int32 FiCol int32 FpTab uintptr FzOld uintptr } // Context pointer passed down through the tree-walk. type CoveringIndexCheck1 = struct { FpIdx uintptr FiTabCur int32 FbExpr U8 FbUnidx U8 F__ccgo_pad1 [2]byte } var sqlite3azCompileOpt = [52]uintptr{ ts + 7, ts + 27, ts + 46, ts + 65, ts + 90, ts + 112, ts + 142, ts + 162, ts + 182, ts + 205, ts + 230, ts + 257, ts + 282, ts + 304, ts + 336, ts + 362, ts + 387, ts + 410, ts + 422, ts + 437, ts + 459, ts + 484, ts + 507, ts + 529, ts + 540, ts + 553, ts + 568, ts + 584, ts + 597, ts + 618, ts + 642, ts + 665, ts + 681, ts + 697, ts + 721, ts + 748, ts + 768, ts + 789, ts + 811, ts + 841, ts + 866, ts + 892, ts + 912, ts + 938, ts + 961, ts + 987, ts + 1009, ts + 1030, ts + 1041, ts + 1049, ts + 1063, ts + 1076, } func Xsqlite3CompileOptions(tls *libc.TLS, pnOpt uintptr) uintptr { *(*int32)(unsafe.Pointer(pnOpt)) = int32(uint64(unsafe.Sizeof(sqlite3azCompileOpt)) / uint64(unsafe.Sizeof(uintptr(0)))) return uintptr(unsafe.Pointer(&sqlite3azCompileOpt)) } // An array to map all upper-case characters into their corresponding // lower-case character. // // SQLite only considers US-ASCII (or EBCDIC) characters. We do not // handle case conversions for the UTF character set since the tables // involved are nearly as big or bigger than SQLite itself. var Xsqlite3UpperToLower = [274]uint8{ uint8(0), uint8(1), uint8(2), uint8(3), uint8(4), uint8(5), uint8(6), uint8(7), uint8(8), uint8(9), uint8(10), uint8(11), uint8(12), uint8(13), uint8(14), uint8(15), uint8(16), uint8(17), uint8(18), uint8(19), uint8(20), uint8(21), uint8(22), uint8(23), uint8(24), uint8(25), uint8(26), uint8(27), uint8(28), uint8(29), uint8(30), uint8(31), uint8(32), uint8(33), uint8(34), uint8(35), uint8(36), uint8(37), uint8(38), uint8(39), uint8(40), uint8(41), uint8(42), uint8(43), uint8(44), uint8(45), uint8(46), uint8(47), uint8(48), uint8(49), uint8(50), uint8(51), uint8(52), uint8(53), uint8(54), uint8(55), uint8(56), uint8(57), uint8(58), uint8(59), uint8(60), uint8(61), uint8(62), uint8(63), uint8(64), uint8(97), uint8(98), uint8(99), uint8(100), uint8(101), uint8(102), uint8(103), uint8(104), uint8(105), uint8(106), uint8(107), uint8(108), uint8(109), uint8(110), uint8(111), uint8(112), uint8(113), uint8(114), uint8(115), uint8(116), uint8(117), uint8(118), uint8(119), uint8(120), uint8(121), uint8(122), uint8(91), uint8(92), uint8(93), uint8(94), uint8(95), uint8(96), uint8(97), uint8(98), uint8(99), uint8(100), uint8(101), uint8(102), uint8(103), uint8(104), uint8(105), uint8(106), uint8(107), uint8(108), uint8(109), uint8(110), uint8(111), uint8(112), uint8(113), uint8(114), uint8(115), uint8(116), uint8(117), uint8(118), uint8(119), uint8(120), uint8(121), uint8(122), uint8(123), uint8(124), uint8(125), uint8(126), uint8(127), uint8(128), uint8(129), uint8(130), uint8(131), uint8(132), uint8(133), uint8(134), uint8(135), uint8(136), uint8(137), uint8(138), uint8(139), uint8(140), uint8(141), uint8(142), uint8(143), uint8(144), uint8(145), uint8(146), uint8(147), uint8(148), uint8(149), uint8(150), uint8(151), uint8(152), uint8(153), uint8(154), uint8(155), uint8(156), uint8(157), uint8(158), uint8(159), uint8(160), uint8(161), uint8(162), uint8(163), uint8(164), uint8(165), uint8(166), uint8(167), uint8(168), uint8(169), uint8(170), uint8(171), uint8(172), uint8(173), uint8(174), uint8(175), uint8(176), uint8(177), uint8(178), uint8(179), uint8(180), uint8(181), uint8(182), uint8(183), uint8(184), uint8(185), uint8(186), uint8(187), uint8(188), uint8(189), uint8(190), uint8(191), uint8(192), uint8(193), uint8(194), uint8(195), uint8(196), uint8(197), uint8(198), uint8(199), uint8(200), uint8(201), uint8(202), uint8(203), uint8(204), uint8(205), uint8(206), uint8(207), uint8(208), uint8(209), uint8(210), uint8(211), uint8(212), uint8(213), uint8(214), uint8(215), uint8(216), uint8(217), uint8(218), uint8(219), uint8(220), uint8(221), uint8(222), uint8(223), uint8(224), uint8(225), uint8(226), uint8(227), uint8(228), uint8(229), uint8(230), uint8(231), uint8(232), uint8(233), uint8(234), uint8(235), uint8(236), uint8(237), uint8(238), uint8(239), uint8(240), uint8(241), uint8(242), uint8(243), uint8(244), uint8(245), uint8(246), uint8(247), uint8(248), uint8(249), uint8(250), uint8(251), uint8(252), uint8(253), uint8(254), uint8(255), uint8(1), uint8(0), uint8(0), uint8(1), uint8(1), uint8(0), uint8(0), uint8(1), uint8(0), uint8(1), uint8(0), uint8(1), uint8(1), uint8(0), uint8(1), uint8(0), uint8(0), uint8(1), } var Xsqlite3aLTb uintptr = 0 var Xsqlite3aEQb uintptr = 0 var Xsqlite3aGTb uintptr = 0 // The following 256 byte lookup table is used to support SQLites built-in // equivalents to the following standard library functions: // // isspace() 0x01 // isalpha() 0x02 // isdigit() 0x04 // isalnum() 0x06 // isxdigit() 0x08 // toupper() 0x20 // SQLite identifier character 0x40 // Quote character 0x80 // // Bit 0x20 is set if the mapped character requires translation to upper // case. i.e. if the character is a lower-case ASCII character. // If x is a lower-case ASCII character, then its upper-case equivalent // is (x - 0x20). Therefore toupper() can be implemented as: // // (x & ~(map[x]&0x20)) // // The equivalent of tolower() is implemented using the sqlite3UpperToLower[] // array. tolower() is used more often than toupper() by SQLite. // // Bit 0x40 is set if the character is non-alphanumeric and can be used in an // SQLite identifier. Identifiers are alphanumerics, "_", "$", and any // non-ASCII UTF character. Hence the test for whether or not a character is // part of an identifier is 0x46. var Xsqlite3CtypeMap = [256]uint8{ uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x01), uint8(0x00), uint8(0x80), uint8(0x00), uint8(0x40), uint8(0x00), uint8(0x00), uint8(0x80), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x0c), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x0a), uint8(0x0a), uint8(0x0a), uint8(0x0a), uint8(0x0a), uint8(0x0a), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x80), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x40), uint8(0x80), uint8(0x2a), uint8(0x2a), uint8(0x2a), uint8(0x2a), uint8(0x2a), uint8(0x2a), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x22), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), uint8(0x40), } // The following singleton contains the global configuration for // the SQLite library. var Xsqlite3Config = Sqlite3Config{ FbCoreMutex: U8(1), FbFullMutex: U8(libc.Bool32(SQLITE_THREADSAFE == 1)), FbUseCis: U8(SQLITE_ALLOW_COVERING_INDEX_SCAN), FbExtraSchemaChecks: U8(1), FmxStrlen: 0x7ffffffe, FszLookaside: 1200, FnLookaside: 40, FnStmtSpill: 64 * 1024, FmxMmap: int64(SQLITE_MAX_MMAP_SIZE), FnPage: SQLITE_DEFAULT_PCACHE_INITSZ, FszPma: U32(SQLITE_SORTER_PMASZ), FmxMemdbSize: int64(SQLITE_MEMDB_DEFAULT_MAXSIZE), FiOnceResetThreshold: 0x7ffffffe, FszSorterRef: U32(SQLITE_DEFAULT_SORTERREF_SIZE), } // Hash table for global functions - functions common to all // database connections. After initialization, this table is // read-only. var Xsqlite3BuiltinFunctions FuncDefHash // The value of the "pending" byte must be 0x40000000 (1 byte past the // 1-gibabyte boundary) in a compatible database. SQLite never uses // the database page that contains the pending byte. It never attempts // to read or write that page. The pending byte page is set aside // for use by the VFS layers as space for managing file locks. // // During testing, it is often desirable to move the pending byte to // a different position in the file. This allows code that has to // deal with the pending byte to run on files that are much smaller // than 1 GiB. The sqlite3_test_control() interface can be used to // move the pending byte. // // IMPORTANT: Changing the pending byte to any value other than // 0x40000000 results in an incompatible database file format! // Changing the pending byte during operation will result in undefined // and incorrect behavior. var Xsqlite3PendingByte int32 = 0x40000000 // Tracing flags set by SQLITE_TESTCTRL_TRACEFLAGS. var Xsqlite3TreeTrace U32 = U32(0) var Xsqlite3WhereTrace U32 = U32(0) // #include "opcodes.h" // Properties of opcodes. The OPFLG_INITIALIZER macro is // created by mkopcodeh.awk during compilation. Data is obtained // from the comments following the "case OP_xxxx:" statements in // the vdbe.c file. var Xsqlite3OpcodeProperty = [187]uint8{uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x10), uint8(0x00), uint8(0x41), uint8(0x00), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x03), uint8(0x03), uint8(0x01), uint8(0x01), uint8(0x03), uint8(0x03), uint8(0x01), uint8(0x12), uint8(0x01), uint8(0x49), uint8(0x49), uint8(0x49), uint8(0x49), uint8(0x01), uint8(0x49), uint8(0x49), uint8(0x49), uint8(0x49), uint8(0x49), uint8(0x49), uint8(0x41), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x41), uint8(0x01), uint8(0x41), uint8(0x41), uint8(0x41), uint8(0x41), uint8(0x41), uint8(0x26), uint8(0x26), uint8(0x41), uint8(0x23), uint8(0x0b), uint8(0x01), uint8(0x01), uint8(0x03), uint8(0x03), uint8(0x0b), uint8(0x0b), uint8(0x0b), uint8(0x0b), uint8(0x0b), uint8(0x0b), uint8(0x01), uint8(0x03), uint8(0x03), uint8(0x03), uint8(0x01), uint8(0x41), uint8(0x01), uint8(0x00), uint8(0x00), uint8(0x02), uint8(0x02), uint8(0x08), uint8(0x00), uint8(0x10), uint8(0x10), uint8(0x10), uint8(0x00), uint8(0x10), uint8(0x00), uint8(0x10), uint8(0x10), uint8(0x00), uint8(0x00), uint8(0x10), uint8(0x10), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x02), uint8(0x02), uint8(0x02), uint8(0x00), uint8(0x00), uint8(0x12), uint8(0x1e), uint8(0x20), uint8(0x40), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x10), uint8(0x10), uint8(0x00), uint8(0x40), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x26), uint8(0x40), uint8(0x00), uint8(0x12), uint8(0x40), uint8(0x40), uint8(0x10), uint8(0x40), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x40), uint8(0x00), uint8(0x40), uint8(0x40), uint8(0x10), uint8(0x10), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x50), uint8(0x00), uint8(0x40), uint8(0x04), uint8(0x04), uint8(0x00), uint8(0x40), uint8(0x50), uint8(0x40), uint8(0x10), uint8(0x00), uint8(0x00), uint8(0x10), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x10), uint8(0x00), uint8(0x00), uint8(0x06), uint8(0x10), uint8(0x00), uint8(0x04), uint8(0x1a), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x40), uint8(0x50), uint8(0x40), uint8(0x00), uint8(0x10), uint8(0x10), uint8(0x02), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00), uint8(0x00)} // Name of the default collating sequence var Xsqlite3StrBINARY = *(*[7]int8)(unsafe.Pointer(ts + 1089)) // Standard typenames. These names must match the COLTYPE_* definitions. // Adjust the SQLITE_N_STDTYPE value if adding or removing entries. // // sqlite3StdType[] The actual names of the datatypes. // // sqlite3StdTypeLen[] The length (in bytes) of each entry // in sqlite3StdType[]. // // sqlite3StdTypeAffinity[] The affinity associated with each entry // in sqlite3StdType[]. var Xsqlite3StdTypeLen = [6]uint8{uint8(3), uint8(4), uint8(3), uint8(7), uint8(4), uint8(4)} var Xsqlite3StdTypeAffinity = [6]int8{ int8(SQLITE_AFF_NUMERIC), int8(SQLITE_AFF_BLOB), int8(SQLITE_AFF_INTEGER), int8(SQLITE_AFF_INTEGER), int8(SQLITE_AFF_REAL), int8(SQLITE_AFF_TEXT), } var Xsqlite3StdType = [6]uintptr{ ts + 1096, ts + 1100, ts + 1105, ts + 1109, ts + 1117, ts + 1122, } // SQL is translated into a sequence of instructions to be // executed by a virtual machine. Each instruction is an instance // of the following structure. type Op = VdbeOp1 // Boolean values type Bool = uint32 // Opaque type used by code in vdbesort.c type VdbeSorter1 = struct { FmnPmaSize int32 FmxPmaSize int32 FmxKeysize int32 Fpgsz int32 FpReader uintptr FpMerger uintptr Fdb uintptr FpKeyInfo uintptr FpUnpacked uintptr Flist SorterList FiMemory int32 FnMemory int32 FbUsePMA U8 FbUseThreads U8 FiPrev U8 FnTask U8 FtypeMask U8 F__ccgo_pad1 [3]byte FaTask [1]SortSubtask } // Opaque type used by code in vdbesort.c type VdbeSorter = VdbeSorter1 // Elements of the linked list at Vdbe.pAuxData type AuxData1 = struct { FiAuxOp int32 FiAuxArg int32 FpAux uintptr FxDeleteAux uintptr FpNextAux uintptr } // Elements of the linked list at Vdbe.pAuxData type AuxData = AuxData1 // A VdbeCursor is an superclass (a wrapper) for various cursor objects: // // - A b-tree cursor // - In the main database or in an ephemeral database // - On either an index or a table // - A sorter // - A virtual table // - A one-row "pseudotable" stored in a single register type VdbeCursor1 = struct { FeCurType U8 FiDb I8 FnullRow U8 FdeferredMoveto U8 FisTable U8 F__ccgo_pad1 [3]byte FisEphemeral uint8 F__ccgo_pad2 [1]byte FseekHit U16 F__ccgo_pad3 [4]byte Fub struct{ FpBtx uintptr } FseqCount I64 FcacheStatus U32 FseekResult int32 FpAltCursor uintptr Fuc struct{ FpCursor uintptr } FpKeyInfo uintptr FiHdrOffset U32 FpgnoRoot Pgno FnField I16 FnHdrParsed U16 F__ccgo_pad4 [4]byte FmovetoTarget I64 FaOffset uintptr FaRow uintptr FpayloadSize U32 FszRow U32 FaType [1]U32 F__ccgo_pad5 [4]byte } // A VdbeCursor is an superclass (a wrapper) for various cursor objects: // // - A b-tree cursor // - In the main database or in an ephemeral database // - On either an index or a table // - A sorter // - A virtual table // - A one-row "pseudotable" stored in a single register type VdbeCursor = VdbeCursor1 // When a sub-program is executed (OP_Program), a structure of this type // is allocated to store the current value of the program counter, as // well as the current memory cell array and various other frame specific // values stored in the Vdbe struct. When the sub-program is finished, // these values are copied back to the Vdbe from the VdbeFrame structure, // restoring the state of the VM to as it was before the sub-program // began executing. // // The memory for a VdbeFrame object is allocated and managed by a memory // cell in the parent (calling) frame. When the memory cell is deleted or // overwritten, the VdbeFrame object is not freed immediately. Instead, it // is linked into the Vdbe.pDelFrame list. The contents of the Vdbe.pDelFrame // list is deleted when the VM is reset in VdbeHalt(). The reason for doing // this instead of deleting the VdbeFrame immediately is to avoid recursive // calls to sqlite3VdbeMemRelease() when the memory cells belonging to the // child frame are released. // // The currently executing frame is stored in Vdbe.pFrame. Vdbe.pFrame is // set to NULL if the currently executing frame is the main program. type VdbeFrame1 = struct { Fv uintptr FpParent uintptr FaOp uintptr FaMem uintptr FapCsr uintptr FaOnce uintptr Ftoken uintptr FlastRowid I64 FpAuxData uintptr FnCursor int32 Fpc int32 FnOp int32 FnMem int32 FnChildMem int32 FnChildCsr int32 FnChange I64 FnDbChange I64 } // When a sub-program is executed (OP_Program), a structure of this type // is allocated to store the current value of the program counter, as // well as the current memory cell array and various other frame specific // values stored in the Vdbe struct. When the sub-program is finished, // these values are copied back to the Vdbe from the VdbeFrame structure, // restoring the state of the VM to as it was before the sub-program // began executing. // // The memory for a VdbeFrame object is allocated and managed by a memory // cell in the parent (calling) frame. When the memory cell is deleted or // overwritten, the VdbeFrame object is not freed immediately. Instead, it // is linked into the Vdbe.pDelFrame list. The contents of the Vdbe.pDelFrame // list is deleted when the VM is reset in VdbeHalt(). The reason for doing // this instead of deleting the VdbeFrame immediately is to avoid recursive // calls to sqlite3VdbeMemRelease() when the memory cells belonging to the // child frame are released. // // The currently executing frame is stored in Vdbe.pFrame. Vdbe.pFrame is // set to NULL if the currently executing frame is the main program. type VdbeFrame = VdbeFrame1 // Internally, the vdbe manipulates nearly all SQL values as Mem // structures. Each Mem struct may cache multiple representations (string, // integer etc.) of the same value. type MemValue = struct{ Fr float64 } // A bitfield type for use inside of structures. Always follow with :N where // N is the number of bits. type Bft = uint32 // The ScanStatus object holds a single value for the // sqlite3_stmt_scanstatus() interface. // // aAddrRange[]: // // This array is used by ScanStatus elements associated with EQP // notes that make an SQLITE_SCANSTAT_NCYCLE value available. It is // an array of up to 3 ranges of VM addresses for which the Vdbe.anCycle[] // values should be summed to calculate the NCYCLE value. Each pair of // integer addresses is a start and end address (both inclusive) for a range // instructions. A start value of 0 indicates an empty range. type ScanStatus1 = struct { FaddrExplain int32 FaAddrRange [6]int32 FaddrLoop int32 FaddrVisit int32 FiSelectID int32 FnEst LogEst F__ccgo_pad1 [6]byte FzName uintptr } // The ScanStatus object holds a single value for the // sqlite3_stmt_scanstatus() interface. // // aAddrRange[]: // // This array is used by ScanStatus elements associated with EQP // notes that make an SQLITE_SCANSTAT_NCYCLE value available. It is // an array of up to 3 ranges of VM addresses for which the Vdbe.anCycle[] // values should be summed to calculate the NCYCLE value. Each pair of // integer addresses is a start and end address (both inclusive) for a range // instructions. A start value of 0 indicates an empty range. type ScanStatus = ScanStatus1 // 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 DblquoteStr1 = struct { FpNextStr uintptr Fz [8]int8 } // 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 DblquoteStr = DblquoteStr1 // An instance of this object is used to pass an vector of values into // OP_VFilter, the xFilter method of a virtual table. The vector is the // set of values on the right-hand side of an IN constraint. // // The value as passed into xFilter is an sqlite3_value with a "pointer" // type, such as is generated by sqlite3_result_pointer() and read by // sqlite3_value_pointer. Such values have MEM_Term|MEM_Subtype|MEM_Null // and a subtype of 'p'. The sqlite3_vtab_in_first() and _next() interfaces // know how to use this object to step through all the values in the // right operand of the IN constraint. type ValueList1 = struct { FpCsr uintptr FpOut uintptr } // An instance of this object is used to pass an vector of values into // OP_VFilter, the xFilter method of a virtual table. The vector is the // set of values on the right-hand side of an IN constraint. // // The value as passed into xFilter is an sqlite3_value with a "pointer" // type, such as is generated by sqlite3_result_pointer() and read by // sqlite3_value_pointer. Such values have MEM_Term|MEM_Subtype|MEM_Null // and a subtype of 'p'. The sqlite3_vtab_in_first() and _next() interfaces // know how to use this object to step through all the values in the // right operand of the IN constraint. type ValueList = ValueList1 // Variables in which to record status information. type Sqlite3StatValueType = Sqlite3_int64 type sqlite3StatType = struct { FnowValue [10]Sqlite3StatValueType FmxValue [10]Sqlite3StatValueType } type Sqlite3StatType = sqlite3StatType var sqlite3Stat = sqlite3StatType{} var statMutex = [10]int8{ int8(0), int8(1), int8(1), int8(0), int8(0), int8(0), int8(0), int8(1), int8(0), int8(0), } // Return the current value of a status parameter. The caller must // be holding the appropriate mutex. func Xsqlite3StatusValue(tls *libc.TLS, op int32) Sqlite3_int64 { return *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + uintptr(op)*8)) } // Add N to the value of a status record. The caller must hold the // appropriate mutex. (Locking is checked by assert()). // // The StatusUp() routine can accept positive or negative values for N. // The value of N is added to the current status value and the high-water // mark is adjusted if necessary. // // The StatusDown() routine lowers the current value by N. The highwater // mark is unchanged. N must be non-negative for StatusDown(). func Xsqlite3StatusUp(tls *libc.TLS, op int32, N int32) { *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + uintptr(op)*8)) += Sqlite3StatValueType(N) if *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + uintptr(op)*8)) > *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + 80 + uintptr(op)*8)) { *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + 80 + uintptr(op)*8)) = *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + uintptr(op)*8)) } } func Xsqlite3StatusDown(tls *libc.TLS, op int32, N int32) { *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + uintptr(op)*8)) -= Sqlite3StatValueType(N) } // Adjust the highwater mark if necessary. // The caller must hold the appropriate mutex. func Xsqlite3StatusHighwater(tls *libc.TLS, op int32, X int32) { var newValue Sqlite3StatValueType newValue = Sqlite3StatValueType(X) if newValue > *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + 80 + uintptr(op)*8)) { *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + 80 + uintptr(op)*8)) = newValue } } // Query status information. func Xsqlite3_status64(tls *libc.TLS, op int32, pCurrent uintptr, pHighwater uintptr, resetFlag int32) int32 { var pMutex uintptr _ = pMutex if op < 0 || op >= int32(uint64(unsafe.Sizeof([10]Sqlite3StatValueType{}))/uint64(unsafe.Sizeof(Sqlite3StatValueType(0)))) { return Xsqlite3MisuseError(tls, 23233) } if statMutex[op] != 0 { pMutex = Xsqlite3Pcache1Mutex(tls) } else { pMutex = Xsqlite3MallocMutex(tls) } Xsqlite3_mutex_enter(tls, pMutex) *(*Sqlite3_int64)(unsafe.Pointer(pCurrent)) = *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + uintptr(op)*8)) *(*Sqlite3_int64)(unsafe.Pointer(pHighwater)) = *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + 80 + uintptr(op)*8)) if resetFlag != 0 { *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + 80 + uintptr(op)*8)) = *(*Sqlite3StatValueType)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Stat)) + uintptr(op)*8)) } Xsqlite3_mutex_leave(tls, pMutex) _ = pMutex return SQLITE_OK } func Xsqlite3_status(tls *libc.TLS, op int32, pCurrent uintptr, pHighwater uintptr, resetFlag int32) int32 { bp := tls.Alloc(16) defer tls.Free(16) *(*Sqlite3_int64)(unsafe.Pointer(bp)) = int64(0) *(*Sqlite3_int64)(unsafe.Pointer(bp + 8)) = int64(0) var rc int32 rc = Xsqlite3_status64(tls, op, bp, bp+8, resetFlag) if rc == 0 { *(*int32)(unsafe.Pointer(pCurrent)) = int32(*(*Sqlite3_int64)(unsafe.Pointer(bp))) *(*int32)(unsafe.Pointer(pHighwater)) = int32(*(*Sqlite3_int64)(unsafe.Pointer(bp + 8))) } return rc } func countLookasideSlots(tls *libc.TLS, p uintptr) U32 { var cnt U32 = U32(0) for p != 0 { p = (*LookasideSlot)(unsafe.Pointer(p)).FpNext cnt++ } return cnt } // Count the number of slots of lookaside memory that are outstanding func Xsqlite3LookasideUsed(tls *libc.TLS, db uintptr, pHighwater uintptr) int32 { var nInit U32 = countLookasideSlots(tls, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit) var nFree U32 = countLookasideSlots(tls, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree) nInit = nInit + countLookasideSlots(tls, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit) nFree = nFree + countLookasideSlots(tls, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree) if pHighwater != 0 { *(*int32)(unsafe.Pointer(pHighwater)) = int32((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FnSlot - nInit) } return int32((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FnSlot - (nInit + nFree)) } // Query status information for a single database connection func Xsqlite3_db_status(tls *libc.TLS, db uintptr, op int32, pCurrent uintptr, pHighwater uintptr, resetFlag int32) int32 { bp := tls.Alloc(12) defer tls.Free(12) var rc int32 = SQLITE_OK Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) { switch op { case SQLITE_DBSTATUS_LOOKASIDE_USED: { *(*int32)(unsafe.Pointer(pCurrent)) = Xsqlite3LookasideUsed(tls, db, pHighwater) if resetFlag != 0 { var p uintptr = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree if p != 0 { for (*LookasideSlot)(unsafe.Pointer(p)).FpNext != 0 { p = (*LookasideSlot)(unsafe.Pointer(p)).FpNext } (*LookasideSlot)(unsafe.Pointer(p)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree = uintptr(0) } p = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree if p != 0 { for (*LookasideSlot)(unsafe.Pointer(p)).FpNext != 0 { p = (*LookasideSlot)(unsafe.Pointer(p)).FpNext } (*LookasideSlot)(unsafe.Pointer(p)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree = uintptr(0) } } break } case SQLITE_DBSTATUS_LOOKASIDE_HIT: fallthrough case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE: fallthrough case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: { *(*int32)(unsafe.Pointer(pCurrent)) = 0 *(*int32)(unsafe.Pointer(pHighwater)) = int32(*(*U32)(unsafe.Pointer(db + 440 + 16 + uintptr(op-SQLITE_DBSTATUS_LOOKASIDE_HIT)*4))) if resetFlag != 0 { *(*U32)(unsafe.Pointer(db + 440 + 16 + uintptr(op-SQLITE_DBSTATUS_LOOKASIDE_HIT)*4)) = U32(0) } break } case SQLITE_DBSTATUS_CACHE_USED_SHARED: fallthrough case SQLITE_DBSTATUS_CACHE_USED: { var totalUsed int32 = 0 var i int32 Xsqlite3BtreeEnterAll(tls, db) for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { var pPager uintptr = Xsqlite3BtreePager(tls, pBt) var nByte int32 = Xsqlite3PagerMemUsed(tls, pPager) if op == SQLITE_DBSTATUS_CACHE_USED_SHARED { nByte = nByte / Xsqlite3BtreeConnectionCount(tls, pBt) } totalUsed = totalUsed + nByte } } Xsqlite3BtreeLeaveAll(tls, db) *(*int32)(unsafe.Pointer(pCurrent)) = totalUsed *(*int32)(unsafe.Pointer(pHighwater)) = 0 break } case SQLITE_DBSTATUS_SCHEMA_USED: { var i int32 *(*int32)(unsafe.Pointer(bp)) = 0 Xsqlite3BtreeEnterAll(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed = bp (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pSchema uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpSchema if pSchema != uintptr(0) { var p uintptr *(*int32)(unsafe.Pointer(bp)) += int32(uint32((*struct{ f func(*libc.TLS, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxRoundup})).f(tls, int32(unsafe.Sizeof(HashElem{})))) * ((*Schema)(unsafe.Pointer(pSchema)).FtblHash.Fcount + (*Schema)(unsafe.Pointer(pSchema)).FtrigHash.Fcount + (*Schema)(unsafe.Pointer(pSchema)).FidxHash.Fcount + (*Schema)(unsafe.Pointer(pSchema)).FfkeyHash.Fcount)) *(*int32)(unsafe.Pointer(bp)) += int32(Xsqlite3_msize(tls, (*Schema)(unsafe.Pointer(pSchema)).FtblHash.Fht)) *(*int32)(unsafe.Pointer(bp)) += int32(Xsqlite3_msize(tls, (*Schema)(unsafe.Pointer(pSchema)).FtrigHash.Fht)) *(*int32)(unsafe.Pointer(bp)) += int32(Xsqlite3_msize(tls, (*Schema)(unsafe.Pointer(pSchema)).FidxHash.Fht)) *(*int32)(unsafe.Pointer(bp)) += int32(Xsqlite3_msize(tls, (*Schema)(unsafe.Pointer(pSchema)).FfkeyHash.Fht)) for p = (*Hash)(unsafe.Pointer(pSchema + 56)).Ffirst; p != 0; p = (*HashElem)(unsafe.Pointer(p)).Fnext { Xsqlite3DeleteTrigger(tls, db, (*HashElem)(unsafe.Pointer(p)).Fdata) } for p = (*Hash)(unsafe.Pointer(pSchema + 8)).Ffirst; p != 0; p = (*HashElem)(unsafe.Pointer(p)).Fnext { Xsqlite3DeleteTable(tls, db, (*HashElem)(unsafe.Pointer(p)).Fdata) } } } (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpTrueEnd Xsqlite3BtreeLeaveAll(tls, db) *(*int32)(unsafe.Pointer(pHighwater)) = 0 *(*int32)(unsafe.Pointer(pCurrent)) = *(*int32)(unsafe.Pointer(bp)) break } case SQLITE_DBSTATUS_STMT_USED: { var pVdbe uintptr *(*int32)(unsafe.Pointer(bp + 4)) = 0 (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed = bp + 4 (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart for pVdbe = (*Sqlite3)(unsafe.Pointer(db)).FpVdbe; pVdbe != 0; pVdbe = (*Vdbe1)(unsafe.Pointer(pVdbe)).FpVNext { Xsqlite3VdbeDelete(tls, pVdbe) } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpTrueEnd (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed = uintptr(0) *(*int32)(unsafe.Pointer(pHighwater)) = 0 *(*int32)(unsafe.Pointer(pCurrent)) = *(*int32)(unsafe.Pointer(bp + 4)) break } case SQLITE_DBSTATUS_CACHE_SPILL: op = SQLITE_DBSTATUS_CACHE_WRITE + 1 fallthrough case SQLITE_DBSTATUS_CACHE_HIT: fallthrough case SQLITE_DBSTATUS_CACHE_MISS: fallthrough case SQLITE_DBSTATUS_CACHE_WRITE: { var i int32 *(*int32)(unsafe.Pointer(bp + 8)) = 0 for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { if (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpBt != 0 { var pPager uintptr = Xsqlite3BtreePager(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpBt) Xsqlite3PagerCacheStat(tls, pPager, op, resetFlag, bp+8) } } *(*int32)(unsafe.Pointer(pHighwater)) = 0 *(*int32)(unsafe.Pointer(pCurrent)) = *(*int32)(unsafe.Pointer(bp + 8)) break } case SQLITE_DBSTATUS_DEFERRED_FKS: { *(*int32)(unsafe.Pointer(pHighwater)) = 0 *(*int32)(unsafe.Pointer(pCurrent)) = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons > int64(0) || (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons > int64(0)) break } default: { rc = SQLITE_ERROR } } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } type Clock_t = int32 type tm = struct { Ftm_sec int32 Ftm_min int32 Ftm_hour int32 Ftm_mday int32 Ftm_mon int32 Ftm_year int32 Ftm_wday int32 Ftm_yday int32 Ftm_isdst int32 } func localtime(tls *libc.TLS, _Time uintptr) uintptr { return libc.X_localtime64(tls, _Time) } var Xdaylight int32 var Xtimezone int32 var Xtzname [2]uintptr type timeval = struct { Ftv_sec int32 Ftv_usec int32 } type timezone = struct { Ftz_minuteswest int32 Ftz_dsttime int32 } type __timeb32 = struct { Ftime X__time32_t Fmillitm uint16 Ftimezone int16 Fdstflag int16 F__ccgo_pad1 [2]byte } type timeb = struct { Ftime Time_t Fmillitm uint16 Ftimezone int16 Fdstflag int16 F__ccgo_pad1 [2]byte } type __timeb64 = struct { Ftime X__time64_t Fmillitm uint16 Ftimezone int16 Fdstflag int16 F__ccgo_pad1 [2]byte } type timespec = struct { Ftv_sec Time_t Ftv_nsec int32 F__ccgo_pad1 [4]byte } type itimerspec = struct { Fit_interval struct { Ftv_sec Time_t Ftv_nsec int32 F__ccgo_pad1 [4]byte } Fit_value struct { Ftv_sec Time_t Ftv_nsec int32 F__ccgo_pad1 [4]byte } } type Clockid_t = int32 // A structure for holding a single date and time. type DateTime1 = struct { FiJD Sqlite3_int64 FY int32 FM int32 FD int32 Fh int32 Fm int32 Ftz int32 Fs float64 FvalidJD int8 FrawS int8 FvalidYMD int8 FvalidHMS int8 FvalidTZ int8 FtzSet int8 FisError int8 F__ccgo_pad1 [1]byte } // A structure for holding a single date and time. type DateTime = DateTime1 func getDigits(tls *libc.TLS, zDate uintptr, zFormat uintptr, va uintptr) int32 { var ap Va_list _ = ap var cnt int32 var nextC int8 var N int8 var min int8 var val int32 var max U16 cnt = 0 ap = va __1: N = int8(int32(*(*int8)(unsafe.Pointer(zFormat))) - '0') min = int8(int32(*(*int8)(unsafe.Pointer(zFormat + 1))) - '0') val = 0 max = aMx[int32(*(*int8)(unsafe.Pointer(zFormat + 2)))-'a'] nextC = *(*int8)(unsafe.Pointer(zFormat + 3)) val = 0 __4: if !(libc.PostDecInt8(&N, 1) != 0) { goto __5 } if !!(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zDate)))])&0x04 != 0) { goto __6 } goto end_getDigits __6: ; val = val*10 + int32(*(*int8)(unsafe.Pointer(zDate))) - '0' zDate++ goto __4 __5: ; if !(val < int32(min) || val > int32(max) || int32(nextC) != 0 && int32(nextC) != int32(*(*int8)(unsafe.Pointer(zDate)))) { goto __7 } goto end_getDigits __7: ; *(*int32)(unsafe.Pointer(libc.VaUintptr(&ap))) = val zDate++ cnt++ zFormat += uintptr(4) goto __2 __2: if nextC != 0 { goto __1 } goto __3 __3: ; end_getDigits: _ = ap return cnt } var aMx = [6]U16{U16(12), U16(14), U16(24), U16(31), U16(59), U16(9999)} func parseTimezone(tls *libc.TLS, zDate uintptr, p uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var sgn int32 var c int32 sgn = 0 __1: if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zDate)))])&0x01 != 0) { goto __2 } zDate++ goto __1 __2: ; (*DateTime)(unsafe.Pointer(p)).Ftz = 0 c = int32(*(*int8)(unsafe.Pointer(zDate))) if !(c == '-') { goto __3 } sgn = -1 goto __4 __3: if !(c == '+') { goto __5 } sgn = +1 goto __6 __5: if !(c == 'Z' || c == 'z') { goto __7 } zDate++ goto zulu_time goto __8 __7: return libc.Bool32(c != 0) __8: ; __6: ; __4: ; zDate++ if !(getDigits(tls, zDate, ts+1127, libc.VaList(bp, bp+16, bp+20)) != 2) { goto __9 } return 1 __9: ; zDate += uintptr(5) (*DateTime)(unsafe.Pointer(p)).Ftz = sgn * (*(*int32)(unsafe.Pointer(bp + 20)) + *(*int32)(unsafe.Pointer(bp + 16))*60) zulu_time: __10: if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zDate)))])&0x01 != 0) { goto __11 } zDate++ goto __10 __11: ; (*DateTime)(unsafe.Pointer(p)).FtzSet = int8(1) return libc.Bool32(int32(*(*int8)(unsafe.Pointer(zDate))) != 0) } func parseHhMmSs(tls *libc.TLS, zDate uintptr, p uintptr) int32 { bp := tls.Alloc(36) defer tls.Free(36) var ms float64 = 0.0 if getDigits(tls, zDate, ts+1135, libc.VaList(bp, bp+24, bp+28)) != 2 { return 1 } zDate += uintptr(5) if int32(*(*int8)(unsafe.Pointer(zDate))) == ':' { zDate++ if getDigits(tls, zDate, ts+1143, libc.VaList(bp+16, bp+32)) != 1 { return 1 } zDate += uintptr(2) if int32(*(*int8)(unsafe.Pointer(zDate))) == '.' && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zDate + 1)))])&0x04 != 0 { var rScale float64 = 1.0 zDate++ for int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zDate)))])&0x04 != 0 { ms = ms*10.0 + float64(*(*int8)(unsafe.Pointer(zDate))) - float64('0') rScale = rScale * 10.0 zDate++ } ms = ms / rScale } } else { *(*int32)(unsafe.Pointer(bp + 32)) = 0 } (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(0) (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidHMS = int8(1) (*DateTime)(unsafe.Pointer(p)).Fh = *(*int32)(unsafe.Pointer(bp + 24)) (*DateTime)(unsafe.Pointer(p)).Fm = *(*int32)(unsafe.Pointer(bp + 28)) (*DateTime)(unsafe.Pointer(p)).Fs = float64(*(*int32)(unsafe.Pointer(bp + 32))) + ms if parseTimezone(tls, zDate, p) != 0 { return 1 } (*DateTime)(unsafe.Pointer(p)).FvalidTZ = func() int8 { if (*DateTime)(unsafe.Pointer(p)).Ftz != 0 { return int8(1) } return int8(0) }() return 0 } func datetimeError(tls *libc.TLS, p uintptr) { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(DateTime{}))) (*DateTime)(unsafe.Pointer(p)).FisError = int8(1) } func computeJD(tls *libc.TLS, p uintptr) { var Y int32 var M int32 var D int32 var A int32 var B int32 var X1 int32 var X2 int32 if (*DateTime)(unsafe.Pointer(p)).FvalidJD != 0 { return } if (*DateTime)(unsafe.Pointer(p)).FvalidYMD != 0 { Y = (*DateTime)(unsafe.Pointer(p)).FY M = (*DateTime)(unsafe.Pointer(p)).FM D = (*DateTime)(unsafe.Pointer(p)).FD } else { Y = 2000 M = 1 D = 1 } if Y < -4713 || Y > 9999 || (*DateTime)(unsafe.Pointer(p)).FrawS != 0 { datetimeError(tls, p) return } if M <= 2 { Y-- M = M + 12 } A = Y / 100 B = 2 - A + A/4 X1 = 36525 * (Y + 4716) / 100 X2 = 306001 * (M + 1) / 10000 (*DateTime)(unsafe.Pointer(p)).FiJD = libc.Int64FromFloat64((float64(X1+X2+D+B) - 1524.5) * float64(86400000)) (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(1) if (*DateTime)(unsafe.Pointer(p)).FvalidHMS != 0 { *(*Sqlite3_int64)(unsafe.Pointer(p)) += Sqlite3_int64((*DateTime)(unsafe.Pointer(p)).Fh*3600000+(*DateTime)(unsafe.Pointer(p)).Fm*60000) + libc.Int64FromFloat64((*DateTime)(unsafe.Pointer(p)).Fs*float64(1000)+0.5) if (*DateTime)(unsafe.Pointer(p)).FvalidTZ != 0 { *(*Sqlite3_int64)(unsafe.Pointer(p)) -= Sqlite3_int64((*DateTime)(unsafe.Pointer(p)).Ftz * 60000) (*DateTime)(unsafe.Pointer(p)).FvalidYMD = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidHMS = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidTZ = int8(0) } } } func parseYyyyMmDd(tls *libc.TLS, zDate uintptr, p uintptr) int32 { bp := tls.Alloc(36) defer tls.Free(36) var neg int32 if int32(*(*int8)(unsafe.Pointer(zDate))) == '-' { zDate++ neg = 1 } else { neg = 0 } if getDigits(tls, zDate, ts+1147, libc.VaList(bp, bp+24, bp+28, bp+32)) != 3 { return 1 } zDate += uintptr(10) for int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zDate)))])&0x01 != 0 || 'T' == int32(*(*U8)(unsafe.Pointer(zDate))) { zDate++ } if parseHhMmSs(tls, zDate, p) == 0 { } else if int32(*(*int8)(unsafe.Pointer(zDate))) == 0 { (*DateTime)(unsafe.Pointer(p)).FvalidHMS = int8(0) } else { return 1 } (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidYMD = int8(1) (*DateTime)(unsafe.Pointer(p)).FY = func() int32 { if neg != 0 { return -*(*int32)(unsafe.Pointer(bp + 24)) } return *(*int32)(unsafe.Pointer(bp + 24)) }() (*DateTime)(unsafe.Pointer(p)).FM = *(*int32)(unsafe.Pointer(bp + 28)) (*DateTime)(unsafe.Pointer(p)).FD = *(*int32)(unsafe.Pointer(bp + 32)) if (*DateTime)(unsafe.Pointer(p)).FvalidTZ != 0 { computeJD(tls, p) } return 0 } func setDateTimeToCurrent(tls *libc.TLS, context uintptr, p uintptr) int32 { (*DateTime)(unsafe.Pointer(p)).FiJD = Xsqlite3StmtCurrentTime(tls, context) if (*DateTime)(unsafe.Pointer(p)).FiJD > int64(0) { (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(1) return 0 } else { return 1 } return int32(0) } func setRawDateNumber(tls *libc.TLS, p uintptr, r float64) { (*DateTime)(unsafe.Pointer(p)).Fs = r (*DateTime)(unsafe.Pointer(p)).FrawS = int8(1) if r >= 0.0 && r < 5373484.5 { (*DateTime)(unsafe.Pointer(p)).FiJD = libc.Int64FromFloat64(r*86400000.0 + 0.5) (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(1) } } func parseDateOrTime(tls *libc.TLS, context uintptr, zDate uintptr, p uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if parseYyyyMmDd(tls, zDate, p) == 0 { return 0 } else if parseHhMmSs(tls, zDate, p) == 0 { return 0 } else if Xsqlite3StrICmp(tls, zDate, ts+1159) == 0 && Xsqlite3NotPureFunc(tls, context) != 0 { return setDateTimeToCurrent(tls, context, p) } else if Xsqlite3AtoF(tls, zDate, bp, Xsqlite3Strlen30(tls, zDate), uint8(SQLITE_UTF8)) > 0 { setRawDateNumber(tls, p, *(*float64)(unsafe.Pointer(bp))) return 0 } return 1 } func validJulianDay(tls *libc.TLS, iJD Sqlite3_int64) int32 { return libc.Bool32(iJD >= int64(0) && iJD <= int64(0x1a640)<<32|int64(0x1072fdff)) } func computeYMD(tls *libc.TLS, p uintptr) { var Z int32 var A int32 var B int32 var C int32 var D int32 var E int32 var X1 int32 if (*DateTime)(unsafe.Pointer(p)).FvalidYMD != 0 { return } if !(int32((*DateTime)(unsafe.Pointer(p)).FvalidJD) != 0) { (*DateTime)(unsafe.Pointer(p)).FY = 2000 (*DateTime)(unsafe.Pointer(p)).FM = 1 (*DateTime)(unsafe.Pointer(p)).FD = 1 } else if !(validJulianDay(tls, (*DateTime)(unsafe.Pointer(p)).FiJD) != 0) { datetimeError(tls, p) return } else { Z = int32(((*DateTime)(unsafe.Pointer(p)).FiJD + int64(43200000)) / int64(86400000)) A = libc.Int32FromFloat64((float64(Z) - 1867216.25) / 36524.25) A = Z + 1 + A - A/4 B = A + 1524 C = libc.Int32FromFloat64((float64(B) - 122.1) / 365.25) D = 36525 * (C & 32767) / 100 E = libc.Int32FromFloat64(float64(B-D) / 30.6001) X1 = libc.Int32FromFloat64(30.6001 * float64(E)) (*DateTime)(unsafe.Pointer(p)).FD = B - D - X1 (*DateTime)(unsafe.Pointer(p)).FM = func() int32 { if E < 14 { return E - 1 } return E - 13 }() (*DateTime)(unsafe.Pointer(p)).FY = func() int32 { if (*DateTime)(unsafe.Pointer(p)).FM > 2 { return C - 4716 } return C - 4715 }() } (*DateTime)(unsafe.Pointer(p)).FvalidYMD = int8(1) } func computeHMS(tls *libc.TLS, p uintptr) { var s int32 if (*DateTime)(unsafe.Pointer(p)).FvalidHMS != 0 { return } computeJD(tls, p) s = int32(((*DateTime)(unsafe.Pointer(p)).FiJD + int64(43200000)) % int64(86400000)) (*DateTime)(unsafe.Pointer(p)).Fs = float64(s) / 1000.0 s = libc.Int32FromFloat64((*DateTime)(unsafe.Pointer(p)).Fs) *(*float64)(unsafe.Pointer(p + 32)) -= float64(s) (*DateTime)(unsafe.Pointer(p)).Fh = s / 3600 s = s - (*DateTime)(unsafe.Pointer(p)).Fh*3600 (*DateTime)(unsafe.Pointer(p)).Fm = s / 60 *(*float64)(unsafe.Pointer(p + 32)) += float64(s - (*DateTime)(unsafe.Pointer(p)).Fm*60) (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidHMS = int8(1) } func computeYMD_HMS(tls *libc.TLS, p uintptr) { computeYMD(tls, p) computeHMS(tls, p) } func clearYMD_HMS_TZ(tls *libc.TLS, p uintptr) { (*DateTime)(unsafe.Pointer(p)).FvalidYMD = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidHMS = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidTZ = int8(0) } func osLocaltime(tls *libc.TLS, t uintptr, pTm uintptr) int32 { var rc int32 var pX uintptr var mutex uintptr = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, mutex) pX = localtime(tls, t) if Xsqlite3Config.FbLocaltimeFault != 0 { if Xsqlite3Config.FxAltLocaltime != uintptr(0) && 0 == (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.FxAltLocaltime})).f(tls, t, pTm) { pX = pTm } else { pX = uintptr(0) } } if pX != 0 { *(*tm)(unsafe.Pointer(pTm)) = *(*tm)(unsafe.Pointer(pX)) } Xsqlite3_mutex_leave(tls, mutex) rc = libc.Bool32(pX == uintptr(0)) return rc } func toLocaltime(tls *libc.TLS, p uintptr, pCtx uintptr) int32 { bp := tls.Alloc(96) defer tls.Free(96) var iYearDiff int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(tm{}))) computeJD(tls, p) if (*DateTime)(unsafe.Pointer(p)).FiJD < int64(2108667600)*int64(100000) || (*DateTime)(unsafe.Pointer(p)).FiJD > int64(2130141456)*int64(100000) { *(*DateTime)(unsafe.Pointer(bp + 40)) = *(*DateTime)(unsafe.Pointer(p)) computeYMD_HMS(tls, bp+40) iYearDiff = 2000 + (*DateTime)(unsafe.Pointer(bp+40)).FY%4 - (*DateTime)(unsafe.Pointer(bp+40)).FY *(*int32)(unsafe.Pointer(bp + 40 + 8)) += iYearDiff (*DateTime)(unsafe.Pointer(bp + 40)).FvalidJD = int8(0) computeJD(tls, bp+40) *(*Time_t)(unsafe.Pointer(bp + 88)) = (*DateTime)(unsafe.Pointer(bp+40)).FiJD/int64(1000) - int64(21086676)*int64(10000) } else { iYearDiff = 0 *(*Time_t)(unsafe.Pointer(bp + 88)) = (*DateTime)(unsafe.Pointer(p)).FiJD/int64(1000) - int64(21086676)*int64(10000) } if osLocaltime(tls, bp+88, bp) != 0 { Xsqlite3_result_error(tls, pCtx, ts+1163, -1) return SQLITE_ERROR } (*DateTime)(unsafe.Pointer(p)).FY = (*tm)(unsafe.Pointer(bp)).Ftm_year + 1900 - iYearDiff (*DateTime)(unsafe.Pointer(p)).FM = (*tm)(unsafe.Pointer(bp)).Ftm_mon + 1 (*DateTime)(unsafe.Pointer(p)).FD = (*tm)(unsafe.Pointer(bp)).Ftm_mday (*DateTime)(unsafe.Pointer(p)).Fh = (*tm)(unsafe.Pointer(bp)).Ftm_hour (*DateTime)(unsafe.Pointer(p)).Fm = (*tm)(unsafe.Pointer(bp)).Ftm_min (*DateTime)(unsafe.Pointer(p)).Fs = float64((*tm)(unsafe.Pointer(bp)).Ftm_sec) + float64((*DateTime)(unsafe.Pointer(p)).FiJD%int64(1000))*0.001 (*DateTime)(unsafe.Pointer(p)).FvalidYMD = int8(1) (*DateTime)(unsafe.Pointer(p)).FvalidHMS = int8(1) (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(0) (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidTZ = int8(0) (*DateTime)(unsafe.Pointer(p)).FisError = int8(0) return SQLITE_OK } var aXformType = [6]struct { FnName U8 FzName [7]int8 FrLimit float32 FrXform float32 }{ {FnName: U8(6), FzName: *(*[7]int8)(unsafe.Pointer(ts + 1186)), FrLimit: 4.6427e+14, FrXform: 1.0}, {FnName: U8(6), FzName: *(*[7]int8)(unsafe.Pointer(ts + 1193)), FrLimit: 7.7379e+12, FrXform: 60.0}, {FnName: U8(4), FzName: *(*[7]int8)(unsafe.Pointer(ts + 1200)), FrLimit: 1.2897e+11, FrXform: 3600.0}, {FnName: U8(3), FzName: *(*[7]int8)(unsafe.Pointer(ts + 1207)), FrLimit: 5373485.0, FrXform: 86400.0}, {FnName: U8(5), FzName: *(*[7]int8)(unsafe.Pointer(ts + 1214)), FrLimit: 176546.0, FrXform: 2592000.0}, {FnName: U8(4), FzName: *(*[7]int8)(unsafe.Pointer(ts + 1221)), FrLimit: 14713.0, FrXform: 31536000.0}, } func parseModifier(tls *libc.TLS, pCtx uintptr, z uintptr, n int32, p uintptr, idx int32) int32 { bp := tls.Alloc(104) defer tls.Free(104) var rc int32 = 1 switch int32(Xsqlite3UpperToLower[U8(*(*int8)(unsafe.Pointer(z)))]) { case 'a': { if Xsqlite3_stricmp(tls, z, ts+1228) == 0 { if idx > 1 { return 1 } if !(int32((*DateTime)(unsafe.Pointer(p)).FrawS) != 0) || (*DateTime)(unsafe.Pointer(p)).FvalidJD != 0 { rc = 0 (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) } else if (*DateTime)(unsafe.Pointer(p)).Fs >= float64(int64(-21086676)*int64(10000)) && (*DateTime)(unsafe.Pointer(p)).Fs <= float64(int64(25340230)*int64(10000)+int64(799)) { *(*float64)(unsafe.Pointer(bp + 48)) = (*DateTime)(unsafe.Pointer(p)).Fs*1000.0 + 210866760000000.0 clearYMD_HMS_TZ(tls, p) (*DateTime)(unsafe.Pointer(p)).FiJD = libc.Int64FromFloat64(*(*float64)(unsafe.Pointer(bp + 48)) + 0.5) (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(1) (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) rc = 0 } } break } case 'j': { if Xsqlite3_stricmp(tls, z, ts+1233) == 0 { if idx > 1 { return 1 } if (*DateTime)(unsafe.Pointer(p)).FvalidJD != 0 && (*DateTime)(unsafe.Pointer(p)).FrawS != 0 { rc = 0 (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) } } break } case 'l': { if Xsqlite3_stricmp(tls, z, ts+1243) == 0 && Xsqlite3NotPureFunc(tls, pCtx) != 0 { rc = toLocaltime(tls, p, pCtx) } break } case 'u': { if Xsqlite3_stricmp(tls, z, ts+1253) == 0 && (*DateTime)(unsafe.Pointer(p)).FrawS != 0 { if idx > 1 { return 1 } *(*float64)(unsafe.Pointer(bp + 48)) = (*DateTime)(unsafe.Pointer(p)).Fs*1000.0 + 210866760000000.0 if *(*float64)(unsafe.Pointer(bp + 48)) >= 0.0 && *(*float64)(unsafe.Pointer(bp + 48)) < 464269060800000.0 { clearYMD_HMS_TZ(tls, p) (*DateTime)(unsafe.Pointer(p)).FiJD = libc.Int64FromFloat64(*(*float64)(unsafe.Pointer(bp + 48)) + 0.5) (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(1) (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) rc = 0 } } else if Xsqlite3_stricmp(tls, z, ts+1263) == 0 && Xsqlite3NotPureFunc(tls, pCtx) != 0 { if int32((*DateTime)(unsafe.Pointer(p)).FtzSet) == 0 { var iOrigJD I64 var iGuess I64 var cnt int32 = 0 var iErr I64 computeJD(tls, p) iGuess = libc.AssignInt64(&iOrigJD, (*DateTime)(unsafe.Pointer(p)).FiJD) iErr = int64(0) for __ccgo := true; __ccgo; __ccgo = iErr != 0 && libc.PostIncInt32(&cnt, 1) < 3 { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(DateTime{}))) iGuess = iGuess - iErr (*DateTime)(unsafe.Pointer(bp)).FiJD = iGuess (*DateTime)(unsafe.Pointer(bp)).FvalidJD = int8(1) rc = toLocaltime(tls, bp, pCtx) if rc != 0 { return rc } computeJD(tls, bp) iErr = (*DateTime)(unsafe.Pointer(bp)).FiJD - iOrigJD } libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(DateTime{}))) (*DateTime)(unsafe.Pointer(p)).FiJD = iGuess (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(1) (*DateTime)(unsafe.Pointer(p)).FtzSet = int8(1) } rc = SQLITE_OK } break } case 'w': { if Xsqlite3_strnicmp(tls, z, ts+1267, 8) == 0 && Xsqlite3AtoF(tls, z+8, bp+48, Xsqlite3Strlen30(tls, z+8), uint8(SQLITE_UTF8)) > 0 && *(*float64)(unsafe.Pointer(bp + 48)) >= 0.0 && *(*float64)(unsafe.Pointer(bp + 48)) < 7.0 && float64(libc.AssignInt32(&n, int32(*(*float64)(unsafe.Pointer(bp + 48))))) == *(*float64)(unsafe.Pointer(bp + 48)) { var Z Sqlite3_int64 computeYMD_HMS(tls, p) (*DateTime)(unsafe.Pointer(p)).FvalidTZ = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(0) computeJD(tls, p) Z = ((*DateTime)(unsafe.Pointer(p)).FiJD + int64(129600000)) / int64(86400000) % int64(7) if Z > Sqlite3_int64(n) { Z = Z - int64(7) } *(*Sqlite3_int64)(unsafe.Pointer(p)) += (Sqlite3_int64(n) - Z) * int64(86400000) clearYMD_HMS_TZ(tls, p) rc = 0 } break } case 's': { if Xsqlite3_strnicmp(tls, z, ts+1276, 9) != 0 { break } if !(int32((*DateTime)(unsafe.Pointer(p)).FvalidJD) != 0) && !(int32((*DateTime)(unsafe.Pointer(p)).FvalidYMD) != 0) && !(int32((*DateTime)(unsafe.Pointer(p)).FvalidHMS) != 0) { break } z += uintptr(9) computeYMD(tls, p) (*DateTime)(unsafe.Pointer(p)).FvalidHMS = int8(1) (*DateTime)(unsafe.Pointer(p)).Fh = libc.AssignPtrInt32(p+24, 0) (*DateTime)(unsafe.Pointer(p)).Fs = 0.0 (*DateTime)(unsafe.Pointer(p)).FrawS = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidTZ = int8(0) (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(0) if Xsqlite3_stricmp(tls, z, ts+1286) == 0 { (*DateTime)(unsafe.Pointer(p)).FD = 1 rc = 0 } else if Xsqlite3_stricmp(tls, z, ts+1292) == 0 { (*DateTime)(unsafe.Pointer(p)).FM = 1 (*DateTime)(unsafe.Pointer(p)).FD = 1 rc = 0 } else if Xsqlite3_stricmp(tls, z, ts+1297) == 0 { rc = 0 } break } case '+': fallthrough case '-': fallthrough case '0': fallthrough case '1': fallthrough case '2': fallthrough case '3': fallthrough case '4': fallthrough case '5': fallthrough case '6': fallthrough case '7': fallthrough case '8': fallthrough case '9': { var rRounder float64 var i int32 for n = 1; *(*int8)(unsafe.Pointer(z + uintptr(n))) != 0 && int32(*(*int8)(unsafe.Pointer(z + uintptr(n)))) != ':' && !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(n))))])&0x01 != 0); n++ { } if Xsqlite3AtoF(tls, z, bp+48, n, uint8(SQLITE_UTF8)) <= 0 { rc = 1 break } if int32(*(*int8)(unsafe.Pointer(z + uintptr(n)))) == ':' { var z2 uintptr = z var day Sqlite3_int64 if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z2)))])&0x04 != 0) { z2++ } libc.Xmemset(tls, bp+56, 0, uint64(unsafe.Sizeof(DateTime{}))) if parseHhMmSs(tls, z2, bp+56) != 0 { break } computeJD(tls, bp+56) *(*Sqlite3_int64)(unsafe.Pointer(bp + 56)) -= int64(43200000) day = (*DateTime)(unsafe.Pointer(bp+56)).FiJD / int64(86400000) *(*Sqlite3_int64)(unsafe.Pointer(bp + 56)) -= day * int64(86400000) if int32(*(*int8)(unsafe.Pointer(z))) == '-' { (*DateTime)(unsafe.Pointer(bp + 56)).FiJD = -(*DateTime)(unsafe.Pointer(bp + 56)).FiJD } computeJD(tls, p) clearYMD_HMS_TZ(tls, p) *(*Sqlite3_int64)(unsafe.Pointer(p)) += (*DateTime)(unsafe.Pointer(bp + 56)).FiJD rc = 0 break } z += uintptr(n) for int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x01 != 0 { z++ } n = Xsqlite3Strlen30(tls, z) if n > 10 || n < 3 { break } if int32(Xsqlite3UpperToLower[U8(*(*int8)(unsafe.Pointer(z + uintptr(n-1))))]) == 's' { n-- } computeJD(tls, p) rc = 1 if *(*float64)(unsafe.Pointer(bp + 48)) < float64(0) { rRounder = -0.5 } else { rRounder = +0.5 } for i = 0; i < int32(uint64(unsafe.Sizeof(aXformType))/uint64(unsafe.Sizeof(struct { FnName U8 FzName [7]int8 FrLimit float32 FrXform float32 }{}))); i++ { if int32(aXformType[i].FnName) == n && Xsqlite3_strnicmp(tls, uintptr(unsafe.Pointer(&aXformType))+uintptr(i)*16+1, z, n) == 0 && *(*float64)(unsafe.Pointer(bp + 48)) > float64(-aXformType[i].FrLimit) && *(*float64)(unsafe.Pointer(bp + 48)) < float64(aXformType[i].FrLimit) { switch i { case 4: { var x int32 computeYMD_HMS(tls, p) *(*int32)(unsafe.Pointer(p + 12)) += int32(*(*float64)(unsafe.Pointer(bp + 48))) if (*DateTime)(unsafe.Pointer(p)).FM > 0 { x = ((*DateTime)(unsafe.Pointer(p)).FM - 1) / 12 } else { x = ((*DateTime)(unsafe.Pointer(p)).FM - 12) / 12 } *(*int32)(unsafe.Pointer(p + 8)) += x *(*int32)(unsafe.Pointer(p + 12)) -= x * 12 (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(0) *(*float64)(unsafe.Pointer(bp + 48)) -= float64(int32(*(*float64)(unsafe.Pointer(bp + 48)))) break } fallthrough case 5: { var y int32 = int32(*(*float64)(unsafe.Pointer(bp + 48))) computeYMD_HMS(tls, p) *(*int32)(unsafe.Pointer(p + 8)) += y (*DateTime)(unsafe.Pointer(p)).FvalidJD = int8(0) *(*float64)(unsafe.Pointer(bp + 48)) -= float64(int32(*(*float64)(unsafe.Pointer(bp + 48)))) break } } computeJD(tls, p) *(*Sqlite3_int64)(unsafe.Pointer(p)) += libc.Int64FromFloat64(*(*float64)(unsafe.Pointer(bp + 48))*1000.0*float64(aXformType[i].FrXform) + rRounder) rc = 0 break } } clearYMD_HMS_TZ(tls, p) break } default: { break } } return rc } func isDate(tls *libc.TLS, context uintptr, argc int32, argv uintptr, p uintptr) int32 { var i int32 var n int32 var z uintptr var eType int32 libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(DateTime{}))) if argc == 0 { if !(Xsqlite3NotPureFunc(tls, context) != 0) { return 1 } return setDateTimeToCurrent(tls, context, p) } if libc.AssignInt32(&eType, Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv)))) == SQLITE_FLOAT || eType == SQLITE_INTEGER { setRawDateNumber(tls, p, Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv)))) } else { z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if !(z != 0) || parseDateOrTime(tls, context, z, p) != 0 { return 1 } } for i = 1; i < argc; i++ { z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) n = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) if z == uintptr(0) || parseModifier(tls, context, z, n, p, i) != 0 { return 1 } } computeJD(tls, p) if (*DateTime)(unsafe.Pointer(p)).FisError != 0 || !(validJulianDay(tls, (*DateTime)(unsafe.Pointer(p)).FiJD) != 0) { return 1 } return 0 } func juliandayFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(48) defer tls.Free(48) if isDate(tls, context, argc, argv, bp) == 0 { computeJD(tls, bp) Xsqlite3_result_double(tls, context, float64((*DateTime)(unsafe.Pointer(bp)).FiJD)/86400000.0) } } func unixepochFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(48) defer tls.Free(48) if isDate(tls, context, argc, argv, bp) == 0 { computeJD(tls, bp) Xsqlite3_result_int64(tls, context, (*DateTime)(unsafe.Pointer(bp)).FiJD/int64(1000)-int64(21086676)*int64(10000)) } } func datetimeFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(72) defer tls.Free(72) if isDate(tls, context, argc, argv, bp) == 0 { var Y int32 var s int32 computeYMD_HMS(tls, bp) Y = (*DateTime)(unsafe.Pointer(bp)).FY if Y < 0 { Y = -Y } *(*int8)(unsafe.Pointer(bp + 48 + 1)) = int8('0' + Y/1000%10) *(*int8)(unsafe.Pointer(bp + 48 + 2)) = int8('0' + Y/100%10) *(*int8)(unsafe.Pointer(bp + 48 + 3)) = int8('0' + Y/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 4)) = int8('0' + Y%10) *(*int8)(unsafe.Pointer(bp + 48 + 5)) = int8('-') *(*int8)(unsafe.Pointer(bp + 48 + 6)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FM/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 7)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FM%10) *(*int8)(unsafe.Pointer(bp + 48 + 8)) = int8('-') *(*int8)(unsafe.Pointer(bp + 48 + 9)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FD/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 10)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FD%10) *(*int8)(unsafe.Pointer(bp + 48 + 11)) = int8(' ') *(*int8)(unsafe.Pointer(bp + 48 + 12)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fh/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 13)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fh%10) *(*int8)(unsafe.Pointer(bp + 48 + 14)) = int8(':') *(*int8)(unsafe.Pointer(bp + 48 + 15)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fm/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 16)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fm%10) *(*int8)(unsafe.Pointer(bp + 48 + 17)) = int8(':') s = libc.Int32FromFloat64((*DateTime)(unsafe.Pointer(bp)).Fs) *(*int8)(unsafe.Pointer(bp + 48 + 18)) = int8('0' + s/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 19)) = int8('0' + s%10) *(*int8)(unsafe.Pointer(bp + 48 + 20)) = int8(0) if (*DateTime)(unsafe.Pointer(bp)).FY < 0 { *(*int8)(unsafe.Pointer(bp + 48)) = int8('-') Xsqlite3_result_text(tls, context, bp+48, 20, libc.UintptrFromInt32(-1)) } else { Xsqlite3_result_text(tls, context, bp+48+1, 19, libc.UintptrFromInt32(-1)) } } } func timeFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(64) defer tls.Free(64) if isDate(tls, context, argc, argv, bp) == 0 { var s int32 computeHMS(tls, bp) *(*int8)(unsafe.Pointer(bp + 48)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fh/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 1)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fh%10) *(*int8)(unsafe.Pointer(bp + 48 + 2)) = int8(':') *(*int8)(unsafe.Pointer(bp + 48 + 3)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fm/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 4)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).Fm%10) *(*int8)(unsafe.Pointer(bp + 48 + 5)) = int8(':') s = libc.Int32FromFloat64((*DateTime)(unsafe.Pointer(bp)).Fs) *(*int8)(unsafe.Pointer(bp + 48 + 6)) = int8('0' + s/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 7)) = int8('0' + s%10) *(*int8)(unsafe.Pointer(bp + 48 + 8)) = int8(0) Xsqlite3_result_text(tls, context, bp+48, 8, libc.UintptrFromInt32(-1)) } } func dateFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(64) defer tls.Free(64) if isDate(tls, context, argc, argv, bp) == 0 { var Y int32 computeYMD(tls, bp) Y = (*DateTime)(unsafe.Pointer(bp)).FY if Y < 0 { Y = -Y } *(*int8)(unsafe.Pointer(bp + 48 + 1)) = int8('0' + Y/1000%10) *(*int8)(unsafe.Pointer(bp + 48 + 2)) = int8('0' + Y/100%10) *(*int8)(unsafe.Pointer(bp + 48 + 3)) = int8('0' + Y/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 4)) = int8('0' + Y%10) *(*int8)(unsafe.Pointer(bp + 48 + 5)) = int8('-') *(*int8)(unsafe.Pointer(bp + 48 + 6)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FM/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 7)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FM%10) *(*int8)(unsafe.Pointer(bp + 48 + 8)) = int8('-') *(*int8)(unsafe.Pointer(bp + 48 + 9)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FD/10%10) *(*int8)(unsafe.Pointer(bp + 48 + 10)) = int8('0' + (*DateTime)(unsafe.Pointer(bp)).FD%10) *(*int8)(unsafe.Pointer(bp + 48 + 11)) = int8(0) if (*DateTime)(unsafe.Pointer(bp)).FY < 0 { *(*int8)(unsafe.Pointer(bp + 48)) = int8('-') Xsqlite3_result_text(tls, context, bp+48, 11, libc.UintptrFromInt32(-1)) } else { Xsqlite3_result_text(tls, context, bp+48+1, 10, libc.UintptrFromInt32(-1)) } } } func strftimeFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(216) defer tls.Free(216) var i Size_t var j Size_t var db uintptr var zFmt uintptr if argc == 0 { return } zFmt = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if zFmt == uintptr(0) || isDate(tls, context, argc-1, argv+uintptr(1)*8, bp+88) != 0 { return } db = Xsqlite3_context_db_handle(tls, context) Xsqlite3StrAccumInit(tls, bp+136, uintptr(0), uintptr(0), 0, *(*int32)(unsafe.Pointer(db + 136))) computeJD(tls, bp+88) computeYMD_HMS(tls, bp+88) for i = libc.AssignUint64(&j, uint64(0)); *(*int8)(unsafe.Pointer(zFmt + uintptr(i))) != 0; i++ { if int32(*(*int8)(unsafe.Pointer(zFmt + uintptr(i)))) != '%' { continue } if j < i { Xsqlite3_str_append(tls, bp+136, zFmt+uintptr(j), int32(i-j)) } i++ j = i + uint64(1) switch int32(*(*int8)(unsafe.Pointer(zFmt + uintptr(i)))) { case 'd': { Xsqlite3_str_appendf(tls, bp+136, ts+1301, libc.VaList(bp, (*DateTime)(unsafe.Pointer(bp+88)).FD)) break } case 'f': { var s float64 = (*DateTime)(unsafe.Pointer(bp + 88)).Fs if s > 59.999 { s = 59.999 } Xsqlite3_str_appendf(tls, bp+136, ts+1306, libc.VaList(bp+8, s)) break } case 'H': { Xsqlite3_str_appendf(tls, bp+136, ts+1301, libc.VaList(bp+16, (*DateTime)(unsafe.Pointer(bp+88)).Fh)) break } case 'W': fallthrough case 'j': { var nDay int32 *(*DateTime)(unsafe.Pointer(bp + 168)) = *(*DateTime)(unsafe.Pointer(bp + 88)) (*DateTime)(unsafe.Pointer(bp + 168)).FvalidJD = int8(0) (*DateTime)(unsafe.Pointer(bp + 168)).FM = 1 (*DateTime)(unsafe.Pointer(bp + 168)).FD = 1 computeJD(tls, bp+168) nDay = int32(((*DateTime)(unsafe.Pointer(bp+88)).FiJD - (*DateTime)(unsafe.Pointer(bp+168)).FiJD + int64(43200000)) / int64(86400000)) if int32(*(*int8)(unsafe.Pointer(zFmt + uintptr(i)))) == 'W' { var wd int32 wd = int32(((*DateTime)(unsafe.Pointer(bp+88)).FiJD + int64(43200000)) / int64(86400000) % int64(7)) Xsqlite3_str_appendf(tls, bp+136, ts+1301, libc.VaList(bp+24, (nDay+7-wd)/7)) } else { Xsqlite3_str_appendf(tls, bp+136, ts+1313, libc.VaList(bp+32, nDay+1)) } break } case 'J': { Xsqlite3_str_appendf(tls, bp+136, ts+1318, libc.VaList(bp+40, float64((*DateTime)(unsafe.Pointer(bp+88)).FiJD)/86400000.0)) break } case 'm': { Xsqlite3_str_appendf(tls, bp+136, ts+1301, libc.VaList(bp+48, (*DateTime)(unsafe.Pointer(bp+88)).FM)) break } case 'M': { Xsqlite3_str_appendf(tls, bp+136, ts+1301, libc.VaList(bp+56, (*DateTime)(unsafe.Pointer(bp+88)).Fm)) break } case 's': { var iS I64 = (*DateTime)(unsafe.Pointer(bp+88)).FiJD/int64(1000) - int64(21086676)*int64(10000) Xsqlite3_str_appendf(tls, bp+136, ts+1324, libc.VaList(bp+64, iS)) break } case 'S': { Xsqlite3_str_appendf(tls, bp+136, ts+1301, libc.VaList(bp+72, libc.Int32FromFloat64((*DateTime)(unsafe.Pointer(bp+88)).Fs))) break } case 'w': { Xsqlite3_str_appendchar(tls, bp+136, 1, int8(int32(int8(((*DateTime)(unsafe.Pointer(bp+88)).FiJD+int64(129600000))/int64(86400000)%int64(7)))+'0')) break } case 'Y': { Xsqlite3_str_appendf(tls, bp+136, ts+1329, libc.VaList(bp+80, (*DateTime)(unsafe.Pointer(bp+88)).FY)) break } case '%': { Xsqlite3_str_appendchar(tls, bp+136, 1, int8('%')) break } default: { Xsqlite3_str_reset(tls, bp+136) return } } } if j < i { Xsqlite3_str_append(tls, bp+136, zFmt+uintptr(j), int32(i-j)) } Xsqlite3ResultStrAccum(tls, context, bp+136) } func ctimeFunc(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { _ = NotUsed _ = NotUsed2 timeFunc(tls, context, 0, uintptr(0)) } func cdateFunc(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { _ = NotUsed _ = NotUsed2 dateFunc(tls, context, 0, uintptr(0)) } func ctimestampFunc(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { _ = NotUsed _ = NotUsed2 datetimeFunc(tls, context, 0, uintptr(0)) } // This function registered all of the above C functions as SQL // functions. This should be the only routine in this file with // external linkage. func Xsqlite3RegisterDateTimeFunctions(tls *libc.TLS) { Xsqlite3InsertBuiltinFuncs(tls, uintptr(unsafe.Pointer(&aDateTimeFuncs)), int32(uint64(unsafe.Sizeof(aDateTimeFuncs))/uint64(unsafe.Sizeof(FuncDef{})))) } var aDateTimeFuncs = [9]FuncDef{ {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FpUserData: 0, FxSFunc: 0, FzName: ts + 1233}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FpUserData: 0, FxSFunc: 0, FzName: ts + 1253}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FpUserData: 0, FxSFunc: 0, FzName: ts + 1334}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FpUserData: 0, FxSFunc: 0, FzName: ts + 1339}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FpUserData: 0, FxSFunc: 0, FzName: ts + 1344}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FpUserData: 0, FxSFunc: 0, FzName: ts + 1353}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 1362}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 1375}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 1393}} // The following routines are convenience wrappers around methods // of the sqlite3_file object. This is mostly just syntactic sugar. All // of this would be completely automatic if SQLite were coded using // C++ instead of plain old C. func Xsqlite3OsClose(tls *libc.TLS, pId uintptr) { if (*Sqlite3_file)(unsafe.Pointer(pId)).FpMethods != 0 { (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pId)).FpMethods)).FxClose})).f(tls, pId) (*Sqlite3_file)(unsafe.Pointer(pId)).FpMethods = uintptr(0) } } func Xsqlite3OsRead(tls *libc.TLS, id uintptr, pBuf uintptr, amt int32, offset I64) int32 { return (*struct { f func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxRead})).f(tls, id, pBuf, amt, offset) } func Xsqlite3OsWrite(tls *libc.TLS, id uintptr, pBuf uintptr, amt int32, offset I64) int32 { return (*struct { f func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxWrite})).f(tls, id, pBuf, amt, offset) } func Xsqlite3OsTruncate(tls *libc.TLS, id uintptr, size I64) int32 { return (*struct { f func(*libc.TLS, uintptr, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxTruncate})).f(tls, id, size) } func Xsqlite3OsSync(tls *libc.TLS, id uintptr, flags int32) int32 { if flags != 0 { return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxSync})).f(tls, id, flags) } return SQLITE_OK } func Xsqlite3OsFileSize(tls *libc.TLS, id uintptr, pSize uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxFileSize})).f(tls, id, pSize) } func Xsqlite3OsLock(tls *libc.TLS, id uintptr, lockType int32) int32 { return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxLock})).f(tls, id, lockType) } func Xsqlite3OsUnlock(tls *libc.TLS, id uintptr, lockType int32) int32 { return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxUnlock})).f(tls, id, lockType) } func Xsqlite3OsCheckReservedLock(tls *libc.TLS, id uintptr, pResOut uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxCheckReservedLock})).f(tls, id, pResOut) } // Use sqlite3OsFileControl() when we are doing something that might fail // and we need to know about the failures. Use sqlite3OsFileControlHint() // when simply tossing information over the wall to the VFS and we do not // really care if the VFS receives and understands the information since it // is only a hint and can be safely ignored. The sqlite3OsFileControlHint() // routine has no return value since the return value would be meaningless. func Xsqlite3OsFileControl(tls *libc.TLS, id uintptr, op int32, pArg uintptr) int32 { if (*Sqlite3_file)(unsafe.Pointer(id)).FpMethods == uintptr(0) { return SQLITE_NOTFOUND } return (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxFileControl})).f(tls, id, op, pArg) } func Xsqlite3OsFileControlHint(tls *libc.TLS, id uintptr, op int32, pArg uintptr) { if (*Sqlite3_file)(unsafe.Pointer(id)).FpMethods != 0 { (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxFileControl})).f(tls, id, op, pArg) } } func Xsqlite3OsSectorSize(tls *libc.TLS, id uintptr) int32 { var xSectorSize uintptr = (*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxSectorSize return func() int32 { if xSectorSize != 0 { return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xSectorSize})).f(tls, id) } return SQLITE_DEFAULT_SECTOR_SIZE }() } func Xsqlite3OsDeviceCharacteristics(tls *libc.TLS, id uintptr) int32 { if (*Sqlite3_file)(unsafe.Pointer(id)).FpMethods == uintptr(0) { return 0 } return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxDeviceCharacteristics})).f(tls, id) } func Xsqlite3OsShmLock(tls *libc.TLS, id uintptr, offset int32, n int32, flags int32) int32 { return (*struct { f func(*libc.TLS, uintptr, int32, int32, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxShmLock})).f(tls, id, offset, n, flags) } func Xsqlite3OsShmBarrier(tls *libc.TLS, id uintptr) { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxShmBarrier})).f(tls, id) } func Xsqlite3OsShmUnmap(tls *libc.TLS, id uintptr, deleteFlag int32) int32 { return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxShmUnmap})).f(tls, id, deleteFlag) } func Xsqlite3OsShmMap(tls *libc.TLS, id uintptr, iPage int32, pgsz int32, bExtend int32, pp uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, int32, int32, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxShmMap})).f(tls, id, iPage, pgsz, bExtend, pp) } // The real implementation of xFetch and xUnfetch func Xsqlite3OsFetch(tls *libc.TLS, id uintptr, iOff I64, iAmt int32, pp uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, Sqlite3_int64, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxFetch})).f(tls, id, iOff, iAmt, pp) } func Xsqlite3OsUnfetch(tls *libc.TLS, id uintptr, iOff I64, p uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, Sqlite3_int64, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods)).FxUnfetch})).f(tls, id, iOff, p) } // The next group of routines are convenience wrappers around the // VFS methods. func Xsqlite3OsOpen(tls *libc.TLS, pVfs uintptr, zPath uintptr, pFile uintptr, flags int32, pFlagsOut uintptr) int32 { var rc int32 rc = (*struct { f func(*libc.TLS, uintptr, Sqlite3_filename, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxOpen})).f(tls, pVfs, zPath, pFile, flags&0x1087f7f, pFlagsOut) return rc } func Xsqlite3OsDelete(tls *libc.TLS, pVfs uintptr, zPath uintptr, dirSync int32) int32 { if (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxDelete != uintptr(0) { return (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxDelete})).f(tls, pVfs, zPath, dirSync) } return SQLITE_OK } func Xsqlite3OsAccess(tls *libc.TLS, pVfs uintptr, zPath uintptr, flags int32, pResOut uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxAccess})).f(tls, pVfs, zPath, flags, pResOut) } func Xsqlite3OsFullPathname(tls *libc.TLS, pVfs uintptr, zPath uintptr, nPathOut int32, zPathOut uintptr) int32 { *(*int8)(unsafe.Pointer(zPathOut)) = int8(0) return (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxFullPathname})).f(tls, pVfs, zPath, nPathOut, zPathOut) } func Xsqlite3OsDlOpen(tls *libc.TLS, pVfs uintptr, zPath uintptr) uintptr { return (*struct { f func(*libc.TLS, uintptr, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxDlOpen})).f(tls, pVfs, zPath) } func Xsqlite3OsDlError(tls *libc.TLS, pVfs uintptr, nByte int32, zBufOut uintptr) { (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxDlError})).f(tls, pVfs, nByte, zBufOut) } func Xsqlite3OsDlSym(tls *libc.TLS, pVfs uintptr, pHdle uintptr, zSym uintptr) uintptr { return (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxDlSym})).f(tls, pVfs, pHdle, zSym) } func Xsqlite3OsDlClose(tls *libc.TLS, pVfs uintptr, pHandle uintptr) { (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxDlClose})).f(tls, pVfs, pHandle) } func Xsqlite3OsRandomness(tls *libc.TLS, pVfs uintptr, nByte int32, zBufOut uintptr) int32 { if Xsqlite3Config.FiPrngSeed != 0 { libc.Xmemset(tls, zBufOut, 0, uint64(nByte)) if nByte > int32(unsafe.Sizeof(uint32(0))) { nByte = int32(unsafe.Sizeof(uint32(0))) } libc.Xmemcpy(tls, zBufOut, uintptr(unsafe.Pointer(&Xsqlite3Config))+432, uint64(nByte)) return SQLITE_OK } else { return (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxRandomness})).f(tls, pVfs, nByte, zBufOut) } return int32(0) } func Xsqlite3OsSleep(tls *libc.TLS, pVfs uintptr, nMicro int32) int32 { return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxSleep})).f(tls, pVfs, nMicro) } func Xsqlite3OsGetLastError(tls *libc.TLS, pVfs uintptr) int32 { if (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxGetLastError != 0 { return (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxGetLastError})).f(tls, pVfs, 0, uintptr(0)) } return 0 } func Xsqlite3OsCurrentTimeInt64(tls *libc.TLS, pVfs uintptr, pTimeOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 if (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FiVersion >= 2 && (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxCurrentTimeInt64 != 0 { rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxCurrentTimeInt64})).f(tls, pVfs, pTimeOut) } else { rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxCurrentTime})).f(tls, pVfs, bp) *(*Sqlite3_int64)(unsafe.Pointer(pTimeOut)) = libc.Int64FromFloat64(*(*float64)(unsafe.Pointer(bp)) * 86400000.0) } return rc } func Xsqlite3OsOpenMalloc(tls *libc.TLS, pVfs uintptr, zFile uintptr, ppFile uintptr, flags int32, pOutFlags uintptr) int32 { var rc int32 var pFile uintptr pFile = Xsqlite3MallocZero(tls, uint64((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile)) if pFile != 0 { rc = Xsqlite3OsOpen(tls, pVfs, zFile, pFile, flags, pOutFlags) if rc != SQLITE_OK { Xsqlite3_free(tls, pFile) *(*uintptr)(unsafe.Pointer(ppFile)) = uintptr(0) } else { *(*uintptr)(unsafe.Pointer(ppFile)) = pFile } } else { *(*uintptr)(unsafe.Pointer(ppFile)) = uintptr(0) rc = SQLITE_NOMEM } return rc } func Xsqlite3OsCloseFree(tls *libc.TLS, pFile uintptr) { Xsqlite3OsClose(tls, pFile) Xsqlite3_free(tls, pFile) } // This function is a wrapper around the OS specific implementation of // sqlite3_os_init(). The purpose of the wrapper is to provide the // ability to simulate a malloc failure, so that the handling of an // error in sqlite3_os_init() by the upper layers can be tested. func Xsqlite3OsInit(tls *libc.TLS) int32 { var p uintptr = Xsqlite3_malloc(tls, 10) if p == uintptr(0) { return SQLITE_NOMEM } Xsqlite3_free(tls, p) return Xsqlite3_os_init(tls) } var vfsList uintptr = uintptr(0) // Locate a VFS by name. If no name is given, simply return the // first VFS on the list. func Xsqlite3_vfs_find(tls *libc.TLS, zVfs uintptr) uintptr { var pVfs uintptr = uintptr(0) var mutex uintptr var rc int32 = Xsqlite3_initialize(tls) if rc != 0 { return uintptr(0) } mutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, mutex) for pVfs = vfsList; pVfs != 0; pVfs = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpNext { if zVfs == uintptr(0) { break } if libc.Xstrcmp(tls, zVfs, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FzName) == 0 { break } } Xsqlite3_mutex_leave(tls, mutex) return pVfs } func vfsUnlink(tls *libc.TLS, pVfs uintptr) { if pVfs == uintptr(0) { } else if vfsList == pVfs { vfsList = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpNext } else if vfsList != 0 { var p uintptr = vfsList for (*Sqlite3_vfs)(unsafe.Pointer(p)).FpNext != 0 && (*Sqlite3_vfs)(unsafe.Pointer(p)).FpNext != pVfs { p = (*Sqlite3_vfs)(unsafe.Pointer(p)).FpNext } if (*Sqlite3_vfs)(unsafe.Pointer(p)).FpNext == pVfs { (*Sqlite3_vfs)(unsafe.Pointer(p)).FpNext = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpNext } } } // Register a VFS with the system. It is harmless to register the same // VFS multiple times. The new VFS becomes the default if makeDflt is // true. func Xsqlite3_vfs_register(tls *libc.TLS, pVfs uintptr, makeDflt int32) int32 { var mutex uintptr var rc int32 = Xsqlite3_initialize(tls) if rc != 0 { return rc } mutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, mutex) vfsUnlink(tls, pVfs) if makeDflt != 0 || vfsList == uintptr(0) { (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpNext = vfsList vfsList = pVfs } else { (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpNext = (*Sqlite3_vfs)(unsafe.Pointer(vfsList)).FpNext (*Sqlite3_vfs)(unsafe.Pointer(vfsList)).FpNext = pVfs } Xsqlite3_mutex_leave(tls, mutex) return SQLITE_OK } // Unregister a VFS so that it is no longer accessible. func Xsqlite3_vfs_unregister(tls *libc.TLS, pVfs uintptr) int32 { var mutex uintptr var rc int32 = Xsqlite3_initialize(tls) if rc != 0 { return rc } mutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, mutex) vfsUnlink(tls, pVfs) Xsqlite3_mutex_leave(tls, mutex) return SQLITE_OK } // Global variables. type BenignMallocHooks1 = struct { FxBenignBegin uintptr FxBenignEnd uintptr } // Global variables. type BenignMallocHooks = BenignMallocHooks1 var sqlite3Hooks = BenignMallocHooks1{} // Register hooks to call when sqlite3BeginBenignMalloc() and // sqlite3EndBenignMalloc() are called, respectively. func Xsqlite3BenignMallocHooks(tls *libc.TLS, xBenignBegin uintptr, xBenignEnd uintptr) { sqlite3Hooks.FxBenignBegin = xBenignBegin sqlite3Hooks.FxBenignEnd = xBenignEnd } // This (sqlite3EndBenignMalloc()) is called by SQLite code to indicate that // subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc() // indicates that subsequent malloc failures are non-benign. func Xsqlite3BeginBenignMalloc(tls *libc.TLS) { if sqlite3Hooks.FxBenignBegin != 0 { (*struct{ f func(*libc.TLS) })(unsafe.Pointer(&struct{ uintptr }{sqlite3Hooks.FxBenignBegin})).f(tls) } } func Xsqlite3EndBenignMalloc(tls *libc.TLS) { if sqlite3Hooks.FxBenignEnd != 0 { (*struct{ f func(*libc.TLS) })(unsafe.Pointer(&struct{ uintptr }{sqlite3Hooks.FxBenignEnd})).f(tls) } } func sqlite3MemMalloc(tls *libc.TLS, nByte int32) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr p = libc.Xmalloc(tls, uint64(nByte)) if p == uintptr(0) { Xsqlite3_log(tls, SQLITE_NOMEM, ts+1406, libc.VaList(bp, nByte)) } return p } func sqlite3MemFree(tls *libc.TLS, pPrior uintptr) { libc.Xfree(tls, pPrior) } func sqlite3MemSize(tls *libc.TLS, pPrior uintptr) int32 { return int32(libc.X_msize(tls, pPrior)) } func sqlite3MemRealloc(tls *libc.TLS, pPrior uintptr, nByte int32) uintptr { bp := tls.Alloc(16) defer tls.Free(16) var p uintptr = libc.Xrealloc(tls, pPrior, uint64(nByte)) if p == uintptr(0) { Xsqlite3_log(tls, SQLITE_NOMEM, ts+1444, libc.VaList(bp, libc.X_msize(tls, pPrior), nByte)) } return p } func sqlite3MemRoundup(tls *libc.TLS, n int32) int32 { return (n + 7) & libc.CplInt32(7) } func sqlite3MemInit(tls *libc.TLS, NotUsed uintptr) int32 { _ = NotUsed return SQLITE_OK } func sqlite3MemShutdown(tls *libc.TLS, NotUsed uintptr) { _ = NotUsed return } // This routine is the only routine in this file with external linkage. // // Populate the low-level memory allocation function pointers in // sqlite3GlobalConfig.m with pointers to the routines in this file. func Xsqlite3MemSetDefault(tls *libc.TLS) { bp := tls.Alloc(8) defer tls.Free(8) Xsqlite3_config(tls, SQLITE_CONFIG_MALLOC, libc.VaList(bp, uintptr(unsafe.Pointer(&defaultMethods)))) } var defaultMethods = Sqlite3_mem_methods{ FxMalloc: 0, FxFree: 0, FxRealloc: 0, FxSize: 0, FxRoundup: 0, FxInit: 0, FxShutdown: 0, } // Initialize the mutex system. func Xsqlite3MutexInit(tls *libc.TLS) int32 { var rc int32 = SQLITE_OK if !(int32(Xsqlite3Config.Fmutex.FxMutexAlloc) != 0) { var pFrom uintptr var pTo uintptr = uintptr(unsafe.Pointer(&Xsqlite3Config)) + 96 if Xsqlite3Config.FbCoreMutex != 0 { pFrom = Xsqlite3DefaultMutex(tls) } else { pFrom = Xsqlite3NoopMutex(tls) } (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexInit = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexInit (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexEnd = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexEnd (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexFree = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexFree (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexEnter = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexEnter (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexTry = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexTry (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexLeave = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexLeave (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexHeld = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexHeld (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexNotheld = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexNotheld (*Sqlite3_mutex_methods)(unsafe.Pointer(pTo)).FxMutexAlloc = (*Sqlite3_mutex_methods)(unsafe.Pointer(pFrom)).FxMutexAlloc } rc = (*struct{ f func(*libc.TLS) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexInit})).f(tls) return rc } // Shutdown the mutex system. This call frees resources allocated by // sqlite3MutexInit(). func Xsqlite3MutexEnd(tls *libc.TLS) int32 { var rc int32 = SQLITE_OK if Xsqlite3Config.Fmutex.FxMutexEnd != 0 { rc = (*struct{ f func(*libc.TLS) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexEnd})).f(tls) } return rc } // Retrieve a pointer to a static mutex or allocate a new dynamic one. func Xsqlite3_mutex_alloc(tls *libc.TLS, id int32) uintptr { if id <= SQLITE_MUTEX_RECURSIVE && Xsqlite3_initialize(tls) != 0 { return uintptr(0) } if id > SQLITE_MUTEX_RECURSIVE && Xsqlite3MutexInit(tls) != 0 { return uintptr(0) } return (*struct { f func(*libc.TLS, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexAlloc})).f(tls, id) } func Xsqlite3MutexAlloc(tls *libc.TLS, id int32) uintptr { if !(int32(Xsqlite3Config.FbCoreMutex) != 0) { return uintptr(0) } return (*struct { f func(*libc.TLS, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexAlloc})).f(tls, id) } // Free a dynamic mutex. func Xsqlite3_mutex_free(tls *libc.TLS, p uintptr) { if p != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexFree})).f(tls, p) } } // Obtain the mutex p. If some other thread already has the mutex, block // until it can be obtained. func Xsqlite3_mutex_enter(tls *libc.TLS, p uintptr) { if p != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexEnter})).f(tls, p) } } // Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another // thread holds the mutex and it cannot be obtained, return SQLITE_BUSY. func Xsqlite3_mutex_try(tls *libc.TLS, p uintptr) int32 { var rc int32 = SQLITE_OK if p != 0 { return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexTry})).f(tls, p) } return rc } // The sqlite3_mutex_leave() routine exits a mutex that was previously // entered by the same thread. The behavior is undefined if the mutex // is not currently entered. If a NULL pointer is passed as an argument // this function is a no-op. func Xsqlite3_mutex_leave(tls *libc.TLS, p uintptr) { if p != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fmutex.FxMutexLeave})).f(tls, p) } } func noopMutexInit(tls *libc.TLS) int32 { return SQLITE_OK } func noopMutexEnd(tls *libc.TLS) int32 { return SQLITE_OK } func noopMutexAlloc(tls *libc.TLS, id int32) uintptr { _ = id return uintptr(8) } func noopMutexFree(tls *libc.TLS, p uintptr) { _ = p return } func noopMutexEnter(tls *libc.TLS, p uintptr) { _ = p return } func noopMutexTry(tls *libc.TLS, p uintptr) int32 { _ = p return SQLITE_OK } func noopMutexLeave(tls *libc.TLS, p uintptr) { _ = p return } func Xsqlite3NoopMutex(tls *libc.TLS) uintptr { return uintptr(unsafe.Pointer(&sMutex)) } var sMutex = Sqlite3_mutex_methods{ FxMutexInit: 0, FxMutexEnd: 0, FxMutexAlloc: 0, FxMutexFree: 0, FxMutexEnter: 0, FxMutexTry: 0, FxMutexLeave: 0, } // If compiled with SQLITE_MUTEX_NOOP, then the no-op mutex implementation // is used regardless of the run-time threadsafety setting. func Xsqlite3DefaultMutex(tls *libc.TLS) uintptr { return Xsqlite3NoopMutex(tls) } type _EXCEPTION_POINTERS = struct { FExceptionRecord PEXCEPTION_RECORD FContextRecord PCONTEXT } type _EXCEPTION_RECORD = struct { FExceptionCode DWORD FExceptionFlags DWORD FExceptionRecord uintptr FExceptionAddress PVOID FNumberParameters DWORD F__ccgo_pad1 [4]byte FExceptionInformation [15]ULONG_PTR } type _CONTEXT = struct { FP1Home DWORD64 FP2Home DWORD64 FP3Home DWORD64 FP4Home DWORD64 FP5Home DWORD64 FP6Home DWORD64 FContextFlags DWORD FMxCsr DWORD FSegCs WORD FSegDs WORD FSegEs WORD FSegFs WORD FSegGs WORD FSegSs WORD FEFlags DWORD FDr0 DWORD64 FDr1 DWORD64 FDr2 DWORD64 FDr3 DWORD64 FDr6 DWORD64 FDr7 DWORD64 FRax DWORD64 FRcx DWORD64 FRdx DWORD64 FRbx DWORD64 FRsp DWORD64 FRbp DWORD64 FRsi DWORD64 FRdi DWORD64 FR8 DWORD64 FR9 DWORD64 FR10 DWORD64 FR11 DWORD64 FR12 DWORD64 FR13 DWORD64 FR14 DWORD64 FR15 DWORD64 FRip DWORD64 F__256 struct{ FFltSave XMM_SAVE_AREA32 } FVectorRegister [26]M128A FVectorControl DWORD64 FDebugControl DWORD64 FLastBranchToRip DWORD64 FLastBranchFromRip DWORD64 FLastExceptionToRip DWORD64 FLastExceptionFromRip DWORD64 } type _DISPATCHER_CONTEXT = struct { FControlPc ULONG64 FImageBase ULONG64 FFunctionEntry PRUNTIME_FUNCTION FEstablisherFrame ULONG64 FTargetIp ULONG64 FContextRecord PCONTEXT FLanguageHandler PEXCEPTION_ROUTINE FHandlerData PVOID FHistoryTable PUNWIND_HISTORY_TABLE FScopeIndex ULONG FFill0 ULONG } // CRT stuff type X_PHNDLR = uintptr type _XCPT_ACTION = struct { FXcptNum uint32 FSigNum int32 FXcptAction X_PHNDLR } // The type of function that is expected as an exception handler to be // installed with __try1. type PEXCEPTION_HANDLER = uintptr type ULONG = uint32 type PULONG = uintptr type USHORT = uint16 type PUSHORT = uintptr type UCHAR = uint8 type PUCHAR = uintptr type PSZ = uintptr type WINBOOL = int32 type BOOL = int32 type PBOOL = uintptr type LPBOOL = uintptr type BYTE = uint8 type WORD = uint16 type DWORD = uint32 type FLOAT = float32 type PFLOAT = uintptr type PBYTE = uintptr type LPBYTE = uintptr type PINT = uintptr type LPINT = uintptr type PWORD = uintptr type LPWORD = uintptr type LPLONG = uintptr type PDWORD = uintptr type LPDWORD = uintptr type LPVOID = uintptr type LPCVOID = uintptr type INT = int32 type UINT = uint32 type PUINT = uintptr type POINTER_64_INT = uint64 type INT8 = int8 type PINT8 = uintptr type INT16 = int16 type PINT16 = uintptr type INT32 = int32 type PINT32 = uintptr type INT64 = int64 type PINT64 = uintptr type UINT8 = uint8 type PUINT8 = uintptr type UINT16 = uint16 type PUINT16 = uintptr type UINT32 = uint32 type PUINT32 = uintptr type UINT64 = uint64 type PUINT64 = uintptr type LONG32 = int32 type PLONG32 = uintptr type ULONG32 = uint32 type PULONG32 = uintptr type DWORD32 = uint32 type PDWORD32 = uintptr type INT_PTR = int64 type PINT_PTR = uintptr type UINT_PTR = uint64 type PUINT_PTR = uintptr type LONG_PTR = int64 type PLONG_PTR = uintptr type ULONG_PTR = uint64 type PULONG_PTR = uintptr type SHANDLE_PTR = int64 type HANDLE_PTR = uint64 type UHALF_PTR = uint32 type PUHALF_PTR = uintptr type HALF_PTR = int32 type PHALF_PTR = uintptr type SIZE_T = ULONG_PTR type PSIZE_T = uintptr type SSIZE_T = LONG_PTR type PSSIZE_T = uintptr type DWORD_PTR = ULONG_PTR type PDWORD_PTR = uintptr type LONG64 = int64 type PLONG64 = uintptr type ULONG64 = uint64 type PULONG64 = uintptr type DWORD64 = uint64 type PDWORD64 = uintptr type KAFFINITY = ULONG_PTR type PKAFFINITY = uintptr type PVOID = uintptr type PVOID64 = uintptr type CHAR = int8 type SHORT = int16 type LONG = int32 type WCHAR = Wchar_t type PWCHAR = uintptr type LPWCH = uintptr type PWCH = uintptr type LPCWCH = uintptr type PCWCH = uintptr type NWPSTR = uintptr type LPWSTR = uintptr type PWSTR = uintptr type PZPWSTR = uintptr type PCZPWSTR = uintptr type LPUWSTR = uintptr type PUWSTR = uintptr type LPCWSTR = uintptr type PCWSTR = uintptr type PZPCWSTR = uintptr type LPCUWSTR = uintptr type PCUWSTR = uintptr type PZZWSTR = uintptr type PCZZWSTR = uintptr type PUZZWSTR = uintptr type PCUZZWSTR = uintptr type PNZWCH = uintptr type PCNZWCH = uintptr type PUNZWCH = uintptr type PCUNZWCH = uintptr type PCHAR = uintptr type LPCH = uintptr type PCH = uintptr type LPCCH = uintptr type PCCH = uintptr type NPSTR = uintptr type LPSTR = uintptr type PSTR = uintptr type PZPSTR = uintptr type PCZPSTR = uintptr type LPCSTR = uintptr type PCSTR = uintptr type PZPCSTR = uintptr type PZZSTR = uintptr type PCZZSTR = uintptr type PNZCH = uintptr type PCNZCH = uintptr type TCHAR = int8 type PTCHAR = uintptr type TBYTE = uint8 type PTBYTE = uintptr type LPTCH = LPSTR type PTCH = LPSTR type LPCTCH = LPCCH type PCTCH = LPCCH type PTSTR = LPSTR type LPTSTR = LPSTR type PUTSTR = LPSTR type LPUTSTR = LPSTR type PCTSTR = LPCSTR type LPCTSTR = LPCSTR type PCUTSTR = LPCSTR type LPCUTSTR = LPCSTR type PZZTSTR = PZZSTR type PUZZTSTR = PZZSTR type PCZZTSTR = PCZZSTR type PCUZZTSTR = PCZZSTR type PZPTSTR = PZPSTR type PNZTCH = PNZCH type PUNZTCH = PNZCH type PCNZTCH = PCNZCH type PCUNZTCH = PCNZCH type PSHORT = uintptr type PLONG = uintptr type _GROUP_AFFINITY = struct { FMask KAFFINITY FGroup WORD FReserved [3]WORD } type GROUP_AFFINITY = _GROUP_AFFINITY type PGROUP_AFFINITY = uintptr type HANDLE = uintptr type PHANDLE = uintptr type FCHAR = BYTE type FSHORT = WORD type FLONG = DWORD type HRESULT = LONG type CCHAR = int8 type LCID = DWORD type PLCID = PDWORD type LANGID = WORD type COMPARTMENT_ID = uint32 type PCOMPARTMENT_ID = uintptr type _FLOAT128 = struct { FLowPart int64 FHighPart int64 } type FLOAT128 = _FLOAT128 type PFLOAT128 = uintptr type LONGLONG = int64 type ULONGLONG = uint64 type PLONGLONG = uintptr type PULONGLONG = uintptr type USN = LONGLONG type _LARGE_INTEGER = struct { F__ccgo_pad1 [0]uint64 Fs struct { FLowPart DWORD FHighPart LONG } } type LARGE_INTEGER = _LARGE_INTEGER type PLARGE_INTEGER = uintptr type _ULARGE_INTEGER = struct { F__ccgo_pad1 [0]uint64 Fs struct { FLowPart DWORD FHighPart DWORD } } type ULARGE_INTEGER = _ULARGE_INTEGER type PULARGE_INTEGER = uintptr type _LUID = struct { FLowPart DWORD FHighPart LONG } type LUID = _LUID type PLUID = uintptr type DWORDLONG = ULONGLONG type PDWORDLONG = uintptr type BOOLEAN = BYTE type PBOOLEAN = uintptr type _LIST_ENTRY = struct { FFlink uintptr FBlink uintptr } type LIST_ENTRY = _LIST_ENTRY type PLIST_ENTRY = uintptr type PRLIST_ENTRY = uintptr type _SINGLE_LIST_ENTRY = struct{ FNext uintptr } type SINGLE_LIST_ENTRY = _SINGLE_LIST_ENTRY type PSINGLE_LIST_ENTRY = uintptr type LIST_ENTRY321 = struct { FFlink DWORD FBlink DWORD } type LIST_ENTRY32 = LIST_ENTRY321 type PLIST_ENTRY32 = uintptr type LIST_ENTRY641 = struct { FFlink ULONGLONG FBlink ULONGLONG } type LIST_ENTRY64 = LIST_ENTRY641 type PLIST_ENTRY64 = uintptr type _GUID = struct { FData1 uint32 FData2 uint16 FData3 uint16 FData4 [8]uint8 } type GUID = _GUID type LPGUID = uintptr type LPCGUID = uintptr type IID = GUID type LPIID = uintptr type CLSID = GUID type LPCLSID = uintptr type FMTID = GUID type LPFMTID = uintptr type _OBJECTID = struct { FLineage GUID FUniquifier DWORD } type OBJECTID = _OBJECTID type PEXCEPTION_ROUTINE = uintptr type KSPIN_LOCK = ULONG_PTR type PKSPIN_LOCK = uintptr type _M128A = struct { FLow ULONGLONG FHigh LONGLONG } type M128A = _M128A type PM128A = uintptr type _XSAVE_FORMAT = struct { FControlWord WORD FStatusWord WORD FTagWord BYTE FReserved1 BYTE FErrorOpcode WORD FErrorOffset DWORD FErrorSelector WORD FReserved2 WORD FDataOffset DWORD FDataSelector WORD FReserved3 WORD FMxCsr DWORD FMxCsr_Mask DWORD FFloatRegisters [8]M128A FXmmRegisters [16]M128A FReserved4 [96]BYTE } type XSAVE_FORMAT = _XSAVE_FORMAT type PXSAVE_FORMAT = uintptr type _XSAVE_AREA_HEADER = struct { FMask DWORD64 FReserved [7]DWORD64 } type XSAVE_AREA_HEADER = _XSAVE_AREA_HEADER type PXSAVE_AREA_HEADER = uintptr type _XSAVE_AREA = struct { FLegacyState XSAVE_FORMAT FHeader XSAVE_AREA_HEADER } type XSAVE_AREA = _XSAVE_AREA type PXSAVE_AREA = uintptr type _XSTATE_CONTEXT = struct { FMask DWORD64 FLength DWORD FReserved1 DWORD FArea PXSAVE_AREA FBuffer PVOID } type XSTATE_CONTEXT = _XSTATE_CONTEXT type PXSTATE_CONTEXT = uintptr type _SCOPE_TABLE_AMD64 = struct { FCount DWORD FScopeRecord [1]struct { FBeginAddress DWORD FEndAddress DWORD FHandlerAddress DWORD FJumpTarget DWORD } } type SCOPE_TABLE_AMD64 = _SCOPE_TABLE_AMD64 type PSCOPE_TABLE_AMD64 = uintptr type _XMM_SAVE_AREA32 = struct { FControlWord WORD FStatusWord WORD FTagWord BYTE FReserved1 BYTE FErrorOpcode WORD FErrorOffset DWORD FErrorSelector WORD FReserved2 WORD FDataOffset DWORD FDataSelector WORD FReserved3 WORD FMxCsr DWORD FMxCsr_Mask DWORD FFloatRegisters [8]M128A FXmmRegisters [16]M128A FReserved4 [96]BYTE } type XMM_SAVE_AREA32 = _XMM_SAVE_AREA32 type PXMM_SAVE_AREA32 = uintptr type CONTEXT = _CONTEXT type PCONTEXT = uintptr type _RUNTIME_FUNCTION = struct { FBeginAddress DWORD FEndAddress DWORD FUnwindData DWORD } type RUNTIME_FUNCTION = _RUNTIME_FUNCTION type PRUNTIME_FUNCTION = uintptr type PGET_RUNTIME_FUNCTION_CALLBACK = uintptr type POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK = uintptr type _LDT_ENTRY = struct { FLimitLow WORD FBaseLow WORD FHighWord struct { F__ccgo_pad1 [0]uint32 FBytes struct { FBaseMid BYTE FFlags1 BYTE FFlags2 BYTE FBaseHi BYTE } } } type LDT_ENTRY = _LDT_ENTRY type PLDT_ENTRY = uintptr type EXCEPTION_RECORD = _EXCEPTION_RECORD type PEXCEPTION_RECORD = uintptr type _EXCEPTION_RECORD32 = struct { FExceptionCode DWORD FExceptionFlags DWORD FExceptionRecord DWORD FExceptionAddress DWORD FNumberParameters DWORD FExceptionInformation [15]DWORD } type EXCEPTION_RECORD32 = _EXCEPTION_RECORD32 type PEXCEPTION_RECORD32 = uintptr type _EXCEPTION_RECORD64 = struct { FExceptionCode DWORD FExceptionFlags DWORD FExceptionRecord DWORD64 FExceptionAddress DWORD64 FNumberParameters DWORD F__unusedAlignment DWORD FExceptionInformation [15]DWORD64 } type EXCEPTION_RECORD64 = _EXCEPTION_RECORD64 type PEXCEPTION_RECORD64 = uintptr type EXCEPTION_POINTERS = _EXCEPTION_POINTERS type PEXCEPTION_POINTERS = uintptr type _UNWIND_HISTORY_TABLE_ENTRY = struct { FImageBase ULONG64 FFunctionEntry PRUNTIME_FUNCTION } type UNWIND_HISTORY_TABLE_ENTRY = _UNWIND_HISTORY_TABLE_ENTRY type PUNWIND_HISTORY_TABLE_ENTRY = uintptr type _UNWIND_HISTORY_TABLE = struct { FCount ULONG FLocalHint BYTE FGlobalHint BYTE FSearch BYTE FOnce BYTE FLowAddress ULONG64 FHighAddress ULONG64 FEntry [12]UNWIND_HISTORY_TABLE_ENTRY } type UNWIND_HISTORY_TABLE = _UNWIND_HISTORY_TABLE type PUNWIND_HISTORY_TABLE = uintptr type DISPATCHER_CONTEXT = _DISPATCHER_CONTEXT type PDISPATCHER_CONTEXT = uintptr type _KNONVOLATILE_CONTEXT_POINTERS = struct { FFloatingContext [16]PM128A FIntegerContext [16]PULONG64 } type KNONVOLATILE_CONTEXT_POINTERS = _KNONVOLATILE_CONTEXT_POINTERS type PKNONVOLATILE_CONTEXT_POINTERS = uintptr type PACCESS_TOKEN = PVOID type PSECURITY_DESCRIPTOR = PVOID type PSID = PVOID type PCLAIMS_BLOB = PVOID type ACCESS_MASK = DWORD type PACCESS_MASK = uintptr type _GENERIC_MAPPING = struct { FGenericRead ACCESS_MASK FGenericWrite ACCESS_MASK FGenericExecute ACCESS_MASK FGenericAll ACCESS_MASK } type GENERIC_MAPPING = _GENERIC_MAPPING type PGENERIC_MAPPING = uintptr type _LUID_AND_ATTRIBUTES = struct { FLuid LUID FAttributes DWORD } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type LUID_AND_ATTRIBUTES = _LUID_AND_ATTRIBUTES type PLUID_AND_ATTRIBUTES = uintptr type LUID_AND_ATTRIBUTES_ARRAY = [1]LUID_AND_ATTRIBUTES type PLUID_AND_ATTRIBUTES_ARRAY = uintptr type _SID_IDENTIFIER_AUTHORITY = struct{ FValue [6]BYTE } type SID_IDENTIFIER_AUTHORITY = _SID_IDENTIFIER_AUTHORITY type PSID_IDENTIFIER_AUTHORITY = uintptr type _SID = struct { FRevision BYTE FSubAuthorityCount BYTE FIdentifierAuthority SID_IDENTIFIER_AUTHORITY FSubAuthority [1]DWORD } type SID = _SID type PISID = uintptr type SID_NAME_USE = uint32 type PSID_NAME_USE = uintptr type _SID_AND_ATTRIBUTES = struct { FSid PSID FAttributes DWORD F__ccgo_pad1 [4]byte } type SID_AND_ATTRIBUTES = _SID_AND_ATTRIBUTES type PSID_AND_ATTRIBUTES = uintptr type SID_AND_ATTRIBUTES_ARRAY = [1]SID_AND_ATTRIBUTES type PSID_AND_ATTRIBUTES_ARRAY = uintptr type SID_HASH_ENTRY = ULONG_PTR type PSID_HASH_ENTRY = uintptr type _SID_AND_ATTRIBUTES_HASH = struct { FSidCount DWORD F__ccgo_pad1 [4]byte FSidAttr PSID_AND_ATTRIBUTES FHash [32]SID_HASH_ENTRY } type SID_AND_ATTRIBUTES_HASH = _SID_AND_ATTRIBUTES_HASH type PSID_AND_ATTRIBUTES_HASH = uintptr type WELL_KNOWN_SID_TYPE = uint32 type _ACL = struct { FAclRevision BYTE FSbz1 BYTE FAclSize WORD FAceCount WORD FSbz2 WORD } type ACL = _ACL type PACL = uintptr type _ACE_HEADER = struct { FAceType BYTE FAceFlags BYTE FAceSize WORD } type ACE_HEADER = _ACE_HEADER type PACE_HEADER = uintptr type _ACCESS_ALLOWED_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type ACCESS_ALLOWED_ACE = _ACCESS_ALLOWED_ACE type PACCESS_ALLOWED_ACE = uintptr type _ACCESS_DENIED_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type ACCESS_DENIED_ACE = _ACCESS_DENIED_ACE type PACCESS_DENIED_ACE = uintptr type _SYSTEM_AUDIT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type SYSTEM_AUDIT_ACE = _SYSTEM_AUDIT_ACE type PSYSTEM_AUDIT_ACE = uintptr type _SYSTEM_ALARM_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type SYSTEM_ALARM_ACE = _SYSTEM_ALARM_ACE type PSYSTEM_ALARM_ACE = uintptr type _SYSTEM_RESOURCE_ATTRIBUTE_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type SYSTEM_RESOURCE_ATTRIBUTE_ACE = _SYSTEM_RESOURCE_ATTRIBUTE_ACE type PSYSTEM_RESOURCE_ATTRIBUTE_ACE = uintptr type _SYSTEM_SCOPED_POLICY_ID_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type SYSTEM_SCOPED_POLICY_ID_ACE = _SYSTEM_SCOPED_POLICY_ID_ACE type PSYSTEM_SCOPED_POLICY_ID_ACE = uintptr type _SYSTEM_MANDATORY_LABEL_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type SYSTEM_MANDATORY_LABEL_ACE = _SYSTEM_MANDATORY_LABEL_ACE type PSYSTEM_MANDATORY_LABEL_ACE = uintptr type _ACCESS_ALLOWED_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type ACCESS_ALLOWED_OBJECT_ACE = _ACCESS_ALLOWED_OBJECT_ACE type PACCESS_ALLOWED_OBJECT_ACE = uintptr type _ACCESS_DENIED_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type ACCESS_DENIED_OBJECT_ACE = _ACCESS_DENIED_OBJECT_ACE type PACCESS_DENIED_OBJECT_ACE = uintptr type _SYSTEM_AUDIT_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type SYSTEM_AUDIT_OBJECT_ACE = _SYSTEM_AUDIT_OBJECT_ACE type PSYSTEM_AUDIT_OBJECT_ACE = uintptr type _SYSTEM_ALARM_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type SYSTEM_ALARM_OBJECT_ACE = _SYSTEM_ALARM_OBJECT_ACE type PSYSTEM_ALARM_OBJECT_ACE = uintptr type _ACCESS_ALLOWED_CALLBACK_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type ACCESS_ALLOWED_CALLBACK_ACE = _ACCESS_ALLOWED_CALLBACK_ACE type PACCESS_ALLOWED_CALLBACK_ACE = uintptr type _ACCESS_DENIED_CALLBACK_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type ACCESS_DENIED_CALLBACK_ACE = _ACCESS_DENIED_CALLBACK_ACE type PACCESS_DENIED_CALLBACK_ACE = uintptr type _SYSTEM_AUDIT_CALLBACK_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type SYSTEM_AUDIT_CALLBACK_ACE = _SYSTEM_AUDIT_CALLBACK_ACE type PSYSTEM_AUDIT_CALLBACK_ACE = uintptr type _SYSTEM_ALARM_CALLBACK_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FSidStart DWORD } type SYSTEM_ALARM_CALLBACK_ACE = _SYSTEM_ALARM_CALLBACK_ACE type PSYSTEM_ALARM_CALLBACK_ACE = uintptr type _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type ACCESS_ALLOWED_CALLBACK_OBJECT_ACE = _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE type PACCESS_ALLOWED_CALLBACK_OBJECT_ACE = uintptr type _ACCESS_DENIED_CALLBACK_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type ACCESS_DENIED_CALLBACK_OBJECT_ACE = _ACCESS_DENIED_CALLBACK_OBJECT_ACE type PACCESS_DENIED_CALLBACK_OBJECT_ACE = uintptr type _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type SYSTEM_AUDIT_CALLBACK_OBJECT_ACE = _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE type PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE = uintptr type _SYSTEM_ALARM_CALLBACK_OBJECT_ACE = struct { FHeader ACE_HEADER FMask ACCESS_MASK FFlags DWORD FObjectType GUID FInheritedObjectType GUID FSidStart DWORD } type SYSTEM_ALARM_CALLBACK_OBJECT_ACE = _SYSTEM_ALARM_CALLBACK_OBJECT_ACE type PSYSTEM_ALARM_CALLBACK_OBJECT_ACE = uintptr type ACL_INFORMATION_CLASS = uint32 type _ACL_REVISION_INFORMATION = struct{ FAclRevision DWORD } type ACL_REVISION_INFORMATION = _ACL_REVISION_INFORMATION type PACL_REVISION_INFORMATION = uintptr type _ACL_SIZE_INFORMATION = struct { FAceCount DWORD FAclBytesInUse DWORD FAclBytesFree DWORD } type ACL_SIZE_INFORMATION = _ACL_SIZE_INFORMATION type PACL_SIZE_INFORMATION = uintptr type SECURITY_DESCRIPTOR_CONTROL = WORD type PSECURITY_DESCRIPTOR_CONTROL = uintptr type _SECURITY_DESCRIPTOR_RELATIVE = struct { FRevision BYTE FSbz1 BYTE FControl SECURITY_DESCRIPTOR_CONTROL FOwner DWORD FGroup DWORD FSacl DWORD FDacl DWORD } type SECURITY_DESCRIPTOR_RELATIVE = _SECURITY_DESCRIPTOR_RELATIVE type PISECURITY_DESCRIPTOR_RELATIVE = uintptr type _SECURITY_DESCRIPTOR = struct { FRevision BYTE FSbz1 BYTE FControl SECURITY_DESCRIPTOR_CONTROL F__ccgo_pad1 [4]byte FOwner PSID FGroup PSID FSacl PACL FDacl PACL } type SECURITY_DESCRIPTOR = _SECURITY_DESCRIPTOR type PISECURITY_DESCRIPTOR = uintptr type _OBJECT_TYPE_LIST = struct { FLevel WORD FSbz WORD F__ccgo_pad1 [4]byte FObjectType uintptr } type OBJECT_TYPE_LIST = _OBJECT_TYPE_LIST type POBJECT_TYPE_LIST = uintptr type AUDIT_EVENT_TYPE = uint32 type PAUDIT_EVENT_TYPE = uintptr type _PRIVILEGE_SET = struct { FPrivilegeCount DWORD FControl DWORD FPrivilege [1]LUID_AND_ATTRIBUTES } type PRIVILEGE_SET = _PRIVILEGE_SET type PPRIVILEGE_SET = uintptr type ACCESS_REASON_TYPE = uint32 type ACCESS_REASON = DWORD type _ACCESS_REASONS = struct{ FData [32]ACCESS_REASON } type ACCESS_REASONS = _ACCESS_REASONS type PACCESS_REASONS = uintptr type _SE_SECURITY_DESCRIPTOR = struct { FSize DWORD FFlags DWORD FSecurityDescriptor PSECURITY_DESCRIPTOR } type SE_SECURITY_DESCRIPTOR = _SE_SECURITY_DESCRIPTOR type PSE_SECURITY_DESCRIPTOR = uintptr type _SE_ACCESS_REQUEST = struct { FSize DWORD F__ccgo_pad1 [4]byte FSeSecurityDescriptor PSE_SECURITY_DESCRIPTOR FDesiredAccess ACCESS_MASK FPreviouslyGrantedAccess ACCESS_MASK FPrincipalSelfSid PSID FGenericMapping PGENERIC_MAPPING FObjectTypeListCount DWORD F__ccgo_pad2 [4]byte FObjectTypeList POBJECT_TYPE_LIST } type SE_ACCESS_REQUEST = _SE_ACCESS_REQUEST type PSE_ACCESS_REQUEST = uintptr type _SE_ACCESS_REPLY = struct { FSize DWORD FResultListCount DWORD FGrantedAccess PACCESS_MASK FAccessStatus PDWORD FAccessReason PACCESS_REASONS FPrivileges uintptr } type SE_ACCESS_REPLY = _SE_ACCESS_REPLY type PSE_ACCESS_REPLY = uintptr type SECURITY_IMPERSONATION_LEVEL = uint32 type PSECURITY_IMPERSONATION_LEVEL = uintptr type TOKEN_TYPE = uint32 type PTOKEN_TYPE = uintptr type TOKEN_ELEVATION_TYPE = uint32 type PTOKEN_ELEVATION_TYPE = uintptr type TOKEN_INFORMATION_CLASS = uint32 type PTOKEN_INFORMATION_CLASS = uintptr type _TOKEN_USER = struct{ FUser SID_AND_ATTRIBUTES } type TOKEN_USER = _TOKEN_USER type PTOKEN_USER = uintptr type _TOKEN_GROUPS = struct { FGroupCount DWORD F__ccgo_pad1 [4]byte FGroups [1]SID_AND_ATTRIBUTES } type TOKEN_GROUPS = _TOKEN_GROUPS type PTOKEN_GROUPS = uintptr type _TOKEN_PRIVILEGES = struct { FPrivilegeCount DWORD FPrivileges [1]LUID_AND_ATTRIBUTES } type TOKEN_PRIVILEGES = _TOKEN_PRIVILEGES type PTOKEN_PRIVILEGES = uintptr type _TOKEN_OWNER = struct{ FOwner PSID } type TOKEN_OWNER = _TOKEN_OWNER type PTOKEN_OWNER = uintptr type _TOKEN_PRIMARY_GROUP = struct{ FPrimaryGroup PSID } type TOKEN_PRIMARY_GROUP = _TOKEN_PRIMARY_GROUP type PTOKEN_PRIMARY_GROUP = uintptr type _TOKEN_DEFAULT_DACL = struct{ FDefaultDacl PACL } type TOKEN_DEFAULT_DACL = _TOKEN_DEFAULT_DACL type PTOKEN_DEFAULT_DACL = uintptr type _TOKEN_USER_CLAIMS = struct{ FUserClaims PCLAIMS_BLOB } type TOKEN_USER_CLAIMS = _TOKEN_USER_CLAIMS type PTOKEN_USER_CLAIMS = uintptr type _TOKEN_DEVICE_CLAIMS = struct{ FDeviceClaims PCLAIMS_BLOB } type TOKEN_DEVICE_CLAIMS = _TOKEN_DEVICE_CLAIMS type PTOKEN_DEVICE_CLAIMS = uintptr type _TOKEN_GROUPS_AND_PRIVILEGES = struct { FSidCount DWORD FSidLength DWORD FSids PSID_AND_ATTRIBUTES FRestrictedSidCount DWORD FRestrictedSidLength DWORD FRestrictedSids PSID_AND_ATTRIBUTES FPrivilegeCount DWORD FPrivilegeLength DWORD FPrivileges PLUID_AND_ATTRIBUTES FAuthenticationId LUID } type TOKEN_GROUPS_AND_PRIVILEGES = _TOKEN_GROUPS_AND_PRIVILEGES type PTOKEN_GROUPS_AND_PRIVILEGES = uintptr type _TOKEN_LINKED_TOKEN = struct{ FLinkedToken HANDLE } type TOKEN_LINKED_TOKEN = _TOKEN_LINKED_TOKEN type PTOKEN_LINKED_TOKEN = uintptr type _TOKEN_ELEVATION = struct{ FTokenIsElevated DWORD } type TOKEN_ELEVATION = _TOKEN_ELEVATION type PTOKEN_ELEVATION = uintptr type _TOKEN_MANDATORY_LABEL = struct{ FLabel SID_AND_ATTRIBUTES } type TOKEN_MANDATORY_LABEL = _TOKEN_MANDATORY_LABEL type PTOKEN_MANDATORY_LABEL = uintptr type _TOKEN_MANDATORY_POLICY = struct{ FPolicy DWORD } type TOKEN_MANDATORY_POLICY = _TOKEN_MANDATORY_POLICY type PTOKEN_MANDATORY_POLICY = uintptr type _TOKEN_ACCESS_INFORMATION = struct { FSidHash PSID_AND_ATTRIBUTES_HASH FRestrictedSidHash PSID_AND_ATTRIBUTES_HASH FPrivileges PTOKEN_PRIVILEGES FAuthenticationId LUID FTokenType TOKEN_TYPE FImpersonationLevel SECURITY_IMPERSONATION_LEVEL FMandatoryPolicy TOKEN_MANDATORY_POLICY FFlags DWORD FAppContainerNumber DWORD F__ccgo_pad1 [4]byte FPackageSid PSID FCapabilitiesHash PSID_AND_ATTRIBUTES_HASH } type TOKEN_ACCESS_INFORMATION = _TOKEN_ACCESS_INFORMATION type PTOKEN_ACCESS_INFORMATION = uintptr type _TOKEN_AUDIT_POLICY = struct{ FPerUserPolicy [29]UCHAR } type TOKEN_AUDIT_POLICY = _TOKEN_AUDIT_POLICY type PTOKEN_AUDIT_POLICY = uintptr type _TOKEN_SOURCE = struct { FSourceName [8]CHAR FSourceIdentifier LUID } type TOKEN_SOURCE = _TOKEN_SOURCE type PTOKEN_SOURCE = uintptr type _TOKEN_STATISTICS = struct { FTokenId LUID FAuthenticationId LUID FExpirationTime LARGE_INTEGER FTokenType TOKEN_TYPE FImpersonationLevel SECURITY_IMPERSONATION_LEVEL FDynamicCharged DWORD FDynamicAvailable DWORD FGroupCount DWORD FPrivilegeCount DWORD FModifiedId LUID } type TOKEN_STATISTICS = _TOKEN_STATISTICS type PTOKEN_STATISTICS = uintptr type _TOKEN_CONTROL = struct { FTokenId LUID FAuthenticationId LUID FModifiedId LUID FTokenSource TOKEN_SOURCE } type TOKEN_CONTROL = _TOKEN_CONTROL type PTOKEN_CONTROL = uintptr type _TOKEN_ORIGIN = struct{ FOriginatingLogonSession LUID } type TOKEN_ORIGIN = _TOKEN_ORIGIN type PTOKEN_ORIGIN = uintptr type MANDATORY_LEVEL = uint32 type PMANDATORY_LEVEL = uintptr type _TOKEN_APPCONTAINER_INFORMATION = struct{ FTokenAppContainer PSID } type TOKEN_APPCONTAINER_INFORMATION = _TOKEN_APPCONTAINER_INFORMATION type PTOKEN_APPCONTAINER_INFORMATION = uintptr type _CLAIM_SECURITY_ATTRIBUTE_FQBN_VALUE = struct { FVersion DWORD64 FName PWSTR } type CLAIM_SECURITY_ATTRIBUTE_FQBN_VALUE = _CLAIM_SECURITY_ATTRIBUTE_FQBN_VALUE type PCLAIM_SECURITY_ATTRIBUTE_FQBN_VALUE = uintptr type _CLAIM_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE = struct { FpValue PVOID FValueLength DWORD F__ccgo_pad1 [4]byte } type CLAIM_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE = _CLAIM_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE type PCLAIM_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE = uintptr type _CLAIM_SECURITY_ATTRIBUTE_V1 = struct { FName PWSTR FValueType WORD FReserved WORD FFlags DWORD FValueCount DWORD F__ccgo_pad1 [4]byte FValues struct{ FpInt64 PLONG64 } } type CLAIM_SECURITY_ATTRIBUTE_V1 = _CLAIM_SECURITY_ATTRIBUTE_V1 type PCLAIM_SECURITY_ATTRIBUTE_V1 = uintptr type _CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 = struct { FName DWORD FValueType WORD FReserved WORD FFlags DWORD FValueCount DWORD FValues struct{ FpInt64 [1]DWORD } } type CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 = _CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 type PCLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 = uintptr type _CLAIM_SECURITY_ATTRIBUTES_INFORMATION = struct { FVersion WORD FReserved WORD FAttributeCount DWORD FAttribute struct{ FpAttributeV1 PCLAIM_SECURITY_ATTRIBUTE_V1 } } type CLAIM_SECURITY_ATTRIBUTES_INFORMATION = _CLAIM_SECURITY_ATTRIBUTES_INFORMATION type PCLAIM_SECURITY_ATTRIBUTES_INFORMATION = uintptr type SECURITY_CONTEXT_TRACKING_MODE = BOOLEAN type PSECURITY_CONTEXT_TRACKING_MODE = uintptr type _SECURITY_QUALITY_OF_SERVICE = struct { FLength DWORD FImpersonationLevel SECURITY_IMPERSONATION_LEVEL FContextTrackingMode SECURITY_CONTEXT_TRACKING_MODE FEffectiveOnly BOOLEAN F__ccgo_pad1 [2]byte } type SECURITY_QUALITY_OF_SERVICE = _SECURITY_QUALITY_OF_SERVICE type PSECURITY_QUALITY_OF_SERVICE = uintptr type _SE_IMPERSONATION_STATE = struct { FToken PACCESS_TOKEN FCopyOnOpen BOOLEAN FEffectiveOnly BOOLEAN F__ccgo_pad1 [2]byte FLevel SECURITY_IMPERSONATION_LEVEL } type SE_IMPERSONATION_STATE = _SE_IMPERSONATION_STATE type PSE_IMPERSONATION_STATE = uintptr type SECURITY_INFORMATION = DWORD type PSECURITY_INFORMATION = uintptr type SE_LEARNING_MODE_DATA_TYPE = uint32 type _SECURITY_CAPABILITIES = struct { FAppContainerSid PSID FCapabilities PSID_AND_ATTRIBUTES FCapabilityCount DWORD FReserved DWORD } type SECURITY_CAPABILITIES = _SECURITY_CAPABILITIES type PSECURITY_CAPABILITIES = uintptr type LPSECURITY_CAPABILITIES = uintptr type _JOB_SET_ARRAY = struct { FJobHandle HANDLE FMemberLevel DWORD FFlags DWORD } type JOB_SET_ARRAY = _JOB_SET_ARRAY type PJOB_SET_ARRAY = uintptr type _EXCEPTION_REGISTRATION_RECORD = struct { F__0 struct{ FNext uintptr } F__8 struct{ FHandler PEXCEPTION_ROUTINE } } type EXCEPTION_REGISTRATION_RECORD = _EXCEPTION_REGISTRATION_RECORD type PEXCEPTION_REGISTRATION_RECORD = uintptr type EXCEPTION_REGISTRATION = EXCEPTION_REGISTRATION_RECORD type PEXCEPTION_REGISTRATION = PEXCEPTION_REGISTRATION_RECORD type _NT_TIB = struct { FExceptionList uintptr FStackBase PVOID FStackLimit PVOID FSubSystemTib PVOID F__32 struct{ FFiberData PVOID } FArbitraryUserPointer PVOID FSelf uintptr } type NT_TIB = _NT_TIB type PNT_TIB = uintptr type _NT_TIB32 = struct { FExceptionList DWORD FStackBase DWORD FStackLimit DWORD FSubSystemTib DWORD F__16 struct{ FFiberData DWORD } FArbitraryUserPointer DWORD FSelf DWORD } type NT_TIB32 = _NT_TIB32 type PNT_TIB32 = uintptr type _NT_TIB64 = struct { FExceptionList DWORD64 FStackBase DWORD64 FStackLimit DWORD64 FSubSystemTib DWORD64 F__32 struct{ FFiberData DWORD64 } FArbitraryUserPointer DWORD64 FSelf DWORD64 } type NT_TIB64 = _NT_TIB64 type PNT_TIB64 = uintptr type _UMS_CREATE_THREAD_ATTRIBUTES = struct { FUmsVersion DWORD F__ccgo_pad1 [4]byte FUmsContext PVOID FUmsCompletionList PVOID } type UMS_CREATE_THREAD_ATTRIBUTES = _UMS_CREATE_THREAD_ATTRIBUTES type PUMS_CREATE_THREAD_ATTRIBUTES = uintptr type _QUOTA_LIMITS = struct { FPagedPoolLimit SIZE_T FNonPagedPoolLimit SIZE_T FMinimumWorkingSetSize SIZE_T FMaximumWorkingSetSize SIZE_T FPagefileLimit SIZE_T FTimeLimit LARGE_INTEGER } type QUOTA_LIMITS = _QUOTA_LIMITS type PQUOTA_LIMITS = uintptr type _RATE_QUOTA_LIMIT = struct{ FRateData DWORD } type RATE_QUOTA_LIMIT = _RATE_QUOTA_LIMIT type PRATE_QUOTA_LIMIT = uintptr type _QUOTA_LIMITS_EX = struct { FPagedPoolLimit SIZE_T FNonPagedPoolLimit SIZE_T FMinimumWorkingSetSize SIZE_T FMaximumWorkingSetSize SIZE_T FPagefileLimit SIZE_T FTimeLimit LARGE_INTEGER FWorkingSetLimit SIZE_T FReserved2 SIZE_T FReserved3 SIZE_T FReserved4 SIZE_T FFlags DWORD FCpuRateLimit RATE_QUOTA_LIMIT } type QUOTA_LIMITS_EX = _QUOTA_LIMITS_EX type PQUOTA_LIMITS_EX = uintptr type _IO_COUNTERS = struct { FReadOperationCount ULONGLONG FWriteOperationCount ULONGLONG FOtherOperationCount ULONGLONG FReadTransferCount ULONGLONG FWriteTransferCount ULONGLONG FOtherTransferCount ULONGLONG } type IO_COUNTERS = _IO_COUNTERS type PIO_COUNTERS = uintptr type HARDWARE_COUNTER_TYPE = uint32 type PHARDWARE_COUNTER_TYPE = uintptr type PROCESS_MITIGATION_POLICY = uint32 type PPROCESS_MITIGATION_POLICY = uintptr type _PROCESS_MITIGATION_ASLR_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_ASLR_POLICY = _PROCESS_MITIGATION_ASLR_POLICY type PPROCESS_MITIGATION_ASLR_POLICY = uintptr type _PROCESS_MITIGATION_DEP_POLICY = struct { F__0 struct{ FFlags DWORD } FPermanent BOOLEAN F__ccgo_pad1 [3]byte } type PROCESS_MITIGATION_DEP_POLICY = _PROCESS_MITIGATION_DEP_POLICY type PPROCESS_MITIGATION_DEP_POLICY = uintptr type _PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY = _PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY type PPROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY = uintptr type _PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY = _PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY type PPROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY = uintptr type _PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY = _PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY type PPROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY = uintptr type _PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY = _PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY type PPROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY = uintptr type _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY = _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY type PPROCESS_MITIGATION_BINARY_SIGNATURE_POLICY = uintptr type _PROCESS_MITIGATION_DYNAMIC_CODE_POLICY = struct { F__0 struct { FFlags DWORD F__ccgo_pad1 [4]byte } } type PROCESS_MITIGATION_DYNAMIC_CODE_POLICY = _PROCESS_MITIGATION_DYNAMIC_CODE_POLICY type PPROCESS_MITIGATION_DYNAMIC_CODE_POLICY = uintptr type _PROCESS_MITIGATION_FONT_DISABLE_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_FONT_DISABLE_POLICY = _PROCESS_MITIGATION_FONT_DISABLE_POLICY type PPROCESS_MITIGATION_FONT_DISABLE_POLICY = uintptr type _PROCESS_MITIGATION_IMAGE_LOAD_POLICY = struct{ F__0 struct{ FFlags DWORD } } type PROCESS_MITIGATION_IMAGE_LOAD_POLICY = _PROCESS_MITIGATION_IMAGE_LOAD_POLICY type PPROCESS_MITIGATION_IMAGE_LOAD_POLICY = uintptr type _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION = struct { FTotalUserTime LARGE_INTEGER FTotalKernelTime LARGE_INTEGER FThisPeriodTotalUserTime LARGE_INTEGER FThisPeriodTotalKernelTime LARGE_INTEGER FTotalPageFaultCount DWORD FTotalProcesses DWORD FActiveProcesses DWORD FTotalTerminatedProcesses DWORD } type JOBOBJECT_BASIC_ACCOUNTING_INFORMATION = _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION type PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION = uintptr type _JOBOBJECT_BASIC_LIMIT_INFORMATION = struct { FPerProcessUserTimeLimit LARGE_INTEGER FPerJobUserTimeLimit LARGE_INTEGER FLimitFlags DWORD F__ccgo_pad1 [4]byte FMinimumWorkingSetSize SIZE_T FMaximumWorkingSetSize SIZE_T FActiveProcessLimit DWORD F__ccgo_pad2 [4]byte FAffinity ULONG_PTR FPriorityClass DWORD FSchedulingClass DWORD } type JOBOBJECT_BASIC_LIMIT_INFORMATION = _JOBOBJECT_BASIC_LIMIT_INFORMATION type PJOBOBJECT_BASIC_LIMIT_INFORMATION = uintptr type _JOBOBJECT_EXTENDED_LIMIT_INFORMATION = struct { FBasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION FIoInfo IO_COUNTERS FProcessMemoryLimit SIZE_T FJobMemoryLimit SIZE_T FPeakProcessMemoryUsed SIZE_T FPeakJobMemoryUsed SIZE_T } type JOBOBJECT_EXTENDED_LIMIT_INFORMATION = _JOBOBJECT_EXTENDED_LIMIT_INFORMATION type PJOBOBJECT_EXTENDED_LIMIT_INFORMATION = uintptr type _JOBOBJECT_BASIC_PROCESS_ID_LIST = struct { FNumberOfAssignedProcesses DWORD FNumberOfProcessIdsInList DWORD FProcessIdList [1]ULONG_PTR } type JOBOBJECT_BASIC_PROCESS_ID_LIST = _JOBOBJECT_BASIC_PROCESS_ID_LIST type PJOBOBJECT_BASIC_PROCESS_ID_LIST = uintptr type _JOBOBJECT_BASIC_UI_RESTRICTIONS = struct{ FUIRestrictionsClass DWORD } type JOBOBJECT_BASIC_UI_RESTRICTIONS = _JOBOBJECT_BASIC_UI_RESTRICTIONS type PJOBOBJECT_BASIC_UI_RESTRICTIONS = uintptr type _JOBOBJECT_SECURITY_LIMIT_INFORMATION = struct { FSecurityLimitFlags DWORD F__ccgo_pad1 [4]byte FJobToken HANDLE FSidsToDisable PTOKEN_GROUPS FPrivilegesToDelete PTOKEN_PRIVILEGES FRestrictedSids PTOKEN_GROUPS } type JOBOBJECT_SECURITY_LIMIT_INFORMATION = _JOBOBJECT_SECURITY_LIMIT_INFORMATION type PJOBOBJECT_SECURITY_LIMIT_INFORMATION = uintptr type _JOBOBJECT_END_OF_JOB_TIME_INFORMATION = struct{ FEndOfJobTimeAction DWORD } type JOBOBJECT_END_OF_JOB_TIME_INFORMATION = _JOBOBJECT_END_OF_JOB_TIME_INFORMATION type PJOBOBJECT_END_OF_JOB_TIME_INFORMATION = uintptr type _JOBOBJECT_ASSOCIATE_COMPLETION_PORT = struct { FCompletionKey PVOID FCompletionPort HANDLE } type JOBOBJECT_ASSOCIATE_COMPLETION_PORT = _JOBOBJECT_ASSOCIATE_COMPLETION_PORT type PJOBOBJECT_ASSOCIATE_COMPLETION_PORT = uintptr type _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION = struct { FBasicInfo JOBOBJECT_BASIC_ACCOUNTING_INFORMATION FIoInfo IO_COUNTERS } type JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION = _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION type PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION = uintptr type _JOBOBJECT_JOBSET_INFORMATION = struct{ FMemberLevel DWORD } type JOBOBJECT_JOBSET_INFORMATION = _JOBOBJECT_JOBSET_INFORMATION type PJOBOBJECT_JOBSET_INFORMATION = uintptr type JOBOBJECT_RATE_CONTROL_TOLERANCE = uint32 type JOBOBJECT_RATE_CONTROL_TOLERANCE_INTERVAL = uint32 type _JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION = struct { FIoReadBytesLimit DWORD64 FIoWriteBytesLimit DWORD64 FPerJobUserTimeLimit LARGE_INTEGER FJobMemoryLimit DWORD64 FRateControlTolerance JOBOBJECT_RATE_CONTROL_TOLERANCE FRateControlToleranceInterval JOBOBJECT_RATE_CONTROL_TOLERANCE_INTERVAL FLimitFlags DWORD F__ccgo_pad1 [4]byte } type JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION = _JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION type PJOBOBJECT_NOTIFICATION_LIMIT_INFORMATION = uintptr type _JOBOBJECT_LIMIT_VIOLATION_INFORMATION = struct { FLimitFlags DWORD FViolationLimitFlags DWORD FIoReadBytes DWORD64 FIoReadBytesLimit DWORD64 FIoWriteBytes DWORD64 FIoWriteBytesLimit DWORD64 FPerJobUserTime LARGE_INTEGER FPerJobUserTimeLimit LARGE_INTEGER FJobMemory DWORD64 FJobMemoryLimit DWORD64 FRateControlTolerance JOBOBJECT_RATE_CONTROL_TOLERANCE FRateControlToleranceLimit JOBOBJECT_RATE_CONTROL_TOLERANCE_INTERVAL } type JOBOBJECT_LIMIT_VIOLATION_INFORMATION = _JOBOBJECT_LIMIT_VIOLATION_INFORMATION type PJOBOBJECT_LIMIT_VIOLATION_INFORMATION = uintptr type _JOBOBJECT_CPU_RATE_CONTROL_INFORMATION = struct { FControlFlags DWORD F__4 struct{ FCpuRate DWORD } } type JOBOBJECT_CPU_RATE_CONTROL_INFORMATION = _JOBOBJECT_CPU_RATE_CONTROL_INFORMATION type PJOBOBJECT_CPU_RATE_CONTROL_INFORMATION = uintptr type JOBOBJECTINFOCLASS = uint32 type FIRMWARE_TYPE = uint32 type PFIRMWARE_TYPE = uintptr type LOGICAL_PROCESSOR_RELATIONSHIP = uint32 type PROCESSOR_CACHE_TYPE = uint32 type _CACHE_DESCRIPTOR = struct { FLevel BYTE FAssociativity BYTE FLineSize WORD FSize DWORD FType PROCESSOR_CACHE_TYPE } type CACHE_DESCRIPTOR = _CACHE_DESCRIPTOR type PCACHE_DESCRIPTOR = uintptr type _SYSTEM_LOGICAL_PROCESSOR_INFORMATION = struct { FProcessorMask ULONG_PTR FRelationship LOGICAL_PROCESSOR_RELATIONSHIP F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FProcessorCore struct{ FFlags BYTE } F__ccgo_pad2 [15]byte } } type SYSTEM_LOGICAL_PROCESSOR_INFORMATION = _SYSTEM_LOGICAL_PROCESSOR_INFORMATION type PSYSTEM_LOGICAL_PROCESSOR_INFORMATION = uintptr type _PROCESSOR_RELATIONSHIP = struct { FFlags BYTE FReserved [21]BYTE FGroupCount WORD FGroupMask [1]GROUP_AFFINITY } type PROCESSOR_RELATIONSHIP = _PROCESSOR_RELATIONSHIP type PPROCESSOR_RELATIONSHIP = uintptr type _NUMA_NODE_RELATIONSHIP = struct { FNodeNumber DWORD FReserved [20]BYTE FGroupMask GROUP_AFFINITY } type NUMA_NODE_RELATIONSHIP = _NUMA_NODE_RELATIONSHIP type PNUMA_NODE_RELATIONSHIP = uintptr type _CACHE_RELATIONSHIP = struct { FLevel BYTE FAssociativity BYTE FLineSize WORD FCacheSize DWORD FType PROCESSOR_CACHE_TYPE FReserved [20]BYTE FGroupMask GROUP_AFFINITY } type CACHE_RELATIONSHIP = _CACHE_RELATIONSHIP type PCACHE_RELATIONSHIP = uintptr type _PROCESSOR_GROUP_INFO = struct { FMaximumProcessorCount BYTE FActiveProcessorCount BYTE FReserved [38]BYTE FActiveProcessorMask KAFFINITY } type PROCESSOR_GROUP_INFO = _PROCESSOR_GROUP_INFO type PPROCESSOR_GROUP_INFO = uintptr type _GROUP_RELATIONSHIP = struct { FMaximumGroupCount WORD FActiveGroupCount WORD FReserved [20]BYTE FGroupInfo [1]PROCESSOR_GROUP_INFO } type GROUP_RELATIONSHIP = _GROUP_RELATIONSHIP type PGROUP_RELATIONSHIP = uintptr type _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX = struct { FRelationship LOGICAL_PROCESSOR_RELATIONSHIP FSize DWORD Fu struct { FProcessor PROCESSOR_RELATIONSHIP F__ccgo_pad1 [32]byte } } type SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX = _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX type PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX = uintptr type _SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION = struct{ FCycleTime DWORD64 } type SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION = _SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION type PSYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION = uintptr type _XSTATE_FEATURE = struct { FOffset DWORD FSize DWORD } type XSTATE_FEATURE = _XSTATE_FEATURE type PXSTATE_FEATURE = uintptr type _XSTATE_CONFIGURATION = struct { FEnabledFeatures DWORD64 FEnabledVolatileFeatures DWORD64 FSize DWORD FOptimizedSave uint8 F__ccgo_pad1 [3]byte FFeatures [64]XSTATE_FEATURE } type XSTATE_CONFIGURATION = _XSTATE_CONFIGURATION type PXSTATE_CONFIGURATION = uintptr type _MEMORY_BASIC_INFORMATION = struct { FBaseAddress PVOID FAllocationBase PVOID FAllocationProtect DWORD F__ccgo_pad1 [4]byte FRegionSize SIZE_T FState DWORD FProtect DWORD FType DWORD F__ccgo_pad2 [4]byte } type MEMORY_BASIC_INFORMATION = _MEMORY_BASIC_INFORMATION type PMEMORY_BASIC_INFORMATION = uintptr type _MEMORY_BASIC_INFORMATION32 = struct { FBaseAddress DWORD FAllocationBase DWORD FAllocationProtect DWORD FRegionSize DWORD FState DWORD FProtect DWORD FType DWORD } type MEMORY_BASIC_INFORMATION32 = _MEMORY_BASIC_INFORMATION32 type PMEMORY_BASIC_INFORMATION32 = uintptr type _MEMORY_BASIC_INFORMATION64 = struct { FBaseAddress ULONGLONG FAllocationBase ULONGLONG FAllocationProtect DWORD F__alignment1 DWORD FRegionSize ULONGLONG FState DWORD FProtect DWORD FType DWORD F__alignment2 DWORD } type MEMORY_BASIC_INFORMATION64 = _MEMORY_BASIC_INFORMATION64 type PMEMORY_BASIC_INFORMATION64 = uintptr type _CFG_CALL_TARGET_INFO = struct { FOffset ULONG_PTR FFlags ULONG_PTR } type CFG_CALL_TARGET_INFO = _CFG_CALL_TARGET_INFO type PCFG_CALL_TARGET_INFO = uintptr type _MEM_ADDRESS_REQUIREMENTS = struct { FLowestStartingAddress PVOID FHighestEndingAddress PVOID FAlignment SIZE_T } type MEM_ADDRESS_REQUIREMENTS = _MEM_ADDRESS_REQUIREMENTS type PMEM_ADDRESS_REQUIREMENTS = uintptr type MEM_EXTENDED_PARAMETER_TYPE = uint32 type PMEM_EXTENDED_PARAMETER_TYPE = uintptr type MEM_EXTENDED_PARAMETER1 = struct { F__0 struct { F__ccgo_pad1 [0]uint64 FType uint64 } F__8 struct{ FULong64 DWORD64 } } type MEM_EXTENDED_PARAMETER = MEM_EXTENDED_PARAMETER1 type PMEM_EXTENDED_PARAMETER = uintptr type MEM_SECTION_EXTENDED_PARAMETER_TYPE = uint32 type PMEM_SECTION_EXTENDED_PARAMETER_TYPE = uintptr type FILE_ID_1281 = struct{ FIdentifier [16]BYTE } type FILE_ID_128 = FILE_ID_1281 type PFILE_ID_128 = uintptr type _FILE_NOTIFY_INFORMATION = struct { FNextEntryOffset DWORD FAction DWORD FFileNameLength DWORD FFileName [1]WCHAR F__ccgo_pad1 [2]byte } type FILE_NOTIFY_INFORMATION = _FILE_NOTIFY_INFORMATION type PFILE_NOTIFY_INFORMATION = uintptr type _FILE_SEGMENT_ELEMENT = struct{ FBuffer PVOID64 } type FILE_SEGMENT_ELEMENT = _FILE_SEGMENT_ELEMENT type PFILE_SEGMENT_ELEMENT = uintptr type _REPARSE_GUID_DATA_BUFFER = struct { FReparseTag DWORD FReparseDataLength WORD FReserved WORD FReparseGuid GUID FGenericReparseBuffer struct{ FDataBuffer [1]BYTE } F__ccgo_pad1 [3]byte } type REPARSE_GUID_DATA_BUFFER = _REPARSE_GUID_DATA_BUFFER type PREPARSE_GUID_DATA_BUFFER = uintptr type SYSTEM_POWER_STATE = uint32 type PSYSTEM_POWER_STATE = uintptr type POWER_ACTION = uint32 type PPOWER_ACTION = uintptr type DEVICE_POWER_STATE = uint32 type PDEVICE_POWER_STATE = uintptr type MONITOR_DISPLAY_STATE = uint32 type PMONITOR_DISPLAY_STATE = uintptr type USER_ACTIVITY_PRESENCE = uint32 type PUSER_ACTIVITY_PRESENCE = uintptr type EXECUTION_STATE = DWORD type PEXECUTION_STATE = uintptr type LATENCY_TIME = uint32 type POWER_REQUEST_TYPE = uint32 type PPOWER_REQUEST_TYPE = uintptr type CM_Power_Data_s = struct { FPD_Size DWORD FPD_MostRecentPowerState DEVICE_POWER_STATE FPD_Capabilities DWORD FPD_D1Latency DWORD FPD_D2Latency DWORD FPD_D3Latency DWORD FPD_PowerStateMapping [7]DEVICE_POWER_STATE FPD_DeepestSystemWake SYSTEM_POWER_STATE } type CM_POWER_DATA = CM_Power_Data_s type PCM_POWER_DATA = uintptr type POWER_INFORMATION_LEVEL = uint32 type POWER_USER_PRESENCE_TYPE = uint32 type PPOWER_USER_PRESENCE_TYPE = uintptr type _POWER_USER_PRESENCE = struct{ FUserPresence POWER_USER_PRESENCE_TYPE } type POWER_USER_PRESENCE = _POWER_USER_PRESENCE type PPOWER_USER_PRESENCE = uintptr type _POWER_SESSION_CONNECT = struct { FConnected BOOLEAN FConsole BOOLEAN } type POWER_SESSION_CONNECT = _POWER_SESSION_CONNECT type PPOWER_SESSION_CONNECT = uintptr type _POWER_SESSION_TIMEOUTS = struct { FInputTimeout DWORD FDisplayTimeout DWORD } type POWER_SESSION_TIMEOUTS = _POWER_SESSION_TIMEOUTS type PPOWER_SESSION_TIMEOUTS = uintptr type _POWER_SESSION_RIT_STATE = struct { FActive BOOLEAN F__ccgo_pad1 [3]byte FLastInputTime DWORD } type POWER_SESSION_RIT_STATE = _POWER_SESSION_RIT_STATE type PPOWER_SESSION_RIT_STATE = uintptr type _POWER_SESSION_WINLOGON = struct { FSessionId DWORD FConsole BOOLEAN FLocked BOOLEAN F__ccgo_pad1 [2]byte } type POWER_SESSION_WINLOGON = _POWER_SESSION_WINLOGON type PPOWER_SESSION_WINLOGON = uintptr type _POWER_IDLE_RESILIENCY = struct { FCoalescingTimeout DWORD FIdleResiliencyPeriod DWORD } type POWER_IDLE_RESILIENCY = _POWER_IDLE_RESILIENCY type PPOWER_IDLE_RESILIENCY = uintptr type POWER_MONITOR_REQUEST_REASON = uint32 type _POWER_MONITOR_INVOCATION = struct { FOn BOOLEAN FConsole BOOLEAN F__ccgo_pad1 [2]byte FRequestReason POWER_MONITOR_REQUEST_REASON } type POWER_MONITOR_INVOCATION = _POWER_MONITOR_INVOCATION type PPOWER_MONITOR_INVOCATION = uintptr type _RESUME_PERFORMANCE = struct { FPostTimeMs DWORD F__ccgo_pad1 [4]byte FTotalResumeTimeMs ULONGLONG FResumeCompleteTimestamp ULONGLONG } type RESUME_PERFORMANCE = _RESUME_PERFORMANCE type PRESUME_PERFORMANCE = uintptr type SYSTEM_POWER_CONDITION = uint32 type SET_POWER_SETTING_VALUE = struct { FVersion DWORD FGuid GUID FPowerCondition SYSTEM_POWER_CONDITION FDataLength DWORD FData [1]BYTE F__ccgo_pad1 [3]byte } type PSET_POWER_SETTING_VALUE = uintptr type NOTIFY_USER_POWER_SETTING = struct{ FGuid GUID } type PNOTIFY_USER_POWER_SETTING = uintptr type _APPLICATIONLAUNCH_SETTING_VALUE = struct { FActivationTime LARGE_INTEGER FFlags DWORD FButtonInstanceID DWORD } type APPLICATIONLAUNCH_SETTING_VALUE = _APPLICATIONLAUNCH_SETTING_VALUE type PAPPLICATIONLAUNCH_SETTING_VALUE = uintptr type POWER_PLATFORM_ROLE = uint32 type PPOWER_PLATFORM_ROLE = uintptr type _POWER_PLATFORM_INFORMATION = struct{ FAoAc BOOLEAN } type POWER_PLATFORM_INFORMATION = _POWER_PLATFORM_INFORMATION type PPOWER_PLATFORM_INFORMATION = uintptr type BATTERY_REPORTING_SCALE = struct { FGranularity DWORD FCapacity DWORD } type PBATTERY_REPORTING_SCALE = uintptr type PPM_WMI_LEGACY_PERFSTATE = struct { FFrequency DWORD FFlags DWORD FPercentFrequency DWORD } type PPPM_WMI_LEGACY_PERFSTATE = uintptr type PPM_WMI_IDLE_STATE = struct { FLatency DWORD FPower DWORD FTimeCheck DWORD FPromotePercent BYTE FDemotePercent BYTE FStateType BYTE FReserved BYTE FStateFlags DWORD FContext DWORD FIdleHandler DWORD FReserved1 DWORD } type PPPM_WMI_IDLE_STATE = uintptr type PPM_WMI_IDLE_STATES = struct { FType DWORD FCount DWORD FTargetState DWORD FOldState DWORD FTargetProcessors DWORD64 FState [1]PPM_WMI_IDLE_STATE } type PPPM_WMI_IDLE_STATES = uintptr type PPM_WMI_IDLE_STATES_EX = struct { FType DWORD FCount DWORD FTargetState DWORD FOldState DWORD FTargetProcessors PVOID FState [1]PPM_WMI_IDLE_STATE } type PPPM_WMI_IDLE_STATES_EX = uintptr type PPM_WMI_PERF_STATE = struct { FFrequency DWORD FPower DWORD FPercentFrequency BYTE FIncreaseLevel BYTE FDecreaseLevel BYTE FType BYTE FIncreaseTime DWORD FDecreaseTime DWORD F__ccgo_pad1 [4]byte FControl DWORD64 FStatus DWORD64 FHitCount DWORD FReserved1 DWORD FReserved2 DWORD64 FReserved3 DWORD64 } type PPPM_WMI_PERF_STATE = uintptr type PPM_WMI_PERF_STATES = struct { FCount DWORD FMaxFrequency DWORD FCurrentState DWORD FMaxPerfState DWORD FMinPerfState DWORD FLowestPerfState DWORD FThermalConstraint DWORD FBusyAdjThreshold BYTE FPolicyType BYTE FType BYTE FReserved BYTE FTimerInterval DWORD F__ccgo_pad1 [4]byte FTargetProcessors DWORD64 FPStateHandler DWORD FPStateContext DWORD FTStateHandler DWORD FTStateContext DWORD FFeedbackHandler DWORD FReserved1 DWORD FReserved2 DWORD64 FState [1]PPM_WMI_PERF_STATE } type PPPM_WMI_PERF_STATES = uintptr type PPM_WMI_PERF_STATES_EX = struct { FCount DWORD FMaxFrequency DWORD FCurrentState DWORD FMaxPerfState DWORD FMinPerfState DWORD FLowestPerfState DWORD FThermalConstraint DWORD FBusyAdjThreshold BYTE FPolicyType BYTE FType BYTE FReserved BYTE FTimerInterval DWORD F__ccgo_pad1 [4]byte FTargetProcessors PVOID FPStateHandler DWORD FPStateContext DWORD FTStateHandler DWORD FTStateContext DWORD FFeedbackHandler DWORD FReserved1 DWORD FReserved2 DWORD64 FState [1]PPM_WMI_PERF_STATE } type PPPM_WMI_PERF_STATES_EX = uintptr type PPM_IDLE_STATE_ACCOUNTING = struct { FIdleTransitions DWORD FFailedTransitions DWORD FInvalidBucketIndex DWORD F__ccgo_pad1 [4]byte FTotalTime DWORD64 FIdleTimeBuckets [6]DWORD } type PPPM_IDLE_STATE_ACCOUNTING = uintptr type PPM_IDLE_ACCOUNTING = struct { FStateCount DWORD FTotalTransitions DWORD FResetCount DWORD F__ccgo_pad1 [4]byte FStartTime DWORD64 FState [1]PPM_IDLE_STATE_ACCOUNTING } type PPPM_IDLE_ACCOUNTING = uintptr type PPM_IDLE_STATE_BUCKET_EX = struct { FTotalTimeUs DWORD64 FMinTimeUs DWORD FMaxTimeUs DWORD FCount DWORD F__ccgo_pad1 [4]byte } type PPPM_IDLE_STATE_BUCKET_EX = uintptr type PPM_IDLE_STATE_ACCOUNTING_EX = struct { FTotalTime DWORD64 FIdleTransitions DWORD FFailedTransitions DWORD FInvalidBucketIndex DWORD FMinTimeUs DWORD FMaxTimeUs DWORD FCancelledTransitions DWORD FIdleTimeBuckets [16]PPM_IDLE_STATE_BUCKET_EX } type PPPM_IDLE_STATE_ACCOUNTING_EX = uintptr type PPM_IDLE_ACCOUNTING_EX = struct { FStateCount DWORD FTotalTransitions DWORD FResetCount DWORD FAbortCount DWORD FStartTime DWORD64 FState [1]PPM_IDLE_STATE_ACCOUNTING_EX } type PPPM_IDLE_ACCOUNTING_EX = uintptr type PPM_PERFSTATE_EVENT = struct { FState DWORD FStatus DWORD FLatency DWORD FSpeed DWORD FProcessor DWORD } type PPPM_PERFSTATE_EVENT = uintptr type PPM_PERFSTATE_DOMAIN_EVENT = struct { FState DWORD FLatency DWORD FSpeed DWORD F__ccgo_pad1 [4]byte FProcessors DWORD64 } type PPPM_PERFSTATE_DOMAIN_EVENT = uintptr type PPM_IDLESTATE_EVENT = struct { FNewState DWORD FOldState DWORD FProcessors DWORD64 } type PPPM_IDLESTATE_EVENT = uintptr type PPM_THERMALCHANGE_EVENT = struct { FThermalConstraint DWORD F__ccgo_pad1 [4]byte FProcessors DWORD64 } type PPPM_THERMALCHANGE_EVENT = uintptr type PPM_THERMAL_POLICY_EVENT = struct { FMode BYTE F__ccgo_pad1 [7]byte FProcessors DWORD64 } type PPPM_THERMAL_POLICY_EVENT = uintptr type POWER_ACTION_POLICY = struct { FAction POWER_ACTION FFlags DWORD FEventCode DWORD } type PPOWER_ACTION_POLICY = uintptr type PROCESSOR_IDLESTATE_INFO = struct { FTimeCheck DWORD FDemotePercent BYTE FPromotePercent BYTE FSpare [2]BYTE } type PPROCESSOR_IDLESTATE_INFO = uintptr type SYSTEM_POWER_LEVEL = struct { FEnable BOOLEAN FSpare [3]BYTE FBatteryLevel DWORD FPowerPolicy POWER_ACTION_POLICY FMinSystemState SYSTEM_POWER_STATE } type PSYSTEM_POWER_LEVEL = uintptr type _SYSTEM_POWER_POLICY = struct { FRevision DWORD FPowerButton POWER_ACTION_POLICY FSleepButton POWER_ACTION_POLICY FLidClose POWER_ACTION_POLICY FLidOpenWake SYSTEM_POWER_STATE FReserved DWORD FIdle POWER_ACTION_POLICY FIdleTimeout DWORD FIdleSensitivity BYTE FDynamicThrottle BYTE FSpare2 [2]BYTE FMinSleep SYSTEM_POWER_STATE FMaxSleep SYSTEM_POWER_STATE FReducedLatencySleep SYSTEM_POWER_STATE FWinLogonFlags DWORD FSpare3 DWORD FDozeS4Timeout DWORD FBroadcastCapacityResolution DWORD FDischargePolicy [4]SYSTEM_POWER_LEVEL FVideoTimeout DWORD FVideoDimDisplay BOOLEAN F__ccgo_pad1 [3]byte FVideoReserved [3]DWORD FSpindownTimeout DWORD FOptimizeForPower BOOLEAN FFanThrottleTolerance BYTE FForcedThrottle BYTE FMinThrottle BYTE FOverThrottled POWER_ACTION_POLICY } type SYSTEM_POWER_POLICY = _SYSTEM_POWER_POLICY type PSYSTEM_POWER_POLICY = uintptr type PROCESSOR_IDLESTATE_POLICY = struct { FRevision WORD FFlags struct{ FAsWORD WORD } FPolicyCount DWORD FPolicy [3]PROCESSOR_IDLESTATE_INFO } type PPROCESSOR_IDLESTATE_POLICY = uintptr type _PROCESSOR_POWER_POLICY_INFO = struct { FTimeCheck DWORD FDemoteLimit DWORD FPromoteLimit DWORD FDemotePercent BYTE FPromotePercent BYTE FSpare [2]BYTE FAllowDemotion uint32 } type PROCESSOR_POWER_POLICY_INFO = _PROCESSOR_POWER_POLICY_INFO type PPROCESSOR_POWER_POLICY_INFO = uintptr type _PROCESSOR_POWER_POLICY = struct { FRevision DWORD FDynamicThrottle BYTE FSpare [3]BYTE FDisableCStates uint32 F__ccgo_pad1 [4]byte FPolicyCount DWORD FPolicy [3]PROCESSOR_POWER_POLICY_INFO } type PROCESSOR_POWER_POLICY = _PROCESSOR_POWER_POLICY type PPROCESSOR_POWER_POLICY = uintptr type PROCESSOR_PERFSTATE_POLICY = struct { FRevision DWORD FMaxThrottle BYTE FMinThrottle BYTE FBusyAdjThreshold BYTE Fu struct{ FSpare BYTE } FTimeCheck DWORD FIncreaseTime DWORD FDecreaseTime DWORD FIncreasePercent DWORD FDecreasePercent DWORD } type PPROCESSOR_PERFSTATE_POLICY = uintptr type _ADMINISTRATOR_POWER_POLICY = struct { FMinSleep SYSTEM_POWER_STATE FMaxSleep SYSTEM_POWER_STATE FMinVideoTimeout DWORD FMaxVideoTimeout DWORD FMinSpindownTimeout DWORD FMaxSpindownTimeout DWORD } type ADMINISTRATOR_POWER_POLICY = _ADMINISTRATOR_POWER_POLICY type PADMINISTRATOR_POWER_POLICY = uintptr type SYSTEM_POWER_CAPABILITIES = struct { FPowerButtonPresent BOOLEAN FSleepButtonPresent BOOLEAN FLidPresent BOOLEAN FSystemS1 BOOLEAN FSystemS2 BOOLEAN FSystemS3 BOOLEAN FSystemS4 BOOLEAN FSystemS5 BOOLEAN FHiberFilePresent BOOLEAN FFullWake BOOLEAN FVideoDimPresent BOOLEAN FApmPresent BOOLEAN FUpsPresent BOOLEAN FThermalControl BOOLEAN FProcessorThrottle BOOLEAN FProcessorMinThrottle BYTE FProcessorMaxThrottle BYTE FFastSystemS4 BOOLEAN Fspare2 [3]BYTE FDiskSpinDown BOOLEAN Fspare3 [8]BYTE FSystemBatteriesPresent BOOLEAN FBatteriesAreShortTerm BOOLEAN FBatteryScale [3]BATTERY_REPORTING_SCALE FAcOnLineWake SYSTEM_POWER_STATE FSoftLidWake SYSTEM_POWER_STATE FRtcWake SYSTEM_POWER_STATE FMinDeviceWakeState SYSTEM_POWER_STATE FDefaultLowLatencyWake SYSTEM_POWER_STATE } type PSYSTEM_POWER_CAPABILITIES = uintptr type SYSTEM_BATTERY_STATE = struct { FAcOnLine BOOLEAN FBatteryPresent BOOLEAN FCharging BOOLEAN FDischarging BOOLEAN FSpare1 [4]BOOLEAN FMaxCapacity DWORD FRemainingCapacity DWORD FRate DWORD FEstimatedTime DWORD FDefaultAlert1 DWORD FDefaultAlert2 DWORD } type PSYSTEM_BATTERY_STATE = uintptr type _IMAGE_DOS_HEADER = struct { Fe_magic WORD Fe_cblp WORD Fe_cp WORD Fe_crlc WORD Fe_cparhdr WORD Fe_minalloc WORD Fe_maxalloc WORD Fe_ss WORD Fe_sp WORD Fe_csum WORD Fe_ip WORD Fe_cs WORD Fe_lfarlc WORD Fe_ovno WORD Fe_res [4]WORD Fe_oemid WORD Fe_oeminfo WORD Fe_res2 [10]WORD Fe_lfanew LONG } type IMAGE_DOS_HEADER = _IMAGE_DOS_HEADER type PIMAGE_DOS_HEADER = uintptr type _IMAGE_OS2_HEADER = struct { Fne_magic WORD Fne_ver CHAR Fne_rev CHAR Fne_enttab WORD Fne_cbenttab WORD Fne_crc LONG Fne_flags WORD Fne_autodata WORD Fne_heap WORD Fne_stack WORD Fne_csip LONG Fne_sssp LONG Fne_cseg WORD Fne_cmod WORD Fne_cbnrestab WORD Fne_segtab WORD Fne_rsrctab WORD Fne_restab WORD Fne_modtab WORD Fne_imptab WORD Fne_nrestab LONG Fne_cmovent WORD Fne_align WORD Fne_cres WORD Fne_exetyp BYTE Fne_flagsothers BYTE Fne_pretthunks WORD Fne_psegrefbytes WORD Fne_swaparea WORD Fne_expver WORD } type IMAGE_OS2_HEADER = _IMAGE_OS2_HEADER type PIMAGE_OS2_HEADER = uintptr type _IMAGE_VXD_HEADER = struct { Fe32_magic WORD Fe32_border BYTE Fe32_worder BYTE Fe32_level DWORD Fe32_cpu WORD Fe32_os WORD Fe32_ver DWORD Fe32_mflags DWORD Fe32_mpages DWORD Fe32_startobj DWORD Fe32_eip DWORD Fe32_stackobj DWORD Fe32_esp DWORD Fe32_pagesize DWORD Fe32_lastpagesize DWORD Fe32_fixupsize DWORD Fe32_fixupsum DWORD Fe32_ldrsize DWORD Fe32_ldrsum DWORD Fe32_objtab DWORD Fe32_objcnt DWORD Fe32_objmap DWORD Fe32_itermap DWORD Fe32_rsrctab DWORD Fe32_rsrccnt DWORD Fe32_restab DWORD Fe32_enttab DWORD Fe32_dirtab DWORD Fe32_dircnt DWORD Fe32_fpagetab DWORD Fe32_frectab DWORD Fe32_impmod DWORD Fe32_impmodcnt DWORD Fe32_impproc DWORD Fe32_pagesum DWORD Fe32_datapage DWORD Fe32_preload DWORD Fe32_nrestab DWORD Fe32_cbnrestab DWORD Fe32_nressum DWORD Fe32_autodata DWORD Fe32_debuginfo DWORD Fe32_debuglen DWORD Fe32_instpreload DWORD Fe32_instdemand DWORD Fe32_heapsize DWORD Fe32_res3 [12]BYTE Fe32_winresoff DWORD Fe32_winreslen DWORD Fe32_devid WORD Fe32_ddkver WORD } type IMAGE_VXD_HEADER = _IMAGE_VXD_HEADER type PIMAGE_VXD_HEADER = uintptr type _IMAGE_FILE_HEADER = struct { FMachine WORD FNumberOfSections WORD FTimeDateStamp DWORD FPointerToSymbolTable DWORD FNumberOfSymbols DWORD FSizeOfOptionalHeader WORD FCharacteristics WORD } type IMAGE_FILE_HEADER = _IMAGE_FILE_HEADER type PIMAGE_FILE_HEADER = uintptr type _IMAGE_DATA_DIRECTORY = struct { FVirtualAddress DWORD FSize DWORD } type IMAGE_DATA_DIRECTORY = _IMAGE_DATA_DIRECTORY type PIMAGE_DATA_DIRECTORY = uintptr type _IMAGE_OPTIONAL_HEADER = struct { FMagic WORD FMajorLinkerVersion BYTE FMinorLinkerVersion BYTE FSizeOfCode DWORD FSizeOfInitializedData DWORD FSizeOfUninitializedData DWORD FAddressOfEntryPoint DWORD FBaseOfCode DWORD FBaseOfData DWORD FImageBase DWORD FSectionAlignment DWORD FFileAlignment DWORD FMajorOperatingSystemVersion WORD FMinorOperatingSystemVersion WORD FMajorImageVersion WORD FMinorImageVersion WORD FMajorSubsystemVersion WORD FMinorSubsystemVersion WORD FWin32VersionValue DWORD FSizeOfImage DWORD FSizeOfHeaders DWORD FCheckSum DWORD FSubsystem WORD FDllCharacteristics WORD FSizeOfStackReserve DWORD FSizeOfStackCommit DWORD FSizeOfHeapReserve DWORD FSizeOfHeapCommit DWORD FLoaderFlags DWORD FNumberOfRvaAndSizes DWORD FDataDirectory [16]IMAGE_DATA_DIRECTORY } type IMAGE_OPTIONAL_HEADER32 = _IMAGE_OPTIONAL_HEADER type PIMAGE_OPTIONAL_HEADER32 = uintptr type _IMAGE_ROM_OPTIONAL_HEADER = struct { FMagic WORD FMajorLinkerVersion BYTE FMinorLinkerVersion BYTE FSizeOfCode DWORD FSizeOfInitializedData DWORD FSizeOfUninitializedData DWORD FAddressOfEntryPoint DWORD FBaseOfCode DWORD FBaseOfData DWORD FBaseOfBss DWORD FGprMask DWORD FCprMask [4]DWORD FGpValue DWORD } type IMAGE_ROM_OPTIONAL_HEADER = _IMAGE_ROM_OPTIONAL_HEADER type PIMAGE_ROM_OPTIONAL_HEADER = uintptr type _IMAGE_OPTIONAL_HEADER64 = struct { FMagic WORD FMajorLinkerVersion BYTE FMinorLinkerVersion BYTE FSizeOfCode DWORD FSizeOfInitializedData DWORD FSizeOfUninitializedData DWORD FAddressOfEntryPoint DWORD FBaseOfCode DWORD FImageBase ULONGLONG FSectionAlignment DWORD FFileAlignment DWORD FMajorOperatingSystemVersion WORD FMinorOperatingSystemVersion WORD FMajorImageVersion WORD FMinorImageVersion WORD FMajorSubsystemVersion WORD FMinorSubsystemVersion WORD FWin32VersionValue DWORD FSizeOfImage DWORD FSizeOfHeaders DWORD FCheckSum DWORD FSubsystem WORD FDllCharacteristics WORD FSizeOfStackReserve ULONGLONG FSizeOfStackCommit ULONGLONG FSizeOfHeapReserve ULONGLONG FSizeOfHeapCommit ULONGLONG FLoaderFlags DWORD FNumberOfRvaAndSizes DWORD FDataDirectory [16]IMAGE_DATA_DIRECTORY } type IMAGE_OPTIONAL_HEADER64 = _IMAGE_OPTIONAL_HEADER64 type PIMAGE_OPTIONAL_HEADER64 = uintptr type IMAGE_OPTIONAL_HEADER = IMAGE_OPTIONAL_HEADER64 type PIMAGE_OPTIONAL_HEADER = PIMAGE_OPTIONAL_HEADER64 type _IMAGE_NT_HEADERS64 = struct { FSignature DWORD FFileHeader IMAGE_FILE_HEADER FOptionalHeader IMAGE_OPTIONAL_HEADER64 } type IMAGE_NT_HEADERS64 = _IMAGE_NT_HEADERS64 type PIMAGE_NT_HEADERS64 = uintptr type _IMAGE_NT_HEADERS = struct { FSignature DWORD FFileHeader IMAGE_FILE_HEADER FOptionalHeader IMAGE_OPTIONAL_HEADER32 } type IMAGE_NT_HEADERS32 = _IMAGE_NT_HEADERS type PIMAGE_NT_HEADERS32 = uintptr type _IMAGE_ROM_HEADERS = struct { FFileHeader IMAGE_FILE_HEADER FOptionalHeader IMAGE_ROM_OPTIONAL_HEADER } type IMAGE_ROM_HEADERS = _IMAGE_ROM_HEADERS type PIMAGE_ROM_HEADERS = uintptr type IMAGE_NT_HEADERS = IMAGE_NT_HEADERS64 type PIMAGE_NT_HEADERS = PIMAGE_NT_HEADERS64 type ANON_OBJECT_HEADER1 = struct { FSig1 WORD FSig2 WORD FVersion WORD FMachine WORD FTimeDateStamp DWORD FClassID CLSID FSizeOfData DWORD } type ANON_OBJECT_HEADER = ANON_OBJECT_HEADER1 type ANON_OBJECT_HEADER_V21 = struct { FSig1 WORD FSig2 WORD FVersion WORD FMachine WORD FTimeDateStamp DWORD FClassID CLSID FSizeOfData DWORD FFlags DWORD FMetaDataSize DWORD FMetaDataOffset DWORD } type ANON_OBJECT_HEADER_V2 = ANON_OBJECT_HEADER_V21 type ANON_OBJECT_HEADER_BIGOBJ1 = struct { FSig1 WORD FSig2 WORD FVersion WORD FMachine WORD FTimeDateStamp DWORD FClassID CLSID FSizeOfData DWORD FFlags DWORD FMetaDataSize DWORD FMetaDataOffset DWORD FNumberOfSections DWORD FPointerToSymbolTable DWORD FNumberOfSymbols DWORD } type ANON_OBJECT_HEADER_BIGOBJ = ANON_OBJECT_HEADER_BIGOBJ1 type _IMAGE_SECTION_HEADER = struct { FName [8]BYTE FMisc struct{ FPhysicalAddress DWORD } FVirtualAddress DWORD FSizeOfRawData DWORD FPointerToRawData DWORD FPointerToRelocations DWORD FPointerToLinenumbers DWORD FNumberOfRelocations WORD FNumberOfLinenumbers WORD FCharacteristics DWORD } type IMAGE_SECTION_HEADER = _IMAGE_SECTION_HEADER type PIMAGE_SECTION_HEADER = uintptr type _IMAGE_SYMBOL = struct { FN struct { F__ccgo_pad1 [0]uint32 FShortName [8]BYTE } FValue DWORD FSectionNumber SHORT FType WORD FStorageClass BYTE FNumberOfAuxSymbols BYTE F__ccgo_pad1 [2]byte } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type IMAGE_SYMBOL = _IMAGE_SYMBOL type PIMAGE_SYMBOL = uintptr type _IMAGE_SYMBOL_EX = struct { FN struct { F__ccgo_pad1 [0]uint32 FShortName [8]BYTE } FValue DWORD FSectionNumber LONG FType WORD FStorageClass BYTE FNumberOfAuxSymbols BYTE } type IMAGE_SYMBOL_EX = _IMAGE_SYMBOL_EX type PIMAGE_SYMBOL_EX = uintptr // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type IMAGE_AUX_SYMBOL_TOKEN_DEF1 = struct { FbAuxType BYTE FbReserved BYTE F__ccgo_pad1 [2]byte FSymbolTableIndex DWORD FrgbReserved [12]BYTE } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type IMAGE_AUX_SYMBOL_TOKEN_DEF = IMAGE_AUX_SYMBOL_TOKEN_DEF1 type PIMAGE_AUX_SYMBOL_TOKEN_DEF = uintptr type _IMAGE_AUX_SYMBOL = struct { FSym struct { FTagIndex DWORD FMisc struct { F__ccgo_pad1 [0]uint32 FLnSz struct { FLinenumber WORD FSize WORD } } FFcnAry struct { FFunction struct { FPointerToLinenumber DWORD FPointerToNextFunction DWORD } } FTvIndex WORD F__ccgo_pad1 [2]byte } } type IMAGE_AUX_SYMBOL = _IMAGE_AUX_SYMBOL type PIMAGE_AUX_SYMBOL = uintptr type _IMAGE_AUX_SYMBOL_EX = struct { FSym struct { FWeakDefaultSymIndex DWORD FWeakSearchType DWORD FrgbReserved [12]BYTE } F__ccgo_pad1 [4]byte } type IMAGE_AUX_SYMBOL_EX = _IMAGE_AUX_SYMBOL_EX type PIMAGE_AUX_SYMBOL_EX = uintptr type IMAGE_AUX_SYMBOL_TYPE = uint32 type _IMAGE_RELOCATION = struct { Fu struct{ FVirtualAddress DWORD } FSymbolTableIndex DWORD FType WORD F__ccgo_pad1 [2]byte } type IMAGE_RELOCATION = _IMAGE_RELOCATION type PIMAGE_RELOCATION = uintptr type _IMAGE_LINENUMBER = struct { FType struct{ FSymbolTableIndex DWORD } FLinenumber WORD F__ccgo_pad1 [2]byte } type IMAGE_LINENUMBER = _IMAGE_LINENUMBER type PIMAGE_LINENUMBER = uintptr type _IMAGE_BASE_RELOCATION = struct { FVirtualAddress DWORD FSizeOfBlock DWORD } type IMAGE_BASE_RELOCATION = _IMAGE_BASE_RELOCATION type PIMAGE_BASE_RELOCATION = uintptr type _IMAGE_ARCHIVE_MEMBER_HEADER = struct { FName [16]BYTE FDate [12]BYTE FUserID [6]BYTE FGroupID [6]BYTE FMode [8]BYTE FSize [10]BYTE FEndHeader [2]BYTE } type IMAGE_ARCHIVE_MEMBER_HEADER = _IMAGE_ARCHIVE_MEMBER_HEADER type PIMAGE_ARCHIVE_MEMBER_HEADER = uintptr type _IMAGE_EXPORT_DIRECTORY = struct { FCharacteristics DWORD FTimeDateStamp DWORD FMajorVersion WORD FMinorVersion WORD FName DWORD FBase DWORD FNumberOfFunctions DWORD FNumberOfNames DWORD FAddressOfFunctions DWORD FAddressOfNames DWORD FAddressOfNameOrdinals DWORD } type IMAGE_EXPORT_DIRECTORY = _IMAGE_EXPORT_DIRECTORY type PIMAGE_EXPORT_DIRECTORY = uintptr type _IMAGE_IMPORT_BY_NAME = struct { FHint WORD FName [1]CHAR F__ccgo_pad1 [1]byte } type IMAGE_IMPORT_BY_NAME = _IMAGE_IMPORT_BY_NAME type PIMAGE_IMPORT_BY_NAME = uintptr type _IMAGE_THUNK_DATA64 = struct { Fu1 struct{ FForwarderString ULONGLONG } } type IMAGE_THUNK_DATA64 = _IMAGE_THUNK_DATA64 type PIMAGE_THUNK_DATA64 = uintptr type _IMAGE_THUNK_DATA32 = struct { Fu1 struct{ FForwarderString DWORD } } type IMAGE_THUNK_DATA32 = _IMAGE_THUNK_DATA32 type PIMAGE_THUNK_DATA32 = uintptr type PIMAGE_TLS_CALLBACK = uintptr type _IMAGE_TLS_DIRECTORY64 = struct { FStartAddressOfRawData ULONGLONG FEndAddressOfRawData ULONGLONG FAddressOfIndex ULONGLONG FAddressOfCallBacks ULONGLONG FSizeOfZeroFill DWORD FCharacteristics DWORD } type IMAGE_TLS_DIRECTORY64 = _IMAGE_TLS_DIRECTORY64 type PIMAGE_TLS_DIRECTORY64 = uintptr type _IMAGE_TLS_DIRECTORY32 = struct { FStartAddressOfRawData DWORD FEndAddressOfRawData DWORD FAddressOfIndex DWORD FAddressOfCallBacks DWORD FSizeOfZeroFill DWORD FCharacteristics DWORD } type IMAGE_TLS_DIRECTORY32 = _IMAGE_TLS_DIRECTORY32 type PIMAGE_TLS_DIRECTORY32 = uintptr type IMAGE_THUNK_DATA = IMAGE_THUNK_DATA64 type PIMAGE_THUNK_DATA = PIMAGE_THUNK_DATA64 type IMAGE_TLS_DIRECTORY = IMAGE_TLS_DIRECTORY64 type PIMAGE_TLS_DIRECTORY = PIMAGE_TLS_DIRECTORY64 type _IMAGE_IMPORT_DESCRIPTOR = struct { Fu struct{ FCharacteristics DWORD } FTimeDateStamp DWORD FForwarderChain DWORD FName DWORD FFirstThunk DWORD } type IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR type PIMAGE_IMPORT_DESCRIPTOR = uintptr type _IMAGE_BOUND_IMPORT_DESCRIPTOR = struct { FTimeDateStamp DWORD FOffsetModuleName WORD FNumberOfModuleForwarderRefs WORD } type IMAGE_BOUND_IMPORT_DESCRIPTOR = _IMAGE_BOUND_IMPORT_DESCRIPTOR type PIMAGE_BOUND_IMPORT_DESCRIPTOR = uintptr type _IMAGE_BOUND_FORWARDER_REF = struct { FTimeDateStamp DWORD FOffsetModuleName WORD FReserved WORD } type IMAGE_BOUND_FORWARDER_REF = _IMAGE_BOUND_FORWARDER_REF type PIMAGE_BOUND_FORWARDER_REF = uintptr type _IMAGE_DELAYLOAD_DESCRIPTOR = struct { FAttributes struct{ FAllAttributes DWORD } FDllNameRVA DWORD FModuleHandleRVA DWORD FImportAddressTableRVA DWORD FImportNameTableRVA DWORD FBoundImportAddressTableRVA DWORD FUnloadInformationTableRVA DWORD FTimeDateStamp DWORD } type IMAGE_DELAYLOAD_DESCRIPTOR = _IMAGE_DELAYLOAD_DESCRIPTOR type PIMAGE_DELAYLOAD_DESCRIPTOR = uintptr type PCIMAGE_DELAYLOAD_DESCRIPTOR = uintptr type _IMAGE_RESOURCE_DIRECTORY = struct { FCharacteristics DWORD FTimeDateStamp DWORD FMajorVersion WORD FMinorVersion WORD FNumberOfNamedEntries WORD FNumberOfIdEntries WORD } type IMAGE_RESOURCE_DIRECTORY = _IMAGE_RESOURCE_DIRECTORY type PIMAGE_RESOURCE_DIRECTORY = uintptr type _IMAGE_RESOURCE_DIRECTORY_ENTRY = struct { Fu struct { Fs struct { F__ccgo_pad1 [0]uint32 FNameOffset uint32 } } Fu2 struct{ FOffsetToData DWORD } } type IMAGE_RESOURCE_DIRECTORY_ENTRY = _IMAGE_RESOURCE_DIRECTORY_ENTRY type PIMAGE_RESOURCE_DIRECTORY_ENTRY = uintptr type _IMAGE_RESOURCE_DIRECTORY_STRING = struct { FLength WORD FNameString [1]CHAR F__ccgo_pad1 [1]byte } type IMAGE_RESOURCE_DIRECTORY_STRING = _IMAGE_RESOURCE_DIRECTORY_STRING type PIMAGE_RESOURCE_DIRECTORY_STRING = uintptr type _IMAGE_RESOURCE_DIR_STRING_U = struct { FLength WORD FNameString [1]WCHAR } type IMAGE_RESOURCE_DIR_STRING_U = _IMAGE_RESOURCE_DIR_STRING_U type PIMAGE_RESOURCE_DIR_STRING_U = uintptr type _IMAGE_RESOURCE_DATA_ENTRY = struct { FOffsetToData DWORD FSize DWORD FCodePage DWORD FReserved DWORD } type IMAGE_RESOURCE_DATA_ENTRY = _IMAGE_RESOURCE_DATA_ENTRY type PIMAGE_RESOURCE_DATA_ENTRY = uintptr type IMAGE_LOAD_CONFIG_DIRECTORY32 = struct { FSize DWORD FTimeDateStamp DWORD FMajorVersion WORD FMinorVersion WORD FGlobalFlagsClear DWORD FGlobalFlagsSet DWORD FCriticalSectionDefaultTimeout DWORD FDeCommitFreeBlockThreshold DWORD FDeCommitTotalFreeThreshold DWORD FLockPrefixTable DWORD FMaximumAllocationSize DWORD FVirtualMemoryThreshold DWORD FProcessHeapFlags DWORD FProcessAffinityMask DWORD FCSDVersion WORD FReserved1 WORD FEditList DWORD FSecurityCookie DWORD FSEHandlerTable DWORD FSEHandlerCount DWORD } type PIMAGE_LOAD_CONFIG_DIRECTORY32 = uintptr type IMAGE_LOAD_CONFIG_DIRECTORY64 = struct { FSize DWORD FTimeDateStamp DWORD FMajorVersion WORD FMinorVersion WORD FGlobalFlagsClear DWORD FGlobalFlagsSet DWORD FCriticalSectionDefaultTimeout DWORD FDeCommitFreeBlockThreshold ULONGLONG FDeCommitTotalFreeThreshold ULONGLONG FLockPrefixTable ULONGLONG FMaximumAllocationSize ULONGLONG FVirtualMemoryThreshold ULONGLONG FProcessAffinityMask ULONGLONG FProcessHeapFlags DWORD FCSDVersion WORD FReserved1 WORD FEditList ULONGLONG FSecurityCookie ULONGLONG FSEHandlerTable ULONGLONG FSEHandlerCount ULONGLONG } type PIMAGE_LOAD_CONFIG_DIRECTORY64 = uintptr type IMAGE_LOAD_CONFIG_DIRECTORY = IMAGE_LOAD_CONFIG_DIRECTORY64 type PIMAGE_LOAD_CONFIG_DIRECTORY = PIMAGE_LOAD_CONFIG_DIRECTORY64 type _IMAGE_CE_RUNTIME_FUNCTION_ENTRY = struct { FFuncStart DWORD FPrologLen uint32 } type IMAGE_CE_RUNTIME_FUNCTION_ENTRY = _IMAGE_CE_RUNTIME_FUNCTION_ENTRY type PIMAGE_CE_RUNTIME_FUNCTION_ENTRY = uintptr type _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY = struct { FBeginAddress ULONGLONG FEndAddress ULONGLONG FExceptionHandler ULONGLONG FHandlerData ULONGLONG FPrologEndAddress ULONGLONG } type IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY = _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY type PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY = uintptr type _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY = struct { FBeginAddress DWORD FEndAddress DWORD FExceptionHandler DWORD FHandlerData DWORD FPrologEndAddress DWORD } type IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY = _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY type PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY = uintptr type _IMAGE_ARM_RUNTIME_FUNCTION_ENTRY = struct { FBeginAddress DWORD Fu struct{ FUnwindData DWORD } } type IMAGE_ARM_RUNTIME_FUNCTION_ENTRY = _IMAGE_ARM_RUNTIME_FUNCTION_ENTRY type PIMAGE_ARM_RUNTIME_FUNCTION_ENTRY = uintptr type _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY = struct { FBeginAddress DWORD Fu struct{ FUnwindData DWORD } } type IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY = _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY type PIMAGE_ARM64_RUNTIME_FUNCTION_ENTRY = uintptr type _IMAGE_RUNTIME_FUNCTION_ENTRY = struct { FBeginAddress DWORD FEndAddress DWORD Fu struct{ FUnwindInfoAddress DWORD } } type X_IMAGE_RUNTIME_FUNCTION_ENTRY = _IMAGE_RUNTIME_FUNCTION_ENTRY type X_PIMAGE_RUNTIME_FUNCTION_ENTRY = uintptr type IMAGE_IA64_RUNTIME_FUNCTION_ENTRY = X_IMAGE_RUNTIME_FUNCTION_ENTRY type PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY = X_PIMAGE_RUNTIME_FUNCTION_ENTRY type IMAGE_RUNTIME_FUNCTION_ENTRY = X_IMAGE_RUNTIME_FUNCTION_ENTRY type PIMAGE_RUNTIME_FUNCTION_ENTRY = X_PIMAGE_RUNTIME_FUNCTION_ENTRY type _IMAGE_DEBUG_DIRECTORY = struct { FCharacteristics DWORD FTimeDateStamp DWORD FMajorVersion WORD FMinorVersion WORD FType DWORD FSizeOfData DWORD FAddressOfRawData DWORD FPointerToRawData DWORD } type IMAGE_DEBUG_DIRECTORY = _IMAGE_DEBUG_DIRECTORY type PIMAGE_DEBUG_DIRECTORY = uintptr type _IMAGE_COFF_SYMBOLS_HEADER = struct { FNumberOfSymbols DWORD FLvaToFirstSymbol DWORD FNumberOfLinenumbers DWORD FLvaToFirstLinenumber DWORD FRvaToFirstByteOfCode DWORD FRvaToLastByteOfCode DWORD FRvaToFirstByteOfData DWORD FRvaToLastByteOfData DWORD } type IMAGE_COFF_SYMBOLS_HEADER = _IMAGE_COFF_SYMBOLS_HEADER type PIMAGE_COFF_SYMBOLS_HEADER = uintptr type _FPO_DATA = struct { FulOffStart DWORD FcbProcSize DWORD FcdwLocals DWORD FcdwParams WORD FcbProlog uint16 } type FPO_DATA = _FPO_DATA type PFPO_DATA = uintptr type _IMAGE_DEBUG_MISC = struct { FDataType DWORD FLength DWORD FUnicode BOOLEAN FReserved [3]BYTE FData [1]BYTE F__ccgo_pad1 [3]byte } type IMAGE_DEBUG_MISC = _IMAGE_DEBUG_MISC type PIMAGE_DEBUG_MISC = uintptr type _IMAGE_FUNCTION_ENTRY = struct { FStartingAddress DWORD FEndingAddress DWORD FEndOfPrologue DWORD } type IMAGE_FUNCTION_ENTRY = _IMAGE_FUNCTION_ENTRY type PIMAGE_FUNCTION_ENTRY = uintptr type _IMAGE_FUNCTION_ENTRY64 = struct { FStartingAddress ULONGLONG FEndingAddress ULONGLONG Fu struct{ FEndOfPrologue ULONGLONG } } type IMAGE_FUNCTION_ENTRY64 = _IMAGE_FUNCTION_ENTRY64 type PIMAGE_FUNCTION_ENTRY64 = uintptr type _IMAGE_SEPARATE_DEBUG_HEADER = struct { FSignature WORD FFlags WORD FMachine WORD FCharacteristics WORD FTimeDateStamp DWORD FCheckSum DWORD FImageBase DWORD FSizeOfImage DWORD FNumberOfSections DWORD FExportedNamesSize DWORD FDebugDirectorySize DWORD FSectionAlignment DWORD FReserved [2]DWORD } type IMAGE_SEPARATE_DEBUG_HEADER = _IMAGE_SEPARATE_DEBUG_HEADER type PIMAGE_SEPARATE_DEBUG_HEADER = uintptr type _NON_PAGED_DEBUG_INFO = struct { FSignature WORD FFlags WORD FSize DWORD FMachine WORD FCharacteristics WORD FTimeDateStamp DWORD FCheckSum DWORD FSizeOfImage DWORD FImageBase ULONGLONG } type NON_PAGED_DEBUG_INFO = _NON_PAGED_DEBUG_INFO type PNON_PAGED_DEBUG_INFO = uintptr type _ImageArchitectureHeader = struct { FAmaskValue uint32 F__ccgo_pad1 [4]byte FFirstEntryRVA DWORD } type IMAGE_ARCHITECTURE_HEADER = _ImageArchitectureHeader type PIMAGE_ARCHITECTURE_HEADER = uintptr type _ImageArchitectureEntry = struct { FFixupInstRVA DWORD FNewInst DWORD } type IMAGE_ARCHITECTURE_ENTRY = _ImageArchitectureEntry type PIMAGE_ARCHITECTURE_ENTRY = uintptr type IMPORT_OBJECT_HEADER1 = struct { FSig1 WORD FSig2 WORD FVersion WORD FMachine WORD FTimeDateStamp DWORD FSizeOfData DWORD F__16 struct{ FOrdinal WORD } FType uint16 } type IMPORT_OBJECT_HEADER = IMPORT_OBJECT_HEADER1 type IMPORT_OBJECT_TYPE = uint32 type IMPORT_OBJECT_NAME_TYPE = uint32 type ReplacesCorHdrNumericDefines = uint32 type IMAGE_COR20_HEADER1 = struct { Fcb DWORD FMajorRuntimeVersion WORD FMinorRuntimeVersion WORD FMetaData IMAGE_DATA_DIRECTORY FFlags DWORD Fu struct{ FEntryPointToken DWORD } FResources IMAGE_DATA_DIRECTORY FStrongNameSignature IMAGE_DATA_DIRECTORY FCodeManagerTable IMAGE_DATA_DIRECTORY FVTableFixups IMAGE_DATA_DIRECTORY FExportAddressTableJumps IMAGE_DATA_DIRECTORY FManagedNativeHeader IMAGE_DATA_DIRECTORY } type IMAGE_COR20_HEADER = IMAGE_COR20_HEADER1 type PIMAGE_COR20_HEADER = uintptr type _SLIST_ENTRY = struct{ FNext uintptr } type SLIST_ENTRY = _SLIST_ENTRY type PSLIST_ENTRY = uintptr type _SLIST_HEADER = struct { Fs struct { FAlignment ULONGLONG FRegion ULONGLONG } } type SLIST_HEADER = _SLIST_HEADER type PSLIST_HEADER = uintptr type _RTL_RUN_ONCE = struct{ FPtr PVOID } type RTL_RUN_ONCE = _RTL_RUN_ONCE type PRTL_RUN_ONCE = uintptr type PRTL_RUN_ONCE_INIT_FN = uintptr type _RTL_BARRIER = struct { FReserved1 DWORD FReserved2 DWORD FReserved3 [2]ULONG_PTR FReserved4 DWORD FReserved5 DWORD } type RTL_BARRIER = _RTL_BARRIER type PRTL_BARRIER = uintptr type _MESSAGE_RESOURCE_ENTRY = struct { FLength WORD FFlags WORD FText [1]BYTE F__ccgo_pad1 [1]byte } type MESSAGE_RESOURCE_ENTRY = _MESSAGE_RESOURCE_ENTRY type PMESSAGE_RESOURCE_ENTRY = uintptr type _MESSAGE_RESOURCE_BLOCK = struct { FLowId DWORD FHighId DWORD FOffsetToEntries DWORD } type MESSAGE_RESOURCE_BLOCK = _MESSAGE_RESOURCE_BLOCK type PMESSAGE_RESOURCE_BLOCK = uintptr type _MESSAGE_RESOURCE_DATA = struct { FNumberOfBlocks DWORD FBlocks [1]MESSAGE_RESOURCE_BLOCK } type MESSAGE_RESOURCE_DATA = _MESSAGE_RESOURCE_DATA type PMESSAGE_RESOURCE_DATA = uintptr type _OSVERSIONINFOA = struct { FdwOSVersionInfoSize DWORD FdwMajorVersion DWORD FdwMinorVersion DWORD FdwBuildNumber DWORD FdwPlatformId DWORD FszCSDVersion [128]CHAR } type OSVERSIONINFOA = _OSVERSIONINFOA type POSVERSIONINFOA = uintptr type LPOSVERSIONINFOA = uintptr type _OSVERSIONINFOW = struct { FdwOSVersionInfoSize DWORD FdwMajorVersion DWORD FdwMinorVersion DWORD FdwBuildNumber DWORD FdwPlatformId DWORD FszCSDVersion [128]WCHAR } type OSVERSIONINFOW = _OSVERSIONINFOW type POSVERSIONINFOW = uintptr type LPOSVERSIONINFOW = uintptr type RTL_OSVERSIONINFOW = _OSVERSIONINFOW type PRTL_OSVERSIONINFOW = uintptr type OSVERSIONINFO = OSVERSIONINFOA type POSVERSIONINFO = POSVERSIONINFOA type LPOSVERSIONINFO = LPOSVERSIONINFOA type _OSVERSIONINFOEXA = struct { FdwOSVersionInfoSize DWORD FdwMajorVersion DWORD FdwMinorVersion DWORD FdwBuildNumber DWORD FdwPlatformId DWORD FszCSDVersion [128]CHAR FwServicePackMajor WORD FwServicePackMinor WORD FwSuiteMask WORD FwProductType BYTE FwReserved BYTE } type OSVERSIONINFOEXA = _OSVERSIONINFOEXA type POSVERSIONINFOEXA = uintptr type LPOSVERSIONINFOEXA = uintptr type _OSVERSIONINFOEXW = struct { FdwOSVersionInfoSize DWORD FdwMajorVersion DWORD FdwMinorVersion DWORD FdwBuildNumber DWORD FdwPlatformId DWORD FszCSDVersion [128]WCHAR FwServicePackMajor WORD FwServicePackMinor WORD FwSuiteMask WORD FwProductType BYTE FwReserved BYTE } type OSVERSIONINFOEXW = _OSVERSIONINFOEXW type POSVERSIONINFOEXW = uintptr type LPOSVERSIONINFOEXW = uintptr type RTL_OSVERSIONINFOEXW = _OSVERSIONINFOEXW type PRTL_OSVERSIONINFOEXW = uintptr type OSVERSIONINFOEX = OSVERSIONINFOEXA type POSVERSIONINFOEX = POSVERSIONINFOEXA type LPOSVERSIONINFOEX = LPOSVERSIONINFOEXA type RTL_UMS_THREAD_INFO_CLASS = uint32 type PRTL_UMS_THREAD_INFO_CLASS = uintptr type RTL_UMS_SCHEDULER_REASON = uint32 type PRTL_UMS_SCHEDULER_REASON = uintptr type PRTL_UMS_SCHEDULER_ENTRY_POINT = uintptr type _RTL_CRITICAL_SECTION_DEBUG = struct { FType WORD FCreatorBackTraceIndex WORD F__ccgo_pad1 [4]byte FCriticalSection uintptr FProcessLocksList LIST_ENTRY FEntryCount DWORD FContentionCount DWORD FFlags DWORD FCreatorBackTraceIndexHigh WORD FSpareWORD WORD } type _RTL_CRITICAL_SECTION = struct { FDebugInfo PRTL_CRITICAL_SECTION_DEBUG FLockCount LONG FRecursionCount LONG FOwningThread HANDLE FLockSemaphore HANDLE FSpinCount ULONG_PTR } type RTL_CRITICAL_SECTION_DEBUG = _RTL_CRITICAL_SECTION_DEBUG type PRTL_CRITICAL_SECTION_DEBUG = uintptr type RTL_RESOURCE_DEBUG = _RTL_CRITICAL_SECTION_DEBUG type PRTL_RESOURCE_DEBUG = uintptr // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type RTL_CRITICAL_SECTION = _RTL_CRITICAL_SECTION type PRTL_CRITICAL_SECTION = uintptr type _RTL_SRWLOCK = struct{ FPtr PVOID } type RTL_SRWLOCK = _RTL_SRWLOCK type PRTL_SRWLOCK = uintptr type _RTL_CONDITION_VARIABLE = struct{ FPtr PVOID } type RTL_CONDITION_VARIABLE = _RTL_CONDITION_VARIABLE type PRTL_CONDITION_VARIABLE = uintptr type PAPCFUNC = uintptr type PVECTORED_EXCEPTION_HANDLER = uintptr type HEAP_INFORMATION_CLASS = uint32 type WORKERCALLBACKFUNC = uintptr type APC_CALLBACK_FUNCTION = uintptr type WAITORTIMERCALLBACKFUNC = uintptr type WAITORTIMERCALLBACK = WAITORTIMERCALLBACKFUNC type PFLS_CALLBACK_FUNCTION = uintptr type PSECURE_MEMORY_CACHE_CALLBACK = uintptr type ACTIVATION_CONTEXT_INFO_CLASS = uint32 type ACTCTX_REQUESTED_RUN_LEVEL = uint32 type ACTCTX_COMPATIBILITY_ELEMENT_TYPE = uint32 type _ACTIVATION_CONTEXT_QUERY_INDEX = struct { FulAssemblyIndex DWORD FulFileIndexInAssembly DWORD } type ACTIVATION_CONTEXT_QUERY_INDEX = _ACTIVATION_CONTEXT_QUERY_INDEX type PACTIVATION_CONTEXT_QUERY_INDEX = uintptr type _ASSEMBLY_FILE_DETAILED_INFORMATION = struct { FulFlags DWORD FulFilenameLength DWORD FulPathLength DWORD F__ccgo_pad1 [4]byte FlpFileName PCWSTR FlpFilePath PCWSTR } type ASSEMBLY_FILE_DETAILED_INFORMATION = _ASSEMBLY_FILE_DETAILED_INFORMATION type PASSEMBLY_FILE_DETAILED_INFORMATION = uintptr type _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION = struct { FulFlags DWORD FulEncodedAssemblyIdentityLength DWORD FulManifestPathType DWORD FulManifestPathLength DWORD FliManifestLastWriteTime LARGE_INTEGER FulPolicyPathType DWORD FulPolicyPathLength DWORD FliPolicyLastWriteTime LARGE_INTEGER FulMetadataSatelliteRosterIndex DWORD FulManifestVersionMajor DWORD FulManifestVersionMinor DWORD FulPolicyVersionMajor DWORD FulPolicyVersionMinor DWORD FulAssemblyDirectoryNameLength DWORD FlpAssemblyEncodedAssemblyIdentity PCWSTR FlpAssemblyManifestPath PCWSTR FlpAssemblyPolicyPath PCWSTR FlpAssemblyDirectoryName PCWSTR FulFileCount DWORD F__ccgo_pad1 [4]byte } type ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION = _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION type PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION = uintptr type _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION = struct { FulFlags DWORD FRunLevel ACTCTX_REQUESTED_RUN_LEVEL FUiAccess DWORD } type ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION = _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION type PACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION = uintptr type _COMPATIBILITY_CONTEXT_ELEMENT = struct { FId GUID FType ACTCTX_COMPATIBILITY_ELEMENT_TYPE } type COMPATIBILITY_CONTEXT_ELEMENT = _COMPATIBILITY_CONTEXT_ELEMENT type PCOMPATIBILITY_CONTEXT_ELEMENT = uintptr type _ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION = struct { F__ccgo_pad1 [0]uint32 FElementCount DWORD } // Vista: {e2011457-1546-43c5-a5fe-008deee3d3f0} // Seven: {35138b9a-5d96-4fbd-8e2d-a2440225f93a} type ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION = _ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION type PACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION = uintptr type _SUPPORTED_OS_INFO = struct { FOsCount WORD FMitigationExist WORD FOsList [4]WORD } type SUPPORTED_OS_INFO = _SUPPORTED_OS_INFO type PSUPPORTED_OS_INFO = uintptr type _ACTIVATION_CONTEXT_DETAILED_INFORMATION = struct { FdwFlags DWORD FulFormatVersion DWORD FulAssemblyCount DWORD FulRootManifestPathType DWORD FulRootManifestPathChars DWORD FulRootConfigurationPathType DWORD FulRootConfigurationPathChars DWORD FulAppDirPathType DWORD FulAppDirPathChars DWORD F__ccgo_pad1 [4]byte FlpRootManifestPath PCWSTR FlpRootConfigurationPath PCWSTR FlpAppDirPath PCWSTR } type ACTIVATION_CONTEXT_DETAILED_INFORMATION = _ACTIVATION_CONTEXT_DETAILED_INFORMATION type PACTIVATION_CONTEXT_DETAILED_INFORMATION = uintptr type PCACTIVATION_CONTEXT_QUERY_INDEX = uintptr type PCASSEMBLY_FILE_DETAILED_INFORMATION = uintptr type PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION = uintptr type PCACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION = uintptr type PCCOMPATIBILITY_CONTEXT_ELEMENT = uintptr type PCACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION = uintptr type PCACTIVATION_CONTEXT_DETAILED_INFORMATION = uintptr type RTL_VERIFIER_DLL_LOAD_CALLBACK = uintptr type RTL_VERIFIER_DLL_UNLOAD_CALLBACK = uintptr type RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK = uintptr type _RTL_VERIFIER_THUNK_DESCRIPTOR = struct { FThunkName PCHAR FThunkOldAddress PVOID FThunkNewAddress PVOID } type RTL_VERIFIER_THUNK_DESCRIPTOR = _RTL_VERIFIER_THUNK_DESCRIPTOR type PRTL_VERIFIER_THUNK_DESCRIPTOR = uintptr type _RTL_VERIFIER_DLL_DESCRIPTOR = struct { FDllName PWCHAR FDllFlags DWORD F__ccgo_pad1 [4]byte FDllAddress PVOID FDllThunks PRTL_VERIFIER_THUNK_DESCRIPTOR } type RTL_VERIFIER_DLL_DESCRIPTOR = _RTL_VERIFIER_DLL_DESCRIPTOR type PRTL_VERIFIER_DLL_DESCRIPTOR = uintptr type _RTL_VERIFIER_PROVIDER_DESCRIPTOR = struct { FLength DWORD F__ccgo_pad1 [4]byte FProviderDlls PRTL_VERIFIER_DLL_DESCRIPTOR FProviderDllLoadCallback RTL_VERIFIER_DLL_LOAD_CALLBACK FProviderDllUnloadCallback RTL_VERIFIER_DLL_UNLOAD_CALLBACK FVerifierImage PWSTR FVerifierFlags DWORD FVerifierDebug DWORD FRtlpGetStackTraceAddress PVOID FRtlpDebugPageHeapCreate PVOID FRtlpDebugPageHeapDestroy PVOID FProviderNtdllHeapFreeCallback RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK } type RTL_VERIFIER_PROVIDER_DESCRIPTOR = _RTL_VERIFIER_PROVIDER_DESCRIPTOR type PRTL_VERIFIER_PROVIDER_DESCRIPTOR = uintptr type _HARDWARE_COUNTER_DATA = struct { FType HARDWARE_COUNTER_TYPE FReserved DWORD FValue DWORD64 } type HARDWARE_COUNTER_DATA = _HARDWARE_COUNTER_DATA type PHARDWARE_COUNTER_DATA = uintptr type _PERFORMANCE_DATA = struct { FSize WORD FVersion BYTE FHwCountersCount BYTE FContextSwitchCount DWORD FWaitReasonBitMap DWORD64 FCycleTime DWORD64 FRetryCount DWORD FReserved DWORD FHwCounters [16]HARDWARE_COUNTER_DATA } type PERFORMANCE_DATA = _PERFORMANCE_DATA type PPERFORMANCE_DATA = uintptr type _EVENTLOGRECORD = struct { FLength DWORD FReserved DWORD FRecordNumber DWORD FTimeGenerated DWORD FTimeWritten DWORD FEventID DWORD FEventType WORD FNumStrings WORD FEventCategory WORD FReservedFlags WORD FClosingRecordNumber DWORD FStringOffset DWORD FUserSidLength DWORD FUserSidOffset DWORD FDataLength DWORD FDataOffset DWORD } type EVENTLOGRECORD = _EVENTLOGRECORD type PEVENTLOGRECORD = uintptr type _EVENTSFORLOGFILE = struct { F__ccgo_pad1 [0]uint32 FulSize DWORD FszLogicalLogFile [256]WCHAR FulNumRecords DWORD } type EVENTSFORLOGFILE = _EVENTSFORLOGFILE type PEVENTSFORLOGFILE = uintptr type _PACKEDEVENTINFO = struct { F__ccgo_pad1 [0]uint32 FulSize DWORD FulNumEventsForLogFile DWORD } type PACKEDEVENTINFO = _PACKEDEVENTINFO type PPACKEDEVENTINFO = uintptr type SERVICE_NODE_TYPE = uint32 type SERVICE_LOAD_TYPE = uint32 type SERVICE_ERROR_TYPE = uint32 type _TAPE_ERASE = struct { FType DWORD FImmediate BOOLEAN F__ccgo_pad1 [3]byte } type TAPE_ERASE = _TAPE_ERASE type PTAPE_ERASE = uintptr type _TAPE_PREPARE = struct { FOperation DWORD FImmediate BOOLEAN F__ccgo_pad1 [3]byte } type TAPE_PREPARE = _TAPE_PREPARE type PTAPE_PREPARE = uintptr type _TAPE_WRITE_MARKS = struct { FType DWORD FCount DWORD FImmediate BOOLEAN F__ccgo_pad1 [3]byte } type TAPE_WRITE_MARKS = _TAPE_WRITE_MARKS type PTAPE_WRITE_MARKS = uintptr type _TAPE_GET_POSITION = struct { FType DWORD FPartition DWORD FOffset LARGE_INTEGER } type TAPE_GET_POSITION = _TAPE_GET_POSITION type PTAPE_GET_POSITION = uintptr type _TAPE_SET_POSITION = struct { FMethod DWORD FPartition DWORD FOffset LARGE_INTEGER FImmediate BOOLEAN F__ccgo_pad1 [7]byte } type TAPE_SET_POSITION = _TAPE_SET_POSITION type PTAPE_SET_POSITION = uintptr type _TAPE_GET_DRIVE_PARAMETERS = struct { FECC BOOLEAN FCompression BOOLEAN FDataPadding BOOLEAN FReportSetmarks BOOLEAN FDefaultBlockSize DWORD FMaximumBlockSize DWORD FMinimumBlockSize DWORD FMaximumPartitionCount DWORD FFeaturesLow DWORD FFeaturesHigh DWORD FEOTWarningZoneSize DWORD } type TAPE_GET_DRIVE_PARAMETERS = _TAPE_GET_DRIVE_PARAMETERS type PTAPE_GET_DRIVE_PARAMETERS = uintptr type _TAPE_SET_DRIVE_PARAMETERS = struct { FECC BOOLEAN FCompression BOOLEAN FDataPadding BOOLEAN FReportSetmarks BOOLEAN FEOTWarningZoneSize DWORD } type TAPE_SET_DRIVE_PARAMETERS = _TAPE_SET_DRIVE_PARAMETERS type PTAPE_SET_DRIVE_PARAMETERS = uintptr type _TAPE_GET_MEDIA_PARAMETERS = struct { FCapacity LARGE_INTEGER FRemaining LARGE_INTEGER FBlockSize DWORD FPartitionCount DWORD FWriteProtected BOOLEAN F__ccgo_pad1 [7]byte } type TAPE_GET_MEDIA_PARAMETERS = _TAPE_GET_MEDIA_PARAMETERS type PTAPE_GET_MEDIA_PARAMETERS = uintptr type _TAPE_SET_MEDIA_PARAMETERS = struct{ FBlockSize DWORD } type TAPE_SET_MEDIA_PARAMETERS = _TAPE_SET_MEDIA_PARAMETERS type PTAPE_SET_MEDIA_PARAMETERS = uintptr type _TAPE_CREATE_PARTITION = struct { FMethod DWORD FCount DWORD FSize DWORD } type TAPE_CREATE_PARTITION = _TAPE_CREATE_PARTITION type PTAPE_CREATE_PARTITION = uintptr type _TAPE_WMI_OPERATIONS = struct { FMethod DWORD FDataBufferSize DWORD FDataBuffer PVOID } type TAPE_WMI_OPERATIONS = _TAPE_WMI_OPERATIONS type PTAPE_WMI_OPERATIONS = uintptr type TAPE_DRIVE_PROBLEM_TYPE = uint32 type TP_VERSION = DWORD type PTP_VERSION = uintptr type PTP_CALLBACK_INSTANCE = uintptr type PTP_SIMPLE_CALLBACK = uintptr type PTP_POOL = uintptr type TP_CALLBACK_PRIORITY = uint32 type _TP_POOL_STACK_INFORMATION = struct { FStackReserve SIZE_T FStackCommit SIZE_T } type TP_POOL_STACK_INFORMATION = _TP_POOL_STACK_INFORMATION type PTP_POOL_STACK_INFORMATION = uintptr type PTP_CLEANUP_GROUP = uintptr type PTP_CLEANUP_GROUP_CANCEL_CALLBACK = uintptr type _TP_CALLBACK_ENVIRON_V1 = struct { FVersion TP_VERSION F__ccgo_pad1 [4]byte FPool PTP_POOL FCleanupGroup PTP_CLEANUP_GROUP FCleanupGroupCancelCallback PTP_CLEANUP_GROUP_CANCEL_CALLBACK FRaceDll PVOID FActivationContext uintptr FFinalizationCallback PTP_SIMPLE_CALLBACK Fu struct{ FFlags DWORD } F__ccgo_pad2 [4]byte } type TP_CALLBACK_ENVIRON_V1 = _TP_CALLBACK_ENVIRON_V1 type TP_CALLBACK_ENVIRON = TP_CALLBACK_ENVIRON_V1 type PTP_CALLBACK_ENVIRON = uintptr type PTP_WORK = uintptr type PTP_WORK_CALLBACK = uintptr type PTP_TIMER = uintptr type PTP_TIMER_CALLBACK = uintptr type TP_WAIT_RESULT = DWORD type PTP_WAIT = uintptr type PTP_WAIT_CALLBACK = uintptr type PTP_IO = uintptr type CRM_PROTOCOL_ID = GUID type PCRM_PROTOCOL_ID = uintptr type NOTIFICATION_MASK = ULONG type _TRANSACTION_NOTIFICATION = struct { FTransactionKey PVOID FTransactionNotification ULONG F__ccgo_pad1 [4]byte FTmVirtualClock LARGE_INTEGER FArgumentLength ULONG F__ccgo_pad2 [4]byte } type TRANSACTION_NOTIFICATION = _TRANSACTION_NOTIFICATION type PTRANSACTION_NOTIFICATION = uintptr type _TRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT = struct { FEnlistmentId GUID FUOW GUID } type TRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT = _TRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT type PTRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT = uintptr type _TRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT = struct { FTmIdentity GUID FFlags ULONG } type TRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT = _TRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT type PTRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT = uintptr type SAVEPOINT_ID = ULONG type PSAVEPOINT_ID = uintptr type _TRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT = struct{ FSavepointId SAVEPOINT_ID } type TRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT = _TRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT type PTRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT = uintptr type _TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT = struct { FPropagationCookie ULONG FUOW GUID FTmIdentity GUID FBufferLength ULONG } type TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT = _TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT type PTRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT = uintptr type _TRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT = struct { FMarshalCookie ULONG FUOW GUID } type TRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT = _TRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT type PTRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT = uintptr type TRANSACTION_NOTIFICATION_PROMOTE_ARGUMENT = TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT type PTRANSACTION_NOTIFICATION_PROMOTE_ARGUMENT = uintptr type _KCRM_MARSHAL_HEADER = struct { FVersionMajor ULONG FVersionMinor ULONG FNumProtocols ULONG FUnused ULONG } type KCRM_MARSHAL_HEADER = _KCRM_MARSHAL_HEADER type PKCRM_MARSHAL_HEADER = uintptr type PRKCRM_MARSHAL_HEADER = uintptr type _KCRM_TRANSACTION_BLOB = struct { FUOW GUID FTmIdentity GUID FIsolationLevel ULONG FIsolationFlags ULONG FTimeout ULONG FDescription [64]WCHAR } type KCRM_TRANSACTION_BLOB = _KCRM_TRANSACTION_BLOB type PKCRM_TRANSACTION_BLOB = uintptr type PRKCRM_TRANSACTION_BLOB = uintptr type _KCRM_PROTOCOL_BLOB = struct { FProtocolId CRM_PROTOCOL_ID FStaticInfoLength ULONG FTransactionIdInfoLength ULONG FUnused1 ULONG FUnused2 ULONG } type KCRM_PROTOCOL_BLOB = _KCRM_PROTOCOL_BLOB type PKCRM_PROTOCOL_BLOB = uintptr type PRKCRM_PROTOCOL_BLOB = uintptr type TRANSACTION_OUTCOME = uint32 type TRANSACTION_STATE = uint32 type _TRANSACTION_BASIC_INFORMATION = struct { FTransactionId GUID FState DWORD FOutcome DWORD } type TRANSACTION_BASIC_INFORMATION = _TRANSACTION_BASIC_INFORMATION type PTRANSACTION_BASIC_INFORMATION = uintptr type _TRANSACTIONMANAGER_BASIC_INFORMATION = struct { FTmIdentity GUID FVirtualClock LARGE_INTEGER } type TRANSACTIONMANAGER_BASIC_INFORMATION = _TRANSACTIONMANAGER_BASIC_INFORMATION type PTRANSACTIONMANAGER_BASIC_INFORMATION = uintptr type _TRANSACTIONMANAGER_LOG_INFORMATION = struct{ FLogIdentity GUID } type TRANSACTIONMANAGER_LOG_INFORMATION = _TRANSACTIONMANAGER_LOG_INFORMATION type PTRANSACTIONMANAGER_LOG_INFORMATION = uintptr type _TRANSACTIONMANAGER_LOGPATH_INFORMATION = struct { FLogPathLength DWORD FLogPath [1]WCHAR F__ccgo_pad1 [2]byte } type TRANSACTIONMANAGER_LOGPATH_INFORMATION = _TRANSACTIONMANAGER_LOGPATH_INFORMATION type PTRANSACTIONMANAGER_LOGPATH_INFORMATION = uintptr type _TRANSACTIONMANAGER_RECOVERY_INFORMATION = struct{ FLastRecoveredLsn ULONGLONG } type TRANSACTIONMANAGER_RECOVERY_INFORMATION = _TRANSACTIONMANAGER_RECOVERY_INFORMATION type PTRANSACTIONMANAGER_RECOVERY_INFORMATION = uintptr type _TRANSACTIONMANAGER_OLDEST_INFORMATION = struct{ FOldestTransactionGuid GUID } type TRANSACTIONMANAGER_OLDEST_INFORMATION = _TRANSACTIONMANAGER_OLDEST_INFORMATION type PTRANSACTIONMANAGER_OLDEST_INFORMATION = uintptr type _TRANSACTION_PROPERTIES_INFORMATION = struct { FIsolationLevel DWORD FIsolationFlags DWORD FTimeout LARGE_INTEGER FOutcome DWORD FDescriptionLength DWORD FDescription [1]WCHAR F__ccgo_pad1 [6]byte } type TRANSACTION_PROPERTIES_INFORMATION = _TRANSACTION_PROPERTIES_INFORMATION type PTRANSACTION_PROPERTIES_INFORMATION = uintptr type _TRANSACTION_BIND_INFORMATION = struct{ FTmHandle HANDLE } type TRANSACTION_BIND_INFORMATION = _TRANSACTION_BIND_INFORMATION type PTRANSACTION_BIND_INFORMATION = uintptr type _TRANSACTION_ENLISTMENT_PAIR = struct { FEnlistmentId GUID FResourceManagerId GUID } type TRANSACTION_ENLISTMENT_PAIR = _TRANSACTION_ENLISTMENT_PAIR type PTRANSACTION_ENLISTMENT_PAIR = uintptr type _TRANSACTION_ENLISTMENTS_INFORMATION = struct { FNumberOfEnlistments DWORD FEnlistmentPair [1]TRANSACTION_ENLISTMENT_PAIR } type TRANSACTION_ENLISTMENTS_INFORMATION = _TRANSACTION_ENLISTMENTS_INFORMATION type PTRANSACTION_ENLISTMENTS_INFORMATION = uintptr type _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION = struct{ FSuperiorEnlistmentPair TRANSACTION_ENLISTMENT_PAIR } type TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION = _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION type PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION = uintptr type _RESOURCEMANAGER_BASIC_INFORMATION = struct { FResourceManagerId GUID FDescriptionLength DWORD FDescription [1]WCHAR F__ccgo_pad1 [2]byte } type RESOURCEMANAGER_BASIC_INFORMATION = _RESOURCEMANAGER_BASIC_INFORMATION type PRESOURCEMANAGER_BASIC_INFORMATION = uintptr type _RESOURCEMANAGER_COMPLETION_INFORMATION = struct { FIoCompletionPortHandle HANDLE FCompletionKey ULONG_PTR } type RESOURCEMANAGER_COMPLETION_INFORMATION = _RESOURCEMANAGER_COMPLETION_INFORMATION type PRESOURCEMANAGER_COMPLETION_INFORMATION = uintptr type TRANSACTION_INFORMATION_CLASS = uint32 type TRANSACTIONMANAGER_INFORMATION_CLASS = uint32 type RESOURCEMANAGER_INFORMATION_CLASS = uint32 type _ENLISTMENT_BASIC_INFORMATION = struct { FEnlistmentId GUID FTransactionId GUID FResourceManagerId GUID } type ENLISTMENT_BASIC_INFORMATION = _ENLISTMENT_BASIC_INFORMATION type PENLISTMENT_BASIC_INFORMATION = uintptr type _ENLISTMENT_CRM_INFORMATION = struct { FCrmTransactionManagerId GUID FCrmResourceManagerId GUID FCrmEnlistmentId GUID } type ENLISTMENT_CRM_INFORMATION = _ENLISTMENT_CRM_INFORMATION type PENLISTMENT_CRM_INFORMATION = uintptr type ENLISTMENT_INFORMATION_CLASS = uint32 type _TRANSACTION_LIST_ENTRY = struct{ FUOW GUID } type TRANSACTION_LIST_ENTRY = _TRANSACTION_LIST_ENTRY type PTRANSACTION_LIST_ENTRY = uintptr type _TRANSACTION_LIST_INFORMATION = struct { FNumberOfTransactions DWORD FTransactionInformation [1]TRANSACTION_LIST_ENTRY } type TRANSACTION_LIST_INFORMATION = _TRANSACTION_LIST_INFORMATION type PTRANSACTION_LIST_INFORMATION = uintptr type KTMOBJECT_TYPE = uint32 type PKTMOBJECT_TYPE = uintptr type _KTMOBJECT_CURSOR = struct { FLastQuery GUID FObjectIdCount DWORD FObjectIds [1]GUID } type KTMOBJECT_CURSOR = _KTMOBJECT_CURSOR type PKTMOBJECT_CURSOR = uintptr type _WOW64_FLOATING_SAVE_AREA = struct { FControlWord DWORD FStatusWord DWORD FTagWord DWORD FErrorOffset DWORD FErrorSelector DWORD FDataOffset DWORD FDataSelector DWORD FRegisterArea [80]BYTE FCr0NpxState DWORD } type WOW64_FLOATING_SAVE_AREA = _WOW64_FLOATING_SAVE_AREA type PWOW64_FLOATING_SAVE_AREA = uintptr type _WOW64_CONTEXT = struct { FContextFlags DWORD FDr0 DWORD FDr1 DWORD FDr2 DWORD FDr3 DWORD FDr6 DWORD FDr7 DWORD FFloatSave WOW64_FLOATING_SAVE_AREA FSegGs DWORD FSegFs DWORD FSegEs DWORD FSegDs DWORD FEdi DWORD FEsi DWORD FEbx DWORD FEdx DWORD FEcx DWORD FEax DWORD FEbp DWORD FEip DWORD FSegCs DWORD FEFlags DWORD FEsp DWORD FSegSs DWORD FExtendedRegisters [512]BYTE } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type WOW64_CONTEXT = _WOW64_CONTEXT type PWOW64_CONTEXT = uintptr type _WOW64_LDT_ENTRY = struct { FLimitLow WORD FBaseLow WORD FHighWord struct { F__ccgo_pad1 [0]uint32 FBytes struct { FBaseMid BYTE FFlags1 BYTE FFlags2 BYTE FBaseHi BYTE } } } type WOW64_LDT_ENTRY = _WOW64_LDT_ENTRY type PWOW64_LDT_ENTRY = uintptr type _WOW64_DESCRIPTOR_TABLE_ENTRY = struct { FSelector DWORD FDescriptor WOW64_LDT_ENTRY } type WOW64_DESCRIPTOR_TABLE_ENTRY = _WOW64_DESCRIPTOR_TABLE_ENTRY type PWOW64_DESCRIPTOR_TABLE_ENTRY = uintptr type WPARAM = UINT_PTR type LPARAM = LONG_PTR type LRESULT = LONG_PTR type SPHANDLE = uintptr type LPHANDLE = uintptr type HGLOBAL = HANDLE type HLOCAL = HANDLE type GLOBALHANDLE = HANDLE type LOCALHANDLE = HANDLE type FARPROC = uintptr type NEARPROC = uintptr type PROC = uintptr type ATOM = WORD type HFILE = int32 type HINSTANCE__ = struct{ Funused int32 } type HINSTANCE = uintptr type HKEY__ = struct{ Funused int32 } type HKEY = uintptr type PHKEY = uintptr type HKL__ = struct{ Funused int32 } type HKL = uintptr type HLSURF__ = struct{ Funused int32 } type HLSURF = uintptr type HMETAFILE__ = struct{ Funused int32 } type HMETAFILE = uintptr type HMODULE = HINSTANCE type HRGN__ = struct{ Funused int32 } type HRGN = uintptr type HRSRC__ = struct{ Funused int32 } type HRSRC = uintptr type HSPRITE__ = struct{ Funused int32 } type HSPRITE = uintptr type HSTR__ = struct{ Funused int32 } type HSTR = uintptr type HTASK__ = struct{ Funused int32 } type HTASK = uintptr type HWINSTA__ = struct{ Funused int32 } type HWINSTA = uintptr type _FILETIME = struct { FdwLowDateTime DWORD FdwHighDateTime DWORD } type FILETIME = _FILETIME type PFILETIME = uintptr type LPFILETIME = uintptr type HWND__ = struct{ Funused int32 } type HWND = uintptr type HHOOK__ = struct{ Funused int32 } type HHOOK = uintptr type HGDIOBJ = uintptr type HACCEL__ = struct{ Funused int32 } type HACCEL = uintptr type HBITMAP__ = struct{ Funused int32 } type HBITMAP = uintptr type HBRUSH__ = struct{ Funused int32 } type HBRUSH = uintptr type HCOLORSPACE__ = struct{ Funused int32 } type HCOLORSPACE = uintptr type HDC__ = struct{ Funused int32 } type HDC = uintptr type HGLRC__ = struct{ Funused int32 } type HGLRC = uintptr type HDESK__ = struct{ Funused int32 } type HDESK = uintptr type HENHMETAFILE__ = struct{ Funused int32 } type HENHMETAFILE = uintptr type HFONT__ = struct{ Funused int32 } type HFONT = uintptr type HICON__ = struct{ Funused int32 } type HICON = uintptr type HMENU__ = struct{ Funused int32 } type HMENU = uintptr type HPALETTE__ = struct{ Funused int32 } type HPALETTE = uintptr type HPEN__ = struct{ Funused int32 } type HPEN = uintptr type HMONITOR__ = struct{ Funused int32 } type HMONITOR = uintptr type HWINEVENTHOOK__ = struct{ Funused int32 } type HWINEVENTHOOK = uintptr type HCURSOR = HICON type COLORREF = DWORD type HUMPD__ = struct{ Funused int32 } type HUMPD = uintptr type LPCOLORREF = uintptr type tagRECT = struct { Fleft LONG Ftop LONG Fright LONG Fbottom LONG } type RECT = tagRECT type PRECT = uintptr type NPRECT = uintptr type LPRECT = uintptr type LPCRECT = uintptr type _RECTL = struct { Fleft LONG Ftop LONG Fright LONG Fbottom LONG } type RECTL = _RECTL type PRECTL = uintptr type LPRECTL = uintptr type LPCRECTL = uintptr type tagPOINT = struct { Fx LONG Fy LONG } type POINT = tagPOINT type PPOINT = uintptr type NPPOINT = uintptr type LPPOINT = uintptr type _POINTL = struct { Fx LONG Fy LONG } type POINTL = _POINTL type PPOINTL = uintptr type tagSIZE = struct { Fcx LONG Fcy LONG } type SIZE = tagSIZE type PSIZE = uintptr type LPSIZE = uintptr type SIZEL = SIZE type PSIZEL = uintptr type LPSIZEL = uintptr type tagPOINTS = struct { Fx SHORT Fy SHORT } type POINTS = tagPOINTS type PPOINTS = uintptr type LPPOINTS = uintptr type APP_LOCAL_DEVICE_ID1 = struct{ Fvalue [32]BYTE } type APP_LOCAL_DEVICE_ID = APP_LOCAL_DEVICE_ID1 type DPI_AWARENESS_CONTEXT__ = struct{ Funused int32 } type DPI_AWARENESS_CONTEXT = uintptr type DPI_AWARENESS = int32 type DPI_HOSTING_BEHAVIOR = int32 type _SECURITY_ATTRIBUTES = struct { FnLength DWORD F__ccgo_pad1 [4]byte FlpSecurityDescriptor LPVOID FbInheritHandle WINBOOL F__ccgo_pad2 [4]byte } type SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES type PSECURITY_ATTRIBUTES = uintptr type LPSECURITY_ATTRIBUTES = uintptr type _OVERLAPPED = struct { FInternal ULONG_PTR FInternalHigh ULONG_PTR Fu struct { F__ccgo_pad1 [0]uint64 Fs struct { FOffset DWORD FOffsetHigh DWORD } } FhEvent HANDLE } type OVERLAPPED = _OVERLAPPED type LPOVERLAPPED = uintptr type _OVERLAPPED_ENTRY = struct { FlpCompletionKey ULONG_PTR FlpOverlapped LPOVERLAPPED FInternal ULONG_PTR FdwNumberOfBytesTransferred DWORD F__ccgo_pad1 [4]byte } type OVERLAPPED_ENTRY = _OVERLAPPED_ENTRY type LPOVERLAPPED_ENTRY = uintptr type _SYSTEMTIME = struct { FwYear WORD FwMonth WORD FwDayOfWeek WORD FwDay WORD FwHour WORD FwMinute WORD FwSecond WORD FwMilliseconds WORD } type SYSTEMTIME = _SYSTEMTIME type PSYSTEMTIME = uintptr type LPSYSTEMTIME = uintptr type _WIN32_FIND_DATAA = struct { FdwFileAttributes DWORD FftCreationTime FILETIME FftLastAccessTime FILETIME FftLastWriteTime FILETIME FnFileSizeHigh DWORD FnFileSizeLow DWORD FdwReserved0 DWORD FdwReserved1 DWORD FcFileName [260]CHAR FcAlternateFileName [14]CHAR F__ccgo_pad1 [2]byte } type WIN32_FIND_DATAA = _WIN32_FIND_DATAA type PWIN32_FIND_DATAA = uintptr type LPWIN32_FIND_DATAA = uintptr type _WIN32_FIND_DATAW = struct { FdwFileAttributes DWORD FftCreationTime FILETIME FftLastAccessTime FILETIME FftLastWriteTime FILETIME FnFileSizeHigh DWORD FnFileSizeLow DWORD FdwReserved0 DWORD FdwReserved1 DWORD FcFileName [260]WCHAR FcAlternateFileName [14]WCHAR } type WIN32_FIND_DATAW = _WIN32_FIND_DATAW type PWIN32_FIND_DATAW = uintptr type LPWIN32_FIND_DATAW = uintptr type WIN32_FIND_DATA = WIN32_FIND_DATAA type PWIN32_FIND_DATA = PWIN32_FIND_DATAA type LPWIN32_FIND_DATA = LPWIN32_FIND_DATAA type FINDEX_INFO_LEVELS = uint32 type FINDEX_SEARCH_OPS = uint32 type GET_FILEEX_INFO_LEVELS = uint32 type CRITICAL_SECTION = RTL_CRITICAL_SECTION type PCRITICAL_SECTION = PRTL_CRITICAL_SECTION type LPCRITICAL_SECTION = PRTL_CRITICAL_SECTION type CRITICAL_SECTION_DEBUG = RTL_CRITICAL_SECTION_DEBUG type PCRITICAL_SECTION_DEBUG = PRTL_CRITICAL_SECTION_DEBUG type LPCRITICAL_SECTION_DEBUG = PRTL_CRITICAL_SECTION_DEBUG type LPOVERLAPPED_COMPLETION_ROUTINE = uintptr type _PROCESS_HEAP_ENTRY = struct { FlpData PVOID FcbData DWORD FcbOverhead BYTE FiRegionIndex BYTE FwFlags WORD Fu struct { FBlock struct { FhMem HANDLE FdwReserved [3]DWORD F__ccgo_pad1 [4]byte } } } type PROCESS_HEAP_ENTRY = _PROCESS_HEAP_ENTRY type LPPROCESS_HEAP_ENTRY = uintptr type PPROCESS_HEAP_ENTRY = uintptr type _REASON_CONTEXT = struct { FVersion ULONG FFlags DWORD FReason struct { FDetailed struct { FLocalizedReasonModule HMODULE FLocalizedReasonId ULONG FReasonStringCount ULONG FReasonStrings uintptr } } } type REASON_CONTEXT = _REASON_CONTEXT type PREASON_CONTEXT = uintptr type PTHREAD_START_ROUTINE = uintptr type LPTHREAD_START_ROUTINE = PTHREAD_START_ROUTINE type PENCLAVE_ROUTINE = uintptr type LPENCLAVE_ROUTINE = PENCLAVE_ROUTINE type _EXCEPTION_DEBUG_INFO = struct { FExceptionRecord EXCEPTION_RECORD FdwFirstChance DWORD F__ccgo_pad1 [4]byte } type EXCEPTION_DEBUG_INFO = _EXCEPTION_DEBUG_INFO type LPEXCEPTION_DEBUG_INFO = uintptr type _CREATE_THREAD_DEBUG_INFO = struct { FhThread HANDLE FlpThreadLocalBase LPVOID FlpStartAddress LPTHREAD_START_ROUTINE } type CREATE_THREAD_DEBUG_INFO = _CREATE_THREAD_DEBUG_INFO type LPCREATE_THREAD_DEBUG_INFO = uintptr type _CREATE_PROCESS_DEBUG_INFO = struct { FhFile HANDLE FhProcess HANDLE FhThread HANDLE FlpBaseOfImage LPVOID FdwDebugInfoFileOffset DWORD FnDebugInfoSize DWORD FlpThreadLocalBase LPVOID FlpStartAddress LPTHREAD_START_ROUTINE FlpImageName LPVOID FfUnicode WORD F__ccgo_pad1 [6]byte } type CREATE_PROCESS_DEBUG_INFO = _CREATE_PROCESS_DEBUG_INFO type LPCREATE_PROCESS_DEBUG_INFO = uintptr type _EXIT_THREAD_DEBUG_INFO = struct{ FdwExitCode DWORD } type EXIT_THREAD_DEBUG_INFO = _EXIT_THREAD_DEBUG_INFO type LPEXIT_THREAD_DEBUG_INFO = uintptr type _EXIT_PROCESS_DEBUG_INFO = struct{ FdwExitCode DWORD } type EXIT_PROCESS_DEBUG_INFO = _EXIT_PROCESS_DEBUG_INFO type LPEXIT_PROCESS_DEBUG_INFO = uintptr type _LOAD_DLL_DEBUG_INFO = struct { FhFile HANDLE FlpBaseOfDll LPVOID FdwDebugInfoFileOffset DWORD FnDebugInfoSize DWORD FlpImageName LPVOID FfUnicode WORD F__ccgo_pad1 [6]byte } type LOAD_DLL_DEBUG_INFO = _LOAD_DLL_DEBUG_INFO type LPLOAD_DLL_DEBUG_INFO = uintptr type _UNLOAD_DLL_DEBUG_INFO = struct{ FlpBaseOfDll LPVOID } type UNLOAD_DLL_DEBUG_INFO = _UNLOAD_DLL_DEBUG_INFO type LPUNLOAD_DLL_DEBUG_INFO = uintptr type _OUTPUT_DEBUG_STRING_INFO = struct { FlpDebugStringData LPSTR FfUnicode WORD FnDebugStringLength WORD F__ccgo_pad1 [4]byte } type OUTPUT_DEBUG_STRING_INFO = _OUTPUT_DEBUG_STRING_INFO type LPOUTPUT_DEBUG_STRING_INFO = uintptr type _RIP_INFO = struct { FdwError DWORD FdwType DWORD } type RIP_INFO = _RIP_INFO type LPRIP_INFO = uintptr type _DEBUG_EVENT = struct { FdwDebugEventCode DWORD FdwProcessId DWORD FdwThreadId DWORD F__ccgo_pad1 [4]byte Fu struct{ FException EXCEPTION_DEBUG_INFO } } type DEBUG_EVENT = _DEBUG_EVENT type LPDEBUG_EVENT = uintptr type LPCONTEXT = PCONTEXT type BEM_FREE_INTERFACE_CALLBACK = uintptr type PTOP_LEVEL_EXCEPTION_FILTER = uintptr type LPTOP_LEVEL_EXCEPTION_FILTER = PTOP_LEVEL_EXCEPTION_FILTER type _BY_HANDLE_FILE_INFORMATION = struct { FdwFileAttributes DWORD FftCreationTime FILETIME FftLastAccessTime FILETIME FftLastWriteTime FILETIME FdwVolumeSerialNumber DWORD FnFileSizeHigh DWORD FnFileSizeLow DWORD FnNumberOfLinks DWORD FnFileIndexHigh DWORD FnFileIndexLow DWORD } type BY_HANDLE_FILE_INFORMATION = _BY_HANDLE_FILE_INFORMATION type PBY_HANDLE_FILE_INFORMATION = uintptr type LPBY_HANDLE_FILE_INFORMATION = uintptr type _WIN32_FILE_ATTRIBUTE_DATA = struct { FdwFileAttributes DWORD FftCreationTime FILETIME FftLastAccessTime FILETIME FftLastWriteTime FILETIME FnFileSizeHigh DWORD FnFileSizeLow DWORD } type WIN32_FILE_ATTRIBUTE_DATA = _WIN32_FILE_ATTRIBUTE_DATA type LPWIN32_FILE_ATTRIBUTE_DATA = uintptr type _HEAP_SUMMARY = struct { Fcb DWORD F__ccgo_pad1 [4]byte FcbAllocated SIZE_T FcbCommitted SIZE_T FcbReserved SIZE_T FcbMaxReserve SIZE_T } type HEAP_SUMMARY = _HEAP_SUMMARY type PHEAP_SUMMARY = uintptr type LPHEAP_SUMMARY = PHEAP_SUMMARY type tagENUMUILANG = struct { FNumOfEnumUILang ULONG FSizeOfEnumUIBuffer ULONG FpEnumUIBuffer uintptr } type ENUMUILANG = tagENUMUILANG type PENUMUILANG = uintptr type ENUMRESLANGPROCA = uintptr type ENUMRESLANGPROCW = uintptr type ENUMRESNAMEPROCA = uintptr type ENUMRESNAMEPROCW = uintptr type ENUMRESTYPEPROCA = uintptr type ENUMRESTYPEPROCW = uintptr type PGET_MODULE_HANDLE_EXA = uintptr type PGET_MODULE_HANDLE_EXW = uintptr type DLL_DIRECTORY_COOKIE = PVOID type PDLL_DIRECTORY_COOKIE = uintptr type _REDIRECTION_FUNCTION_DESCRIPTOR = struct { FDllName PCSTR FFunctionName PCSTR FRedirectionTarget PVOID } type REDIRECTION_FUNCTION_DESCRIPTOR = _REDIRECTION_FUNCTION_DESCRIPTOR type PREDIRECTION_FUNCTION_DESCRIPTOR = uintptr type PCREDIRECTION_FUNCTION_DESCRIPTOR = uintptr type _REDIRECTION_DESCRIPTOR = struct { FVersion ULONG FFunctionCount ULONG FRedirections PCREDIRECTION_FUNCTION_DESCRIPTOR } type REDIRECTION_DESCRIPTOR = _REDIRECTION_DESCRIPTOR type PREDIRECTION_DESCRIPTOR = uintptr type PCREDIRECTION_DESCRIPTOR = uintptr type MEMORY_RESOURCE_NOTIFICATION_TYPE = uint32 type _STARTUPINFOA = struct { Fcb DWORD F__ccgo_pad1 [4]byte FlpReserved LPSTR FlpDesktop LPSTR FlpTitle LPSTR FdwX DWORD FdwY DWORD FdwXSize DWORD FdwYSize DWORD FdwXCountChars DWORD FdwYCountChars DWORD FdwFillAttribute DWORD FdwFlags DWORD FwShowWindow WORD FcbReserved2 WORD F__ccgo_pad2 [4]byte FlpReserved2 LPBYTE FhStdInput HANDLE FhStdOutput HANDLE FhStdError HANDLE } type STARTUPINFOA = _STARTUPINFOA type LPSTARTUPINFOA = uintptr type _STARTUPINFOW = struct { Fcb DWORD F__ccgo_pad1 [4]byte FlpReserved LPWSTR FlpDesktop LPWSTR FlpTitle LPWSTR FdwX DWORD FdwY DWORD FdwXSize DWORD FdwYSize DWORD FdwXCountChars DWORD FdwYCountChars DWORD FdwFillAttribute DWORD FdwFlags DWORD FwShowWindow WORD FcbReserved2 WORD F__ccgo_pad2 [4]byte FlpReserved2 LPBYTE FhStdInput HANDLE FhStdOutput HANDLE FhStdError HANDLE } type STARTUPINFOW = _STARTUPINFOW type LPSTARTUPINFOW = uintptr type STARTUPINFO = STARTUPINFOA type LPSTARTUPINFO = LPSTARTUPINFOA type _PROCESS_INFORMATION = struct { FhProcess HANDLE FhThread HANDLE FdwProcessId DWORD FdwThreadId DWORD } type PROCESS_INFORMATION = _PROCESS_INFORMATION type PPROCESS_INFORMATION = uintptr type LPPROCESS_INFORMATION = uintptr type PPROC_THREAD_ATTRIBUTE_LIST = uintptr type LPPROC_THREAD_ATTRIBUTE_LIST = uintptr type SRWLOCK = RTL_SRWLOCK type PSRWLOCK = uintptr type INIT_ONCE = RTL_RUN_ONCE type PINIT_ONCE = PRTL_RUN_ONCE type LPINIT_ONCE = PRTL_RUN_ONCE type PINIT_ONCE_FN = uintptr type CONDITION_VARIABLE = RTL_CONDITION_VARIABLE type PCONDITION_VARIABLE = uintptr type PTIMERAPCROUTINE = uintptr type SYNCHRONIZATION_BARRIER = RTL_BARRIER type PSYNCHRONIZATION_BARRIER = PRTL_BARRIER type LPSYNCHRONIZATION_BARRIER = PRTL_BARRIER type _SYSTEM_INFO = struct { Fu struct{ FdwOemId DWORD } FdwPageSize DWORD FlpMinimumApplicationAddress LPVOID FlpMaximumApplicationAddress LPVOID FdwActiveProcessorMask DWORD_PTR FdwNumberOfProcessors DWORD FdwProcessorType DWORD FdwAllocationGranularity DWORD FwProcessorLevel WORD FwProcessorRevision WORD } type SYSTEM_INFO = _SYSTEM_INFO type LPSYSTEM_INFO = uintptr type _MEMORYSTATUSEX = struct { FdwLength DWORD FdwMemoryLoad DWORD FullTotalPhys DWORDLONG FullAvailPhys DWORDLONG FullTotalPageFile DWORDLONG FullAvailPageFile DWORDLONG FullTotalVirtual DWORDLONG FullAvailVirtual DWORDLONG FullAvailExtendedVirtual DWORDLONG } type MEMORYSTATUSEX = _MEMORYSTATUSEX type LPMEMORYSTATUSEX = uintptr type COMPUTER_NAME_FORMAT = uint32 type PTP_WIN32_IO_CALLBACK = uintptr type PFIBER_START_ROUTINE = uintptr type LPFIBER_START_ROUTINE = PFIBER_START_ROUTINE type LPLDT_ENTRY = LPVOID type _COMMPROP = struct { FwPacketLength WORD FwPacketVersion WORD FdwServiceMask DWORD FdwReserved1 DWORD FdwMaxTxQueue DWORD FdwMaxRxQueue DWORD FdwMaxBaud DWORD FdwProvSubType DWORD FdwProvCapabilities DWORD FdwSettableParams DWORD FdwSettableBaud DWORD FwSettableData WORD FwSettableStopParity WORD FdwCurrentTxQueue DWORD FdwCurrentRxQueue DWORD FdwProvSpec1 DWORD FdwProvSpec2 DWORD FwcProvChar [1]WCHAR F__ccgo_pad1 [2]byte } type COMMPROP = _COMMPROP type LPCOMMPROP = uintptr type _COMSTAT = struct { FfCtsHold uint32 F__ccgo_pad1 [4]byte FcbInQue DWORD FcbOutQue DWORD } type COMSTAT = _COMSTAT type LPCOMSTAT = uintptr type _DCB = struct { FDCBlength DWORD FBaudRate DWORD FfBinary uint32 F__ccgo_pad1 [2]byte FwReserved WORD FXonLim WORD FXoffLim WORD FByteSize BYTE FParity BYTE FStopBits BYTE FXonChar int8 FXoffChar int8 FErrorChar int8 FEofChar int8 FEvtChar int8 FwReserved1 WORD F__ccgo_pad2 [2]byte } type DCB = _DCB type LPDCB = uintptr type _COMMTIMEOUTS = struct { FReadIntervalTimeout DWORD FReadTotalTimeoutMultiplier DWORD FReadTotalTimeoutConstant DWORD FWriteTotalTimeoutMultiplier DWORD FWriteTotalTimeoutConstant DWORD } type COMMTIMEOUTS = _COMMTIMEOUTS type LPCOMMTIMEOUTS = uintptr type _COMMCONFIG = struct { FdwSize DWORD FwVersion WORD FwReserved WORD Fdcb DCB FdwProviderSubType DWORD FdwProviderOffset DWORD FdwProviderSize DWORD FwcProviderData [1]WCHAR F__ccgo_pad1 [2]byte } type COMMCONFIG = _COMMCONFIG type LPCOMMCONFIG = uintptr type _MEMORYSTATUS = struct { FdwLength DWORD FdwMemoryLoad DWORD FdwTotalPhys SIZE_T FdwAvailPhys SIZE_T FdwTotalPageFile SIZE_T FdwAvailPageFile SIZE_T FdwTotalVirtual SIZE_T FdwAvailVirtual SIZE_T } type MEMORYSTATUS = _MEMORYSTATUS type LPMEMORYSTATUS = uintptr type _JIT_DEBUG_INFO = struct { FdwSize DWORD FdwProcessorArchitecture DWORD FdwThreadID DWORD FdwReserved0 DWORD FlpExceptionAddress ULONG64 FlpExceptionRecord ULONG64 FlpContextRecord ULONG64 } type JIT_DEBUG_INFO = _JIT_DEBUG_INFO type LPJIT_DEBUG_INFO = uintptr type JIT_DEBUG_INFO32 = JIT_DEBUG_INFO type LPJIT_DEBUG_INFO32 = uintptr type JIT_DEBUG_INFO64 = JIT_DEBUG_INFO type LPJIT_DEBUG_INFO64 = uintptr type LPEXCEPTION_RECORD = PEXCEPTION_RECORD type LPEXCEPTION_POINTERS = PEXCEPTION_POINTERS type _OFSTRUCT = struct { FcBytes BYTE FfFixedDisk BYTE FnErrCode WORD FReserved1 WORD FReserved2 WORD FszPathName [128]CHAR } type OFSTRUCT = _OFSTRUCT type LPOFSTRUCT = uintptr type POFSTRUCT = uintptr type THREAD_INFORMATION_CLASS = uint32 type DEP_SYSTEM_POLICY_TYPE = uint32 type PFE_EXPORT_FUNC = uintptr type PFE_IMPORT_FUNC = uintptr type _WIN32_STREAM_ID = struct { FdwStreamId DWORD FdwStreamAttributes DWORD FSize LARGE_INTEGER FdwStreamNameSize DWORD FcStreamName [1]WCHAR F__ccgo_pad1 [2]byte } type WIN32_STREAM_ID = _WIN32_STREAM_ID type LPWIN32_STREAM_ID = uintptr type PROCESS_INFORMATION_CLASS = uint32 type PGET_SYSTEM_WOW64_DIRECTORY_A = uintptr type PGET_SYSTEM_WOW64_DIRECTORY_W = uintptr type LPPROGRESS_ROUTINE = uintptr type STREAM_INFO_LEVELS = uint32 type _WIN32_FIND_STREAM_DATA = struct { FStreamSize LARGE_INTEGER FcStreamName [296]WCHAR } type WIN32_FIND_STREAM_DATA = _WIN32_FIND_STREAM_DATA type PWIN32_FIND_STREAM_DATA = uintptr type _EVENTLOG_FULL_INFORMATION = struct{ FdwFull DWORD } type EVENTLOG_FULL_INFORMATION = _EVENTLOG_FULL_INFORMATION type LPEVENTLOG_FULL_INFORMATION = uintptr type tagHW_PROFILE_INFOA = struct { FdwDockInfo DWORD FszHwProfileGuid [39]CHAR FszHwProfileName [80]CHAR F__ccgo_pad1 [1]byte } type HW_PROFILE_INFOA = tagHW_PROFILE_INFOA type LPHW_PROFILE_INFOA = uintptr type tagHW_PROFILE_INFOW = struct { FdwDockInfo DWORD FszHwProfileGuid [39]WCHAR FszHwProfileName [80]WCHAR F__ccgo_pad1 [2]byte } type HW_PROFILE_INFOW = tagHW_PROFILE_INFOW type LPHW_PROFILE_INFOW = uintptr type HW_PROFILE_INFO = HW_PROFILE_INFOA type LPHW_PROFILE_INFO = LPHW_PROFILE_INFOA type _TIME_ZONE_INFORMATION = struct { FBias LONG FStandardName [32]WCHAR FStandardDate SYSTEMTIME FStandardBias LONG FDaylightName [32]WCHAR FDaylightDate SYSTEMTIME FDaylightBias LONG } type TIME_ZONE_INFORMATION = _TIME_ZONE_INFORMATION type PTIME_ZONE_INFORMATION = uintptr type LPTIME_ZONE_INFORMATION = uintptr type _TIME_DYNAMIC_ZONE_INFORMATION = struct { FBias LONG FStandardName [32]WCHAR FStandardDate SYSTEMTIME FStandardBias LONG FDaylightName [32]WCHAR FDaylightDate SYSTEMTIME FDaylightBias LONG FTimeZoneKeyName [128]WCHAR FDynamicDaylightTimeDisabled BOOLEAN F__ccgo_pad1 [3]byte } type DYNAMIC_TIME_ZONE_INFORMATION = _TIME_DYNAMIC_ZONE_INFORMATION type PDYNAMIC_TIME_ZONE_INFORMATION = uintptr type _SYSTEM_POWER_STATUS = struct { FACLineStatus BYTE FBatteryFlag BYTE FBatteryLifePercent BYTE FReserved1 BYTE FBatteryLifeTime DWORD FBatteryFullLifeTime DWORD } type SYSTEM_POWER_STATUS = _SYSTEM_POWER_STATUS type LPSYSTEM_POWER_STATUS = uintptr type tagACTCTXA = struct { FcbSize ULONG FdwFlags DWORD FlpSource LPCSTR FwProcessorArchitecture USHORT FwLangId LANGID F__ccgo_pad1 [4]byte FlpAssemblyDirectory LPCSTR FlpResourceName LPCSTR FlpApplicationName LPCSTR FhModule HMODULE } type ACTCTXA = tagACTCTXA type PACTCTXA = uintptr type tagACTCTXW = struct { FcbSize ULONG FdwFlags DWORD FlpSource LPCWSTR FwProcessorArchitecture USHORT FwLangId LANGID F__ccgo_pad1 [4]byte FlpAssemblyDirectory LPCWSTR FlpResourceName LPCWSTR FlpApplicationName LPCWSTR FhModule HMODULE } type ACTCTXW = tagACTCTXW type PACTCTXW = uintptr type ACTCTX = ACTCTXA type PACTCTX = PACTCTXA type PCACTCTXA = uintptr type PCACTCTXW = uintptr type PCACTCTX = PCACTCTXA type tagACTCTX_SECTION_KEYED_DATA_2600 = struct { FcbSize ULONG FulDataFormatVersion ULONG FlpData PVOID FulLength ULONG F__ccgo_pad1 [4]byte FlpSectionGlobalData PVOID FulSectionGlobalDataLength ULONG F__ccgo_pad2 [4]byte FlpSectionBase PVOID FulSectionTotalLength ULONG F__ccgo_pad3 [4]byte FhActCtx HANDLE FulAssemblyRosterIndex ULONG F__ccgo_pad4 [4]byte } type ACTCTX_SECTION_KEYED_DATA_2600 = tagACTCTX_SECTION_KEYED_DATA_2600 type PACTCTX_SECTION_KEYED_DATA_2600 = uintptr type PCACTCTX_SECTION_KEYED_DATA_2600 = uintptr type tagACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA = struct { FlpInformation PVOID FlpSectionBase PVOID FulSectionLength ULONG F__ccgo_pad1 [4]byte FlpSectionGlobalDataBase PVOID FulSectionGlobalDataLength ULONG F__ccgo_pad2 [4]byte } type ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA = tagACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA type PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA = uintptr type PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA = uintptr type tagACTCTX_SECTION_KEYED_DATA = struct { FcbSize ULONG FulDataFormatVersion ULONG FlpData PVOID FulLength ULONG F__ccgo_pad1 [4]byte FlpSectionGlobalData PVOID FulSectionGlobalDataLength ULONG F__ccgo_pad2 [4]byte FlpSectionBase PVOID FulSectionTotalLength ULONG F__ccgo_pad3 [4]byte FhActCtx HANDLE FulAssemblyRosterIndex ULONG FulFlags ULONG FAssemblyMetadata ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA } type ACTCTX_SECTION_KEYED_DATA = tagACTCTX_SECTION_KEYED_DATA type PACTCTX_SECTION_KEYED_DATA = uintptr type PCACTCTX_SECTION_KEYED_DATA = uintptr type _ACTIVATION_CONTEXT_BASIC_INFORMATION = struct { FhActCtx HANDLE FdwFlags DWORD F__ccgo_pad1 [4]byte } type ACTIVATION_CONTEXT_BASIC_INFORMATION = _ACTIVATION_CONTEXT_BASIC_INFORMATION type PACTIVATION_CONTEXT_BASIC_INFORMATION = uintptr type PCACTIVATION_CONTEXT_BASIC_INFORMATION = uintptr type PQUERYACTCTXW_FUNC = uintptr type APPLICATION_RECOVERY_CALLBACK = uintptr type _DRAWPATRECT = struct { FptPosition POINT FptSize POINT FwStyle WORD FwPattern WORD } type DRAWPATRECT = _DRAWPATRECT type PDRAWPATRECT = uintptr type _PSINJECTDATA = struct { FDataBytes DWORD FInjectionPoint WORD FPageNumber WORD } type PSINJECTDATA = _PSINJECTDATA type PPSINJECTDATA = uintptr type _PSFEATURE_OUTPUT = struct { FbPageIndependent WINBOOL FbSetPageDevice WINBOOL } type PSFEATURE_OUTPUT = _PSFEATURE_OUTPUT type PPSFEATURE_OUTPUT = uintptr type _PSFEATURE_CUSTPAPER = struct { FlOrientation LONG FlWidth LONG FlHeight LONG FlWidthOffset LONG FlHeightOffset LONG } type PSFEATURE_CUSTPAPER = _PSFEATURE_CUSTPAPER type PPSFEATURE_CUSTPAPER = uintptr type tagXFORM = struct { FeM11 FLOAT FeM12 FLOAT FeM21 FLOAT FeM22 FLOAT FeDx FLOAT FeDy FLOAT } type XFORM = tagXFORM type PXFORM = uintptr type LPXFORM = uintptr type tagBITMAP = struct { FbmType LONG FbmWidth LONG FbmHeight LONG FbmWidthBytes LONG FbmPlanes WORD FbmBitsPixel WORD F__ccgo_pad1 [4]byte FbmBits LPVOID } type BITMAP = tagBITMAP type PBITMAP = uintptr type NPBITMAP = uintptr type LPBITMAP = uintptr type tagRGBTRIPLE = struct { FrgbtBlue BYTE FrgbtGreen BYTE FrgbtRed BYTE } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type RGBTRIPLE = tagRGBTRIPLE type PRGBTRIPLE = uintptr type NPRGBTRIPLE = uintptr type LPRGBTRIPLE = uintptr type tagRGBQUAD = struct { FrgbBlue BYTE FrgbGreen BYTE FrgbRed BYTE FrgbReserved BYTE } type RGBQUAD = tagRGBQUAD type LPRGBQUAD = uintptr type LCSCSTYPE = LONG type LCSGAMUTMATCH = LONG type FXPT16DOT16 = int32 type LPFXPT16DOT16 = uintptr type FXPT2DOT30 = int32 type LPFXPT2DOT30 = uintptr type tagCIEXYZ = struct { FciexyzX FXPT2DOT30 FciexyzY FXPT2DOT30 FciexyzZ FXPT2DOT30 } type CIEXYZ = tagCIEXYZ type LPCIEXYZ = uintptr type tagICEXYZTRIPLE = struct { FciexyzRed CIEXYZ FciexyzGreen CIEXYZ FciexyzBlue CIEXYZ } type CIEXYZTRIPLE = tagICEXYZTRIPLE type LPCIEXYZTRIPLE = uintptr type tagLOGCOLORSPACEA = struct { FlcsSignature DWORD FlcsVersion DWORD FlcsSize DWORD FlcsCSType LCSCSTYPE FlcsIntent LCSGAMUTMATCH FlcsEndpoints CIEXYZTRIPLE FlcsGammaRed DWORD FlcsGammaGreen DWORD FlcsGammaBlue DWORD FlcsFilename [260]CHAR } type LOGCOLORSPACEA = tagLOGCOLORSPACEA type LPLOGCOLORSPACEA = uintptr type tagLOGCOLORSPACEW = struct { FlcsSignature DWORD FlcsVersion DWORD FlcsSize DWORD FlcsCSType LCSCSTYPE FlcsIntent LCSGAMUTMATCH FlcsEndpoints CIEXYZTRIPLE FlcsGammaRed DWORD FlcsGammaGreen DWORD FlcsGammaBlue DWORD FlcsFilename [260]WCHAR } type LOGCOLORSPACEW = tagLOGCOLORSPACEW type LPLOGCOLORSPACEW = uintptr type LOGCOLORSPACE = LOGCOLORSPACEA type LPLOGCOLORSPACE = LPLOGCOLORSPACEA type tagBITMAPCOREHEADER = struct { FbcSize DWORD FbcWidth WORD FbcHeight WORD FbcPlanes WORD FbcBitCount WORD } type BITMAPCOREHEADER = tagBITMAPCOREHEADER type LPBITMAPCOREHEADER = uintptr type PBITMAPCOREHEADER = uintptr type tagBITMAPINFOHEADER = struct { FbiSize DWORD FbiWidth LONG FbiHeight LONG FbiPlanes WORD FbiBitCount WORD FbiCompression DWORD FbiSizeImage DWORD FbiXPelsPerMeter LONG FbiYPelsPerMeter LONG FbiClrUsed DWORD FbiClrImportant DWORD } type BITMAPINFOHEADER = tagBITMAPINFOHEADER type LPBITMAPINFOHEADER = uintptr type PBITMAPINFOHEADER = uintptr type BITMAPV4HEADER = struct { FbV4Size DWORD FbV4Width LONG FbV4Height LONG FbV4Planes WORD FbV4BitCount WORD FbV4V4Compression DWORD FbV4SizeImage DWORD FbV4XPelsPerMeter LONG FbV4YPelsPerMeter LONG FbV4ClrUsed DWORD FbV4ClrImportant DWORD FbV4RedMask DWORD FbV4GreenMask DWORD FbV4BlueMask DWORD FbV4AlphaMask DWORD FbV4CSType DWORD FbV4Endpoints CIEXYZTRIPLE FbV4GammaRed DWORD FbV4GammaGreen DWORD FbV4GammaBlue DWORD } type LPBITMAPV4HEADER = uintptr type PBITMAPV4HEADER = uintptr type BITMAPV5HEADER = struct { FbV5Size DWORD FbV5Width LONG FbV5Height LONG FbV5Planes WORD FbV5BitCount WORD FbV5Compression DWORD FbV5SizeImage DWORD FbV5XPelsPerMeter LONG FbV5YPelsPerMeter LONG FbV5ClrUsed DWORD FbV5ClrImportant DWORD FbV5RedMask DWORD FbV5GreenMask DWORD FbV5BlueMask DWORD FbV5AlphaMask DWORD FbV5CSType DWORD FbV5Endpoints CIEXYZTRIPLE FbV5GammaRed DWORD FbV5GammaGreen DWORD FbV5GammaBlue DWORD FbV5Intent DWORD FbV5ProfileData DWORD FbV5ProfileSize DWORD FbV5Reserved DWORD } type LPBITMAPV5HEADER = uintptr type PBITMAPV5HEADER = uintptr type tagBITMAPINFO = struct { FbmiHeader BITMAPINFOHEADER FbmiColors [1]RGBQUAD } type BITMAPINFO = tagBITMAPINFO type LPBITMAPINFO = uintptr type PBITMAPINFO = uintptr type tagBITMAPCOREINFO = struct { FbmciHeader BITMAPCOREHEADER FbmciColors [1]RGBTRIPLE F__ccgo_pad1 [1]byte } type BITMAPCOREINFO = tagBITMAPCOREINFO type LPBITMAPCOREINFO = uintptr type PBITMAPCOREINFO = uintptr type tagBITMAPFILEHEADER = struct { FbfType WORD F__ccgo_pad1 [2]byte FbfSize DWORD FbfReserved1 WORD FbfReserved2 WORD FbfOffBits DWORD } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type BITMAPFILEHEADER = tagBITMAPFILEHEADER type LPBITMAPFILEHEADER = uintptr type PBITMAPFILEHEADER = uintptr type tagFONTSIGNATURE = struct { FfsUsb [4]DWORD FfsCsb [2]DWORD } type FONTSIGNATURE = tagFONTSIGNATURE type PFONTSIGNATURE = uintptr type LPFONTSIGNATURE = uintptr type tagCHARSETINFO = struct { FciCharset UINT FciACP UINT Ffs FONTSIGNATURE } type CHARSETINFO = tagCHARSETINFO type PCHARSETINFO = uintptr type NPCHARSETINFO = uintptr type LPCHARSETINFO = uintptr type tagLOCALESIGNATURE = struct { FlsUsb [4]DWORD FlsCsbDefault [2]DWORD FlsCsbSupported [2]DWORD } type LOCALESIGNATURE = tagLOCALESIGNATURE type PLOCALESIGNATURE = uintptr type LPLOCALESIGNATURE = uintptr type tagHANDLETABLE = struct{ FobjectHandle [1]HGDIOBJ } type HANDLETABLE = tagHANDLETABLE type PHANDLETABLE = uintptr type LPHANDLETABLE = uintptr type tagMETARECORD = struct { FrdSize DWORD FrdFunction WORD FrdParm [1]WORD } type METARECORD = tagMETARECORD type PMETARECORD = uintptr type LPMETARECORD = uintptr type tagMETAFILEPICT = struct { Fmm LONG FxExt LONG FyExt LONG F__ccgo_pad1 [4]byte FhMF HMETAFILE } type METAFILEPICT = tagMETAFILEPICT type LPMETAFILEPICT = uintptr type tagMETAHEADER = struct { FmtType WORD FmtHeaderSize WORD FmtVersion WORD F__ccgo_pad1 [2]byte FmtSize DWORD FmtNoObjects WORD F__ccgo_pad2 [2]byte FmtMaxRecord DWORD FmtNoParameters WORD F__ccgo_pad3 [2]byte } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type METAHEADER = tagMETAHEADER type PMETAHEADER = uintptr type LPMETAHEADER = uintptr type tagENHMETARECORD = struct { FiType DWORD FnSize DWORD FdParm [1]DWORD } type ENHMETARECORD = tagENHMETARECORD type PENHMETARECORD = uintptr type LPENHMETARECORD = uintptr type tagENHMETAHEADER = struct { FiType DWORD FnSize DWORD FrclBounds RECTL FrclFrame RECTL FdSignature DWORD FnVersion DWORD FnBytes DWORD FnRecords DWORD FnHandles WORD FsReserved WORD FnDescription DWORD FoffDescription DWORD FnPalEntries DWORD FszlDevice SIZEL FszlMillimeters SIZEL FcbPixelFormat DWORD FoffPixelFormat DWORD FbOpenGL DWORD FszlMicrometers SIZEL } type ENHMETAHEADER = tagENHMETAHEADER type PENHMETAHEADER = uintptr type LPENHMETAHEADER = uintptr type BCHAR = BYTE type tagTEXTMETRICA = struct { FtmHeight LONG FtmAscent LONG FtmDescent LONG FtmInternalLeading LONG FtmExternalLeading LONG FtmAveCharWidth LONG FtmMaxCharWidth LONG FtmWeight LONG FtmOverhang LONG FtmDigitizedAspectX LONG FtmDigitizedAspectY LONG FtmFirstChar BYTE FtmLastChar BYTE FtmDefaultChar BYTE FtmBreakChar BYTE FtmItalic BYTE FtmUnderlined BYTE FtmStruckOut BYTE FtmPitchAndFamily BYTE FtmCharSet BYTE F__ccgo_pad1 [3]byte } type TEXTMETRICA = tagTEXTMETRICA type PTEXTMETRICA = uintptr type NPTEXTMETRICA = uintptr type LPTEXTMETRICA = uintptr type tagTEXTMETRICW = struct { FtmHeight LONG FtmAscent LONG FtmDescent LONG FtmInternalLeading LONG FtmExternalLeading LONG FtmAveCharWidth LONG FtmMaxCharWidth LONG FtmWeight LONG FtmOverhang LONG FtmDigitizedAspectX LONG FtmDigitizedAspectY LONG FtmFirstChar WCHAR FtmLastChar WCHAR FtmDefaultChar WCHAR FtmBreakChar WCHAR FtmItalic BYTE FtmUnderlined BYTE FtmStruckOut BYTE FtmPitchAndFamily BYTE FtmCharSet BYTE F__ccgo_pad1 [3]byte } type TEXTMETRICW = tagTEXTMETRICW type PTEXTMETRICW = uintptr type NPTEXTMETRICW = uintptr type LPTEXTMETRICW = uintptr type TEXTMETRIC = TEXTMETRICA type PTEXTMETRIC = PTEXTMETRICA type NPTEXTMETRIC = NPTEXTMETRICA type LPTEXTMETRIC = LPTEXTMETRICA type tagNEWTEXTMETRICA = struct { FtmHeight LONG FtmAscent LONG FtmDescent LONG FtmInternalLeading LONG FtmExternalLeading LONG FtmAveCharWidth LONG FtmMaxCharWidth LONG FtmWeight LONG FtmOverhang LONG FtmDigitizedAspectX LONG FtmDigitizedAspectY LONG FtmFirstChar BYTE FtmLastChar BYTE FtmDefaultChar BYTE FtmBreakChar BYTE FtmItalic BYTE FtmUnderlined BYTE FtmStruckOut BYTE FtmPitchAndFamily BYTE FtmCharSet BYTE F__ccgo_pad1 [3]byte FntmFlags DWORD FntmSizeEM UINT FntmCellHeight UINT FntmAvgWidth UINT } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type NEWTEXTMETRICA = tagNEWTEXTMETRICA type PNEWTEXTMETRICA = uintptr type NPNEWTEXTMETRICA = uintptr type LPNEWTEXTMETRICA = uintptr type tagNEWTEXTMETRICW = struct { FtmHeight LONG FtmAscent LONG FtmDescent LONG FtmInternalLeading LONG FtmExternalLeading LONG FtmAveCharWidth LONG FtmMaxCharWidth LONG FtmWeight LONG FtmOverhang LONG FtmDigitizedAspectX LONG FtmDigitizedAspectY LONG FtmFirstChar WCHAR FtmLastChar WCHAR FtmDefaultChar WCHAR FtmBreakChar WCHAR FtmItalic BYTE FtmUnderlined BYTE FtmStruckOut BYTE FtmPitchAndFamily BYTE FtmCharSet BYTE F__ccgo_pad1 [3]byte FntmFlags DWORD FntmSizeEM UINT FntmCellHeight UINT FntmAvgWidth UINT } type NEWTEXTMETRICW = tagNEWTEXTMETRICW type PNEWTEXTMETRICW = uintptr type NPNEWTEXTMETRICW = uintptr type LPNEWTEXTMETRICW = uintptr type NEWTEXTMETRIC = NEWTEXTMETRICA type PNEWTEXTMETRIC = PNEWTEXTMETRICA type NPNEWTEXTMETRIC = NPNEWTEXTMETRICA type LPNEWTEXTMETRIC = LPNEWTEXTMETRICA type tagNEWTEXTMETRICEXA = struct { FntmTm NEWTEXTMETRICA FntmFontSig FONTSIGNATURE } type NEWTEXTMETRICEXA = tagNEWTEXTMETRICEXA type tagNEWTEXTMETRICEXW = struct { FntmTm NEWTEXTMETRICW FntmFontSig FONTSIGNATURE } type NEWTEXTMETRICEXW = tagNEWTEXTMETRICEXW type NEWTEXTMETRICEX = NEWTEXTMETRICEXA type tagPELARRAY = struct { FpaXCount LONG FpaYCount LONG FpaXExt LONG FpaYExt LONG FpaRGBs BYTE F__ccgo_pad1 [3]byte } type PELARRAY = tagPELARRAY type PPELARRAY = uintptr type NPPELARRAY = uintptr type LPPELARRAY = uintptr type tagLOGBRUSH = struct { FlbStyle UINT FlbColor COLORREF FlbHatch ULONG_PTR } type LOGBRUSH = tagLOGBRUSH type PLOGBRUSH = uintptr type NPLOGBRUSH = uintptr type LPLOGBRUSH = uintptr type tagLOGBRUSH32 = struct { FlbStyle UINT FlbColor COLORREF FlbHatch ULONG } type LOGBRUSH32 = tagLOGBRUSH32 type PLOGBRUSH32 = uintptr type NPLOGBRUSH32 = uintptr type LPLOGBRUSH32 = uintptr type PATTERN = LOGBRUSH type PPATTERN = uintptr type NPPATTERN = uintptr type LPPATTERN = uintptr type tagLOGPEN = struct { FlopnStyle UINT FlopnWidth POINT FlopnColor COLORREF } type LOGPEN = tagLOGPEN type PLOGPEN = uintptr type NPLOGPEN = uintptr type LPLOGPEN = uintptr type tagEXTLOGPEN = struct { FelpPenStyle DWORD FelpWidth DWORD FelpBrushStyle UINT FelpColor COLORREF FelpHatch ULONG_PTR FelpNumEntries DWORD FelpStyleEntry [1]DWORD } type EXTLOGPEN = tagEXTLOGPEN type PEXTLOGPEN = uintptr type NPEXTLOGPEN = uintptr type LPEXTLOGPEN = uintptr type tagEXTLOGPEN32 = struct { FelpPenStyle DWORD FelpWidth DWORD FelpBrushStyle UINT FelpColor COLORREF FelpHatch ULONG FelpNumEntries DWORD FelpStyleEntry [1]DWORD } type EXTLOGPEN32 = tagEXTLOGPEN32 type PEXTLOGPEN32 = uintptr type NPEXTLOGPEN32 = uintptr type LPEXTLOGPEN32 = uintptr type tagPALETTEENTRY = struct { FpeRed BYTE FpeGreen BYTE FpeBlue BYTE FpeFlags BYTE } type PALETTEENTRY = tagPALETTEENTRY type PPALETTEENTRY = uintptr type LPPALETTEENTRY = uintptr type tagLOGPALETTE = struct { FpalVersion WORD FpalNumEntries WORD FpalPalEntry [1]PALETTEENTRY } type LOGPALETTE = tagLOGPALETTE type PLOGPALETTE = uintptr type NPLOGPALETTE = uintptr type LPLOGPALETTE = uintptr type tagLOGFONTA = struct { FlfHeight LONG FlfWidth LONG FlfEscapement LONG FlfOrientation LONG FlfWeight LONG FlfItalic BYTE FlfUnderline BYTE FlfStrikeOut BYTE FlfCharSet BYTE FlfOutPrecision BYTE FlfClipPrecision BYTE FlfQuality BYTE FlfPitchAndFamily BYTE FlfFaceName [32]CHAR } type LOGFONTA = tagLOGFONTA type PLOGFONTA = uintptr type NPLOGFONTA = uintptr type LPLOGFONTA = uintptr type tagLOGFONTW = struct { FlfHeight LONG FlfWidth LONG FlfEscapement LONG FlfOrientation LONG FlfWeight LONG FlfItalic BYTE FlfUnderline BYTE FlfStrikeOut BYTE FlfCharSet BYTE FlfOutPrecision BYTE FlfClipPrecision BYTE FlfQuality BYTE FlfPitchAndFamily BYTE FlfFaceName [32]WCHAR } type LOGFONTW = tagLOGFONTW type PLOGFONTW = uintptr type NPLOGFONTW = uintptr type LPLOGFONTW = uintptr type LOGFONT = LOGFONTA type PLOGFONT = PLOGFONTA type NPLOGFONT = NPLOGFONTA type LPLOGFONT = LPLOGFONTA type tagENUMLOGFONTA = struct { FelfLogFont LOGFONTA FelfFullName [64]BYTE FelfStyle [32]BYTE } type ENUMLOGFONTA = tagENUMLOGFONTA type LPENUMLOGFONTA = uintptr type tagENUMLOGFONTW = struct { FelfLogFont LOGFONTW FelfFullName [64]WCHAR FelfStyle [32]WCHAR } type ENUMLOGFONTW = tagENUMLOGFONTW type LPENUMLOGFONTW = uintptr type ENUMLOGFONT = ENUMLOGFONTA type LPENUMLOGFONT = LPENUMLOGFONTA type tagENUMLOGFONTEXA = struct { FelfLogFont LOGFONTA FelfFullName [64]BYTE FelfStyle [32]BYTE FelfScript [32]BYTE } type ENUMLOGFONTEXA = tagENUMLOGFONTEXA type LPENUMLOGFONTEXA = uintptr type tagENUMLOGFONTEXW = struct { FelfLogFont LOGFONTW FelfFullName [64]WCHAR FelfStyle [32]WCHAR FelfScript [32]WCHAR } type ENUMLOGFONTEXW = tagENUMLOGFONTEXW type LPENUMLOGFONTEXW = uintptr type ENUMLOGFONTEX = ENUMLOGFONTEXA type LPENUMLOGFONTEX = LPENUMLOGFONTEXA type tagPANOSE = struct { FbFamilyType BYTE FbSerifStyle BYTE FbWeight BYTE FbProportion BYTE FbContrast BYTE FbStrokeVariation BYTE FbArmStyle BYTE FbLetterform BYTE FbMidline BYTE FbXHeight BYTE } type PANOSE = tagPANOSE type LPPANOSE = uintptr type tagEXTLOGFONTA = struct { FelfLogFont LOGFONTA FelfFullName [64]BYTE FelfStyle [32]BYTE FelfVersion DWORD FelfStyleSize DWORD FelfMatch DWORD FelfReserved DWORD FelfVendorId [4]BYTE FelfCulture DWORD FelfPanose PANOSE F__ccgo_pad1 [2]byte } type EXTLOGFONTA = tagEXTLOGFONTA type PEXTLOGFONTA = uintptr type NPEXTLOGFONTA = uintptr type LPEXTLOGFONTA = uintptr type tagEXTLOGFONTW = struct { FelfLogFont LOGFONTW FelfFullName [64]WCHAR FelfStyle [32]WCHAR FelfVersion DWORD FelfStyleSize DWORD FelfMatch DWORD FelfReserved DWORD FelfVendorId [4]BYTE FelfCulture DWORD FelfPanose PANOSE F__ccgo_pad1 [2]byte } type EXTLOGFONTW = tagEXTLOGFONTW type PEXTLOGFONTW = uintptr type NPEXTLOGFONTW = uintptr type LPEXTLOGFONTW = uintptr type EXTLOGFONT = EXTLOGFONTA type PEXTLOGFONT = PEXTLOGFONTA type NPEXTLOGFONT = NPEXTLOGFONTA type LPEXTLOGFONT = LPEXTLOGFONTA type _devicemodeA = struct { FdmDeviceName [32]BYTE FdmSpecVersion WORD FdmDriverVersion WORD FdmSize WORD FdmDriverExtra WORD FdmFields DWORD F__44 struct { F__ccgo_pad1 [0]uint32 F__0 struct { FdmOrientation int16 FdmPaperSize int16 FdmPaperLength int16 FdmPaperWidth int16 FdmScale int16 FdmCopies int16 FdmDefaultSource int16 FdmPrintQuality int16 } } FdmColor int16 FdmDuplex int16 FdmYResolution int16 FdmTTOption int16 FdmCollate int16 FdmFormName [32]BYTE FdmLogPixels WORD FdmBitsPerPel DWORD FdmPelsWidth DWORD FdmPelsHeight DWORD F__116 struct{ FdmDisplayFlags DWORD } FdmDisplayFrequency DWORD FdmICMMethod DWORD FdmICMIntent DWORD FdmMediaType DWORD FdmDitherType DWORD FdmReserved1 DWORD FdmReserved2 DWORD FdmPanningWidth DWORD FdmPanningHeight DWORD } type DEVMODEA = _devicemodeA type PDEVMODEA = uintptr type NPDEVMODEA = uintptr type LPDEVMODEA = uintptr type _devicemodeW = struct { FdmDeviceName [32]WCHAR FdmSpecVersion WORD FdmDriverVersion WORD FdmSize WORD FdmDriverExtra WORD FdmFields DWORD F__76 struct { F__ccgo_pad1 [0]uint32 F__0 struct { FdmOrientation int16 FdmPaperSize int16 FdmPaperLength int16 FdmPaperWidth int16 FdmScale int16 FdmCopies int16 FdmDefaultSource int16 FdmPrintQuality int16 } } FdmColor int16 FdmDuplex int16 FdmYResolution int16 FdmTTOption int16 FdmCollate int16 FdmFormName [32]WCHAR FdmLogPixels WORD FdmBitsPerPel DWORD FdmPelsWidth DWORD FdmPelsHeight DWORD F__180 struct{ FdmDisplayFlags DWORD } FdmDisplayFrequency DWORD FdmICMMethod DWORD FdmICMIntent DWORD FdmMediaType DWORD FdmDitherType DWORD FdmReserved1 DWORD FdmReserved2 DWORD FdmPanningWidth DWORD FdmPanningHeight DWORD } type DEVMODEW = _devicemodeW type PDEVMODEW = uintptr type NPDEVMODEW = uintptr type LPDEVMODEW = uintptr type DEVMODE = DEVMODEA type PDEVMODE = PDEVMODEA type NPDEVMODE = NPDEVMODEA type LPDEVMODE = LPDEVMODEA type _DISPLAY_DEVICEA = struct { Fcb DWORD FDeviceName [32]CHAR FDeviceString [128]CHAR FStateFlags DWORD FDeviceID [128]CHAR FDeviceKey [128]CHAR } type DISPLAY_DEVICEA = _DISPLAY_DEVICEA type PDISPLAY_DEVICEA = uintptr type LPDISPLAY_DEVICEA = uintptr type _DISPLAY_DEVICEW = struct { Fcb DWORD FDeviceName [32]WCHAR FDeviceString [128]WCHAR FStateFlags DWORD FDeviceID [128]WCHAR FDeviceKey [128]WCHAR } type DISPLAY_DEVICEW = _DISPLAY_DEVICEW type PDISPLAY_DEVICEW = uintptr type LPDISPLAY_DEVICEW = uintptr type DISPLAY_DEVICE = DISPLAY_DEVICEA type PDISPLAY_DEVICE = PDISPLAY_DEVICEA type LPDISPLAY_DEVICE = LPDISPLAY_DEVICEA type _RGNDATAHEADER = struct { FdwSize DWORD FiType DWORD FnCount DWORD FnRgnSize DWORD FrcBound RECT } type RGNDATAHEADER = _RGNDATAHEADER type PRGNDATAHEADER = uintptr type _RGNDATA = struct { Frdh RGNDATAHEADER FBuffer [1]int8 F__ccgo_pad1 [3]byte } type RGNDATA = _RGNDATA type PRGNDATA = uintptr type NPRGNDATA = uintptr type LPRGNDATA = uintptr type _ABC = struct { FabcA int32 FabcB UINT FabcC int32 } type ABC = _ABC type PABC = uintptr type NPABC = uintptr type LPABC = uintptr type _ABCFLOAT = struct { FabcfA FLOAT FabcfB FLOAT FabcfC FLOAT } type ABCFLOAT = _ABCFLOAT type PABCFLOAT = uintptr type NPABCFLOAT = uintptr type LPABCFLOAT = uintptr type _OUTLINETEXTMETRICA = struct { FotmSize UINT FotmTextMetrics TEXTMETRICA FotmFiller BYTE FotmPanoseNumber PANOSE F__ccgo_pad1 [1]byte FotmfsSelection UINT FotmfsType UINT FotmsCharSlopeRise int32 FotmsCharSlopeRun int32 FotmItalicAngle int32 FotmEMSquare UINT FotmAscent int32 FotmDescent int32 FotmLineGap UINT FotmsCapEmHeight UINT FotmsXHeight UINT FotmrcFontBox RECT FotmMacAscent int32 FotmMacDescent int32 FotmMacLineGap UINT FotmusMinimumPPEM UINT FotmptSubscriptSize POINT FotmptSubscriptOffset POINT FotmptSuperscriptSize POINT FotmptSuperscriptOffset POINT FotmsStrikeoutSize UINT FotmsStrikeoutPosition int32 FotmsUnderscoreSize int32 FotmsUnderscorePosition int32 F__ccgo_pad2 [4]byte FotmpFamilyName PSTR FotmpFaceName PSTR FotmpStyleName PSTR FotmpFullName PSTR } type OUTLINETEXTMETRICA = _OUTLINETEXTMETRICA type POUTLINETEXTMETRICA = uintptr type NPOUTLINETEXTMETRICA = uintptr type LPOUTLINETEXTMETRICA = uintptr type _OUTLINETEXTMETRICW = struct { FotmSize UINT FotmTextMetrics TEXTMETRICW FotmFiller BYTE FotmPanoseNumber PANOSE F__ccgo_pad1 [1]byte FotmfsSelection UINT FotmfsType UINT FotmsCharSlopeRise int32 FotmsCharSlopeRun int32 FotmItalicAngle int32 FotmEMSquare UINT FotmAscent int32 FotmDescent int32 FotmLineGap UINT FotmsCapEmHeight UINT FotmsXHeight UINT FotmrcFontBox RECT FotmMacAscent int32 FotmMacDescent int32 FotmMacLineGap UINT FotmusMinimumPPEM UINT FotmptSubscriptSize POINT FotmptSubscriptOffset POINT FotmptSuperscriptSize POINT FotmptSuperscriptOffset POINT FotmsStrikeoutSize UINT FotmsStrikeoutPosition int32 FotmsUnderscoreSize int32 FotmsUnderscorePosition int32 FotmpFamilyName PSTR FotmpFaceName PSTR FotmpStyleName PSTR FotmpFullName PSTR } type OUTLINETEXTMETRICW = _OUTLINETEXTMETRICW type POUTLINETEXTMETRICW = uintptr type NPOUTLINETEXTMETRICW = uintptr type LPOUTLINETEXTMETRICW = uintptr type OUTLINETEXTMETRIC = OUTLINETEXTMETRICA type POUTLINETEXTMETRIC = POUTLINETEXTMETRICA type NPOUTLINETEXTMETRIC = NPOUTLINETEXTMETRICA type LPOUTLINETEXTMETRIC = LPOUTLINETEXTMETRICA type tagPOLYTEXTA = struct { Fx int32 Fy int32 Fn UINT F__ccgo_pad1 [4]byte Flpstr LPCSTR FuiFlags UINT Frcl RECT F__ccgo_pad2 [4]byte Fpdx uintptr } type POLYTEXTA = tagPOLYTEXTA type PPOLYTEXTA = uintptr type NPPOLYTEXTA = uintptr type LPPOLYTEXTA = uintptr type tagPOLYTEXTW = struct { Fx int32 Fy int32 Fn UINT F__ccgo_pad1 [4]byte Flpstr LPCWSTR FuiFlags UINT Frcl RECT F__ccgo_pad2 [4]byte Fpdx uintptr } type POLYTEXTW = tagPOLYTEXTW type PPOLYTEXTW = uintptr type NPPOLYTEXTW = uintptr type LPPOLYTEXTW = uintptr type POLYTEXT = POLYTEXTA type PPOLYTEXT = PPOLYTEXTA type NPPOLYTEXT = NPPOLYTEXTA type LPPOLYTEXT = LPPOLYTEXTA type _FIXED = struct { Ffract WORD Fvalue int16 } type FIXED = _FIXED type _MAT2 = struct { FeM11 FIXED FeM12 FIXED FeM21 FIXED FeM22 FIXED } type MAT2 = _MAT2 type LPMAT2 = uintptr type _GLYPHMETRICS = struct { FgmBlackBoxX UINT FgmBlackBoxY UINT FgmptGlyphOrigin POINT FgmCellIncX int16 FgmCellIncY int16 } type GLYPHMETRICS = _GLYPHMETRICS type LPGLYPHMETRICS = uintptr type tagPOINTFX = struct { Fx FIXED Fy FIXED } type POINTFX = tagPOINTFX type LPPOINTFX = uintptr type tagTTPOLYCURVE = struct { FwType WORD Fcpfx WORD Fapfx [1]POINTFX } type TTPOLYCURVE = tagTTPOLYCURVE type LPTTPOLYCURVE = uintptr type tagTTPOLYGONHEADER = struct { Fcb DWORD FdwType DWORD FpfxStart POINTFX } type TTPOLYGONHEADER = tagTTPOLYGONHEADER type LPTTPOLYGONHEADER = uintptr type tagGCP_RESULTSA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FlpOutString LPSTR FlpOrder uintptr FlpDx uintptr FlpCaretPos uintptr FlpClass LPSTR FlpGlyphs LPWSTR FnGlyphs UINT FnMaxFit int32 } type GCP_RESULTSA = tagGCP_RESULTSA type LPGCP_RESULTSA = uintptr type tagGCP_RESULTSW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FlpOutString LPWSTR FlpOrder uintptr FlpDx uintptr FlpCaretPos uintptr FlpClass LPSTR FlpGlyphs LPWSTR FnGlyphs UINT FnMaxFit int32 } type GCP_RESULTSW = tagGCP_RESULTSW type LPGCP_RESULTSW = uintptr type GCP_RESULTS = GCP_RESULTSA type LPGCP_RESULTS = LPGCP_RESULTSA type _RASTERIZER_STATUS = struct { FnSize int16 FwFlags int16 FnLanguageID int16 } type RASTERIZER_STATUS = _RASTERIZER_STATUS type LPRASTERIZER_STATUS = uintptr type tagPIXELFORMATDESCRIPTOR = struct { FnSize WORD FnVersion WORD FdwFlags DWORD FiPixelType BYTE FcColorBits BYTE FcRedBits BYTE FcRedShift BYTE FcGreenBits BYTE FcGreenShift BYTE FcBlueBits BYTE FcBlueShift BYTE FcAlphaBits BYTE FcAlphaShift BYTE FcAccumBits BYTE FcAccumRedBits BYTE FcAccumGreenBits BYTE FcAccumBlueBits BYTE FcAccumAlphaBits BYTE FcDepthBits BYTE FcStencilBits BYTE FcAuxBuffers BYTE FiLayerType BYTE FbReserved BYTE FdwLayerMask DWORD FdwVisibleMask DWORD FdwDamageMask DWORD } type PIXELFORMATDESCRIPTOR = tagPIXELFORMATDESCRIPTOR type PPIXELFORMATDESCRIPTOR = uintptr type LPPIXELFORMATDESCRIPTOR = uintptr type OLDFONTENUMPROCA = uintptr type OLDFONTENUMPROCW = uintptr type FONTENUMPROCA = OLDFONTENUMPROCA type FONTENUMPROCW = OLDFONTENUMPROCW type FONTENUMPROC = FONTENUMPROCA type GOBJENUMPROC = uintptr type LINEDDAPROC = uintptr type LPFNDEVMODE = uintptr type LPFNDEVCAPS = uintptr type tagWCRANGE = struct { FwcLow WCHAR FcGlyphs USHORT } type WCRANGE = tagWCRANGE type PWCRANGE = uintptr type LPWCRANGE = uintptr type tagGLYPHSET = struct { FcbThis DWORD FflAccel DWORD FcGlyphsSupported DWORD FcRanges DWORD Franges [1]WCRANGE } type GLYPHSET = tagGLYPHSET type PGLYPHSET = uintptr type LPGLYPHSET = uintptr type tagDESIGNVECTOR = struct { FdvReserved DWORD FdvNumAxes DWORD FdvValues [16]LONG } type DESIGNVECTOR = tagDESIGNVECTOR type PDESIGNVECTOR = uintptr type LPDESIGNVECTOR = uintptr type tagAXISINFOA = struct { FaxMinValue LONG FaxMaxValue LONG FaxAxisName [16]BYTE } type AXISINFOA = tagAXISINFOA type PAXISINFOA = uintptr type LPAXISINFOA = uintptr type tagAXISINFOW = struct { FaxMinValue LONG FaxMaxValue LONG FaxAxisName [16]WCHAR } type AXISINFOW = tagAXISINFOW type PAXISINFOW = uintptr type LPAXISINFOW = uintptr type AXISINFO = AXISINFOA type PAXISINFO = PAXISINFOA type LPAXISINFO = LPAXISINFOA type tagAXESLISTA = struct { FaxlReserved DWORD FaxlNumAxes DWORD FaxlAxisInfo [16]AXISINFOA } type AXESLISTA = tagAXESLISTA type PAXESLISTA = uintptr type LPAXESLISTA = uintptr type tagAXESLISTW = struct { FaxlReserved DWORD FaxlNumAxes DWORD FaxlAxisInfo [16]AXISINFOW } type AXESLISTW = tagAXESLISTW type PAXESLISTW = uintptr type LPAXESLISTW = uintptr type AXESLIST = AXESLISTA type PAXESLIST = PAXESLISTA type LPAXESLIST = LPAXESLISTA type tagENUMLOGFONTEXDVA = struct { FelfEnumLogfontEx ENUMLOGFONTEXA FelfDesignVector DESIGNVECTOR } type ENUMLOGFONTEXDVA = tagENUMLOGFONTEXDVA type PENUMLOGFONTEXDVA = uintptr type LPENUMLOGFONTEXDVA = uintptr type tagENUMLOGFONTEXDVW = struct { FelfEnumLogfontEx ENUMLOGFONTEXW FelfDesignVector DESIGNVECTOR } type ENUMLOGFONTEXDVW = tagENUMLOGFONTEXDVW type PENUMLOGFONTEXDVW = uintptr type LPENUMLOGFONTEXDVW = uintptr type ENUMLOGFONTEXDV = ENUMLOGFONTEXDVA type PENUMLOGFONTEXDV = PENUMLOGFONTEXDVA type LPENUMLOGFONTEXDV = LPENUMLOGFONTEXDVA type tagENUMTEXTMETRICA = struct { FetmNewTextMetricEx NEWTEXTMETRICEXA FetmAxesList AXESLISTA } type ENUMTEXTMETRICA = tagENUMTEXTMETRICA type PENUMTEXTMETRICA = uintptr type LPENUMTEXTMETRICA = uintptr type tagENUMTEXTMETRICW = struct { FetmNewTextMetricEx NEWTEXTMETRICEXW FetmAxesList AXESLISTW } type ENUMTEXTMETRICW = tagENUMTEXTMETRICW type PENUMTEXTMETRICW = uintptr type LPENUMTEXTMETRICW = uintptr type ENUMTEXTMETRIC = ENUMTEXTMETRICA type PENUMTEXTMETRIC = PENUMTEXTMETRICA type LPENUMTEXTMETRIC = LPENUMTEXTMETRICA type COLOR16 = USHORT type _TRIVERTEX = struct { Fx LONG Fy LONG FRed COLOR16 FGreen COLOR16 FBlue COLOR16 FAlpha COLOR16 } type TRIVERTEX = _TRIVERTEX type PTRIVERTEX = uintptr type LPTRIVERTEX = uintptr type _GRADIENT_TRIANGLE = struct { FVertex1 ULONG FVertex2 ULONG FVertex3 ULONG } type GRADIENT_TRIANGLE = _GRADIENT_TRIANGLE type PGRADIENT_TRIANGLE = uintptr type LPGRADIENT_TRIANGLE = uintptr type _GRADIENT_RECT = struct { FUpperLeft ULONG FLowerRight ULONG } type GRADIENT_RECT = _GRADIENT_RECT type PGRADIENT_RECT = uintptr type LPGRADIENT_RECT = uintptr type _BLENDFUNCTION = struct { FBlendOp BYTE FBlendFlags BYTE FSourceConstantAlpha BYTE FAlphaFormat BYTE } type BLENDFUNCTION = _BLENDFUNCTION type PBLENDFUNCTION = uintptr type MFENUMPROC = uintptr type ENHMFENUMPROC = uintptr type tagDIBSECTION = struct { FdsBm BITMAP FdsBmih BITMAPINFOHEADER FdsBitfields [3]DWORD F__ccgo_pad1 [4]byte FdshSection HANDLE FdsOffset DWORD F__ccgo_pad2 [4]byte } type DIBSECTION = tagDIBSECTION type LPDIBSECTION = uintptr type PDIBSECTION = uintptr type tagCOLORADJUSTMENT = struct { FcaSize WORD FcaFlags WORD FcaIlluminantIndex WORD FcaRedGamma WORD FcaGreenGamma WORD FcaBlueGamma WORD FcaReferenceBlack WORD FcaReferenceWhite WORD FcaContrast SHORT FcaBrightness SHORT FcaColorfulness SHORT FcaRedGreenTint SHORT } type COLORADJUSTMENT = tagCOLORADJUSTMENT type PCOLORADJUSTMENT = uintptr type LPCOLORADJUSTMENT = uintptr type ABORTPROC = uintptr type _DOCINFOA = struct { FcbSize int32 F__ccgo_pad1 [4]byte FlpszDocName LPCSTR FlpszOutput LPCSTR FlpszDatatype LPCSTR FfwType DWORD F__ccgo_pad2 [4]byte } type DOCINFOA = _DOCINFOA type LPDOCINFOA = uintptr type _DOCINFOW = struct { FcbSize int32 F__ccgo_pad1 [4]byte FlpszDocName LPCWSTR FlpszOutput LPCWSTR FlpszDatatype LPCWSTR FfwType DWORD F__ccgo_pad2 [4]byte } type DOCINFOW = _DOCINFOW type LPDOCINFOW = uintptr type DOCINFO = DOCINFOA type LPDOCINFO = LPDOCINFOA type tagKERNINGPAIR = struct { FwFirst WORD FwSecond WORD FiKernAmount int32 } type KERNINGPAIR = tagKERNINGPAIR type LPKERNINGPAIR = uintptr type ICMENUMPROCA = uintptr type ICMENUMPROCW = uintptr type tagEMR = struct { FiType DWORD FnSize DWORD } type EMR = tagEMR type PEMR = uintptr type tagEMRTEXT = struct { FptlReference POINTL FnChars DWORD FoffString DWORD FfOptions DWORD Frcl RECTL FoffDx DWORD } type EMRTEXT = tagEMRTEXT type PEMRTEXT = uintptr type tagABORTPATH = struct{ Femr EMR } type EMRABORTPATH = tagABORTPATH type PEMRABORTPATH = uintptr type EMRBEGINPATH = tagABORTPATH type PEMRBEGINPATH = uintptr type EMRENDPATH = tagABORTPATH type PEMRENDPATH = uintptr type EMRCLOSEFIGURE = tagABORTPATH type PEMRCLOSEFIGURE = uintptr type EMRFLATTENPATH = tagABORTPATH type PEMRFLATTENPATH = uintptr type EMRWIDENPATH = tagABORTPATH type PEMRWIDENPATH = uintptr type EMRSETMETARGN = tagABORTPATH type PEMRSETMETARGN = uintptr type EMRSAVEDC = tagABORTPATH type PEMRSAVEDC = uintptr type EMRREALIZEPALETTE = tagABORTPATH type PEMRREALIZEPALETTE = uintptr type tagEMRSELECTCLIPPATH = struct { Femr EMR FiMode DWORD } type EMRSELECTCLIPPATH = tagEMRSELECTCLIPPATH type PEMRSELECTCLIPPATH = uintptr type EMRSETBKMODE = tagEMRSELECTCLIPPATH type PEMRSETBKMODE = uintptr type EMRSETMAPMODE = tagEMRSELECTCLIPPATH type PEMRSETMAPMODE = uintptr type EMRSETLAYOUT = tagEMRSELECTCLIPPATH type PEMRSETLAYOUT = uintptr type EMRSETPOLYFILLMODE = tagEMRSELECTCLIPPATH type PEMRSETPOLYFILLMODE = uintptr type EMRSETROP2 = tagEMRSELECTCLIPPATH type PEMRSETROP2 = uintptr type EMRSETSTRETCHBLTMODE = tagEMRSELECTCLIPPATH type PEMRSETSTRETCHBLTMODE = uintptr type EMRSETICMMODE = tagEMRSELECTCLIPPATH type PEMRSETICMMODE = uintptr type EMRSETTEXTALIGN = tagEMRSELECTCLIPPATH type PEMRSETTEXTALIGN = uintptr type tagEMRSETMITERLIMIT = struct { Femr EMR FeMiterLimit FLOAT } type EMRSETMITERLIMIT = tagEMRSETMITERLIMIT type PEMRSETMITERLIMIT = uintptr type tagEMRRESTOREDC = struct { Femr EMR FiRelative LONG } type EMRRESTOREDC = tagEMRRESTOREDC type PEMRRESTOREDC = uintptr type tagEMRSETARCDIRECTION = struct { Femr EMR FiArcDirection DWORD } type EMRSETARCDIRECTION = tagEMRSETARCDIRECTION type PEMRSETARCDIRECTION = uintptr type tagEMRSETMAPPERFLAGS = struct { Femr EMR FdwFlags DWORD } type EMRSETMAPPERFLAGS = tagEMRSETMAPPERFLAGS type PEMRSETMAPPERFLAGS = uintptr type tagEMRSETTEXTCOLOR = struct { Femr EMR FcrColor COLORREF } type EMRSETBKCOLOR = tagEMRSETTEXTCOLOR type PEMRSETBKCOLOR = uintptr type EMRSETTEXTCOLOR = tagEMRSETTEXTCOLOR type PEMRSETTEXTCOLOR = uintptr type tagEMRSELECTOBJECT = struct { Femr EMR FihObject DWORD } type EMRSELECTOBJECT = tagEMRSELECTOBJECT type PEMRSELECTOBJECT = uintptr type EMRDELETEOBJECT = tagEMRSELECTOBJECT type PEMRDELETEOBJECT = uintptr type tagEMRSELECTPALETTE = struct { Femr EMR FihPal DWORD } type EMRSELECTPALETTE = tagEMRSELECTPALETTE type PEMRSELECTPALETTE = uintptr type tagEMRRESIZEPALETTE = struct { Femr EMR FihPal DWORD FcEntries DWORD } type EMRRESIZEPALETTE = tagEMRRESIZEPALETTE type PEMRRESIZEPALETTE = uintptr type tagEMRSETPALETTEENTRIES = struct { Femr EMR FihPal DWORD FiStart DWORD FcEntries DWORD FaPalEntries [1]PALETTEENTRY } type EMRSETPALETTEENTRIES = tagEMRSETPALETTEENTRIES type PEMRSETPALETTEENTRIES = uintptr type tagEMRSETCOLORADJUSTMENT = struct { Femr EMR FColorAdjustment COLORADJUSTMENT } type EMRSETCOLORADJUSTMENT = tagEMRSETCOLORADJUSTMENT type PEMRSETCOLORADJUSTMENT = uintptr type tagEMRGDICOMMENT = struct { Femr EMR FcbData DWORD FData [1]BYTE F__ccgo_pad1 [3]byte } type EMRGDICOMMENT = tagEMRGDICOMMENT type PEMRGDICOMMENT = uintptr type tagEMREOF = struct { Femr EMR FnPalEntries DWORD FoffPalEntries DWORD FnSizeLast DWORD } type EMREOF = tagEMREOF type PEMREOF = uintptr type tagEMRLINETO = struct { Femr EMR Fptl POINTL } type EMRLINETO = tagEMRLINETO type PEMRLINETO = uintptr type EMRMOVETOEX = tagEMRLINETO type PEMRMOVETOEX = uintptr type tagEMROFFSETCLIPRGN = struct { Femr EMR FptlOffset POINTL } type EMROFFSETCLIPRGN = tagEMROFFSETCLIPRGN type PEMROFFSETCLIPRGN = uintptr type tagEMRFILLPATH = struct { Femr EMR FrclBounds RECTL } type EMRFILLPATH = tagEMRFILLPATH type PEMRFILLPATH = uintptr type EMRSTROKEANDFILLPATH = tagEMRFILLPATH type PEMRSTROKEANDFILLPATH = uintptr type EMRSTROKEPATH = tagEMRFILLPATH type PEMRSTROKEPATH = uintptr type tagEMREXCLUDECLIPRECT = struct { Femr EMR FrclClip RECTL } type EMREXCLUDECLIPRECT = tagEMREXCLUDECLIPRECT type PEMREXCLUDECLIPRECT = uintptr type EMRINTERSECTCLIPRECT = tagEMREXCLUDECLIPRECT type PEMRINTERSECTCLIPRECT = uintptr type tagEMRSETVIEWPORTORGEX = struct { Femr EMR FptlOrigin POINTL } type EMRSETVIEWPORTORGEX = tagEMRSETVIEWPORTORGEX type PEMRSETVIEWPORTORGEX = uintptr type EMRSETWINDOWORGEX = tagEMRSETVIEWPORTORGEX type PEMRSETWINDOWORGEX = uintptr type EMRSETBRUSHORGEX = tagEMRSETVIEWPORTORGEX type PEMRSETBRUSHORGEX = uintptr type tagEMRSETVIEWPORTEXTEX = struct { Femr EMR FszlExtent SIZEL } type EMRSETVIEWPORTEXTEX = tagEMRSETVIEWPORTEXTEX type PEMRSETVIEWPORTEXTEX = uintptr type EMRSETWINDOWEXTEX = tagEMRSETVIEWPORTEXTEX type PEMRSETWINDOWEXTEX = uintptr type tagEMRSCALEVIEWPORTEXTEX = struct { Femr EMR FxNum LONG FxDenom LONG FyNum LONG FyDenom LONG } type EMRSCALEVIEWPORTEXTEX = tagEMRSCALEVIEWPORTEXTEX type PEMRSCALEVIEWPORTEXTEX = uintptr type EMRSCALEWINDOWEXTEX = tagEMRSCALEVIEWPORTEXTEX type PEMRSCALEWINDOWEXTEX = uintptr type tagEMRSETWORLDTRANSFORM = struct { Femr EMR Fxform XFORM } type EMRSETWORLDTRANSFORM = tagEMRSETWORLDTRANSFORM type PEMRSETWORLDTRANSFORM = uintptr type tagEMRMODIFYWORLDTRANSFORM = struct { Femr EMR Fxform XFORM FiMode DWORD } type EMRMODIFYWORLDTRANSFORM = tagEMRMODIFYWORLDTRANSFORM type PEMRMODIFYWORLDTRANSFORM = uintptr type tagEMRSETPIXELV = struct { Femr EMR FptlPixel POINTL FcrColor COLORREF } type EMRSETPIXELV = tagEMRSETPIXELV type PEMRSETPIXELV = uintptr type tagEMREXTFLOODFILL = struct { Femr EMR FptlStart POINTL FcrColor COLORREF FiMode DWORD } type EMREXTFLOODFILL = tagEMREXTFLOODFILL type PEMREXTFLOODFILL = uintptr type tagEMRELLIPSE = struct { Femr EMR FrclBox RECTL } type EMRELLIPSE = tagEMRELLIPSE type PEMRELLIPSE = uintptr type EMRRECTANGLE = tagEMRELLIPSE type PEMRRECTANGLE = uintptr type tagEMRROUNDRECT = struct { Femr EMR FrclBox RECTL FszlCorner SIZEL } type EMRROUNDRECT = tagEMRROUNDRECT type PEMRROUNDRECT = uintptr type tagEMRARC = struct { Femr EMR FrclBox RECTL FptlStart POINTL FptlEnd POINTL } type EMRARC = tagEMRARC type PEMRARC = uintptr type EMRARCTO = tagEMRARC type PEMRARCTO = uintptr type EMRCHORD = tagEMRARC type PEMRCHORD = uintptr type EMRPIE = tagEMRARC type PEMRPIE = uintptr type tagEMRANGLEARC = struct { Femr EMR FptlCenter POINTL FnRadius DWORD FeStartAngle FLOAT FeSweepAngle FLOAT } type EMRANGLEARC = tagEMRANGLEARC type PEMRANGLEARC = uintptr type tagEMRPOLYLINE = struct { Femr EMR FrclBounds RECTL Fcptl DWORD Faptl [1]POINTL } type EMRPOLYLINE = tagEMRPOLYLINE type PEMRPOLYLINE = uintptr type EMRPOLYBEZIER = tagEMRPOLYLINE type PEMRPOLYBEZIER = uintptr type EMRPOLYGON = tagEMRPOLYLINE type PEMRPOLYGON = uintptr type EMRPOLYBEZIERTO = tagEMRPOLYLINE type PEMRPOLYBEZIERTO = uintptr type EMRPOLYLINETO = tagEMRPOLYLINE type PEMRPOLYLINETO = uintptr type tagEMRPOLYLINE16 = struct { Femr EMR FrclBounds RECTL Fcpts DWORD Fapts [1]POINTS } type EMRPOLYLINE16 = tagEMRPOLYLINE16 type PEMRPOLYLINE16 = uintptr type EMRPOLYBEZIER16 = tagEMRPOLYLINE16 type PEMRPOLYBEZIER16 = uintptr type EMRPOLYGON16 = tagEMRPOLYLINE16 type PEMRPOLYGON16 = uintptr type EMRPOLYBEZIERTO16 = tagEMRPOLYLINE16 type PEMRPOLYBEZIERTO16 = uintptr type EMRPOLYLINETO16 = tagEMRPOLYLINE16 type PEMRPOLYLINETO16 = uintptr type tagEMRPOLYDRAW = struct { Femr EMR FrclBounds RECTL Fcptl DWORD Faptl [1]POINTL FabTypes [1]BYTE F__ccgo_pad1 [3]byte } type EMRPOLYDRAW = tagEMRPOLYDRAW type PEMRPOLYDRAW = uintptr type tagEMRPOLYDRAW16 = struct { Femr EMR FrclBounds RECTL Fcpts DWORD Fapts [1]POINTS FabTypes [1]BYTE F__ccgo_pad1 [3]byte } type EMRPOLYDRAW16 = tagEMRPOLYDRAW16 type PEMRPOLYDRAW16 = uintptr type tagEMRPOLYPOLYLINE = struct { Femr EMR FrclBounds RECTL FnPolys DWORD Fcptl DWORD FaPolyCounts [1]DWORD Faptl [1]POINTL } type EMRPOLYPOLYLINE = tagEMRPOLYPOLYLINE type PEMRPOLYPOLYLINE = uintptr type EMRPOLYPOLYGON = tagEMRPOLYPOLYLINE type PEMRPOLYPOLYGON = uintptr type tagEMRPOLYPOLYLINE16 = struct { Femr EMR FrclBounds RECTL FnPolys DWORD Fcpts DWORD FaPolyCounts [1]DWORD Fapts [1]POINTS } type EMRPOLYPOLYLINE16 = tagEMRPOLYPOLYLINE16 type PEMRPOLYPOLYLINE16 = uintptr type EMRPOLYPOLYGON16 = tagEMRPOLYPOLYLINE16 type PEMRPOLYPOLYGON16 = uintptr type tagEMRINVERTRGN = struct { Femr EMR FrclBounds RECTL FcbRgnData DWORD FRgnData [1]BYTE F__ccgo_pad1 [3]byte } type EMRINVERTRGN = tagEMRINVERTRGN type PEMRINVERTRGN = uintptr type EMRPAINTRGN = tagEMRINVERTRGN type PEMRPAINTRGN = uintptr type tagEMRFILLRGN = struct { Femr EMR FrclBounds RECTL FcbRgnData DWORD FihBrush DWORD FRgnData [1]BYTE F__ccgo_pad1 [3]byte } type EMRFILLRGN = tagEMRFILLRGN type PEMRFILLRGN = uintptr type tagEMRFRAMERGN = struct { Femr EMR FrclBounds RECTL FcbRgnData DWORD FihBrush DWORD FszlStroke SIZEL FRgnData [1]BYTE F__ccgo_pad1 [3]byte } type EMRFRAMERGN = tagEMRFRAMERGN type PEMRFRAMERGN = uintptr type tagEMREXTSELECTCLIPRGN = struct { Femr EMR FcbRgnData DWORD FiMode DWORD FRgnData [1]BYTE F__ccgo_pad1 [3]byte } type EMREXTSELECTCLIPRGN = tagEMREXTSELECTCLIPRGN type PEMREXTSELECTCLIPRGN = uintptr type tagEMREXTTEXTOUTA = struct { Femr EMR FrclBounds RECTL FiGraphicsMode DWORD FexScale FLOAT FeyScale FLOAT Femrtext EMRTEXT } type EMREXTTEXTOUTA = tagEMREXTTEXTOUTA type PEMREXTTEXTOUTA = uintptr type EMREXTTEXTOUTW = tagEMREXTTEXTOUTA type PEMREXTTEXTOUTW = uintptr type tagEMRPOLYTEXTOUTA = struct { Femr EMR FrclBounds RECTL FiGraphicsMode DWORD FexScale FLOAT FeyScale FLOAT FcStrings LONG Faemrtext [1]EMRTEXT } type EMRPOLYTEXTOUTA = tagEMRPOLYTEXTOUTA type PEMRPOLYTEXTOUTA = uintptr type EMRPOLYTEXTOUTW = tagEMRPOLYTEXTOUTA type PEMRPOLYTEXTOUTW = uintptr type tagEMRBITBLT = struct { Femr EMR FrclBounds RECTL FxDest LONG FyDest LONG FcxDest LONG FcyDest LONG FdwRop DWORD FxSrc LONG FySrc LONG FxformSrc XFORM FcrBkColorSrc COLORREF FiUsageSrc DWORD FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD } type EMRBITBLT = tagEMRBITBLT type PEMRBITBLT = uintptr type tagEMRSTRETCHBLT = struct { Femr EMR FrclBounds RECTL FxDest LONG FyDest LONG FcxDest LONG FcyDest LONG FdwRop DWORD FxSrc LONG FySrc LONG FxformSrc XFORM FcrBkColorSrc COLORREF FiUsageSrc DWORD FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD FcxSrc LONG FcySrc LONG } type EMRSTRETCHBLT = tagEMRSTRETCHBLT type PEMRSTRETCHBLT = uintptr type tagEMRMASKBLT = struct { Femr EMR FrclBounds RECTL FxDest LONG FyDest LONG FcxDest LONG FcyDest LONG FdwRop DWORD FxSrc LONG FySrc LONG FxformSrc XFORM FcrBkColorSrc COLORREF FiUsageSrc DWORD FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD FxMask LONG FyMask LONG FiUsageMask DWORD FoffBmiMask DWORD FcbBmiMask DWORD FoffBitsMask DWORD FcbBitsMask DWORD } type EMRMASKBLT = tagEMRMASKBLT type PEMRMASKBLT = uintptr type tagEMRPLGBLT = struct { Femr EMR FrclBounds RECTL FaptlDest [3]POINTL FxSrc LONG FySrc LONG FcxSrc LONG FcySrc LONG FxformSrc XFORM FcrBkColorSrc COLORREF FiUsageSrc DWORD FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD FxMask LONG FyMask LONG FiUsageMask DWORD FoffBmiMask DWORD FcbBmiMask DWORD FoffBitsMask DWORD FcbBitsMask DWORD } type EMRPLGBLT = tagEMRPLGBLT type PEMRPLGBLT = uintptr type tagEMRSETDIBITSTODEVICE = struct { Femr EMR FrclBounds RECTL FxDest LONG FyDest LONG FxSrc LONG FySrc LONG FcxSrc LONG FcySrc LONG FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD FiUsageSrc DWORD FiStartScan DWORD FcScans DWORD } type EMRSETDIBITSTODEVICE = tagEMRSETDIBITSTODEVICE type PEMRSETDIBITSTODEVICE = uintptr type tagEMRSTRETCHDIBITS = struct { Femr EMR FrclBounds RECTL FxDest LONG FyDest LONG FxSrc LONG FySrc LONG FcxSrc LONG FcySrc LONG FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD FiUsageSrc DWORD FdwRop DWORD FcxDest LONG FcyDest LONG } type EMRSTRETCHDIBITS = tagEMRSTRETCHDIBITS type PEMRSTRETCHDIBITS = uintptr type tagEMREXTCREATEFONTINDIRECTW = struct { Femr EMR FihFont DWORD Felfw EXTLOGFONTW } type EMREXTCREATEFONTINDIRECTW = tagEMREXTCREATEFONTINDIRECTW type PEMREXTCREATEFONTINDIRECTW = uintptr type tagEMRCREATEPALETTE = struct { Femr EMR FihPal DWORD Flgpl LOGPALETTE } type EMRCREATEPALETTE = tagEMRCREATEPALETTE type PEMRCREATEPALETTE = uintptr type tagEMRCREATEPEN = struct { Femr EMR FihPen DWORD Flopn LOGPEN } type EMRCREATEPEN = tagEMRCREATEPEN type PEMRCREATEPEN = uintptr type tagEMREXTCREATEPEN = struct { Femr EMR FihPen DWORD FoffBmi DWORD FcbBmi DWORD FoffBits DWORD FcbBits DWORD F__ccgo_pad1 [4]byte Felp EXTLOGPEN } type EMREXTCREATEPEN = tagEMREXTCREATEPEN type PEMREXTCREATEPEN = uintptr type tagEMRCREATEBRUSHINDIRECT = struct { Femr EMR FihBrush DWORD Flb LOGBRUSH32 } type EMRCREATEBRUSHINDIRECT = tagEMRCREATEBRUSHINDIRECT type PEMRCREATEBRUSHINDIRECT = uintptr type tagEMRCREATEMONOBRUSH = struct { Femr EMR FihBrush DWORD FiUsage DWORD FoffBmi DWORD FcbBmi DWORD FoffBits DWORD FcbBits DWORD } type EMRCREATEMONOBRUSH = tagEMRCREATEMONOBRUSH type PEMRCREATEMONOBRUSH = uintptr type tagEMRCREATEDIBPATTERNBRUSHPT = struct { Femr EMR FihBrush DWORD FiUsage DWORD FoffBmi DWORD FcbBmi DWORD FoffBits DWORD FcbBits DWORD } type EMRCREATEDIBPATTERNBRUSHPT = tagEMRCREATEDIBPATTERNBRUSHPT type PEMRCREATEDIBPATTERNBRUSHPT = uintptr type tagEMRFORMAT = struct { FdSignature DWORD FnVersion DWORD FcbData DWORD FoffData DWORD } type EMRFORMAT = tagEMRFORMAT type PEMRFORMAT = uintptr type tagEMRGLSRECORD = struct { Femr EMR FcbData DWORD FData [1]BYTE F__ccgo_pad1 [3]byte } type EMRGLSRECORD = tagEMRGLSRECORD type PEMRGLSRECORD = uintptr type tagEMRGLSBOUNDEDRECORD = struct { Femr EMR FrclBounds RECTL FcbData DWORD FData [1]BYTE F__ccgo_pad1 [3]byte } type EMRGLSBOUNDEDRECORD = tagEMRGLSBOUNDEDRECORD type PEMRGLSBOUNDEDRECORD = uintptr type tagEMRPIXELFORMAT = struct { Femr EMR Fpfd PIXELFORMATDESCRIPTOR } type EMRPIXELFORMAT = tagEMRPIXELFORMAT type PEMRPIXELFORMAT = uintptr type tagEMRCREATECOLORSPACE = struct { Femr EMR FihCS DWORD Flcs LOGCOLORSPACEA } type EMRCREATECOLORSPACE = tagEMRCREATECOLORSPACE type PEMRCREATECOLORSPACE = uintptr type tagEMRSETCOLORSPACE = struct { Femr EMR FihCS DWORD } type EMRSETCOLORSPACE = tagEMRSETCOLORSPACE type PEMRSETCOLORSPACE = uintptr type EMRSELECTCOLORSPACE = tagEMRSETCOLORSPACE type PEMRSELECTCOLORSPACE = uintptr type EMRDELETECOLORSPACE = tagEMRSETCOLORSPACE type PEMRDELETECOLORSPACE = uintptr type tagEMREXTESCAPE = struct { Femr EMR FiEscape INT FcbEscData INT FEscData [1]BYTE F__ccgo_pad1 [3]byte } type EMREXTESCAPE = tagEMREXTESCAPE type PEMREXTESCAPE = uintptr type EMRDRAWESCAPE = tagEMREXTESCAPE type PEMRDRAWESCAPE = uintptr type tagEMRNAMEDESCAPE = struct { Femr EMR FiEscape INT FcbDriver INT FcbEscData INT FEscData [1]BYTE F__ccgo_pad1 [3]byte } type EMRNAMEDESCAPE = tagEMRNAMEDESCAPE type PEMRNAMEDESCAPE = uintptr type tagEMRSETICMPROFILE = struct { Femr EMR FdwFlags DWORD FcbName DWORD FcbData DWORD FData [1]BYTE F__ccgo_pad1 [3]byte } type EMRSETICMPROFILE = tagEMRSETICMPROFILE type PEMRSETICMPROFILE = uintptr type EMRSETICMPROFILEA = tagEMRSETICMPROFILE type PEMRSETICMPROFILEA = uintptr type EMRSETICMPROFILEW = tagEMRSETICMPROFILE type PEMRSETICMPROFILEW = uintptr type tagEMRCREATECOLORSPACEW = struct { Femr EMR FihCS DWORD Flcs LOGCOLORSPACEW FdwFlags DWORD FcbData DWORD FData [1]BYTE F__ccgo_pad1 [3]byte } type EMRCREATECOLORSPACEW = tagEMRCREATECOLORSPACEW type PEMRCREATECOLORSPACEW = uintptr type tagCOLORMATCHTOTARGET = struct { Femr EMR FdwAction DWORD FdwFlags DWORD FcbName DWORD FcbData DWORD FData [1]BYTE F__ccgo_pad1 [3]byte } type EMRCOLORMATCHTOTARGET = tagCOLORMATCHTOTARGET type PEMRCOLORMATCHTOTARGET = uintptr type tagCOLORCORRECTPALETTE = struct { Femr EMR FihPalette DWORD FnFirstEntry DWORD FnPalEntries DWORD FnReserved DWORD } type EMRCOLORCORRECTPALETTE = tagCOLORCORRECTPALETTE type PEMRCOLORCORRECTPALETTE = uintptr type tagEMRALPHABLEND = struct { Femr EMR FrclBounds RECTL FxDest LONG FyDest LONG FcxDest LONG FcyDest LONG FdwRop DWORD FxSrc LONG FySrc LONG FxformSrc XFORM FcrBkColorSrc COLORREF FiUsageSrc DWORD FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD FcxSrc LONG FcySrc LONG } type EMRALPHABLEND = tagEMRALPHABLEND type PEMRALPHABLEND = uintptr type tagEMRGRADIENTFILL = struct { Femr EMR FrclBounds RECTL FnVer DWORD FnTri DWORD FulMode ULONG FVer [1]TRIVERTEX } type EMRGRADIENTFILL = tagEMRGRADIENTFILL type PEMRGRADIENTFILL = uintptr type tagEMRTRANSPARENTBLT = struct { Femr EMR FrclBounds RECTL FxDest LONG FyDest LONG FcxDest LONG FcyDest LONG FdwRop DWORD FxSrc LONG FySrc LONG FxformSrc XFORM FcrBkColorSrc COLORREF FiUsageSrc DWORD FoffBmiSrc DWORD FcbBmiSrc DWORD FoffBitsSrc DWORD FcbBitsSrc DWORD FcxSrc LONG FcySrc LONG } type EMRTRANSPARENTBLT = tagEMRTRANSPARENTBLT type PEMRTRANSPARENTBLT = uintptr type _POINTFLOAT = struct { Fx FLOAT Fy FLOAT } type POINTFLOAT = _POINTFLOAT type PPOINTFLOAT = uintptr type _GLYPHMETRICSFLOAT = struct { FgmfBlackBoxX FLOAT FgmfBlackBoxY FLOAT FgmfptGlyphOrigin POINTFLOAT FgmfCellIncX FLOAT FgmfCellIncY FLOAT } type GLYPHMETRICSFLOAT = _GLYPHMETRICSFLOAT type PGLYPHMETRICSFLOAT = uintptr type LPGLYPHMETRICSFLOAT = uintptr type tagLAYERPLANEDESCRIPTOR = struct { FnSize WORD FnVersion WORD FdwFlags DWORD FiPixelType BYTE FcColorBits BYTE FcRedBits BYTE FcRedShift BYTE FcGreenBits BYTE FcGreenShift BYTE FcBlueBits BYTE FcBlueShift BYTE FcAlphaBits BYTE FcAlphaShift BYTE FcAccumBits BYTE FcAccumRedBits BYTE FcAccumGreenBits BYTE FcAccumBlueBits BYTE FcAccumAlphaBits BYTE FcDepthBits BYTE FcStencilBits BYTE FcAuxBuffers BYTE FiLayerPlane BYTE FbReserved BYTE FcrTransparent COLORREF } type LAYERPLANEDESCRIPTOR = tagLAYERPLANEDESCRIPTOR type PLAYERPLANEDESCRIPTOR = uintptr type LPLAYERPLANEDESCRIPTOR = uintptr type _WGLSWAP = struct { Fhdc HDC FuiFlags UINT F__ccgo_pad1 [4]byte } type WGLSWAP = _WGLSWAP type PWGLSWAP = uintptr type LPWGLSWAP = uintptr type HDWP = HANDLE type LPMENUTEMPLATEA = PVOID type LPMENUTEMPLATEW = PVOID type LPMENUTEMPLATE = LPMENUTEMPLATEA type WNDPROC = uintptr type DLGPROC = uintptr type TIMERPROC = uintptr type GRAYSTRINGPROC = uintptr type WNDENUMPROC = uintptr type HOOKPROC = uintptr type SENDASYNCPROC = uintptr type PROPENUMPROCA = uintptr type PROPENUMPROCW = uintptr type PROPENUMPROCEXA = uintptr type PROPENUMPROCEXW = uintptr type EDITWORDBREAKPROCA = uintptr type EDITWORDBREAKPROCW = uintptr type DRAWSTATEPROC = uintptr type PROPENUMPROC = PROPENUMPROCA type PROPENUMPROCEX = PROPENUMPROCEXA type EDITWORDBREAKPROC = EDITWORDBREAKPROCA type NAMEENUMPROCA = uintptr type NAMEENUMPROCW = uintptr type WINSTAENUMPROCA = NAMEENUMPROCA type WINSTAENUMPROCW = NAMEENUMPROCW type DESKTOPENUMPROCA = NAMEENUMPROCA type DESKTOPENUMPROCW = NAMEENUMPROCW type WINSTAENUMPROC = WINSTAENUMPROCA type DESKTOPENUMPROC = DESKTOPENUMPROCA type tagCBT_CREATEWNDA = struct { Flpcs uintptr FhwndInsertAfter HWND } type tagCREATESTRUCTA = struct { FlpCreateParams LPVOID FhInstance HINSTANCE FhMenu HMENU FhwndParent HWND Fcy int32 Fcx int32 Fy int32 Fx int32 Fstyle LONG F__ccgo_pad1 [4]byte FlpszName LPCSTR FlpszClass LPCSTR FdwExStyle DWORD F__ccgo_pad2 [4]byte } type CBT_CREATEWNDA = tagCBT_CREATEWNDA type LPCBT_CREATEWNDA = uintptr type tagCBT_CREATEWNDW = struct { Flpcs uintptr FhwndInsertAfter HWND } type tagCREATESTRUCTW = struct { FlpCreateParams LPVOID FhInstance HINSTANCE FhMenu HMENU FhwndParent HWND Fcy int32 Fcx int32 Fy int32 Fx int32 Fstyle LONG F__ccgo_pad1 [4]byte FlpszName LPCWSTR FlpszClass LPCWSTR FdwExStyle DWORD F__ccgo_pad2 [4]byte } type CBT_CREATEWNDW = tagCBT_CREATEWNDW type LPCBT_CREATEWNDW = uintptr type CBT_CREATEWND = CBT_CREATEWNDA type LPCBT_CREATEWND = LPCBT_CREATEWNDA type tagCBTACTIVATESTRUCT = struct { FfMouse WINBOOL F__ccgo_pad1 [4]byte FhWndActive HWND } type CBTACTIVATESTRUCT = tagCBTACTIVATESTRUCT type LPCBTACTIVATESTRUCT = uintptr type tagWTSSESSION_NOTIFICATION = struct { FcbSize DWORD FdwSessionId DWORD } type WTSSESSION_NOTIFICATION = tagWTSSESSION_NOTIFICATION type PWTSSESSION_NOTIFICATION = uintptr type SHELLHOOKINFO = struct { Fhwnd HWND Frc RECT } type LPSHELLHOOKINFO = uintptr type tagEVENTMSG = struct { Fmessage UINT FparamL UINT FparamH UINT Ftime DWORD Fhwnd HWND } type EVENTMSG = tagEVENTMSG type PEVENTMSGMSG = uintptr type NPEVENTMSGMSG = uintptr type LPEVENTMSGMSG = uintptr type PEVENTMSG = uintptr type NPEVENTMSG = uintptr type LPEVENTMSG = uintptr type tagCWPSTRUCT = struct { FlParam LPARAM FwParam WPARAM Fmessage UINT F__ccgo_pad1 [4]byte Fhwnd HWND } type CWPSTRUCT = tagCWPSTRUCT type PCWPSTRUCT = uintptr type NPCWPSTRUCT = uintptr type LPCWPSTRUCT = uintptr type tagCWPRETSTRUCT = struct { FlResult LRESULT FlParam LPARAM FwParam WPARAM Fmessage UINT F__ccgo_pad1 [4]byte Fhwnd HWND } type CWPRETSTRUCT = tagCWPRETSTRUCT type PCWPRETSTRUCT = uintptr type NPCWPRETSTRUCT = uintptr type LPCWPRETSTRUCT = uintptr type tagKBDLLHOOKSTRUCT = struct { FvkCode DWORD FscanCode DWORD Fflags DWORD Ftime DWORD FdwExtraInfo ULONG_PTR } type KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT type LPKBDLLHOOKSTRUCT = uintptr type PKBDLLHOOKSTRUCT = uintptr type tagMSLLHOOKSTRUCT = struct { Fpt POINT FmouseData DWORD Fflags DWORD Ftime DWORD F__ccgo_pad1 [4]byte FdwExtraInfo ULONG_PTR } type MSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT type LPMSLLHOOKSTRUCT = uintptr type PMSLLHOOKSTRUCT = uintptr type tagDEBUGHOOKINFO = struct { FidThread DWORD FidThreadInstaller DWORD FlParam LPARAM FwParam WPARAM Fcode int32 F__ccgo_pad1 [4]byte } type DEBUGHOOKINFO = tagDEBUGHOOKINFO type PDEBUGHOOKINFO = uintptr type NPDEBUGHOOKINFO = uintptr type LPDEBUGHOOKINFO = uintptr type tagMOUSEHOOKSTRUCT = struct { Fpt POINT Fhwnd HWND FwHitTestCode UINT F__ccgo_pad1 [4]byte FdwExtraInfo ULONG_PTR } type MOUSEHOOKSTRUCT = tagMOUSEHOOKSTRUCT type LPMOUSEHOOKSTRUCT = uintptr type PMOUSEHOOKSTRUCT = uintptr type tagMOUSEHOOKSTRUCTEX = struct { F__unnamed MOUSEHOOKSTRUCT FmouseData DWORD F__ccgo_pad1 [4]byte } type MOUSEHOOKSTRUCTEX = tagMOUSEHOOKSTRUCTEX type LPMOUSEHOOKSTRUCTEX = uintptr type PMOUSEHOOKSTRUCTEX = uintptr type tagHARDWAREHOOKSTRUCT = struct { Fhwnd HWND Fmessage UINT F__ccgo_pad1 [4]byte FwParam WPARAM FlParam LPARAM } type HARDWAREHOOKSTRUCT = tagHARDWAREHOOKSTRUCT type LPHARDWAREHOOKSTRUCT = uintptr type PHARDWAREHOOKSTRUCT = uintptr type tagMOUSEMOVEPOINT = struct { Fx int32 Fy int32 Ftime DWORD F__ccgo_pad1 [4]byte FdwExtraInfo ULONG_PTR } type MOUSEMOVEPOINT = tagMOUSEMOVEPOINT type PMOUSEMOVEPOINT = uintptr type LPMOUSEMOVEPOINT = uintptr type tagUSEROBJECTFLAGS = struct { FfInherit WINBOOL FfReserved WINBOOL FdwFlags DWORD } type USEROBJECTFLAGS = tagUSEROBJECTFLAGS type PUSEROBJECTFLAGS = uintptr type tagWNDCLASSEXA = struct { FcbSize UINT Fstyle UINT FlpfnWndProc WNDPROC FcbClsExtra int32 FcbWndExtra int32 FhInstance HINSTANCE FhIcon HICON FhCursor HCURSOR FhbrBackground HBRUSH FlpszMenuName LPCSTR FlpszClassName LPCSTR FhIconSm HICON } type WNDCLASSEXA = tagWNDCLASSEXA type PWNDCLASSEXA = uintptr type NPWNDCLASSEXA = uintptr type LPWNDCLASSEXA = uintptr type tagWNDCLASSEXW = struct { FcbSize UINT Fstyle UINT FlpfnWndProc WNDPROC FcbClsExtra int32 FcbWndExtra int32 FhInstance HINSTANCE FhIcon HICON FhCursor HCURSOR FhbrBackground HBRUSH FlpszMenuName LPCWSTR FlpszClassName LPCWSTR FhIconSm HICON } type WNDCLASSEXW = tagWNDCLASSEXW type PWNDCLASSEXW = uintptr type NPWNDCLASSEXW = uintptr type LPWNDCLASSEXW = uintptr type WNDCLASSEX = WNDCLASSEXA type PWNDCLASSEX = PWNDCLASSEXA type NPWNDCLASSEX = NPWNDCLASSEXA type LPWNDCLASSEX = LPWNDCLASSEXA type tagWNDCLASSA = struct { Fstyle UINT F__ccgo_pad1 [4]byte FlpfnWndProc WNDPROC FcbClsExtra int32 FcbWndExtra int32 FhInstance HINSTANCE FhIcon HICON FhCursor HCURSOR FhbrBackground HBRUSH FlpszMenuName LPCSTR FlpszClassName LPCSTR } type WNDCLASSA = tagWNDCLASSA type PWNDCLASSA = uintptr type NPWNDCLASSA = uintptr type LPWNDCLASSA = uintptr type tagWNDCLASSW = struct { Fstyle UINT F__ccgo_pad1 [4]byte FlpfnWndProc WNDPROC FcbClsExtra int32 FcbWndExtra int32 FhInstance HINSTANCE FhIcon HICON FhCursor HCURSOR FhbrBackground HBRUSH FlpszMenuName LPCWSTR FlpszClassName LPCWSTR } type WNDCLASSW = tagWNDCLASSW type PWNDCLASSW = uintptr type NPWNDCLASSW = uintptr type LPWNDCLASSW = uintptr type WNDCLASS = WNDCLASSA type PWNDCLASS = PWNDCLASSA type NPWNDCLASS = NPWNDCLASSA type LPWNDCLASS = LPWNDCLASSA type tagMSG = struct { Fhwnd HWND Fmessage UINT F__ccgo_pad1 [4]byte FwParam WPARAM FlParam LPARAM Ftime DWORD Fpt POINT F__ccgo_pad2 [4]byte } type MSG = tagMSG type PMSG = uintptr type NPMSG = uintptr type LPMSG = uintptr type tagMINMAXINFO = struct { FptReserved POINT FptMaxSize POINT FptMaxPosition POINT FptMinTrackSize POINT FptMaxTrackSize POINT } type MINMAXINFO = tagMINMAXINFO type PMINMAXINFO = uintptr type LPMINMAXINFO = uintptr type tagCOPYDATASTRUCT = struct { FdwData ULONG_PTR FcbData DWORD F__ccgo_pad1 [4]byte FlpData PVOID } type COPYDATASTRUCT = tagCOPYDATASTRUCT type PCOPYDATASTRUCT = uintptr type tagMDINEXTMENU = struct { FhmenuIn HMENU FhmenuNext HMENU FhwndNext HWND } type MDINEXTMENU = tagMDINEXTMENU type PMDINEXTMENU = uintptr type LPMDINEXTMENU = uintptr type POWERBROADCAST_SETTING = struct { FPowerSetting GUID FDataLength DWORD FData [1]UCHAR F__ccgo_pad1 [3]byte } type PPOWERBROADCAST_SETTING = uintptr type tagWINDOWPOS = struct { Fhwnd HWND FhwndInsertAfter HWND Fx int32 Fy int32 Fcx int32 Fcy int32 Fflags UINT F__ccgo_pad1 [4]byte } type WINDOWPOS = tagWINDOWPOS type LPWINDOWPOS = uintptr type PWINDOWPOS = uintptr type tagNCCALCSIZE_PARAMS = struct { Frgrc [3]RECT Flppos PWINDOWPOS } type NCCALCSIZE_PARAMS = tagNCCALCSIZE_PARAMS type LPNCCALCSIZE_PARAMS = uintptr type tagTRACKMOUSEEVENT = struct { FcbSize DWORD FdwFlags DWORD FhwndTrack HWND FdwHoverTime DWORD F__ccgo_pad1 [4]byte } type TRACKMOUSEEVENT = tagTRACKMOUSEEVENT type LPTRACKMOUSEEVENT = uintptr type tagACCEL = struct { FfVirt BYTE F__ccgo_pad1 [1]byte Fkey WORD Fcmd WORD } type ACCEL = tagACCEL type LPACCEL = uintptr type tagPAINTSTRUCT = struct { Fhdc HDC FfErase WINBOOL FrcPaint RECT FfRestore WINBOOL FfIncUpdate WINBOOL FrgbReserved [32]BYTE F__ccgo_pad1 [4]byte } type PAINTSTRUCT = tagPAINTSTRUCT type PPAINTSTRUCT = uintptr type NPPAINTSTRUCT = uintptr type LPPAINTSTRUCT = uintptr type CREATESTRUCTA = tagCREATESTRUCTA type LPCREATESTRUCTA = uintptr type CREATESTRUCTW = tagCREATESTRUCTW type LPCREATESTRUCTW = uintptr type CREATESTRUCT = CREATESTRUCTA type LPCREATESTRUCT = LPCREATESTRUCTA type tagWINDOWPLACEMENT = struct { Flength UINT Fflags UINT FshowCmd UINT FptMinPosition POINT FptMaxPosition POINT FrcNormalPosition RECT } type WINDOWPLACEMENT = tagWINDOWPLACEMENT type PWINDOWPLACEMENT = uintptr type LPWINDOWPLACEMENT = uintptr type tagNMHDR = struct { FhwndFrom HWND FidFrom UINT_PTR Fcode UINT F__ccgo_pad1 [4]byte } type NMHDR = tagNMHDR type LPNMHDR = uintptr type tagSTYLESTRUCT = struct { FstyleOld DWORD FstyleNew DWORD } type STYLESTRUCT = tagSTYLESTRUCT type LPSTYLESTRUCT = uintptr type tagMEASUREITEMSTRUCT = struct { FCtlType UINT FCtlID UINT FitemID UINT FitemWidth UINT FitemHeight UINT F__ccgo_pad1 [4]byte FitemData ULONG_PTR } type MEASUREITEMSTRUCT = tagMEASUREITEMSTRUCT type PMEASUREITEMSTRUCT = uintptr type LPMEASUREITEMSTRUCT = uintptr type tagDRAWITEMSTRUCT = struct { FCtlType UINT FCtlID UINT FitemID UINT FitemAction UINT FitemState UINT F__ccgo_pad1 [4]byte FhwndItem HWND FhDC HDC FrcItem RECT FitemData ULONG_PTR } type DRAWITEMSTRUCT = tagDRAWITEMSTRUCT type PDRAWITEMSTRUCT = uintptr type LPDRAWITEMSTRUCT = uintptr type tagDELETEITEMSTRUCT = struct { FCtlType UINT FCtlID UINT FitemID UINT F__ccgo_pad1 [4]byte FhwndItem HWND FitemData ULONG_PTR } type DELETEITEMSTRUCT = tagDELETEITEMSTRUCT type PDELETEITEMSTRUCT = uintptr type LPDELETEITEMSTRUCT = uintptr type tagCOMPAREITEMSTRUCT = struct { FCtlType UINT FCtlID UINT FhwndItem HWND FitemID1 UINT F__ccgo_pad1 [4]byte FitemData1 ULONG_PTR FitemID2 UINT F__ccgo_pad2 [4]byte FitemData2 ULONG_PTR FdwLocaleId DWORD F__ccgo_pad3 [4]byte } type COMPAREITEMSTRUCT = tagCOMPAREITEMSTRUCT type PCOMPAREITEMSTRUCT = uintptr type LPCOMPAREITEMSTRUCT = uintptr type BSMINFO = struct { FcbSize UINT F__ccgo_pad1 [4]byte Fhdesk HDESK Fhwnd HWND Fluid LUID } type PBSMINFO = uintptr type HDEVNOTIFY = PVOID type PHDEVNOTIFY = uintptr type HPOWERNOTIFY = HANDLE type PHPOWERNOTIFY = uintptr type PREGISTERCLASSNAMEW = uintptr type tagUPDATELAYEREDWINDOWINFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhdcDst HDC FpptDst uintptr Fpsize uintptr FhdcSrc HDC FpptSrc uintptr FcrKey COLORREF F__ccgo_pad2 [4]byte Fpblend uintptr FdwFlags DWORD F__ccgo_pad3 [4]byte FprcDirty uintptr } type UPDATELAYEREDWINDOWINFO = tagUPDATELAYEREDWINDOWINFO type PUPDATELAYEREDWINDOWINFO = uintptr type FLASHWINFO = struct { FcbSize UINT F__ccgo_pad1 [4]byte Fhwnd HWND FdwFlags DWORD FuCount UINT FdwTimeout DWORD F__ccgo_pad2 [4]byte } type PFLASHWINFO = uintptr type DLGTEMPLATE = struct { Fstyle DWORD FdwExtendedStyle DWORD Fcdit WORD Fx int16 Fy int16 Fcx int16 Fcy int16 F__ccgo_pad1 [2]byte } type LPDLGTEMPLATEA = uintptr type LPDLGTEMPLATEW = uintptr type LPDLGTEMPLATE = LPDLGTEMPLATEA type LPCDLGTEMPLATEA = uintptr type LPCDLGTEMPLATEW = uintptr type LPCDLGTEMPLATE = LPCDLGTEMPLATEA type DLGITEMTEMPLATE = struct { Fstyle DWORD FdwExtendedStyle DWORD Fx int16 Fy int16 Fcx int16 Fcy int16 Fid WORD F__ccgo_pad1 [2]byte } type PDLGITEMTEMPLATEA = uintptr type PDLGITEMTEMPLATEW = uintptr type PDLGITEMTEMPLATE = PDLGITEMTEMPLATEA type LPDLGITEMTEMPLATEA = uintptr type LPDLGITEMTEMPLATEW = uintptr type LPDLGITEMTEMPLATE = LPDLGITEMTEMPLATEA type DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS = uint32 type DIALOG_DPI_CHANGE_BEHAVIORS = uint32 type tagMOUSEINPUT = struct { Fdx LONG Fdy LONG FmouseData DWORD FdwFlags DWORD Ftime DWORD F__ccgo_pad1 [4]byte FdwExtraInfo ULONG_PTR } type MOUSEINPUT = tagMOUSEINPUT type PMOUSEINPUT = uintptr type LPMOUSEINPUT = uintptr type tagKEYBDINPUT = struct { FwVk WORD FwScan WORD FdwFlags DWORD Ftime DWORD F__ccgo_pad1 [4]byte FdwExtraInfo ULONG_PTR } type KEYBDINPUT = tagKEYBDINPUT type PKEYBDINPUT = uintptr type LPKEYBDINPUT = uintptr type tagHARDWAREINPUT = struct { FuMsg DWORD FwParamL WORD FwParamH WORD } type HARDWAREINPUT = tagHARDWAREINPUT type PHARDWAREINPUT = uintptr type LPHARDWAREINPUT = uintptr type tagINPUT = struct { Ftype DWORD F__ccgo_pad1 [4]byte Fu struct{ Fmi MOUSEINPUT } } type INPUT = tagINPUT type PINPUT = uintptr type LPINPUT = uintptr type tagLASTINPUTINFO = struct { FcbSize UINT FdwTime DWORD } type LASTINPUTINFO = tagLASTINPUTINFO type PLASTINPUTINFO = uintptr type tagTPMPARAMS = struct { FcbSize UINT FrcExclude RECT } type TPMPARAMS = tagTPMPARAMS type tagMENUINFO = struct { FcbSize DWORD FfMask DWORD FdwStyle DWORD FcyMax UINT FhbrBack HBRUSH FdwContextHelpID DWORD F__ccgo_pad1 [4]byte FdwMenuData ULONG_PTR } type MENUINFO = tagMENUINFO type LPMENUINFO = uintptr type LPTPMPARAMS = uintptr type LPCMENUINFO = uintptr type tagMENUGETOBJECTINFO = struct { FdwFlags DWORD FuPos UINT Fhmenu HMENU Friid PVOID FpvObj PVOID } type MENUGETOBJECTINFO = tagMENUGETOBJECTINFO type PMENUGETOBJECTINFO = uintptr type tagMENUITEMINFOA = struct { FcbSize UINT FfMask UINT FfType UINT FfState UINT FwID UINT F__ccgo_pad1 [4]byte FhSubMenu HMENU FhbmpChecked HBITMAP FhbmpUnchecked HBITMAP FdwItemData ULONG_PTR FdwTypeData LPSTR Fcch UINT F__ccgo_pad2 [4]byte FhbmpItem HBITMAP } type MENUITEMINFOA = tagMENUITEMINFOA type LPMENUITEMINFOA = uintptr type tagMENUITEMINFOW = struct { FcbSize UINT FfMask UINT FfType UINT FfState UINT FwID UINT F__ccgo_pad1 [4]byte FhSubMenu HMENU FhbmpChecked HBITMAP FhbmpUnchecked HBITMAP FdwItemData ULONG_PTR FdwTypeData LPWSTR Fcch UINT F__ccgo_pad2 [4]byte FhbmpItem HBITMAP } type MENUITEMINFOW = tagMENUITEMINFOW type LPMENUITEMINFOW = uintptr type MENUITEMINFO = MENUITEMINFOA type LPMENUITEMINFO = LPMENUITEMINFOA type LPCMENUITEMINFOA = uintptr type LPCMENUITEMINFOW = uintptr type LPCMENUITEMINFO = LPCMENUITEMINFOA type tagDROPSTRUCT = struct { FhwndSource HWND FhwndSink HWND FwFmt DWORD F__ccgo_pad1 [4]byte FdwData ULONG_PTR FptDrop POINT FdwControlData DWORD F__ccgo_pad2 [4]byte } type DROPSTRUCT = tagDROPSTRUCT type PDROPSTRUCT = uintptr type LPDROPSTRUCT = uintptr type tagDRAWTEXTPARAMS = struct { FcbSize UINT FiTabLength int32 FiLeftMargin int32 FiRightMargin int32 FuiLengthDrawn UINT } type DRAWTEXTPARAMS = tagDRAWTEXTPARAMS type LPDRAWTEXTPARAMS = uintptr type tagHELPINFO = struct { FcbSize UINT FiContextType int32 FiCtrlId int32 F__ccgo_pad1 [4]byte FhItemHandle HANDLE FdwContextId DWORD_PTR FMousePos POINT } type HELPINFO = tagHELPINFO type LPHELPINFO = uintptr type MSGBOXCALLBACK = uintptr type tagMSGBOXPARAMSA = struct { FcbSize UINT F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FlpszText LPCSTR FlpszCaption LPCSTR FdwStyle DWORD F__ccgo_pad2 [4]byte FlpszIcon LPCSTR FdwContextHelpId DWORD_PTR FlpfnMsgBoxCallback MSGBOXCALLBACK FdwLanguageId DWORD F__ccgo_pad3 [4]byte } type MSGBOXPARAMSA = tagMSGBOXPARAMSA type PMSGBOXPARAMSA = uintptr type LPMSGBOXPARAMSA = uintptr type tagMSGBOXPARAMSW = struct { FcbSize UINT F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FlpszText LPCWSTR FlpszCaption LPCWSTR FdwStyle DWORD F__ccgo_pad2 [4]byte FlpszIcon LPCWSTR FdwContextHelpId DWORD_PTR FlpfnMsgBoxCallback MSGBOXCALLBACK FdwLanguageId DWORD F__ccgo_pad3 [4]byte } type MSGBOXPARAMSW = tagMSGBOXPARAMSW type PMSGBOXPARAMSW = uintptr type LPMSGBOXPARAMSW = uintptr type MSGBOXPARAMS = MSGBOXPARAMSA type PMSGBOXPARAMS = PMSGBOXPARAMSA type LPMSGBOXPARAMS = LPMSGBOXPARAMSA type MENUITEMTEMPLATEHEADER = struct { FversionNumber WORD Foffset WORD } type PMENUITEMTEMPLATEHEADER = uintptr type MENUITEMTEMPLATE = struct { FmtOption WORD FmtID WORD FmtString [1]WCHAR } type PMENUITEMTEMPLATE = uintptr type _ICONINFO = struct { FfIcon WINBOOL FxHotspot DWORD FyHotspot DWORD F__ccgo_pad1 [4]byte FhbmMask HBITMAP FhbmColor HBITMAP } type ICONINFO = _ICONINFO type PICONINFO = uintptr type tagCURSORSHAPE = struct { FxHotSpot int32 FyHotSpot int32 Fcx int32 Fcy int32 FcbWidth int32 FPlanes BYTE FBitsPixel BYTE F__ccgo_pad1 [2]byte } type CURSORSHAPE = tagCURSORSHAPE type LPCURSORSHAPE = uintptr type tagSCROLLINFO = struct { FcbSize UINT FfMask UINT FnMin int32 FnMax int32 FnPage UINT FnPos int32 FnTrackPos int32 } type SCROLLINFO = tagSCROLLINFO type LPSCROLLINFO = uintptr type LPCSCROLLINFO = uintptr type tagMDICREATESTRUCTA = struct { FszClass LPCSTR FszTitle LPCSTR FhOwner HANDLE Fx int32 Fy int32 Fcx int32 Fcy int32 Fstyle DWORD F__ccgo_pad1 [4]byte FlParam LPARAM } type MDICREATESTRUCTA = tagMDICREATESTRUCTA type LPMDICREATESTRUCTA = uintptr type tagMDICREATESTRUCTW = struct { FszClass LPCWSTR FszTitle LPCWSTR FhOwner HANDLE Fx int32 Fy int32 Fcx int32 Fcy int32 Fstyle DWORD F__ccgo_pad1 [4]byte FlParam LPARAM } type MDICREATESTRUCTW = tagMDICREATESTRUCTW type LPMDICREATESTRUCTW = uintptr type MDICREATESTRUCT = MDICREATESTRUCTA type LPMDICREATESTRUCT = LPMDICREATESTRUCTA type tagCLIENTCREATESTRUCT = struct { FhWindowMenu HANDLE FidFirstChild UINT F__ccgo_pad1 [4]byte } type CLIENTCREATESTRUCT = tagCLIENTCREATESTRUCT type LPCLIENTCREATESTRUCT = uintptr type HELPPOLY = DWORD type tagMULTIKEYHELPA = struct { FmkSize DWORD FmkKeylist CHAR FszKeyphrase [1]CHAR F__ccgo_pad1 [2]byte } type MULTIKEYHELPA = tagMULTIKEYHELPA type PMULTIKEYHELPA = uintptr type LPMULTIKEYHELPA = uintptr type tagMULTIKEYHELPW = struct { FmkSize DWORD FmkKeylist WCHAR FszKeyphrase [1]WCHAR } type MULTIKEYHELPW = tagMULTIKEYHELPW type PMULTIKEYHELPW = uintptr type LPMULTIKEYHELPW = uintptr type MULTIKEYHELP = MULTIKEYHELPA type PMULTIKEYHELP = PMULTIKEYHELPA type LPMULTIKEYHELP = LPMULTIKEYHELPA type tagHELPWININFOA = struct { FwStructSize int32 Fx int32 Fy int32 Fdx int32 Fdy int32 FwMax int32 FrgchMember [2]CHAR F__ccgo_pad1 [2]byte } type HELPWININFOA = tagHELPWININFOA type PHELPWININFOA = uintptr type LPHELPWININFOA = uintptr type tagHELPWININFOW = struct { FwStructSize int32 Fx int32 Fy int32 Fdx int32 Fdy int32 FwMax int32 FrgchMember [2]WCHAR } type HELPWININFOW = tagHELPWININFOW type PHELPWININFOW = uintptr type LPHELPWININFOW = uintptr type HELPWININFO = HELPWININFOA type PHELPWININFO = PHELPWININFOA type LPHELPWININFO = LPHELPWININFOA type tagNONCLIENTMETRICSA = struct { FcbSize UINT FiBorderWidth int32 FiScrollWidth int32 FiScrollHeight int32 FiCaptionWidth int32 FiCaptionHeight int32 FlfCaptionFont LOGFONTA FiSmCaptionWidth int32 FiSmCaptionHeight int32 FlfSmCaptionFont LOGFONTA FiMenuWidth int32 FiMenuHeight int32 FlfMenuFont LOGFONTA FlfStatusFont LOGFONTA FlfMessageFont LOGFONTA } type NONCLIENTMETRICSA = tagNONCLIENTMETRICSA type PNONCLIENTMETRICSA = uintptr type LPNONCLIENTMETRICSA = uintptr type tagNONCLIENTMETRICSW = struct { FcbSize UINT FiBorderWidth int32 FiScrollWidth int32 FiScrollHeight int32 FiCaptionWidth int32 FiCaptionHeight int32 FlfCaptionFont LOGFONTW FiSmCaptionWidth int32 FiSmCaptionHeight int32 FlfSmCaptionFont LOGFONTW FiMenuWidth int32 FiMenuHeight int32 FlfMenuFont LOGFONTW FlfStatusFont LOGFONTW FlfMessageFont LOGFONTW } type NONCLIENTMETRICSW = tagNONCLIENTMETRICSW type PNONCLIENTMETRICSW = uintptr type LPNONCLIENTMETRICSW = uintptr type NONCLIENTMETRICS = NONCLIENTMETRICSA type PNONCLIENTMETRICS = PNONCLIENTMETRICSA type LPNONCLIENTMETRICS = LPNONCLIENTMETRICSA type tagMINIMIZEDMETRICS = struct { FcbSize UINT FiWidth int32 FiHorzGap int32 FiVertGap int32 FiArrange int32 } type MINIMIZEDMETRICS = tagMINIMIZEDMETRICS type PMINIMIZEDMETRICS = uintptr type LPMINIMIZEDMETRICS = uintptr type tagICONMETRICSA = struct { FcbSize UINT FiHorzSpacing int32 FiVertSpacing int32 FiTitleWrap int32 FlfFont LOGFONTA } type ICONMETRICSA = tagICONMETRICSA type PICONMETRICSA = uintptr type LPICONMETRICSA = uintptr type tagICONMETRICSW = struct { FcbSize UINT FiHorzSpacing int32 FiVertSpacing int32 FiTitleWrap int32 FlfFont LOGFONTW } type ICONMETRICSW = tagICONMETRICSW type PICONMETRICSW = uintptr type LPICONMETRICSW = uintptr type ICONMETRICS = ICONMETRICSA type PICONMETRICS = PICONMETRICSA type LPICONMETRICS = LPICONMETRICSA type tagANIMATIONINFO = struct { FcbSize UINT FiMinAnimate int32 } type ANIMATIONINFO = tagANIMATIONINFO type LPANIMATIONINFO = uintptr type tagSERIALKEYSA = struct { FcbSize UINT FdwFlags DWORD FlpszActivePort LPSTR FlpszPort LPSTR FiBaudRate UINT FiPortState UINT FiActive UINT F__ccgo_pad1 [4]byte } type SERIALKEYSA = tagSERIALKEYSA type LPSERIALKEYSA = uintptr type tagSERIALKEYSW = struct { FcbSize UINT FdwFlags DWORD FlpszActivePort LPWSTR FlpszPort LPWSTR FiBaudRate UINT FiPortState UINT FiActive UINT F__ccgo_pad1 [4]byte } type SERIALKEYSW = tagSERIALKEYSW type LPSERIALKEYSW = uintptr type SERIALKEYS = SERIALKEYSA type LPSERIALKEYS = LPSERIALKEYSA type tagHIGHCONTRASTA = struct { FcbSize UINT FdwFlags DWORD FlpszDefaultScheme LPSTR } type HIGHCONTRASTA = tagHIGHCONTRASTA type LPHIGHCONTRASTA = uintptr type tagHIGHCONTRASTW = struct { FcbSize UINT FdwFlags DWORD FlpszDefaultScheme LPWSTR } type HIGHCONTRASTW = tagHIGHCONTRASTW type LPHIGHCONTRASTW = uintptr type HIGHCONTRAST = HIGHCONTRASTA type LPHIGHCONTRAST = LPHIGHCONTRASTA type _VIDEOPARAMETERS = struct { FGuid GUID FdwOffset ULONG FdwCommand ULONG FdwFlags ULONG FdwMode ULONG FdwTVStandard ULONG FdwAvailableModes ULONG FdwAvailableTVStandard ULONG FdwFlickerFilter ULONG FdwOverScanX ULONG FdwOverScanY ULONG FdwMaxUnscaledX ULONG FdwMaxUnscaledY ULONG FdwPositionX ULONG FdwPositionY ULONG FdwBrightness ULONG FdwContrast ULONG FdwCPType ULONG FdwCPCommand ULONG FdwCPStandard ULONG FdwCPKey ULONG FbCP_APSTriggerBits ULONG FbOEMCopyProtection [256]UCHAR } type VIDEOPARAMETERS = _VIDEOPARAMETERS type PVIDEOPARAMETERS = uintptr type LPVIDEOPARAMETERS = uintptr type tagFILTERKEYS = struct { FcbSize UINT FdwFlags DWORD FiWaitMSec DWORD FiDelayMSec DWORD FiRepeatMSec DWORD FiBounceMSec DWORD } type FILTERKEYS = tagFILTERKEYS type LPFILTERKEYS = uintptr type tagSTICKYKEYS = struct { FcbSize UINT FdwFlags DWORD } type STICKYKEYS = tagSTICKYKEYS type LPSTICKYKEYS = uintptr type tagMOUSEKEYS = struct { FcbSize UINT FdwFlags DWORD FiMaxSpeed DWORD FiTimeToMaxSpeed DWORD FiCtrlSpeed DWORD FdwReserved1 DWORD FdwReserved2 DWORD } type MOUSEKEYS = tagMOUSEKEYS type LPMOUSEKEYS = uintptr type tagACCESSTIMEOUT = struct { FcbSize UINT FdwFlags DWORD FiTimeOutMSec DWORD } type ACCESSTIMEOUT = tagACCESSTIMEOUT type LPACCESSTIMEOUT = uintptr type tagSOUNDSENTRYA = struct { FcbSize UINT FdwFlags DWORD FiFSTextEffect DWORD FiFSTextEffectMSec DWORD FiFSTextEffectColorBits DWORD FiFSGrafEffect DWORD FiFSGrafEffectMSec DWORD FiFSGrafEffectColor DWORD FiWindowsEffect DWORD FiWindowsEffectMSec DWORD FlpszWindowsEffectDLL LPSTR FiWindowsEffectOrdinal DWORD F__ccgo_pad1 [4]byte } type SOUNDSENTRYA = tagSOUNDSENTRYA type LPSOUNDSENTRYA = uintptr type tagSOUNDSENTRYW = struct { FcbSize UINT FdwFlags DWORD FiFSTextEffect DWORD FiFSTextEffectMSec DWORD FiFSTextEffectColorBits DWORD FiFSGrafEffect DWORD FiFSGrafEffectMSec DWORD FiFSGrafEffectColor DWORD FiWindowsEffect DWORD FiWindowsEffectMSec DWORD FlpszWindowsEffectDLL LPWSTR FiWindowsEffectOrdinal DWORD F__ccgo_pad1 [4]byte } type SOUNDSENTRYW = tagSOUNDSENTRYW type LPSOUNDSENTRYW = uintptr type SOUNDSENTRY = SOUNDSENTRYA type LPSOUNDSENTRY = LPSOUNDSENTRYA type tagTOGGLEKEYS = struct { FcbSize UINT FdwFlags DWORD } type TOGGLEKEYS = tagTOGGLEKEYS type LPTOGGLEKEYS = uintptr type tagMONITORINFO = struct { FcbSize DWORD FrcMonitor RECT FrcWork RECT FdwFlags DWORD } type MONITORINFO = tagMONITORINFO type LPMONITORINFO = uintptr type tagMONITORINFOEXA = struct { F__0 struct { FcbSize DWORD FrcMonitor RECT FrcWork RECT FdwFlags DWORD } FszDevice [32]CHAR } type MONITORINFOEXA = tagMONITORINFOEXA type LPMONITORINFOEXA = uintptr type tagMONITORINFOEXW = struct { F__0 struct { FcbSize DWORD FrcMonitor RECT FrcWork RECT FdwFlags DWORD } FszDevice [32]WCHAR } type MONITORINFOEXW = tagMONITORINFOEXW type LPMONITORINFOEXW = uintptr type MONITORINFOEX = MONITORINFOEXA type LPMONITORINFOEX = LPMONITORINFOEXA type MONITORENUMPROC = uintptr type WINEVENTPROC = uintptr type tagGUITHREADINFO = struct { FcbSize DWORD Fflags DWORD FhwndActive HWND FhwndFocus HWND FhwndCapture HWND FhwndMenuOwner HWND FhwndMoveSize HWND FhwndCaret HWND FrcCaret RECT } type GUITHREADINFO = tagGUITHREADINFO type PGUITHREADINFO = uintptr type LPGUITHREADINFO = uintptr type tagCURSORINFO = struct { FcbSize DWORD Fflags DWORD FhCursor HCURSOR FptScreenPos POINT } type CURSORINFO = tagCURSORINFO type PCURSORINFO = uintptr type LPCURSORINFO = uintptr type tagWINDOWINFO = struct { FcbSize DWORD FrcWindow RECT FrcClient RECT FdwStyle DWORD FdwExStyle DWORD FdwWindowStatus DWORD FcxWindowBorders UINT FcyWindowBorders UINT FatomWindowType ATOM FwCreatorVersion WORD } type WINDOWINFO = tagWINDOWINFO type PWINDOWINFO = uintptr type LPWINDOWINFO = uintptr type tagTITLEBARINFO = struct { FcbSize DWORD FrcTitleBar RECT Frgstate [6]DWORD } type TITLEBARINFO = tagTITLEBARINFO type PTITLEBARINFO = uintptr type LPTITLEBARINFO = uintptr type tagMENUBARINFO = struct { FcbSize DWORD FrcBar RECT F__ccgo_pad1 [4]byte FhMenu HMENU FhwndMenu HWND FfBarFocused uint8 F__ccgo_pad2 [7]byte } type MENUBARINFO = tagMENUBARINFO type PMENUBARINFO = uintptr type LPMENUBARINFO = uintptr type tagSCROLLBARINFO = struct { FcbSize DWORD FrcScrollBar RECT FdxyLineButton int32 FxyThumbTop int32 FxyThumbBottom int32 Freserved int32 Frgstate [6]DWORD } type SCROLLBARINFO = tagSCROLLBARINFO type PSCROLLBARINFO = uintptr type LPSCROLLBARINFO = uintptr type tagCOMBOBOXINFO = struct { FcbSize DWORD FrcItem RECT FrcButton RECT FstateButton DWORD FhwndCombo HWND FhwndItem HWND FhwndList HWND } type COMBOBOXINFO = tagCOMBOBOXINFO type PCOMBOBOXINFO = uintptr type LPCOMBOBOXINFO = uintptr type tagALTTABINFO = struct { FcbSize DWORD FcItems int32 FcColumns int32 FcRows int32 FiColFocus int32 FiRowFocus int32 FcxItem int32 FcyItem int32 FptStart POINT } type ALTTABINFO = tagALTTABINFO type PALTTABINFO = uintptr type LPALTTABINFO = uintptr type HRAWINPUT__ = struct{ Funused int32 } type HRAWINPUT = uintptr type tagRAWINPUTHEADER = struct { FdwType DWORD FdwSize DWORD FhDevice HANDLE FwParam WPARAM } type RAWINPUTHEADER = tagRAWINPUTHEADER type PRAWINPUTHEADER = uintptr type LPRAWINPUTHEADER = uintptr type tagRAWMOUSE = struct { FusFlags USHORT F__ccgo_pad1 [2]byte F__4 struct{ FulButtons ULONG } FulRawButtons ULONG FlLastX LONG FlLastY LONG FulExtraInformation ULONG } type RAWMOUSE = tagRAWMOUSE type PRAWMOUSE = uintptr type LPRAWMOUSE = uintptr type tagRAWKEYBOARD = struct { FMakeCode USHORT FFlags USHORT FReserved USHORT FVKey USHORT FMessage UINT FExtraInformation ULONG } type RAWKEYBOARD = tagRAWKEYBOARD type PRAWKEYBOARD = uintptr type LPRAWKEYBOARD = uintptr type tagRAWHID = struct { FdwSizeHid DWORD FdwCount DWORD FbRawData [1]BYTE F__ccgo_pad1 [3]byte } type RAWHID = tagRAWHID type PRAWHID = uintptr type LPRAWHID = uintptr type tagRAWINPUT = struct { Fheader RAWINPUTHEADER Fdata struct{ Fmouse RAWMOUSE } } type RAWINPUT = tagRAWINPUT type PRAWINPUT = uintptr type LPRAWINPUT = uintptr type tagRID_DEVICE_INFO_MOUSE = struct { FdwId DWORD FdwNumberOfButtons DWORD FdwSampleRate DWORD FfHasHorizontalWheel WINBOOL } type RID_DEVICE_INFO_MOUSE = tagRID_DEVICE_INFO_MOUSE type PRID_DEVICE_INFO_MOUSE = uintptr type tagRID_DEVICE_INFO_KEYBOARD = struct { FdwType DWORD FdwSubType DWORD FdwKeyboardMode DWORD FdwNumberOfFunctionKeys DWORD FdwNumberOfIndicators DWORD FdwNumberOfKeysTotal DWORD } type RID_DEVICE_INFO_KEYBOARD = tagRID_DEVICE_INFO_KEYBOARD type PRID_DEVICE_INFO_KEYBOARD = uintptr type tagRID_DEVICE_INFO_HID = struct { FdwVendorId DWORD FdwProductId DWORD FdwVersionNumber DWORD FusUsagePage USHORT FusUsage USHORT } type RID_DEVICE_INFO_HID = tagRID_DEVICE_INFO_HID type PRID_DEVICE_INFO_HID = uintptr type tagRID_DEVICE_INFO = struct { FcbSize DWORD FdwType DWORD Fu struct { Fmouse RID_DEVICE_INFO_MOUSE F__ccgo_pad1 [8]byte } } type RID_DEVICE_INFO = tagRID_DEVICE_INFO type PRID_DEVICE_INFO = uintptr type LPRID_DEVICE_INFO = uintptr type tagRAWINPUTDEVICE = struct { FusUsagePage USHORT FusUsage USHORT FdwFlags DWORD FhwndTarget HWND } type RAWINPUTDEVICE = tagRAWINPUTDEVICE type PRAWINPUTDEVICE = uintptr type LPRAWINPUTDEVICE = uintptr type PCRAWINPUTDEVICE = uintptr type tagRAWINPUTDEVICELIST = struct { FhDevice HANDLE FdwType DWORD F__ccgo_pad1 [4]byte } type RAWINPUTDEVICELIST = tagRAWINPUTDEVICELIST type PRAWINPUTDEVICELIST = uintptr type LGRPID = DWORD type LCTYPE = DWORD type CALTYPE = DWORD type CALID = DWORD type _cpinfo = struct { FMaxCharSize UINT FDefaultChar [2]BYTE FLeadByte [12]BYTE F__ccgo_pad1 [2]byte } type CPINFO = _cpinfo type LPCPINFO = uintptr type _cpinfoexA = struct { FMaxCharSize UINT FDefaultChar [2]BYTE FLeadByte [12]BYTE FUnicodeDefaultChar WCHAR FCodePage UINT FCodePageName [260]CHAR } type CPINFOEXA = _cpinfoexA type LPCPINFOEXA = uintptr type _cpinfoexW = struct { FMaxCharSize UINT FDefaultChar [2]BYTE FLeadByte [12]BYTE FUnicodeDefaultChar WCHAR FCodePage UINT FCodePageName [260]WCHAR } type CPINFOEXW = _cpinfoexW type LPCPINFOEXW = uintptr type CPINFOEX = CPINFOEXA type LPCPINFOEX = LPCPINFOEXA type _numberfmtA = struct { FNumDigits UINT FLeadingZero UINT FGrouping UINT F__ccgo_pad1 [4]byte FlpDecimalSep LPSTR FlpThousandSep LPSTR FNegativeOrder UINT F__ccgo_pad2 [4]byte } type NUMBERFMTA = _numberfmtA type LPNUMBERFMTA = uintptr type _numberfmtW = struct { FNumDigits UINT FLeadingZero UINT FGrouping UINT F__ccgo_pad1 [4]byte FlpDecimalSep LPWSTR FlpThousandSep LPWSTR FNegativeOrder UINT F__ccgo_pad2 [4]byte } type NUMBERFMTW = _numberfmtW type LPNUMBERFMTW = uintptr type NUMBERFMT = NUMBERFMTA type LPNUMBERFMT = LPNUMBERFMTA type _currencyfmtA = struct { FNumDigits UINT FLeadingZero UINT FGrouping UINT F__ccgo_pad1 [4]byte FlpDecimalSep LPSTR FlpThousandSep LPSTR FNegativeOrder UINT FPositiveOrder UINT FlpCurrencySymbol LPSTR } type CURRENCYFMTA = _currencyfmtA type LPCURRENCYFMTA = uintptr type _currencyfmtW = struct { FNumDigits UINT FLeadingZero UINT FGrouping UINT F__ccgo_pad1 [4]byte FlpDecimalSep LPWSTR FlpThousandSep LPWSTR FNegativeOrder UINT FPositiveOrder UINT FlpCurrencySymbol LPWSTR } type CURRENCYFMTW = _currencyfmtW type LPCURRENCYFMTW = uintptr type CURRENCYFMT = CURRENCYFMTA type LPCURRENCYFMT = LPCURRENCYFMTA type NLS_FUNCTION = DWORD type _nlsversioninfo = struct { FdwNLSVersionInfoSize DWORD FdwNLSVersion DWORD FdwDefinedVersion DWORD } type NLSVERSIONINFO = _nlsversioninfo type LPNLSVERSIONINFO = uintptr type _nlsversioninfoex = struct { FdwNLSVersionInfoSize DWORD FdwNLSVersion DWORD FdwDefinedVersion DWORD FdwEffectiveId DWORD FguidCustomVersion GUID } type NLSVERSIONINFOEX = _nlsversioninfoex type LPNLSVERSIONINFOEX = uintptr type GEOID = LONG type GEOTYPE = DWORD type GEOCLASS = DWORD type LANGUAGEGROUP_ENUMPROCA = uintptr type LANGGROUPLOCALE_ENUMPROCA = uintptr type UILANGUAGE_ENUMPROCA = uintptr type CODEPAGE_ENUMPROCA = uintptr type DATEFMT_ENUMPROCA = uintptr type DATEFMT_ENUMPROCEXA = uintptr type TIMEFMT_ENUMPROCA = uintptr type CALINFO_ENUMPROCA = uintptr type CALINFO_ENUMPROCEXA = uintptr type LOCALE_ENUMPROCA = uintptr type LOCALE_ENUMPROCW = uintptr type LANGUAGEGROUP_ENUMPROCW = uintptr type LANGGROUPLOCALE_ENUMPROCW = uintptr type UILANGUAGE_ENUMPROCW = uintptr type CODEPAGE_ENUMPROCW = uintptr type DATEFMT_ENUMPROCW = uintptr type DATEFMT_ENUMPROCEXW = uintptr type TIMEFMT_ENUMPROCW = uintptr type CALINFO_ENUMPROCW = uintptr type CALINFO_ENUMPROCEXW = uintptr type GEO_ENUMPROC = uintptr type _FILEMUIINFO = struct { FdwSize DWORD FdwVersion DWORD FdwFileType DWORD FpChecksum [16]BYTE FpServiceChecksum [16]BYTE FdwLanguageNameOffset DWORD FdwTypeIDMainSize DWORD FdwTypeIDMainOffset DWORD FdwTypeNameMainOffset DWORD FdwTypeIDMUISize DWORD FdwTypeIDMUIOffset DWORD FdwTypeNameMUIOffset DWORD FabBuffer [8]BYTE } type FILEMUIINFO = _FILEMUIINFO type PFILEMUIINFO = uintptr type _COORD = struct { FX SHORT FY SHORT } type COORD = _COORD type PCOORD = uintptr type _SMALL_RECT = struct { FLeft SHORT FTop SHORT FRight SHORT FBottom SHORT } type SMALL_RECT = _SMALL_RECT type PSMALL_RECT = uintptr type _KEY_EVENT_RECORD = struct { FbKeyDown WINBOOL FwRepeatCount WORD FwVirtualKeyCode WORD FwVirtualScanCode WORD FuChar struct{ FUnicodeChar WCHAR } FdwControlKeyState DWORD } type KEY_EVENT_RECORD = _KEY_EVENT_RECORD type PKEY_EVENT_RECORD = uintptr type _MOUSE_EVENT_RECORD = struct { FdwMousePosition COORD FdwButtonState DWORD FdwControlKeyState DWORD FdwEventFlags DWORD } type MOUSE_EVENT_RECORD = _MOUSE_EVENT_RECORD type PMOUSE_EVENT_RECORD = uintptr type _WINDOW_BUFFER_SIZE_RECORD = struct{ FdwSize COORD } type WINDOW_BUFFER_SIZE_RECORD = _WINDOW_BUFFER_SIZE_RECORD type PWINDOW_BUFFER_SIZE_RECORD = uintptr type _MENU_EVENT_RECORD = struct{ FdwCommandId UINT } type MENU_EVENT_RECORD = _MENU_EVENT_RECORD type PMENU_EVENT_RECORD = uintptr type _FOCUS_EVENT_RECORD = struct{ FbSetFocus WINBOOL } type FOCUS_EVENT_RECORD = _FOCUS_EVENT_RECORD type PFOCUS_EVENT_RECORD = uintptr type _INPUT_RECORD = struct { FEventType WORD F__ccgo_pad1 [2]byte FEvent struct{ FKeyEvent KEY_EVENT_RECORD } } type INPUT_RECORD = _INPUT_RECORD type PINPUT_RECORD = uintptr type _CHAR_INFO = struct { FChar struct{ FUnicodeChar WCHAR } FAttributes WORD } type CHAR_INFO = _CHAR_INFO type PCHAR_INFO = uintptr type _CONSOLE_SCREEN_BUFFER_INFO = struct { FdwSize COORD FdwCursorPosition COORD FwAttributes WORD FsrWindow SMALL_RECT FdwMaximumWindowSize COORD } type CONSOLE_SCREEN_BUFFER_INFO = _CONSOLE_SCREEN_BUFFER_INFO type PCONSOLE_SCREEN_BUFFER_INFO = uintptr type _CONSOLE_CURSOR_INFO = struct { FdwSize DWORD FbVisible WINBOOL } type CONSOLE_CURSOR_INFO = _CONSOLE_CURSOR_INFO type PCONSOLE_CURSOR_INFO = uintptr type _CONSOLE_FONT_INFO = struct { FnFont DWORD FdwFontSize COORD } type CONSOLE_FONT_INFO = _CONSOLE_FONT_INFO type PCONSOLE_FONT_INFO = uintptr type _CONSOLE_SELECTION_INFO = struct { FdwFlags DWORD FdwSelectionAnchor COORD FsrSelection SMALL_RECT } type CONSOLE_SELECTION_INFO = _CONSOLE_SELECTION_INFO type PCONSOLE_SELECTION_INFO = uintptr type PHANDLER_ROUTINE = uintptr type _CONSOLE_FONT_INFOEX = struct { FcbSize ULONG FnFont DWORD FdwFontSize COORD FFontFamily UINT FFontWeight UINT FFaceName [32]WCHAR } type CONSOLE_FONT_INFOEX = _CONSOLE_FONT_INFOEX type PCONSOLE_FONT_INFOEX = uintptr type _CONSOLE_HISTORY_INFO = struct { FcbSize UINT FHistoryBufferSize UINT FNumberOfHistoryBuffers UINT FdwFlags DWORD } type CONSOLE_HISTORY_INFO = _CONSOLE_HISTORY_INFO type PCONSOLE_HISTORY_INFO = uintptr type _CONSOLE_READCONSOLE_CONTROL = struct { FnLength ULONG FnInitialChars ULONG FdwCtrlWakeupMask ULONG FdwControlKeyState ULONG } type CONSOLE_READCONSOLE_CONTROL = _CONSOLE_READCONSOLE_CONTROL type PCONSOLE_READCONSOLE_CONTROL = uintptr type _CONSOLE_SCREEN_BUFFER_INFOEX = struct { FcbSize ULONG FdwSize COORD FdwCursorPosition COORD FwAttributes WORD FsrWindow SMALL_RECT FdwMaximumWindowSize COORD FwPopupAttributes WORD FbFullscreenSupported WINBOOL FColorTable [16]COLORREF } type CONSOLE_SCREEN_BUFFER_INFOEX = _CONSOLE_SCREEN_BUFFER_INFOEX type PCONSOLE_SCREEN_BUFFER_INFOEX = uintptr type tagVS_FIXEDFILEINFO = struct { FdwSignature DWORD FdwStrucVersion DWORD FdwFileVersionMS DWORD FdwFileVersionLS DWORD FdwProductVersionMS DWORD FdwProductVersionLS DWORD FdwFileFlagsMask DWORD FdwFileFlags DWORD FdwFileOS DWORD FdwFileType DWORD FdwFileSubtype DWORD FdwFileDateMS DWORD FdwFileDateLS DWORD } type VS_FIXEDFILEINFO = tagVS_FIXEDFILEINFO type REGSAM = ACCESS_MASK type LSTATUS = LONG type val_context = struct { Fvaluelen int32 F__ccgo_pad1 [4]byte Fvalue_context LPVOID Fval_buff_ptr LPVOID } type PVALCONTEXT = uintptr type pvalueA = struct { Fpv_valuename LPSTR Fpv_valuelen int32 F__ccgo_pad1 [4]byte Fpv_value_context LPVOID Fpv_type DWORD F__ccgo_pad2 [4]byte } type PVALUEA = pvalueA type PPVALUEA = uintptr type pvalueW = struct { Fpv_valuename LPWSTR Fpv_valuelen int32 F__ccgo_pad1 [4]byte Fpv_value_context LPVOID Fpv_type DWORD F__ccgo_pad2 [4]byte } type PVALUEW = pvalueW type PPVALUEW = uintptr type PVALUE = PVALUEA type PPVALUE = PPVALUEA type PQUERYHANDLER = uintptr type provider_info = struct { Fpi_R0_1val PQUERYHANDLER Fpi_R0_allvals PQUERYHANDLER Fpi_R3_1val PQUERYHANDLER Fpi_R3_allvals PQUERYHANDLER Fpi_flags DWORD F__ccgo_pad1 [4]byte Fpi_key_context LPVOID } type REG_PROVIDER = provider_info type PPROVIDER = uintptr type value_entA = struct { Fve_valuename LPSTR Fve_valuelen DWORD F__ccgo_pad1 [4]byte Fve_valueptr DWORD_PTR Fve_type DWORD F__ccgo_pad2 [4]byte } type VALENTA = value_entA type PVALENTA = uintptr type value_entW = struct { Fve_valuename LPWSTR Fve_valuelen DWORD F__ccgo_pad1 [4]byte Fve_valueptr DWORD_PTR Fve_type DWORD F__ccgo_pad2 [4]byte } type VALENTW = value_entW type PVALENTW = uintptr type VALENT = VALENTA type PVALENT = PVALENTA type _NETRESOURCEA = struct { FdwScope DWORD FdwType DWORD FdwDisplayType DWORD FdwUsage DWORD FlpLocalName LPSTR FlpRemoteName LPSTR FlpComment LPSTR FlpProvider LPSTR } type NETRESOURCEA = _NETRESOURCEA type LPNETRESOURCEA = uintptr type _NETRESOURCEW = struct { FdwScope DWORD FdwType DWORD FdwDisplayType DWORD FdwUsage DWORD FlpLocalName LPWSTR FlpRemoteName LPWSTR FlpComment LPWSTR FlpProvider LPWSTR } type NETRESOURCEW = _NETRESOURCEW type LPNETRESOURCEW = uintptr type NETRESOURCE = NETRESOURCEA type LPNETRESOURCE = LPNETRESOURCEA type _CONNECTDLGSTRUCTA = struct { FcbStructure DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FlpConnRes LPNETRESOURCEA FdwFlags DWORD FdwDevNum DWORD } type CONNECTDLGSTRUCTA = _CONNECTDLGSTRUCTA type LPCONNECTDLGSTRUCTA = uintptr type _CONNECTDLGSTRUCTW = struct { FcbStructure DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FlpConnRes LPNETRESOURCEW FdwFlags DWORD FdwDevNum DWORD } type CONNECTDLGSTRUCTW = _CONNECTDLGSTRUCTW type LPCONNECTDLGSTRUCTW = uintptr type CONNECTDLGSTRUCT = CONNECTDLGSTRUCTA type LPCONNECTDLGSTRUCT = LPCONNECTDLGSTRUCTA type _DISCDLGSTRUCTA = struct { FcbStructure DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FlpLocalName LPSTR FlpRemoteName LPSTR FdwFlags DWORD F__ccgo_pad2 [4]byte } type DISCDLGSTRUCTA = _DISCDLGSTRUCTA type LPDISCDLGSTRUCTA = uintptr type _DISCDLGSTRUCTW = struct { FcbStructure DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FlpLocalName LPWSTR FlpRemoteName LPWSTR FdwFlags DWORD F__ccgo_pad2 [4]byte } type DISCDLGSTRUCTW = _DISCDLGSTRUCTW type LPDISCDLGSTRUCTW = uintptr type DISCDLGSTRUCT = DISCDLGSTRUCTA type LPDISCDLGSTRUCT = LPDISCDLGSTRUCTA type _UNIVERSAL_NAME_INFOA = struct{ FlpUniversalName LPSTR } type UNIVERSAL_NAME_INFOA = _UNIVERSAL_NAME_INFOA type LPUNIVERSAL_NAME_INFOA = uintptr type _UNIVERSAL_NAME_INFOW = struct{ FlpUniversalName LPWSTR } type UNIVERSAL_NAME_INFOW = _UNIVERSAL_NAME_INFOW type LPUNIVERSAL_NAME_INFOW = uintptr type UNIVERSAL_NAME_INFO = UNIVERSAL_NAME_INFOA type LPUNIVERSAL_NAME_INFO = LPUNIVERSAL_NAME_INFOA type _REMOTE_NAME_INFOA = struct { FlpUniversalName LPSTR FlpConnectionName LPSTR FlpRemainingPath LPSTR } type REMOTE_NAME_INFOA = _REMOTE_NAME_INFOA type LPREMOTE_NAME_INFOA = uintptr type _REMOTE_NAME_INFOW = struct { FlpUniversalName LPWSTR FlpConnectionName LPWSTR FlpRemainingPath LPWSTR } type REMOTE_NAME_INFOW = _REMOTE_NAME_INFOW type LPREMOTE_NAME_INFOW = uintptr type REMOTE_NAME_INFO = REMOTE_NAME_INFOA type LPREMOTE_NAME_INFO = LPREMOTE_NAME_INFOA type _NETINFOSTRUCT = struct { FcbStructure DWORD FdwProviderVersion DWORD FdwStatus DWORD FdwCharacteristics DWORD FdwHandle ULONG_PTR FwNetType WORD F__ccgo_pad1 [2]byte FdwPrinters DWORD FdwDrives DWORD F__ccgo_pad2 [4]byte } type NETINFOSTRUCT = _NETINFOSTRUCT type LPNETINFOSTRUCT = uintptr type PFNGETPROFILEPATHA = uintptr type PFNGETPROFILEPATHW = uintptr type PFNRECONCILEPROFILEA = uintptr type PFNRECONCILEPROFILEW = uintptr type PFNPROCESSPOLICIESA = uintptr type PFNPROCESSPOLICIESW = uintptr type _NETCONNECTINFOSTRUCT = struct { FcbStructure DWORD FdwFlags DWORD FdwSpeed DWORD FdwDelay DWORD FdwOptDataSize DWORD } type NETCONNECTINFOSTRUCT = _NETCONNECTINFOSTRUCT type LPNETCONNECTINFOSTRUCT = uintptr type DDEACK = struct { F__ccgo_pad1 [0]uint16 FbAppReturnCode uint16 } type DDEADVISE = struct { Freserved uint16 F__ccgo_pad1 [2]byte FcfFormat int16 } type DDEDATA = struct { Funused uint16 F__ccgo_pad1 [2]byte FcfFormat int16 FValue [1]BYTE F__ccgo_pad2 [1]byte } type DDEPOKE = struct { Funused uint16 F__ccgo_pad1 [2]byte FcfFormat int16 FValue [1]BYTE F__ccgo_pad2 [1]byte } type DDELN = struct { Funused uint16 F__ccgo_pad1 [2]byte FcfFormat int16 } type DDEUP = struct { Funused uint16 F__ccgo_pad1 [2]byte FcfFormat int16 Frgb [1]BYTE F__ccgo_pad2 [1]byte } type HCONVLIST__ = struct{ Funused int32 } type HCONVLIST = uintptr type HCONV__ = struct{ Funused int32 } type HCONV = uintptr type HSZ__ = struct{ Funused int32 } type HSZ = uintptr type HDDEDATA__ = struct{ Funused int32 } type HDDEDATA = uintptr type tagHSZPAIR = struct { FhszSvc HSZ FhszTopic HSZ } type HSZPAIR = tagHSZPAIR type PHSZPAIR = uintptr type tagCONVCONTEXT = struct { Fcb UINT FwFlags UINT FwCountryID UINT FiCodePage int32 FdwLangID DWORD FdwSecurity DWORD Fqos SECURITY_QUALITY_OF_SERVICE } type CONVCONTEXT = tagCONVCONTEXT type PCONVCONTEXT = uintptr type tagCONVINFO = struct { Fcb DWORD F__ccgo_pad1 [4]byte FhUser DWORD_PTR FhConvPartner HCONV FhszSvcPartner HSZ FhszServiceReq HSZ FhszTopic HSZ FhszItem HSZ FwFmt UINT FwType UINT FwStatus UINT FwConvst UINT FwLastError UINT F__ccgo_pad2 [4]byte FhConvList HCONVLIST FConvCtxt CONVCONTEXT F__ccgo_pad3 [4]byte Fhwnd HWND FhwndPartner HWND } type CONVINFO = tagCONVINFO type PCONVINFO = uintptr type PFNCALLBACK = uintptr type tagDDEML_MSG_HOOK_DATA = struct { FuiLo UINT_PTR FuiHi UINT_PTR FcbData DWORD FData [8]DWORD F__ccgo_pad1 [4]byte } type DDEML_MSG_HOOK_DATA = tagDDEML_MSG_HOOK_DATA type PDDEML_MSG_HOOK_DATA = uintptr type tagMONMSGSTRUCT = struct { Fcb UINT F__ccgo_pad1 [4]byte FhwndTo HWND FdwTime DWORD F__ccgo_pad2 [4]byte FhTask HANDLE FwMsg UINT F__ccgo_pad3 [4]byte FwParam WPARAM FlParam LPARAM Fdmhd DDEML_MSG_HOOK_DATA } type MONMSGSTRUCT = tagMONMSGSTRUCT type PMONMSGSTRUCT = uintptr type tagMONCBSTRUCT = struct { Fcb UINT FdwTime DWORD FhTask HANDLE FdwRet DWORD FwType UINT FwFmt UINT F__ccgo_pad1 [4]byte FhConv HCONV Fhsz1 HSZ Fhsz2 HSZ FhData HDDEDATA FdwData1 ULONG_PTR FdwData2 ULONG_PTR Fcc CONVCONTEXT FcbData DWORD FData [8]DWORD } type MONCBSTRUCT = tagMONCBSTRUCT type PMONCBSTRUCT = uintptr type tagMONHSZSTRUCTA = struct { Fcb UINT FfsAction WINBOOL FdwTime DWORD F__ccgo_pad1 [4]byte Fhsz HSZ FhTask HANDLE Fstr [1]CHAR F__ccgo_pad2 [7]byte } type MONHSZSTRUCTA = tagMONHSZSTRUCTA type PMONHSZSTRUCTA = uintptr type tagMONHSZSTRUCTW = struct { Fcb UINT FfsAction WINBOOL FdwTime DWORD F__ccgo_pad1 [4]byte Fhsz HSZ FhTask HANDLE Fstr [1]WCHAR F__ccgo_pad2 [6]byte } type MONHSZSTRUCTW = tagMONHSZSTRUCTW type PMONHSZSTRUCTW = uintptr type MONHSZSTRUCT = MONHSZSTRUCTA type PMONHSZSTRUCT = PMONHSZSTRUCTA type tagMONERRSTRUCT = struct { Fcb UINT FwLastError UINT FdwTime DWORD F__ccgo_pad1 [4]byte FhTask HANDLE } type MONERRSTRUCT = tagMONERRSTRUCT type PMONERRSTRUCT = uintptr type tagMONLINKSTRUCT = struct { Fcb UINT FdwTime DWORD FhTask HANDLE FfEstablished WINBOOL FfNoData WINBOOL FhszSvc HSZ FhszTopic HSZ FhszItem HSZ FwFmt UINT FfServer WINBOOL FhConvServer HCONV FhConvClient HCONV } type MONLINKSTRUCT = tagMONLINKSTRUCT type PMONLINKSTRUCT = uintptr type tagMONCONVSTRUCT = struct { Fcb UINT FfConnect WINBOOL FdwTime DWORD F__ccgo_pad1 [4]byte FhTask HANDLE FhszSvc HSZ FhszTopic HSZ FhConvClient HCONV FhConvServer HCONV } type MONCONVSTRUCT = tagMONCONVSTRUCT type PMONCONVSTRUCT = uintptr type tagCRGB = struct { FbRed BYTE FbGreen BYTE FbBlue BYTE FbExtra BYTE } type CRGB = tagCRGB type MMVERSION = UINT type MMRESULT = UINT type LPUINT = uintptr type mmtime_tag = struct { FwType UINT Fu struct { Fms DWORD F__ccgo_pad1 [4]byte } } type MMTIME = mmtime_tag type PMMTIME = uintptr type NPMMTIME = uintptr type LPMMTIME = uintptr type HDRVR__ = struct{ Funused int32 } type HDRVR = uintptr type DRVCONFIGINFOEX1 = struct { FdwDCISize DWORD F__ccgo_pad1 [4]byte FlpszDCISectionName LPCWSTR FlpszDCIAliasName LPCWSTR FdnDevNode DWORD F__ccgo_pad2 [4]byte } type DRVCONFIGINFOEX = DRVCONFIGINFOEX1 type PDRVCONFIGINFOEX = uintptr type NPDRVCONFIGINFOEX = uintptr type LPDRVCONFIGINFOEX = uintptr type tagDRVCONFIGINFO = struct { FdwDCISize DWORD F__ccgo_pad1 [4]byte FlpszDCISectionName LPCWSTR FlpszDCIAliasName LPCWSTR } type DRVCONFIGINFO = tagDRVCONFIGINFO type PDRVCONFIGINFO = uintptr type NPDRVCONFIGINFO = uintptr type LPDRVCONFIGINFO = uintptr type DRIVERPROC = uintptr type LPDRVCALLBACK = uintptr type PDRVCALLBACK = uintptr type HWAVE__ = struct{ Funused int32 } type HWAVE = uintptr type HWAVEIN__ = struct{ Funused int32 } type HWAVEIN = uintptr type HWAVEOUT__ = struct{ Funused int32 } type HWAVEOUT = uintptr type LPHWAVEIN = uintptr type LPHWAVEOUT = uintptr type LPWAVECALLBACK = uintptr type wavehdr_tag = struct { FlpData LPSTR FdwBufferLength DWORD FdwBytesRecorded DWORD FdwUser DWORD_PTR FdwFlags DWORD FdwLoops DWORD FlpNext uintptr Freserved DWORD_PTR } type WAVEHDR = wavehdr_tag type PWAVEHDR = uintptr type NPWAVEHDR = uintptr type LPWAVEHDR = uintptr type tagWAVEOUTCAPSA = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD FdwSupport DWORD } type WAVEOUTCAPSA = tagWAVEOUTCAPSA type PWAVEOUTCAPSA = uintptr type NPWAVEOUTCAPSA = uintptr type LPWAVEOUTCAPSA = uintptr type tagWAVEOUTCAPSW = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD FdwSupport DWORD } type WAVEOUTCAPSW = tagWAVEOUTCAPSW type PWAVEOUTCAPSW = uintptr type NPWAVEOUTCAPSW = uintptr type LPWAVEOUTCAPSW = uintptr type WAVEOUTCAPS = WAVEOUTCAPSA type PWAVEOUTCAPS = PWAVEOUTCAPSA type NPWAVEOUTCAPS = NPWAVEOUTCAPSA type LPWAVEOUTCAPS = LPWAVEOUTCAPSA type tagWAVEOUTCAPS2A = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type WAVEOUTCAPS2A = tagWAVEOUTCAPS2A type PWAVEOUTCAPS2A = uintptr type NPWAVEOUTCAPS2A = uintptr type LPWAVEOUTCAPS2A = uintptr type tagWAVEOUTCAPS2W = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type WAVEOUTCAPS2W = tagWAVEOUTCAPS2W type PWAVEOUTCAPS2W = uintptr type NPWAVEOUTCAPS2W = uintptr type LPWAVEOUTCAPS2W = uintptr type WAVEOUTCAPS2 = WAVEOUTCAPS2A type PWAVEOUTCAPS2 = PWAVEOUTCAPS2A type NPWAVEOUTCAPS2 = NPWAVEOUTCAPS2A type LPWAVEOUTCAPS2 = LPWAVEOUTCAPS2A type tagWAVEINCAPSA = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD } type WAVEINCAPSA = tagWAVEINCAPSA type PWAVEINCAPSA = uintptr type NPWAVEINCAPSA = uintptr type LPWAVEINCAPSA = uintptr type tagWAVEINCAPSW = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD } type WAVEINCAPSW = tagWAVEINCAPSW type PWAVEINCAPSW = uintptr type NPWAVEINCAPSW = uintptr type LPWAVEINCAPSW = uintptr type WAVEINCAPS = WAVEINCAPSA type PWAVEINCAPS = PWAVEINCAPSA type NPWAVEINCAPS = NPWAVEINCAPSA type LPWAVEINCAPS = LPWAVEINCAPSA type tagWAVEINCAPS2A = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type WAVEINCAPS2A = tagWAVEINCAPS2A type PWAVEINCAPS2A = uintptr type NPWAVEINCAPS2A = uintptr type LPWAVEINCAPS2A = uintptr type tagWAVEINCAPS2W = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FdwFormats DWORD FwChannels WORD FwReserved1 WORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type WAVEINCAPS2W = tagWAVEINCAPS2W type PWAVEINCAPS2W = uintptr type NPWAVEINCAPS2W = uintptr type LPWAVEINCAPS2W = uintptr type WAVEINCAPS2 = WAVEINCAPS2A type PWAVEINCAPS2 = PWAVEINCAPS2A type NPWAVEINCAPS2 = NPWAVEINCAPS2A type LPWAVEINCAPS2 = LPWAVEINCAPS2A type waveformat_tag = struct { FwFormatTag WORD FnChannels WORD FnSamplesPerSec DWORD FnAvgBytesPerSec DWORD FnBlockAlign WORD F__ccgo_pad1 [2]byte } type WAVEFORMAT = waveformat_tag type PWAVEFORMAT = uintptr type NPWAVEFORMAT = uintptr type LPWAVEFORMAT = uintptr type pcmwaveformat_tag = struct { Fwf WAVEFORMAT FwBitsPerSample WORD F__ccgo_pad1 [2]byte } type PCMWAVEFORMAT = pcmwaveformat_tag type PPCMWAVEFORMAT = uintptr type NPPCMWAVEFORMAT = uintptr type LPPCMWAVEFORMAT = uintptr type tWAVEFORMATEX = struct { FwFormatTag WORD FnChannels WORD FnSamplesPerSec DWORD FnAvgBytesPerSec DWORD FnBlockAlign WORD FwBitsPerSample WORD FcbSize WORD F__ccgo_pad1 [2]byte } type WAVEFORMATEX = tWAVEFORMATEX type PWAVEFORMATEX = uintptr type NPWAVEFORMATEX = uintptr type LPWAVEFORMATEX = uintptr type LPCWAVEFORMATEX = uintptr type HMIDI__ = struct{ Funused int32 } type HMIDI = uintptr type HMIDIIN__ = struct{ Funused int32 } type HMIDIIN = uintptr type HMIDIOUT__ = struct{ Funused int32 } type HMIDIOUT = uintptr type HMIDISTRM__ = struct{ Funused int32 } type HMIDISTRM = uintptr type LPHMIDI = uintptr type LPHMIDIIN = uintptr type LPHMIDIOUT = uintptr type LPHMIDISTRM = uintptr type LPMIDICALLBACK = uintptr type PATCHARRAY = [128]WORD type LPPATCHARRAY = uintptr type KEYARRAY = [128]WORD type LPKEYARRAY = uintptr type tagMIDIOUTCAPSA = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FwTechnology WORD FwVoices WORD FwNotes WORD FwChannelMask WORD FdwSupport DWORD } type MIDIOUTCAPSA = tagMIDIOUTCAPSA type PMIDIOUTCAPSA = uintptr type NPMIDIOUTCAPSA = uintptr type LPMIDIOUTCAPSA = uintptr type tagMIDIOUTCAPSW = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FwTechnology WORD FwVoices WORD FwNotes WORD FwChannelMask WORD FdwSupport DWORD } type MIDIOUTCAPSW = tagMIDIOUTCAPSW type PMIDIOUTCAPSW = uintptr type NPMIDIOUTCAPSW = uintptr type LPMIDIOUTCAPSW = uintptr type MIDIOUTCAPS = MIDIOUTCAPSA type PMIDIOUTCAPS = PMIDIOUTCAPSA type NPMIDIOUTCAPS = NPMIDIOUTCAPSA type LPMIDIOUTCAPS = LPMIDIOUTCAPSA type tagMIDIOUTCAPS2A = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FwTechnology WORD FwVoices WORD FwNotes WORD FwChannelMask WORD FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type MIDIOUTCAPS2A = tagMIDIOUTCAPS2A type PMIDIOUTCAPS2A = uintptr type NPMIDIOUTCAPS2A = uintptr type LPMIDIOUTCAPS2A = uintptr type tagMIDIOUTCAPS2W = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FwTechnology WORD FwVoices WORD FwNotes WORD FwChannelMask WORD FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type MIDIOUTCAPS2W = tagMIDIOUTCAPS2W type PMIDIOUTCAPS2W = uintptr type NPMIDIOUTCAPS2W = uintptr type LPMIDIOUTCAPS2W = uintptr type MIDIOUTCAPS2 = MIDIOUTCAPS2A type PMIDIOUTCAPS2 = PMIDIOUTCAPS2A type NPMIDIOUTCAPS2 = NPMIDIOUTCAPS2A type LPMIDIOUTCAPS2 = LPMIDIOUTCAPS2A type tagMIDIINCAPSA = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FdwSupport DWORD } type MIDIINCAPSA = tagMIDIINCAPSA type PMIDIINCAPSA = uintptr type NPMIDIINCAPSA = uintptr type LPMIDIINCAPSA = uintptr type tagMIDIINCAPSW = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FdwSupport DWORD } type MIDIINCAPSW = tagMIDIINCAPSW type PMIDIINCAPSW = uintptr type NPMIDIINCAPSW = uintptr type LPMIDIINCAPSW = uintptr type MIDIINCAPS = MIDIINCAPSA type PMIDIINCAPS = PMIDIINCAPSA type NPMIDIINCAPS = NPMIDIINCAPSA type LPMIDIINCAPS = LPMIDIINCAPSA type tagMIDIINCAPS2A = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type MIDIINCAPS2A = tagMIDIINCAPS2A type PMIDIINCAPS2A = uintptr type NPMIDIINCAPS2A = uintptr type LPMIDIINCAPS2A = uintptr type tagMIDIINCAPS2W = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type MIDIINCAPS2W = tagMIDIINCAPS2W type PMIDIINCAPS2W = uintptr type NPMIDIINCAPS2W = uintptr type LPMIDIINCAPS2W = uintptr type MIDIINCAPS2 = MIDIINCAPS2A type PMIDIINCAPS2 = PMIDIINCAPS2A type NPMIDIINCAPS2 = NPMIDIINCAPS2A type LPMIDIINCAPS2 = LPMIDIINCAPS2A type midihdr_tag = struct { FlpData LPSTR FdwBufferLength DWORD FdwBytesRecorded DWORD FdwUser DWORD_PTR FdwFlags DWORD F__ccgo_pad1 [4]byte FlpNext uintptr Freserved DWORD_PTR FdwOffset DWORD F__ccgo_pad2 [4]byte FdwReserved [8]DWORD_PTR } type MIDIHDR = midihdr_tag type PMIDIHDR = uintptr type NPMIDIHDR = uintptr type LPMIDIHDR = uintptr type midievent_tag = struct { FdwDeltaTime DWORD FdwStreamID DWORD FdwEvent DWORD FdwParms [1]DWORD } type MIDIEVENT = midievent_tag type midistrmbuffver_tag = struct { FdwVersion DWORD FdwMid DWORD FdwOEMVersion DWORD } type MIDISTRMBUFFVER = midistrmbuffver_tag type midiproptimediv_tag = struct { FcbStruct DWORD FdwTimeDiv DWORD } type MIDIPROPTIMEDIV = midiproptimediv_tag type LPMIDIPROPTIMEDIV = uintptr type midiproptempo_tag = struct { FcbStruct DWORD FdwTempo DWORD } type MIDIPROPTEMPO = midiproptempo_tag type LPMIDIPROPTEMPO = uintptr type tagAUXCAPSA = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FwTechnology WORD FwReserved1 WORD FdwSupport DWORD } type AUXCAPSA = tagAUXCAPSA type PAUXCAPSA = uintptr type NPAUXCAPSA = uintptr type LPAUXCAPSA = uintptr type tagAUXCAPSW = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FwTechnology WORD FwReserved1 WORD FdwSupport DWORD } type AUXCAPSW = tagAUXCAPSW type PAUXCAPSW = uintptr type NPAUXCAPSW = uintptr type LPAUXCAPSW = uintptr type AUXCAPS = AUXCAPSA type PAUXCAPS = PAUXCAPSA type NPAUXCAPS = NPAUXCAPSA type LPAUXCAPS = LPAUXCAPSA type tagAUXCAPS2A = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FwTechnology WORD FwReserved1 WORD FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type AUXCAPS2A = tagAUXCAPS2A type PAUXCAPS2A = uintptr type NPAUXCAPS2A = uintptr type LPAUXCAPS2A = uintptr type tagAUXCAPS2W = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FwTechnology WORD FwReserved1 WORD FdwSupport DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type AUXCAPS2W = tagAUXCAPS2W type PAUXCAPS2W = uintptr type NPAUXCAPS2W = uintptr type LPAUXCAPS2W = uintptr type AUXCAPS2 = AUXCAPS2A type PAUXCAPS2 = PAUXCAPS2A type NPAUXCAPS2 = NPAUXCAPS2A type LPAUXCAPS2 = LPAUXCAPS2A type HMIXEROBJ__ = struct{ Funused int32 } type HMIXEROBJ = uintptr type LPHMIXEROBJ = uintptr type HMIXER__ = struct{ Funused int32 } type HMIXER = uintptr type LPHMIXER = uintptr type tagMIXERCAPSA = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FfdwSupport DWORD FcDestinations DWORD } type MIXERCAPSA = tagMIXERCAPSA type PMIXERCAPSA = uintptr type LPMIXERCAPSA = uintptr type tagMIXERCAPSW = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FfdwSupport DWORD FcDestinations DWORD } type MIXERCAPSW = tagMIXERCAPSW type PMIXERCAPSW = uintptr type LPMIXERCAPSW = uintptr type MIXERCAPS = MIXERCAPSA type PMIXERCAPS = PMIXERCAPSA type LPMIXERCAPS = LPMIXERCAPSA type tagMIXERCAPS2A = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR FfdwSupport DWORD FcDestinations DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type MIXERCAPS2A = tagMIXERCAPS2A type PMIXERCAPS2A = uintptr type LPMIXERCAPS2A = uintptr type tagMIXERCAPS2W = struct { FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR FfdwSupport DWORD FcDestinations DWORD FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type MIXERCAPS2W = tagMIXERCAPS2W type PMIXERCAPS2W = uintptr type LPMIXERCAPS2W = uintptr type MIXERCAPS2 = MIXERCAPS2A type PMIXERCAPS2 = PMIXERCAPS2A type LPMIXERCAPS2 = LPMIXERCAPS2A type tagMIXERLINEA = struct { FcbStruct DWORD FdwDestination DWORD FdwSource DWORD FdwLineID DWORD FfdwLine DWORD F__ccgo_pad1 [4]byte FdwUser DWORD_PTR FdwComponentType DWORD FcChannels DWORD FcConnections DWORD FcControls DWORD FszShortName [16]CHAR FszName [64]CHAR FTarget struct { FdwType DWORD FdwDeviceID DWORD FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]CHAR } } type MIXERLINEA = tagMIXERLINEA type PMIXERLINEA = uintptr type LPMIXERLINEA = uintptr type tagMIXERLINEW = struct { FcbStruct DWORD FdwDestination DWORD FdwSource DWORD FdwLineID DWORD FfdwLine DWORD F__ccgo_pad1 [4]byte FdwUser DWORD_PTR FdwComponentType DWORD FcChannels DWORD FcConnections DWORD FcControls DWORD FszShortName [16]WCHAR FszName [64]WCHAR FTarget struct { FdwType DWORD FdwDeviceID DWORD FwMid WORD FwPid WORD FvDriverVersion MMVERSION FszPname [32]WCHAR } } type MIXERLINEW = tagMIXERLINEW type PMIXERLINEW = uintptr type LPMIXERLINEW = uintptr type MIXERLINE = MIXERLINEA type PMIXERLINE = PMIXERLINEA type LPMIXERLINE = LPMIXERLINEA type tagMIXERCONTROLA = struct { FcbStruct DWORD FdwControlID DWORD FdwControlType DWORD FfdwControl DWORD FcMultipleItems DWORD FszShortName [16]CHAR FszName [64]CHAR FBounds struct { Fs struct { FlMinimum LONG FlMaximum LONG } F__ccgo_pad1 [16]byte } FMetrics struct { FcSteps DWORD F__ccgo_pad1 [20]byte } } type MIXERCONTROLA = tagMIXERCONTROLA type PMIXERCONTROLA = uintptr type LPMIXERCONTROLA = uintptr type tagMIXERCONTROLW = struct { FcbStruct DWORD FdwControlID DWORD FdwControlType DWORD FfdwControl DWORD FcMultipleItems DWORD FszShortName [16]WCHAR FszName [64]WCHAR FBounds struct { Fs struct { FlMinimum LONG FlMaximum LONG } F__ccgo_pad1 [16]byte } FMetrics struct { FcSteps DWORD F__ccgo_pad1 [20]byte } } type MIXERCONTROLW = tagMIXERCONTROLW type PMIXERCONTROLW = uintptr type LPMIXERCONTROLW = uintptr type MIXERCONTROL = MIXERCONTROLA type PMIXERCONTROL = PMIXERCONTROLA type LPMIXERCONTROL = LPMIXERCONTROLA type tagMIXERLINECONTROLSA = struct { FcbStruct DWORD FdwLineID DWORD Fu struct{ FdwControlID DWORD } FcControls DWORD Fcbmxctrl DWORD F__ccgo_pad1 [4]byte Fpamxctrl LPMIXERCONTROLA } type MIXERLINECONTROLSA = tagMIXERLINECONTROLSA type PMIXERLINECONTROLSA = uintptr type LPMIXERLINECONTROLSA = uintptr type tagMIXERLINECONTROLSW = struct { FcbStruct DWORD FdwLineID DWORD Fu struct{ FdwControlID DWORD } FcControls DWORD Fcbmxctrl DWORD F__ccgo_pad1 [4]byte Fpamxctrl LPMIXERCONTROLW } type MIXERLINECONTROLSW = tagMIXERLINECONTROLSW type PMIXERLINECONTROLSW = uintptr type LPMIXERLINECONTROLSW = uintptr type MIXERLINECONTROLS = MIXERLINECONTROLSA type PMIXERLINECONTROLS = PMIXERLINECONTROLSA type LPMIXERLINECONTROLS = LPMIXERLINECONTROLSA type tMIXERCONTROLDETAILS = struct { FcbStruct DWORD FdwControlID DWORD FcChannels DWORD F__ccgo_pad1 [4]byte Fu struct{ FhwndOwner HWND } FcbDetails DWORD F__ccgo_pad2 [4]byte FpaDetails LPVOID } type MIXERCONTROLDETAILS = tMIXERCONTROLDETAILS type PMIXERCONTROLDETAILS = uintptr type LPMIXERCONTROLDETAILS = uintptr type tagMIXERCONTROLDETAILS_LISTTEXTA = struct { FdwParam1 DWORD FdwParam2 DWORD FszName [64]CHAR } type MIXERCONTROLDETAILS_LISTTEXTA = tagMIXERCONTROLDETAILS_LISTTEXTA type PMIXERCONTROLDETAILS_LISTTEXTA = uintptr type LPMIXERCONTROLDETAILS_LISTTEXTA = uintptr type tagMIXERCONTROLDETAILS_LISTTEXTW = struct { FdwParam1 DWORD FdwParam2 DWORD FszName [64]WCHAR } type MIXERCONTROLDETAILS_LISTTEXTW = tagMIXERCONTROLDETAILS_LISTTEXTW type PMIXERCONTROLDETAILS_LISTTEXTW = uintptr type LPMIXERCONTROLDETAILS_LISTTEXTW = uintptr type MIXERCONTROLDETAILS_LISTTEXT = MIXERCONTROLDETAILS_LISTTEXTA type PMIXERCONTROLDETAILS_LISTTEXT = PMIXERCONTROLDETAILS_LISTTEXTA type LPMIXERCONTROLDETAILS_LISTTEXT = LPMIXERCONTROLDETAILS_LISTTEXTA type tMIXERCONTROLDETAILS_BOOLEAN = struct{ FfValue LONG } type MIXERCONTROLDETAILS_BOOLEAN = tMIXERCONTROLDETAILS_BOOLEAN type PMIXERCONTROLDETAILS_BOOLEAN = uintptr type LPMIXERCONTROLDETAILS_BOOLEAN = uintptr type tMIXERCONTROLDETAILS_SIGNED = struct{ FlValue LONG } type MIXERCONTROLDETAILS_SIGNED = tMIXERCONTROLDETAILS_SIGNED type PMIXERCONTROLDETAILS_SIGNED = uintptr type LPMIXERCONTROLDETAILS_SIGNED = uintptr type tMIXERCONTROLDETAILS_UNSIGNED = struct{ FdwValue DWORD } type MIXERCONTROLDETAILS_UNSIGNED = tMIXERCONTROLDETAILS_UNSIGNED type PMIXERCONTROLDETAILS_UNSIGNED = uintptr type LPMIXERCONTROLDETAILS_UNSIGNED = uintptr type LPTIMECALLBACK = uintptr type timecaps_tag = struct { FwPeriodMin UINT FwPeriodMax UINT } type TIMECAPS = timecaps_tag type PTIMECAPS = uintptr type NPTIMECAPS = uintptr type LPTIMECAPS = uintptr type tagJOYCAPSA = struct { FwMid WORD FwPid WORD FszPname [32]CHAR FwXmin UINT FwXmax UINT FwYmin UINT FwYmax UINT FwZmin UINT FwZmax UINT FwNumButtons UINT FwPeriodMin UINT FwPeriodMax UINT FwRmin UINT FwRmax UINT FwUmin UINT FwUmax UINT FwVmin UINT FwVmax UINT FwCaps UINT FwMaxAxes UINT FwNumAxes UINT FwMaxButtons UINT FszRegKey [32]CHAR FszOEMVxD [260]CHAR } type JOYCAPSA = tagJOYCAPSA type PJOYCAPSA = uintptr type NPJOYCAPSA = uintptr type LPJOYCAPSA = uintptr type tagJOYCAPSW = struct { FwMid WORD FwPid WORD FszPname [32]WCHAR FwXmin UINT FwXmax UINT FwYmin UINT FwYmax UINT FwZmin UINT FwZmax UINT FwNumButtons UINT FwPeriodMin UINT FwPeriodMax UINT FwRmin UINT FwRmax UINT FwUmin UINT FwUmax UINT FwVmin UINT FwVmax UINT FwCaps UINT FwMaxAxes UINT FwNumAxes UINT FwMaxButtons UINT FszRegKey [32]WCHAR FszOEMVxD [260]WCHAR } type JOYCAPSW = tagJOYCAPSW type PJOYCAPSW = uintptr type NPJOYCAPSW = uintptr type LPJOYCAPSW = uintptr type JOYCAPS = JOYCAPSA type PJOYCAPS = PJOYCAPSA type NPJOYCAPS = NPJOYCAPSA type LPJOYCAPS = LPJOYCAPSA type tagJOYCAPS2A = struct { FwMid WORD FwPid WORD FszPname [32]CHAR FwXmin UINT FwXmax UINT FwYmin UINT FwYmax UINT FwZmin UINT FwZmax UINT FwNumButtons UINT FwPeriodMin UINT FwPeriodMax UINT FwRmin UINT FwRmax UINT FwUmin UINT FwUmax UINT FwVmin UINT FwVmax UINT FwCaps UINT FwMaxAxes UINT FwNumAxes UINT FwMaxButtons UINT FszRegKey [32]CHAR FszOEMVxD [260]CHAR FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type JOYCAPS2A = tagJOYCAPS2A type PJOYCAPS2A = uintptr type NPJOYCAPS2A = uintptr type LPJOYCAPS2A = uintptr type tagJOYCAPS2W = struct { FwMid WORD FwPid WORD FszPname [32]WCHAR FwXmin UINT FwXmax UINT FwYmin UINT FwYmax UINT FwZmin UINT FwZmax UINT FwNumButtons UINT FwPeriodMin UINT FwPeriodMax UINT FwRmin UINT FwRmax UINT FwUmin UINT FwUmax UINT FwVmin UINT FwVmax UINT FwCaps UINT FwMaxAxes UINT FwNumAxes UINT FwMaxButtons UINT FszRegKey [32]WCHAR FszOEMVxD [260]WCHAR FManufacturerGuid GUID FProductGuid GUID FNameGuid GUID } type JOYCAPS2W = tagJOYCAPS2W type PJOYCAPS2W = uintptr type NPJOYCAPS2W = uintptr type LPJOYCAPS2W = uintptr type JOYCAPS2 = JOYCAPS2A type PJOYCAPS2 = PJOYCAPS2A type NPJOYCAPS2 = NPJOYCAPS2A type LPJOYCAPS2 = LPJOYCAPS2A type joyinfo_tag = struct { FwXpos UINT FwYpos UINT FwZpos UINT FwButtons UINT } type JOYINFO = joyinfo_tag type PJOYINFO = uintptr type NPJOYINFO = uintptr type LPJOYINFO = uintptr type joyinfoex_tag = struct { FdwSize DWORD FdwFlags DWORD FdwXpos DWORD FdwYpos DWORD FdwZpos DWORD FdwRpos DWORD FdwUpos DWORD FdwVpos DWORD FdwButtons DWORD FdwButtonNumber DWORD FdwPOV DWORD FdwReserved1 DWORD FdwReserved2 DWORD } type JOYINFOEX = joyinfoex_tag type PJOYINFOEX = uintptr type NPJOYINFOEX = uintptr type LPJOYINFOEX = uintptr type FOURCC = DWORD type HPSTR = uintptr type HMMIO__ = struct{ Funused int32 } type HMMIO = uintptr type LPMMIOPROC = uintptr type _MMIOINFO = struct { FdwFlags DWORD FfccIOProc FOURCC FpIOProc LPMMIOPROC FwErrorRet UINT F__ccgo_pad1 [4]byte Fhtask HTASK FcchBuffer LONG F__ccgo_pad2 [4]byte FpchBuffer HPSTR FpchNext HPSTR FpchEndRead HPSTR FpchEndWrite HPSTR FlBufOffset LONG FlDiskOffset LONG FadwInfo [3]DWORD FdwReserved1 DWORD FdwReserved2 DWORD F__ccgo_pad3 [4]byte Fhmmio HMMIO } type MMIOINFO = _MMIOINFO type PMMIOINFO = uintptr type NPMMIOINFO = uintptr type LPMMIOINFO = uintptr type LPCMMIOINFO = uintptr type _MMCKINFO = struct { Fckid FOURCC Fcksize DWORD FfccType FOURCC FdwDataOffset DWORD FdwFlags DWORD } type MMCKINFO = _MMCKINFO type PMMCKINFO = uintptr type NPMMCKINFO = uintptr type LPMMCKINFO = uintptr type LPCMMCKINFO = uintptr type MCIERROR = DWORD type MCIDEVICEID = UINT type YIELDPROC = uintptr type tagMCI_GENERIC_PARMS = struct{ FdwCallback DWORD_PTR } type MCI_GENERIC_PARMS = tagMCI_GENERIC_PARMS type PMCI_GENERIC_PARMS = uintptr type LPMCI_GENERIC_PARMS = uintptr type tagMCI_OPEN_PARMSA = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCSTR FlpstrElementName LPCSTR FlpstrAlias LPCSTR } type MCI_OPEN_PARMSA = tagMCI_OPEN_PARMSA type PMCI_OPEN_PARMSA = uintptr type LPMCI_OPEN_PARMSA = uintptr type tagMCI_OPEN_PARMSW = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCWSTR FlpstrElementName LPCWSTR FlpstrAlias LPCWSTR } type MCI_OPEN_PARMSW = tagMCI_OPEN_PARMSW type PMCI_OPEN_PARMSW = uintptr type LPMCI_OPEN_PARMSW = uintptr type MCI_OPEN_PARMS = MCI_OPEN_PARMSA type PMCI_OPEN_PARMS = PMCI_OPEN_PARMSA type LPMCI_OPEN_PARMS = LPMCI_OPEN_PARMSA type tagMCI_PLAY_PARMS = struct { FdwCallback DWORD_PTR FdwFrom DWORD FdwTo DWORD } type MCI_PLAY_PARMS = tagMCI_PLAY_PARMS type PMCI_PLAY_PARMS = uintptr type LPMCI_PLAY_PARMS = uintptr type tagMCI_SEEK_PARMS = struct { FdwCallback DWORD_PTR FdwTo DWORD F__ccgo_pad1 [4]byte } type MCI_SEEK_PARMS = tagMCI_SEEK_PARMS type PMCI_SEEK_PARMS = uintptr type LPMCI_SEEK_PARMS = uintptr type tagMCI_STATUS_PARMS = struct { FdwCallback DWORD_PTR FdwReturn DWORD_PTR FdwItem DWORD FdwTrack DWORD } type MCI_STATUS_PARMS = tagMCI_STATUS_PARMS type PMCI_STATUS_PARMS = uintptr type LPMCI_STATUS_PARMS = uintptr type tagMCI_INFO_PARMSA = struct { FdwCallback DWORD_PTR FlpstrReturn LPSTR FdwRetSize DWORD F__ccgo_pad1 [4]byte } type MCI_INFO_PARMSA = tagMCI_INFO_PARMSA type LPMCI_INFO_PARMSA = uintptr type tagMCI_INFO_PARMSW = struct { FdwCallback DWORD_PTR FlpstrReturn LPWSTR FdwRetSize DWORD F__ccgo_pad1 [4]byte } type MCI_INFO_PARMSW = tagMCI_INFO_PARMSW type LPMCI_INFO_PARMSW = uintptr type MCI_INFO_PARMS = MCI_INFO_PARMSA type LPMCI_INFO_PARMS = LPMCI_INFO_PARMSA type tagMCI_GETDEVCAPS_PARMS = struct { FdwCallback DWORD_PTR FdwReturn DWORD FdwItem DWORD } type MCI_GETDEVCAPS_PARMS = tagMCI_GETDEVCAPS_PARMS type PMCI_GETDEVCAPS_PARMS = uintptr type LPMCI_GETDEVCAPS_PARMS = uintptr type tagMCI_SYSINFO_PARMSA = struct { FdwCallback DWORD_PTR FlpstrReturn LPSTR FdwRetSize DWORD FdwNumber DWORD FwDeviceType UINT F__ccgo_pad1 [4]byte } type MCI_SYSINFO_PARMSA = tagMCI_SYSINFO_PARMSA type PMCI_SYSINFO_PARMSA = uintptr type LPMCI_SYSINFO_PARMSA = uintptr type tagMCI_SYSINFO_PARMSW = struct { FdwCallback DWORD_PTR FlpstrReturn LPWSTR FdwRetSize DWORD FdwNumber DWORD FwDeviceType UINT F__ccgo_pad1 [4]byte } type MCI_SYSINFO_PARMSW = tagMCI_SYSINFO_PARMSW type PMCI_SYSINFO_PARMSW = uintptr type LPMCI_SYSINFO_PARMSW = uintptr type MCI_SYSINFO_PARMS = MCI_SYSINFO_PARMSA type PMCI_SYSINFO_PARMS = PMCI_SYSINFO_PARMSA type LPMCI_SYSINFO_PARMS = LPMCI_SYSINFO_PARMSA type tagMCI_SET_PARMS = struct { FdwCallback DWORD_PTR FdwTimeFormat DWORD FdwAudio DWORD } type MCI_SET_PARMS = tagMCI_SET_PARMS type PMCI_SET_PARMS = uintptr type LPMCI_SET_PARMS = uintptr type tagMCI_BREAK_PARMS = struct { FdwCallback DWORD_PTR FnVirtKey int32 F__ccgo_pad1 [4]byte FhwndBreak HWND } type MCI_BREAK_PARMS = tagMCI_BREAK_PARMS type PMCI_BREAK_PARMS = uintptr type LPMCI_BREAK_PARMS = uintptr type tagMCI_SAVE_PARMSA = struct { FdwCallback DWORD_PTR Flpfilename LPCSTR } type MCI_SAVE_PARMSA = tagMCI_SAVE_PARMSA type PMCI_SAVE_PARMSA = uintptr type LPMCI_SAVE_PARMSA = uintptr type tagMCI_SAVE_PARMSW = struct { FdwCallback DWORD_PTR Flpfilename LPCWSTR } type MCI_SAVE_PARMSW = tagMCI_SAVE_PARMSW type PMCI_SAVE_PARMSW = uintptr type LPMCI_SAVE_PARMSW = uintptr type MCI_SAVE_PARMS = MCI_SAVE_PARMSA type PMCI_SAVE_PARMS = PMCI_SAVE_PARMSA type LPMCI_SAVE_PARMS = LPMCI_SAVE_PARMSA type tagMCI_LOAD_PARMSA = struct { FdwCallback DWORD_PTR Flpfilename LPCSTR } type MCI_LOAD_PARMSA = tagMCI_LOAD_PARMSA type PMCI_LOAD_PARMSA = uintptr type LPMCI_LOAD_PARMSA = uintptr type tagMCI_LOAD_PARMSW = struct { FdwCallback DWORD_PTR Flpfilename LPCWSTR } type MCI_LOAD_PARMSW = tagMCI_LOAD_PARMSW type PMCI_LOAD_PARMSW = uintptr type LPMCI_LOAD_PARMSW = uintptr type MCI_LOAD_PARMS = MCI_LOAD_PARMSA type PMCI_LOAD_PARMS = PMCI_LOAD_PARMSA type LPMCI_LOAD_PARMS = LPMCI_LOAD_PARMSA type tagMCI_RECORD_PARMS = struct { FdwCallback DWORD_PTR FdwFrom DWORD FdwTo DWORD } type MCI_RECORD_PARMS = tagMCI_RECORD_PARMS type LPMCI_RECORD_PARMS = uintptr type tagMCI_VD_PLAY_PARMS = struct { FdwCallback DWORD_PTR FdwFrom DWORD FdwTo DWORD FdwSpeed DWORD F__ccgo_pad1 [4]byte } type MCI_VD_PLAY_PARMS = tagMCI_VD_PLAY_PARMS type PMCI_VD_PLAY_PARMS = uintptr type LPMCI_VD_PLAY_PARMS = uintptr type tagMCI_VD_STEP_PARMS = struct { FdwCallback DWORD_PTR FdwFrames DWORD F__ccgo_pad1 [4]byte } type MCI_VD_STEP_PARMS = tagMCI_VD_STEP_PARMS type PMCI_VD_STEP_PARMS = uintptr type LPMCI_VD_STEP_PARMS = uintptr type tagMCI_VD_ESCAPE_PARMSA = struct { FdwCallback DWORD_PTR FlpstrCommand LPCSTR } type MCI_VD_ESCAPE_PARMSA = tagMCI_VD_ESCAPE_PARMSA type PMCI_VD_ESCAPE_PARMSA = uintptr type LPMCI_VD_ESCAPE_PARMSA = uintptr type tagMCI_VD_ESCAPE_PARMSW = struct { FdwCallback DWORD_PTR FlpstrCommand LPCWSTR } type MCI_VD_ESCAPE_PARMSW = tagMCI_VD_ESCAPE_PARMSW type PMCI_VD_ESCAPE_PARMSW = uintptr type LPMCI_VD_ESCAPE_PARMSW = uintptr type MCI_VD_ESCAPE_PARMS = MCI_VD_ESCAPE_PARMSA type PMCI_VD_ESCAPE_PARMS = PMCI_VD_ESCAPE_PARMSA type LPMCI_VD_ESCAPE_PARMS = LPMCI_VD_ESCAPE_PARMSA type tagMCI_WAVE_OPEN_PARMSA = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCSTR FlpstrElementName LPCSTR FlpstrAlias LPCSTR FdwBufferSeconds DWORD F__ccgo_pad2 [4]byte } type MCI_WAVE_OPEN_PARMSA = tagMCI_WAVE_OPEN_PARMSA type PMCI_WAVE_OPEN_PARMSA = uintptr type LPMCI_WAVE_OPEN_PARMSA = uintptr type tagMCI_WAVE_OPEN_PARMSW = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCWSTR FlpstrElementName LPCWSTR FlpstrAlias LPCWSTR FdwBufferSeconds DWORD F__ccgo_pad2 [4]byte } type MCI_WAVE_OPEN_PARMSW = tagMCI_WAVE_OPEN_PARMSW type PMCI_WAVE_OPEN_PARMSW = uintptr type LPMCI_WAVE_OPEN_PARMSW = uintptr type MCI_WAVE_OPEN_PARMS = MCI_WAVE_OPEN_PARMSA type PMCI_WAVE_OPEN_PARMS = PMCI_WAVE_OPEN_PARMSA type LPMCI_WAVE_OPEN_PARMS = LPMCI_WAVE_OPEN_PARMSA type tagMCI_WAVE_DELETE_PARMS = struct { FdwCallback DWORD_PTR FdwFrom DWORD FdwTo DWORD } type MCI_WAVE_DELETE_PARMS = tagMCI_WAVE_DELETE_PARMS type PMCI_WAVE_DELETE_PARMS = uintptr type LPMCI_WAVE_DELETE_PARMS = uintptr type tagMCI_WAVE_SET_PARMS = struct { FdwCallback DWORD_PTR FdwTimeFormat DWORD FdwAudio DWORD FwInput UINT FwOutput UINT FwFormatTag WORD FwReserved2 WORD FnChannels WORD FwReserved3 WORD FnSamplesPerSec DWORD FnAvgBytesPerSec DWORD FnBlockAlign WORD FwReserved4 WORD FwBitsPerSample WORD FwReserved5 WORD } type MCI_WAVE_SET_PARMS = tagMCI_WAVE_SET_PARMS type PMCI_WAVE_SET_PARMS = uintptr type LPMCI_WAVE_SET_PARMS = uintptr type tagMCI_SEQ_SET_PARMS = struct { FdwCallback DWORD_PTR FdwTimeFormat DWORD FdwAudio DWORD FdwTempo DWORD FdwPort DWORD FdwSlave DWORD FdwMaster DWORD FdwOffset DWORD F__ccgo_pad1 [4]byte } type MCI_SEQ_SET_PARMS = tagMCI_SEQ_SET_PARMS type PMCI_SEQ_SET_PARMS = uintptr type LPMCI_SEQ_SET_PARMS = uintptr type tagMCI_ANIM_OPEN_PARMSA = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCSTR FlpstrElementName LPCSTR FlpstrAlias LPCSTR FdwStyle DWORD F__ccgo_pad2 [4]byte FhWndParent HWND } type MCI_ANIM_OPEN_PARMSA = tagMCI_ANIM_OPEN_PARMSA type PMCI_ANIM_OPEN_PARMSA = uintptr type LPMCI_ANIM_OPEN_PARMSA = uintptr type tagMCI_ANIM_OPEN_PARMSW = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCWSTR FlpstrElementName LPCWSTR FlpstrAlias LPCWSTR FdwStyle DWORD F__ccgo_pad2 [4]byte FhWndParent HWND } type MCI_ANIM_OPEN_PARMSW = tagMCI_ANIM_OPEN_PARMSW type PMCI_ANIM_OPEN_PARMSW = uintptr type LPMCI_ANIM_OPEN_PARMSW = uintptr type MCI_ANIM_OPEN_PARMS = MCI_ANIM_OPEN_PARMSA type PMCI_ANIM_OPEN_PARMS = PMCI_ANIM_OPEN_PARMSA type LPMCI_ANIM_OPEN_PARMS = LPMCI_ANIM_OPEN_PARMSA type tagMCI_ANIM_PLAY_PARMS = struct { FdwCallback DWORD_PTR FdwFrom DWORD FdwTo DWORD FdwSpeed DWORD F__ccgo_pad1 [4]byte } type MCI_ANIM_PLAY_PARMS = tagMCI_ANIM_PLAY_PARMS type PMCI_ANIM_PLAY_PARMS = uintptr type LPMCI_ANIM_PLAY_PARMS = uintptr type tagMCI_ANIM_STEP_PARMS = struct { FdwCallback DWORD_PTR FdwFrames DWORD F__ccgo_pad1 [4]byte } type MCI_ANIM_STEP_PARMS = tagMCI_ANIM_STEP_PARMS type PMCI_ANIM_STEP_PARMS = uintptr type LPMCI_ANIM_STEP_PARMS = uintptr type tagMCI_ANIM_WINDOW_PARMSA = struct { FdwCallback DWORD_PTR FhWnd HWND FnCmdShow UINT F__ccgo_pad1 [4]byte FlpstrText LPCSTR } type MCI_ANIM_WINDOW_PARMSA = tagMCI_ANIM_WINDOW_PARMSA type PMCI_ANIM_WINDOW_PARMSA = uintptr type LPMCI_ANIM_WINDOW_PARMSA = uintptr type tagMCI_ANIM_WINDOW_PARMSW = struct { FdwCallback DWORD_PTR FhWnd HWND FnCmdShow UINT F__ccgo_pad1 [4]byte FlpstrText LPCWSTR } type MCI_ANIM_WINDOW_PARMSW = tagMCI_ANIM_WINDOW_PARMSW type PMCI_ANIM_WINDOW_PARMSW = uintptr type LPMCI_ANIM_WINDOW_PARMSW = uintptr type MCI_ANIM_WINDOW_PARMS = MCI_ANIM_WINDOW_PARMSA type PMCI_ANIM_WINDOW_PARMS = PMCI_ANIM_WINDOW_PARMSA type LPMCI_ANIM_WINDOW_PARMS = LPMCI_ANIM_WINDOW_PARMSA type tagMCI_ANIM_RECT_PARMS = struct { FdwCallback DWORD_PTR Frc RECT } type MCI_ANIM_RECT_PARMS = tagMCI_ANIM_RECT_PARMS type PMCI_ANIM_RECT_PARMS = uintptr type LPMCI_ANIM_RECT_PARMS = uintptr type tagMCI_ANIM_UPDATE_PARMS = struct { FdwCallback DWORD_PTR Frc RECT FhDC HDC } type MCI_ANIM_UPDATE_PARMS = tagMCI_ANIM_UPDATE_PARMS type PMCI_ANIM_UPDATE_PARMS = uintptr type LPMCI_ANIM_UPDATE_PARMS = uintptr type tagMCI_OVLY_OPEN_PARMSA = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCSTR FlpstrElementName LPCSTR FlpstrAlias LPCSTR FdwStyle DWORD F__ccgo_pad2 [4]byte FhWndParent HWND } type MCI_OVLY_OPEN_PARMSA = tagMCI_OVLY_OPEN_PARMSA type PMCI_OVLY_OPEN_PARMSA = uintptr type LPMCI_OVLY_OPEN_PARMSA = uintptr type tagMCI_OVLY_OPEN_PARMSW = struct { FdwCallback DWORD_PTR FwDeviceID MCIDEVICEID F__ccgo_pad1 [4]byte FlpstrDeviceType LPCWSTR FlpstrElementName LPCWSTR FlpstrAlias LPCWSTR FdwStyle DWORD F__ccgo_pad2 [4]byte FhWndParent HWND } type MCI_OVLY_OPEN_PARMSW = tagMCI_OVLY_OPEN_PARMSW type PMCI_OVLY_OPEN_PARMSW = uintptr type LPMCI_OVLY_OPEN_PARMSW = uintptr type MCI_OVLY_OPEN_PARMS = MCI_OVLY_OPEN_PARMSA type PMCI_OVLY_OPEN_PARMS = PMCI_OVLY_OPEN_PARMSA type LPMCI_OVLY_OPEN_PARMS = LPMCI_OVLY_OPEN_PARMSA type tagMCI_OVLY_WINDOW_PARMSA = struct { FdwCallback DWORD_PTR FhWnd HWND FnCmdShow UINT F__ccgo_pad1 [4]byte FlpstrText LPCSTR } type MCI_OVLY_WINDOW_PARMSA = tagMCI_OVLY_WINDOW_PARMSA type PMCI_OVLY_WINDOW_PARMSA = uintptr type LPMCI_OVLY_WINDOW_PARMSA = uintptr type tagMCI_OVLY_WINDOW_PARMSW = struct { FdwCallback DWORD_PTR FhWnd HWND FnCmdShow UINT F__ccgo_pad1 [4]byte FlpstrText LPCWSTR } type MCI_OVLY_WINDOW_PARMSW = tagMCI_OVLY_WINDOW_PARMSW type PMCI_OVLY_WINDOW_PARMSW = uintptr type LPMCI_OVLY_WINDOW_PARMSW = uintptr type MCI_OVLY_WINDOW_PARMS = MCI_OVLY_WINDOW_PARMSA type PMCI_OVLY_WINDOW_PARMS = PMCI_OVLY_WINDOW_PARMSA type LPMCI_OVLY_WINDOW_PARMS = LPMCI_OVLY_WINDOW_PARMSA type tagMCI_OVLY_RECT_PARMS = struct { FdwCallback DWORD_PTR Frc RECT } type MCI_OVLY_RECT_PARMS = tagMCI_OVLY_RECT_PARMS type PMCI_OVLY_RECT_PARMS = uintptr type LPMCI_OVLY_RECT_PARMS = uintptr type tagMCI_OVLY_SAVE_PARMSA = struct { FdwCallback DWORD_PTR Flpfilename LPCSTR Frc RECT } type MCI_OVLY_SAVE_PARMSA = tagMCI_OVLY_SAVE_PARMSA type PMCI_OVLY_SAVE_PARMSA = uintptr type LPMCI_OVLY_SAVE_PARMSA = uintptr type tagMCI_OVLY_SAVE_PARMSW = struct { FdwCallback DWORD_PTR Flpfilename LPCWSTR Frc RECT } type MCI_OVLY_SAVE_PARMSW = tagMCI_OVLY_SAVE_PARMSW type PMCI_OVLY_SAVE_PARMSW = uintptr type LPMCI_OVLY_SAVE_PARMSW = uintptr type MCI_OVLY_SAVE_PARMS = MCI_OVLY_SAVE_PARMSA type PMCI_OVLY_SAVE_PARMS = PMCI_OVLY_SAVE_PARMSA type LPMCI_OVLY_SAVE_PARMS = LPMCI_OVLY_SAVE_PARMSA type tagMCI_OVLY_LOAD_PARMSA = struct { FdwCallback DWORD_PTR Flpfilename LPCSTR Frc RECT } type MCI_OVLY_LOAD_PARMSA = tagMCI_OVLY_LOAD_PARMSA type PMCI_OVLY_LOAD_PARMSA = uintptr type LPMCI_OVLY_LOAD_PARMSA = uintptr type tagMCI_OVLY_LOAD_PARMSW = struct { FdwCallback DWORD_PTR Flpfilename LPCWSTR Frc RECT } type MCI_OVLY_LOAD_PARMSW = tagMCI_OVLY_LOAD_PARMSW type PMCI_OVLY_LOAD_PARMSW = uintptr type LPMCI_OVLY_LOAD_PARMSW = uintptr type MCI_OVLY_LOAD_PARMS = MCI_OVLY_LOAD_PARMSA type PMCI_OVLY_LOAD_PARMS = PMCI_OVLY_LOAD_PARMSA type LPMCI_OVLY_LOAD_PARMS = LPMCI_OVLY_LOAD_PARMSA type _NCB = struct { Fncb_command UCHAR Fncb_retcode UCHAR Fncb_lsn UCHAR Fncb_num UCHAR F__ccgo_pad1 [4]byte Fncb_buffer PUCHAR Fncb_length WORD Fncb_callname [16]UCHAR Fncb_name [16]UCHAR Fncb_rto UCHAR Fncb_sto UCHAR F__ccgo_pad2 [4]byte Fncb_post uintptr Fncb_lana_num UCHAR Fncb_cmd_cplt UCHAR Fncb_reserve [18]UCHAR F__ccgo_pad3 [4]byte Fncb_event HANDLE } type NCB = _NCB type PNCB = uintptr type _ADAPTER_STATUS = struct { Fadapter_address [6]UCHAR Frev_major UCHAR Freserved0 UCHAR Fadapter_type UCHAR Frev_minor UCHAR Fduration WORD Ffrmr_recv WORD Ffrmr_xmit WORD Fiframe_recv_err WORD Fxmit_aborts WORD Fxmit_success DWORD Frecv_success DWORD Fiframe_xmit_err WORD Frecv_buff_unavail WORD Ft1_timeouts WORD Fti_timeouts WORD Freserved1 DWORD Ffree_ncbs WORD Fmax_cfg_ncbs WORD Fmax_ncbs WORD Fxmit_buf_unavail WORD Fmax_dgram_size WORD Fpending_sess WORD Fmax_cfg_sess WORD Fmax_sess WORD Fmax_sess_pkt_size WORD Fname_count WORD } type ADAPTER_STATUS = _ADAPTER_STATUS type PADAPTER_STATUS = uintptr type _NAME_BUFFER = struct { Fname [16]UCHAR Fname_num UCHAR Fname_flags UCHAR } type NAME_BUFFER = _NAME_BUFFER type PNAME_BUFFER = uintptr type _SESSION_HEADER = struct { Fsess_name UCHAR Fnum_sess UCHAR Frcv_dg_outstanding UCHAR Frcv_any_outstanding UCHAR } type SESSION_HEADER = _SESSION_HEADER type PSESSION_HEADER = uintptr type _SESSION_BUFFER = struct { Flsn UCHAR Fstate UCHAR Flocal_name [16]UCHAR Fremote_name [16]UCHAR Frcvs_outstanding UCHAR Fsends_outstanding UCHAR } type SESSION_BUFFER = _SESSION_BUFFER type PSESSION_BUFFER = uintptr type _LANA_ENUM = struct { Flength UCHAR Flana [255]UCHAR } type LANA_ENUM = _LANA_ENUM type PLANA_ENUM = uintptr type _FIND_NAME_HEADER = struct { Fnode_count WORD Freserved UCHAR Funique_group UCHAR } type FIND_NAME_HEADER = _FIND_NAME_HEADER type PFIND_NAME_HEADER = uintptr type _FIND_NAME_BUFFER = struct { Flength UCHAR Faccess_control UCHAR Fframe_control UCHAR Fdestination_addr [6]UCHAR Fsource_addr [6]UCHAR Frouting_info [18]UCHAR } type FIND_NAME_BUFFER = _FIND_NAME_BUFFER type PFIND_NAME_BUFFER = uintptr type _ACTION_HEADER = struct { Ftransport_id ULONG Faction_code USHORT Freserved USHORT } type ACTION_HEADER = _ACTION_HEADER type PACTION_HEADER = uintptr type I_RPC_HANDLE = uintptr type RPC_STATUS = int32 type RPC_CSTR = uintptr type RPC_WSTR = uintptr type RPC_BINDING_HANDLE = I_RPC_HANDLE type Handle_t = RPC_BINDING_HANDLE type UUID = GUID type _RPC_BINDING_VECTOR = struct { FCount uint32 F__ccgo_pad1 [4]byte FBindingH [1]RPC_BINDING_HANDLE } type RPC_BINDING_VECTOR = _RPC_BINDING_VECTOR type _UUID_VECTOR = struct { FCount uint32 F__ccgo_pad1 [4]byte FUuid [1]uintptr } type UUID_VECTOR = _UUID_VECTOR type RPC_IF_HANDLE = uintptr type _RPC_IF_ID = struct { FUuid UUID FVersMajor uint16 FVersMinor uint16 } type RPC_IF_ID = _RPC_IF_ID type _RPC_PROTSEQ_VECTORA = struct { FCount uint32 F__ccgo_pad1 [4]byte FProtseq [1]uintptr } type RPC_PROTSEQ_VECTORA = _RPC_PROTSEQ_VECTORA type _RPC_PROTSEQ_VECTORW = struct { FCount uint32 F__ccgo_pad1 [4]byte FProtseq [1]uintptr } type RPC_PROTSEQ_VECTORW = _RPC_PROTSEQ_VECTORW type _RPC_POLICY = struct { FLength uint32 FEndpointFlags uint32 FNICFlags uint32 } type RPC_POLICY = _RPC_POLICY type PRPC_POLICY = uintptr type RPC_STATS_VECTOR = struct { FCount uint32 FStats [1]uint32 } type RPC_IF_ID_VECTOR = struct { FCount uint32 F__ccgo_pad1 [4]byte FIfId [1]uintptr } type RPC_AUTH_IDENTITY_HANDLE = uintptr type RPC_AUTHZ_HANDLE = uintptr type _RPC_SECURITY_QOS = struct { FVersion uint32 FCapabilities uint32 FIdentityTracking uint32 FImpersonationType uint32 } type RPC_SECURITY_QOS = _RPC_SECURITY_QOS type PRPC_SECURITY_QOS = uintptr type _SEC_WINNT_AUTH_IDENTITY_W = struct { FUser uintptr FUserLength uint32 F__ccgo_pad1 [4]byte FDomain uintptr FDomainLength uint32 F__ccgo_pad2 [4]byte FPassword uintptr FPasswordLength uint32 FFlags uint32 } type SEC_WINNT_AUTH_IDENTITY_W = _SEC_WINNT_AUTH_IDENTITY_W type PSEC_WINNT_AUTH_IDENTITY_W = uintptr type _SEC_WINNT_AUTH_IDENTITY_A = struct { FUser uintptr FUserLength uint32 F__ccgo_pad1 [4]byte FDomain uintptr FDomainLength uint32 F__ccgo_pad2 [4]byte FPassword uintptr FPasswordLength uint32 FFlags uint32 } type SEC_WINNT_AUTH_IDENTITY_A = _SEC_WINNT_AUTH_IDENTITY_A type PSEC_WINNT_AUTH_IDENTITY_A = uintptr type _RPC_HTTP_TRANSPORT_CREDENTIALS_W = struct { FTransportCredentials uintptr FFlags uint32 FAuthenticationTarget uint32 FNumberOfAuthnSchemes uint32 F__ccgo_pad1 [4]byte FAuthnSchemes uintptr FServerCertificateSubject uintptr } type RPC_HTTP_TRANSPORT_CREDENTIALS_W = _RPC_HTTP_TRANSPORT_CREDENTIALS_W type PRPC_HTTP_TRANSPORT_CREDENTIALS_W = uintptr type _RPC_HTTP_TRANSPORT_CREDENTIALS_A = struct { FTransportCredentials uintptr FFlags uint32 FAuthenticationTarget uint32 FNumberOfAuthnSchemes uint32 F__ccgo_pad1 [4]byte FAuthnSchemes uintptr FServerCertificateSubject uintptr } type RPC_HTTP_TRANSPORT_CREDENTIALS_A = _RPC_HTTP_TRANSPORT_CREDENTIALS_A type PRPC_HTTP_TRANSPORT_CREDENTIALS_A = uintptr type _RPC_SECURITY_QOS_V2_W = struct { FVersion uint32 FCapabilities uint32 FIdentityTracking uint32 FImpersonationType uint32 FAdditionalSecurityInfoType uint32 F__ccgo_pad1 [4]byte Fu struct{ FHttpCredentials uintptr } } type RPC_SECURITY_QOS_V2_W = _RPC_SECURITY_QOS_V2_W type PRPC_SECURITY_QOS_V2_W = uintptr type _RPC_SECURITY_QOS_V2_A = struct { FVersion uint32 FCapabilities uint32 FIdentityTracking uint32 FImpersonationType uint32 FAdditionalSecurityInfoType uint32 F__ccgo_pad1 [4]byte Fu struct{ FHttpCredentials uintptr } } type RPC_SECURITY_QOS_V2_A = _RPC_SECURITY_QOS_V2_A type PRPC_SECURITY_QOS_V2_A = uintptr type _RPC_SECURITY_QOS_V3_W = struct { FVersion uint32 FCapabilities uint32 FIdentityTracking uint32 FImpersonationType uint32 FAdditionalSecurityInfoType uint32 F__ccgo_pad1 [4]byte Fu struct{ FHttpCredentials uintptr } FSid uintptr } type RPC_SECURITY_QOS_V3_W = _RPC_SECURITY_QOS_V3_W type PRPC_SECURITY_QOS_V3_W = uintptr type _RPC_SECURITY_QOS_V3_A = struct { FVersion uint32 FCapabilities uint32 FIdentityTracking uint32 FImpersonationType uint32 FAdditionalSecurityInfoType uint32 F__ccgo_pad1 [4]byte Fu struct{ FHttpCredentials uintptr } FSid uintptr } type RPC_SECURITY_QOS_V3_A = _RPC_SECURITY_QOS_V3_A type PRPC_SECURITY_QOS_V3_A = uintptr type RPC_HTTP_REDIRECTOR_STAGE = uint32 type RPC_NEW_HTTP_PROXY_CHANNEL = uintptr type RPC_HTTP_PROXY_FREE_STRING = uintptr type RPC_AUTH_KEY_RETRIEVAL_FN = uintptr type RPC_CLIENT_INFORMATION1 = struct { FUserName uintptr FComputerName uintptr FPrivilege uint16 F__ccgo_pad1 [2]byte FAuthFlags uint32 } type PRPC_CLIENT_INFORMATION1 = uintptr type RPC_EP_INQ_HANDLE = uintptr type RPC_MGMT_AUTHORIZATION_FN = uintptr type _RPC_VERSION = struct { FMajorVersion uint16 FMinorVersion uint16 } type RPC_VERSION = _RPC_VERSION type _RPC_SYNTAX_IDENTIFIER = struct { FSyntaxGUID GUID FSyntaxVersion RPC_VERSION } type RPC_SYNTAX_IDENTIFIER = _RPC_SYNTAX_IDENTIFIER type PRPC_SYNTAX_IDENTIFIER = uintptr type _RPC_MESSAGE = struct { FHandle RPC_BINDING_HANDLE FDataRepresentation uint32 F__ccgo_pad1 [4]byte FBuffer uintptr FBufferLength uint32 FProcNum uint32 FTransferSyntax PRPC_SYNTAX_IDENTIFIER FRpcInterfaceInformation uintptr FReservedForRuntime uintptr FManagerEpv uintptr FImportContext uintptr FRpcFlags uint32 F__ccgo_pad2 [4]byte } type RPC_MESSAGE = _RPC_MESSAGE type PRPC_MESSAGE = uintptr type RPC_DISPATCH_FUNCTION = uintptr type RPC_DISPATCH_TABLE = struct { FDispatchTableCount uint32 F__ccgo_pad1 [4]byte FDispatchTable uintptr FReserved LONG_PTR } type PRPC_DISPATCH_TABLE = uintptr type _RPC_PROTSEQ_ENDPOINT = struct { FRpcProtocolSequence uintptr FEndpoint uintptr } type RPC_PROTSEQ_ENDPOINT = _RPC_PROTSEQ_ENDPOINT type PRPC_PROTSEQ_ENDPOINT = uintptr type _RPC_SERVER_INTERFACE = struct { FLength uint32 FInterfaceId RPC_SYNTAX_IDENTIFIER FTransferSyntax RPC_SYNTAX_IDENTIFIER F__ccgo_pad1 [4]byte FDispatchTable PRPC_DISPATCH_TABLE FRpcProtseqEndpointCount uint32 F__ccgo_pad2 [4]byte FRpcProtseqEndpoint PRPC_PROTSEQ_ENDPOINT FDefaultManagerEpv uintptr FInterpreterInfo uintptr FFlags uint32 F__ccgo_pad3 [4]byte } type RPC_SERVER_INTERFACE = _RPC_SERVER_INTERFACE type PRPC_SERVER_INTERFACE = uintptr type _RPC_CLIENT_INTERFACE = struct { FLength uint32 FInterfaceId RPC_SYNTAX_IDENTIFIER FTransferSyntax RPC_SYNTAX_IDENTIFIER F__ccgo_pad1 [4]byte FDispatchTable PRPC_DISPATCH_TABLE FRpcProtseqEndpointCount uint32 F__ccgo_pad2 [4]byte FRpcProtseqEndpoint PRPC_PROTSEQ_ENDPOINT FReserved ULONG_PTR FInterpreterInfo uintptr FFlags uint32 F__ccgo_pad3 [4]byte } type RPC_CLIENT_INTERFACE = _RPC_CLIENT_INTERFACE type PRPC_CLIENT_INTERFACE = uintptr type I_RPC_MUTEX = uintptr type PRPC_RUNDOWN = uintptr type _RPC_TRANSFER_SYNTAX = struct { FUuid UUID FVersMajor uint16 FVersMinor uint16 } type RPC_TRANSFER_SYNTAX = _RPC_TRANSFER_SYNTAX type RPCLT_PDU_FILTER_FUNC = uintptr type RPC_SETFILTER_FUNC = uintptr type _RPC_C_OPT_METADATA_DESCRIPTOR = struct { FBufferSize uint32 F__ccgo_pad1 [4]byte FBuffer uintptr } type RPC_C_OPT_METADATA_DESCRIPTOR = _RPC_C_OPT_METADATA_DESCRIPTOR type _RDR_CALLOUT_STATE = struct { FLastError RPC_STATUS F__ccgo_pad1 [4]byte FLastEEInfo uintptr FLastCalledStage RPC_HTTP_REDIRECTOR_STAGE F__ccgo_pad2 [4]byte FServerName uintptr FServerPort uintptr FRemoteUser uintptr FAuthType uintptr FResourceTypePresent uint8 FMetadataPresent uint8 FSessionIdPresent uint8 FInterfacePresent uint8 FResourceType UUID F__ccgo_pad3 [4]byte FMetadata RPC_C_OPT_METADATA_DESCRIPTOR FSessionId UUID FInterface RPC_SYNTAX_IDENTIFIER F__ccgo_pad4 [4]byte FCertContext uintptr } type RDR_CALLOUT_STATE = _RDR_CALLOUT_STATE type I_RpcProxyIsValidMachineFn = uintptr type I_RpcProxyGetClientAddressFn = uintptr type I_RpcProxyGetConnectionTimeoutFn = uintptr type I_RpcPerformCalloutFn = uintptr type I_RpcFreeCalloutStateFn = uintptr type tagI_RpcProxyCallbackInterface = struct { FIsValidMachineFn I_RpcProxyIsValidMachineFn FGetClientAddressFn I_RpcProxyGetClientAddressFn FGetConnectionTimeoutFn I_RpcProxyGetConnectionTimeoutFn FPerformCalloutFn I_RpcPerformCalloutFn FFreeCalloutStateFn I_RpcFreeCalloutStateFn } type I_RpcProxyCallbackInterface = tagI_RpcProxyCallbackInterface type RPC_NS_HANDLE = uintptr type RPC_NOTIFICATION_TYPES = uint32 type RPC_ASYNC_EVENT = uint32 type _RPC_ASYNC_STATE = struct { FSize uint32 FSignature uint32 FLock int32 FFlags uint32 FStubInfo uintptr FUserInfo uintptr FRuntimeInfo uintptr FEvent RPC_ASYNC_EVENT FNotificationType RPC_NOTIFICATION_TYPES Fu struct { FAPC struct { FNotificationRoutine PFN_RPCNOTIFICATION_ROUTINE FhThread HANDLE } F__ccgo_pad1 [16]byte } FReserved [4]LONG_PTR } type PFN_RPCNOTIFICATION_ROUTINE = uintptr type RPC_ASYNC_STATE = _RPC_ASYNC_STATE type PRPC_ASYNC_STATE = uintptr type ExtendedErrorParamTypes = uint32 type tagBinaryParam = struct { FBuffer uintptr FSize int16 F__ccgo_pad1 [6]byte } type BinaryParam = tagBinaryParam type tagRPC_EE_INFO_PARAM = struct { FParameterType ExtendedErrorParamTypes F__ccgo_pad1 [4]byte Fu struct { FAnsiString LPSTR F__ccgo_pad1 [8]byte } } type RPC_EE_INFO_PARAM = tagRPC_EE_INFO_PARAM type tagRPC_EXTENDED_ERROR_INFO = struct { FVersion ULONG F__ccgo_pad1 [4]byte FComputerName LPWSTR FProcessID ULONG Fu struct { F__ccgo_pad1 [0]uint32 FSystemTime SYSTEMTIME } FGeneratingComponent ULONG FStatus ULONG FDetectionLocation USHORT FFlags USHORT FNumberOfParameters int32 F__ccgo_pad2 [4]byte FParameters [4]RPC_EE_INFO_PARAM } type RPC_EXTENDED_ERROR_INFO = tagRPC_EXTENDED_ERROR_INFO type tagRPC_ERROR_ENUM_HANDLE = struct { FSignature ULONG F__ccgo_pad1 [4]byte FCurrentPos uintptr FHead uintptr } type RPC_ERROR_ENUM_HANDLE = tagRPC_ERROR_ENUM_HANDLE type tagRPC_CALL_ATTRIBUTES_V1_W = struct { FVersion uint32 FFlags uint32 FServerPrincipalNameBufferLength uint32 F__ccgo_pad1 [4]byte FServerPrincipalName uintptr FClientPrincipalNameBufferLength uint32 F__ccgo_pad2 [4]byte FClientPrincipalName uintptr FAuthenticationLevel uint32 FAuthenticationService uint32 FNullSession WINBOOL F__ccgo_pad3 [4]byte } type RPC_CALL_ATTRIBUTES_V1_W = tagRPC_CALL_ATTRIBUTES_V1_W type tagRPC_CALL_ATTRIBUTES_V1_A = struct { FVersion uint32 FFlags uint32 FServerPrincipalNameBufferLength uint32 F__ccgo_pad1 [4]byte FServerPrincipalName uintptr FClientPrincipalNameBufferLength uint32 F__ccgo_pad2 [4]byte FClientPrincipalName uintptr FAuthenticationLevel uint32 FAuthenticationService uint32 FNullSession WINBOOL F__ccgo_pad3 [4]byte } type RPC_CALL_ATTRIBUTES_V1_A = tagRPC_CALL_ATTRIBUTES_V1_A type RPC_CALL_ATTRIBUTES = RPC_CALL_ATTRIBUTES_V1_A type _RPC_ASYNC_NOTIFICATION_INFO = struct { FAPC struct { FNotificationRoutine PFN_RPCNOTIFICATION_ROUTINE FhThread HANDLE } F__ccgo_pad1 [16]byte } type RPC_ASYNC_NOTIFICATION_INFO = _RPC_ASYNC_NOTIFICATION_INFO type PRPC_ASYNC_NOTIFICATION_INFO = uintptr type RpcCallType = uint32 type RpcLocalAddressFormat = uint32 type RPC_NOTIFICATIONS = uint32 type RpcCallClientLocality = uint32 type HDROP__ = struct{ Funused int32 } type HDROP = uintptr type _DRAGINFOA = struct { FuSize UINT Fpt POINT FfNC WINBOOL FlpFileList LPSTR FgrfKeyState DWORD F__ccgo_pad1 [4]byte } type DRAGINFOA = _DRAGINFOA type LPDRAGINFOA = uintptr type _DRAGINFOW = struct { FuSize UINT Fpt POINT FfNC WINBOOL FlpFileList LPWSTR FgrfKeyState DWORD F__ccgo_pad1 [4]byte } type DRAGINFOW = _DRAGINFOW type LPDRAGINFOW = uintptr type DRAGINFO = DRAGINFOA type LPDRAGINFO = LPDRAGINFOA type _AppBarData = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhWnd HWND FuCallbackMessage UINT FuEdge UINT Frc RECT FlParam LPARAM } type APPBARDATA = _AppBarData type PAPPBARDATA = uintptr type FILEOP_FLAGS = WORD type PRINTEROP_FLAGS = WORD type _SHFILEOPSTRUCTA = struct { Fhwnd HWND FwFunc UINT F__ccgo_pad1 [4]byte FpFrom LPCSTR FpTo LPCSTR FfFlags FILEOP_FLAGS F__ccgo_pad2 [2]byte FfAnyOperationsAborted WINBOOL FhNameMappings LPVOID FlpszProgressTitle PCSTR } type SHFILEOPSTRUCTA = _SHFILEOPSTRUCTA type LPSHFILEOPSTRUCTA = uintptr type _SHFILEOPSTRUCTW = struct { Fhwnd HWND FwFunc UINT F__ccgo_pad1 [4]byte FpFrom LPCWSTR FpTo LPCWSTR FfFlags FILEOP_FLAGS F__ccgo_pad2 [2]byte FfAnyOperationsAborted WINBOOL FhNameMappings LPVOID FlpszProgressTitle PCWSTR } type SHFILEOPSTRUCTW = _SHFILEOPSTRUCTW type LPSHFILEOPSTRUCTW = uintptr type SHFILEOPSTRUCT = SHFILEOPSTRUCTA type LPSHFILEOPSTRUCT = LPSHFILEOPSTRUCTA type _SHNAMEMAPPINGA = struct { FpszOldPath LPSTR FpszNewPath LPSTR FcchOldPath int32 FcchNewPath int32 } type SHNAMEMAPPINGA = _SHNAMEMAPPINGA type LPSHNAMEMAPPINGA = uintptr type _SHNAMEMAPPINGW = struct { FpszOldPath LPWSTR FpszNewPath LPWSTR FcchOldPath int32 FcchNewPath int32 } type SHNAMEMAPPINGW = _SHNAMEMAPPINGW type LPSHNAMEMAPPINGW = uintptr type SHNAMEMAPPING = SHNAMEMAPPINGA type LPSHNAMEMAPPING = LPSHNAMEMAPPINGA type _SHELLEXECUTEINFOA = struct { FcbSize DWORD FfMask ULONG Fhwnd HWND FlpVerb LPCSTR FlpFile LPCSTR FlpParameters LPCSTR FlpDirectory LPCSTR FnShow int32 F__ccgo_pad1 [4]byte FhInstApp HINSTANCE FlpIDList uintptr FlpClass LPCSTR FhkeyClass HKEY FdwHotKey DWORD F__ccgo_pad2 [4]byte Fu struct{ FhIcon HANDLE } FhProcess HANDLE } type SHELLEXECUTEINFOA = _SHELLEXECUTEINFOA type LPSHELLEXECUTEINFOA = uintptr type _SHELLEXECUTEINFOW = struct { FcbSize DWORD FfMask ULONG Fhwnd HWND FlpVerb LPCWSTR FlpFile LPCWSTR FlpParameters LPCWSTR FlpDirectory LPCWSTR FnShow int32 F__ccgo_pad1 [4]byte FhInstApp HINSTANCE FlpIDList uintptr FlpClass LPCWSTR FhkeyClass HKEY FdwHotKey DWORD F__ccgo_pad2 [4]byte Fu struct{ FhIcon HANDLE } FhProcess HANDLE } type SHELLEXECUTEINFOW = _SHELLEXECUTEINFOW type LPSHELLEXECUTEINFOW = uintptr type SHELLEXECUTEINFO = SHELLEXECUTEINFOA type LPSHELLEXECUTEINFO = LPSHELLEXECUTEINFOA type _SHCREATEPROCESSINFOW = struct { FcbSize DWORD FfMask ULONG Fhwnd HWND FpszFile LPCWSTR FpszParameters LPCWSTR FpszCurrentDirectory LPCWSTR FhUserToken HANDLE FlpProcessAttributes LPSECURITY_ATTRIBUTES FlpThreadAttributes LPSECURITY_ATTRIBUTES FbInheritHandles WINBOOL FdwCreationFlags DWORD FlpStartupInfo LPSTARTUPINFOW FlpProcessInformation LPPROCESS_INFORMATION } type SHCREATEPROCESSINFOW = _SHCREATEPROCESSINFOW type PSHCREATEPROCESSINFOW = uintptr type _SHQUERYRBINFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte Fi64Size int64 Fi64NumItems int64 } type SHQUERYRBINFO = _SHQUERYRBINFO type LPSHQUERYRBINFO = uintptr type _NOTIFYICONDATAA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhWnd HWND FuID UINT FuFlags UINT FuCallbackMessage UINT F__ccgo_pad2 [4]byte FhIcon HICON FszTip [128]CHAR FdwState DWORD FdwStateMask DWORD FszInfo [256]CHAR Fu struct{ FuTimeout UINT } FszInfoTitle [64]CHAR FdwInfoFlags DWORD FguidItem GUID } type NOTIFYICONDATAA = _NOTIFYICONDATAA type PNOTIFYICONDATAA = uintptr type _NOTIFYICONDATAW = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhWnd HWND FuID UINT FuFlags UINT FuCallbackMessage UINT F__ccgo_pad2 [4]byte FhIcon HICON FszTip [128]WCHAR FdwState DWORD FdwStateMask DWORD FszInfo [256]WCHAR Fu struct{ FuTimeout UINT } FszInfoTitle [64]WCHAR FdwInfoFlags DWORD FguidItem GUID } type NOTIFYICONDATAW = _NOTIFYICONDATAW type PNOTIFYICONDATAW = uintptr type NOTIFYICONDATA = NOTIFYICONDATAA type PNOTIFYICONDATA = PNOTIFYICONDATAA type _NOTIFYICONIDENTIFIER = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhWnd HWND FuID UINT FguidItem GUID F__ccgo_pad2 [4]byte } type NOTIFYICONIDENTIFIER = _NOTIFYICONIDENTIFIER type PNOTIFYICONIDENTIFIER = uintptr type _SHFILEINFOA = struct { FhIcon HICON FiIcon int32 FdwAttributes DWORD FszDisplayName [260]CHAR FszTypeName [80]CHAR F__ccgo_pad1 [4]byte } type SHFILEINFOA = _SHFILEINFOA type _SHFILEINFOW = struct { FhIcon HICON FiIcon int32 FdwAttributes DWORD FszDisplayName [260]WCHAR FszTypeName [80]WCHAR } type SHFILEINFOW = _SHFILEINFOW type SHFILEINFO = SHFILEINFOA type PFNCANSHAREFOLDERW = uintptr type PFNSHOWSHAREFOLDERUIW = uintptr type _PERF_DATA_BLOCK = struct { FSignature [4]WCHAR FLittleEndian DWORD FVersion DWORD FRevision DWORD FTotalByteLength DWORD FHeaderLength DWORD FNumObjectTypes DWORD FDefaultObject LONG FSystemTime SYSTEMTIME F__ccgo_pad1 [4]byte FPerfTime LARGE_INTEGER FPerfFreq LARGE_INTEGER FPerfTime100nSec LARGE_INTEGER FSystemNameLength DWORD FSystemNameOffset DWORD } type PERF_DATA_BLOCK = _PERF_DATA_BLOCK type PPERF_DATA_BLOCK = uintptr type _PERF_OBJECT_TYPE = struct { FTotalByteLength DWORD FDefinitionLength DWORD FHeaderLength DWORD FObjectNameTitleIndex DWORD FObjectNameTitle DWORD FObjectHelpTitleIndex DWORD FObjectHelpTitle DWORD FDetailLevel DWORD FNumCounters DWORD FDefaultCounter LONG FNumInstances LONG FCodePage DWORD FPerfTime LARGE_INTEGER FPerfFreq LARGE_INTEGER } type PERF_OBJECT_TYPE = _PERF_OBJECT_TYPE type PPERF_OBJECT_TYPE = uintptr type _PERF_COUNTER_DEFINITION = struct { FByteLength DWORD FCounterNameTitleIndex DWORD FCounterNameTitle DWORD FCounterHelpTitleIndex DWORD FCounterHelpTitle DWORD FDefaultScale LONG FDetailLevel DWORD FCounterType DWORD FCounterSize DWORD FCounterOffset DWORD } type PERF_COUNTER_DEFINITION = _PERF_COUNTER_DEFINITION type PPERF_COUNTER_DEFINITION = uintptr type _PERF_INSTANCE_DEFINITION = struct { FByteLength DWORD FParentObjectTitleIndex DWORD FParentObjectInstance DWORD FUniqueID LONG FNameOffset DWORD FNameLength DWORD } type PERF_INSTANCE_DEFINITION = _PERF_INSTANCE_DEFINITION type PPERF_INSTANCE_DEFINITION = uintptr type _PERF_COUNTER_BLOCK = struct{ FByteLength DWORD } type PERF_COUNTER_BLOCK = _PERF_COUNTER_BLOCK type PPERF_COUNTER_BLOCK = uintptr type U_char = uint8 type U_short = uint16 type U_int = uint32 type U_long = uint32 type U_int64 = uint64 type in_addr = struct { FS_un struct { F__ccgo_pad1 [0]uint32 FS_un_b struct { Fs_b1 U_char Fs_b2 U_char Fs_b3 U_char Fs_b4 U_char } } } type IN_ADDR = in_addr type PIN_ADDR = uintptr type LPIN_ADDR = uintptr type SOCKET = UINT_PTR type fd_set = struct { Ffd_count U_int F__ccgo_pad1 [4]byte Ffd_array [64]SOCKET } type Fd_set = fd_set type FD_SET = fd_set type PFD_SET = uintptr type LPFD_SET = uintptr type hostent = struct { Fh_name uintptr Fh_aliases uintptr Fh_addrtype int16 Fh_length int16 F__ccgo_pad1 [4]byte Fh_addr_list uintptr } type netent = struct { Fn_name uintptr Fn_aliases uintptr Fn_addrtype int16 F__ccgo_pad1 [2]byte Fn_net U_long } type servent = struct { Fs_name uintptr Fs_aliases uintptr Fs_proto uintptr Fs_port int16 F__ccgo_pad1 [6]byte } type protoent = struct { Fp_name uintptr Fp_aliases uintptr Fp_proto int16 F__ccgo_pad1 [6]byte } type sockproto = struct { Fsp_family U_short Fsp_protocol U_short } type linger = struct { Fl_onoff U_short Fl_linger U_short } type sockaddr = struct { Fsa_family U_short Fsa_data [14]int8 } type sockaddr_in = struct { Fsin_family int16 Fsin_port U_short Fsin_addr struct { FS_un struct { F__ccgo_pad1 [0]uint32 FS_un_b struct { Fs_b1 U_char Fs_b2 U_char Fs_b3 U_char Fs_b4 U_char } } } Fsin_zero [8]int8 } type HOSTENT = hostent type PHOSTENT = uintptr type LPHOSTENT = uintptr type SERVENT = servent type PSERVENT = uintptr type LPSERVENT = uintptr type PROTOENT = protoent type PPROTOENT = uintptr type LPPROTOENT = uintptr type SOCKADDR = sockaddr type PSOCKADDR = uintptr type LPSOCKADDR = uintptr type SOCKADDR_IN = sockaddr_in type PSOCKADDR_IN = uintptr type LPSOCKADDR_IN = uintptr type LINGER = linger type PLINGER = uintptr type LPLINGER = uintptr type TIMEVAL = timeval type PTIMEVAL = uintptr type LPTIMEVAL = uintptr type ip_mreq = struct { Fimr_multiaddr struct { FS_un struct { F__ccgo_pad1 [0]uint32 FS_un_b struct { Fs_b1 U_char Fs_b2 U_char Fs_b3 U_char Fs_b4 U_char } } } Fimr_interface struct { FS_un struct { F__ccgo_pad1 [0]uint32 FS_un_b struct { Fs_b1 U_char Fs_b2 U_char Fs_b3 U_char Fs_b4 U_char } } } } type WSAData = struct { FwVersion WORD FwHighVersion WORD FiMaxSockets uint16 FiMaxUdpDg uint16 FlpVendorInfo uintptr FszDescription [257]int8 FszSystemStatus [129]int8 F__ccgo_pad1 [6]byte } type WSADATA = WSAData type LPWSADATA = uintptr type _TRANSMIT_FILE_BUFFERS = struct { FHead LPVOID FHeadLength DWORD F__ccgo_pad1 [4]byte FTail LPVOID FTailLength DWORD F__ccgo_pad2 [4]byte } type TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS type PTRANSMIT_FILE_BUFFERS = uintptr type LPTRANSMIT_FILE_BUFFERS = uintptr type ALG_ID = uint32 // In ncrypt.h too type HCRYPTHASH = ULONG_PTR type HCRYPTKEY = ULONG_PTR type HCRYPTPROV = ULONG_PTR type _CMS_KEY_INFO = struct { FdwVersion DWORD FAlgid ALG_ID FpbOID uintptr FcbOID DWORD F__ccgo_pad1 [4]byte } type CMS_KEY_INFO = _CMS_KEY_INFO type PCMS_KEY_INFO = uintptr type _HMAC_Info = struct { FHashAlgid ALG_ID F__ccgo_pad1 [4]byte FpbInnerString uintptr FcbInnerString DWORD F__ccgo_pad2 [4]byte FpbOuterString uintptr FcbOuterString DWORD F__ccgo_pad3 [4]byte } type HMAC_INFO = _HMAC_Info type PHMAC_INFO = uintptr type _SCHANNEL_ALG = struct { FdwUse DWORD FAlgid ALG_ID FcBits DWORD FdwFlags DWORD FdwReserved DWORD } type SCHANNEL_ALG = _SCHANNEL_ALG type PSCHANNEL_ALG = uintptr type _PROV_ENUMALGS = struct { FaiAlgid ALG_ID FdwBitLen DWORD FdwNameLen DWORD FszName [20]CHAR } type PROV_ENUMALGS = _PROV_ENUMALGS type _PROV_ENUMALGS_EX = struct { FaiAlgid ALG_ID FdwDefaultLen DWORD FdwMinLen DWORD FdwMaxLen DWORD FdwProtocols DWORD FdwNameLen DWORD FszName [20]CHAR FdwLongNameLen DWORD FszLongName [40]CHAR } type PROV_ENUMALGS_EX = _PROV_ENUMALGS_EX type _PUBLICKEYSTRUC = struct { FbType BYTE FbVersion BYTE Freserved WORD FaiKeyAlg ALG_ID } type BLOBHEADER = _PUBLICKEYSTRUC type PUBLICKEYSTRUC = _PUBLICKEYSTRUC type _RSAPUBKEY = struct { Fmagic DWORD Fbitlen DWORD Fpubexp DWORD } type RSAPUBKEY = _RSAPUBKEY type _PUBKEY = struct { Fmagic DWORD Fbitlen DWORD } type DHPUBKEY = _PUBKEY type DSSPUBKEY = _PUBKEY type KEAPUBKEY = _PUBKEY type TEKPUBKEY = _PUBKEY type _DSSSEED = struct { Fcounter DWORD Fseed [20]BYTE } type DSSSEED = _DSSSEED type _PUBKEYVER3 = struct { Fmagic DWORD FbitlenP DWORD FbitlenQ DWORD FbitlenJ DWORD FDSSSeed DSSSEED } type DHPUBKEY_VER3 = _PUBKEYVER3 type DSSPUBKEY_VER3 = _PUBKEYVER3 type _PRIVKEYVER3 = struct { Fmagic DWORD FbitlenP DWORD FbitlenQ DWORD FbitlenJ DWORD FbitlenX DWORD FDSSSeed DSSSEED } type DHPRIVKEY_VER3 = _PRIVKEYVER3 type DSSPRIVKEY_VER3 = _PRIVKEYVER3 type _KEY_TYPE_SUBTYPE = struct { FdwKeySpec DWORD FType GUID FSubtype GUID } type KEY_TYPE_SUBTYPE = _KEY_TYPE_SUBTYPE type PKEY_TYPE_SUBTYPE = uintptr type _CERT_FORTEZZA_DATA_PROP = struct { FSerialNumber [8]uint8 FCertIndex int32 FCertLabel [36]uint8 } type CERT_FORTEZZA_DATA_PROP = _CERT_FORTEZZA_DATA_PROP type _CRYPT_RC4_KEY_STATE = struct { FKey [16]uint8 FSBox [256]uint8 Fi uint8 Fj uint8 } type CRYPT_RC4_KEY_STATE = _CRYPT_RC4_KEY_STATE type PCRYPT_RC4_KEY_STATE = uintptr type _CRYPT_DES_KEY_STATE = struct { FKey [8]uint8 FIV [8]uint8 FFeedback [8]uint8 } type CRYPT_DES_KEY_STATE = _CRYPT_DES_KEY_STATE type PCRYPT_DES_KEY_STATE = uintptr type _CRYPT_3DES_KEY_STATE = struct { FKey [24]uint8 FIV [8]uint8 FFeedback [8]uint8 } type CRYPT_3DES_KEY_STATE = _CRYPT_3DES_KEY_STATE type PCRYPT_3DES_KEY_STATE = uintptr type _CRYPTOAPI_BLOB = struct { FcbData DWORD F__ccgo_pad1 [4]byte FpbData uintptr } type CRYPT_INTEGER_BLOB = _CRYPTOAPI_BLOB type PCRYPT_INTEGER_BLOB = uintptr type CRYPT_UINT_BLOB = _CRYPTOAPI_BLOB type PCRYPT_UINT_BLOB = uintptr type CRYPT_OBJID_BLOB = _CRYPTOAPI_BLOB type PCRYPT_OBJID_BLOB = uintptr type CERT_NAME_BLOB = _CRYPTOAPI_BLOB type PCERT_NAME_BLOB = uintptr type CERT_RDN_VALUE_BLOB = _CRYPTOAPI_BLOB type PCERT_RDN_VALUE_BLOB = uintptr type CERT_BLOB = _CRYPTOAPI_BLOB type PCERT_BLOB = uintptr type CRL_BLOB = _CRYPTOAPI_BLOB type PCRL_BLOB = uintptr type DATA_BLOB = _CRYPTOAPI_BLOB type PDATA_BLOB = uintptr type CRYPT_DATA_BLOB = _CRYPTOAPI_BLOB type PCRYPT_DATA_BLOB = uintptr type CRYPT_HASH_BLOB = _CRYPTOAPI_BLOB type PCRYPT_HASH_BLOB = uintptr type CRYPT_DIGEST_BLOB = _CRYPTOAPI_BLOB type PCRYPT_DIGEST_BLOB = uintptr type CRYPT_DER_BLOB = _CRYPTOAPI_BLOB type PCRYPT_DER_BLOB = uintptr type CRYPT_ATTR_BLOB = _CRYPTOAPI_BLOB type PCRYPT_ATTR_BLOB = uintptr type _CMS_DH_KEY_INFO = struct { FdwVersion DWORD FAlgid ALG_ID FpszContentEncObjId LPSTR FPubInfo CRYPT_DATA_BLOB FpReserved uintptr } type CMS_DH_KEY_INFO = _CMS_DH_KEY_INFO type PCMS_DH_KEY_INFO = uintptr type HCRYPTPROV_OR_NCRYPT_KEY_HANDLE = ULONG_PTR type HCRYPTPROV_LEGACY = ULONG_PTR type NTSTATUS = LONG type PNTSTATUS = uintptr type __BCRYPT_KEY_LENGTHS_STRUCT = struct { FdwMinLength ULONG FdwMaxLength ULONG FdwIncrement ULONG } type BCRYPT_KEY_LENGTHS_STRUCT = __BCRYPT_KEY_LENGTHS_STRUCT type BCRYPT_AUTH_TAG_LENGTHS_STRUCT = BCRYPT_KEY_LENGTHS_STRUCT type _BCRYPT_OID = struct { FcbOID ULONG F__ccgo_pad1 [4]byte FpbOID PUCHAR } type BCRYPT_OID = _BCRYPT_OID type _BCRYPT_OID_LIST = struct { FdwOIDCount ULONG F__ccgo_pad1 [4]byte FpOIDs uintptr } type BCRYPT_OID_LIST = _BCRYPT_OID_LIST type _BCRYPT_PKCS1_PADDING_INFO = struct{ FpszAlgId LPCWSTR } type BCRYPT_PKCS1_PADDING_INFO = _BCRYPT_PKCS1_PADDING_INFO type _BCRYPT_PSS_PADDING_INFO = struct { FpszAlgId LPCWSTR FcbSalt ULONG F__ccgo_pad1 [4]byte } type BCRYPT_PSS_PADDING_INFO = _BCRYPT_PSS_PADDING_INFO type _BCRYPT_OAEP_PADDING_INFO = struct { FpszAlgId LPCWSTR FpbLabel PUCHAR FcbLabel ULONG F__ccgo_pad1 [4]byte } type BCRYPT_OAEP_PADDING_INFO = _BCRYPT_OAEP_PADDING_INFO type _BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = struct { FcbSize ULONG FdwInfoVersion ULONG FpbNonce PUCHAR FcbNonce ULONG F__ccgo_pad1 [4]byte FpbAuthData PUCHAR FcbAuthData ULONG F__ccgo_pad2 [4]byte FpbTag PUCHAR FcbTag ULONG F__ccgo_pad3 [4]byte FpbMacContext PUCHAR FcbMacContext ULONG FcbAAD ULONG FcbData ULONGLONG FdwFlags ULONG F__ccgo_pad4 [4]byte } type BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = _BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO type PBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = uintptr type _BCryptBuffer = struct { FcbBuffer ULONG FBufferType ULONG FpvBuffer PVOID } type BCryptBuffer = _BCryptBuffer type PBCryptBuffer = uintptr type _BCryptBufferDesc = struct { FulVersion ULONG FcBuffers ULONG FpBuffers PBCryptBuffer } type BCryptBufferDesc = _BCryptBufferDesc type PBCryptBufferDesc = uintptr type BCRYPT_HANDLE = PVOID type BCRYPT_ALG_HANDLE = PVOID type BCRYPT_KEY_HANDLE = PVOID type BCRYPT_HASH_HANDLE = PVOID type BCRYPT_SECRET_HANDLE = PVOID type _BCRYPT_KEY_BLOB = struct{ FMagic ULONG } type BCRYPT_KEY_BLOB = _BCRYPT_KEY_BLOB type _BCRYPT_RSAKEY_BLOB = struct { FMagic ULONG FBitLength ULONG FcbPublicExp ULONG FcbModulus ULONG FcbPrime1 ULONG FcbPrime2 ULONG } type BCRYPT_RSAKEY_BLOB = _BCRYPT_RSAKEY_BLOB type _BCRYPT_ECCKEY_BLOB = struct { FdwMagic ULONG FcbKey ULONG } type BCRYPT_ECCKEY_BLOB = _BCRYPT_ECCKEY_BLOB type PBCRYPT_ECCKEY_BLOB = uintptr type _BCRYPT_DH_KEY_BLOB = struct { FdwMagic ULONG FcbKey ULONG } type BCRYPT_DH_KEY_BLOB = _BCRYPT_DH_KEY_BLOB type PBCRYPT_DH_KEY_BLOB = uintptr type _BCRYPT_DH_PARAMETER_HEADER = struct { FcbLength ULONG FdwMagic ULONG FcbKeyLength ULONG } type BCRYPT_DH_PARAMETER_HEADER = _BCRYPT_DH_PARAMETER_HEADER type _BCRYPT_DSA_KEY_BLOB = struct { FdwMagic ULONG FcbKey ULONG FCount [4]UCHAR FSeed [20]UCHAR Fq [20]UCHAR } type BCRYPT_DSA_KEY_BLOB = _BCRYPT_DSA_KEY_BLOB type PBCRYPT_DSA_KEY_BLOB = uintptr type HASHALGORITHM_ENUM = uint32 type DSAFIPSVERSION_ENUM = uint32 type _BCRYPT_DSA_KEY_BLOB_V2 = struct { FdwMagic ULONG FcbKey ULONG FhashAlgorithm HASHALGORITHM_ENUM FstandardVersion DSAFIPSVERSION_ENUM FcbSeedLength ULONG FcbGroupSize ULONG FCount [4]UCHAR } type BCRYPT_DSA_KEY_BLOB_V2 = _BCRYPT_DSA_KEY_BLOB_V2 type PBCRYPT_DSA_KEY_BLOB_V2 = uintptr type _BCRYPT_KEY_DATA_BLOB_HEADER = struct { FdwMagic ULONG FdwVersion ULONG FcbKeyData ULONG } type BCRYPT_KEY_DATA_BLOB_HEADER = _BCRYPT_KEY_DATA_BLOB_HEADER type PBCRYPT_KEY_DATA_BLOB_HEADER = uintptr type _BCRYPT_DSA_PARAMETER_HEADER = struct { FcbLength ULONG FdwMagic ULONG FcbKeyLength ULONG FCount [4]UCHAR FSeed [20]UCHAR Fq [20]UCHAR } type BCRYPT_DSA_PARAMETER_HEADER = _BCRYPT_DSA_PARAMETER_HEADER type _BCRYPT_DSA_PARAMETER_HEADER_V2 = struct { FcbLength ULONG FdwMagic ULONG FcbKeyLength ULONG FhashAlgorithm HASHALGORITHM_ENUM FstandardVersion DSAFIPSVERSION_ENUM FcbSeedLength ULONG FcbGroupSize ULONG FCount [4]UCHAR } type BCRYPT_DSA_PARAMETER_HEADER_V2 = _BCRYPT_DSA_PARAMETER_HEADER_V2 type _BCRYPT_ALGORITHM_IDENTIFIER = struct { FpszName LPWSTR FdwClass ULONG FdwFlags ULONG } type BCRYPT_ALGORITHM_IDENTIFIER = _BCRYPT_ALGORITHM_IDENTIFIER type _BCRYPT_PROVIDER_NAME = struct{ FpszProviderName LPWSTR } type BCRYPT_PROVIDER_NAME = _BCRYPT_PROVIDER_NAME type _BCRYPT_INTERFACE_VERSION = struct { FMajorVersion USHORT FMinorVersion USHORT } type BCRYPT_INTERFACE_VERSION = _BCRYPT_INTERFACE_VERSION type PBCRYPT_INTERFACE_VERSION = uintptr type _CRYPT_INTERFACE_REG = struct { FdwInterface ULONG FdwFlags ULONG FcFunctions ULONG F__ccgo_pad1 [4]byte FrgpszFunctions uintptr } type CRYPT_INTERFACE_REG = _CRYPT_INTERFACE_REG type PCRYPT_INTERFACE_REG = uintptr type _CRYPT_IMAGE_REG = struct { FpszImage PWSTR FcInterfaces ULONG F__ccgo_pad1 [4]byte FrgpInterfaces uintptr } type CRYPT_IMAGE_REG = _CRYPT_IMAGE_REG type PCRYPT_IMAGE_REG = uintptr type _CRYPT_PROVIDER_REG = struct { FcAliases ULONG F__ccgo_pad1 [4]byte FrgpszAliases uintptr FpUM PCRYPT_IMAGE_REG FpKM PCRYPT_IMAGE_REG } type CRYPT_PROVIDER_REG = _CRYPT_PROVIDER_REG type PCRYPT_PROVIDER_REG = uintptr type _CRYPT_PROVIDERS = struct { FcProviders ULONG F__ccgo_pad1 [4]byte FrgpszProviders uintptr } type CRYPT_PROVIDERS = _CRYPT_PROVIDERS type PCRYPT_PROVIDERS = uintptr type _CRYPT_CONTEXT_CONFIG = struct { FdwFlags ULONG FdwReserved ULONG } type CRYPT_CONTEXT_CONFIG = _CRYPT_CONTEXT_CONFIG type PCRYPT_CONTEXT_CONFIG = uintptr type _CRYPT_CONTEXT_FUNCTION_CONFIG = struct { FdwFlags ULONG FdwReserved ULONG } type CRYPT_CONTEXT_FUNCTION_CONFIG = _CRYPT_CONTEXT_FUNCTION_CONFIG type PCRYPT_CONTEXT_FUNCTION_CONFIG = uintptr type _CRYPT_CONTEXTS = struct { FcContexts ULONG F__ccgo_pad1 [4]byte FrgpszContexts uintptr } type CRYPT_CONTEXTS = _CRYPT_CONTEXTS type PCRYPT_CONTEXTS = uintptr type _CRYPT_CONTEXT_FUNCTIONS = struct { FcFunctions ULONG F__ccgo_pad1 [4]byte FrgpszFunctions uintptr } type CRYPT_CONTEXT_FUNCTIONS = _CRYPT_CONTEXT_FUNCTIONS type PCRYPT_CONTEXT_FUNCTIONS = uintptr type _CRYPT_CONTEXT_FUNCTION_PROVIDERS = struct { FcProviders ULONG F__ccgo_pad1 [4]byte FrgpszProviders uintptr } type CRYPT_CONTEXT_FUNCTION_PROVIDERS = _CRYPT_CONTEXT_FUNCTION_PROVIDERS type PCRYPT_CONTEXT_FUNCTION_PROVIDERS = uintptr type _CRYPT_PROPERTY_REF = struct { FpszProperty PWSTR FcbValue ULONG F__ccgo_pad1 [4]byte FpbValue PUCHAR } type CRYPT_PROPERTY_REF = _CRYPT_PROPERTY_REF type PCRYPT_PROPERTY_REF = uintptr type _CRYPT_IMAGE_REF = struct { FpszImage PWSTR FdwFlags ULONG F__ccgo_pad1 [4]byte } type CRYPT_IMAGE_REF = _CRYPT_IMAGE_REF type PCRYPT_IMAGE_REF = uintptr type _CRYPT_PROVIDER_REF = struct { FdwInterface ULONG F__ccgo_pad1 [4]byte FpszFunction PWSTR FpszProvider PWSTR FcProperties ULONG F__ccgo_pad2 [4]byte FrgpProperties uintptr FpUM PCRYPT_IMAGE_REF FpKM PCRYPT_IMAGE_REF } type CRYPT_PROVIDER_REF = _CRYPT_PROVIDER_REF type PCRYPT_PROVIDER_REF = uintptr type _CRYPT_PROVIDER_REFS = struct { FcProviders ULONG F__ccgo_pad1 [4]byte FrgpProviders uintptr } type CRYPT_PROVIDER_REFS = _CRYPT_PROVIDER_REFS type PCRYPT_PROVIDER_REFS = uintptr type SECURITY_STATUS = LONG type PFN_NCRYPT_ALLOC = uintptr type PFN_NCRYPT_FREE = uintptr type NCRYPT_ALLOC_PARA1 = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpfnAlloc PFN_NCRYPT_ALLOC FpfnFree PFN_NCRYPT_FREE } type NCRYPT_ALLOC_PARA = NCRYPT_ALLOC_PARA1 type NCryptBuffer = BCryptBuffer type PNCryptBuffer = uintptr type NCryptBufferDesc = BCryptBufferDesc type PNCryptBufferDesc = uintptr type NCRYPT_HANDLE = ULONG_PTR type NCRYPT_PROV_HANDLE = ULONG_PTR type NCRYPT_KEY_HANDLE = ULONG_PTR type NCRYPT_HASH_HANDLE = ULONG_PTR type NCRYPT_SECRET_HANDLE = ULONG_PTR type _NCryptAlgorithmName = struct { FpszName LPWSTR FdwClass DWORD FdwAlgOperations DWORD FdwFlags DWORD F__ccgo_pad1 [4]byte } type NCryptAlgorithmName = _NCryptAlgorithmName type NCryptKeyName1 = struct { FpszName LPWSTR FpszAlgid LPWSTR FdwLegacyKeySpec DWORD FdwFlags DWORD } type NCryptKeyName = NCryptKeyName1 type NCryptProviderName1 = struct { FpszName LPWSTR FpszComment LPWSTR } type NCryptProviderName = NCryptProviderName1 type __NCRYPT_UI_POLICY = struct { FdwVersion DWORD FdwFlags DWORD FpszCreationTitle LPCWSTR FpszFriendlyName LPCWSTR FpszDescription LPCWSTR } type NCRYPT_UI_POLICY = __NCRYPT_UI_POLICY type __NCRYPT_SUPPORTED_LENGTHS = struct { FdwMinLength DWORD FdwMaxLength DWORD FdwIncrement DWORD FdwDefaultLength DWORD } type NCRYPT_SUPPORTED_LENGTHS = __NCRYPT_SUPPORTED_LENGTHS type _CRYPT_BIT_BLOB = struct { FcbData DWORD F__ccgo_pad1 [4]byte FpbData uintptr FcUnusedBits DWORD F__ccgo_pad2 [4]byte } type CRYPT_BIT_BLOB = _CRYPT_BIT_BLOB type PCRYPT_BIT_BLOB = uintptr type _CRYPT_ALGORITHM_IDENTIFIER = struct { FpszObjId LPSTR FParameters CRYPT_OBJID_BLOB } type CRYPT_ALGORITHM_IDENTIFIER = _CRYPT_ALGORITHM_IDENTIFIER type PCRYPT_ALGORITHM_IDENTIFIER = uintptr type _CRYPT_OBJID_TABLE = struct { FdwAlgId DWORD F__ccgo_pad1 [4]byte FpszObjId LPCSTR } type CRYPT_OBJID_TABLE = _CRYPT_OBJID_TABLE type PCRYPT_OBJID_TABLE = uintptr type _CRYPT_HASH_INFO = struct { FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FHash CRYPT_HASH_BLOB } type CRYPT_HASH_INFO = _CRYPT_HASH_INFO type PCRYPT_HASH_INFO = uintptr type _CERT_EXTENSION = struct { FpszObjId LPSTR FfCritical WINBOOL F__ccgo_pad1 [4]byte FValue CRYPT_OBJID_BLOB } type CERT_EXTENSION = _CERT_EXTENSION type PCERT_EXTENSION = uintptr type PCCERT_EXTENSION = uintptr type _CRYPT_ATTRIBUTE_TYPE_VALUE = struct { FpszObjId LPSTR FValue CRYPT_OBJID_BLOB } type CRYPT_ATTRIBUTE_TYPE_VALUE = _CRYPT_ATTRIBUTE_TYPE_VALUE type PCRYPT_ATTRIBUTE_TYPE_VALUE = uintptr type _CRYPT_ATTRIBUTE = struct { FpszObjId LPSTR FcValue DWORD F__ccgo_pad1 [4]byte FrgValue PCRYPT_ATTR_BLOB } type CRYPT_ATTRIBUTE = _CRYPT_ATTRIBUTE type PCRYPT_ATTRIBUTE = uintptr type _CRYPT_ATTRIBUTES = struct { FcAttr DWORD F__ccgo_pad1 [4]byte FrgAttr PCRYPT_ATTRIBUTE } type CRYPT_ATTRIBUTES = _CRYPT_ATTRIBUTES type PCRYPT_ATTRIBUTES = uintptr type _CERT_RDN_ATTR = struct { FpszObjId LPSTR FdwValueType DWORD F__ccgo_pad1 [4]byte FValue CERT_RDN_VALUE_BLOB } type CERT_RDN_ATTR = _CERT_RDN_ATTR type PCERT_RDN_ATTR = uintptr type _CERT_RDN = struct { FcRDNAttr DWORD F__ccgo_pad1 [4]byte FrgRDNAttr PCERT_RDN_ATTR } type CERT_RDN = _CERT_RDN type PCERT_RDN = uintptr type _CERT_NAME_INFO = struct { FcRDN DWORD F__ccgo_pad1 [4]byte FrgRDN PCERT_RDN } type CERT_NAME_INFO = _CERT_NAME_INFO type PCERT_NAME_INFO = uintptr type _CERT_NAME_VALUE = struct { FdwValueType DWORD F__ccgo_pad1 [4]byte FValue CERT_RDN_VALUE_BLOB } type CERT_NAME_VALUE = _CERT_NAME_VALUE type PCERT_NAME_VALUE = uintptr type _CERT_PUBLIC_KEY_INFO = struct { FAlgorithm CRYPT_ALGORITHM_IDENTIFIER FPublicKey CRYPT_BIT_BLOB } type CERT_PUBLIC_KEY_INFO = _CERT_PUBLIC_KEY_INFO type PCERT_PUBLIC_KEY_INFO = uintptr type _CRYPT_ECC_PRIVATE_KEY_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FPrivateKey CRYPT_DER_BLOB FszCurveOid LPSTR FPublicKey CRYPT_BIT_BLOB } type CRYPT_ECC_PRIVATE_KEY_INFO = _CRYPT_ECC_PRIVATE_KEY_INFO type PCRYPT_ECC_PRIVATE_KEY_INFO = uintptr type _CRYPT_PRIVATE_KEY_INFO = struct { FVersion DWORD F__ccgo_pad1 [4]byte FAlgorithm CRYPT_ALGORITHM_IDENTIFIER FPrivateKey CRYPT_DER_BLOB FpAttributes PCRYPT_ATTRIBUTES } type CRYPT_PRIVATE_KEY_INFO = _CRYPT_PRIVATE_KEY_INFO type PCRYPT_PRIVATE_KEY_INFO = uintptr type _CRYPT_ENCRYPTED_PRIVATE_KEY_INFO = struct { FEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEncryptedPrivateKey CRYPT_DATA_BLOB } type CRYPT_ENCRYPTED_PRIVATE_KEY_INFO = _CRYPT_ENCRYPTED_PRIVATE_KEY_INFO type PCRYPT_ENCRYPTED_PRIVATE_KEY_INFO = uintptr type PCRYPT_DECRYPT_PRIVATE_KEY_FUNC = uintptr type PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC = uintptr type PCRYPT_RESOLVE_HCRYPTPROV_FUNC = uintptr type _CRYPT_PKCS8_IMPORT_PARAMS = struct { FPrivateKey CRYPT_DIGEST_BLOB FpResolvehCryptProvFunc PCRYPT_RESOLVE_HCRYPTPROV_FUNC FpVoidResolveFunc LPVOID FpDecryptPrivateKeyFunc PCRYPT_DECRYPT_PRIVATE_KEY_FUNC FpVoidDecryptFunc LPVOID } type CRYPT_PKCS8_IMPORT_PARAMS = _CRYPT_PKCS8_IMPORT_PARAMS type PCRYPT_PKCS8_IMPORT_PARAMS = uintptr type CRYPT_PRIVATE_KEY_BLOB_AND_PARAMS = _CRYPT_PKCS8_IMPORT_PARAMS type PCRYPT_PRIVATE_KEY_BLOB_AND_PARAMS = uintptr type _CRYPT_PKCS8_EXPORT_PARAMS = struct { FhCryptProv HCRYPTPROV FdwKeySpec DWORD F__ccgo_pad1 [4]byte FpszPrivateKeyObjId LPSTR FpEncryptPrivateKeyFunc PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC FpVoidEncryptFunc LPVOID } type CRYPT_PKCS8_EXPORT_PARAMS = _CRYPT_PKCS8_EXPORT_PARAMS type PCRYPT_PKCS8_EXPORT_PARAMS = uintptr type _CERT_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FSerialNumber CRYPT_INTEGER_BLOB FSignatureAlgorithm CRYPT_ALGORITHM_IDENTIFIER FIssuer CERT_NAME_BLOB FNotBefore FILETIME FNotAfter FILETIME FSubject CERT_NAME_BLOB FSubjectPublicKeyInfo CERT_PUBLIC_KEY_INFO FIssuerUniqueId CRYPT_BIT_BLOB FSubjectUniqueId CRYPT_BIT_BLOB FcExtension DWORD F__ccgo_pad2 [4]byte FrgExtension PCERT_EXTENSION } type CERT_INFO = _CERT_INFO type PCERT_INFO = uintptr type _CRL_ENTRY = struct { FSerialNumber CRYPT_INTEGER_BLOB FRevocationDate FILETIME FcExtension DWORD F__ccgo_pad1 [4]byte FrgExtension PCERT_EXTENSION } type CRL_ENTRY = _CRL_ENTRY type PCRL_ENTRY = uintptr type _CRL_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FSignatureAlgorithm CRYPT_ALGORITHM_IDENTIFIER FIssuer CERT_NAME_BLOB FThisUpdate FILETIME FNextUpdate FILETIME FcCRLEntry DWORD F__ccgo_pad2 [4]byte FrgCRLEntry PCRL_ENTRY FcExtension DWORD F__ccgo_pad3 [4]byte FrgExtension PCERT_EXTENSION } type CRL_INFO = _CRL_INFO type PCRL_INFO = uintptr type _CERT_OR_CRL_BLOB = struct { FdwChoice DWORD FcbEncoded DWORD FpbEncoded uintptr } type CERT_OR_CRL_BLOB = _CERT_OR_CRL_BLOB type PCERT_OR_CRL_BLOB = uintptr type _CERT_OR_CRL_BUNDLE = struct { FcItem DWORD F__ccgo_pad1 [4]byte FrgItem PCERT_OR_CRL_BLOB } type CERT_OR_CRL_BUNDLE = _CERT_OR_CRL_BUNDLE type PCERT_OR_CRL_BUNDLE = uintptr type _CERT_REQUEST_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FSubject CERT_NAME_BLOB FSubjectPublicKeyInfo CERT_PUBLIC_KEY_INFO FcAttribute DWORD F__ccgo_pad2 [4]byte FrgAttribute PCRYPT_ATTRIBUTE } type CERT_REQUEST_INFO = _CERT_REQUEST_INFO type PCERT_REQUEST_INFO = uintptr type _CERT_KEYGEN_REQUEST_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FSubjectPublicKeyInfo CERT_PUBLIC_KEY_INFO FpwszChallengeString LPWSTR } type CERT_KEYGEN_REQUEST_INFO = _CERT_KEYGEN_REQUEST_INFO type PCERT_KEYGEN_REQUEST_INFO = uintptr type _CERT_SIGNED_CONTENT_INFO = struct { FToBeSigned CRYPT_DER_BLOB FSignatureAlgorithm CRYPT_ALGORITHM_IDENTIFIER FSignature CRYPT_BIT_BLOB } type CERT_SIGNED_CONTENT_INFO = _CERT_SIGNED_CONTENT_INFO type PCERT_SIGNED_CONTENT_INFO = uintptr type _CTL_USAGE = struct { FcUsageIdentifier DWORD F__ccgo_pad1 [4]byte FrgpszUsageIdentifier uintptr } type CTL_USAGE = _CTL_USAGE type PCTL_USAGE = uintptr type CERT_ENHKEY_USAGE = _CTL_USAGE type PCERT_ENHKEY_USAGE = uintptr type PCCTL_USAGE = uintptr type PCCERT_ENHKEY_USAGE = uintptr type _CTL_ENTRY = struct { FSubjectIdentifier CRYPT_DATA_BLOB FcAttribute DWORD F__ccgo_pad1 [4]byte FrgAttribute PCRYPT_ATTRIBUTE } type CTL_ENTRY = _CTL_ENTRY type PCTL_ENTRY = uintptr type _CTL_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FSubjectUsage CTL_USAGE FListIdentifier CRYPT_DATA_BLOB FSequenceNumber CRYPT_INTEGER_BLOB FThisUpdate FILETIME FNextUpdate FILETIME FSubjectAlgorithm CRYPT_ALGORITHM_IDENTIFIER FcCTLEntry DWORD F__ccgo_pad2 [4]byte FrgCTLEntry PCTL_ENTRY FcExtension DWORD F__ccgo_pad3 [4]byte FrgExtension PCERT_EXTENSION } type CTL_INFO = _CTL_INFO type PCTL_INFO = uintptr type _CRYPT_TIME_STAMP_REQUEST_INFO = struct { FpszTimeStampAlgorithm LPSTR FpszContentType LPSTR FContent CRYPT_OBJID_BLOB FcAttribute DWORD F__ccgo_pad1 [4]byte FrgAttribute PCRYPT_ATTRIBUTE } type CRYPT_TIME_STAMP_REQUEST_INFO = _CRYPT_TIME_STAMP_REQUEST_INFO type PCRYPT_TIME_STAMP_REQUEST_INFO = uintptr type _CRYPT_ENROLLMENT_NAME_VALUE_PAIR = struct { FpwszName LPWSTR FpwszValue LPWSTR } type CRYPT_ENROLLMENT_NAME_VALUE_PAIR = _CRYPT_ENROLLMENT_NAME_VALUE_PAIR type PCRYPT_ENROLLMENT_NAME_VALUE_PAIR = uintptr type _CRYPT_CSP_PROVIDER = struct { FdwKeySpec DWORD F__ccgo_pad1 [4]byte FpwszProviderName LPWSTR FSignature CRYPT_BIT_BLOB } type CRYPT_CSP_PROVIDER = _CRYPT_CSP_PROVIDER type PCRYPT_CSP_PROVIDER = uintptr type PFN_CRYPT_ALLOC = uintptr type PFN_CRYPT_FREE = uintptr type _CRYPT_ENCODE_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpfnAlloc PFN_CRYPT_ALLOC FpfnFree PFN_CRYPT_FREE } type CRYPT_ENCODE_PARA = _CRYPT_ENCODE_PARA type PCRYPT_ENCODE_PARA = uintptr type _CRYPT_DECODE_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpfnAlloc PFN_CRYPT_ALLOC FpfnFree PFN_CRYPT_FREE } type CRYPT_DECODE_PARA = _CRYPT_DECODE_PARA type PCRYPT_DECODE_PARA = uintptr type _CERT_EXTENSIONS = struct { FcExtension DWORD F__ccgo_pad1 [4]byte FrgExtension PCERT_EXTENSION } type CERT_EXTENSIONS = _CERT_EXTENSIONS type PCERT_EXTENSIONS = uintptr type _CERT_AUTHORITY_KEY_ID_INFO = struct { FKeyId CRYPT_DATA_BLOB FCertIssuer CERT_NAME_BLOB FCertSerialNumber CRYPT_INTEGER_BLOB } type CERT_AUTHORITY_KEY_ID_INFO = _CERT_AUTHORITY_KEY_ID_INFO type PCERT_AUTHORITY_KEY_ID_INFO = uintptr type _CERT_PRIVATE_KEY_VALIDITY = struct { FNotBefore FILETIME FNotAfter FILETIME } type CERT_PRIVATE_KEY_VALIDITY = _CERT_PRIVATE_KEY_VALIDITY type PCERT_PRIVATE_KEY_VALIDITY = uintptr type _CERT_KEY_ATTRIBUTES_INFO = struct { FKeyId CRYPT_DATA_BLOB FIntendedKeyUsage CRYPT_BIT_BLOB FpPrivateKeyUsagePeriod PCERT_PRIVATE_KEY_VALIDITY } type CERT_KEY_ATTRIBUTES_INFO = _CERT_KEY_ATTRIBUTES_INFO type PCERT_KEY_ATTRIBUTES_INFO = uintptr type _CERT_POLICY_ID = struct { FcCertPolicyElementId DWORD F__ccgo_pad1 [4]byte FrgpszCertPolicyElementId uintptr } type CERT_POLICY_ID = _CERT_POLICY_ID type PCERT_POLICY_ID = uintptr type _CERT_KEY_USAGE_RESTRICTION_INFO = struct { FcCertPolicyId DWORD F__ccgo_pad1 [4]byte FrgCertPolicyId PCERT_POLICY_ID FRestrictedKeyUsage CRYPT_BIT_BLOB } type CERT_KEY_USAGE_RESTRICTION_INFO = _CERT_KEY_USAGE_RESTRICTION_INFO type PCERT_KEY_USAGE_RESTRICTION_INFO = uintptr type _CERT_OTHER_NAME = struct { FpszObjId LPSTR FValue CRYPT_OBJID_BLOB } type CERT_OTHER_NAME = _CERT_OTHER_NAME type PCERT_OTHER_NAME = uintptr type _CERT_ALT_NAME_ENTRY = struct { FdwAltNameChoice DWORD F__ccgo_pad1 [4]byte F__8 struct { FpOtherName PCERT_OTHER_NAME F__ccgo_pad1 [8]byte } } type CERT_ALT_NAME_ENTRY = _CERT_ALT_NAME_ENTRY type PCERT_ALT_NAME_ENTRY = uintptr type _CERT_ALT_NAME_INFO = struct { FcAltEntry DWORD F__ccgo_pad1 [4]byte FrgAltEntry PCERT_ALT_NAME_ENTRY } type CERT_ALT_NAME_INFO = _CERT_ALT_NAME_INFO type PCERT_ALT_NAME_INFO = uintptr type _CERT_BASIC_CONSTRAINTS_INFO = struct { FSubjectType CRYPT_BIT_BLOB FfPathLenConstraint WINBOOL FdwPathLenConstraint DWORD FcSubtreesConstraint DWORD F__ccgo_pad1 [4]byte FrgSubtreesConstraint uintptr } type CERT_BASIC_CONSTRAINTS_INFO = _CERT_BASIC_CONSTRAINTS_INFO type PCERT_BASIC_CONSTRAINTS_INFO = uintptr type _CERT_BASIC_CONSTRAINTS2_INFO = struct { FfCA WINBOOL FfPathLenConstraint WINBOOL FdwPathLenConstraint DWORD } type CERT_BASIC_CONSTRAINTS2_INFO = _CERT_BASIC_CONSTRAINTS2_INFO type PCERT_BASIC_CONSTRAINTS2_INFO = uintptr type _CERT_POLICY_QUALIFIER_INFO = struct { FpszPolicyQualifierId LPSTR FQualifier CRYPT_OBJID_BLOB } type CERT_POLICY_QUALIFIER_INFO = _CERT_POLICY_QUALIFIER_INFO type PCERT_POLICY_QUALIFIER_INFO = uintptr type _CERT_POLICY_INFO = struct { FpszPolicyIdentifier LPSTR FcPolicyQualifier DWORD F__ccgo_pad1 [4]byte FrgPolicyQualifier uintptr } type CERT_POLICY_INFO = _CERT_POLICY_INFO type PCERT_POLICY_INFO = uintptr type _CERT_POLICIES_INFO = struct { FcPolicyInfo DWORD F__ccgo_pad1 [4]byte FrgPolicyInfo uintptr } type CERT_POLICIES_INFO = _CERT_POLICIES_INFO type PCERT_POLICIES_INFO = uintptr type _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE = struct { FpszOrganization LPSTR FcNoticeNumbers DWORD F__ccgo_pad1 [4]byte FrgNoticeNumbers uintptr } type CERT_POLICY_QUALIFIER_NOTICE_REFERENCE = _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE type PCERT_POLICY_QUALIFIER_NOTICE_REFERENCE = uintptr type _CERT_POLICY_QUALIFIER_USER_NOTICE = struct { FpNoticeReference uintptr FpszDisplayText LPWSTR } type CERT_POLICY_QUALIFIER_USER_NOTICE = _CERT_POLICY_QUALIFIER_USER_NOTICE type PCERT_POLICY_QUALIFIER_USER_NOTICE = uintptr type _CPS_URLS = struct { FpszURL LPWSTR FpAlgorithm uintptr FpDigest uintptr } type CPS_URLS = _CPS_URLS type PCPS_URLS = uintptr type _CERT_POLICY95_QUALIFIER1 = struct { FpszPracticesReference LPWSTR FpszNoticeIdentifier LPSTR FpszNSINoticeIdentifier LPSTR FcCPSURLs DWORD F__ccgo_pad1 [4]byte FrgCPSURLs uintptr } type CERT_POLICY95_QUALIFIER1 = _CERT_POLICY95_QUALIFIER1 type PCERT_POLICY95_QUALIFIER1 = uintptr type _CERT_POLICY_MAPPING = struct { FpszIssuerDomainPolicy LPSTR FpszSubjectDomainPolicy LPSTR } type CERT_POLICY_MAPPING = _CERT_POLICY_MAPPING type PCERT_POLICY_MAPPING = uintptr type _CERT_POLICY_MAPPINGS_INFO = struct { FcPolicyMapping DWORD F__ccgo_pad1 [4]byte FrgPolicyMapping PCERT_POLICY_MAPPING } type CERT_POLICY_MAPPINGS_INFO = _CERT_POLICY_MAPPINGS_INFO type PCERT_POLICY_MAPPINGS_INFO = uintptr type _CERT_POLICY_CONSTRAINTS_INFO = struct { FfRequireExplicitPolicy WINBOOL FdwRequireExplicitPolicySkipCerts DWORD FfInhibitPolicyMapping WINBOOL FdwInhibitPolicyMappingSkipCerts DWORD } type CERT_POLICY_CONSTRAINTS_INFO = _CERT_POLICY_CONSTRAINTS_INFO type PCERT_POLICY_CONSTRAINTS_INFO = uintptr type _CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY = struct { FpszObjId LPSTR FcValue DWORD F__ccgo_pad1 [4]byte FrgValue PCRYPT_DER_BLOB } type CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY = _CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY type PCRYPT_CONTENT_INFO_SEQUENCE_OF_ANY = uintptr type _CRYPT_CONTENT_INFO = struct { FpszObjId LPSTR FContent CRYPT_DER_BLOB } type CRYPT_CONTENT_INFO = _CRYPT_CONTENT_INFO type PCRYPT_CONTENT_INFO = uintptr type _CRYPT_SEQUENCE_OF_ANY = struct { FcValue DWORD F__ccgo_pad1 [4]byte FrgValue PCRYPT_DER_BLOB } type CRYPT_SEQUENCE_OF_ANY = _CRYPT_SEQUENCE_OF_ANY type PCRYPT_SEQUENCE_OF_ANY = uintptr type _CERT_AUTHORITY_KEY_ID2_INFO = struct { FKeyId CRYPT_DATA_BLOB FAuthorityCertIssuer CERT_ALT_NAME_INFO FAuthorityCertSerialNumber CRYPT_INTEGER_BLOB } type CERT_AUTHORITY_KEY_ID2_INFO = _CERT_AUTHORITY_KEY_ID2_INFO type PCERT_AUTHORITY_KEY_ID2_INFO = uintptr type _CERT_ACCESS_DESCRIPTION = struct { FpszAccessMethod LPSTR FAccessLocation CERT_ALT_NAME_ENTRY } type CERT_ACCESS_DESCRIPTION = _CERT_ACCESS_DESCRIPTION type PCERT_ACCESS_DESCRIPTION = uintptr type _CERT_AUTHORITY_INFO_ACCESS = struct { FcAccDescr DWORD F__ccgo_pad1 [4]byte FrgAccDescr PCERT_ACCESS_DESCRIPTION } type CERT_AUTHORITY_INFO_ACCESS = _CERT_AUTHORITY_INFO_ACCESS type PCERT_AUTHORITY_INFO_ACCESS = uintptr type CERT_SUBJECT_INFO_ACCESS = CERT_AUTHORITY_INFO_ACCESS type PCERT_SUBJECT_INFO_ACCESS = uintptr type _CRL_DIST_POINT_NAME = struct { FdwDistPointNameChoice DWORD F__ccgo_pad1 [4]byte F__8 struct{ FFullName CERT_ALT_NAME_INFO } } type CRL_DIST_POINT_NAME = _CRL_DIST_POINT_NAME type PCRL_DIST_POINT_NAME = uintptr type _CRL_DIST_POINT = struct { FDistPointName CRL_DIST_POINT_NAME FReasonFlags CRYPT_BIT_BLOB FCRLIssuer CERT_ALT_NAME_INFO } type CRL_DIST_POINT = _CRL_DIST_POINT type PCRL_DIST_POINT = uintptr type _CRL_DIST_POINTS_INFO = struct { FcDistPoint DWORD F__ccgo_pad1 [4]byte FrgDistPoint PCRL_DIST_POINT } type CRL_DIST_POINTS_INFO = _CRL_DIST_POINTS_INFO type PCRL_DIST_POINTS_INFO = uintptr type _CROSS_CERT_DIST_POINTS_INFO = struct { FdwSyncDeltaTime DWORD FcDistPoint DWORD FrgDistPoint PCERT_ALT_NAME_INFO } type CROSS_CERT_DIST_POINTS_INFO = _CROSS_CERT_DIST_POINTS_INFO type PCROSS_CERT_DIST_POINTS_INFO = uintptr type _CERT_PAIR = struct { FForward CERT_BLOB FReverse CERT_BLOB } type CERT_PAIR = _CERT_PAIR type PCERT_PAIR = uintptr type _CRL_ISSUING_DIST_POINT = struct { FDistPointName CRL_DIST_POINT_NAME FfOnlyContainsUserCerts WINBOOL FfOnlyContainsCACerts WINBOOL FOnlySomeReasonFlags CRYPT_BIT_BLOB FfIndirectCRL WINBOOL F__ccgo_pad1 [4]byte } type CRL_ISSUING_DIST_POINT = _CRL_ISSUING_DIST_POINT type PCRL_ISSUING_DIST_POINT = uintptr type _CERT_GENERAL_SUBTREE = struct { FBase CERT_ALT_NAME_ENTRY FdwMinimum DWORD FfMaximum WINBOOL FdwMaximum DWORD F__ccgo_pad1 [4]byte } type CERT_GENERAL_SUBTREE = _CERT_GENERAL_SUBTREE type PCERT_GENERAL_SUBTREE = uintptr type _CERT_NAME_CONSTRAINTS_INFO = struct { FcPermittedSubtree DWORD F__ccgo_pad1 [4]byte FrgPermittedSubtree PCERT_GENERAL_SUBTREE FcExcludedSubtree DWORD F__ccgo_pad2 [4]byte FrgExcludedSubtree PCERT_GENERAL_SUBTREE } type CERT_NAME_CONSTRAINTS_INFO = _CERT_NAME_CONSTRAINTS_INFO type PCERT_NAME_CONSTRAINTS_INFO = uintptr type _CERT_DSS_PARAMETERS = struct { Fp CRYPT_UINT_BLOB Fq CRYPT_UINT_BLOB Fg CRYPT_UINT_BLOB } type CERT_DSS_PARAMETERS = _CERT_DSS_PARAMETERS type PCERT_DSS_PARAMETERS = uintptr type _CERT_DH_PARAMETERS = struct { Fp CRYPT_UINT_BLOB Fg CRYPT_UINT_BLOB } type CERT_DH_PARAMETERS = _CERT_DH_PARAMETERS type PCERT_DH_PARAMETERS = uintptr type _CERT_ECC_SIGNATURE = struct { Fr CRYPT_UINT_BLOB Fs CRYPT_UINT_BLOB } type CERT_ECC_SIGNATURE = _CERT_ECC_SIGNATURE type PCERT_ECC_SIGNATURE = uintptr type _CERT_X942_DH_VALIDATION_PARAMS = struct { Fseed CRYPT_BIT_BLOB FpgenCounter DWORD F__ccgo_pad1 [4]byte } type CERT_X942_DH_VALIDATION_PARAMS = _CERT_X942_DH_VALIDATION_PARAMS type PCERT_X942_DH_VALIDATION_PARAMS = uintptr type _CERT_X942_DH_PARAMETERS = struct { Fp CRYPT_UINT_BLOB Fg CRYPT_UINT_BLOB Fq CRYPT_UINT_BLOB Fj CRYPT_UINT_BLOB FpValidationParams PCERT_X942_DH_VALIDATION_PARAMS } type CERT_X942_DH_PARAMETERS = _CERT_X942_DH_PARAMETERS type PCERT_X942_DH_PARAMETERS = uintptr type _CRYPT_X942_OTHER_INFO = struct { FpszContentEncryptionObjId LPSTR FrgbCounter [4]BYTE FrgbKeyLength [4]BYTE FPubInfo CRYPT_DATA_BLOB } type CRYPT_X942_OTHER_INFO = _CRYPT_X942_OTHER_INFO type PCRYPT_X942_OTHER_INFO = uintptr type _CRYPT_ECC_CMS_SHARED_INFO = struct { FAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEntityUInfo CRYPT_DATA_BLOB FrgbSuppPubInfo [4]BYTE F__ccgo_pad1 [4]byte } type CRYPT_ECC_CMS_SHARED_INFO = _CRYPT_ECC_CMS_SHARED_INFO type PCRYPT_ECC_CMS_SHARED_INFO = uintptr type _CRYPT_RC2_CBC_PARAMETERS = struct { FdwVersion DWORD FfIV WINBOOL FrgbIV [8]BYTE } type CRYPT_RC2_CBC_PARAMETERS = _CRYPT_RC2_CBC_PARAMETERS type PCRYPT_RC2_CBC_PARAMETERS = uintptr type _CRYPT_SMIME_CAPABILITY = struct { FpszObjId LPSTR FParameters CRYPT_OBJID_BLOB } type CRYPT_SMIME_CAPABILITY = _CRYPT_SMIME_CAPABILITY type PCRYPT_SMIME_CAPABILITY = uintptr type _CRYPT_SMIME_CAPABILITIES = struct { FcCapability DWORD F__ccgo_pad1 [4]byte FrgCapability PCRYPT_SMIME_CAPABILITY } type CRYPT_SMIME_CAPABILITIES = _CRYPT_SMIME_CAPABILITIES type PCRYPT_SMIME_CAPABILITIES = uintptr type _CERT_QC_STATEMENT = struct { FpszStatementId LPSTR FStatementInfo CRYPT_OBJID_BLOB } type CERT_QC_STATEMENT = _CERT_QC_STATEMENT type PCERT_QC_STATEMENT = uintptr type _CERT_QC_STATEMENTS_EXT_INFO = struct { FcStatement DWORD F__ccgo_pad1 [4]byte FrgStatement PCERT_QC_STATEMENT } type CERT_QC_STATEMENTS_EXT_INFO = _CERT_QC_STATEMENTS_EXT_INFO type PCERT_QC_STATEMENTS_EXT_INFO = uintptr type _CRYPT_MASK_GEN_ALGORITHM = struct { FpszObjId LPSTR FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER } type CRYPT_MASK_GEN_ALGORITHM = _CRYPT_MASK_GEN_ALGORITHM type PCRYPT_MASK_GEN_ALGORITHM = uintptr type _CRYPT_RSA_SSA_PSS_PARAMETERS = struct { FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FMaskGenAlgorithm CRYPT_MASK_GEN_ALGORITHM FdwSaltLength DWORD FdwTrailerField DWORD } type CRYPT_RSA_SSA_PSS_PARAMETERS = _CRYPT_RSA_SSA_PSS_PARAMETERS type PCRYPT_RSA_SSA_PSS_PARAMETERS = uintptr type _CRYPT_PSOURCE_ALGORITHM = struct { FpszObjId LPSTR FEncodingParameters CRYPT_DATA_BLOB } type CRYPT_PSOURCE_ALGORITHM = _CRYPT_PSOURCE_ALGORITHM type PCRYPT_PSOURCE_ALGORITHM = uintptr type _CRYPT_RSAES_OAEP_PARAMETERS = struct { FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FMaskGenAlgorithm CRYPT_MASK_GEN_ALGORITHM FPSourceAlgorithm CRYPT_PSOURCE_ALGORITHM } type CRYPT_RSAES_OAEP_PARAMETERS = _CRYPT_RSAES_OAEP_PARAMETERS type PCRYPT_RSAES_OAEP_PARAMETERS = uintptr type _CMC_TAGGED_ATTRIBUTE = struct { FdwBodyPartID DWORD F__ccgo_pad1 [4]byte FAttribute CRYPT_ATTRIBUTE } type CMC_TAGGED_ATTRIBUTE = _CMC_TAGGED_ATTRIBUTE type PCMC_TAGGED_ATTRIBUTE = uintptr type _CMC_TAGGED_CERT_REQUEST = struct { FdwBodyPartID DWORD F__ccgo_pad1 [4]byte FSignedCertRequest CRYPT_DER_BLOB } type CMC_TAGGED_CERT_REQUEST = _CMC_TAGGED_CERT_REQUEST type PCMC_TAGGED_CERT_REQUEST = uintptr type _CMC_TAGGED_REQUEST = struct { FdwTaggedRequestChoice DWORD F__ccgo_pad1 [4]byte F__8 struct{ FpTaggedCertRequest PCMC_TAGGED_CERT_REQUEST } } type CMC_TAGGED_REQUEST = _CMC_TAGGED_REQUEST type PCMC_TAGGED_REQUEST = uintptr type _CMC_TAGGED_CONTENT_INFO = struct { FdwBodyPartID DWORD F__ccgo_pad1 [4]byte FEncodedContentInfo CRYPT_DER_BLOB } type CMC_TAGGED_CONTENT_INFO = _CMC_TAGGED_CONTENT_INFO type PCMC_TAGGED_CONTENT_INFO = uintptr type _CMC_TAGGED_OTHER_MSG = struct { FdwBodyPartID DWORD F__ccgo_pad1 [4]byte FpszObjId LPSTR FValue CRYPT_OBJID_BLOB } type CMC_TAGGED_OTHER_MSG = _CMC_TAGGED_OTHER_MSG type PCMC_TAGGED_OTHER_MSG = uintptr type _CMC_DATA_INFO = struct { FcTaggedAttribute DWORD F__ccgo_pad1 [4]byte FrgTaggedAttribute PCMC_TAGGED_ATTRIBUTE FcTaggedRequest DWORD F__ccgo_pad2 [4]byte FrgTaggedRequest PCMC_TAGGED_REQUEST FcTaggedContentInfo DWORD F__ccgo_pad3 [4]byte FrgTaggedContentInfo PCMC_TAGGED_CONTENT_INFO FcTaggedOtherMsg DWORD F__ccgo_pad4 [4]byte FrgTaggedOtherMsg PCMC_TAGGED_OTHER_MSG } type CMC_DATA_INFO = _CMC_DATA_INFO type PCMC_DATA_INFO = uintptr type _CMC_RESPONSE_INFO = struct { FcTaggedAttribute DWORD F__ccgo_pad1 [4]byte FrgTaggedAttribute PCMC_TAGGED_ATTRIBUTE FcTaggedContentInfo DWORD F__ccgo_pad2 [4]byte FrgTaggedContentInfo PCMC_TAGGED_CONTENT_INFO FcTaggedOtherMsg DWORD F__ccgo_pad3 [4]byte FrgTaggedOtherMsg PCMC_TAGGED_OTHER_MSG } type CMC_RESPONSE_INFO = _CMC_RESPONSE_INFO type PCMC_RESPONSE_INFO = uintptr type _CMC_PEND_INFO = struct { FPendToken CRYPT_DATA_BLOB FPendTime FILETIME } type CMC_PEND_INFO = _CMC_PEND_INFO type PCMC_PEND_INFO = uintptr type _CMC_STATUS_INFO = struct { FdwStatus DWORD FcBodyList DWORD FrgdwBodyList uintptr FpwszStatusString LPWSTR FdwOtherInfoChoice DWORD F__ccgo_pad1 [4]byte F__32 struct { F__ccgo_pad1 [0]uint64 FdwFailInfo DWORD F__ccgo_pad2 [4]byte } } type CMC_STATUS_INFO = _CMC_STATUS_INFO type PCMC_STATUS_INFO = uintptr type _CMC_ADD_EXTENSIONS_INFO = struct { FdwCmcDataReference DWORD FcCertReference DWORD FrgdwCertReference uintptr FcExtension DWORD F__ccgo_pad1 [4]byte FrgExtension PCERT_EXTENSION } type CMC_ADD_EXTENSIONS_INFO = _CMC_ADD_EXTENSIONS_INFO type PCMC_ADD_EXTENSIONS_INFO = uintptr type _CMC_ADD_ATTRIBUTES_INFO = struct { FdwCmcDataReference DWORD FcCertReference DWORD FrgdwCertReference uintptr FcAttribute DWORD F__ccgo_pad1 [4]byte FrgAttribute PCRYPT_ATTRIBUTE } type CMC_ADD_ATTRIBUTES_INFO = _CMC_ADD_ATTRIBUTES_INFO type PCMC_ADD_ATTRIBUTES_INFO = uintptr type _CERT_TEMPLATE_EXT = struct { FpszObjId LPSTR FdwMajorVersion DWORD FfMinorVersion WINBOOL FdwMinorVersion DWORD F__ccgo_pad1 [4]byte } type CERT_TEMPLATE_EXT = _CERT_TEMPLATE_EXT type PCERT_TEMPLATE_EXT = uintptr type _CERT_HASHED_URL = struct { FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FHash CRYPT_HASH_BLOB FpwszUrl LPWSTR } type CERT_HASHED_URL = _CERT_HASHED_URL type PCERT_HASHED_URL = uintptr type _CERT_LOGOTYPE_DETAILS = struct { FpwszMimeType LPWSTR FcHashedUrl DWORD F__ccgo_pad1 [4]byte FrgHashedUrl PCERT_HASHED_URL } type CERT_LOGOTYPE_DETAILS = _CERT_LOGOTYPE_DETAILS type PCERT_LOGOTYPE_DETAILS = uintptr type _CERT_LOGOTYPE_REFERENCE = struct { FcHashedUrl DWORD F__ccgo_pad1 [4]byte FrgHashedUrl PCERT_HASHED_URL } type CERT_LOGOTYPE_REFERENCE = _CERT_LOGOTYPE_REFERENCE type PCERT_LOGOTYPE_REFERENCE = uintptr type _CERT_LOGOTYPE_IMAGE_INFO = struct { FdwLogotypeImageInfoChoice DWORD FdwFileSize DWORD FdwXSize DWORD FdwYSize DWORD FdwLogotypeImageResolutionChoice DWORD F__20 struct{ FdwNumBits DWORD } FpwszLanguage LPWSTR } type CERT_LOGOTYPE_IMAGE_INFO = _CERT_LOGOTYPE_IMAGE_INFO type PCERT_LOGOTYPE_IMAGE_INFO = uintptr type _CERT_LOGOTYPE_IMAGE = struct { FLogotypeDetails CERT_LOGOTYPE_DETAILS FpLogotypeImageInfo PCERT_LOGOTYPE_IMAGE_INFO } type CERT_LOGOTYPE_IMAGE = _CERT_LOGOTYPE_IMAGE type PCERT_LOGOTYPE_IMAGE = uintptr type _CERT_LOGOTYPE_AUDIO_INFO = struct { FdwFileSize DWORD FdwPlayTime DWORD FdwChannels DWORD FdwSampleRate DWORD FpwszLanguage LPWSTR } type CERT_LOGOTYPE_AUDIO_INFO = _CERT_LOGOTYPE_AUDIO_INFO type PCERT_LOGOTYPE_AUDIO_INFO = uintptr type _CERT_LOGOTYPE_AUDIO = struct { FLogotypeDetails CERT_LOGOTYPE_DETAILS FpLogotypeAudioInfo PCERT_LOGOTYPE_AUDIO_INFO } type CERT_LOGOTYPE_AUDIO = _CERT_LOGOTYPE_AUDIO type PCERT_LOGOTYPE_AUDIO = uintptr type _CERT_LOGOTYPE_DATA = struct { FcLogotypeImage DWORD F__ccgo_pad1 [4]byte FrgLogotypeImage PCERT_LOGOTYPE_IMAGE FcLogotypeAudio DWORD F__ccgo_pad2 [4]byte FrgLogotypeAudio PCERT_LOGOTYPE_AUDIO } type CERT_LOGOTYPE_DATA = _CERT_LOGOTYPE_DATA type PCERT_LOGOTYPE_DATA = uintptr type _CERT_LOGOTYPE_INFO = struct { FdwLogotypeInfoChoice DWORD F__ccgo_pad1 [4]byte F__8 struct{ FpLogotypeDirectInfo PCERT_LOGOTYPE_DATA } } type CERT_LOGOTYPE_INFO = _CERT_LOGOTYPE_INFO type PCERT_LOGOTYPE_INFO = uintptr type _CERT_OTHER_LOGOTYPE_INFO = struct { FpszObjId LPSTR FLogotypeInfo CERT_LOGOTYPE_INFO } type CERT_OTHER_LOGOTYPE_INFO = _CERT_OTHER_LOGOTYPE_INFO type PCERT_OTHER_LOGOTYPE_INFO = uintptr type _CERT_LOGOTYPE_EXT_INFO = struct { FcCommunityLogo DWORD F__ccgo_pad1 [4]byte FrgCommunityLogo PCERT_LOGOTYPE_INFO FpIssuerLogo PCERT_LOGOTYPE_INFO FpSubjectLogo PCERT_LOGOTYPE_INFO FcOtherLogo DWORD F__ccgo_pad2 [4]byte FrgOtherLogo PCERT_OTHER_LOGOTYPE_INFO } type CERT_LOGOTYPE_EXT_INFO = _CERT_LOGOTYPE_EXT_INFO type PCERT_LOGOTYPE_EXT_INFO = uintptr type _CERT_BIOMETRIC_DATA = struct { FdwTypeOfBiometricDataChoice DWORD F__ccgo_pad1 [4]byte F__8 struct { F__ccgo_pad1 [0]uint64 FdwPredefined DWORD F__ccgo_pad2 [4]byte } FHashedUrl CERT_HASHED_URL } type CERT_BIOMETRIC_DATA = _CERT_BIOMETRIC_DATA type PCERT_BIOMETRIC_DATA = uintptr type _CERT_BIOMETRIC_EXT_INFO = struct { FcBiometricData DWORD F__ccgo_pad1 [4]byte FrgBiometricData PCERT_BIOMETRIC_DATA } type CERT_BIOMETRIC_EXT_INFO = _CERT_BIOMETRIC_EXT_INFO type PCERT_BIOMETRIC_EXT_INFO = uintptr type _OCSP_SIGNATURE_INFO = struct { FSignatureAlgorithm CRYPT_ALGORITHM_IDENTIFIER FSignature CRYPT_BIT_BLOB FcCertEncoded DWORD F__ccgo_pad1 [4]byte FrgCertEncoded PCERT_BLOB } type OCSP_SIGNATURE_INFO = _OCSP_SIGNATURE_INFO type POCSP_SIGNATURE_INFO = uintptr type _OCSP_SIGNED_REQUEST_INFO = struct { FToBeSigned CRYPT_DER_BLOB FpOptionalSignatureInfo POCSP_SIGNATURE_INFO } type OCSP_SIGNED_REQUEST_INFO = _OCSP_SIGNED_REQUEST_INFO type POCSP_SIGNED_REQUEST_INFO = uintptr type _OCSP_CERT_ID = struct { FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FIssuerNameHash CRYPT_HASH_BLOB FIssuerKeyHash CRYPT_HASH_BLOB FSerialNumber CRYPT_INTEGER_BLOB } type OCSP_CERT_ID = _OCSP_CERT_ID type POCSP_CERT_ID = uintptr type _OCSP_REQUEST_ENTRY = struct { FCertId OCSP_CERT_ID FcExtension DWORD F__ccgo_pad1 [4]byte FrgExtension PCERT_EXTENSION } type OCSP_REQUEST_ENTRY = _OCSP_REQUEST_ENTRY type POCSP_REQUEST_ENTRY = uintptr type _OCSP_REQUEST_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FpRequestorName PCERT_ALT_NAME_ENTRY FcRequestEntry DWORD F__ccgo_pad2 [4]byte FrgRequestEntry POCSP_REQUEST_ENTRY FcExtension DWORD F__ccgo_pad3 [4]byte FrgExtension PCERT_EXTENSION } type OCSP_REQUEST_INFO = _OCSP_REQUEST_INFO type POCSP_REQUEST_INFO = uintptr type _OCSP_RESPONSE_INFO = struct { FdwStatus DWORD F__ccgo_pad1 [4]byte FpszObjId LPSTR FValue CRYPT_OBJID_BLOB } type OCSP_RESPONSE_INFO = _OCSP_RESPONSE_INFO type POCSP_RESPONSE_INFO = uintptr type _OCSP_BASIC_SIGNED_RESPONSE_INFO = struct { FToBeSigned CRYPT_DER_BLOB FSignatureInfo OCSP_SIGNATURE_INFO } type OCSP_BASIC_SIGNED_RESPONSE_INFO = _OCSP_BASIC_SIGNED_RESPONSE_INFO type POCSP_BASIC_SIGNED_RESPONSE_INFO = uintptr type _OCSP_BASIC_REVOKED_INFO = struct { FRevocationDate FILETIME FdwCrlReasonCode DWORD } type OCSP_BASIC_REVOKED_INFO = _OCSP_BASIC_REVOKED_INFO type POCSP_BASIC_REVOKED_INFO = uintptr type _OCSP_BASIC_RESPONSE_ENTRY = struct { FCertId OCSP_CERT_ID FdwCertStatus DWORD F__ccgo_pad1 [4]byte F__80 struct{ FpRevokedInfo POCSP_BASIC_REVOKED_INFO } FThisUpdate FILETIME FNextUpdate FILETIME FcExtension DWORD F__ccgo_pad2 [4]byte FrgExtension PCERT_EXTENSION } type OCSP_BASIC_RESPONSE_ENTRY = _OCSP_BASIC_RESPONSE_ENTRY type POCSP_BASIC_RESPONSE_ENTRY = uintptr type _OCSP_BASIC_RESPONSE_INFO = struct { FdwVersion DWORD FdwResponderIdChoice DWORD F__8 struct{ FByNameResponderId CERT_NAME_BLOB } FProducedAt FILETIME FcResponseEntry DWORD F__ccgo_pad1 [4]byte FrgResponseEntry POCSP_BASIC_RESPONSE_ENTRY FcExtension DWORD F__ccgo_pad2 [4]byte FrgExtension PCERT_EXTENSION } type OCSP_BASIC_RESPONSE_INFO = _OCSP_BASIC_RESPONSE_INFO type POCSP_BASIC_RESPONSE_INFO = uintptr type _CERT_SUPPORTED_ALGORITHM_INFO = struct { FAlgorithm CRYPT_ALGORITHM_IDENTIFIER FIntendedKeyUsage CRYPT_BIT_BLOB FIntendedCertPolicies CERT_POLICIES_INFO } type CERT_SUPPORTED_ALGORITHM_INFO = _CERT_SUPPORTED_ALGORITHM_INFO type PCERT_SUPPORTED_ALGORITHM_INFO = uintptr type _CERT_TPM_SPECIFICATION_INFO = struct { FpwszFamily LPWSTR FdwLevel DWORD FdwRevision DWORD } type CERT_TPM_SPECIFICATION_INFO = _CERT_TPM_SPECIFICATION_INFO type PCERT_TPM_SPECIFICATION_INFO = uintptr type HCRYPTOIDFUNCSET = uintptr type HCRYPTOIDFUNCADDR = uintptr type _CRYPT_OID_FUNC_ENTRY = struct { FpszOID LPCSTR FpvFuncAddr uintptr } type CRYPT_OID_FUNC_ENTRY = _CRYPT_OID_FUNC_ENTRY type PCRYPT_OID_FUNC_ENTRY = uintptr type PFN_CRYPT_ENUM_OID_FUNC = uintptr type _CRYPT_OID_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpszOID LPCSTR FpwszName LPCWSTR FdwGroupId DWORD F__28 struct{ FdwValue DWORD } FExtraInfo CRYPT_DATA_BLOB } type CRYPT_OID_INFO = _CRYPT_OID_INFO type PCRYPT_OID_INFO = uintptr type CCRYPT_OID_INFO = CRYPT_OID_INFO type PCCRYPT_OID_INFO = uintptr type PFN_CRYPT_ENUM_OID_INFO = uintptr type _CERT_STRONG_SIGN_SERIALIZED_INFO = struct { FdwFlags DWORD F__ccgo_pad1 [4]byte FpwszCNGSignHashAlgids LPWSTR FpwszCNGPubKeyMinBitLengths LPWSTR } type CERT_STRONG_SIGN_SERIALIZED_INFO = _CERT_STRONG_SIGN_SERIALIZED_INFO type PCERT_STRONG_SIGN_SERIALIZED_INFO = uintptr type _CERT_STRONG_SIGN_PARA = struct { FcbSize DWORD FdwInfoChoice DWORD F__8 struct{ FpvInfo uintptr } } type CERT_STRONG_SIGN_PARA = _CERT_STRONG_SIGN_PARA type PCERT_STRONG_SIGN_PARA = uintptr type PCCERT_STRONG_SIGN_PARA = uintptr type HCRYPTMSG = uintptr type _CERT_ISSUER_SERIAL_NUMBER = struct { FIssuer CERT_NAME_BLOB FSerialNumber CRYPT_INTEGER_BLOB } type CERT_ISSUER_SERIAL_NUMBER = _CERT_ISSUER_SERIAL_NUMBER type PCERT_ISSUER_SERIAL_NUMBER = uintptr type _CERT_ID = struct { FdwIdChoice DWORD F__ccgo_pad1 [4]byte F__8 struct{ FIssuerSerialNumber CERT_ISSUER_SERIAL_NUMBER } } type CERT_ID = _CERT_ID type PCERT_ID = uintptr type _CMSG_SIGNER_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpCertInfo PCERT_INFO F__16 struct{ FhCryptProv HCRYPTPROV } FdwKeySpec DWORD F__ccgo_pad2 [4]byte FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvHashAuxInfo uintptr FcAuthAttr DWORD F__ccgo_pad3 [4]byte FrgAuthAttr PCRYPT_ATTRIBUTE FcUnauthAttr DWORD F__ccgo_pad4 [4]byte FrgUnauthAttr PCRYPT_ATTRIBUTE } type CMSG_SIGNER_ENCODE_INFO = _CMSG_SIGNER_ENCODE_INFO type PCMSG_SIGNER_ENCODE_INFO = uintptr type _CMSG_SIGNED_ENCODE_INFO = struct { FcbSize DWORD FcSigners DWORD FrgSigners PCMSG_SIGNER_ENCODE_INFO FcCertEncoded DWORD F__ccgo_pad1 [4]byte FrgCertEncoded PCERT_BLOB FcCrlEncoded DWORD F__ccgo_pad2 [4]byte FrgCrlEncoded PCRL_BLOB } type CMSG_SIGNED_ENCODE_INFO = _CMSG_SIGNED_ENCODE_INFO type PCMSG_SIGNED_ENCODE_INFO = uintptr type _CMSG_RECIPIENT_ENCODE_INFO = struct { FdwRecipientChoice DWORD F__ccgo_pad1 [4]byte F__8 struct { FpKeyTrans PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO } } type CMSG_RECIPIENT_ENCODE_INFO = _CMSG_RECIPIENT_ENCODE_INFO type PCMSG_RECIPIENT_ENCODE_INFO = uintptr type _CMSG_ENVELOPED_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhCryptProv HCRYPTPROV_LEGACY FContentEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvEncryptionAuxInfo uintptr FcRecipients DWORD F__ccgo_pad2 [4]byte FrgpRecipients uintptr } type CMSG_ENVELOPED_ENCODE_INFO = _CMSG_ENVELOPED_ENCODE_INFO type PCMSG_ENVELOPED_ENCODE_INFO = uintptr type _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvKeyEncryptionAuxInfo uintptr FhCryptProv HCRYPTPROV_LEGACY FRecipientPublicKey CRYPT_BIT_BLOB FRecipientId CERT_ID } type CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO = _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO type PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO = uintptr type _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FRecipientPublicKey CRYPT_BIT_BLOB FRecipientId CERT_ID FDate FILETIME FpOtherAttr PCRYPT_ATTRIBUTE_TYPE_VALUE } type CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO = _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO type PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO = uintptr type _CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvKeyEncryptionAuxInfo uintptr FKeyWrapAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvKeyWrapAuxInfo uintptr FhCryptProv HCRYPTPROV_LEGACY FdwKeySpec DWORD FdwKeyChoice DWORD F__88 struct{ FpEphemeralAlgorithm PCRYPT_ALGORITHM_IDENTIFIER } FUserKeyingMaterial CRYPT_DATA_BLOB FcRecipientEncryptedKeys DWORD F__ccgo_pad2 [4]byte FrgpRecipientEncryptedKeys uintptr } type CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO = _CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO type PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO = uintptr type _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvKeyEncryptionAuxInfo uintptr FhCryptProv HCRYPTPROV FdwKeyChoice DWORD F__ccgo_pad2 [4]byte F__56 struct{ FhKeyEncryptionKey HCRYPTKEY } FKeyId CRYPT_DATA_BLOB FDate FILETIME FpOtherAttr PCRYPT_ATTRIBUTE_TYPE_VALUE } type CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO = _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO type PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO = uintptr type _CMSG_RC2_AUX_INFO = struct { FcbSize DWORD FdwBitLen DWORD } type CMSG_RC2_AUX_INFO = _CMSG_RC2_AUX_INFO type PCMSG_RC2_AUX_INFO = uintptr type _CMSG_SP3_COMPATIBLE_AUX_INFO = struct { FcbSize DWORD FdwFlags DWORD } type CMSG_SP3_COMPATIBLE_AUX_INFO = _CMSG_SP3_COMPATIBLE_AUX_INFO type PCMSG_SP3_COMPATIBLE_AUX_INFO = uintptr type _CMSG_RC4_AUX_INFO = struct { FcbSize DWORD FdwBitLen DWORD } type CMSG_RC4_AUX_INFO = _CMSG_RC4_AUX_INFO type PCMSG_RC4_AUX_INFO = uintptr type _CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FSignedInfo CMSG_SIGNED_ENCODE_INFO FEnvelopedInfo CMSG_ENVELOPED_ENCODE_INFO } type CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO = _CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO type PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO = uintptr type _CMSG_HASHED_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhCryptProv HCRYPTPROV_LEGACY FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvHashAuxInfo uintptr } type CMSG_HASHED_ENCODE_INFO = _CMSG_HASHED_ENCODE_INFO type PCMSG_HASHED_ENCODE_INFO = uintptr type _CMSG_ENCRYPTED_ENCODE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FContentEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvEncryptionAuxInfo uintptr } type CMSG_ENCRYPTED_ENCODE_INFO = _CMSG_ENCRYPTED_ENCODE_INFO type PCMSG_ENCRYPTED_ENCODE_INFO = uintptr type PFN_CMSG_STREAM_OUTPUT = uintptr type _CMSG_STREAM_INFO = struct { FcbContent DWORD F__ccgo_pad1 [4]byte FpfnStreamOutput PFN_CMSG_STREAM_OUTPUT FpvArg uintptr } type CMSG_STREAM_INFO = _CMSG_STREAM_INFO type PCMSG_STREAM_INFO = uintptr type _CMSG_SIGNER_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FIssuer CERT_NAME_BLOB FSerialNumber CRYPT_INTEGER_BLOB FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FHashEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEncryptedHash CRYPT_DATA_BLOB FAuthAttrs CRYPT_ATTRIBUTES FUnauthAttrs CRYPT_ATTRIBUTES } type CMSG_SIGNER_INFO = _CMSG_SIGNER_INFO type PCMSG_SIGNER_INFO = uintptr type _CMSG_CMS_SIGNER_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FSignerId CERT_ID FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FHashEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEncryptedHash CRYPT_DATA_BLOB FAuthAttrs CRYPT_ATTRIBUTES FUnauthAttrs CRYPT_ATTRIBUTES } type CMSG_CMS_SIGNER_INFO = _CMSG_CMS_SIGNER_INFO type PCMSG_CMS_SIGNER_INFO = uintptr type CMSG_ATTR = CRYPT_ATTRIBUTES type PCMSG_ATTR = uintptr type _CMSG_KEY_TRANS_RECIPIENT_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FRecipientId CERT_ID FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEncryptedKey CRYPT_DATA_BLOB } type CMSG_KEY_TRANS_RECIPIENT_INFO = _CMSG_KEY_TRANS_RECIPIENT_INFO type PCMSG_KEY_TRANS_RECIPIENT_INFO = uintptr type _CMSG_RECIPIENT_ENCRYPTED_KEY_INFO = struct { FRecipientId CERT_ID FEncryptedKey CRYPT_DATA_BLOB FDate FILETIME FpOtherAttr PCRYPT_ATTRIBUTE_TYPE_VALUE } type CMSG_RECIPIENT_ENCRYPTED_KEY_INFO = _CMSG_RECIPIENT_ENCRYPTED_KEY_INFO type PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO = uintptr type _CMSG_KEY_AGREE_RECIPIENT_INFO = struct { FdwVersion DWORD FdwOriginatorChoice DWORD F__8 struct { FOriginatorCertId CERT_ID F__ccgo_pad1 [8]byte } FUserKeyingMaterial CRYPT_DATA_BLOB FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FcRecipientEncryptedKeys DWORD F__ccgo_pad1 [4]byte FrgpRecipientEncryptedKeys uintptr } type CMSG_KEY_AGREE_RECIPIENT_INFO = _CMSG_KEY_AGREE_RECIPIENT_INFO type PCMSG_KEY_AGREE_RECIPIENT_INFO = uintptr type _CMSG_MAIL_LIST_RECIPIENT_INFO = struct { FdwVersion DWORD F__ccgo_pad1 [4]byte FKeyId CRYPT_DATA_BLOB FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEncryptedKey CRYPT_DATA_BLOB FDate FILETIME FpOtherAttr PCRYPT_ATTRIBUTE_TYPE_VALUE } type CMSG_MAIL_LIST_RECIPIENT_INFO = _CMSG_MAIL_LIST_RECIPIENT_INFO type PCMSG_MAIL_LIST_RECIPIENT_INFO = uintptr type _CMSG_CMS_RECIPIENT_INFO = struct { FdwRecipientChoice DWORD F__ccgo_pad1 [4]byte F__8 struct { FpKeyTrans PCMSG_KEY_TRANS_RECIPIENT_INFO } } type CMSG_CMS_RECIPIENT_INFO = _CMSG_CMS_RECIPIENT_INFO type PCMSG_CMS_RECIPIENT_INFO = uintptr type _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhCryptProv HCRYPTPROV_LEGACY FdwSignerIndex DWORD FdwSignerType DWORD FpvSigner uintptr } type CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA = _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA type PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA = uintptr type _CMSG_CTRL_DECRYPT_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte F__8 struct{ FhCryptProv HCRYPTPROV } FdwKeySpec DWORD FdwRecipientIndex DWORD } type CMSG_CTRL_DECRYPT_PARA = _CMSG_CTRL_DECRYPT_PARA type PCMSG_CTRL_DECRYPT_PARA = uintptr type _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte F__8 struct{ FhCryptProv HCRYPTPROV } FdwKeySpec DWORD F__ccgo_pad2 [4]byte FpKeyTrans PCMSG_KEY_TRANS_RECIPIENT_INFO FdwRecipientIndex DWORD F__ccgo_pad3 [4]byte } type CMSG_CTRL_KEY_TRANS_DECRYPT_PARA = _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA type PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA = uintptr type _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte F__8 struct{ FhCryptProv HCRYPTPROV } FdwKeySpec DWORD F__ccgo_pad2 [4]byte FpKeyAgree PCMSG_KEY_AGREE_RECIPIENT_INFO FdwRecipientIndex DWORD FdwRecipientEncryptedKeyIndex DWORD FOriginatorPublicKey CRYPT_BIT_BLOB } type CMSG_CTRL_KEY_AGREE_DECRYPT_PARA = _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA type PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA = uintptr type _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhCryptProv HCRYPTPROV FpMailList PCMSG_MAIL_LIST_RECIPIENT_INFO FdwRecipientIndex DWORD FdwKeyChoice DWORD F__32 struct{ FhKeyEncryptionKey HCRYPTKEY } } type CMSG_CTRL_MAIL_LIST_DECRYPT_PARA = _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA type PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA = uintptr type _CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA = struct { FcbSize DWORD FdwSignerIndex DWORD Fblob CRYPT_DATA_BLOB } type CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA = _CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA type PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA = uintptr type _CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA = struct { FcbSize DWORD FdwSignerIndex DWORD FdwUnauthAttrIndex DWORD } type CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA = _CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA type PCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA = uintptr type PFN_CMSG_ALLOC = uintptr type PFN_CMSG_FREE = uintptr type PFN_CMSG_GEN_ENCRYPT_KEY = uintptr type PFN_CMSG_EXPORT_ENCRYPT_KEY = uintptr type PFN_CMSG_IMPORT_ENCRYPT_KEY = uintptr type _CMSG_CONTENT_ENCRYPT_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhCryptProv HCRYPTPROV_LEGACY FContentEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvEncryptionAuxInfo uintptr FcRecipients DWORD F__ccgo_pad2 [4]byte FrgCmsRecipients PCMSG_RECIPIENT_ENCODE_INFO FpfnAlloc PFN_CMSG_ALLOC FpfnFree PFN_CMSG_FREE FdwEncryptFlags DWORD F__ccgo_pad3 [4]byte F__88 struct{ FhContentEncryptKey HCRYPTKEY } FdwFlags DWORD FfCNG WINBOOL FpbCNGContentEncryptKeyObject uintptr FpbContentEncryptKey uintptr FcbContentEncryptKey DWORD F__ccgo_pad4 [4]byte } type CMSG_CONTENT_ENCRYPT_INFO = _CMSG_CONTENT_ENCRYPT_INFO type PCMSG_CONTENT_ENCRYPT_INFO = uintptr type PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY = uintptr type _CMSG_KEY_TRANS_ENCRYPT_INFO = struct { FcbSize DWORD FdwRecipientIndex DWORD FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEncryptedKey CRYPT_DATA_BLOB FdwFlags DWORD F__ccgo_pad1 [4]byte } type CMSG_KEY_TRANS_ENCRYPT_INFO = _CMSG_KEY_TRANS_ENCRYPT_INFO type PCMSG_KEY_TRANS_ENCRYPT_INFO = uintptr type PFN_CMSG_EXPORT_KEY_TRANS = uintptr type _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FEncryptedKey CRYPT_DATA_BLOB } type CMSG_KEY_AGREE_KEY_ENCRYPT_INFO = _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO type PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO = uintptr type _CMSG_KEY_AGREE_ENCRYPT_INFO = struct { FcbSize DWORD FdwRecipientIndex DWORD FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FUserKeyingMaterial CRYPT_DATA_BLOB FdwOriginatorChoice DWORD F__ccgo_pad1 [4]byte F__56 struct { FOriginatorCertId CERT_ID F__ccgo_pad1 [8]byte } FcKeyAgreeKeyEncryptInfo DWORD F__ccgo_pad2 [4]byte FrgpKeyAgreeKeyEncryptInfo uintptr FdwFlags DWORD F__ccgo_pad3 [4]byte } type CMSG_KEY_AGREE_ENCRYPT_INFO = _CMSG_KEY_AGREE_ENCRYPT_INFO type PCMSG_KEY_AGREE_ENCRYPT_INFO = uintptr type PFN_CMSG_EXPORT_KEY_AGREE = uintptr type _CMSG_MAIL_LIST_ENCRYPT_INFO = struct { FcbSize DWORD FdwRecipientIndex DWORD FKeyEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FEncryptedKey CRYPT_DATA_BLOB FdwFlags DWORD F__ccgo_pad1 [4]byte } type CMSG_MAIL_LIST_ENCRYPT_INFO = _CMSG_MAIL_LIST_ENCRYPT_INFO type PCMSG_MAIL_LIST_ENCRYPT_INFO = uintptr type PFN_CMSG_EXPORT_MAIL_LIST = uintptr type PFN_CMSG_IMPORT_KEY_TRANS = uintptr type PFN_CMSG_IMPORT_KEY_AGREE = uintptr type PFN_CMSG_IMPORT_MAIL_LIST = uintptr type _CMSG_CNG_CONTENT_DECRYPT_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FContentEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpfnAlloc PFN_CMSG_ALLOC FpfnFree PFN_CMSG_FREE FhNCryptKey NCRYPT_KEY_HANDLE FpbContentEncryptKey uintptr FcbContentEncryptKey DWORD F__ccgo_pad2 [4]byte FhCNGContentEncryptKey BCRYPT_KEY_HANDLE FpbCNGContentEncryptKeyObject uintptr } type CMSG_CNG_CONTENT_DECRYPT_INFO = _CMSG_CNG_CONTENT_DECRYPT_INFO type PCMSG_CNG_CONTENT_DECRYPT_INFO = uintptr type PFN_CMSG_CNG_IMPORT_KEY_TRANS = uintptr type PFN_CMSG_CNG_IMPORT_KEY_AGREE = uintptr type PFN_CMSG_CNG_IMPORT_CONTENT_ENCRYPT_KEY = uintptr type HCERTSTORE = uintptr type _CERT_CONTEXT = struct { FdwCertEncodingType DWORD F__ccgo_pad1 [4]byte FpbCertEncoded uintptr FcbCertEncoded DWORD F__ccgo_pad2 [4]byte FpCertInfo PCERT_INFO FhCertStore HCERTSTORE } type CERT_CONTEXT = _CERT_CONTEXT type PCERT_CONTEXT = uintptr type PCCERT_CONTEXT = uintptr type _CRL_CONTEXT = struct { FdwCertEncodingType DWORD F__ccgo_pad1 [4]byte FpbCrlEncoded uintptr FcbCrlEncoded DWORD F__ccgo_pad2 [4]byte FpCrlInfo PCRL_INFO FhCertStore HCERTSTORE } type CRL_CONTEXT = _CRL_CONTEXT type PCRL_CONTEXT = uintptr type PCCRL_CONTEXT = uintptr type _CTL_CONTEXT = struct { FdwMsgAndCertEncodingType DWORD F__ccgo_pad1 [4]byte FpbCtlEncoded uintptr FcbCtlEncoded DWORD F__ccgo_pad2 [4]byte FpCtlInfo PCTL_INFO FhCertStore HCERTSTORE FhCryptMsg HCRYPTMSG FpbCtlContent uintptr FcbCtlContent DWORD F__ccgo_pad3 [4]byte } type CTL_CONTEXT = _CTL_CONTEXT type PCTL_CONTEXT = uintptr type PCCTL_CONTEXT = uintptr type CertKeyType = uint32 type _CRYPT_KEY_PROV_PARAM = struct { FdwParam DWORD F__ccgo_pad1 [4]byte FpbData uintptr FcbData DWORD FdwFlags DWORD } type CRYPT_KEY_PROV_PARAM = _CRYPT_KEY_PROV_PARAM type PCRYPT_KEY_PROV_PARAM = uintptr type _CRYPT_KEY_PROV_INFO = struct { FpwszContainerName LPWSTR FpwszProvName LPWSTR FdwProvType DWORD FdwFlags DWORD FcProvParam DWORD F__ccgo_pad1 [4]byte FrgProvParam PCRYPT_KEY_PROV_PARAM FdwKeySpec DWORD F__ccgo_pad2 [4]byte } type CRYPT_KEY_PROV_INFO = _CRYPT_KEY_PROV_INFO type PCRYPT_KEY_PROV_INFO = uintptr type _CERT_KEY_CONTEXT = struct { FcbSize DWORD F__ccgo_pad1 [4]byte F__8 struct{ FhCryptProv HCRYPTPROV } FdwKeySpec DWORD F__ccgo_pad2 [4]byte } type CERT_KEY_CONTEXT = _CERT_KEY_CONTEXT type PCERT_KEY_CONTEXT = uintptr type _ROOT_INFO_LUID = struct { FLowPart DWORD FHighPart LONG } type ROOT_INFO_LUID = _ROOT_INFO_LUID type PROOT_INFO_LUID = uintptr type _CRYPT_SMART_CARD_ROOT_INFO = struct { FrgbCardID [16]BYTE Fluid ROOT_INFO_LUID } type CRYPT_SMART_CARD_ROOT_INFO = _CRYPT_SMART_CARD_ROOT_INFO type PCRYPT_SMART_CARD_ROOT_INFO = uintptr type _CERT_SYSTEM_STORE_RELOCATE_PARA = struct { F__0 struct{ FhKeyBase HKEY } F__8 struct{ FpvSystemStore uintptr } } type CERT_SYSTEM_STORE_RELOCATE_PARA = _CERT_SYSTEM_STORE_RELOCATE_PARA type PCERT_SYSTEM_STORE_RELOCATE_PARA = uintptr type _CERT_REGISTRY_STORE_CLIENT_GPT_PARA = struct { FhKeyBase HKEY FpwszRegPath LPWSTR } type CERT_REGISTRY_STORE_CLIENT_GPT_PARA = _CERT_REGISTRY_STORE_CLIENT_GPT_PARA type PCERT_REGISTRY_STORE_CLIENT_GPT_PARA = uintptr type _CERT_REGISTRY_STORE_ROAMING_PARA = struct { FhKey HKEY FpwszStoreDirectory LPWSTR } type CERT_REGISTRY_STORE_ROAMING_PARA = _CERT_REGISTRY_STORE_ROAMING_PARA type PCERT_REGISTRY_STORE_ROAMING_PARA = uintptr type _CERT_LDAP_STORE_OPENED_PARA = struct { FpvLdapSessionHandle uintptr FpwszLdapUrl LPCWSTR } type CERT_LDAP_STORE_OPENED_PARA = _CERT_LDAP_STORE_OPENED_PARA type PCERT_LDAP_STORE_OPENED_PARA = uintptr type HCERTSTOREPROV = uintptr type _CERT_STORE_PROV_INFO = struct { FcbSize DWORD FcStoreProvFunc DWORD FrgpvStoreProvFunc uintptr FhStoreProv HCERTSTOREPROV FdwStoreProvFlags DWORD F__ccgo_pad1 [4]byte FhStoreProvFuncAddr2 HCRYPTOIDFUNCADDR } type CERT_STORE_PROV_INFO = _CERT_STORE_PROV_INFO type PCERT_STORE_PROV_INFO = uintptr type PFN_CERT_DLL_OPEN_STORE_PROV_FUNC = uintptr type PFN_CERT_STORE_PROV_CLOSE = uintptr type PFN_CERT_STORE_PROV_READ_CERT = uintptr type PFN_CERT_STORE_PROV_WRITE_CERT = uintptr type PFN_CERT_STORE_PROV_DELETE_CERT = uintptr type PFN_CERT_STORE_PROV_SET_CERT_PROPERTY = uintptr type PFN_CERT_STORE_PROV_READ_CRL = uintptr type PFN_CERT_STORE_PROV_WRITE_CRL = uintptr type PFN_CERT_STORE_PROV_DELETE_CRL = uintptr type PFN_CERT_STORE_PROV_SET_CRL_PROPERTY = uintptr type PFN_CERT_STORE_PROV_READ_CTL = uintptr type PFN_CERT_STORE_PROV_WRITE_CTL = uintptr type PFN_CERT_STORE_PROV_DELETE_CTL = uintptr type PFN_CERT_STORE_PROV_SET_CTL_PROPERTY = uintptr type PFN_CERT_STORE_PROV_CONTROL = uintptr type _CERT_STORE_PROV_FIND_INFO = struct { FcbSize DWORD FdwMsgAndCertEncodingType DWORD FdwFindFlags DWORD FdwFindType DWORD FpvFindPara uintptr } type CERT_STORE_PROV_FIND_INFO = _CERT_STORE_PROV_FIND_INFO type PCERT_STORE_PROV_FIND_INFO = uintptr type CCERT_STORE_PROV_FIND_INFO = CERT_STORE_PROV_FIND_INFO type PCCERT_STORE_PROV_FIND_INFO = uintptr type PFN_CERT_STORE_PROV_FIND_CERT = uintptr type PFN_CERT_STORE_PROV_FREE_FIND_CERT = uintptr type PFN_CERT_STORE_PROV_GET_CERT_PROPERTY = uintptr type PFN_CERT_STORE_PROV_FIND_CRL = uintptr type PFN_CERT_STORE_PROV_FREE_FIND_CRL = uintptr type PFN_CERT_STORE_PROV_GET_CRL_PROPERTY = uintptr type PFN_CERT_STORE_PROV_FIND_CTL = uintptr type PFN_CERT_STORE_PROV_FREE_FIND_CTL = uintptr type PFN_CERT_STORE_PROV_GET_CTL_PROPERTY = uintptr type _CRL_FIND_ISSUED_FOR_PARA = struct { FpSubjectCert PCCERT_CONTEXT FpIssuerCert PCCERT_CONTEXT } type CRL_FIND_ISSUED_FOR_PARA = _CRL_FIND_ISSUED_FOR_PARA type PCRL_FIND_ISSUED_FOR_PARA = uintptr type _CTL_ANY_SUBJECT_INFO = struct { FSubjectAlgorithm CRYPT_ALGORITHM_IDENTIFIER FSubjectIdentifier CRYPT_DATA_BLOB } type CTL_ANY_SUBJECT_INFO = _CTL_ANY_SUBJECT_INFO type PCTL_ANY_SUBJECT_INFO = uintptr type _CTL_FIND_USAGE_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FSubjectUsage CTL_USAGE FListIdentifier CRYPT_DATA_BLOB FpSigner PCERT_INFO } type CTL_FIND_USAGE_PARA = _CTL_FIND_USAGE_PARA type PCTL_FIND_USAGE_PARA = uintptr type _CTL_FIND_SUBJECT_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpUsagePara PCTL_FIND_USAGE_PARA FdwSubjectType DWORD F__ccgo_pad2 [4]byte FpvSubject uintptr } type CTL_FIND_SUBJECT_PARA = _CTL_FIND_SUBJECT_PARA type PCTL_FIND_SUBJECT_PARA = uintptr type PFN_CERT_CREATE_CONTEXT_SORT_FUNC = uintptr type _CERT_CREATE_CONTEXT_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpfnFree PFN_CRYPT_FREE FpvFree uintptr FpfnSort PFN_CERT_CREATE_CONTEXT_SORT_FUNC FpvSort uintptr } type CERT_CREATE_CONTEXT_PARA = _CERT_CREATE_CONTEXT_PARA type PCERT_CREATE_CONTEXT_PARA = uintptr type _CERT_SYSTEM_STORE_INFO = struct{ FcbSize DWORD } type CERT_SYSTEM_STORE_INFO = _CERT_SYSTEM_STORE_INFO type PCERT_SYSTEM_STORE_INFO = uintptr type _CERT_PHYSICAL_STORE_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpszOpenStoreProvider LPSTR FdwOpenEncodingType DWORD FdwOpenFlags DWORD FOpenParameters CRYPT_DATA_BLOB FdwFlags DWORD FdwPriority DWORD } type CERT_PHYSICAL_STORE_INFO = _CERT_PHYSICAL_STORE_INFO type PCERT_PHYSICAL_STORE_INFO = uintptr type PFN_CERT_ENUM_SYSTEM_STORE_LOCATION = uintptr type PFN_CERT_ENUM_SYSTEM_STORE = uintptr type PFN_CERT_ENUM_PHYSICAL_STORE = uintptr type _CTL_VERIFY_USAGE_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FListIdentifier CRYPT_DATA_BLOB FcCtlStore DWORD F__ccgo_pad2 [4]byte FrghCtlStore uintptr FcSignerStore DWORD F__ccgo_pad3 [4]byte FrghSignerStore uintptr } type CTL_VERIFY_USAGE_PARA = _CTL_VERIFY_USAGE_PARA type PCTL_VERIFY_USAGE_PARA = uintptr type _CTL_VERIFY_USAGE_STATUS = struct { FcbSize DWORD FdwError DWORD FdwFlags DWORD F__ccgo_pad1 [4]byte FppCtl uintptr FdwCtlEntryIndex DWORD F__ccgo_pad2 [4]byte FppSigner uintptr FdwSignerIndex DWORD F__ccgo_pad3 [4]byte } type CTL_VERIFY_USAGE_STATUS = _CTL_VERIFY_USAGE_STATUS type PCTL_VERIFY_USAGE_STATUS = uintptr type _CERT_REVOCATION_CRL_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpBaseCrlContext PCCRL_CONTEXT FpDeltaCrlContext PCCRL_CONTEXT FpCrlEntry PCRL_ENTRY FfDeltaCrlEntry WINBOOL F__ccgo_pad2 [4]byte } type CERT_REVOCATION_CRL_INFO = _CERT_REVOCATION_CRL_INFO type PCERT_REVOCATION_CRL_INFO = uintptr type _CERT_REVOCATION_CHAIN_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhChainEngine HCERTCHAINENGINE FhAdditionalStore HCERTSTORE FdwChainFlags DWORD FdwUrlRetrievalTimeout DWORD FpftCurrentTime LPFILETIME FpftCacheResync LPFILETIME FcbMaxUrlRetrievalByteCount DWORD F__ccgo_pad2 [4]byte } type CERT_REVOCATION_CHAIN_PARA = _CERT_REVOCATION_CHAIN_PARA type PCERT_REVOCATION_CHAIN_PARA = uintptr type _CERT_REVOCATION_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpIssuerCert PCCERT_CONTEXT FcCertStore DWORD F__ccgo_pad2 [4]byte FrgCertStore uintptr FhCrlStore HCERTSTORE FpftTimeToUse LPFILETIME } type CERT_REVOCATION_PARA = _CERT_REVOCATION_PARA type PCERT_REVOCATION_PARA = uintptr type _CERT_REVOCATION_STATUS = struct { FcbSize DWORD FdwIndex DWORD FdwError DWORD FdwReason DWORD FfHasFreshnessTime WINBOOL FdwFreshnessTime DWORD } type CERT_REVOCATION_STATUS = _CERT_REVOCATION_STATUS type PCERT_REVOCATION_STATUS = uintptr type _CRYPT_VERIFY_CERT_SIGN_STRONG_PROPERTIES_INFO = struct { FCertSignHashCNGAlgPropData CRYPT_DATA_BLOB FCertIssuerPubKeyBitLengthPropData CRYPT_DATA_BLOB } type CRYPT_VERIFY_CERT_SIGN_STRONG_PROPERTIES_INFO = _CRYPT_VERIFY_CERT_SIGN_STRONG_PROPERTIES_INFO type PCRYPT_VERIFY_CERT_SIGN_STRONG_PROPERTIES_INFO = uintptr type PFN_CRYPT_EXTRACT_ENCODED_SIGNATURE_PARAMETERS_FUNC = uintptr type PFN_CRYPT_SIGN_AND_ENCODE_HASH_FUNC = uintptr type PFN_CRYPT_VERIFY_ENCODED_SIGNATURE_FUNC = uintptr type HCRYPTDEFAULTCONTEXT = uintptr type _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA = struct { FcOID DWORD F__ccgo_pad1 [4]byte FrgpszOID uintptr } type CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA = _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA type PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA = uintptr type PFN_CRYPT_EXPORT_PUBLIC_KEY_INFO_EX2_FUNC = uintptr type PFN_IMPORT_PRIV_KEY_FUNC = uintptr type PFN_EXPORT_PRIV_KEY_FUNC = uintptr type PFN_CRYPT_GET_SIGNER_CERTIFICATE = uintptr type _CRYPT_SIGN_MESSAGE_PARA = struct { FcbSize DWORD FdwMsgEncodingType DWORD FpSigningCert PCCERT_CONTEXT FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvHashAuxInfo uintptr FcMsgCert DWORD F__ccgo_pad1 [4]byte FrgpMsgCert uintptr FcMsgCrl DWORD F__ccgo_pad2 [4]byte FrgpMsgCrl uintptr FcAuthAttr DWORD F__ccgo_pad3 [4]byte FrgAuthAttr PCRYPT_ATTRIBUTE FcUnauthAttr DWORD F__ccgo_pad4 [4]byte FrgUnauthAttr PCRYPT_ATTRIBUTE FdwFlags DWORD FdwInnerContentType DWORD } type CRYPT_SIGN_MESSAGE_PARA = _CRYPT_SIGN_MESSAGE_PARA type PCRYPT_SIGN_MESSAGE_PARA = uintptr type _CRYPT_VERIFY_MESSAGE_PARA = struct { FcbSize DWORD FdwMsgAndCertEncodingType DWORD FhCryptProv HCRYPTPROV_LEGACY FpfnGetSignerCertificate PFN_CRYPT_GET_SIGNER_CERTIFICATE FpvGetArg uintptr } type CRYPT_VERIFY_MESSAGE_PARA = _CRYPT_VERIFY_MESSAGE_PARA type PCRYPT_VERIFY_MESSAGE_PARA = uintptr type _CRYPT_ENCRYPT_MESSAGE_PARA = struct { FcbSize DWORD FdwMsgEncodingType DWORD FhCryptProv HCRYPTPROV_LEGACY FContentEncryptionAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvEncryptionAuxInfo uintptr FdwFlags DWORD FdwInnerContentType DWORD } type CRYPT_ENCRYPT_MESSAGE_PARA = _CRYPT_ENCRYPT_MESSAGE_PARA type PCRYPT_ENCRYPT_MESSAGE_PARA = uintptr type _CRYPT_DECRYPT_MESSAGE_PARA = struct { FcbSize DWORD FdwMsgAndCertEncodingType DWORD FcCertStore DWORD F__ccgo_pad1 [4]byte FrghCertStore uintptr } type CRYPT_DECRYPT_MESSAGE_PARA = _CRYPT_DECRYPT_MESSAGE_PARA type PCRYPT_DECRYPT_MESSAGE_PARA = uintptr type _CRYPT_HASH_MESSAGE_PARA = struct { FcbSize DWORD FdwMsgEncodingType DWORD FhCryptProv HCRYPTPROV_LEGACY FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvHashAuxInfo uintptr } type CRYPT_HASH_MESSAGE_PARA = _CRYPT_HASH_MESSAGE_PARA type PCRYPT_HASH_MESSAGE_PARA = uintptr type _CRYPT_KEY_SIGN_MESSAGE_PARA = struct { FcbSize DWORD FdwMsgAndCertEncodingType DWORD F__8 struct{ FhCryptProv HCRYPTPROV } FdwKeySpec DWORD F__ccgo_pad1 [4]byte FHashAlgorithm CRYPT_ALGORITHM_IDENTIFIER FpvHashAuxInfo uintptr FPubKeyAlgorithm CRYPT_ALGORITHM_IDENTIFIER } type CRYPT_KEY_SIGN_MESSAGE_PARA = _CRYPT_KEY_SIGN_MESSAGE_PARA type PCRYPT_KEY_SIGN_MESSAGE_PARA = uintptr type _CRYPT_KEY_VERIFY_MESSAGE_PARA = struct { FcbSize DWORD FdwMsgEncodingType DWORD FhCryptProv HCRYPTPROV_LEGACY } type CRYPT_KEY_VERIFY_MESSAGE_PARA = _CRYPT_KEY_VERIFY_MESSAGE_PARA type PCRYPT_KEY_VERIFY_MESSAGE_PARA = uintptr type _CERT_CHAIN = struct { FcCerts DWORD F__ccgo_pad1 [4]byte Fcerts PCERT_BLOB FkeyLocatorInfo CRYPT_KEY_PROV_INFO } type CERT_CHAIN = _CERT_CHAIN type PCERT_CHAIN = uintptr type HCRYPTASYNC = HANDLE type PHCRYPTASYNC = uintptr type PFN_CRYPT_ASYNC_PARAM_FREE_FUNC = uintptr type _CRYPT_BLOB_ARRAY = struct { FcBlob DWORD F__ccgo_pad1 [4]byte FrgBlob PCRYPT_DATA_BLOB } type CRYPT_BLOB_ARRAY = _CRYPT_BLOB_ARRAY type PCRYPT_BLOB_ARRAY = uintptr type _CRYPT_CREDENTIALS = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpszCredentialsOid LPCSTR FpvCredentials LPVOID } type CRYPT_CREDENTIALS = _CRYPT_CREDENTIALS type PCRYPT_CREDENTIALS = uintptr type _CRYPT_PASSWORD_CREDENTIALSA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpszUsername LPSTR FpszPassword LPSTR } type CRYPT_PASSWORD_CREDENTIALSA = _CRYPT_PASSWORD_CREDENTIALSA type PCRYPT_PASSWORD_CREDENTIALSA = uintptr type _CRYPT_PASSWORD_CREDENTIALSW = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpszUsername LPWSTR FpszPassword LPWSTR } type CRYPT_PASSWORD_CREDENTIALSW = _CRYPT_PASSWORD_CREDENTIALSW type PCRYPT_PASSWORD_CREDENTIALSW = uintptr type CRYPT_PASSWORD_CREDENTIALS = CRYPT_PASSWORD_CREDENTIALSA type PCRYPT_PASSWORD_CREDENTIALS = PCRYPT_PASSWORD_CREDENTIALSA type PFN_FREE_ENCODED_OBJECT_FUNC = uintptr type _CRYPTNET_URL_CACHE_PRE_FETCH_INFO = struct { FcbSize DWORD FdwObjectType DWORD FdwError DWORD FdwReserved DWORD FThisUpdateTime FILETIME FNextUpdateTime FILETIME FPublishTime FILETIME } type CRYPTNET_URL_CACHE_PRE_FETCH_INFO = _CRYPTNET_URL_CACHE_PRE_FETCH_INFO type PCRYPTNET_URL_CACHE_PRE_FETCH_INFO = uintptr type _CRYPTNET_URL_CACHE_FLUSH_INFO = struct { FcbSize DWORD FdwExemptSeconds DWORD FExpireTime FILETIME } type CRYPTNET_URL_CACHE_FLUSH_INFO = _CRYPTNET_URL_CACHE_FLUSH_INFO type PCRYPTNET_URL_CACHE_FLUSH_INFO = uintptr type _CRYPTNET_URL_CACHE_RESPONSE_INFO = struct { FcbSize DWORD FwResponseType WORD FwResponseFlags WORD FLastModifiedTime FILETIME FdwMaxAge DWORD F__ccgo_pad1 [4]byte FpwszETag LPCWSTR FdwProxyId DWORD F__ccgo_pad2 [4]byte } type CRYPTNET_URL_CACHE_RESPONSE_INFO = _CRYPTNET_URL_CACHE_RESPONSE_INFO type PCRYPTNET_URL_CACHE_RESPONSE_INFO = uintptr type _CRYPT_RETRIEVE_AUX_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpLastSyncTime uintptr FdwMaxUrlRetrievalByteCount DWORD F__ccgo_pad2 [4]byte FpPreFetchInfo PCRYPTNET_URL_CACHE_PRE_FETCH_INFO FpFlushInfo PCRYPTNET_URL_CACHE_FLUSH_INFO FppResponseInfo uintptr FpwszCacheFileNamePrefix LPWSTR FpftCacheResync LPFILETIME FfProxyCacheRetrieval WINBOOL FdwHttpStatusCode DWORD } type CRYPT_RETRIEVE_AUX_INFO = _CRYPT_RETRIEVE_AUX_INFO type PCRYPT_RETRIEVE_AUX_INFO = uintptr type PFN_CRYPT_CANCEL_RETRIEVAL = uintptr type PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC = uintptr type _CRYPT_ASYNC_RETRIEVAL_COMPLETION = struct { FpfnCompletion PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC FpvCompletion LPVOID } type CRYPT_ASYNC_RETRIEVAL_COMPLETION = _CRYPT_ASYNC_RETRIEVAL_COMPLETION type PCRYPT_ASYNC_RETRIEVAL_COMPLETION = uintptr type PFN_CANCEL_ASYNC_RETRIEVAL_FUNC = uintptr type _CRYPT_URL_ARRAY = struct { FcUrl DWORD F__ccgo_pad1 [4]byte FrgwszUrl uintptr } type CRYPT_URL_ARRAY = _CRYPT_URL_ARRAY type PCRYPT_URL_ARRAY = uintptr type _CRYPT_URL_INFO = struct { FcbSize DWORD FdwSyncDeltaTime DWORD FcGroup DWORD F__ccgo_pad1 [4]byte FrgcGroupEntry uintptr } type CRYPT_URL_INFO = _CRYPT_URL_INFO type PCRYPT_URL_INFO = uintptr type _CERT_CRL_CONTEXT_PAIR = struct { FpCertContext PCCERT_CONTEXT FpCrlContext PCCRL_CONTEXT } type CERT_CRL_CONTEXT_PAIR = _CERT_CRL_CONTEXT_PAIR type PCERT_CRL_CONTEXT_PAIR = uintptr type PCCERT_CRL_CONTEXT_PAIR = uintptr type _CRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO = struct { FcbSize DWORD FiDeltaCrlIndicator int32 FpftCacheResync LPFILETIME FpLastSyncTime LPFILETIME FpMaxAgeTime LPFILETIME FpChainPara PCERT_REVOCATION_CHAIN_PARA FpDeltaCrlIndicator PCRYPT_INTEGER_BLOB } type CRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO = _CRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO type PCRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO = uintptr type PFN_CRYPT_ENUM_KEYID_PROP = uintptr type HCERTCHAINENGINE = HANDLE type _CERT_CHAIN_ENGINE_CONFIG = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FhRestrictedRoot HCERTSTORE FhRestrictedTrust HCERTSTORE FhRestrictedOther HCERTSTORE FcAdditionalStore DWORD F__ccgo_pad2 [4]byte FrghAdditionalStore uintptr FdwFlags DWORD FdwUrlRetrievalTimeout DWORD FMaximumCachedCertificates DWORD FCycleDetectionModulus DWORD } type CERT_CHAIN_ENGINE_CONFIG = _CERT_CHAIN_ENGINE_CONFIG type PCERT_CHAIN_ENGINE_CONFIG = uintptr type _CERT_TRUST_STATUS = struct { FdwErrorStatus DWORD FdwInfoStatus DWORD } type CERT_TRUST_STATUS = _CERT_TRUST_STATUS type PCERT_TRUST_STATUS = uintptr type _CERT_REVOCATION_INFO = struct { FcbSize DWORD FdwRevocationResult DWORD FpszRevocationOid LPCSTR FpvOidSpecificInfo LPVOID FfHasFreshnessTime WINBOOL FdwFreshnessTime DWORD FpCrlInfo PCERT_REVOCATION_CRL_INFO } type CERT_REVOCATION_INFO = _CERT_REVOCATION_INFO type PCERT_REVOCATION_INFO = uintptr type _CERT_TRUST_LIST_INFO = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpCtlEntry PCTL_ENTRY FpCtlContext PCCTL_CONTEXT } type CERT_TRUST_LIST_INFO = _CERT_TRUST_LIST_INFO type PCERT_TRUST_LIST_INFO = uintptr type _CERT_CHAIN_ELEMENT = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpCertContext PCCERT_CONTEXT FTrustStatus CERT_TRUST_STATUS FpRevocationInfo PCERT_REVOCATION_INFO FpIssuanceUsage PCERT_ENHKEY_USAGE FpApplicationUsage PCERT_ENHKEY_USAGE FpwszExtendedErrorInfo LPCWSTR } type CERT_CHAIN_ELEMENT = _CERT_CHAIN_ELEMENT type PCERT_CHAIN_ELEMENT = uintptr type PCCERT_CHAIN_ELEMENT = uintptr type _CERT_SIMPLE_CHAIN = struct { FcbSize DWORD FTrustStatus CERT_TRUST_STATUS FcElement DWORD FrgpElement uintptr FpTrustListInfo PCERT_TRUST_LIST_INFO FfHasRevocationFreshnessTime WINBOOL FdwRevocationFreshnessTime DWORD } type CERT_SIMPLE_CHAIN = _CERT_SIMPLE_CHAIN type PCERT_SIMPLE_CHAIN = uintptr type PCCERT_SIMPLE_CHAIN = uintptr type _CERT_CHAIN_CONTEXT = struct { FcbSize DWORD FTrustStatus CERT_TRUST_STATUS FcChain DWORD FrgpChain uintptr FcLowerQualityChainContext DWORD F__ccgo_pad1 [4]byte FrgpLowerQualityChainContext uintptr FfHasRevocationFreshnessTime WINBOOL FdwRevocationFreshnessTime DWORD FdwCreateFlags DWORD FChainId GUID F__ccgo_pad2 [4]byte } type CERT_CHAIN_CONTEXT = _CERT_CHAIN_CONTEXT type PCERT_CHAIN_CONTEXT = uintptr type PCCERT_CHAIN_CONTEXT = uintptr type _CERT_USAGE_MATCH = struct { FdwType DWORD F__ccgo_pad1 [4]byte FUsage CERT_ENHKEY_USAGE } type CERT_USAGE_MATCH = _CERT_USAGE_MATCH type PCERT_USAGE_MATCH = uintptr type _CTL_USAGE_MATCH = struct { FdwType DWORD F__ccgo_pad1 [4]byte FUsage CTL_USAGE } type CTL_USAGE_MATCH = _CTL_USAGE_MATCH type PCTL_USAGE_MATCH = uintptr type _CERT_CHAIN_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FRequestedUsage CERT_USAGE_MATCH } type CERT_CHAIN_PARA = _CERT_CHAIN_PARA type PCERT_CHAIN_PARA = uintptr type _CRL_REVOCATION_INFO = struct { FpCrlEntry PCRL_ENTRY FpCrlContext PCCRL_CONTEXT FpCrlIssuerChain PCCERT_CHAIN_CONTEXT } type CRL_REVOCATION_INFO = _CRL_REVOCATION_INFO type PCRL_REVOCATION_INFO = uintptr type PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK = uintptr type _CERT_CHAIN_FIND_BY_ISSUER_PARA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpszUsageIdentifier LPCSTR FdwKeySpec DWORD FdwAcquirePrivateKeyFlags DWORD FcIssuer DWORD F__ccgo_pad2 [4]byte FrgIssuer uintptr FpfnFindCallback PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK FpvFindArg uintptr } type CERT_CHAIN_FIND_ISSUER_PARA = _CERT_CHAIN_FIND_BY_ISSUER_PARA type PCERT_CHAIN_FIND_ISSUER_PARA = uintptr type CERT_CHAIN_FIND_BY_ISSUER_PARA = _CERT_CHAIN_FIND_BY_ISSUER_PARA type PCERT_CHAIN_FIND_BY_ISSUER_PARA = uintptr type _CERT_CHAIN_POLICY_PARA = struct { FcbSize DWORD FdwFlags DWORD FpvExtraPolicyPara uintptr } type CERT_CHAIN_POLICY_PARA = _CERT_CHAIN_POLICY_PARA type PCERT_CHAIN_POLICY_PARA = uintptr type _CERT_CHAIN_POLICY_STATUS = struct { FcbSize DWORD FdwError DWORD FlChainIndex LONG FlElementIndex LONG FpvExtraPolicyStatus uintptr } type CERT_CHAIN_POLICY_STATUS = _CERT_CHAIN_POLICY_STATUS type PCERT_CHAIN_POLICY_STATUS = uintptr type _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA = struct { FcbSize DWORD FdwRegPolicySettings DWORD FpSignerInfo PCMSG_SIGNER_INFO } type AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA = _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA type PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA = uintptr type _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS = struct { FcbSize DWORD FfCommercial WINBOOL } type AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS = _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS type PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS = uintptr type _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA = struct { FcbSize DWORD FdwRegPolicySettings DWORD FfCommercial WINBOOL } type AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA = _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA type PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA = uintptr type _HTTPSPolicyCallbackData = struct { F__0 struct{ FcbStruct DWORD } FdwAuthType DWORD FfdwChecks DWORD F__ccgo_pad1 [4]byte FpwszServerName uintptr } type HTTPSPolicyCallbackData = _HTTPSPolicyCallbackData type PHTTPSPolicyCallbackData = uintptr type SSL_EXTRA_CERT_CHAIN_POLICY_PARA = _HTTPSPolicyCallbackData type PSSL_EXTRA_CERT_CHAIN_POLICY_PARA = uintptr type _EV_EXTRA_CERT_CHAIN_POLICY_PARA = struct { FcbSize DWORD FdwRootProgramQualifierFlags DWORD } type EV_EXTRA_CERT_CHAIN_POLICY_PARA = _EV_EXTRA_CERT_CHAIN_POLICY_PARA type PEV_EXTRA_CERT_CHAIN_POLICY_PARA = uintptr type _EV_EXTRA_CERT_CHAIN_POLICY_STATUS = struct { FcbSize DWORD FdwQualifiers DWORD FdwIssuanceUsageIndex DWORD } type EV_EXTRA_CERT_CHAIN_POLICY_STATUS = _EV_EXTRA_CERT_CHAIN_POLICY_STATUS type PEV_EXTRA_CERT_CHAIN_POLICY_STATUS = uintptr type _SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS = struct { FcbSize DWORD FdwErrorLevel DWORD FdwErrorCategory DWORD FdwReserved DWORD FwszErrorText [256]WCHAR } type SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS = _SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS type PSSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS = uintptr type _SSL_HPKP_HEADER_EXTRA_CERT_CHAIN_POLICY_PARA = struct { FcbSize DWORD FdwReserved DWORD FpwszServerName LPWSTR FrgpszHpkpValue [2]LPSTR } type SSL_HPKP_HEADER_EXTRA_CERT_CHAIN_POLICY_PARA = _SSL_HPKP_HEADER_EXTRA_CERT_CHAIN_POLICY_PARA type PSSL_HPKP_HEADER_EXTRA_CERT_CHAIN_POLICY_PARA = uintptr type _SSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_PARA = struct { FcbSize DWORD FdwReserved DWORD FpwszServerName PCWSTR } type SSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_PARA = _SSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_PARA type PSSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_PARA = uintptr type _SSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_STATUS = struct { FcbSize DWORD FlError LONG FwszErrorText [512]WCHAR } type SSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_STATUS = _SSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_STATUS type PSSL_KEY_PIN_EXTRA_CERT_CHAIN_POLICY_STATUS = uintptr type _CRYPT_PKCS12_PBE_PARAMS = struct { FiIterations int32 FcbSalt ULONG } type CRYPT_PKCS12_PBE_PARAMS = _CRYPT_PKCS12_PBE_PARAMS type _PKCS12_PBES2_EXPORT_PARAMS = struct { FdwSize DWORD F__ccgo_pad1 [4]byte FhNcryptDescriptor PVOID FpwszPbes2Alg LPWSTR } type PKCS12_PBES2_EXPORT_PARAMS = _PKCS12_PBES2_EXPORT_PARAMS type PPKCS12_PBES2_EXPORT_PARAMS = uintptr type _CRYPTPROTECT_PROMPTSTRUCT = struct { FcbSize DWORD FdwPromptFlags DWORD FhwndApp HWND FszPrompt LPCWSTR } type CRYPTPROTECT_PROMPTSTRUCT = _CRYPTPROTECT_PROMPTSTRUCT type PCRYPTPROTECT_PROMPTSTRUCT = uintptr type _CERTIFICATE_BLOB = struct { FdwCertEncodingType DWORD FcbData DWORD FpbData PBYTE } type EFS_CERTIFICATE_BLOB = _CERTIFICATE_BLOB type PEFS_CERTIFICATE_BLOB = uintptr type _EFS_HASH_BLOB = struct { FcbData DWORD F__ccgo_pad1 [4]byte FpbData PBYTE } type EFS_HASH_BLOB = _EFS_HASH_BLOB type PEFS_HASH_BLOB = uintptr type _EFS_RPC_BLOB = struct { FcbData DWORD F__ccgo_pad1 [4]byte FpbData PBYTE } type EFS_RPC_BLOB = _EFS_RPC_BLOB type PEFS_RPC_BLOB = uintptr type _EFS_KEY_INFO = struct { FdwVersion DWORD FEntropy ULONG FAlgorithm ALG_ID FKeyLength ULONG } type EFS_KEY_INFO = _EFS_KEY_INFO type PEFS_KEY_INFO = uintptr type _ENCRYPTION_CERTIFICATE = struct { FcbTotalLength DWORD F__ccgo_pad1 [4]byte FpUserSid uintptr FpCertBlob PEFS_CERTIFICATE_BLOB } type ENCRYPTION_CERTIFICATE = _ENCRYPTION_CERTIFICATE type PENCRYPTION_CERTIFICATE = uintptr type _ENCRYPTION_CERTIFICATE_HASH = struct { FcbTotalLength DWORD F__ccgo_pad1 [4]byte FpUserSid uintptr FpHash PEFS_HASH_BLOB FlpDisplayInformation LPWSTR } type ENCRYPTION_CERTIFICATE_HASH = _ENCRYPTION_CERTIFICATE_HASH type PENCRYPTION_CERTIFICATE_HASH = uintptr type _ENCRYPTION_CERTIFICATE_HASH_LIST = struct { FnCert_Hash DWORD F__ccgo_pad1 [4]byte FpUsers uintptr } type ENCRYPTION_CERTIFICATE_HASH_LIST = _ENCRYPTION_CERTIFICATE_HASH_LIST type PENCRYPTION_CERTIFICATE_HASH_LIST = uintptr type _ENCRYPTION_CERTIFICATE_LIST = struct { FnUsers DWORD F__ccgo_pad1 [4]byte FpUsers uintptr } type ENCRYPTION_CERTIFICATE_LIST = _ENCRYPTION_CERTIFICATE_LIST type PENCRYPTION_CERTIFICATE_LIST = uintptr type RPC_IMPORT_CONTEXT_P = struct { FLookupContext RPC_NS_HANDLE FProposedHandle RPC_BINDING_HANDLE FBindings uintptr } type PRPC_IMPORT_CONTEXT_P = uintptr type Byte = uint8 type Cs_byte = Byte type Boolean = uint8 type NDR_CCONTEXT = uintptr type _NDR_SCONTEXT = struct { Fpad [2]uintptr FuserContext uintptr } type NDR_SCONTEXT = uintptr type NDR_RUNDOWN = uintptr type NDR_NOTIFY_ROUTINE = uintptr type NDR_NOTIFY2_ROUTINE = uintptr type _SCONTEXT_QUEUE = struct { FNumberOfObjects uint32 F__ccgo_pad1 [4]byte FArrayOfObjects uintptr } type SCONTEXT_QUEUE = _SCONTEXT_QUEUE type PSCONTEXT_QUEUE = uintptr type Error_status_t = uint32 type _MIDL_STUB_MESSAGE = struct { FRpcMsg PRPC_MESSAGE FBuffer uintptr FBufferStart uintptr FBufferEnd uintptr FBufferMark uintptr FBufferLength uint32 FMemorySize uint32 FMemory uintptr FIsClient uint8 FPad uint8 FuFlags2 uint16 FReuseBuffer int32 FpAllocAllNodesContext uintptr FpPointerQueueState uintptr FIgnoreEmbeddedPointers int32 F__ccgo_pad1 [4]byte FPointerBufferMark uintptr FfBufferValid uint8 FuFlags uint8 FUniquePtrCount uint16 F__ccgo_pad2 [4]byte FMaxCount ULONG_PTR FOffset uint32 FActualCount uint32 FpfnAllocate uintptr FpfnFree uintptr FStackTop uintptr FpPresentedType uintptr FpTransmitType uintptr FSavedHandle Handle_t FStubDesc uintptr FFullPtrXlatTables uintptr FFullPtrRefId uint32 FPointerLength uint32 FfInDontFree uint32 F__ccgo_pad3 [4]byte FdwDestContext uint32 F__ccgo_pad4 [4]byte FpvDestContext uintptr FSavedContextHandles uintptr FParamNumber int32 F__ccgo_pad5 [4]byte FpRpcChannelBuffer uintptr FpArrayInfo PARRAY_INFO FSizePtrCountArray uintptr FSizePtrOffsetArray uintptr FSizePtrLengthArray uintptr FpArgQueue uintptr FdwStubPhase uint32 F__ccgo_pad6 [4]byte FLowStackMark uintptr FpAsyncMsg PNDR_ASYNC_MESSAGE FpCorrInfo PNDR_CORRELATION_INFO FpCorrMemory uintptr FpMemoryList uintptr FpCSInfo uintptr FConformanceMark uintptr FVarianceMark uintptr FUnused INT_PTR FpContext uintptr FpUserMarshalList uintptr FReserved51_2 INT_PTR FReserved51_3 INT_PTR FReserved51_4 INT_PTR FReserved51_5 INT_PTR } type _MIDL_STUB_DESC = struct { FRpcInterfaceInformation uintptr FpfnAllocate uintptr FpfnFree uintptr FIMPLICIT_HANDLE_INFO struct{ FpAutoHandle uintptr } FapfnNdrRundownRoutines uintptr FaGenericBindingRoutinePairs uintptr FapfnExprEval uintptr FaXmitQuintuple uintptr FpFormatTypes uintptr FfCheckBounds int32 FVersion uint32 FpMallocFreeStruct uintptr FMIDLVersion int32 F__ccgo_pad1 [4]byte FCommFaultOffsets uintptr FaUserMarshalQuadruple uintptr FNotifyRoutineTable uintptr FmFlags ULONG_PTR FCsRoutineTables uintptr FReserved4 uintptr FReserved5 ULONG_PTR } type _FULL_PTR_XLAT_TABLES = struct { FRefIdToPointer struct { FXlatTable uintptr FStateTable uintptr FNumberOfEntries uint32 F__ccgo_pad1 [4]byte } FPointerToRefId struct { FXlatTable uintptr FNumberOfBuckets uint32 FHashMask uint32 } FNextRefId uint32 FXlatSide XLAT_SIDE } type RPC_BUFPTR = uintptr type RPC_LENGTH = uint32 type EXPR_EVAL = uintptr type PFORMAT_STRING = uintptr type ARRAY_INFO = struct { FDimension int32 F__ccgo_pad1 [4]byte FBufferConformanceMark uintptr FBufferVarianceMark uintptr FMaxCountArray uintptr FOffsetArray uintptr FActualCountArray uintptr } type PARRAY_INFO = uintptr type PNDR_ASYNC_MESSAGE = uintptr type PNDR_CORRELATION_INFO = uintptr type CS_STUB_INFO = struct { FWireCodeset uint32 FDesiredReceivingCodeset uint32 FCSArrayInfo uintptr } type _MIDL_SYNTAX_INFO = struct { FTransferSyntax RPC_SYNTAX_IDENTIFIER F__ccgo_pad1 [4]byte FDispatchTable uintptr FProcString PFORMAT_STRING FFmtStringOffset uintptr FTypeString PFORMAT_STRING FaUserMarshalQuadruple uintptr FpReserved1 ULONG_PTR FpReserved2 ULONG_PTR } type MIDL_SYNTAX_INFO = _MIDL_SYNTAX_INFO type PMIDL_SYNTAX_INFO = uintptr type IRpcChannelBuffer1 = struct{ FlpVtbl uintptr } type MIDL_STUB_MESSAGE = _MIDL_STUB_MESSAGE type PMIDL_STUB_MESSAGE = uintptr type GENERIC_BINDING_ROUTINE = uintptr type GENERIC_UNBIND_ROUTINE = uintptr type _GENERIC_BINDING_ROUTINE_PAIR = struct { FpfnBind GENERIC_BINDING_ROUTINE FpfnUnbind GENERIC_UNBIND_ROUTINE } type GENERIC_BINDING_ROUTINE_PAIR = _GENERIC_BINDING_ROUTINE_PAIR type PGENERIC_BINDING_ROUTINE_PAIR = uintptr type __GENERIC_BINDING_INFO = struct { FpObj uintptr FSize uint32 F__ccgo_pad1 [4]byte FpfnBind GENERIC_BINDING_ROUTINE FpfnUnbind GENERIC_UNBIND_ROUTINE } type GENERIC_BINDING_INFO = __GENERIC_BINDING_INFO type PGENERIC_BINDING_INFO = uintptr type XMIT_HELPER_ROUTINE = uintptr type _XMIT_ROUTINE_QUINTUPLE = struct { FpfnTranslateToXmit XMIT_HELPER_ROUTINE FpfnTranslateFromXmit XMIT_HELPER_ROUTINE FpfnFreeXmit XMIT_HELPER_ROUTINE FpfnFreeInst XMIT_HELPER_ROUTINE } type XMIT_ROUTINE_QUINTUPLE = _XMIT_ROUTINE_QUINTUPLE type PXMIT_ROUTINE_QUINTUPLE = uintptr type USER_MARSHAL_SIZING_ROUTINE = uintptr type USER_MARSHAL_MARSHALLING_ROUTINE = uintptr type USER_MARSHAL_UNMARSHALLING_ROUTINE = uintptr type USER_MARSHAL_FREEING_ROUTINE = uintptr type _USER_MARSHAL_ROUTINE_QUADRUPLE = struct { FpfnBufferSize USER_MARSHAL_SIZING_ROUTINE FpfnMarshall USER_MARSHAL_MARSHALLING_ROUTINE FpfnUnmarshall USER_MARSHAL_UNMARSHALLING_ROUTINE FpfnFree USER_MARSHAL_FREEING_ROUTINE } type USER_MARSHAL_ROUTINE_QUADRUPLE = _USER_MARSHAL_ROUTINE_QUADRUPLE type USER_MARSHAL_CB_TYPE = uint32 type _USER_MARSHAL_CB = struct { FFlags uint32 F__ccgo_pad1 [4]byte FpStubMsg PMIDL_STUB_MESSAGE FpReserve PFORMAT_STRING FSignature uint32 FCBType USER_MARSHAL_CB_TYPE FpFormat PFORMAT_STRING FpTypeFormat PFORMAT_STRING } type USER_MARSHAL_CB = _USER_MARSHAL_CB type _MALLOC_FREE_STRUCT = struct { FpfnAllocate uintptr FpfnFree uintptr } type MALLOC_FREE_STRUCT = _MALLOC_FREE_STRUCT type _COMM_FAULT_OFFSETS = struct { FCommOffset int16 FFaultOffset int16 } type COMM_FAULT_OFFSETS = _COMM_FAULT_OFFSETS type IDL_CS_CONVERT = uint32 type CS_TYPE_NET_SIZE_ROUTINE = uintptr type CS_TYPE_LOCAL_SIZE_ROUTINE = uintptr type CS_TYPE_TO_NETCS_ROUTINE = uintptr type CS_TYPE_FROM_NETCS_ROUTINE = uintptr type CS_TAG_GETTING_ROUTINE = uintptr type _NDR_CS_SIZE_CONVERT_ROUTINES = struct { FpfnNetSize CS_TYPE_NET_SIZE_ROUTINE FpfnToNetCs CS_TYPE_TO_NETCS_ROUTINE FpfnLocalSize CS_TYPE_LOCAL_SIZE_ROUTINE FpfnFromNetCs CS_TYPE_FROM_NETCS_ROUTINE } type NDR_CS_SIZE_CONVERT_ROUTINES = _NDR_CS_SIZE_CONVERT_ROUTINES type _NDR_CS_ROUTINES = struct { FpSizeConvertRoutines uintptr FpTagGettingRoutines uintptr } type NDR_CS_ROUTINES = _NDR_CS_ROUTINES type MIDL_STUB_DESC = _MIDL_STUB_DESC type PMIDL_STUB_DESC = uintptr type PMIDL_XMIT_TYPE = uintptr type _MIDL_FORMAT_STRING = struct { F__ccgo_pad1 [0]uint16 FPad int16 } type MIDL_FORMAT_STRING = _MIDL_FORMAT_STRING type STUB_THUNK = uintptr type SERVER_ROUTINE = uintptr type _MIDL_SERVER_INFO_ = struct { FpStubDesc PMIDL_STUB_DESC FDispatchTable uintptr FProcString PFORMAT_STRING FFmtStringOffset uintptr FThunkTable uintptr FpTransferSyntax PRPC_SYNTAX_IDENTIFIER FnCount ULONG_PTR FpSyntaxInfo PMIDL_SYNTAX_INFO } type MIDL_SERVER_INFO = _MIDL_SERVER_INFO_ type PMIDL_SERVER_INFO = uintptr type _MIDL_STUBLESS_PROXY_INFO = struct { FpStubDesc PMIDL_STUB_DESC FProcFormatString PFORMAT_STRING FFormatStringOffset uintptr FpTransferSyntax PRPC_SYNTAX_IDENTIFIER FnCount ULONG_PTR FpSyntaxInfo PMIDL_SYNTAX_INFO } type MIDL_STUBLESS_PROXY_INFO = _MIDL_STUBLESS_PROXY_INFO type PMIDL_STUBLESS_PROXY_INFO = uintptr type PARAM_OFFSETTABLE = uintptr type PPARAM_OFFSETTABLE = uintptr type _CLIENT_CALL_RETURN = struct{ FPointer uintptr } type CLIENT_CALL_RETURN = _CLIENT_CALL_RETURN type XLAT_SIDE = uint32 type _FULL_PTR_TO_REFID_ELEMENT = struct { FNext uintptr FPointer uintptr FRefId uint32 FState uint8 F__ccgo_pad1 [3]byte } type FULL_PTR_TO_REFID_ELEMENT = _FULL_PTR_TO_REFID_ELEMENT type PFULL_PTR_TO_REFID_ELEMENT = uintptr type FULL_PTR_XLAT_TABLES = _FULL_PTR_XLAT_TABLES type PFULL_PTR_XLAT_TABLES = uintptr type STUB_PHASE = uint32 type PROXY_PHASE = uint32 type IRpcStubBuffer1 = struct{ FlpVtbl uintptr } type RPC_SS_THREAD_HANDLE = uintptr type _NDR_USER_MARSHAL_INFO_LEVEL1 = struct { FBuffer uintptr FBufferSize uint32 F__ccgo_pad1 [4]byte FpfnAllocate uintptr FpfnFree uintptr FpRpcChannelBuffer uintptr FReserved [5]ULONG_PTR } type NDR_USER_MARSHAL_INFO_LEVEL1 = _NDR_USER_MARSHAL_INFO_LEVEL1 type _NDR_USER_MARSHAL_INFO = struct { FInformationLevel uint32 F__ccgo_pad1 [4]byte F__8 struct{ FLevel1 NDR_USER_MARSHAL_INFO_LEVEL1 } } type NDR_USER_MARSHAL_INFO = _NDR_USER_MARSHAL_INFO type REGCLS = uint32 type IRpcStubBuffer = IRpcStubBuffer1 type IRpcChannelBuffer = IRpcChannelBuffer1 type COINITBASE = uint32 type OLECHAR = WCHAR type LPOLESTR = uintptr type LPCOLESTR = uintptr type DOUBLE = float64 type _COAUTHIDENTITY = struct { FUser uintptr FUserLength ULONG F__ccgo_pad1 [4]byte FDomain uintptr FDomainLength ULONG F__ccgo_pad2 [4]byte FPassword uintptr FPasswordLength ULONG FFlags ULONG } type COAUTHIDENTITY = _COAUTHIDENTITY type _COAUTHINFO = struct { FdwAuthnSvc DWORD FdwAuthzSvc DWORD FpwszServerPrincName LPWSTR FdwAuthnLevel DWORD FdwImpersonationLevel DWORD FpAuthIdentityData uintptr FdwCapabilities DWORD F__ccgo_pad1 [4]byte } type COAUTHINFO = _COAUTHINFO type SCODE = LONG type PSCODE = uintptr type MEMCTX = int32 type CLSCTX = int32 type MSHLFLAGS = uint32 type MSHCTX = uint32 type _BYTE_BLOB = struct { FclSize ULONG FabData [1]Byte F__ccgo_pad1 [3]byte } type BYTE_BLOB = _BYTE_BLOB type UP_BYTE_BLOB = uintptr type _WORD_BLOB = struct { FclSize ULONG FasData [1]uint16 F__ccgo_pad1 [2]byte } type WORD_BLOB = _WORD_BLOB type UP_WORD_BLOB = uintptr type _DWORD_BLOB = struct { FclSize ULONG FalData [1]ULONG } type DWORD_BLOB = _DWORD_BLOB type UP_DWORD_BLOB = uintptr type _FLAGGED_BYTE_BLOB = struct { FfFlags ULONG FclSize ULONG FabData [1]Byte F__ccgo_pad1 [3]byte } type FLAGGED_BYTE_BLOB = _FLAGGED_BYTE_BLOB type UP_FLAGGED_BYTE_BLOB = uintptr type _FLAGGED_WORD_BLOB = struct { FfFlags ULONG FclSize ULONG FasData [1]uint16 F__ccgo_pad1 [2]byte } type FLAGGED_WORD_BLOB = _FLAGGED_WORD_BLOB type UP_FLAGGED_WORD_BLOB = uintptr type _BYTE_SIZEDARR = struct { FclSize ULONG F__ccgo_pad1 [4]byte FpData uintptr } type BYTE_SIZEDARR = _BYTE_SIZEDARR type _SHORT_SIZEDARR = struct { FclSize ULONG F__ccgo_pad1 [4]byte FpData uintptr } type WORD_SIZEDARR = _SHORT_SIZEDARR type _LONG_SIZEDARR = struct { FclSize ULONG F__ccgo_pad1 [4]byte FpData uintptr } type DWORD_SIZEDARR = _LONG_SIZEDARR type _HYPER_SIZEDARR = struct { FclSize ULONG F__ccgo_pad1 [4]byte FpData uintptr } type HYPER_SIZEDARR = _HYPER_SIZEDARR type tagBLOB = struct { FcbSize ULONG F__ccgo_pad1 [4]byte FpBlobData uintptr } type BLOB = tagBLOB type LPBLOB = uintptr type IUnknown1 = struct{ FlpVtbl uintptr } type IUnknown = IUnknown1 type AsyncIUnknown1 = struct{ FlpVtbl uintptr } type AsyncIUnknown = AsyncIUnknown1 type IClassFactory1 = struct{ FlpVtbl uintptr } type IClassFactory = IClassFactory1 type LPUNKNOWN = uintptr type IUnknownVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr } type IUnknownVtbl = IUnknownVtbl1 type AsyncIUnknownVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBegin_QueryInterface uintptr FFinish_QueryInterface uintptr FBegin_AddRef uintptr FFinish_AddRef uintptr FBegin_Release uintptr FFinish_Release uintptr } type AsyncIUnknownVtbl = AsyncIUnknownVtbl1 type LPCLASSFACTORY = uintptr type IClassFactoryVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateInstance uintptr FLockServer uintptr } type IClassFactoryVtbl = IClassFactoryVtbl1 type IMarshal1 = struct{ FlpVtbl uintptr } type IMarshal = IMarshal1 type INoMarshal1 = struct{ FlpVtbl uintptr } type INoMarshal = INoMarshal1 type IAgileObject1 = struct{ FlpVtbl uintptr } type IAgileObject = IAgileObject1 type IAgileReference1 = struct{ FlpVtbl uintptr } type IAgileReference = IAgileReference1 type IMarshal21 = struct{ FlpVtbl uintptr } type IMarshal2 = IMarshal21 type IMalloc1 = struct{ FlpVtbl uintptr } type IMalloc = IMalloc1 type IStdMarshalInfo1 = struct{ FlpVtbl uintptr } type IStdMarshalInfo = IStdMarshalInfo1 type IExternalConnection1 = struct{ FlpVtbl uintptr } type IExternalConnection = IExternalConnection1 type IMultiQI1 = struct{ FlpVtbl uintptr } type IMultiQI = IMultiQI1 type AsyncIMultiQI1 = struct{ FlpVtbl uintptr } type AsyncIMultiQI = AsyncIMultiQI1 type IInternalUnknown1 = struct{ FlpVtbl uintptr } type IInternalUnknown = IInternalUnknown1 type IEnumUnknown1 = struct{ FlpVtbl uintptr } type IEnumUnknown = IEnumUnknown1 type IEnumString1 = struct{ FlpVtbl uintptr } type IEnumString = IEnumString1 type ISequentialStream1 = struct{ FlpVtbl uintptr } type ISequentialStream = ISequentialStream1 type IStream1 = struct{ FlpVtbl uintptr } type IStream = IStream1 type IRpcChannelBuffer21 = struct{ FlpVtbl uintptr } type IRpcChannelBuffer2 = IRpcChannelBuffer21 type IAsyncRpcChannelBuffer1 = struct{ FlpVtbl uintptr } type IAsyncRpcChannelBuffer = IAsyncRpcChannelBuffer1 type IRpcChannelBuffer31 = struct{ FlpVtbl uintptr } type IRpcChannelBuffer3 = IRpcChannelBuffer31 type IRpcSyntaxNegotiate1 = struct{ FlpVtbl uintptr } type IRpcSyntaxNegotiate = IRpcSyntaxNegotiate1 type IRpcProxyBuffer1 = struct{ FlpVtbl uintptr } type IRpcProxyBuffer = IRpcProxyBuffer1 type IPSFactoryBuffer1 = struct{ FlpVtbl uintptr } type IPSFactoryBuffer = IPSFactoryBuffer1 type IChannelHook1 = struct{ FlpVtbl uintptr } type IChannelHook = IChannelHook1 type IClientSecurity1 = struct{ FlpVtbl uintptr } type IClientSecurity = IClientSecurity1 type IServerSecurity1 = struct{ FlpVtbl uintptr } type IServerSecurity = IServerSecurity1 type IRpcOptions1 = struct{ FlpVtbl uintptr } type IRpcOptions = IRpcOptions1 type IGlobalOptions1 = struct{ FlpVtbl uintptr } type IGlobalOptions = IGlobalOptions1 type ISurrogate1 = struct{ FlpVtbl uintptr } type ISurrogate = ISurrogate1 type IGlobalInterfaceTable1 = struct{ FlpVtbl uintptr } type IGlobalInterfaceTable = IGlobalInterfaceTable1 type ISynchronize1 = struct{ FlpVtbl uintptr } type ISynchronize = ISynchronize1 type ISynchronizeHandle1 = struct{ FlpVtbl uintptr } type ISynchronizeHandle = ISynchronizeHandle1 type ISynchronizeEvent1 = struct{ FlpVtbl uintptr } type ISynchronizeEvent = ISynchronizeEvent1 type ISynchronizeContainer1 = struct{ FlpVtbl uintptr } type ISynchronizeContainer = ISynchronizeContainer1 type ISynchronizeMutex1 = struct{ FlpVtbl uintptr } type ISynchronizeMutex = ISynchronizeMutex1 type ICancelMethodCalls1 = struct{ FlpVtbl uintptr } type ICancelMethodCalls = ICancelMethodCalls1 type IAsyncManager1 = struct{ FlpVtbl uintptr } type IAsyncManager = IAsyncManager1 type ICallFactory1 = struct{ FlpVtbl uintptr } type ICallFactory = ICallFactory1 type IRpcHelper1 = struct{ FlpVtbl uintptr } type IRpcHelper = IRpcHelper1 type IReleaseMarshalBuffers1 = struct{ FlpVtbl uintptr } type IReleaseMarshalBuffers = IReleaseMarshalBuffers1 type IWaitMultiple1 = struct{ FlpVtbl uintptr } type IWaitMultiple = IWaitMultiple1 type IAddrTrackingControl1 = struct{ FlpVtbl uintptr } type IAddrTrackingControl = IAddrTrackingControl1 type IAddrExclusionControl1 = struct{ FlpVtbl uintptr } type IAddrExclusionControl = IAddrExclusionControl1 type IPipeByte1 = struct{ FlpVtbl uintptr } type IPipeByte = IPipeByte1 type IPipeLong1 = struct{ FlpVtbl uintptr } type IPipeLong = IPipeLong1 type IPipeDouble1 = struct{ FlpVtbl uintptr } type IPipeDouble = IPipeDouble1 type IComThreadingInfo1 = struct{ FlpVtbl uintptr } type IComThreadingInfo = IComThreadingInfo1 type IProcessInitControl1 = struct{ FlpVtbl uintptr } type IProcessInitControl = IProcessInitControl1 type IFastRundown1 = struct{ FlpVtbl uintptr } type IFastRundown = IFastRundown1 type IMarshalingStream1 = struct{ FlpVtbl uintptr } type IMarshalingStream = IMarshalingStream1 type _COSERVERINFO = struct { FdwReserved1 DWORD F__ccgo_pad1 [4]byte FpwszName LPWSTR FpAuthInfo uintptr FdwReserved2 DWORD F__ccgo_pad2 [4]byte } type COSERVERINFO = _COSERVERINFO type LPMARSHAL = uintptr type IMarshalVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetUnmarshalClass uintptr FGetMarshalSizeMax uintptr FMarshalInterface uintptr FUnmarshalInterface uintptr FReleaseMarshalData uintptr FDisconnectObject uintptr } type IMarshalVtbl = IMarshalVtbl1 type INoMarshalVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr } type INoMarshalVtbl = INoMarshalVtbl1 type IAgileObjectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr } type IAgileObjectVtbl = IAgileObjectVtbl1 type IAgileReferenceVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FResolve uintptr } type IAgileReferenceVtbl = IAgileReferenceVtbl1 type LPMARSHAL2 = uintptr type IMarshal2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetUnmarshalClass uintptr FGetMarshalSizeMax uintptr FMarshalInterface uintptr FUnmarshalInterface uintptr FReleaseMarshalData uintptr FDisconnectObject uintptr } type IMarshal2Vtbl = IMarshal2Vtbl1 type LPMALLOC = uintptr type IMallocVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAlloc uintptr FRealloc uintptr FFree uintptr FGetSize uintptr FDidAlloc uintptr FHeapMinimize uintptr } type IMallocVtbl = IMallocVtbl1 type LPSTDMARSHALINFO = uintptr type IStdMarshalInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassForHandler uintptr } type IStdMarshalInfoVtbl = IStdMarshalInfoVtbl1 type LPEXTERNALCONNECTION = uintptr type EXTCONN = uint32 type IExternalConnectionVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAddConnection uintptr FReleaseConnection uintptr } type IExternalConnectionVtbl = IExternalConnectionVtbl1 type LPMULTIQI = uintptr type tagMULTI_QI = struct { FpIID uintptr FpItf uintptr Fhr HRESULT F__ccgo_pad1 [4]byte } type MULTI_QI = tagMULTI_QI type IMultiQIVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryMultipleInterfaces uintptr } type IMultiQIVtbl = IMultiQIVtbl1 type AsyncIMultiQIVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBegin_QueryMultipleInterfaces uintptr FFinish_QueryMultipleInterfaces uintptr } type AsyncIMultiQIVtbl = AsyncIMultiQIVtbl1 type IInternalUnknownVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryInternalInterface uintptr } type IInternalUnknownVtbl = IInternalUnknownVtbl1 type LPENUMUNKNOWN = uintptr type IEnumUnknownVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumUnknownVtbl = IEnumUnknownVtbl1 type LPENUMSTRING = uintptr type IEnumStringVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumStringVtbl = IEnumStringVtbl1 type ISequentialStreamVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRead uintptr FWrite uintptr } type ISequentialStreamVtbl = ISequentialStreamVtbl1 type LPSTREAM = uintptr type tagSTATSTG = struct { FpwcsName LPOLESTR Ftype DWORD F__ccgo_pad1 [4]byte FcbSize ULARGE_INTEGER Fmtime FILETIME Fctime FILETIME Fatime FILETIME FgrfMode DWORD FgrfLocksSupported DWORD Fclsid CLSID FgrfStateBits DWORD Freserved DWORD } type STATSTG = tagSTATSTG type STGTY = uint32 type STREAM_SEEK = uint32 type LOCKTYPE = uint32 type IStreamVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRead uintptr FWrite uintptr FSeek uintptr FSetSize uintptr FCopyTo uintptr FCommit uintptr FRevert uintptr FLockRegion uintptr FUnlockRegion uintptr FStat uintptr FClone uintptr } type IStreamVtbl = IStreamVtbl1 type RPCOLEDATAREP = ULONG type tagRPCOLEMESSAGE = struct { Freserved1 uintptr FdataRepresentation RPCOLEDATAREP F__ccgo_pad1 [4]byte FBuffer uintptr FcbBuffer ULONG FiMethod ULONG Freserved2 [5]uintptr FrpcFlags ULONG F__ccgo_pad2 [4]byte } type RPCOLEMESSAGE = tagRPCOLEMESSAGE type PRPCOLEMESSAGE = uintptr type IRpcChannelBufferVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetBuffer uintptr FSendReceive uintptr FFreeBuffer uintptr FGetDestCtx uintptr FIsConnected uintptr } type IRpcChannelBufferVtbl = IRpcChannelBufferVtbl1 type IRpcChannelBuffer2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetBuffer uintptr FSendReceive uintptr FFreeBuffer uintptr FGetDestCtx uintptr FIsConnected uintptr FGetProtocolVersion uintptr } type IRpcChannelBuffer2Vtbl = IRpcChannelBuffer2Vtbl1 type IAsyncRpcChannelBufferVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetBuffer uintptr FSendReceive uintptr FFreeBuffer uintptr FGetDestCtx uintptr FIsConnected uintptr FGetProtocolVersion uintptr FSend uintptr FReceive uintptr FGetDestCtxEx uintptr } type IAsyncRpcChannelBufferVtbl = IAsyncRpcChannelBufferVtbl1 type IRpcChannelBuffer3Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetBuffer uintptr FSendReceive uintptr FFreeBuffer uintptr FGetDestCtx uintptr FIsConnected uintptr FGetProtocolVersion uintptr FSend uintptr FReceive uintptr FCancel uintptr FGetCallContext uintptr FGetDestCtxEx uintptr FGetState uintptr FRegisterAsync uintptr } type IRpcChannelBuffer3Vtbl = IRpcChannelBuffer3Vtbl1 type IRpcSyntaxNegotiateVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNegotiateSyntax uintptr } type IRpcSyntaxNegotiateVtbl = IRpcSyntaxNegotiateVtbl1 type IRpcProxyBufferVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FConnect uintptr FDisconnect uintptr } type IRpcProxyBufferVtbl = IRpcProxyBufferVtbl1 type IRpcStubBufferVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FConnect uintptr FDisconnect uintptr FInvoke uintptr FIsIIDSupported uintptr FCountRefs uintptr FDebugServerQueryInterface uintptr FDebugServerRelease uintptr } type IRpcStubBufferVtbl = IRpcStubBufferVtbl1 type IPSFactoryBufferVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateProxy uintptr FCreateStub uintptr } type IPSFactoryBufferVtbl = IPSFactoryBufferVtbl1 type SChannelHookCallInfo1 = struct { Fiid IID FcbSize DWORD FuCausality GUID FdwServerPid DWORD FiMethod DWORD F__ccgo_pad1 [4]byte FpObject uintptr } type SChannelHookCallInfo = SChannelHookCallInfo1 type IChannelHookVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FClientGetSize uintptr FClientFillBuffer uintptr FClientNotify uintptr FServerNotify uintptr FServerGetSize uintptr FServerFillBuffer uintptr } type IChannelHookVtbl = IChannelHookVtbl1 type tagSOLE_AUTHENTICATION_SERVICE = struct { FdwAuthnSvc DWORD FdwAuthzSvc DWORD FpPrincipalName uintptr Fhr HRESULT F__ccgo_pad1 [4]byte } type SOLE_AUTHENTICATION_SERVICE = tagSOLE_AUTHENTICATION_SERVICE type PSOLE_AUTHENTICATION_SERVICE = uintptr type EOLE_AUTHENTICATION_CAPABILITIES = uint32 type tagSOLE_AUTHENTICATION_INFO = struct { FdwAuthnSvc DWORD FdwAuthzSvc DWORD FpAuthInfo uintptr } type SOLE_AUTHENTICATION_INFO = tagSOLE_AUTHENTICATION_INFO type PSOLE_AUTHENTICATION_INFO = uintptr type tagSOLE_AUTHENTICATION_LIST = struct { FcAuthInfo DWORD F__ccgo_pad1 [4]byte FaAuthInfo uintptr } type SOLE_AUTHENTICATION_LIST = tagSOLE_AUTHENTICATION_LIST type PSOLE_AUTHENTICATION_LIST = uintptr type IClientSecurityVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryBlanket uintptr FSetBlanket uintptr FCopyProxy uintptr } type IClientSecurityVtbl = IClientSecurityVtbl1 type IServerSecurityVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryBlanket uintptr FImpersonateClient uintptr FRevertToSelf uintptr FIsImpersonating uintptr } type IServerSecurityVtbl = IServerSecurityVtbl1 type RPCOPT_PROPERTIES = uint32 type RPCOPT_SERVER_LOCALITY_VALUES = uint32 type IRpcOptionsVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSet uintptr FQuery uintptr } type IRpcOptionsVtbl = IRpcOptionsVtbl1 type GLOBALOPT_PROPERTIES = uint32 type GLOBALOPT_EH_VALUES = uint32 type GLOBALOPT_RPCTP_VALUES = uint32 type GLOBALOPT_RO_FLAGS = uint32 type GLOBALOPT_UNMARSHALING_POLICY_VALUES = uint32 type IGlobalOptionsVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSet uintptr FQuery uintptr } type IGlobalOptionsVtbl = IGlobalOptionsVtbl1 type LPSURROGATE = uintptr type ISurrogateVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FLoadDllServer uintptr FFreeSurrogate uintptr } type ISurrogateVtbl = ISurrogateVtbl1 type LPGLOBALINTERFACETABLE = uintptr type IGlobalInterfaceTableVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRegisterInterfaceInGlobal uintptr FRevokeInterfaceFromGlobal uintptr FGetInterfaceFromGlobal uintptr } type IGlobalInterfaceTableVtbl = IGlobalInterfaceTableVtbl1 type ISynchronizeVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FWait uintptr FSignal uintptr FReset uintptr } type ISynchronizeVtbl = ISynchronizeVtbl1 type ISynchronizeHandleVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetHandle uintptr } type ISynchronizeHandleVtbl = ISynchronizeHandleVtbl1 type ISynchronizeEventVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetHandle uintptr FSetEventHandle uintptr } type ISynchronizeEventVtbl = ISynchronizeEventVtbl1 type ISynchronizeContainerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAddSynchronize uintptr FWaitMultiple uintptr } type ISynchronizeContainerVtbl = ISynchronizeContainerVtbl1 type ISynchronizeMutexVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FWait uintptr FSignal uintptr FReset uintptr FReleaseMutex uintptr } type ISynchronizeMutexVtbl = ISynchronizeMutexVtbl1 type LPCANCELMETHODCALLS = uintptr type ICancelMethodCallsVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCancel uintptr FTestCancel uintptr } type ICancelMethodCallsVtbl = ICancelMethodCallsVtbl1 type DCOM_CALL_STATE = uint32 type IAsyncManagerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCompleteCall uintptr FGetCallContext uintptr FGetState uintptr } type IAsyncManagerVtbl = IAsyncManagerVtbl1 type ICallFactoryVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateCall uintptr } type ICallFactoryVtbl = ICallFactoryVtbl1 type IRpcHelperVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetDCOMProtocolVersion uintptr FGetIIDFromOBJREF uintptr } type IRpcHelperVtbl = IRpcHelperVtbl1 type IReleaseMarshalBuffersVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FReleaseMarshalBuffer uintptr } type IReleaseMarshalBuffersVtbl = IReleaseMarshalBuffersVtbl1 type IWaitMultipleVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FWaitMultiple uintptr FAddSynchronize uintptr } type IWaitMultipleVtbl = IWaitMultipleVtbl1 type LPADDRTRACKINGCONTROL = uintptr type IAddrTrackingControlVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FEnableCOMDynamicAddrTracking uintptr FDisableCOMDynamicAddrTracking uintptr } type IAddrTrackingControlVtbl = IAddrTrackingControlVtbl1 type LPADDREXCLUSIONCONTROL = uintptr type IAddrExclusionControlVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetCurrentAddrExclusionList uintptr FUpdateAddrExclusionList uintptr } type IAddrExclusionControlVtbl = IAddrExclusionControlVtbl1 type IPipeByteVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FPull uintptr FPush uintptr } type IPipeByteVtbl = IPipeByteVtbl1 type IPipeLongVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FPull uintptr FPush uintptr } type IPipeLongVtbl = IPipeLongVtbl1 type IPipeDoubleVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FPull uintptr FPush uintptr } type IPipeDoubleVtbl = IPipeDoubleVtbl1 type APTTYPEQUALIFIER = uint32 type APTTYPE = int32 type THDTYPE = uint32 type APARTMENTID = DWORD type IComThreadingInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetCurrentApartmentType uintptr FGetCurrentThreadType uintptr FGetCurrentLogicalThreadId uintptr FSetCurrentLogicalThreadId uintptr } type IComThreadingInfoVtbl = IComThreadingInfoVtbl1 type IProcessInitControlVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FResetInitializerTimeout uintptr } type IProcessInitControlVtbl = IProcessInitControlVtbl1 type IFastRundownVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr } type IFastRundownVtbl = IFastRundownVtbl1 type CO_MARSHALING_CONTEXT_ATTRIBUTES = uint32 type IMarshalingStreamVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRead uintptr FWrite uintptr FSeek uintptr FSetSize uintptr FCopyTo uintptr FCommit uintptr FRevert uintptr FLockRegion uintptr FUnlockRegion uintptr FStat uintptr FClone uintptr FGetMarshalingContextAttribute uintptr } type IMarshalingStreamVtbl = IMarshalingStreamVtbl1 type STDMSHLFLAGS = uint32 type tagPROPVARIANT = struct { F__0 struct { F__0 struct { Fvt VARTYPE FwReserved1 PROPVAR_PAD1 FwReserved2 PROPVAR_PAD2 FwReserved3 PROPVAR_PAD3 F__8 struct { F__ccgo_pad1 [0]uint64 FcVal CHAR F__ccgo_pad2 [15]byte } } } } type PROPVARIANT = tagPROPVARIANT type COWAIT_FLAGS = uint32 type LPFNGETCLASSOBJECT = uintptr type LPFNCANUNLOADNOW = uintptr type COINIT = uint32 type STGFMT = DWORD type IMallocSpy1 = struct{ FlpVtbl uintptr } type IMallocSpy = IMallocSpy1 type IBindCtx1 = struct{ FlpVtbl uintptr } type IBindCtx = IBindCtx1 type IEnumMoniker1 = struct{ FlpVtbl uintptr } type IEnumMoniker = IEnumMoniker1 type IRunnableObject1 = struct{ FlpVtbl uintptr } type IRunnableObject = IRunnableObject1 type IRunningObjectTable1 = struct{ FlpVtbl uintptr } type IRunningObjectTable = IRunningObjectTable1 type IPersist1 = struct{ FlpVtbl uintptr } type IPersist = IPersist1 type IPersistStream1 = struct{ FlpVtbl uintptr } type IPersistStream = IPersistStream1 type IMoniker1 = struct{ FlpVtbl uintptr } type IMoniker = IMoniker1 type IROTData1 = struct{ FlpVtbl uintptr } type IROTData = IROTData1 type IEnumSTATSTG1 = struct{ FlpVtbl uintptr } type IEnumSTATSTG = IEnumSTATSTG1 type IStorage1 = struct{ FlpVtbl uintptr } type IStorage = IStorage1 type IPersistFile1 = struct{ FlpVtbl uintptr } type IPersistFile = IPersistFile1 type IPersistStorage1 = struct{ FlpVtbl uintptr } type IPersistStorage = IPersistStorage1 type ILockBytes1 = struct{ FlpVtbl uintptr } type ILockBytes = ILockBytes1 type IEnumFORMATETC1 = struct{ FlpVtbl uintptr } type IEnumFORMATETC = IEnumFORMATETC1 type IEnumSTATDATA1 = struct{ FlpVtbl uintptr } type IEnumSTATDATA = IEnumSTATDATA1 type IRootStorage1 = struct{ FlpVtbl uintptr } type IRootStorage = IRootStorage1 type IAdviseSink1 = struct{ FlpVtbl uintptr } type IAdviseSink = IAdviseSink1 type AsyncIAdviseSink1 = struct{ FlpVtbl uintptr } type AsyncIAdviseSink = AsyncIAdviseSink1 type IAdviseSink21 = struct{ FlpVtbl uintptr } type IAdviseSink2 = IAdviseSink21 type AsyncIAdviseSink21 = struct{ FlpVtbl uintptr } type AsyncIAdviseSink2 = AsyncIAdviseSink21 type IDataObject1 = struct{ FlpVtbl uintptr } type IDataObject = IDataObject1 type IDataAdviseHolder1 = struct{ FlpVtbl uintptr } type IDataAdviseHolder = IDataAdviseHolder1 type IMessageFilter1 = struct{ FlpVtbl uintptr } type IMessageFilter = IMessageFilter1 type IClassActivator1 = struct{ FlpVtbl uintptr } type IClassActivator = IClassActivator1 type IFillLockBytes1 = struct{ FlpVtbl uintptr } type IFillLockBytes = IFillLockBytes1 type IProgressNotify1 = struct{ FlpVtbl uintptr } type IProgressNotify = IProgressNotify1 type ILayoutStorage1 = struct{ FlpVtbl uintptr } type ILayoutStorage = ILayoutStorage1 type IBlockingLock1 = struct{ FlpVtbl uintptr } type IBlockingLock = IBlockingLock1 type ITimeAndNoticeControl1 = struct{ FlpVtbl uintptr } type ITimeAndNoticeControl = ITimeAndNoticeControl1 type IOplockStorage1 = struct{ FlpVtbl uintptr } type IOplockStorage = IOplockStorage1 type IDirectWriterLock1 = struct{ FlpVtbl uintptr } type IDirectWriterLock = IDirectWriterLock1 type IUrlMon1 = struct{ FlpVtbl uintptr } type IUrlMon = IUrlMon1 type IForegroundTransfer1 = struct{ FlpVtbl uintptr } type IForegroundTransfer = IForegroundTransfer1 type IThumbnailExtractor1 = struct{ FlpVtbl uintptr } type IThumbnailExtractor = IThumbnailExtractor1 type IDummyHICONIncluder1 = struct{ FlpVtbl uintptr } type IDummyHICONIncluder = IDummyHICONIncluder1 type IProcessLock1 = struct{ FlpVtbl uintptr } type IProcessLock = IProcessLock1 type ISurrogateService1 = struct{ FlpVtbl uintptr } type ISurrogateService = ISurrogateService1 type IInitializeSpy1 = struct{ FlpVtbl uintptr } type IInitializeSpy = IInitializeSpy1 type IApartmentShutdown1 = struct{ FlpVtbl uintptr } type IApartmentShutdown = IApartmentShutdown1 type tagRemHGLOBAL = struct { FfNullHGlobal LONG FcbData ULONG Fdata [1]Byte F__ccgo_pad1 [3]byte } type RemHGLOBAL = tagRemHGLOBAL type tagRemHMETAFILEPICT = struct { Fmm LONG FxExt LONG FyExt LONG FcbData ULONG Fdata [1]Byte F__ccgo_pad1 [3]byte } type RemHMETAFILEPICT = tagRemHMETAFILEPICT type tagRemHENHMETAFILE = struct { FcbData ULONG Fdata [1]Byte F__ccgo_pad1 [3]byte } type RemHENHMETAFILE = tagRemHENHMETAFILE type tagRemHBITMAP = struct { FcbData ULONG Fdata [1]Byte F__ccgo_pad1 [3]byte } type RemHBITMAP = tagRemHBITMAP type tagRemHPALETTE = struct { FcbData ULONG Fdata [1]Byte F__ccgo_pad1 [3]byte } type RemHPALETTE = tagRemHPALETTE type tagRemBRUSH = struct { FcbData ULONG Fdata [1]Byte F__ccgo_pad1 [3]byte } type RemHBRUSH = tagRemBRUSH type DVASPECT = uint32 type STGC = uint32 type STGMOVE = uint32 type STATFLAG = uint32 type HCONTEXT = uintptr type _userCLIPFORMAT = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FdwValue DWORD F__ccgo_pad2 [4]byte } } type UserCLIPFORMAT = _userCLIPFORMAT type WireCLIPFORMAT = uintptr type CLIPFORMAT = WORD type _GDI_NONREMOTE = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FhInproc LONG F__ccgo_pad2 [4]byte } } type GDI_NONREMOTE = _GDI_NONREMOTE type _userHGLOBAL = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FhInproc LONG F__ccgo_pad2 [4]byte } } type UserHGLOBAL = _userHGLOBAL type WireHGLOBAL = uintptr type _userHMETAFILE = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FhInproc LONG F__ccgo_pad2 [4]byte } } type UserHMETAFILE = _userHMETAFILE type _remoteMETAFILEPICT = struct { Fmm LONG FxExt LONG FyExt LONG F__ccgo_pad1 [4]byte FhMF uintptr } type RemoteMETAFILEPICT = _remoteMETAFILEPICT type _userHMETAFILEPICT = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FhInproc LONG F__ccgo_pad2 [4]byte } } type UserHMETAFILEPICT = _userHMETAFILEPICT type _userHENHMETAFILE = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FhInproc LONG F__ccgo_pad2 [4]byte } } type UserHENHMETAFILE = _userHENHMETAFILE type _userBITMAP = struct { FbmType LONG FbmWidth LONG FbmHeight LONG FbmWidthBytes LONG FbmPlanes WORD FbmBitsPixel WORD FcbSize ULONG FpBuffer [1]Byte F__ccgo_pad1 [3]byte } type UserBITMAP = _userBITMAP type _userHBITMAP = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FhInproc LONG F__ccgo_pad2 [4]byte } } type UserHBITMAP = _userHBITMAP type _userHPALETTE = struct { FfContext LONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FhInproc LONG F__ccgo_pad2 [4]byte } } type UserHPALETTE = _userHPALETTE type _RemotableHandle = struct { FfContext LONG Fu struct{ FhInproc LONG } } type RemotableHandle = _RemotableHandle type WireHWND = uintptr type WireHMENU = uintptr type WireHACCEL = uintptr type WireHBRUSH = uintptr type WireHFONT = uintptr type WireHDC = uintptr type WireHICON = uintptr type WireHRGN = uintptr type WireHMONITOR = uintptr type WireHBITMAP = uintptr type WireHPALETTE = uintptr type WireHENHMETAFILE = uintptr type WireHMETAFILE = uintptr type WireHMETAFILEPICT = uintptr type HMETAFILEPICT = uintptr type DATE = float64 type tagCY = struct { F__ccgo_pad1 [0]uint64 Fs struct { FLo uint32 FHi int32 } } type CY = tagCY type LPCY = uintptr type tagDEC = struct { FwReserved USHORT Fu struct { F__ccgo_pad1 [0]uint16 Fs struct { Fscale BYTE Fsign BYTE } } FHi32 ULONG Fu2 struct { F__ccgo_pad1 [0]uint64 Fs2 struct { FLo32 ULONG FMid32 ULONG } } } type DECIMAL = tagDEC type LPDECIMAL = uintptr type WireBSTR = uintptr type BSTR = uintptr type LPBSTR = uintptr type VARIANT_BOOL = int16 type tagBSTRBLOB = struct { FcbSize ULONG F__ccgo_pad1 [4]byte FpData uintptr } type BSTRBLOB = tagBSTRBLOB type LPBSTRBLOB = uintptr type tagCLIPDATA = struct { FcbSize ULONG FulClipFmt LONG FpClipData uintptr } type CLIPDATA = tagCLIPDATA type VARTYPE = uint16 type PROPID = ULONG type _tagpropertykey = struct { Ffmtid GUID Fpid DWORD } type PROPERTYKEY = _tagpropertykey type tagCSPLATFORM = struct { FdwPlatformId DWORD FdwVersionHi DWORD FdwVersionLo DWORD FdwProcessorArch DWORD } type CSPLATFORM = tagCSPLATFORM type tagQUERYCONTEXT = struct { FdwContext DWORD FPlatform CSPLATFORM FLocale LCID FdwVersionHi DWORD FdwVersionLo DWORD } type QUERYCONTEXT = tagQUERYCONTEXT type TYSPEC = uint32 type __WIDL_wtypes_generated_name_00000001 = struct { Ftyspec DWORD F__ccgo_pad1 [4]byte Ftagged_union struct { F__ccgo_pad1 [0]uint64 Fclsid CLSID F__ccgo_pad2 [16]byte } } type UCLSSPEC = __WIDL_wtypes_generated_name_00000001 type LPMALLOCSPY = uintptr type IMallocSpyVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FPreAlloc uintptr FPostAlloc uintptr FPreFree uintptr FPostFree uintptr FPreRealloc uintptr FPostRealloc uintptr FPreGetSize uintptr FPostGetSize uintptr FPreDidAlloc uintptr FPostDidAlloc uintptr FPreHeapMinimize uintptr FPostHeapMinimize uintptr } type IMallocSpyVtbl = IMallocSpyVtbl1 type LPBC = uintptr type LPBINDCTX = uintptr type tagBIND_OPTS = struct { FcbStruct DWORD FgrfFlags DWORD FgrfMode DWORD FdwTickCountDeadline DWORD } type BIND_OPTS = tagBIND_OPTS type LPBIND_OPTS = uintptr type tagBIND_OPTS2 = struct { FcbStruct DWORD FgrfFlags DWORD FgrfMode DWORD FdwTickCountDeadline DWORD FdwTrackFlags DWORD FdwClassContext DWORD Flocale LCID F__ccgo_pad1 [4]byte FpServerInfo uintptr } type BIND_OPTS2 = tagBIND_OPTS2 type LPBIND_OPTS2 = uintptr type tagBIND_OPTS3 = struct { FcbStruct DWORD FgrfFlags DWORD FgrfMode DWORD FdwTickCountDeadline DWORD FdwTrackFlags DWORD FdwClassContext DWORD Flocale LCID F__ccgo_pad1 [4]byte FpServerInfo uintptr Fhwnd HWND } type BIND_OPTS3 = tagBIND_OPTS3 type LPBIND_OPTS3 = uintptr type BIND_FLAGS = uint32 type IBindCtxVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRegisterObjectBound uintptr FRevokeObjectBound uintptr FReleaseBoundObjects uintptr FSetBindOptions uintptr FGetBindOptions uintptr FGetRunningObjectTable uintptr FRegisterObjectParam uintptr FGetObjectParam uintptr FEnumObjectParam uintptr FRevokeObjectParam uintptr } type IBindCtxVtbl = IBindCtxVtbl1 type LPENUMMONIKER = uintptr type IEnumMonikerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumMonikerVtbl = IEnumMonikerVtbl1 type LPRUNNABLEOBJECT = uintptr type IRunnableObjectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetRunningClass uintptr FRun uintptr FIsRunning uintptr FLockRunning uintptr FSetContainedObject uintptr } type IRunnableObjectVtbl = IRunnableObjectVtbl1 type LPRUNNINGOBJECTTABLE = uintptr type IRunningObjectTableVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRegister uintptr FRevoke uintptr FIsRunning uintptr FGetObjectA uintptr FNoteChangeTime uintptr FGetTimeOfLastChange uintptr FEnumRunning uintptr } type IRunningObjectTableVtbl = IRunningObjectTableVtbl1 type LPPERSIST = uintptr type IPersistVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassID uintptr } type IPersistVtbl = IPersistVtbl1 type LPPERSISTSTREAM = uintptr type IPersistStreamVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassID uintptr FIsDirty uintptr FLoad uintptr FSave uintptr FGetSizeMax uintptr } type IPersistStreamVtbl = IPersistStreamVtbl1 type LPMONIKER = uintptr type MKSYS = uint32 type MKRREDUCE = uint32 type IMonikerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassID uintptr FIsDirty uintptr FLoad uintptr FSave uintptr FGetSizeMax uintptr FBindToObject uintptr FBindToStorage uintptr FReduce uintptr FComposeWith uintptr FEnum uintptr FIsEqual uintptr FHash uintptr FIsRunning uintptr FGetTimeOfLastChange uintptr FInverse uintptr FCommonPrefixWith uintptr FRelativePathTo uintptr FGetDisplayName uintptr FParseDisplayName uintptr FIsSystemMoniker uintptr } type IMonikerVtbl = IMonikerVtbl1 type IROTDataVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetComparisonData uintptr } type IROTDataVtbl = IROTDataVtbl1 type LPENUMSTATSTG = uintptr type IEnumSTATSTGVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumSTATSTGVtbl = IEnumSTATSTGVtbl1 type LPSTORAGE = uintptr type tagRemSNB = struct { FulCntStr ULONG FulCntChar ULONG FrgString [1]OLECHAR F__ccgo_pad1 [2]byte } type RemSNB = tagRemSNB type WireSNB = uintptr type SNB = uintptr type IStorageVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateStream uintptr FOpenStream uintptr FCreateStorage uintptr FOpenStorage uintptr FCopyTo uintptr FMoveElementTo uintptr FCommit uintptr FRevert uintptr FEnumElements uintptr FDestroyElement uintptr FRenameElement uintptr FSetElementTimes uintptr FSetClass uintptr FSetStateBits uintptr FStat uintptr } type IStorageVtbl = IStorageVtbl1 type LPPERSISTFILE = uintptr type IPersistFileVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassID uintptr FIsDirty uintptr FLoad uintptr FSave uintptr FSaveCompleted uintptr FGetCurFile uintptr } type IPersistFileVtbl = IPersistFileVtbl1 type LPPERSISTSTORAGE = uintptr type IPersistStorageVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassID uintptr FIsDirty uintptr FInitNew uintptr FLoad uintptr FSave uintptr FSaveCompleted uintptr FHandsOffStorage uintptr } type IPersistStorageVtbl = IPersistStorageVtbl1 type LPLOCKBYTES = uintptr type ILockBytesVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FReadAt uintptr FWriteAt uintptr FFlush uintptr FSetSize uintptr FLockRegion uintptr FUnlockRegion uintptr FStat uintptr } type ILockBytesVtbl = ILockBytesVtbl1 type LPENUMFORMATETC = uintptr type tagDVTARGETDEVICE = struct { FtdSize DWORD FtdDriverNameOffset WORD FtdDeviceNameOffset WORD FtdPortNameOffset WORD FtdExtDevmodeOffset WORD FtdData [1]BYTE F__ccgo_pad1 [3]byte } type DVTARGETDEVICE = tagDVTARGETDEVICE type LPCLIPFORMAT = uintptr type tagFORMATETC = struct { FcfFormat CLIPFORMAT F__ccgo_pad1 [6]byte Fptd uintptr FdwAspect DWORD Flindex LONG Ftymed DWORD F__ccgo_pad2 [4]byte } type FORMATETC = tagFORMATETC type LPFORMATETC = uintptr type IEnumFORMATETCVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumFORMATETCVtbl = IEnumFORMATETCVtbl1 type LPENUMSTATDATA = uintptr type ADVF = uint32 type tagSTATDATA = struct { Fformatetc FORMATETC Fadvf DWORD F__ccgo_pad1 [4]byte FpAdvSink uintptr FdwConnection DWORD F__ccgo_pad2 [4]byte } type STATDATA = tagSTATDATA type LPSTATDATA = uintptr type IEnumSTATDATAVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumSTATDATAVtbl = IEnumSTATDATAVtbl1 type LPROOTSTORAGE = uintptr type IRootStorageVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSwitchToFile uintptr } type IRootStorageVtbl = IRootStorageVtbl1 type LPADVISESINK = uintptr type TYMED = uint32 type tagRemSTGMEDIUM = struct { Ftymed DWORD FdwHandleType DWORD FpData ULONG FpUnkForRelease ULONG FcbData ULONG Fdata [1]Byte F__ccgo_pad1 [3]byte } type RemSTGMEDIUM = tagRemSTGMEDIUM type tagSTGMEDIUM = struct { Ftymed DWORD F__ccgo_pad1 [4]byte Fu struct{ FhBitmap HBITMAP } FpUnkForRelease uintptr } type USTGMEDIUM = tagSTGMEDIUM type _GDI_OBJECT = struct { FObjectType DWORD F__ccgo_pad1 [4]byte Fu struct{ FhBitmap WireHBITMAP } } type GDI_OBJECT = _GDI_OBJECT type _userSTGMEDIUM = struct { Fu struct { Ftymed DWORD F__ccgo_pad1 [4]byte Fu struct{ FhMetaFilePict WireHMETAFILEPICT } } FpUnkForRelease uintptr } type _STGMEDIUM_UNION = struct { Ftymed DWORD F__ccgo_pad1 [4]byte Fu struct{ FhMetaFilePict WireHMETAFILEPICT } } type UserSTGMEDIUM = _userSTGMEDIUM type WireSTGMEDIUM = uintptr type STGMEDIUM = USTGMEDIUM type WireASYNC_STGMEDIUM = uintptr type ASYNC_STGMEDIUM = STGMEDIUM type LPSTGMEDIUM = uintptr type _userFLAG_STGMEDIUM = struct { FContextFlags LONG FfPassOwnership LONG FStgmed UserSTGMEDIUM } type UserFLAG_STGMEDIUM = _userFLAG_STGMEDIUM type WireFLAG_STGMEDIUM = uintptr type _FLAG_STGMEDIUM = struct { FContextFlags LONG FfPassOwnership LONG FStgmed STGMEDIUM } type FLAG_STGMEDIUM = _FLAG_STGMEDIUM type IAdviseSinkVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FOnDataChange uintptr FOnViewChange uintptr FOnRename uintptr FOnSave uintptr FOnClose uintptr } type IAdviseSinkVtbl = IAdviseSinkVtbl1 type AsyncIAdviseSinkVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBegin_OnDataChange uintptr FFinish_OnDataChange uintptr FBegin_OnViewChange uintptr FFinish_OnViewChange uintptr FBegin_OnRename uintptr FFinish_OnRename uintptr FBegin_OnSave uintptr FFinish_OnSave uintptr FBegin_OnClose uintptr FFinish_OnClose uintptr } type AsyncIAdviseSinkVtbl = AsyncIAdviseSinkVtbl1 type LPADVISESINK2 = uintptr type IAdviseSink2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FOnDataChange uintptr FOnViewChange uintptr FOnRename uintptr FOnSave uintptr FOnClose uintptr FOnLinkSrcChange uintptr } type IAdviseSink2Vtbl = IAdviseSink2Vtbl1 type AsyncIAdviseSink2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBegin_OnDataChange uintptr FFinish_OnDataChange uintptr FBegin_OnViewChange uintptr FFinish_OnViewChange uintptr FBegin_OnRename uintptr FFinish_OnRename uintptr FBegin_OnSave uintptr FFinish_OnSave uintptr FBegin_OnClose uintptr FFinish_OnClose uintptr FBegin_OnLinkSrcChange uintptr FFinish_OnLinkSrcChange uintptr } type AsyncIAdviseSink2Vtbl = AsyncIAdviseSink2Vtbl1 type LPDATAOBJECT = uintptr type DATADIR = uint32 type IDataObjectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetData uintptr FGetDataHere uintptr FQueryGetData uintptr FGetCanonicalFormatEtc uintptr FSetData uintptr FEnumFormatEtc uintptr FDAdvise uintptr FDUnadvise uintptr FEnumDAdvise uintptr } type IDataObjectVtbl = IDataObjectVtbl1 type LPDATAADVISEHOLDER = uintptr type IDataAdviseHolderVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAdvise uintptr FUnadvise uintptr FEnumAdvise uintptr FSendOnDataChange uintptr } type IDataAdviseHolderVtbl = IDataAdviseHolderVtbl1 type LPMESSAGEFILTER = uintptr type CALLTYPE = uint32 type SERVERCALL = uint32 type PENDINGTYPE = uint32 type PENDINGMSG = uint32 type tagINTERFACEINFO = struct { FpUnk uintptr Fiid IID FwMethod WORD F__ccgo_pad1 [6]byte } type INTERFACEINFO = tagINTERFACEINFO type LPINTERFACEINFO = uintptr type IMessageFilterVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FHandleInComingCall uintptr FRetryRejectedCall uintptr FMessagePending uintptr } type IMessageFilterVtbl = IMessageFilterVtbl1 type IClassActivatorVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassObject uintptr } type IClassActivatorVtbl = IClassActivatorVtbl1 type IFillLockBytesVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FFillAppend uintptr FFillAt uintptr FSetFillSize uintptr FTerminate uintptr } type IFillLockBytesVtbl = IFillLockBytesVtbl1 type IProgressNotifyVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FOnProgress uintptr } type IProgressNotifyVtbl = IProgressNotifyVtbl1 type tagStorageLayout = struct { FLayoutType DWORD F__ccgo_pad1 [4]byte FpwcsElementName uintptr FcOffset LARGE_INTEGER FcBytes LARGE_INTEGER } type StorageLayout = tagStorageLayout type ILayoutStorageVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FLayoutScript uintptr FBeginMonitor uintptr FEndMonitor uintptr FReLayoutDocfile uintptr FReLayoutDocfileOnILockBytes uintptr } type ILayoutStorageVtbl = ILayoutStorageVtbl1 type IBlockingLockVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FLock uintptr FUnlock uintptr } type IBlockingLockVtbl = IBlockingLockVtbl1 type ITimeAndNoticeControlVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSuppressChanges uintptr } type ITimeAndNoticeControlVtbl = ITimeAndNoticeControlVtbl1 type IOplockStorageVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateStorageEx uintptr FOpenStorageEx uintptr } type IOplockStorageVtbl = IOplockStorageVtbl1 type IDirectWriterLockVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FWaitForWriteAccess uintptr FReleaseWriteAccess uintptr FHaveWriteAccess uintptr } type IDirectWriterLockVtbl = IDirectWriterLockVtbl1 type IUrlMonVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAsyncGetClassBits uintptr } type IUrlMonVtbl = IUrlMonVtbl1 type IForegroundTransferVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAllowForegroundTransfer uintptr } type IForegroundTransferVtbl = IForegroundTransferVtbl1 type IThumbnailExtractorVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FExtractThumbnail uintptr FOnFileUpdated uintptr } type IThumbnailExtractorVtbl = IThumbnailExtractorVtbl1 type IDummyHICONIncluderVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FDummy uintptr } type IDummyHICONIncluderVtbl = IDummyHICONIncluderVtbl1 type ApplicationType = uint32 type ShutdownType = uint32 type IProcessLockVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAddRefOnProcess uintptr FReleaseRefOnProcess uintptr } type IProcessLockVtbl = IProcessLockVtbl1 type ISurrogateServiceVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FInit uintptr FApplicationLaunch uintptr FApplicationFree uintptr FCatalogRefresh uintptr FProcessShutdown uintptr } type ISurrogateServiceVtbl = ISurrogateServiceVtbl1 type LPINITIALIZESPY = uintptr type IInitializeSpyVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FPreInitialize uintptr FPostInitialize uintptr FPreUninitialize uintptr FPostUninitialize uintptr } type IInitializeSpyVtbl = IInitializeSpyVtbl1 type IApartmentShutdownVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FOnUninitialize uintptr } type IApartmentShutdownVtbl = IApartmentShutdownVtbl1 type COMSD = uint32 type tagSTGOPTIONS = struct { FusVersion USHORT Freserved USHORT FulSectorSize ULONG FpwcsTemplateFile uintptr } type STGOPTIONS = tagSTGOPTIONS type IPersistMoniker1 = struct{ FlpVtbl uintptr } type IPersistMoniker = IPersistMoniker1 type IMonikerProp1 = struct{ FlpVtbl uintptr } type IMonikerProp = IMonikerProp1 type IBindProtocol1 = struct{ FlpVtbl uintptr } type IBindProtocol = IBindProtocol1 type IBinding1 = struct{ FlpVtbl uintptr } type IBinding = IBinding1 type IBindStatusCallback1 = struct{ FlpVtbl uintptr } type IBindStatusCallback = IBindStatusCallback1 type IBindStatusCallbackEx1 = struct{ FlpVtbl uintptr } type IBindStatusCallbackEx = IBindStatusCallbackEx1 type IAuthenticate1 = struct{ FlpVtbl uintptr } type IAuthenticate = IAuthenticate1 type IAuthenticateEx1 = struct{ FlpVtbl uintptr } type IAuthenticateEx = IAuthenticateEx1 type IHttpNegotiate1 = struct{ FlpVtbl uintptr } type IHttpNegotiate = IHttpNegotiate1 type IHttpNegotiate21 = struct{ FlpVtbl uintptr } type IHttpNegotiate2 = IHttpNegotiate21 type IHttpNegotiate31 = struct{ FlpVtbl uintptr } type IHttpNegotiate3 = IHttpNegotiate31 type IWinInetFileStream1 = struct{ FlpVtbl uintptr } type IWinInetFileStream = IWinInetFileStream1 type IWindowForBindingUI1 = struct{ FlpVtbl uintptr } type IWindowForBindingUI = IWindowForBindingUI1 type ICodeInstall1 = struct{ FlpVtbl uintptr } type ICodeInstall = ICodeInstall1 type IWinInetInfo1 = struct{ FlpVtbl uintptr } type IWinInetInfo = IWinInetInfo1 type IHttpSecurity1 = struct{ FlpVtbl uintptr } type IHttpSecurity = IHttpSecurity1 type IWinInetHttpInfo1 = struct{ FlpVtbl uintptr } type IWinInetHttpInfo = IWinInetHttpInfo1 type IWinInetHttpTimeouts1 = struct{ FlpVtbl uintptr } type IWinInetHttpTimeouts = IWinInetHttpTimeouts1 type IBindHost1 = struct{ FlpVtbl uintptr } type IBindHost = IBindHost1 type IInternet1 = struct{ FlpVtbl uintptr } type IInternet = IInternet1 type IInternetBindInfo1 = struct{ FlpVtbl uintptr } type IInternetBindInfo = IInternetBindInfo1 type IInternetBindInfoEx1 = struct{ FlpVtbl uintptr } type IInternetBindInfoEx = IInternetBindInfoEx1 type IInternetProtocolRoot1 = struct{ FlpVtbl uintptr } type IInternetProtocolRoot = IInternetProtocolRoot1 type IInternetProtocol1 = struct{ FlpVtbl uintptr } type IInternetProtocol = IInternetProtocol1 type IInternetProtocolSink1 = struct{ FlpVtbl uintptr } type IInternetProtocolSink = IInternetProtocolSink1 type IInternetProtocolSinkStackable1 = struct{ FlpVtbl uintptr } type IInternetProtocolSinkStackable = IInternetProtocolSinkStackable1 type IInternetSession1 = struct{ FlpVtbl uintptr } type IInternetSession = IInternetSession1 type IInternetThreadSwitch1 = struct{ FlpVtbl uintptr } type IInternetThreadSwitch = IInternetThreadSwitch1 type IInternetPriority1 = struct{ FlpVtbl uintptr } type IInternetPriority = IInternetPriority1 type IInternetProtocolInfo1 = struct{ FlpVtbl uintptr } type IInternetProtocolInfo = IInternetProtocolInfo1 type IInternetSecurityMgrSite1 = struct{ FlpVtbl uintptr } type IInternetSecurityMgrSite = IInternetSecurityMgrSite1 type IInternetSecurityManager1 = struct{ FlpVtbl uintptr } type IInternetSecurityManager = IInternetSecurityManager1 type IInternetHostSecurityManager1 = struct{ FlpVtbl uintptr } type IInternetHostSecurityManager = IInternetHostSecurityManager1 type IInternetZoneManager1 = struct{ FlpVtbl uintptr } type IInternetZoneManager = IInternetZoneManager1 type ISoftDistExt1 = struct{ FlpVtbl uintptr } type ISoftDistExt = ISoftDistExt1 type ICatalogFileInfo1 = struct{ FlpVtbl uintptr } type ICatalogFileInfo = ICatalogFileInfo1 type IDataFilter1 = struct{ FlpVtbl uintptr } type IDataFilter = IDataFilter1 type IEncodingFilterFactory1 = struct{ FlpVtbl uintptr } type IEncodingFilterFactory = IEncodingFilterFactory1 type IWrappedProtocol1 = struct{ FlpVtbl uintptr } type IWrappedProtocol = IWrappedProtocol1 type IGetBindHandle1 = struct{ FlpVtbl uintptr } type IGetBindHandle = IGetBindHandle1 type IBindCallbackRedirect1 = struct{ FlpVtbl uintptr } type IBindCallbackRedirect = IBindCallbackRedirect1 type IOleAdviseHolder1 = struct{ FlpVtbl uintptr } type IOleAdviseHolder = IOleAdviseHolder1 type IOleCache1 = struct{ FlpVtbl uintptr } type IOleCache = IOleCache1 type IOleCache21 = struct{ FlpVtbl uintptr } type IOleCache2 = IOleCache21 type IOleCacheControl1 = struct{ FlpVtbl uintptr } type IOleCacheControl = IOleCacheControl1 type IParseDisplayName1 = struct{ FlpVtbl uintptr } type IParseDisplayName = IParseDisplayName1 type IOleContainer1 = struct{ FlpVtbl uintptr } type IOleContainer = IOleContainer1 type IOleClientSite1 = struct{ FlpVtbl uintptr } type IOleClientSite = IOleClientSite1 type IOleObject1 = struct{ FlpVtbl uintptr } type IOleObject = IOleObject1 type IOleWindow1 = struct{ FlpVtbl uintptr } type IOleWindow = IOleWindow1 type IOleLink1 = struct{ FlpVtbl uintptr } type IOleLink = IOleLink1 type IOleItemContainer1 = struct{ FlpVtbl uintptr } type IOleItemContainer = IOleItemContainer1 type IOleInPlaceUIWindow1 = struct{ FlpVtbl uintptr } type IOleInPlaceUIWindow = IOleInPlaceUIWindow1 type IOleInPlaceActiveObject1 = struct{ FlpVtbl uintptr } type IOleInPlaceActiveObject = IOleInPlaceActiveObject1 type IOleInPlaceFrame1 = struct{ FlpVtbl uintptr } type IOleInPlaceFrame = IOleInPlaceFrame1 type IOleInPlaceObject1 = struct{ FlpVtbl uintptr } type IOleInPlaceObject = IOleInPlaceObject1 type IOleInPlaceSite1 = struct{ FlpVtbl uintptr } type IOleInPlaceSite = IOleInPlaceSite1 type IContinue1 = struct{ FlpVtbl uintptr } type IContinue = IContinue1 type IViewObject1 = struct{ FlpVtbl uintptr } type IViewObject = IViewObject1 type IViewObject21 = struct{ FlpVtbl uintptr } type IViewObject2 = IViewObject21 type IDropSource1 = struct{ FlpVtbl uintptr } type IDropSource = IDropSource1 type IDropTarget1 = struct{ FlpVtbl uintptr } type IDropTarget = IDropTarget1 type IDropSourceNotify1 = struct{ FlpVtbl uintptr } type IDropSourceNotify = IDropSourceNotify1 type IEnumOLEVERB1 = struct{ FlpVtbl uintptr } type IEnumOLEVERB = IEnumOLEVERB1 type LPOLEADVISEHOLDER = uintptr type IOleAdviseHolderVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAdvise uintptr FUnadvise uintptr FEnumAdvise uintptr FSendOnRename uintptr FSendOnSave uintptr FSendOnClose uintptr } type IOleAdviseHolderVtbl = IOleAdviseHolderVtbl1 type LPOLECACHE = uintptr type IOleCacheVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCache uintptr FUncache uintptr FEnumCache uintptr FInitCache uintptr FSetData uintptr } type IOleCacheVtbl = IOleCacheVtbl1 type LPOLECACHE2 = uintptr type DISCARDCACHE = uint32 type IOleCache2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCache uintptr FUncache uintptr FEnumCache uintptr FInitCache uintptr FSetData uintptr FUpdateCache uintptr FDiscardCache uintptr } type IOleCache2Vtbl = IOleCache2Vtbl1 type LPOLECACHECONTROL = uintptr type IOleCacheControlVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FOnRun uintptr FOnStop uintptr } type IOleCacheControlVtbl = IOleCacheControlVtbl1 type LPPARSEDISPLAYNAME = uintptr type IParseDisplayNameVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FParseDisplayName uintptr } type IParseDisplayNameVtbl = IParseDisplayNameVtbl1 type LPOLECONTAINER = uintptr type IOleContainerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FParseDisplayName uintptr FEnumObjects uintptr FLockContainer uintptr } type IOleContainerVtbl = IOleContainerVtbl1 type LPOLECLIENTSITE = uintptr type IOleClientSiteVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSaveObject uintptr FGetMoniker uintptr FGetContainer uintptr FShowObject uintptr FOnShowWindow uintptr FRequestNewObjectLayout uintptr } type IOleClientSiteVtbl = IOleClientSiteVtbl1 type LPOLEOBJECT = uintptr type OLEGETMONIKER = uint32 type OLEWHICHMK = uint32 type USERCLASSTYPE = uint32 type OLEMISC = uint32 type OLECLOSE = uint32 type IOleObjectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetClientSite uintptr FGetClientSite uintptr FSetHostNames uintptr FClose uintptr FSetMoniker uintptr FGetMoniker uintptr FInitFromData uintptr FGetClipboardData uintptr FDoVerb uintptr FEnumVerbs uintptr FUpdate uintptr FIsUpToDate uintptr FGetUserClassID uintptr FGetUserType uintptr FSetExtent uintptr FGetExtent uintptr FAdvise uintptr FUnadvise uintptr FEnumAdvise uintptr FGetMiscStatus uintptr FSetColorScheme uintptr } type IOleObjectVtbl = IOleObjectVtbl1 type OLERENDER = uint32 type LPOLERENDER = uintptr type tagOBJECTDESCRIPTOR = struct { FcbSize ULONG Fclsid CLSID FdwDrawAspect DWORD Fsizel SIZEL Fpointl POINTL FdwStatus DWORD FdwFullUserTypeName DWORD FdwSrcOfCopy DWORD } type OBJECTDESCRIPTOR = tagOBJECTDESCRIPTOR type POBJECTDESCRIPTOR = uintptr type LPOBJECTDESCRIPTOR = uintptr type LINKSRCDESCRIPTOR = tagOBJECTDESCRIPTOR type PLINKSRCDESCRIPTOR = uintptr type LPLINKSRCDESCRIPTOR = uintptr type LPOLEWINDOW = uintptr type IOleWindowVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FContextSensitiveHelp uintptr } type IOleWindowVtbl = IOleWindowVtbl1 type LPOLELINK = uintptr type OLEUPDATE = uint32 type LPOLEUPDATE = uintptr type POLEUPDATE = uintptr type OLELINKBIND = uint32 type IOleLinkVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetUpdateOptions uintptr FGetUpdateOptions uintptr FSetSourceMoniker uintptr FGetSourceMoniker uintptr FSetSourceDisplayName uintptr FGetSourceDisplayName uintptr FBindToSource uintptr FBindIfRunning uintptr FGetBoundSource uintptr FUnbindSource uintptr FUpdate uintptr } type IOleLinkVtbl = IOleLinkVtbl1 type LPOLEITEMCONTAINER = uintptr type BINDSPEED = uint32 type OLECONTF = uint32 type IOleItemContainerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FParseDisplayName uintptr FEnumObjects uintptr FLockContainer uintptr FGetObjectA uintptr FGetObjectStorage uintptr FIsRunning uintptr } type IOleItemContainerVtbl = IOleItemContainerVtbl1 type LPOLEINPLACEUIWINDOW = uintptr type BORDERWIDTHS = RECT type LPBORDERWIDTHS = LPRECT type LPCBORDERWIDTHS = LPCRECT type IOleInPlaceUIWindowVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FContextSensitiveHelp uintptr FGetBorder uintptr FRequestBorderSpace uintptr FSetBorderSpace uintptr FSetActiveObject uintptr } type IOleInPlaceUIWindowVtbl = IOleInPlaceUIWindowVtbl1 type LPOLEINPLACEACTIVEOBJECT = uintptr type IOleInPlaceActiveObjectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FContextSensitiveHelp uintptr FTranslateAcceleratorA uintptr FOnFrameWindowActivate uintptr FOnDocWindowActivate uintptr FResizeBorder uintptr FEnableModeless uintptr } type IOleInPlaceActiveObjectVtbl = IOleInPlaceActiveObjectVtbl1 type LPOLEINPLACEFRAME = uintptr type tagOIFI = struct { Fcb UINT FfMDIApp WINBOOL FhwndFrame HWND Fhaccel HACCEL FcAccelEntries UINT F__ccgo_pad1 [4]byte } type OLEINPLACEFRAMEINFO = tagOIFI type LPOLEINPLACEFRAMEINFO = uintptr type tagOleMenuGroupWidths = struct{ Fwidth [6]LONG } type OLEMENUGROUPWIDTHS = tagOleMenuGroupWidths type LPOLEMENUGROUPWIDTHS = uintptr type HOLEMENU = HGLOBAL type IOleInPlaceFrameVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FContextSensitiveHelp uintptr FGetBorder uintptr FRequestBorderSpace uintptr FSetBorderSpace uintptr FSetActiveObject uintptr FInsertMenus uintptr FSetMenu uintptr FRemoveMenus uintptr FSetStatusText uintptr FEnableModeless uintptr FTranslateAcceleratorA uintptr } type IOleInPlaceFrameVtbl = IOleInPlaceFrameVtbl1 type LPOLEINPLACEOBJECT = uintptr type IOleInPlaceObjectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FContextSensitiveHelp uintptr FInPlaceDeactivate uintptr FUIDeactivate uintptr FSetObjectRects uintptr FReactivateAndUndo uintptr } type IOleInPlaceObjectVtbl = IOleInPlaceObjectVtbl1 type LPOLEINPLACESITE = uintptr type IOleInPlaceSiteVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FContextSensitiveHelp uintptr FCanInPlaceActivate uintptr FOnInPlaceActivate uintptr FOnUIActivate uintptr FGetWindowContext uintptr FScroll uintptr FOnUIDeactivate uintptr FOnInPlaceDeactivate uintptr FDiscardUndoState uintptr FDeactivateAndUndo uintptr FOnPosRectChange uintptr } type IOleInPlaceSiteVtbl = IOleInPlaceSiteVtbl1 type IContinueVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FFContinue uintptr } type IContinueVtbl = IContinueVtbl1 type LPVIEWOBJECT = uintptr type IViewObjectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FDraw uintptr FGetColorSet uintptr FFreeze uintptr FUnfreeze uintptr FSetAdvise uintptr FGetAdvise uintptr } type IViewObjectVtbl = IViewObjectVtbl1 type LPVIEWOBJECT2 = uintptr type IViewObject2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FDraw uintptr FGetColorSet uintptr FFreeze uintptr FUnfreeze uintptr FSetAdvise uintptr FGetAdvise uintptr FGetExtent uintptr } type IViewObject2Vtbl = IViewObject2Vtbl1 type LPDROPSOURCE = uintptr type IDropSourceVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryContinueDrag uintptr FGiveFeedback uintptr } type IDropSourceVtbl = IDropSourceVtbl1 type LPDROPTARGET = uintptr type IDropTargetVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FDragEnter uintptr FDragOver uintptr FDragLeave uintptr FDrop uintptr } type IDropTargetVtbl = IDropTargetVtbl1 type IDropSourceNotifyVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FDragEnterTarget uintptr FDragLeaveTarget uintptr } type IDropSourceNotifyVtbl = IDropSourceNotifyVtbl1 type LPENUMOLEVERB = uintptr type tagOLEVERB = struct { FlVerb LONG F__ccgo_pad1 [4]byte FlpszVerbName LPOLESTR FfuFlags DWORD FgrfAttribs DWORD } type OLEVERB = tagOLEVERB type LPOLEVERB = uintptr type OLEVERBATTRIB = uint32 type IEnumOLEVERBVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumOLEVERBVtbl = IEnumOLEVERBVtbl1 type IServiceProvider1 = struct{ FlpVtbl uintptr } type IServiceProvider = IServiceProvider1 type LPSERVICEPROVIDER = uintptr type IServiceProviderVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryService uintptr } type IServiceProviderVtbl = IServiceProviderVtbl1 type ICreateTypeInfo1 = struct{ FlpVtbl uintptr } type ICreateTypeInfo = ICreateTypeInfo1 type ICreateTypeInfo21 = struct{ FlpVtbl uintptr } type ICreateTypeInfo2 = ICreateTypeInfo21 type ICreateTypeLib1 = struct{ FlpVtbl uintptr } type ICreateTypeLib = ICreateTypeLib1 type ICreateTypeLib21 = struct{ FlpVtbl uintptr } type ICreateTypeLib2 = ICreateTypeLib21 type IDispatch1 = struct{ FlpVtbl uintptr } type IDispatch = IDispatch1 type IEnumVARIANT1 = struct{ FlpVtbl uintptr } type IEnumVARIANT = IEnumVARIANT1 type ITypeComp1 = struct{ FlpVtbl uintptr } type ITypeComp = ITypeComp1 type ITypeInfo1 = struct{ FlpVtbl uintptr } type ITypeInfo = ITypeInfo1 type ITypeInfo21 = struct{ FlpVtbl uintptr } type ITypeInfo2 = ITypeInfo21 type ITypeLib1 = struct{ FlpVtbl uintptr } type ITypeLib = ITypeLib1 type ITypeLib21 = struct{ FlpVtbl uintptr } type ITypeLib2 = ITypeLib21 type ITypeChangeEvents1 = struct{ FlpVtbl uintptr } type ITypeChangeEvents = ITypeChangeEvents1 type IErrorInfo1 = struct{ FlpVtbl uintptr } type IErrorInfo = IErrorInfo1 type ICreateErrorInfo1 = struct{ FlpVtbl uintptr } type ICreateErrorInfo = ICreateErrorInfo1 type ISupportErrorInfo1 = struct{ FlpVtbl uintptr } type ISupportErrorInfo = ISupportErrorInfo1 type ITypeFactory1 = struct{ FlpVtbl uintptr } type ITypeFactory = ITypeFactory1 type ITypeMarshal1 = struct{ FlpVtbl uintptr } type ITypeMarshal = ITypeMarshal1 type IRecordInfo1 = struct{ FlpVtbl uintptr } type IRecordInfo = IRecordInfo1 type IErrorLog1 = struct{ FlpVtbl uintptr } type IErrorLog = IErrorLog1 type IPropertyBag1 = struct{ FlpVtbl uintptr } type IPropertyBag = IPropertyBag1 type CURRENCY = CY type tagSAFEARRAYBOUND = struct { FcElements ULONG FlLbound LONG } type SAFEARRAYBOUND = tagSAFEARRAYBOUND type LPSAFEARRAYBOUND = uintptr type _wireVARIANT = struct { FclSize DWORD FrpcReserved DWORD Fvt USHORT FwReserved1 USHORT FwReserved2 USHORT FwReserved3 USHORT F__16 struct { FllVal LONGLONG F__ccgo_pad1 [8]byte } } type WireVARIANT = uintptr type _wireBRECORD = struct { FfFlags ULONG FclSize ULONG FpRecInfo uintptr FpRecord uintptr } type WireBRECORD = uintptr type _wireSAFEARR_BSTR = struct { FSize ULONG F__ccgo_pad1 [4]byte FaBstr uintptr } type SAFEARR_BSTR = _wireSAFEARR_BSTR type _wireSAFEARR_UNKNOWN = struct { FSize ULONG F__ccgo_pad1 [4]byte FapUnknown uintptr } type SAFEARR_UNKNOWN = _wireSAFEARR_UNKNOWN type _wireSAFEARR_DISPATCH = struct { FSize ULONG F__ccgo_pad1 [4]byte FapDispatch uintptr } type SAFEARR_DISPATCH = _wireSAFEARR_DISPATCH type _wireSAFEARR_VARIANT = struct { FSize ULONG F__ccgo_pad1 [4]byte FaVariant uintptr } type SAFEARR_VARIANT = _wireSAFEARR_VARIANT type _wireSAFEARR_BRECORD = struct { FSize ULONG F__ccgo_pad1 [4]byte FaRecord uintptr } type SAFEARR_BRECORD = _wireSAFEARR_BRECORD type _wireSAFEARR_HAVEIID = struct { FSize ULONG F__ccgo_pad1 [4]byte FapUnknown uintptr Fiid IID } type SAFEARR_HAVEIID = _wireSAFEARR_HAVEIID type SF_TYPE = uint32 type _wireSAFEARRAY_UNION = struct { FsfType ULONG F__ccgo_pad1 [4]byte Fu struct { FBstrStr SAFEARR_BSTR F__ccgo_pad1 [16]byte } } type SAFEARRAYUNION = _wireSAFEARRAY_UNION type _wireSAFEARRAY = struct { FcDims USHORT FfFeatures USHORT FcbElements ULONG FcLocks ULONG F__ccgo_pad1 [4]byte FuArrayStructs SAFEARRAYUNION Frgsabound [1]SAFEARRAYBOUND } type WireSAFEARRAY = uintptr type WirePSAFEARRAY = uintptr type tagSAFEARRAY = struct { FcDims USHORT FfFeatures USHORT FcbElements ULONG FcLocks ULONG F__ccgo_pad1 [4]byte FpvData PVOID Frgsabound [1]SAFEARRAYBOUND } type SAFEARRAY = tagSAFEARRAY type LPSAFEARRAY = uintptr type tagVARIANT = struct { Fn1 struct { Fn2 struct { Fvt VARTYPE FwReserved1 WORD FwReserved2 WORD FwReserved3 WORD Fn3 struct { FllVal LONGLONG F__ccgo_pad1 [8]byte } } } } type VARIANT = tagVARIANT type __tagVARIANT = struct { Fvt VARTYPE FwReserved1 WORD FwReserved2 WORD FwReserved3 WORD Fn3 struct { FllVal LONGLONG F__ccgo_pad1 [8]byte } } type __tagBRECORD = struct { FpvRecord PVOID FpRecInfo uintptr } type LPVARIANT = uintptr type VARIANTARG = VARIANT type LPVARIANTARG = uintptr type DISPID = LONG type MEMBERID = DISPID type HREFTYPE = DWORD type TYPEKIND = uint32 type tagTYPEDESC = struct { F__0 struct{ Flptdesc uintptr } Fvt VARTYPE F__ccgo_pad1 [6]byte } type tagARRAYDESC = struct { FtdescElem TYPEDESC FcDims USHORT F__ccgo_pad1 [2]byte Frgbounds [1]SAFEARRAYBOUND F__ccgo_pad2 [4]byte } type TYPEDESC = tagTYPEDESC type ARRAYDESC = tagARRAYDESC type tagPARAMDESCEX = struct { FcBytes ULONG F__ccgo_pad1 [4]byte FvarDefaultValue VARIANTARG } type PARAMDESCEX = tagPARAMDESCEX type LPPARAMDESCEX = uintptr type tagPARAMDESC = struct { Fpparamdescex LPPARAMDESCEX FwParamFlags USHORT F__ccgo_pad1 [6]byte } type PARAMDESC = tagPARAMDESC type LPPARAMDESC = uintptr type tagIDLDESC = struct { FdwReserved ULONG_PTR FwIDLFlags USHORT F__ccgo_pad1 [6]byte } type IDLDESC = tagIDLDESC type LPIDLDESC = uintptr type tagELEMDESC = struct { Ftdesc TYPEDESC Fu struct{ Fidldesc IDLDESC } } type ELEMDESC = tagELEMDESC type LPELEMDESC = uintptr type tagTYPEATTR = struct { Fguid GUID Flcid LCID FdwReserved DWORD FmemidConstructor MEMBERID FmemidDestructor MEMBERID FlpstrSchema LPOLESTR FcbSizeInstance ULONG Ftypekind TYPEKIND FcFuncs WORD FcVars WORD FcImplTypes WORD FcbSizeVft WORD FcbAlignment WORD FwTypeFlags WORD FwMajorVerNum WORD FwMinorVerNum WORD FtdescAlias TYPEDESC FidldescType IDLDESC } type TYPEATTR = tagTYPEATTR type LPTYPEATTR = uintptr type tagDISPPARAMS = struct { Frgvarg uintptr FrgdispidNamedArgs uintptr FcArgs UINT FcNamedArgs UINT } type DISPPARAMS = tagDISPPARAMS type tagEXCEPINFO = struct { FwCode WORD FwReserved WORD F__ccgo_pad1 [4]byte FbstrSource BSTR FbstrDescription BSTR FbstrHelpFile BSTR FdwHelpContext DWORD F__ccgo_pad2 [4]byte FpvReserved PVOID FpfnDeferredFillIn uintptr Fscode SCODE F__ccgo_pad3 [4]byte } type EXCEPINFO = tagEXCEPINFO type LPEXCEPINFO = uintptr type CALLCONV = uint32 type FUNCKIND = uint32 type INVOKEKIND = uint32 type tagFUNCDESC = struct { Fmemid MEMBERID F__ccgo_pad1 [4]byte Flprgscode uintptr FlprgelemdescParam uintptr Ffunckind FUNCKIND Finvkind INVOKEKIND Fcallconv CALLCONV FcParams SHORT FcParamsOpt SHORT FoVft SHORT FcScodes SHORT F__ccgo_pad2 [4]byte FelemdescFunc ELEMDESC FwFuncFlags WORD F__ccgo_pad3 [6]byte } type FUNCDESC = tagFUNCDESC type LPFUNCDESC = uintptr type VARKIND = uint32 type tagVARDESC = struct { Fmemid MEMBERID F__ccgo_pad1 [4]byte FlpstrSchema LPOLESTR F__16 struct { F__ccgo_pad1 [0]uint64 FoInst ULONG F__ccgo_pad2 [4]byte } FelemdescVar ELEMDESC FwVarFlags WORD F__ccgo_pad2 [2]byte Fvarkind VARKIND } type VARDESC = tagVARDESC type LPVARDESC = uintptr type TYPEFLAGS = uint32 type FUNCFLAGS = uint32 type VARFLAGS = uint32 type tagCLEANLOCALSTORAGE = struct { FpInterface uintptr FpStorage PVOID Fflags DWORD F__ccgo_pad1 [4]byte } type CLEANLOCALSTORAGE = tagCLEANLOCALSTORAGE type tagCUSTDATAITEM = struct { Fguid GUID FvarValue VARIANTARG } type CUSTDATAITEM = tagCUSTDATAITEM type LPCUSTDATAITEM = uintptr type tagCUSTDATA = struct { FcCustData DWORD F__ccgo_pad1 [4]byte FprgCustData LPCUSTDATAITEM } type CUSTDATA = tagCUSTDATA type LPCUSTDATA = uintptr type LPCREATETYPEINFO = uintptr type ICreateTypeInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetGuid uintptr FSetTypeFlags uintptr FSetDocString uintptr FSetHelpContext uintptr FSetVersion uintptr FAddRefTypeInfo uintptr FAddFuncDesc uintptr FAddImplType uintptr FSetImplTypeFlags uintptr FSetAlignment uintptr FSetSchema uintptr FAddVarDesc uintptr FSetFuncAndParamNames uintptr FSetVarName uintptr FSetTypeDescAlias uintptr FDefineFuncAsDllEntry uintptr FSetFuncDocString uintptr FSetVarDocString uintptr FSetFuncHelpContext uintptr FSetVarHelpContext uintptr FSetMops uintptr FSetTypeIdldesc uintptr FLayOut uintptr } type ICreateTypeInfoVtbl = ICreateTypeInfoVtbl1 type LPCREATETYPEINFO2 = uintptr type ICreateTypeInfo2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetGuid uintptr FSetTypeFlags uintptr FSetDocString uintptr FSetHelpContext uintptr FSetVersion uintptr FAddRefTypeInfo uintptr FAddFuncDesc uintptr FAddImplType uintptr FSetImplTypeFlags uintptr FSetAlignment uintptr FSetSchema uintptr FAddVarDesc uintptr FSetFuncAndParamNames uintptr FSetVarName uintptr FSetTypeDescAlias uintptr FDefineFuncAsDllEntry uintptr FSetFuncDocString uintptr FSetVarDocString uintptr FSetFuncHelpContext uintptr FSetVarHelpContext uintptr FSetMops uintptr FSetTypeIdldesc uintptr FLayOut uintptr FDeleteFuncDesc uintptr FDeleteFuncDescByMemId uintptr FDeleteVarDesc uintptr FDeleteVarDescByMemId uintptr FDeleteImplType uintptr FSetCustData uintptr FSetFuncCustData uintptr FSetParamCustData uintptr FSetVarCustData uintptr FSetImplTypeCustData uintptr FSetHelpStringContext uintptr FSetFuncHelpStringContext uintptr FSetVarHelpStringContext uintptr FInvalidate uintptr FSetName uintptr } type ICreateTypeInfo2Vtbl = ICreateTypeInfo2Vtbl1 type LPCREATETYPELIB = uintptr type ICreateTypeLibVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateTypeInfo uintptr FSetName uintptr FSetVersion uintptr FSetGuid uintptr FSetDocString uintptr FSetHelpFileName uintptr FSetHelpContext uintptr FSetLcid uintptr FSetLibFlags uintptr FSaveAllChanges uintptr } type ICreateTypeLibVtbl = ICreateTypeLibVtbl1 type LPCREATETYPELIB2 = uintptr type ICreateTypeLib2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateTypeInfo uintptr FSetName uintptr FSetVersion uintptr FSetGuid uintptr FSetDocString uintptr FSetHelpFileName uintptr FSetHelpContext uintptr FSetLcid uintptr FSetLibFlags uintptr FSaveAllChanges uintptr FDeleteTypeInfo uintptr FSetCustData uintptr FSetHelpStringContext uintptr FSetHelpStringDll uintptr } type ICreateTypeLib2Vtbl = ICreateTypeLib2Vtbl1 type LPDISPATCH = uintptr type IDispatchVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr } type IDispatchVtbl = IDispatchVtbl1 type LPENUMVARIANT = uintptr type IEnumVARIANTVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumVARIANTVtbl = IEnumVARIANTVtbl1 type LPTYPECOMP = uintptr type DESCKIND = uint32 type tagBINDPTR = struct{ Flpfuncdesc uintptr } type BINDPTR = tagBINDPTR type LPBINDPTR = uintptr type ITypeCompVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBind uintptr FBindType uintptr } type ITypeCompVtbl = ITypeCompVtbl1 type LPTYPEINFO = uintptr type ITypeInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeAttr uintptr FGetTypeComp uintptr FGetFuncDesc uintptr FGetVarDesc uintptr FGetNames uintptr FGetRefTypeOfImplType uintptr FGetImplTypeFlags uintptr FGetIDsOfNames uintptr FInvoke uintptr FGetDocumentation uintptr FGetDllEntry uintptr FGetRefTypeInfo uintptr FAddressOfMember uintptr FCreateInstance uintptr FGetMops uintptr FGetContainingTypeLib uintptr FReleaseTypeAttr uintptr FReleaseFuncDesc uintptr FReleaseVarDesc uintptr } type ITypeInfoVtbl = ITypeInfoVtbl1 type LPTYPEINFO2 = uintptr type ITypeInfo2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeAttr uintptr FGetTypeComp uintptr FGetFuncDesc uintptr FGetVarDesc uintptr FGetNames uintptr FGetRefTypeOfImplType uintptr FGetImplTypeFlags uintptr FGetIDsOfNames uintptr FInvoke uintptr FGetDocumentation uintptr FGetDllEntry uintptr FGetRefTypeInfo uintptr FAddressOfMember uintptr FCreateInstance uintptr FGetMops uintptr FGetContainingTypeLib uintptr FReleaseTypeAttr uintptr FReleaseFuncDesc uintptr FReleaseVarDesc uintptr FGetTypeKind uintptr FGetTypeFlags uintptr FGetFuncIndexOfMemId uintptr FGetVarIndexOfMemId uintptr FGetCustData uintptr FGetFuncCustData uintptr FGetParamCustData uintptr FGetVarCustData uintptr FGetImplTypeCustData uintptr FGetDocumentation2 uintptr FGetAllCustData uintptr FGetAllFuncCustData uintptr FGetAllParamCustData uintptr FGetAllVarCustData uintptr FGetAllImplTypeCustData uintptr } type ITypeInfo2Vtbl = ITypeInfo2Vtbl1 type SYSKIND = uint32 type LIBFLAGS = uint32 type LPTYPELIB = uintptr type tagTLIBATTR = struct { Fguid GUID Flcid LCID Fsyskind SYSKIND FwMajorVerNum WORD FwMinorVerNum WORD FwLibFlags WORD F__ccgo_pad1 [2]byte } type TLIBATTR = tagTLIBATTR type LPTLIBATTR = uintptr type ITypeLibVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetTypeInfoType uintptr FGetTypeInfoOfGuid uintptr FGetLibAttr uintptr FGetTypeComp uintptr FGetDocumentation uintptr FIsName uintptr FFindName uintptr FReleaseTLibAttr uintptr } type ITypeLibVtbl = ITypeLibVtbl1 type LPTYPELIB2 = uintptr type ITypeLib2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetTypeInfoType uintptr FGetTypeInfoOfGuid uintptr FGetLibAttr uintptr FGetTypeComp uintptr FGetDocumentation uintptr FIsName uintptr FFindName uintptr FReleaseTLibAttr uintptr FGetCustData uintptr FGetLibStatistics uintptr FGetDocumentation2 uintptr FGetAllCustData uintptr } type ITypeLib2Vtbl = ITypeLib2Vtbl1 type LPTYPECHANGEEVENTS = uintptr type CHANGEKIND = uint32 type ITypeChangeEventsVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRequestTypeChange uintptr FAfterTypeChange uintptr } type ITypeChangeEventsVtbl = ITypeChangeEventsVtbl1 type LPERRORINFO = uintptr type IErrorInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetGUID uintptr FGetSource uintptr FGetDescription uintptr FGetHelpFile uintptr FGetHelpContext uintptr } type IErrorInfoVtbl = IErrorInfoVtbl1 type LPCREATEERRORINFO = uintptr type ICreateErrorInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetGUID uintptr FSetSource uintptr FSetDescription uintptr FSetHelpFile uintptr FSetHelpContext uintptr } type ICreateErrorInfoVtbl = ICreateErrorInfoVtbl1 type LPSUPPORTERRORINFO = uintptr type ISupportErrorInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FInterfaceSupportsErrorInfo uintptr } type ISupportErrorInfoVtbl = ISupportErrorInfoVtbl1 type ITypeFactoryVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateFromTypeInfo uintptr } type ITypeFactoryVtbl = ITypeFactoryVtbl1 type ITypeMarshalVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSize uintptr FMarshal uintptr FUnmarshal uintptr FFree uintptr } type ITypeMarshalVtbl = ITypeMarshalVtbl1 type LPRECORDINFO = uintptr type IRecordInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRecordInit uintptr FRecordClear uintptr FRecordCopy uintptr FGetGuid uintptr FGetName uintptr FGetSize uintptr FGetTypeInfo uintptr FGetField uintptr FGetFieldNoCopy uintptr FPutField uintptr FPutFieldNoCopy uintptr FGetFieldNames uintptr FIsMatchingType uintptr FRecordCreate uintptr FRecordCreateCopy uintptr FRecordDestroy uintptr } type IRecordInfoVtbl = IRecordInfoVtbl1 type LPERRORLOG = uintptr type IErrorLogVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAddError uintptr } type IErrorLogVtbl = IErrorLogVtbl1 type LPPROPERTYBAG = uintptr type IPropertyBagVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRead uintptr FWrite uintptr } type IPropertyBagVtbl = IPropertyBagVtbl1 type IXMLDOMImplementation1 = struct{ FlpVtbl uintptr } type IXMLDOMImplementation = IXMLDOMImplementation1 type IXMLDOMNode1 = struct{ FlpVtbl uintptr } type IXMLDOMNode = IXMLDOMNode1 type IXMLDOMDocumentFragment1 = struct{ FlpVtbl uintptr } type IXMLDOMDocumentFragment = IXMLDOMDocumentFragment1 type IXMLDOMDocument1 = struct{ FlpVtbl uintptr } type IXMLDOMDocument = IXMLDOMDocument1 type IXMLDOMNodeList1 = struct{ FlpVtbl uintptr } type IXMLDOMNodeList = IXMLDOMNodeList1 type IXMLDOMNamedNodeMap1 = struct{ FlpVtbl uintptr } type IXMLDOMNamedNodeMap = IXMLDOMNamedNodeMap1 type IXMLDOMCharacterData1 = struct{ FlpVtbl uintptr } type IXMLDOMCharacterData = IXMLDOMCharacterData1 type IXMLDOMAttribute1 = struct{ FlpVtbl uintptr } type IXMLDOMAttribute = IXMLDOMAttribute1 type IXMLDOMElement1 = struct{ FlpVtbl uintptr } type IXMLDOMElement = IXMLDOMElement1 type IXMLDOMText1 = struct{ FlpVtbl uintptr } type IXMLDOMText = IXMLDOMText1 type IXMLDOMComment1 = struct{ FlpVtbl uintptr } type IXMLDOMComment = IXMLDOMComment1 type IXMLDOMProcessingInstruction1 = struct{ FlpVtbl uintptr } type IXMLDOMProcessingInstruction = IXMLDOMProcessingInstruction1 type IXMLDOMCDATASection1 = struct{ FlpVtbl uintptr } type IXMLDOMCDATASection = IXMLDOMCDATASection1 type IXMLDOMDocumentType1 = struct{ FlpVtbl uintptr } type IXMLDOMDocumentType = IXMLDOMDocumentType1 type IXMLDOMNotation1 = struct{ FlpVtbl uintptr } type IXMLDOMNotation = IXMLDOMNotation1 type IXMLDOMEntity1 = struct{ FlpVtbl uintptr } type IXMLDOMEntity = IXMLDOMEntity1 type IXMLDOMEntityReference1 = struct{ FlpVtbl uintptr } type IXMLDOMEntityReference = IXMLDOMEntityReference1 type IXMLDOMParseError1 = struct{ FlpVtbl uintptr } type IXMLDOMParseError = IXMLDOMParseError1 type IXTLRuntime1 = struct{ FlpVtbl uintptr } type IXTLRuntime = IXTLRuntime1 type XMLDOMDocumentEvents1 = struct{ FlpVtbl uintptr } type XMLDOMDocumentEvents = XMLDOMDocumentEvents1 type IXMLHttpRequest1 = struct{ FlpVtbl uintptr } type IXMLHttpRequest = IXMLHttpRequest1 type IXMLDSOControl1 = struct{ FlpVtbl uintptr } type IXMLDSOControl = IXMLDSOControl1 type IXMLElementCollection1 = struct{ FlpVtbl uintptr } type IXMLElementCollection = IXMLElementCollection1 type IXMLDocument1 = struct{ FlpVtbl uintptr } type IXMLDocument = IXMLDocument1 type IXMLDocument21 = struct{ FlpVtbl uintptr } type IXMLDocument2 = IXMLDocument21 type IXMLElement1 = struct{ FlpVtbl uintptr } type IXMLElement = IXMLElement1 type IXMLElement21 = struct{ FlpVtbl uintptr } type IXMLElement2 = IXMLElement21 type IXMLAttribute1 = struct{ FlpVtbl uintptr } type IXMLAttribute = IXMLAttribute1 type IXMLError1 = struct{ FlpVtbl uintptr } type IXMLError = IXMLError1 type _xml_error = struct { F_nLine uint32 F__ccgo_pad1 [4]byte F_pchBuf BSTR F_cchBuf uint32 F_ich uint32 F_pszFound BSTR F_pszExpected BSTR F_reserved1 DWORD F_reserved2 DWORD } type XML_ERROR = _xml_error type DOMNodeType = uint32 type XMLELEM_TYPE = uint32 type IXMLDOMImplementationVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr FhasFeature uintptr } type IXMLDOMImplementationVtbl = IXMLDOMImplementationVtbl1 type IXMLDOMNodeVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr } type IXMLDOMNodeVtbl = IXMLDOMNodeVtbl1 type IXMLDOMDocumentFragmentVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr } type IXMLDOMDocumentFragmentVtbl = IXMLDOMDocumentFragmentVtbl1 type IXMLDOMDocumentVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_doctype uintptr Fget_implementation uintptr Fget_documentElement uintptr Fputref_documentElement uintptr FcreateElement uintptr FcreateDocumentFragment uintptr FcreateTextNode uintptr FcreateComment uintptr FcreateCDATASection uintptr FcreateProcessingInstruction uintptr FcreateAttribute uintptr FcreateEntityReference uintptr FgetElementsByTagName uintptr FcreateNode uintptr FnodeFromID uintptr Fload uintptr Fget_readyState uintptr Fget_parseError uintptr Fget_url uintptr Fget_async uintptr Fput_async uintptr Fabort uintptr FloadXML uintptr Fsave uintptr Fget_validateOnParse uintptr Fput_validateOnParse uintptr Fget_resolveExternals uintptr Fput_resolveExternals uintptr Fget_preserveWhiteSpace uintptr Fput_preserveWhiteSpace uintptr Fput_onreadystatechange uintptr Fput_ondataavailable uintptr Fput_ontransformnode uintptr } type IXMLDOMDocumentVtbl = IXMLDOMDocumentVtbl1 type IXMLDOMNodeListVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_item uintptr Fget_length uintptr FnextNode uintptr Freset uintptr Fget__newEnum uintptr } type IXMLDOMNodeListVtbl = IXMLDOMNodeListVtbl1 type IXMLDOMNamedNodeMapVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr FgetNamedItem uintptr FsetNamedItem uintptr FremoveNamedItem uintptr Fget_item uintptr Fget_length uintptr FgetQualifiedItem uintptr FremoveQualifiedItem uintptr FnextNode uintptr Freset uintptr Fget__newEnum uintptr } type IXMLDOMNamedNodeMapVtbl = IXMLDOMNamedNodeMapVtbl1 type IXMLDOMCharacterDataVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_data uintptr Fput_data uintptr Fget_length uintptr FsubstringData uintptr FappendData uintptr FinsertData uintptr FdeleteData uintptr FreplaceData uintptr } type IXMLDOMCharacterDataVtbl = IXMLDOMCharacterDataVtbl1 type IXMLDOMAttributeVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_name uintptr Fget_value uintptr Fput_value uintptr } type IXMLDOMAttributeVtbl = IXMLDOMAttributeVtbl1 type IXMLDOMElementVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_tagName uintptr FgetAttribute uintptr FsetAttribute uintptr FremoveAttribute uintptr FgetAttributeNode uintptr FsetAttributeNode uintptr FremoveAttributeNode uintptr FgetElementsByTagName uintptr Fnormalize uintptr } type IXMLDOMElementVtbl = IXMLDOMElementVtbl1 type IXMLDOMTextVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_data uintptr Fput_data uintptr Fget_length uintptr FsubstringData uintptr FappendData uintptr FinsertData uintptr FdeleteData uintptr FreplaceData uintptr FsplitText uintptr } type IXMLDOMTextVtbl = IXMLDOMTextVtbl1 type IXMLDOMCommentVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_data uintptr Fput_data uintptr Fget_length uintptr FsubstringData uintptr FappendData uintptr FinsertData uintptr FdeleteData uintptr FreplaceData uintptr } type IXMLDOMCommentVtbl = IXMLDOMCommentVtbl1 type IXMLDOMProcessingInstructionVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_target uintptr Fget_data uintptr Fput_data uintptr } type IXMLDOMProcessingInstructionVtbl = IXMLDOMProcessingInstructionVtbl1 type IXMLDOMCDATASectionVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_data uintptr Fput_data uintptr Fget_length uintptr FsubstringData uintptr FappendData uintptr FinsertData uintptr FdeleteData uintptr FreplaceData uintptr FsplitText uintptr } type IXMLDOMCDATASectionVtbl = IXMLDOMCDATASectionVtbl1 type IXMLDOMDocumentTypeVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_name uintptr Fget_entities uintptr Fget_notations uintptr } type IXMLDOMDocumentTypeVtbl = IXMLDOMDocumentTypeVtbl1 type IXMLDOMNotationVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_publicId uintptr Fget_systemId uintptr } type IXMLDOMNotationVtbl = IXMLDOMNotationVtbl1 type IXMLDOMEntityVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr Fget_publicId uintptr Fget_systemId uintptr Fget_notationName uintptr } type IXMLDOMEntityVtbl = IXMLDOMEntityVtbl1 type IXMLDOMEntityReferenceVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr } type IXMLDOMEntityReferenceVtbl = IXMLDOMEntityReferenceVtbl1 type IXMLDOMParseErrorVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_errorCode uintptr Fget_url uintptr Fget_reason uintptr Fget_srcText uintptr Fget_line uintptr Fget_linepos uintptr Fget_filepos uintptr } type IXMLDOMParseErrorVtbl = IXMLDOMParseErrorVtbl1 type IXTLRuntimeVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_nodeName uintptr Fget_nodeValue uintptr Fput_nodeValue uintptr Fget_nodeType uintptr Fget_parentNode uintptr Fget_childNodes uintptr Fget_firstChild uintptr Fget_lastChild uintptr Fget_previousSibling uintptr Fget_nextSibling uintptr Fget_attributes uintptr FinsertBefore uintptr FreplaceChild uintptr FremoveChild uintptr FappendChild uintptr FhasChildNodes uintptr Fget_ownerDocument uintptr FcloneNode uintptr Fget_nodeTypeString uintptr Fget_text uintptr Fput_text uintptr Fget_specified uintptr Fget_definition uintptr Fget_nodeTypedValue uintptr Fput_nodeTypedValue uintptr Fget_dataType uintptr Fput_dataType uintptr Fget_xml uintptr FtransformNode uintptr FselectNodes uintptr FselectSingleNode uintptr Fget_parsed uintptr Fget_namespaceURI uintptr Fget_prefix uintptr Fget_baseName uintptr FtransformNodeToObject uintptr FuniqueID uintptr Fdepth uintptr FchildNumber uintptr FancestorChildNumber uintptr FabsoluteChildNumber uintptr FformatIndex uintptr FformatNumber uintptr FformatDate uintptr FformatTime uintptr } type IXTLRuntimeVtbl = IXTLRuntimeVtbl1 type XMLDOMDocumentEventsVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr } type XMLDOMDocumentEventsVtbl = XMLDOMDocumentEventsVtbl1 type IXMLHttpRequestVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fopen uintptr FsetRequestHeader uintptr FgetResponseHeader uintptr FgetAllResponseHeaders uintptr Fsend uintptr Fabort uintptr Fget_status uintptr Fget_statusText uintptr Fget_responseXML uintptr Fget_responseText uintptr Fget_responseBody uintptr Fget_responseStream uintptr Fget_readyState uintptr Fput_onreadystatechange uintptr } type IXMLHttpRequestVtbl = IXMLHttpRequestVtbl1 type IXMLDSOControlVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_XMLDocument uintptr Fput_XMLDocument uintptr Fget_JavaDSOCompatible uintptr Fput_JavaDSOCompatible uintptr Fget_readyState uintptr } type IXMLDSOControlVtbl = IXMLDSOControlVtbl1 type IXMLElementCollectionVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fput_length uintptr Fget_length uintptr Fget__newEnum uintptr Fitem uintptr } type IXMLElementCollectionVtbl = IXMLElementCollectionVtbl1 type IXMLDocumentVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_root uintptr Fget_fileSize uintptr Fget_fileModifiedDate uintptr Fget_fileUpdatedDate uintptr Fget_URL uintptr Fput_URL uintptr Fget_mimeType uintptr Fget_readyState uintptr Fget_charset uintptr Fput_charset uintptr Fget_version uintptr Fget_doctype uintptr Fget_dtdURL uintptr FcreateElement uintptr } type IXMLDocumentVtbl = IXMLDocumentVtbl1 type IXMLDocument2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_root uintptr Fget_fileSize uintptr Fget_fileModifiedDate uintptr Fget_fileUpdatedDate uintptr Fget_URL uintptr Fput_URL uintptr Fget_mimeType uintptr Fget_readyState uintptr Fget_charset uintptr Fput_charset uintptr Fget_version uintptr Fget_doctype uintptr Fget_dtdURL uintptr FcreateElement uintptr Fget_async uintptr Fput_async uintptr } type IXMLDocument2Vtbl = IXMLDocument2Vtbl1 type IXMLElementVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_tagName uintptr Fput_tagName uintptr Fget_parent uintptr FsetAttribute uintptr FgetAttribute uintptr FremoveAttribute uintptr Fget_children uintptr Fget_type uintptr Fget_text uintptr Fput_text uintptr FaddChild uintptr FremoveChild uintptr } type IXMLElementVtbl = IXMLElementVtbl1 type IXMLElement2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_tagName uintptr Fput_tagName uintptr Fget_parent uintptr FsetAttribute uintptr FgetAttribute uintptr FremoveAttribute uintptr Fget_children uintptr Fget_type uintptr Fget_text uintptr Fput_text uintptr FaddChild uintptr FremoveChild uintptr Fget_attributes uintptr } type IXMLElement2Vtbl = IXMLElement2Vtbl1 type IXMLAttributeVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetTypeInfoCount uintptr FGetTypeInfo uintptr FGetIDsOfNames uintptr FInvoke uintptr Fget_name uintptr Fget_value uintptr } type IXMLAttributeVtbl = IXMLAttributeVtbl1 type IXMLErrorVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetErrorInfo uintptr } type IXMLErrorVtbl = IXMLErrorVtbl1 type LPPERSISTMONIKER = uintptr type IPersistMonikerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetClassID uintptr FIsDirty uintptr FLoad uintptr FSave uintptr FSaveCompleted uintptr FGetCurMoniker uintptr } type IPersistMonikerVtbl = IPersistMonikerVtbl1 type LPMONIKERPROP = uintptr type MONIKERPROPERTY = uint32 type IMonikerPropVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FPutProperty uintptr } type IMonikerPropVtbl = IMonikerPropVtbl1 type LPBINDPROTOCOL = uintptr type IBindProtocolVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateBinding uintptr } type IBindProtocolVtbl = IBindProtocolVtbl1 type LPBINDING = uintptr type IBindingVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAbort uintptr FSuspend uintptr FResume uintptr FSetPriority uintptr FGetPriority uintptr FGetBindResult uintptr } type IBindingVtbl = IBindingVtbl1 type LPBINDSTATUSCALLBACK = uintptr type BINDVERB = uint32 type BINDINFOF = uint32 type BINDF = uint32 type URL_ENCODING = uint32 type _tagBINDINFO = struct { FcbSize ULONG F__ccgo_pad1 [4]byte FszExtraInfo LPWSTR FstgmedData STGMEDIUM FgrfBindInfoF DWORD FdwBindVerb DWORD FszCustomVerb LPWSTR FcbstgmedData DWORD FdwOptions DWORD FdwOptionsFlags DWORD FdwCodePage DWORD FsecurityAttributes SECURITY_ATTRIBUTES Fiid IID FpUnk uintptr FdwReserved DWORD F__ccgo_pad2 [4]byte } type BINDINFO = _tagBINDINFO type _REMSECURITY_ATTRIBUTES = struct { FnLength DWORD FlpSecurityDescriptor DWORD FbInheritHandle WINBOOL } type REMSECURITY_ATTRIBUTES = _REMSECURITY_ATTRIBUTES type PREMSECURITY_ATTRIBUTES = uintptr type LPREMSECURITY_ATTRIBUTES = uintptr type _tagRemBINDINFO = struct { FcbSize ULONG F__ccgo_pad1 [4]byte FszExtraInfo LPWSTR FgrfBindInfoF DWORD FdwBindVerb DWORD FszCustomVerb LPWSTR FcbstgmedData DWORD FdwOptions DWORD FdwOptionsFlags DWORD FdwCodePage DWORD FsecurityAttributes REMSECURITY_ATTRIBUTES Fiid IID F__ccgo_pad2 [4]byte FpUnk uintptr FdwReserved DWORD F__ccgo_pad3 [4]byte } type RemBINDINFO = _tagRemBINDINFO type tagRemFORMATETC = struct { FcfFormat DWORD Fptd DWORD FdwAspect DWORD Flindex LONG Ftymed DWORD } type RemFORMATETC = tagRemFORMATETC type LPREMFORMATETC = uintptr type BINDINFO_OPTIONS = int32 type BSCF = uint32 type BINDSTATUS = uint32 type IBindStatusCallbackVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FOnStartBinding uintptr FGetPriority uintptr FOnLowResource uintptr FOnProgress uintptr FOnStopBinding uintptr FGetBindInfo uintptr FOnDataAvailable uintptr FOnObjectAvailable uintptr } type IBindStatusCallbackVtbl = IBindStatusCallbackVtbl1 type LPBINDSTATUSCALLBACKEX = uintptr type BINDF2 = uint32 type IBindStatusCallbackExVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FOnStartBinding uintptr FGetPriority uintptr FOnLowResource uintptr FOnProgress uintptr FOnStopBinding uintptr FGetBindInfo uintptr FOnDataAvailable uintptr FOnObjectAvailable uintptr FGetBindInfoEx uintptr } type IBindStatusCallbackExVtbl = IBindStatusCallbackExVtbl1 type LPAUTHENTICATION = uintptr type IAuthenticateVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAuthenticate uintptr } type IAuthenticateVtbl = IAuthenticateVtbl1 type LPAUTHENTICATIONEX = uintptr type AUTHENTICATEF = uint32 type _tagAUTHENTICATEINFO = struct { FdwFlags DWORD FdwReserved DWORD } type AUTHENTICATEINFO = _tagAUTHENTICATEINFO type IAuthenticateExVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FAuthenticate uintptr FAuthenticateEx uintptr } type IAuthenticateExVtbl = IAuthenticateExVtbl1 type LPHTTPNEGOTIATE = uintptr type IHttpNegotiateVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBeginningTransaction uintptr FOnResponse uintptr } type IHttpNegotiateVtbl = IHttpNegotiateVtbl1 type LPHTTPNEGOTIATE2 = uintptr type IHttpNegotiate2Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBeginningTransaction uintptr FOnResponse uintptr FGetRootSecurityId uintptr } type IHttpNegotiate2Vtbl = IHttpNegotiate2Vtbl1 type LPHTTPNEGOTIATE3 = uintptr type IHttpNegotiate3Vtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FBeginningTransaction uintptr FOnResponse uintptr FGetRootSecurityId uintptr FGetSerializedClientCertContext uintptr } type IHttpNegotiate3Vtbl = IHttpNegotiate3Vtbl1 type LPWININETFILESTREAM = uintptr type IWinInetFileStreamVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetHandleForUnlock uintptr FSetDeleteFile uintptr } type IWinInetFileStreamVtbl = IWinInetFileStreamVtbl1 type LPWINDOWFORBINDINGUI = uintptr type IWindowForBindingUIVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr } type IWindowForBindingUIVtbl = IWindowForBindingUIVtbl1 type LPCODEINSTALL = uintptr type CIP_STATUS = uint32 type ICodeInstallVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FOnCodeInstallProblem uintptr } type ICodeInstallVtbl = ICodeInstallVtbl1 type LPWININETINFO = uintptr type IWinInetInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryOption uintptr } type IWinInetInfoVtbl = IWinInetInfoVtbl1 type LPHTTPSECURITY = uintptr type IHttpSecurityVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FOnSecurityProblem uintptr } type IHttpSecurityVtbl = IHttpSecurityVtbl1 type LPWININETHTTPINFO = uintptr type IWinInetHttpInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FQueryOption uintptr FQueryInfo uintptr } type IWinInetHttpInfoVtbl = IWinInetHttpInfoVtbl1 type IWinInetHttpTimeoutsVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetRequestTimeouts uintptr } type IWinInetHttpTimeoutsVtbl = IWinInetHttpTimeoutsVtbl1 type LPBINDHOST = uintptr type IBindHostVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreateMoniker uintptr FMonikerBindToStorage uintptr FMonikerBindToObject uintptr } type IBindHostVtbl = IBindHostVtbl1 type LPIINTERNET = uintptr type IInternetVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr } type IInternetVtbl = IInternetVtbl1 type LPIINTERNETBINDINFO = uintptr type BINDSTRING = uint32 type IInternetBindInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetBindInfo uintptr FGetBindString uintptr } type IInternetBindInfoVtbl = IInternetBindInfoVtbl1 type LPIINTERNETBINDINFOEX = uintptr type IInternetBindInfoExVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetBindInfo uintptr FGetBindString uintptr FGetBindInfoEx uintptr } type IInternetBindInfoExVtbl = IInternetBindInfoExVtbl1 type LPIINTERNETPROTOCOLROOT = uintptr type PI_FLAGS = uint32 type _tagPROTOCOLDATA = struct { FgrfFlags DWORD FdwState DWORD FpData LPVOID FcbData ULONG F__ccgo_pad1 [4]byte } type PROTOCOLDATA = _tagPROTOCOLDATA type _tagStartParam = struct { Fiid IID FpIBindCtx uintptr FpItf uintptr } type StartParam = _tagStartParam type IInternetProtocolRootVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FStart uintptr FContinue uintptr FAbort uintptr FTerminate uintptr FSuspend uintptr FResume uintptr } type IInternetProtocolRootVtbl = IInternetProtocolRootVtbl1 type LPIINTERNETPROTOCOL = uintptr type IInternetProtocolVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FStart uintptr FContinue uintptr FAbort uintptr FTerminate uintptr FSuspend uintptr FResume uintptr FRead uintptr FSeek uintptr FLockRequest uintptr FUnlockRequest uintptr } type IInternetProtocolVtbl = IInternetProtocolVtbl1 type LPIINTERNETPROTOCOLSINK = uintptr type IInternetProtocolSinkVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSwitch uintptr FReportProgress uintptr FReportData uintptr FReportResult uintptr } type IInternetProtocolSinkVtbl = IInternetProtocolSinkVtbl1 type LPIINTERNETPROTOCOLSINKStackable = uintptr type IInternetProtocolSinkStackableVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSwitchSink uintptr FCommitSwitch uintptr FRollbackSwitch uintptr } type IInternetProtocolSinkStackableVtbl = IInternetProtocolSinkStackableVtbl1 type LPIINTERNETSESSION = uintptr type OIBDG_FLAGS = uint32 type IInternetSessionVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRegisterNameSpace uintptr FUnregisterNameSpace uintptr FRegisterMimeFilter uintptr FUnregisterMimeFilter uintptr FCreateBinding uintptr FSetSessionOption uintptr FGetSessionOption uintptr } type IInternetSessionVtbl = IInternetSessionVtbl1 type LPIINTERNETTHREADSWITCH = uintptr type IInternetThreadSwitchVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FPrepare uintptr FContinue uintptr } type IInternetThreadSwitchVtbl = IInternetThreadSwitchVtbl1 type LPIINTERNETPRIORITY = uintptr type IInternetPriorityVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetPriority uintptr FGetPriority uintptr } type IInternetPriorityVtbl = IInternetPriorityVtbl1 type LPIINTERNETPROTOCOLINFO = uintptr type PARSEACTION = uint32 type PSUACTION = uint32 type QUERYOPTION = uint32 type IInternetProtocolInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FParseUrl uintptr FCombineUrl uintptr FCompareUrl uintptr FQueryInfo uintptr } type IInternetProtocolInfoVtbl = IInternetProtocolInfoVtbl1 type IInternetSecurityMgrSiteVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWindow uintptr FEnableModeless uintptr } type IInternetSecurityMgrSiteVtbl = IInternetSecurityMgrSiteVtbl1 type PUAF = uint32 type PUAFOUT = uint32 type SZM_FLAGS = uint32 type IInternetSecurityManagerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FSetSecuritySite uintptr FGetSecuritySite uintptr FMapUrlToZone uintptr FGetSecurityId uintptr FProcessUrlAction uintptr FQueryCustomPolicy uintptr FSetZoneMapping uintptr FGetZoneMappings uintptr } type IInternetSecurityManagerVtbl = IInternetSecurityManagerVtbl1 type IInternetHostSecurityManagerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetSecurityId uintptr FProcessUrlAction uintptr FQueryCustomPolicy uintptr } type IInternetHostSecurityManagerVtbl = IInternetHostSecurityManagerVtbl1 type LPURLZONEMANAGER = uintptr type URLZONE = int32 type URLTEMPLATE = uint32 type ZAFLAGS = uint32 type _ZONEATTRIBUTES = struct { FcbSize ULONG FszDisplayName [260]WCHAR FszDescription [200]WCHAR FszIconPath [260]WCHAR FdwTemplateMinLevel DWORD FdwTemplateRecommended DWORD FdwTemplateCurrentLevel DWORD FdwFlags DWORD } type ZONEATTRIBUTES = _ZONEATTRIBUTES type LPZONEATTRIBUTES = uintptr type URLZONEREG = uint32 type IInternetZoneManagerVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetZoneAttributes uintptr FSetZoneAttributes uintptr FGetZoneCustomPolicy uintptr FSetZoneCustomPolicy uintptr FGetZoneActionPolicy uintptr FSetZoneActionPolicy uintptr FPromptAction uintptr FLogAction uintptr FCreateZoneEnumerator uintptr FGetZoneAt uintptr FDestroyZoneEnumerator uintptr FCopyTemplatePoliciesToZone uintptr } type IInternetZoneManagerVtbl = IInternetZoneManagerVtbl1 type _tagCODEBASEHOLD = struct { FcbSize ULONG F__ccgo_pad1 [4]byte FszDistUnit LPWSTR FszCodeBase LPWSTR FdwVersionMS DWORD FdwVersionLS DWORD FdwStyle DWORD F__ccgo_pad2 [4]byte } type CODEBASEHOLD = _tagCODEBASEHOLD type LPCODEBASEHOLD = uintptr type _tagSOFTDISTINFO = struct { FcbSize ULONG FdwFlags DWORD FdwAdState DWORD F__ccgo_pad1 [4]byte FszTitle LPWSTR FszAbstract LPWSTR FszHREF LPWSTR FdwInstalledVersionMS DWORD FdwInstalledVersionLS DWORD FdwUpdateVersionMS DWORD FdwUpdateVersionLS DWORD FdwAdvertisedVersionMS DWORD FdwAdvertisedVersionLS DWORD FdwReserved DWORD F__ccgo_pad2 [4]byte } type SOFTDISTINFO = _tagSOFTDISTINFO type LPSOFTDISTINFO = uintptr type ISoftDistExtVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FProcessSoftDist uintptr FGetFirstCodeBase uintptr FGetNextCodeBase uintptr FAsyncInstallDistributionUnit uintptr } type ISoftDistExtVtbl = ISoftDistExtVtbl1 type LPCATALOGFILEINFO = uintptr type ICatalogFileInfoVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetCatalogFile uintptr FGetJavaTrust uintptr } type ICatalogFileInfoVtbl = ICatalogFileInfoVtbl1 type LPDATAFILTER = uintptr type IDataFilterVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FDoEncode uintptr FDoDecode uintptr FSetEncodingLevel uintptr } type IDataFilterVtbl = IDataFilterVtbl1 type _tagPROTOCOLFILTERDATA = struct { FcbSize DWORD F__ccgo_pad1 [4]byte FpProtocolSink uintptr FpProtocol uintptr FpUnk uintptr FdwFilterFlags DWORD F__ccgo_pad2 [4]byte } type PROTOCOLFILTERDATA = _tagPROTOCOLFILTERDATA type LPENCODINGFILTERFACTORY = uintptr type _tagDATAINFO = struct { FulTotalSize ULONG FulavrPacketSize ULONG FulConnectSpeed ULONG FulProcessorSpeed ULONG } type DATAINFO = _tagDATAINFO type IEncodingFilterFactoryVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FFindBestFilter uintptr FGetDefaultFilter uintptr } type IEncodingFilterFactoryVtbl = IEncodingFilterFactoryVtbl1 type _tagHIT_LOGGING_INFO = struct { FdwStructSize DWORD F__ccgo_pad1 [4]byte FlpszLoggedUrlName LPSTR FStartTime SYSTEMTIME FEndTime SYSTEMTIME FlpszExtendedInfo LPSTR } type HIT_LOGGING_INFO = _tagHIT_LOGGING_INFO type LPHIT_LOGGING_INFO = uintptr type CONFIRMSAFETY = struct { Fclsid CLSID FpUnk uintptr FdwFlags DWORD F__ccgo_pad1 [4]byte } type LPIWRAPPEDPROTOCOL = uintptr type IWrappedProtocolVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetWrapperCode uintptr } type IWrappedProtocolVtbl = IWrappedProtocolVtbl1 type LPGETBINDHANDLE = uintptr type BINDHANDLETYPES = uint32 type IGetBindHandleVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetBindHandle uintptr } type IGetBindHandleVtbl = IGetBindHandleVtbl1 type _tagPROTOCOL_ARGUMENT = struct { FszMethod LPCWSTR FszTargetUrl LPCWSTR } type PROTOCOL_ARGUMENT = _tagPROTOCOL_ARGUMENT type LPPROTOCOL_ARGUMENT = uintptr type LPBINDCALLBACKREDIRECT = uintptr type IBindCallbackRedirectVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FRedirect uintptr } type IBindCallbackRedirectVtbl = IBindCallbackRedirectVtbl1 type IPropertyStorage1 = struct{ FlpVtbl uintptr } type IPropertyStorage = IPropertyStorage1 type IPropertySetStorage1 = struct{ FlpVtbl uintptr } type IPropertySetStorage = IPropertySetStorage1 type IEnumSTATPROPSTG1 = struct{ FlpVtbl uintptr } type IEnumSTATPROPSTG = IEnumSTATPROPSTG1 type IEnumSTATPROPSETSTG1 = struct{ FlpVtbl uintptr } type IEnumSTATPROPSETSTG = IEnumSTATPROPSETSTG1 type tagVersionedStream = struct { FguidVersion GUID FpStream uintptr } type VERSIONEDSTREAM = tagVersionedStream type LPVERSIONEDSTREAM = uintptr type tagCAC = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAC = tagCAC type tagCAUB = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAUB = tagCAUB type tagCAI = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAI = tagCAI type tagCAUI = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAUI = tagCAUI type tagCAL = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAL = tagCAL type tagCAUL = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAUL = tagCAUL type tagCAFLT = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAFLT = tagCAFLT type tagCADBL = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CADBL = tagCADBL type tagCACY = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CACY = tagCACY type tagCADATE = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CADATE = tagCADATE type tagCABSTR = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CABSTR = tagCABSTR type tagCABSTRBLOB = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CABSTRBLOB = tagCABSTRBLOB type tagCABOOL = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CABOOL = tagCABOOL type tagCASCODE = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CASCODE = tagCASCODE type tagCAPROPVARIANT = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAPROPVARIANT = tagCAPROPVARIANT type tagCAH = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAH = tagCAH type tagCAUH = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAUH = tagCAUH type tagCALPSTR = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CALPSTR = tagCALPSTR type tagCALPWSTR = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CALPWSTR = tagCALPWSTR type tagCAFILETIME = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CAFILETIME = tagCAFILETIME type tagCACLIPDATA = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CACLIPDATA = tagCACLIPDATA type tagCACLSID = struct { FcElems ULONG F__ccgo_pad1 [4]byte FpElems uintptr } type CACLSID = tagCACLSID type PROPVAR_PAD1 = WORD type PROPVAR_PAD2 = WORD type PROPVAR_PAD3 = WORD type LPPROPVARIANT = uintptr type tagPROPSPEC = struct { FulKind ULONG F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 Fpropid PROPID F__ccgo_pad2 [4]byte } } type PROPSPEC = tagPROPSPEC type tagSTATPROPSTG = struct { FlpwstrName LPOLESTR Fpropid PROPID Fvt VARTYPE F__ccgo_pad1 [2]byte } type STATPROPSTG = tagSTATPROPSTG type tagSTATPROPSETSTG = struct { Ffmtid FMTID Fclsid CLSID FgrfFlags DWORD Fmtime FILETIME Fctime FILETIME Fatime FILETIME FdwOSVersion DWORD } type STATPROPSETSTG = tagSTATPROPSETSTG type IPropertyStorageVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FReadMultiple uintptr FWriteMultiple uintptr FDeleteMultiple uintptr FReadPropertyNames uintptr FWritePropertyNames uintptr FDeletePropertyNames uintptr FCommit uintptr FRevert uintptr FEnum uintptr FSetTimes uintptr FSetClass uintptr FStat uintptr } type IPropertyStorageVtbl = IPropertyStorageVtbl1 type LPPROPERTYSETSTORAGE = uintptr type IPropertySetStorageVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FCreate uintptr FOpen uintptr FDelete uintptr FEnum uintptr } type IPropertySetStorageVtbl = IPropertySetStorageVtbl1 type LPENUMSTATPROPSTG = uintptr type IEnumSTATPROPSTGVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumSTATPROPSTGVtbl = IEnumSTATPROPSTGVtbl1 type LPENUMSTATPROPSETSTG = uintptr type IEnumSTATPROPSETSTGVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FNext uintptr FSkip uintptr FReset uintptr FClone uintptr } type IEnumSTATPROPSETSTGVtbl = IEnumSTATPROPSETSTGVtbl1 type LPPROPERTYSTORAGE = uintptr type tagSERIALIZEDPROPERTYVALUE = struct { FdwType DWORD Frgb [1]BYTE F__ccgo_pad1 [3]byte } type SERIALIZEDPROPERTYVALUE = tagSERIALIZEDPROPERTYVALUE type NUMPARSE = struct { FcDig INT FdwInFlags ULONG FdwOutFlags ULONG FcchUsed INT FnBaseShift INT FnPwr10 INT } type UDATE = struct { Fst SYSTEMTIME FwDayOfYear USHORT } type REGKIND = uint32 type tagPARAMDATA = struct { FszName uintptr Fvt VARTYPE F__ccgo_pad1 [6]byte } type PARAMDATA = tagPARAMDATA type LPPARAMDATA = uintptr type tagMETHODDATA = struct { FszName uintptr Fppdata uintptr Fdispid DISPID FiMeth UINT Fcc CALLCONV FcArgs UINT FwFlags WORD FvtReturn VARTYPE F__ccgo_pad1 [4]byte } type METHODDATA = tagMETHODDATA type LPMETHODDATA = uintptr type tagINTERFACEDATA = struct { Fpmethdata uintptr FcMembers UINT F__ccgo_pad1 [4]byte } type INTERFACEDATA = tagINTERFACEDATA type LPINTERFACEDATA = uintptr type _OLESTREAM = struct{ Flpstbl LPOLESTREAMVTBL } type LPOLESTREAM = uintptr type _OLESTREAMVTBL = struct { FGet uintptr FPut uintptr } type OLESTREAMVTBL = _OLESTREAMVTBL type LPOLESTREAMVTBL = uintptr type OLESTREAM = _OLESTREAM type _STORAGE_READ_CAPACITY = struct { FVersion ULONG FSize ULONG FBlockLength ULONG F__ccgo_pad1 [4]byte FNumberOfBlocks LARGE_INTEGER FDiskLength LARGE_INTEGER } type STORAGE_READ_CAPACITY = _STORAGE_READ_CAPACITY type PSTORAGE_READ_CAPACITY = uintptr type _STORAGE_HOTPLUG_INFO = struct { FSize DWORD FMediaRemovable BOOLEAN FMediaHotplug BOOLEAN FDeviceHotplug BOOLEAN FWriteCacheEnableOverride BOOLEAN } type STORAGE_HOTPLUG_INFO = _STORAGE_HOTPLUG_INFO type PSTORAGE_HOTPLUG_INFO = uintptr type _STORAGE_DEVICE_NUMBER = struct { FDeviceType DWORD FDeviceNumber DWORD FPartitionNumber DWORD } type STORAGE_DEVICE_NUMBER = _STORAGE_DEVICE_NUMBER type PSTORAGE_DEVICE_NUMBER = uintptr type _STORAGE_BUS_RESET_REQUEST = struct{ FPathId BYTE } type STORAGE_BUS_RESET_REQUEST = _STORAGE_BUS_RESET_REQUEST type PSTORAGE_BUS_RESET_REQUEST = uintptr type STORAGE_BREAK_RESERVATION_REQUEST1 = struct { FLength DWORD F_unused BYTE FPathId BYTE FTargetId BYTE FLun BYTE } type STORAGE_BREAK_RESERVATION_REQUEST = STORAGE_BREAK_RESERVATION_REQUEST1 type PSTORAGE_BREAK_RESERVATION_REQUEST = uintptr type _PREVENT_MEDIA_REMOVAL = struct{ FPreventMediaRemoval BOOLEAN } type PREVENT_MEDIA_REMOVAL = _PREVENT_MEDIA_REMOVAL type PPREVENT_MEDIA_REMOVAL = uintptr type _CLASS_MEDIA_CHANGE_CONTEXT = struct { FMediaChangeCount DWORD FNewState DWORD } type CLASS_MEDIA_CHANGE_CONTEXT = _CLASS_MEDIA_CHANGE_CONTEXT type PCLASS_MEDIA_CHANGE_CONTEXT = uintptr type _TAPE_STATISTICS = struct { FVersion DWORD FFlags DWORD FRecoveredWrites LARGE_INTEGER FUnrecoveredWrites LARGE_INTEGER FRecoveredReads LARGE_INTEGER FUnrecoveredReads LARGE_INTEGER FCompressionRatioReads BYTE FCompressionRatioWrites BYTE F__ccgo_pad1 [6]byte } type TAPE_STATISTICS = _TAPE_STATISTICS type PTAPE_STATISTICS = uintptr type _TAPE_GET_STATISTICS = struct{ FOperation DWORD } type TAPE_GET_STATISTICS = _TAPE_GET_STATISTICS type PTAPE_GET_STATISTICS = uintptr type STORAGE_MEDIA_TYPE = uint32 type PSTORAGE_MEDIA_TYPE = uintptr type STORAGE_BUS_TYPE = uint32 type PSTORAGE_BUS_TYPE = uintptr type _DEVICE_MEDIA_INFO = struct { FDeviceSpecific struct { FDiskInfo struct { FCylinders LARGE_INTEGER FMediaType STORAGE_MEDIA_TYPE FTracksPerCylinder DWORD FSectorsPerTrack DWORD FBytesPerSector DWORD FNumberMediaSides DWORD FMediaCharacteristics DWORD } } } type DEVICE_MEDIA_INFO = _DEVICE_MEDIA_INFO type PDEVICE_MEDIA_INFO = uintptr type _GET_MEDIA_TYPES = struct { FDeviceType DWORD FMediaInfoCount DWORD FMediaInfo [1]DEVICE_MEDIA_INFO } type GET_MEDIA_TYPES = _GET_MEDIA_TYPES type PGET_MEDIA_TYPES = uintptr type _STORAGE_PREDICT_FAILURE = struct { FPredictFailure DWORD FVendorSpecific [512]BYTE } type STORAGE_PREDICT_FAILURE = _STORAGE_PREDICT_FAILURE type PSTORAGE_PREDICT_FAILURE = uintptr type MEDIA_TYPE = uint32 type PMEDIA_TYPE = uintptr type _FORMAT_PARAMETERS = struct { FMediaType MEDIA_TYPE FStartCylinderNumber DWORD FEndCylinderNumber DWORD FStartHeadNumber DWORD FEndHeadNumber DWORD } type FORMAT_PARAMETERS = _FORMAT_PARAMETERS type PFORMAT_PARAMETERS = uintptr type BAD_TRACK_NUMBER = WORD type PBAD_TRACK_NUMBER = uintptr type _FORMAT_EX_PARAMETERS = struct { FMediaType MEDIA_TYPE FStartCylinderNumber DWORD FEndCylinderNumber DWORD FStartHeadNumber DWORD FEndHeadNumber DWORD FFormatGapLength WORD FSectorsPerTrack WORD FSectorNumber [1]WORD F__ccgo_pad1 [2]byte } type FORMAT_EX_PARAMETERS = _FORMAT_EX_PARAMETERS type PFORMAT_EX_PARAMETERS = uintptr type _DISK_GEOMETRY = struct { FCylinders LARGE_INTEGER FMediaType MEDIA_TYPE FTracksPerCylinder DWORD FSectorsPerTrack DWORD FBytesPerSector DWORD } type DISK_GEOMETRY = _DISK_GEOMETRY type PDISK_GEOMETRY = uintptr type _PARTITION_INFORMATION = struct { FStartingOffset LARGE_INTEGER FPartitionLength LARGE_INTEGER FHiddenSectors DWORD FPartitionNumber DWORD FPartitionType BYTE FBootIndicator BOOLEAN FRecognizedPartition BOOLEAN FRewritePartition BOOLEAN F__ccgo_pad1 [4]byte } type PARTITION_INFORMATION = _PARTITION_INFORMATION type PPARTITION_INFORMATION = uintptr type _SET_PARTITION_INFORMATION = struct{ FPartitionType BYTE } type SET_PARTITION_INFORMATION = _SET_PARTITION_INFORMATION type PSET_PARTITION_INFORMATION = uintptr type _DRIVE_LAYOUT_INFORMATION = struct { FPartitionCount DWORD FSignature DWORD FPartitionEntry [1]PARTITION_INFORMATION } type DRIVE_LAYOUT_INFORMATION = _DRIVE_LAYOUT_INFORMATION type PDRIVE_LAYOUT_INFORMATION = uintptr type _VERIFY_INFORMATION = struct { FStartingOffset LARGE_INTEGER FLength DWORD F__ccgo_pad1 [4]byte } type VERIFY_INFORMATION = _VERIFY_INFORMATION type PVERIFY_INFORMATION = uintptr type _REASSIGN_BLOCKS = struct { FReserved WORD FCount WORD FBlockNumber [1]DWORD } type REASSIGN_BLOCKS = _REASSIGN_BLOCKS type PREASSIGN_BLOCKS = uintptr type _REASSIGN_BLOCKS_EX = struct { FReserved WORD FCount WORD F__ccgo_pad1 [4]byte FBlockNumber [1]LARGE_INTEGER } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type REASSIGN_BLOCKS_EX = _REASSIGN_BLOCKS_EX type PREASSIGN_BLOCKS_EX = uintptr type PARTITION_STYLE = uint32 type _PARTITION_INFORMATION_GPT = struct { FPartitionType GUID FPartitionId GUID FAttributes DWORD64 FName [36]WCHAR } type PARTITION_INFORMATION_GPT = _PARTITION_INFORMATION_GPT type PPARTITION_INFORMATION_GPT = uintptr type _PARTITION_INFORMATION_MBR = struct { FPartitionType BYTE FBootIndicator BOOLEAN FRecognizedPartition BOOLEAN F__ccgo_pad1 [1]byte FHiddenSectors DWORD } type PARTITION_INFORMATION_MBR = _PARTITION_INFORMATION_MBR type PPARTITION_INFORMATION_MBR = uintptr type SET_PARTITION_INFORMATION_MBR = SET_PARTITION_INFORMATION type SET_PARTITION_INFORMATION_GPT = PARTITION_INFORMATION_GPT type _SET_PARTITION_INFORMATION_EX = struct { FPartitionStyle PARTITION_STYLE F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FMbr SET_PARTITION_INFORMATION_MBR F__ccgo_pad2 [111]byte } } type SET_PARTITION_INFORMATION_EX = _SET_PARTITION_INFORMATION_EX type PSET_PARTITION_INFORMATION_EX = uintptr type _CREATE_DISK_GPT = struct { FDiskId GUID FMaxPartitionCount DWORD } type CREATE_DISK_GPT = _CREATE_DISK_GPT type PCREATE_DISK_GPT = uintptr type _CREATE_DISK_MBR = struct{ FSignature DWORD } type CREATE_DISK_MBR = _CREATE_DISK_MBR type PCREATE_DISK_MBR = uintptr type _CREATE_DISK = struct { FPartitionStyle PARTITION_STYLE Fu struct { FMbr CREATE_DISK_MBR F__ccgo_pad1 [16]byte } } type CREATE_DISK = _CREATE_DISK type PCREATE_DISK = uintptr type _GET_LENGTH_INFORMATION = struct{ FLength LARGE_INTEGER } type GET_LENGTH_INFORMATION = _GET_LENGTH_INFORMATION type PGET_LENGTH_INFORMATION = uintptr type _PARTITION_INFORMATION_EX = struct { FPartitionStyle PARTITION_STYLE F__ccgo_pad1 [4]byte FStartingOffset LARGE_INTEGER FPartitionLength LARGE_INTEGER FPartitionNumber DWORD FRewritePartition BOOLEAN F__ccgo_pad2 [3]byte Fu struct { F__ccgo_pad1 [0]uint64 FMbr PARTITION_INFORMATION_MBR F__ccgo_pad2 [104]byte } } type PARTITION_INFORMATION_EX = _PARTITION_INFORMATION_EX type PPARTITION_INFORMATION_EX = uintptr type _DRIVE_LAYOUT_INFORMATION_GPT = struct { FDiskId GUID FStartingUsableOffset LARGE_INTEGER FUsableLength LARGE_INTEGER FMaxPartitionCount DWORD F__ccgo_pad1 [4]byte } type DRIVE_LAYOUT_INFORMATION_GPT = _DRIVE_LAYOUT_INFORMATION_GPT type PDRIVE_LAYOUT_INFORMATION_GPT = uintptr type _DRIVE_LAYOUT_INFORMATION_MBR = struct{ FSignature DWORD } type DRIVE_LAYOUT_INFORMATION_MBR = _DRIVE_LAYOUT_INFORMATION_MBR type PDRIVE_LAYOUT_INFORMATION_MBR = uintptr type _DRIVE_LAYOUT_INFORMATION_EX = struct { FPartitionStyle DWORD FPartitionCount DWORD Fu struct { F__ccgo_pad1 [0]uint64 FMbr DRIVE_LAYOUT_INFORMATION_MBR F__ccgo_pad2 [36]byte } FPartitionEntry [1]PARTITION_INFORMATION_EX } type DRIVE_LAYOUT_INFORMATION_EX = _DRIVE_LAYOUT_INFORMATION_EX type PDRIVE_LAYOUT_INFORMATION_EX = uintptr type DETECTION_TYPE = uint32 type _DISK_INT13_INFO = struct { FDriveSelect WORD F__ccgo_pad1 [2]byte FMaxCylinders DWORD FSectorsPerTrack WORD FMaxHeads WORD FNumberDrives WORD F__ccgo_pad2 [2]byte } type DISK_INT13_INFO = _DISK_INT13_INFO type PDISK_INT13_INFO = uintptr type _DISK_EX_INT13_INFO = struct { FExBufferSize WORD FExFlags WORD FExCylinders DWORD FExHeads DWORD FExSectorsPerTrack DWORD FExSectorsPerDrive DWORD64 FExSectorSize WORD FExReserved WORD F__ccgo_pad1 [4]byte } type DISK_EX_INT13_INFO = _DISK_EX_INT13_INFO type PDISK_EX_INT13_INFO = uintptr type _DISK_DETECTION_INFO = struct { FSizeOfDetectInfo DWORD FDetectionType DETECTION_TYPE Fu struct { Fs struct { FInt13 DISK_INT13_INFO FExInt13 DISK_EX_INT13_INFO } } } type DISK_DETECTION_INFO = _DISK_DETECTION_INFO type PDISK_DETECTION_INFO = uintptr type _DISK_PARTITION_INFO = struct { FSizeOfPartitionInfo DWORD FPartitionStyle PARTITION_STYLE Fu struct { FMbr struct { FSignature DWORD FCheckSum DWORD } F__ccgo_pad1 [8]byte } } type DISK_PARTITION_INFO = _DISK_PARTITION_INFO type PDISK_PARTITION_INFO = uintptr type _DISK_GEOMETRY_EX = struct { FGeometry DISK_GEOMETRY FDiskSize LARGE_INTEGER FData [1]BYTE F__ccgo_pad1 [7]byte } type DISK_GEOMETRY_EX = _DISK_GEOMETRY_EX type PDISK_GEOMETRY_EX = uintptr type _DISK_CONTROLLER_NUMBER = struct { FControllerNumber DWORD FDiskNumber DWORD } type DISK_CONTROLLER_NUMBER = _DISK_CONTROLLER_NUMBER type PDISK_CONTROLLER_NUMBER = uintptr type DISK_CACHE_RETENTION_PRIORITY = uint32 type _DISK_CACHE_INFORMATION = struct { FParametersSavable BOOLEAN FReadCacheEnabled BOOLEAN FWriteCacheEnabled BOOLEAN F__ccgo_pad1 [1]byte FReadRetentionPriority DISK_CACHE_RETENTION_PRIORITY FWriteRetentionPriority DISK_CACHE_RETENTION_PRIORITY FDisablePrefetchTransferLength WORD FPrefetchScalar BOOLEAN F__ccgo_pad2 [1]byte Fu struct { FScalarPrefetch struct { FMinimum WORD FMaximum WORD FMaximumBlocks WORD } } F__ccgo_pad3 [2]byte } type DISK_CACHE_INFORMATION = _DISK_CACHE_INFORMATION type PDISK_CACHE_INFORMATION = uintptr type _DISK_GROW_PARTITION = struct { FPartitionNumber DWORD F__ccgo_pad1 [4]byte FBytesToGrow LARGE_INTEGER } type DISK_GROW_PARTITION = _DISK_GROW_PARTITION type PDISK_GROW_PARTITION = uintptr type _HISTOGRAM_BUCKET = struct { FReads DWORD FWrites DWORD } type HISTOGRAM_BUCKET = _HISTOGRAM_BUCKET type PHISTOGRAM_BUCKET = uintptr type _DISK_HISTOGRAM = struct { FDiskSize LARGE_INTEGER FStart LARGE_INTEGER FEnd LARGE_INTEGER FAverage LARGE_INTEGER FAverageRead LARGE_INTEGER FAverageWrite LARGE_INTEGER FGranularity DWORD FSize DWORD FReadCount DWORD FWriteCount DWORD FHistogram PHISTOGRAM_BUCKET } type DISK_HISTOGRAM = _DISK_HISTOGRAM type PDISK_HISTOGRAM = uintptr type _DISK_PERFORMANCE = struct { FBytesRead LARGE_INTEGER FBytesWritten LARGE_INTEGER FReadTime LARGE_INTEGER FWriteTime LARGE_INTEGER FIdleTime LARGE_INTEGER FReadCount DWORD FWriteCount DWORD FQueueDepth DWORD FSplitCount DWORD FQueryTime LARGE_INTEGER FStorageDeviceNumber DWORD FStorageManagerName [8]WCHAR F__ccgo_pad1 [4]byte } type DISK_PERFORMANCE = _DISK_PERFORMANCE type PDISK_PERFORMANCE = uintptr type _DISK_RECORD = struct { FByteOffset LARGE_INTEGER FStartTime LARGE_INTEGER FEndTime LARGE_INTEGER FVirtualAddress PVOID FNumberOfBytes DWORD FDeviceNumber BYTE FReadRequest BOOLEAN F__ccgo_pad1 [2]byte } type DISK_RECORD = _DISK_RECORD type PDISK_RECORD = uintptr type _DISK_LOGGING = struct { FFunction BYTE F__ccgo_pad1 [7]byte FBufferAddress PVOID FBufferSize DWORD F__ccgo_pad2 [4]byte } type DISK_LOGGING = _DISK_LOGGING type PDISK_LOGGING = uintptr type BIN_TYPES = uint32 type _BIN_RANGE = struct { FStartValue LARGE_INTEGER FLength LARGE_INTEGER } type BIN_RANGE = _BIN_RANGE type PBIN_RANGE = uintptr type _PERF_BIN = struct { FNumberOfBins DWORD FTypeOfBin DWORD FBinsRanges [1]BIN_RANGE } type PERF_BIN = _PERF_BIN type PPERF_BIN = uintptr type _BIN_COUNT = struct { FBinRange BIN_RANGE FBinCount DWORD F__ccgo_pad1 [4]byte } type BIN_COUNT = _BIN_COUNT type PBIN_COUNT = uintptr type _BIN_RESULTS = struct { FNumberOfBins DWORD F__ccgo_pad1 [4]byte FBinCounts [1]BIN_COUNT } type BIN_RESULTS = _BIN_RESULTS type PBIN_RESULTS = uintptr type _GETVERSIONINPARAMS = struct { FbVersion BYTE FbRevision BYTE FbReserved BYTE FbIDEDeviceMap BYTE FfCapabilities DWORD FdwReserved [4]DWORD } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type GETVERSIONINPARAMS = _GETVERSIONINPARAMS type PGETVERSIONINPARAMS = uintptr type LPGETVERSIONINPARAMS = uintptr type _IDEREGS = struct { FbFeaturesReg BYTE FbSectorCountReg BYTE FbSectorNumberReg BYTE FbCylLowReg BYTE FbCylHighReg BYTE FbDriveHeadReg BYTE FbCommandReg BYTE FbReserved BYTE } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type IDEREGS = _IDEREGS type PIDEREGS = uintptr type LPIDEREGS = uintptr type _SENDCMDINPARAMS = struct { FcBufferSize DWORD FirDriveRegs IDEREGS FbDriveNumber BYTE FbReserved [3]BYTE FdwReserved [4]DWORD FbBuffer [1]BYTE F__ccgo_pad1 [3]byte } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type SENDCMDINPARAMS = _SENDCMDINPARAMS type PSENDCMDINPARAMS = uintptr type LPSENDCMDINPARAMS = uintptr type _DRIVERSTATUS = struct { FbDriverError BYTE FbIDEError BYTE FbReserved [2]BYTE FdwReserved [2]DWORD } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type DRIVERSTATUS = _DRIVERSTATUS type PDRIVERSTATUS = uintptr type LPDRIVERSTATUS = uintptr type _SENDCMDOUTPARAMS = struct { FcBufferSize DWORD FDriverStatus DRIVERSTATUS FbBuffer [1]BYTE F__ccgo_pad1 [3]byte } // * // This file has no copyright assigned and is placed in the Public Domain. // This file is part of the mingw-w64 runtime package. // No warranty is given; refer to the file DISCLAIMER.PD within this package. type SENDCMDOUTPARAMS = _SENDCMDOUTPARAMS type PSENDCMDOUTPARAMS = uintptr type LPSENDCMDOUTPARAMS = uintptr type ELEMENT_TYPE = uint32 type PELEMENT_TYPE = uintptr type _CHANGER_ELEMENT = struct { FElementType ELEMENT_TYPE FElementAddress DWORD } type CHANGER_ELEMENT = _CHANGER_ELEMENT type PCHANGER_ELEMENT = uintptr type _CHANGER_ELEMENT_LIST = struct { FElement CHANGER_ELEMENT FNumberOfElements DWORD } type CHANGER_ELEMENT_LIST = _CHANGER_ELEMENT_LIST type PCHANGER_ELEMENT_LIST = uintptr type _GET_CHANGER_PARAMETERS = struct { FSize DWORD FNumberTransportElements WORD FNumberStorageElements WORD FNumberCleanerSlots WORD FNumberIEElements WORD FNumberDataTransferElements WORD FNumberOfDoors WORD FFirstSlotNumber WORD FFirstDriveNumber WORD FFirstTransportNumber WORD FFirstIEPortNumber WORD FFirstCleanerSlotAddress WORD FMagazineSize WORD FDriveCleanTimeout DWORD FFeatures0 DWORD FFeatures1 DWORD FMoveFromTransport BYTE FMoveFromSlot BYTE FMoveFromIePort BYTE FMoveFromDrive BYTE FExchangeFromTransport BYTE FExchangeFromSlot BYTE FExchangeFromIePort BYTE FExchangeFromDrive BYTE FLockUnlockCapabilities BYTE FPositionCapabilities BYTE FReserved1 [2]BYTE FReserved2 [2]DWORD } type GET_CHANGER_PARAMETERS = _GET_CHANGER_PARAMETERS type PGET_CHANGER_PARAMETERS = uintptr type _CHANGER_PRODUCT_DATA = struct { FVendorId [8]BYTE FProductId [16]BYTE FRevision [4]BYTE FSerialNumber [32]BYTE FDeviceType BYTE } type CHANGER_PRODUCT_DATA = _CHANGER_PRODUCT_DATA type PCHANGER_PRODUCT_DATA = uintptr type _CHANGER_SET_ACCESS = struct { FElement CHANGER_ELEMENT FControl DWORD } type CHANGER_SET_ACCESS = _CHANGER_SET_ACCESS type PCHANGER_SET_ACCESS = uintptr type _CHANGER_READ_ELEMENT_STATUS = struct { FElementList CHANGER_ELEMENT_LIST FVolumeTagInfo BOOLEAN F__ccgo_pad1 [3]byte } type CHANGER_READ_ELEMENT_STATUS = _CHANGER_READ_ELEMENT_STATUS type PCHANGER_READ_ELEMENT_STATUS = uintptr type _CHANGER_ELEMENT_STATUS = struct { FElement CHANGER_ELEMENT FSrcElementAddress CHANGER_ELEMENT FFlags DWORD FExceptionCode DWORD FTargetId BYTE FLun BYTE FReserved WORD FPrimaryVolumeID [36]BYTE FAlternateVolumeID [36]BYTE } type CHANGER_ELEMENT_STATUS = _CHANGER_ELEMENT_STATUS type PCHANGER_ELEMENT_STATUS = uintptr type _CHANGER_ELEMENT_STATUS_EX = struct { FElement CHANGER_ELEMENT FSrcElementAddress CHANGER_ELEMENT FFlags DWORD FExceptionCode DWORD FTargetId BYTE FLun BYTE FReserved WORD FPrimaryVolumeID [36]BYTE FAlternateVolumeID [36]BYTE FVendorIdentification [8]BYTE FProductIdentification [16]BYTE FSerialNumber [32]BYTE } type CHANGER_ELEMENT_STATUS_EX = _CHANGER_ELEMENT_STATUS_EX type PCHANGER_ELEMENT_STATUS_EX = uintptr type _CHANGER_INITIALIZE_ELEMENT_STATUS = struct { FElementList CHANGER_ELEMENT_LIST FBarCodeScan BOOLEAN F__ccgo_pad1 [3]byte } type CHANGER_INITIALIZE_ELEMENT_STATUS = _CHANGER_INITIALIZE_ELEMENT_STATUS type PCHANGER_INITIALIZE_ELEMENT_STATUS = uintptr type _CHANGER_SET_POSITION = struct { FTransport CHANGER_ELEMENT FDestination CHANGER_ELEMENT FFlip BOOLEAN F__ccgo_pad1 [3]byte } type CHANGER_SET_POSITION = _CHANGER_SET_POSITION type PCHANGER_SET_POSITION = uintptr type _CHANGER_EXCHANGE_MEDIUM = struct { FTransport CHANGER_ELEMENT FSource CHANGER_ELEMENT FDestination1 CHANGER_ELEMENT FDestination2 CHANGER_ELEMENT FFlip1 BOOLEAN FFlip2 BOOLEAN F__ccgo_pad1 [2]byte } type CHANGER_EXCHANGE_MEDIUM = _CHANGER_EXCHANGE_MEDIUM type PCHANGER_EXCHANGE_MEDIUM = uintptr type _CHANGER_MOVE_MEDIUM = struct { FTransport CHANGER_ELEMENT FSource CHANGER_ELEMENT FDestination CHANGER_ELEMENT FFlip BOOLEAN F__ccgo_pad1 [3]byte } type CHANGER_MOVE_MEDIUM = _CHANGER_MOVE_MEDIUM type PCHANGER_MOVE_MEDIUM = uintptr type _CHANGER_SEND_VOLUME_TAG_INFORMATION = struct { FStartingElement CHANGER_ELEMENT FActionCode DWORD FVolumeIDTemplate [40]BYTE } type CHANGER_SEND_VOLUME_TAG_INFORMATION = _CHANGER_SEND_VOLUME_TAG_INFORMATION type PCHANGER_SEND_VOLUME_TAG_INFORMATION = uintptr type _READ_ELEMENT_ADDRESS_INFO = struct { FNumberOfElements DWORD FElementStatus [1]CHANGER_ELEMENT_STATUS } type READ_ELEMENT_ADDRESS_INFO = _READ_ELEMENT_ADDRESS_INFO type PREAD_ELEMENT_ADDRESS_INFO = uintptr type CHANGER_DEVICE_PROBLEM_TYPE = uint32 type PCHANGER_DEVICE_PROBLEM_TYPE = uintptr type _PATHNAME_BUFFER = struct { FPathNameLength DWORD FName [1]WCHAR F__ccgo_pad1 [2]byte } type PATHNAME_BUFFER = _PATHNAME_BUFFER type PPATHNAME_BUFFER = uintptr type _FSCTL_QUERY_FAT_BPB_BUFFER = struct{ FFirst0x24BytesOfBootSector [36]BYTE } type FSCTL_QUERY_FAT_BPB_BUFFER = _FSCTL_QUERY_FAT_BPB_BUFFER type PFSCTL_QUERY_FAT_BPB_BUFFER = uintptr type NTFS_VOLUME_DATA_BUFFER = struct { FVolumeSerialNumber LARGE_INTEGER FNumberSectors LARGE_INTEGER FTotalClusters LARGE_INTEGER FFreeClusters LARGE_INTEGER FTotalReserved LARGE_INTEGER FBytesPerSector DWORD FBytesPerCluster DWORD FBytesPerFileRecordSegment DWORD FClustersPerFileRecordSegment DWORD FMftValidDataLength LARGE_INTEGER FMftStartLcn LARGE_INTEGER FMft2StartLcn LARGE_INTEGER FMftZoneStart LARGE_INTEGER FMftZoneEnd LARGE_INTEGER } type PNTFS_VOLUME_DATA_BUFFER = uintptr type NTFS_EXTENDED_VOLUME_DATA = struct { FByteCount DWORD FMajorVersion WORD FMinorVersion WORD } type PNTFS_EXTENDED_VOLUME_DATA = uintptr type STARTING_LCN_INPUT_BUFFER = struct{ FStartingLcn LARGE_INTEGER } type PSTARTING_LCN_INPUT_BUFFER = uintptr type VOLUME_BITMAP_BUFFER = struct { FStartingLcn LARGE_INTEGER FBitmapSize LARGE_INTEGER FBuffer [1]BYTE F__ccgo_pad1 [7]byte } type PVOLUME_BITMAP_BUFFER = uintptr type STARTING_VCN_INPUT_BUFFER = struct{ FStartingVcn LARGE_INTEGER } type PSTARTING_VCN_INPUT_BUFFER = uintptr type RETRIEVAL_POINTERS_BUFFER1 = struct { FExtentCount DWORD F__ccgo_pad1 [4]byte FStartingVcn LARGE_INTEGER FExtents [1]struct { FNextVcn LARGE_INTEGER FLcn LARGE_INTEGER } } type RETRIEVAL_POINTERS_BUFFER = RETRIEVAL_POINTERS_BUFFER1 type PRETRIEVAL_POINTERS_BUFFER = uintptr type NTFS_FILE_RECORD_INPUT_BUFFER = struct{ FFileReferenceNumber LARGE_INTEGER } type PNTFS_FILE_RECORD_INPUT_BUFFER = uintptr type NTFS_FILE_RECORD_OUTPUT_BUFFER = struct { FFileReferenceNumber LARGE_INTEGER FFileRecordLength DWORD FFileRecordBuffer [1]BYTE F__ccgo_pad1 [3]byte } type PNTFS_FILE_RECORD_OUTPUT_BUFFER = uintptr type MOVE_FILE_DATA = struct { FFileHandle HANDLE FStartingVcn LARGE_INTEGER FStartingLcn LARGE_INTEGER FClusterCount DWORD F__ccgo_pad1 [4]byte } type PMOVE_FILE_DATA = uintptr type _MOVE_FILE_DATA32 = struct { FFileHandle UINT32 F__ccgo_pad1 [4]byte FStartingVcn LARGE_INTEGER FStartingLcn LARGE_INTEGER FClusterCount DWORD F__ccgo_pad2 [4]byte } type MOVE_FILE_DATA32 = _MOVE_FILE_DATA32 type PMOVE_FILE_DATA32 = uintptr type FIND_BY_SID_DATA = struct { FRestart DWORD FSid SID } type PFIND_BY_SID_DATA = uintptr type FIND_BY_SID_OUTPUT = struct { FNextEntryOffset DWORD FFileIndex DWORD FFileNameLength DWORD FFileName [1]WCHAR F__ccgo_pad1 [2]byte } type PFIND_BY_SID_OUTPUT = uintptr type MFT_ENUM_DATA = struct { FStartFileReferenceNumber DWORDLONG FLowUsn USN FHighUsn USN } type PMFT_ENUM_DATA = uintptr type CREATE_USN_JOURNAL_DATA = struct { FMaximumSize DWORDLONG FAllocationDelta DWORDLONG } type PCREATE_USN_JOURNAL_DATA = uintptr type READ_USN_JOURNAL_DATA = struct { FStartUsn USN FReasonMask DWORD FReturnOnlyOnClose DWORD FTimeout DWORDLONG FBytesToWaitFor DWORDLONG FUsnJournalID DWORDLONG } type PREAD_USN_JOURNAL_DATA = uintptr type USN_RECORD = struct { FRecordLength DWORD FMajorVersion WORD FMinorVersion WORD FFileReferenceNumber DWORDLONG FParentFileReferenceNumber DWORDLONG FUsn USN FTimeStamp LARGE_INTEGER FReason DWORD FSourceInfo DWORD FSecurityId DWORD FFileAttributes DWORD FFileNameLength WORD FFileNameOffset WORD FFileName [1]WCHAR F__ccgo_pad1 [2]byte } type PUSN_RECORD = uintptr type USN_JOURNAL_DATA = struct { FUsnJournalID DWORDLONG FFirstUsn USN FNextUsn USN FLowestValidUsn USN FMaxUsn USN FMaximumSize DWORDLONG FAllocationDelta DWORDLONG } type PUSN_JOURNAL_DATA = uintptr type DELETE_USN_JOURNAL_DATA = struct { FUsnJournalID DWORDLONG FDeleteFlags DWORD F__ccgo_pad1 [4]byte } type PDELETE_USN_JOURNAL_DATA = uintptr type MARK_HANDLE_INFO = struct { FUsnSourceInfo DWORD F__ccgo_pad1 [4]byte FVolumeHandle HANDLE FHandleInfo DWORD F__ccgo_pad2 [4]byte } type PMARK_HANDLE_INFO = uintptr type MARK_HANDLE_INFO32 = struct { FUsnSourceInfo DWORD FVolumeHandle UINT32 FHandleInfo DWORD } type PMARK_HANDLE_INFO32 = uintptr type BULK_SECURITY_TEST_DATA = struct { FDesiredAccess ACCESS_MASK FSecurityIds [1]DWORD } type PBULK_SECURITY_TEST_DATA = uintptr type _FILE_PREFETCH = struct { FType DWORD FCount DWORD FPrefetch [1]DWORDLONG } type FILE_PREFETCH = _FILE_PREFETCH type PFILE_PREFETCH = uintptr type _FILESYSTEM_STATISTICS = struct { FFileSystemType WORD FVersion WORD FSizeOfCompleteStructure DWORD FUserFileReads DWORD FUserFileReadBytes DWORD FUserDiskReads DWORD FUserFileWrites DWORD FUserFileWriteBytes DWORD FUserDiskWrites DWORD FMetaDataReads DWORD FMetaDataReadBytes DWORD FMetaDataDiskReads DWORD FMetaDataWrites DWORD FMetaDataWriteBytes DWORD FMetaDataDiskWrites DWORD } type FILESYSTEM_STATISTICS = _FILESYSTEM_STATISTICS type PFILESYSTEM_STATISTICS = uintptr type _FAT_STATISTICS = struct { FCreateHits DWORD FSuccessfulCreates DWORD FFailedCreates DWORD FNonCachedReads DWORD FNonCachedReadBytes DWORD FNonCachedWrites DWORD FNonCachedWriteBytes DWORD FNonCachedDiskReads DWORD FNonCachedDiskWrites DWORD } type FAT_STATISTICS = _FAT_STATISTICS type PFAT_STATISTICS = uintptr type _EXFAT_STATISTICS = struct { FCreateHits DWORD FSuccessfulCreates DWORD FFailedCreates DWORD FNonCachedReads DWORD FNonCachedReadBytes DWORD FNonCachedWrites DWORD FNonCachedWriteBytes DWORD FNonCachedDiskReads DWORD FNonCachedDiskWrites DWORD } type EXFAT_STATISTICS = _EXFAT_STATISTICS type PEXFAT_STATISTICS = uintptr type _NTFS_STATISTICS = struct { FLogFileFullExceptions DWORD FOtherExceptions DWORD FMftReads DWORD FMftReadBytes DWORD FMftWrites DWORD FMftWriteBytes DWORD FMftWritesUserLevel struct { FWrite WORD FCreate WORD FSetInfo WORD FFlush WORD } FMftWritesFlushForLogFileFull WORD FMftWritesLazyWriter WORD FMftWritesUserRequest WORD F__ccgo_pad1 [2]byte FMft2Writes DWORD FMft2WriteBytes DWORD FMft2WritesUserLevel struct { FWrite WORD FCreate WORD FSetInfo WORD FFlush WORD } FMft2WritesFlushForLogFileFull WORD FMft2WritesLazyWriter WORD FMft2WritesUserRequest WORD F__ccgo_pad2 [2]byte FRootIndexReads DWORD FRootIndexReadBytes DWORD FRootIndexWrites DWORD FRootIndexWriteBytes DWORD FBitmapReads DWORD FBitmapReadBytes DWORD FBitmapWrites DWORD FBitmapWriteBytes DWORD FBitmapWritesFlushForLogFileFull WORD FBitmapWritesLazyWriter WORD FBitmapWritesUserRequest WORD FBitmapWritesUserLevel struct { FWrite WORD FCreate WORD FSetInfo WORD } FMftBitmapReads DWORD FMftBitmapReadBytes DWORD FMftBitmapWrites DWORD FMftBitmapWriteBytes DWORD FMftBitmapWritesFlushForLogFileFull WORD FMftBitmapWritesLazyWriter WORD FMftBitmapWritesUserRequest WORD FMftBitmapWritesUserLevel struct { FWrite WORD FCreate WORD FSetInfo WORD FFlush WORD } F__ccgo_pad3 [2]byte FUserIndexReads DWORD FUserIndexReadBytes DWORD FUserIndexWrites DWORD FUserIndexWriteBytes DWORD FLogFileReads DWORD FLogFileReadBytes DWORD FLogFileWrites DWORD FLogFileWriteBytes DWORD FAllocate struct { FCalls DWORD FClusters DWORD FHints DWORD FRunsReturned DWORD FHintsHonored DWORD FHintsClusters DWORD FCache DWORD FCacheClusters DWORD FCacheMiss DWORD FCacheMissClusters DWORD } } type NTFS_STATISTICS = _NTFS_STATISTICS type PNTFS_STATISTICS = uintptr type _FILE_OBJECTID_BUFFER = struct { FObjectId [16]BYTE Fu struct { Fs struct { FBirthVolumeId [16]BYTE FBirthObjectId [16]BYTE FDomainId [16]BYTE } } } type FILE_OBJECTID_BUFFER = _FILE_OBJECTID_BUFFER type PFILE_OBJECTID_BUFFER = uintptr type _FILE_SET_SPARSE_BUFFER = struct{ FSetSparse BOOLEAN } type FILE_SET_SPARSE_BUFFER = _FILE_SET_SPARSE_BUFFER type PFILE_SET_SPARSE_BUFFER = uintptr type _FILE_ZERO_DATA_INFORMATION = struct { FFileOffset LARGE_INTEGER FBeyondFinalZero LARGE_INTEGER } type FILE_ZERO_DATA_INFORMATION = _FILE_ZERO_DATA_INFORMATION type PFILE_ZERO_DATA_INFORMATION = uintptr type _FILE_ALLOCATED_RANGE_BUFFER = struct { FFileOffset LARGE_INTEGER FLength LARGE_INTEGER } type FILE_ALLOCATED_RANGE_BUFFER = _FILE_ALLOCATED_RANGE_BUFFER type PFILE_ALLOCATED_RANGE_BUFFER = uintptr type _ENCRYPTION_BUFFER = struct { FEncryptionOperation DWORD FPrivate [1]BYTE F__ccgo_pad1 [3]byte } type ENCRYPTION_BUFFER = _ENCRYPTION_BUFFER type PENCRYPTION_BUFFER = uintptr type _DECRYPTION_STATUS_BUFFER = struct{ FNoEncryptedStreams BOOLEAN } type DECRYPTION_STATUS_BUFFER = _DECRYPTION_STATUS_BUFFER type PDECRYPTION_STATUS_BUFFER = uintptr type _REQUEST_RAW_ENCRYPTED_DATA = struct { FFileOffset LONGLONG FLength DWORD F__ccgo_pad1 [4]byte } type REQUEST_RAW_ENCRYPTED_DATA = _REQUEST_RAW_ENCRYPTED_DATA type PREQUEST_RAW_ENCRYPTED_DATA = uintptr type _ENCRYPTED_DATA_INFO = struct { FStartingFileOffset DWORDLONG FOutputBufferOffset DWORD FBytesWithinFileSize DWORD FBytesWithinValidDataLength DWORD FCompressionFormat WORD FDataUnitShift BYTE FChunkShift BYTE FClusterShift BYTE FEncryptionFormat BYTE FNumberOfDataBlocks WORD FDataBlockSize [1]DWORD } type ENCRYPTED_DATA_INFO = _ENCRYPTED_DATA_INFO type PENCRYPTED_DATA_INFO = uintptr type _PLEX_READ_DATA_REQUEST = struct { FByteOffset LARGE_INTEGER FByteLength DWORD FPlexNumber DWORD } type PLEX_READ_DATA_REQUEST = _PLEX_READ_DATA_REQUEST type PPLEX_READ_DATA_REQUEST = uintptr type _SI_COPYFILE = struct { FSourceFileNameLength DWORD FDestinationFileNameLength DWORD FFlags DWORD FFileNameBuffer [1]WCHAR F__ccgo_pad1 [2]byte } type SI_COPYFILE = _SI_COPYFILE type PSI_COPYFILE = uintptr type _STORAGE_DESCRIPTOR_HEADER = struct { FVersion DWORD FSize DWORD } type STORAGE_DESCRIPTOR_HEADER = _STORAGE_DESCRIPTOR_HEADER type PSTORAGE_DESCRIPTOR_HEADER = uintptr type STORAGE_PROPERTY_ID = uint32 type PSTORAGE_PROPERTY_ID = uintptr type STORAGE_QUERY_TYPE = uint32 type PSTORAGE_QUERY_TYPE = uintptr type _STORAGE_PROPERTY_QUERY = struct { FPropertyId STORAGE_PROPERTY_ID FQueryType STORAGE_QUERY_TYPE FAdditionalParameters [1]BYTE F__ccgo_pad1 [3]byte } type STORAGE_PROPERTY_QUERY = _STORAGE_PROPERTY_QUERY type PSTORAGE_PROPERTY_QUERY = uintptr type _STORAGE_DEVICE_DESCRIPTOR = struct { FVersion DWORD FSize DWORD FDeviceType BYTE FDeviceTypeModifier BYTE FRemovableMedia BOOLEAN FCommandQueueing BOOLEAN FVendorIdOffset DWORD FProductIdOffset DWORD FProductRevisionOffset DWORD FSerialNumberOffset DWORD FBusType STORAGE_BUS_TYPE FRawPropertiesLength DWORD FRawDeviceProperties [1]BYTE F__ccgo_pad1 [3]byte } type STORAGE_DEVICE_DESCRIPTOR = _STORAGE_DEVICE_DESCRIPTOR type PSTORAGE_DEVICE_DESCRIPTOR = uintptr type _STORAGE_ADAPTER_DESCRIPTOR = struct { FVersion DWORD FSize DWORD FMaximumTransferLength DWORD FMaximumPhysicalPages DWORD FAlignmentMask DWORD FAdapterUsesPio BOOLEAN FAdapterScansDown BOOLEAN FCommandQueueing BOOLEAN FAcceleratedTransfer BOOLEAN FBusType BYTE F__ccgo_pad1 [1]byte FBusMajorVersion WORD FBusMinorVersion WORD F__ccgo_pad2 [2]byte } type STORAGE_ADAPTER_DESCRIPTOR = _STORAGE_ADAPTER_DESCRIPTOR type PSTORAGE_ADAPTER_DESCRIPTOR = uintptr type _STORAGE_DEVICE_ID_DESCRIPTOR = struct { FVersion DWORD FSize DWORD FNumberOfIdentifiers DWORD FIdentifiers [1]BYTE F__ccgo_pad1 [3]byte } type STORAGE_DEVICE_ID_DESCRIPTOR = _STORAGE_DEVICE_ID_DESCRIPTOR type PSTORAGE_DEVICE_ID_DESCRIPTOR = uintptr type _VOLUME_GET_GPT_ATTRIBUTES_INFORMATION = struct{ FGptAttributes ULONGLONG } type VOLUME_GET_GPT_ATTRIBUTES_INFORMATION = _VOLUME_GET_GPT_ATTRIBUTES_INFORMATION type PVOLUME_GET_GPT_ATTRIBUTES_INFORMATION = uintptr type _DISK_EXTENT = struct { FDiskNumber DWORD F__ccgo_pad1 [4]byte FStartingOffset LARGE_INTEGER FExtentLength LARGE_INTEGER } type DISK_EXTENT = _DISK_EXTENT type PDISK_EXTENT = uintptr type _VOLUME_DISK_EXTENTS = struct { FNumberOfDiskExtents DWORD F__ccgo_pad1 [4]byte FExtents [1]DISK_EXTENT } type VOLUME_DISK_EXTENTS = _VOLUME_DISK_EXTENTS type PVOLUME_DISK_EXTENTS = uintptr type UWORD = WORD type _SCARD_IO_REQUEST = struct { FdwProtocol DWORD FcbPciLength DWORD } type SCARD_IO_REQUEST = _SCARD_IO_REQUEST type PSCARD_IO_REQUEST = uintptr type LPSCARD_IO_REQUEST = uintptr type LPCSCARD_IO_REQUEST = uintptr type SCARD_T0_COMMAND = struct { FbCla BYTE FbIns BYTE FbP1 BYTE FbP2 BYTE FbP3 BYTE } type LPSCARD_T0_COMMAND = uintptr type SCARD_T0_REQUEST = struct { FioRequest SCARD_IO_REQUEST FbSw1 BYTE FbSw2 BYTE F__10 struct{ FCmdBytes SCARD_T0_COMMAND } F__ccgo_pad1 [1]byte } type PSCARD_T0_REQUEST = uintptr type LPSCARD_T0_REQUEST = uintptr type SCARD_T1_REQUEST = struct{ FioRequest SCARD_IO_REQUEST } type PSCARD_T1_REQUEST = uintptr type LPSCARD_T1_REQUEST = uintptr type LPCBYTE = uintptr var Xg_rgSCardT0Pci SCARD_IO_REQUEST var Xg_rgSCardT1Pci SCARD_IO_REQUEST var Xg_rgSCardRawPci SCARD_IO_REQUEST type SCARDCONTEXT = ULONG_PTR type PSCARDCONTEXT = uintptr type LPSCARDCONTEXT = uintptr type SCARDHANDLE = ULONG_PTR type PSCARDHANDLE = uintptr type LPSCARDHANDLE = uintptr type SCARD_READERSTATEA = struct { FszReader LPCSTR FpvUserData LPVOID FdwCurrentState DWORD FdwEventState DWORD FcbAtr DWORD FrgbAtr [36]BYTE } type PSCARD_READERSTATEA = uintptr type LPSCARD_READERSTATEA = uintptr type SCARD_READERSTATEW = struct { FszReader LPCWSTR FpvUserData LPVOID FdwCurrentState DWORD FdwEventState DWORD FcbAtr DWORD FrgbAtr [36]BYTE } type PSCARD_READERSTATEW = uintptr type LPSCARD_READERSTATEW = uintptr type SCARD_READERSTATE = SCARD_READERSTATEA type PSCARD_READERSTATE = PSCARD_READERSTATEA type LPSCARD_READERSTATE = LPSCARD_READERSTATEA type _SCARD_ATRMASK = struct { FcbAtr DWORD FrgbAtr [36]BYTE FrgbMask [36]BYTE } type SCARD_ATRMASK = _SCARD_ATRMASK type PSCARD_ATRMASK = uintptr type LPSCARD_ATRMASK = uintptr type LPOCNCONNPROCA = uintptr type LPOCNCONNPROCW = uintptr type LPOCNCHKPROC = uintptr type LPOCNDSCPROC = uintptr type OPENCARD_SEARCH_CRITERIAA = struct { FdwStructSize DWORD F__ccgo_pad1 [4]byte FlpstrGroupNames LPSTR FnMaxGroupNames DWORD F__ccgo_pad2 [4]byte FrgguidInterfaces LPCGUID FcguidInterfaces DWORD F__ccgo_pad3 [4]byte FlpstrCardNames LPSTR FnMaxCardNames DWORD F__ccgo_pad4 [4]byte FlpfnCheck LPOCNCHKPROC FlpfnConnect LPOCNCONNPROCA FlpfnDisconnect LPOCNDSCPROC FpvUserData LPVOID FdwShareMode DWORD FdwPreferredProtocols DWORD } type POPENCARD_SEARCH_CRITERIAA = uintptr type LPOPENCARD_SEARCH_CRITERIAA = uintptr type OPENCARD_SEARCH_CRITERIAW = struct { FdwStructSize DWORD F__ccgo_pad1 [4]byte FlpstrGroupNames LPWSTR FnMaxGroupNames DWORD F__ccgo_pad2 [4]byte FrgguidInterfaces LPCGUID FcguidInterfaces DWORD F__ccgo_pad3 [4]byte FlpstrCardNames LPWSTR FnMaxCardNames DWORD F__ccgo_pad4 [4]byte FlpfnCheck LPOCNCHKPROC FlpfnConnect LPOCNCONNPROCW FlpfnDisconnect LPOCNDSCPROC FpvUserData LPVOID FdwShareMode DWORD FdwPreferredProtocols DWORD } type POPENCARD_SEARCH_CRITERIAW = uintptr type LPOPENCARD_SEARCH_CRITERIAW = uintptr type OPENCARD_SEARCH_CRITERIA = OPENCARD_SEARCH_CRITERIAA type POPENCARD_SEARCH_CRITERIA = POPENCARD_SEARCH_CRITERIAA type LPOPENCARD_SEARCH_CRITERIA = LPOPENCARD_SEARCH_CRITERIAA type OPENCARDNAME_EXA = struct { FdwStructSize DWORD F__ccgo_pad1 [4]byte FhSCardContext SCARDCONTEXT FhwndOwner HWND FdwFlags DWORD F__ccgo_pad2 [4]byte FlpstrTitle LPCSTR FlpstrSearchDesc LPCSTR FhIcon HICON FpOpenCardSearchCriteria POPENCARD_SEARCH_CRITERIAA FlpfnConnect LPOCNCONNPROCA FpvUserData LPVOID FdwShareMode DWORD FdwPreferredProtocols DWORD FlpstrRdr LPSTR FnMaxRdr DWORD F__ccgo_pad3 [4]byte FlpstrCard LPSTR FnMaxCard DWORD FdwActiveProtocol DWORD FhCardHandle SCARDHANDLE } type POPENCARDNAME_EXA = uintptr type LPOPENCARDNAME_EXA = uintptr type OPENCARDNAME_EXW = struct { FdwStructSize DWORD F__ccgo_pad1 [4]byte FhSCardContext SCARDCONTEXT FhwndOwner HWND FdwFlags DWORD F__ccgo_pad2 [4]byte FlpstrTitle LPCWSTR FlpstrSearchDesc LPCWSTR FhIcon HICON FpOpenCardSearchCriteria POPENCARD_SEARCH_CRITERIAW FlpfnConnect LPOCNCONNPROCW FpvUserData LPVOID FdwShareMode DWORD FdwPreferredProtocols DWORD FlpstrRdr LPWSTR FnMaxRdr DWORD F__ccgo_pad3 [4]byte FlpstrCard LPWSTR FnMaxCard DWORD FdwActiveProtocol DWORD FhCardHandle SCARDHANDLE } type POPENCARDNAME_EXW = uintptr type LPOPENCARDNAME_EXW = uintptr type OPENCARDNAME_EX = OPENCARDNAME_EXA type POPENCARDNAME_EX = POPENCARDNAME_EXA type LPOPENCARDNAME_EX = LPOPENCARDNAME_EXA type OPENCARDNAMEA = struct { FdwStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhSCardContext SCARDCONTEXT FlpstrGroupNames LPSTR FnMaxGroupNames DWORD F__ccgo_pad2 [4]byte FlpstrCardNames LPSTR FnMaxCardNames DWORD F__ccgo_pad3 [4]byte FrgguidInterfaces LPCGUID FcguidInterfaces DWORD F__ccgo_pad4 [4]byte FlpstrRdr LPSTR FnMaxRdr DWORD F__ccgo_pad5 [4]byte FlpstrCard LPSTR FnMaxCard DWORD F__ccgo_pad6 [4]byte FlpstrTitle LPCSTR FdwFlags DWORD F__ccgo_pad7 [4]byte FpvUserData LPVOID FdwShareMode DWORD FdwPreferredProtocols DWORD FdwActiveProtocol DWORD F__ccgo_pad8 [4]byte FlpfnConnect LPOCNCONNPROCA FlpfnCheck LPOCNCHKPROC FlpfnDisconnect LPOCNDSCPROC FhCardHandle SCARDHANDLE } type POPENCARDNAMEA = uintptr type LPOPENCARDNAMEA = uintptr type OPENCARDNAMEW = struct { FdwStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhSCardContext SCARDCONTEXT FlpstrGroupNames LPWSTR FnMaxGroupNames DWORD F__ccgo_pad2 [4]byte FlpstrCardNames LPWSTR FnMaxCardNames DWORD F__ccgo_pad3 [4]byte FrgguidInterfaces LPCGUID FcguidInterfaces DWORD F__ccgo_pad4 [4]byte FlpstrRdr LPWSTR FnMaxRdr DWORD F__ccgo_pad5 [4]byte FlpstrCard LPWSTR FnMaxCard DWORD F__ccgo_pad6 [4]byte FlpstrTitle LPCWSTR FdwFlags DWORD F__ccgo_pad7 [4]byte FpvUserData LPVOID FdwShareMode DWORD FdwPreferredProtocols DWORD FdwActiveProtocol DWORD F__ccgo_pad8 [4]byte FlpfnConnect LPOCNCONNPROCW FlpfnCheck LPOCNCHKPROC FlpfnDisconnect LPOCNDSCPROC FhCardHandle SCARDHANDLE } type POPENCARDNAMEW = uintptr type LPOPENCARDNAMEW = uintptr type OPENCARDNAME = OPENCARDNAMEA type POPENCARDNAME = POPENCARDNAMEA type LPOPENCARDNAME = LPOPENCARDNAMEA type _PROPSHEETPAGEA = struct { FdwSize DWORD FdwFlags DWORD FhInstance HINSTANCE Fu struct{ FpszTemplate LPCSTR } Fu2 struct{ FhIcon HICON } FpszTitle LPCSTR FpfnDlgProc DLGPROC FlParam LPARAM FpfnCallback LPFNPSPCALLBACKA FpcRefParent uintptr FpszHeaderTitle LPCSTR FpszHeaderSubTitle LPCSTR FhActCtx HANDLE } type _PROPSHEETPAGEW = struct { FdwSize DWORD FdwFlags DWORD FhInstance HINSTANCE Fu struct{ FpszTemplate LPCWSTR } Fu2 struct{ FhIcon HICON } FpszTitle LPCWSTR FpfnDlgProc DLGPROC FlParam LPARAM FpfnCallback LPFNPSPCALLBACKW FpcRefParent uintptr FpszHeaderTitle LPCWSTR FpszHeaderSubTitle LPCWSTR FhActCtx HANDLE } type HPROPSHEETPAGE = uintptr type LPFNPSPCALLBACKA = uintptr type LPFNPSPCALLBACKW = uintptr type PROPSHEETPAGE_RESOURCE = LPCDLGTEMPLATE type _PROPSHEETPAGEA_V1 = struct { FdwSize DWORD FdwFlags DWORD FhInstance HINSTANCE Fu struct{ FpszTemplate LPCSTR } Fu2 struct{ FhIcon HICON } FpszTitle LPCSTR FpfnDlgProc DLGPROC FlParam LPARAM FpfnCallback LPFNPSPCALLBACKA FpcRefParent uintptr } type PROPSHEETPAGEA_V1 = _PROPSHEETPAGEA_V1 type LPPROPSHEETPAGEA_V1 = uintptr type LPCPROPSHEETPAGEA_V1 = uintptr type _PROPSHEETPAGEA_V2 = struct { FdwSize DWORD FdwFlags DWORD FhInstance HINSTANCE Fu struct{ FpszTemplate LPCSTR } Fu2 struct{ FhIcon HICON } FpszTitle LPCSTR FpfnDlgProc DLGPROC FlParam LPARAM FpfnCallback LPFNPSPCALLBACKA FpcRefParent uintptr FpszHeaderTitle LPCSTR FpszHeaderSubTitle LPCSTR } type PROPSHEETPAGEA_V2 = _PROPSHEETPAGEA_V2 type LPPROPSHEETPAGEA_V2 = uintptr type LPCPROPSHEETPAGEA_V2 = uintptr type PROPSHEETPAGEA_V3 = _PROPSHEETPAGEA type LPPROPSHEETPAGEA_V3 = uintptr type LPCPROPSHEETPAGEA_V3 = uintptr type _PROPSHEETPAGEW_V1 = struct { FdwSize DWORD FdwFlags DWORD FhInstance HINSTANCE Fu struct{ FpszTemplate LPCWSTR } Fu2 struct{ FhIcon HICON } FpszTitle LPCWSTR FpfnDlgProc DLGPROC FlParam LPARAM FpfnCallback LPFNPSPCALLBACKW FpcRefParent uintptr } type PROPSHEETPAGEW_V1 = _PROPSHEETPAGEW_V1 type LPPROPSHEETPAGEW_V1 = uintptr type LPCPROPSHEETPAGEW_V1 = uintptr type _PROPSHEETPAGEW_V2 = struct { FdwSize DWORD FdwFlags DWORD FhInstance HINSTANCE Fu struct{ FpszTemplate LPCWSTR } Fu2 struct{ FhIcon HICON } FpszTitle LPCWSTR FpfnDlgProc DLGPROC FlParam LPARAM FpfnCallback LPFNPSPCALLBACKW FpcRefParent uintptr FpszHeaderTitle LPCWSTR FpszHeaderSubTitle LPCWSTR } type PROPSHEETPAGEW_V2 = _PROPSHEETPAGEW_V2 type LPPROPSHEETPAGEW_V2 = uintptr type LPCPROPSHEETPAGEW_V2 = uintptr type PROPSHEETPAGEW_V3 = _PROPSHEETPAGEW type LPPROPSHEETPAGEW_V3 = uintptr type LPCPROPSHEETPAGEW_V3 = uintptr type PROPSHEETPAGEA_LATEST = PROPSHEETPAGEA_V3 type PROPSHEETPAGEW_LATEST = PROPSHEETPAGEW_V3 type LPPROPSHEETPAGEA_LATEST = LPPROPSHEETPAGEA_V3 type LPPROPSHEETPAGEW_LATEST = LPPROPSHEETPAGEW_V3 type LPCPROPSHEETPAGEA_LATEST = LPCPROPSHEETPAGEA_V3 type LPCPROPSHEETPAGEW_LATEST = LPCPROPSHEETPAGEW_V3 type PROPSHEETPAGEA = PROPSHEETPAGEA_V3 type PROPSHEETPAGEW = PROPSHEETPAGEW_V3 type LPPROPSHEETPAGEA = LPPROPSHEETPAGEA_V3 type LPPROPSHEETPAGEW = LPPROPSHEETPAGEW_V3 type LPCPROPSHEETPAGEA = LPCPROPSHEETPAGEA_V3 type LPCPROPSHEETPAGEW = LPCPROPSHEETPAGEW_V3 type PFNPROPSHEETCALLBACK = uintptr type _PROPSHEETHEADERA = struct { FdwSize DWORD FdwFlags DWORD FhwndParent HWND FhInstance HINSTANCE Fu struct{ FhIcon HICON } FpszCaption LPCSTR FnPages UINT F__ccgo_pad1 [4]byte Fu2 struct { F__ccgo_pad1 [0]uint64 FnStartPage UINT F__ccgo_pad2 [4]byte } Fu3 struct{ Fppsp LPCPROPSHEETPAGEA } FpfnCallback PFNPROPSHEETCALLBACK Fu4 struct{ FhbmWatermark HBITMAP } FhplWatermark HPALETTE Fu5 struct{ FhbmHeader HBITMAP } } type PROPSHEETHEADERA = _PROPSHEETHEADERA type LPPROPSHEETHEADERA = uintptr type LPCPROPSHEETHEADERA = uintptr type _PROPSHEETHEADERW = struct { FdwSize DWORD FdwFlags DWORD FhwndParent HWND FhInstance HINSTANCE Fu struct{ FhIcon HICON } FpszCaption LPCWSTR FnPages UINT F__ccgo_pad1 [4]byte Fu2 struct { F__ccgo_pad1 [0]uint64 FnStartPage UINT F__ccgo_pad2 [4]byte } Fu3 struct{ Fppsp LPCPROPSHEETPAGEW } FpfnCallback PFNPROPSHEETCALLBACK Fu4 struct{ FhbmWatermark HBITMAP } FhplWatermark HPALETTE Fu5 struct{ FhbmHeader HBITMAP } } type PROPSHEETHEADERW = _PROPSHEETHEADERW type LPPROPSHEETHEADERW = uintptr type LPCPROPSHEETHEADERW = uintptr type LPFNADDPROPSHEETPAGE = uintptr type LPFNADDPROPSHEETPAGES = uintptr type _PSHNOTIFY = struct { Fhdr NMHDR FlParam LPARAM } type PSHNOTIFY = _PSHNOTIFY type LPPSHNOTIFY = uintptr type _PRINTER_INFO_1A = struct { FFlags DWORD F__ccgo_pad1 [4]byte FpDescription LPSTR FpName LPSTR FpComment LPSTR } type PRINTER_INFO_1A = _PRINTER_INFO_1A type PPRINTER_INFO_1A = uintptr type LPPRINTER_INFO_1A = uintptr type _PRINTER_INFO_1W = struct { FFlags DWORD F__ccgo_pad1 [4]byte FpDescription LPWSTR FpName LPWSTR FpComment LPWSTR } type PRINTER_INFO_1W = _PRINTER_INFO_1W type PPRINTER_INFO_1W = uintptr type LPPRINTER_INFO_1W = uintptr type PRINTER_INFO_1 = PRINTER_INFO_1A type PPRINTER_INFO_1 = PPRINTER_INFO_1A type LPPRINTER_INFO_1 = LPPRINTER_INFO_1A type _PRINTER_INFO_2A = struct { FpServerName LPSTR FpPrinterName LPSTR FpShareName LPSTR FpPortName LPSTR FpDriverName LPSTR FpComment LPSTR FpLocation LPSTR FpDevMode LPDEVMODEA FpSepFile LPSTR FpPrintProcessor LPSTR FpDatatype LPSTR FpParameters LPSTR FpSecurityDescriptor PSECURITY_DESCRIPTOR FAttributes DWORD FPriority DWORD FDefaultPriority DWORD FStartTime DWORD FUntilTime DWORD FStatus DWORD FcJobs DWORD FAveragePPM DWORD } type PRINTER_INFO_2A = _PRINTER_INFO_2A type PPRINTER_INFO_2A = uintptr type LPPRINTER_INFO_2A = uintptr type _PRINTER_INFO_2W = struct { FpServerName LPWSTR FpPrinterName LPWSTR FpShareName LPWSTR FpPortName LPWSTR FpDriverName LPWSTR FpComment LPWSTR FpLocation LPWSTR FpDevMode LPDEVMODEW FpSepFile LPWSTR FpPrintProcessor LPWSTR FpDatatype LPWSTR FpParameters LPWSTR FpSecurityDescriptor PSECURITY_DESCRIPTOR FAttributes DWORD FPriority DWORD FDefaultPriority DWORD FStartTime DWORD FUntilTime DWORD FStatus DWORD FcJobs DWORD FAveragePPM DWORD } type PRINTER_INFO_2W = _PRINTER_INFO_2W type PPRINTER_INFO_2W = uintptr type LPPRINTER_INFO_2W = uintptr type PRINTER_INFO_2 = PRINTER_INFO_2A type PPRINTER_INFO_2 = PPRINTER_INFO_2A type LPPRINTER_INFO_2 = LPPRINTER_INFO_2A type _PRINTER_INFO_3 = struct{ FpSecurityDescriptor PSECURITY_DESCRIPTOR } type PRINTER_INFO_3 = _PRINTER_INFO_3 type PPRINTER_INFO_3 = uintptr type LPPRINTER_INFO_3 = uintptr type _PRINTER_INFO_4A = struct { FpPrinterName LPSTR FpServerName LPSTR FAttributes DWORD F__ccgo_pad1 [4]byte } type PRINTER_INFO_4A = _PRINTER_INFO_4A type PPRINTER_INFO_4A = uintptr type LPPRINTER_INFO_4A = uintptr type _PRINTER_INFO_4W = struct { FpPrinterName LPWSTR FpServerName LPWSTR FAttributes DWORD F__ccgo_pad1 [4]byte } type PRINTER_INFO_4W = _PRINTER_INFO_4W type PPRINTER_INFO_4W = uintptr type LPPRINTER_INFO_4W = uintptr type PRINTER_INFO_4 = PRINTER_INFO_4A type PPRINTER_INFO_4 = PPRINTER_INFO_4A type LPPRINTER_INFO_4 = LPPRINTER_INFO_4A type _PRINTER_INFO_5A = struct { FpPrinterName LPSTR FpPortName LPSTR FAttributes DWORD FDeviceNotSelectedTimeout DWORD FTransmissionRetryTimeout DWORD F__ccgo_pad1 [4]byte } type PRINTER_INFO_5A = _PRINTER_INFO_5A type PPRINTER_INFO_5A = uintptr type LPPRINTER_INFO_5A = uintptr type _PRINTER_INFO_5W = struct { FpPrinterName LPWSTR FpPortName LPWSTR FAttributes DWORD FDeviceNotSelectedTimeout DWORD FTransmissionRetryTimeout DWORD F__ccgo_pad1 [4]byte } type PRINTER_INFO_5W = _PRINTER_INFO_5W type PPRINTER_INFO_5W = uintptr type LPPRINTER_INFO_5W = uintptr type PRINTER_INFO_5 = PRINTER_INFO_5A type PPRINTER_INFO_5 = PPRINTER_INFO_5A type LPPRINTER_INFO_5 = LPPRINTER_INFO_5A type _PRINTER_INFO_6 = struct{ FdwStatus DWORD } type PRINTER_INFO_6 = _PRINTER_INFO_6 type PPRINTER_INFO_6 = uintptr type LPPRINTER_INFO_6 = uintptr type _PRINTER_INFO_7A = struct { FpszObjectGUID LPSTR FdwAction DWORD F__ccgo_pad1 [4]byte } type PRINTER_INFO_7A = _PRINTER_INFO_7A type PPRINTER_INFO_7A = uintptr type LPPRINTER_INFO_7A = uintptr type _PRINTER_INFO_7W = struct { FpszObjectGUID LPWSTR FdwAction DWORD F__ccgo_pad1 [4]byte } type PRINTER_INFO_7W = _PRINTER_INFO_7W type PPRINTER_INFO_7W = uintptr type LPPRINTER_INFO_7W = uintptr type PRINTER_INFO_7 = PRINTER_INFO_7A type PPRINTER_INFO_7 = PPRINTER_INFO_7A type LPPRINTER_INFO_7 = LPPRINTER_INFO_7A type _PRINTER_INFO_8A = struct{ FpDevMode LPDEVMODEA } type PRINTER_INFO_8A = _PRINTER_INFO_8A type PPRINTER_INFO_8A = uintptr type LPPRINTER_INFO_8A = uintptr type _PRINTER_INFO_8W = struct{ FpDevMode LPDEVMODEW } type PRINTER_INFO_8W = _PRINTER_INFO_8W type PPRINTER_INFO_8W = uintptr type LPPRINTER_INFO_8W = uintptr type PRINTER_INFO_8 = PRINTER_INFO_8A type PPRINTER_INFO_8 = PPRINTER_INFO_8A type LPPRINTER_INFO_8 = LPPRINTER_INFO_8A type _PRINTER_INFO_9A = struct{ FpDevMode LPDEVMODEA } type PRINTER_INFO_9A = _PRINTER_INFO_9A type PPRINTER_INFO_9A = uintptr type LPPRINTER_INFO_9A = uintptr type _PRINTER_INFO_9W = struct{ FpDevMode LPDEVMODEW } type PRINTER_INFO_9W = _PRINTER_INFO_9W type PPRINTER_INFO_9W = uintptr type LPPRINTER_INFO_9W = uintptr type PRINTER_INFO_9 = PRINTER_INFO_9A type PPRINTER_INFO_9 = PPRINTER_INFO_9A type LPPRINTER_INFO_9 = LPPRINTER_INFO_9A type _JOB_INFO_1A = struct { FJobId DWORD F__ccgo_pad1 [4]byte FpPrinterName LPSTR FpMachineName LPSTR FpUserName LPSTR FpDocument LPSTR FpDatatype LPSTR FpStatus LPSTR FStatus DWORD FPriority DWORD FPosition DWORD FTotalPages DWORD FPagesPrinted DWORD FSubmitted SYSTEMTIME F__ccgo_pad2 [4]byte } type JOB_INFO_1A = _JOB_INFO_1A type PJOB_INFO_1A = uintptr type LPJOB_INFO_1A = uintptr type _JOB_INFO_1W = struct { FJobId DWORD F__ccgo_pad1 [4]byte FpPrinterName LPWSTR FpMachineName LPWSTR FpUserName LPWSTR FpDocument LPWSTR FpDatatype LPWSTR FpStatus LPWSTR FStatus DWORD FPriority DWORD FPosition DWORD FTotalPages DWORD FPagesPrinted DWORD FSubmitted SYSTEMTIME F__ccgo_pad2 [4]byte } type JOB_INFO_1W = _JOB_INFO_1W type PJOB_INFO_1W = uintptr type LPJOB_INFO_1W = uintptr type JOB_INFO_1 = JOB_INFO_1A type PJOB_INFO_1 = PJOB_INFO_1A type LPJOB_INFO_1 = LPJOB_INFO_1A type _JOB_INFO_2A = struct { FJobId DWORD F__ccgo_pad1 [4]byte FpPrinterName LPSTR FpMachineName LPSTR FpUserName LPSTR FpDocument LPSTR FpNotifyName LPSTR FpDatatype LPSTR FpPrintProcessor LPSTR FpParameters LPSTR FpDriverName LPSTR FpDevMode LPDEVMODEA FpStatus LPSTR FpSecurityDescriptor PSECURITY_DESCRIPTOR FStatus DWORD FPriority DWORD FPosition DWORD FStartTime DWORD FUntilTime DWORD FTotalPages DWORD FSize DWORD FSubmitted SYSTEMTIME FTime DWORD FPagesPrinted DWORD F__ccgo_pad2 [4]byte } type JOB_INFO_2A = _JOB_INFO_2A type PJOB_INFO_2A = uintptr type LPJOB_INFO_2A = uintptr type _JOB_INFO_2W = struct { FJobId DWORD F__ccgo_pad1 [4]byte FpPrinterName LPWSTR FpMachineName LPWSTR FpUserName LPWSTR FpDocument LPWSTR FpNotifyName LPWSTR FpDatatype LPWSTR FpPrintProcessor LPWSTR FpParameters LPWSTR FpDriverName LPWSTR FpDevMode LPDEVMODEW FpStatus LPWSTR FpSecurityDescriptor PSECURITY_DESCRIPTOR FStatus DWORD FPriority DWORD FPosition DWORD FStartTime DWORD FUntilTime DWORD FTotalPages DWORD FSize DWORD FSubmitted SYSTEMTIME FTime DWORD FPagesPrinted DWORD F__ccgo_pad2 [4]byte } type JOB_INFO_2W = _JOB_INFO_2W type PJOB_INFO_2W = uintptr type LPJOB_INFO_2W = uintptr type JOB_INFO_2 = JOB_INFO_2A type PJOB_INFO_2 = PJOB_INFO_2A type LPJOB_INFO_2 = LPJOB_INFO_2A type _JOB_INFO_3 = struct { FJobId DWORD FNextJobId DWORD FReserved DWORD } type JOB_INFO_3 = _JOB_INFO_3 type PJOB_INFO_3 = uintptr type LPJOB_INFO_3 = uintptr type _ADDJOB_INFO_1A = struct { FPath LPSTR FJobId DWORD F__ccgo_pad1 [4]byte } type ADDJOB_INFO_1A = _ADDJOB_INFO_1A type PADDJOB_INFO_1A = uintptr type LPADDJOB_INFO_1A = uintptr type _ADDJOB_INFO_1W = struct { FPath LPWSTR FJobId DWORD F__ccgo_pad1 [4]byte } type ADDJOB_INFO_1W = _ADDJOB_INFO_1W type PADDJOB_INFO_1W = uintptr type LPADDJOB_INFO_1W = uintptr type ADDJOB_INFO_1 = ADDJOB_INFO_1A type PADDJOB_INFO_1 = PADDJOB_INFO_1A type LPADDJOB_INFO_1 = LPADDJOB_INFO_1A type _DRIVER_INFO_1A = struct{ FpName LPSTR } type DRIVER_INFO_1A = _DRIVER_INFO_1A type PDRIVER_INFO_1A = uintptr type LPDRIVER_INFO_1A = uintptr type _DRIVER_INFO_1W = struct{ FpName LPWSTR } type DRIVER_INFO_1W = _DRIVER_INFO_1W type PDRIVER_INFO_1W = uintptr type LPDRIVER_INFO_1W = uintptr type DRIVER_INFO_1 = DRIVER_INFO_1A type PDRIVER_INFO_1 = PDRIVER_INFO_1A type LPDRIVER_INFO_1 = LPDRIVER_INFO_1A type _DRIVER_INFO_2A = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPSTR FpEnvironment LPSTR FpDriverPath LPSTR FpDataFile LPSTR FpConfigFile LPSTR } type DRIVER_INFO_2A = _DRIVER_INFO_2A type PDRIVER_INFO_2A = uintptr type LPDRIVER_INFO_2A = uintptr type _DRIVER_INFO_2W = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPWSTR FpEnvironment LPWSTR FpDriverPath LPWSTR FpDataFile LPWSTR FpConfigFile LPWSTR } type DRIVER_INFO_2W = _DRIVER_INFO_2W type PDRIVER_INFO_2W = uintptr type LPDRIVER_INFO_2W = uintptr type DRIVER_INFO_2 = DRIVER_INFO_2A type PDRIVER_INFO_2 = PDRIVER_INFO_2A type LPDRIVER_INFO_2 = LPDRIVER_INFO_2A type _DRIVER_INFO_3A = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPSTR FpEnvironment LPSTR FpDriverPath LPSTR FpDataFile LPSTR FpConfigFile LPSTR FpHelpFile LPSTR FpDependentFiles LPSTR FpMonitorName LPSTR FpDefaultDataType LPSTR } type DRIVER_INFO_3A = _DRIVER_INFO_3A type PDRIVER_INFO_3A = uintptr type LPDRIVER_INFO_3A = uintptr type _DRIVER_INFO_3W = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPWSTR FpEnvironment LPWSTR FpDriverPath LPWSTR FpDataFile LPWSTR FpConfigFile LPWSTR FpHelpFile LPWSTR FpDependentFiles LPWSTR FpMonitorName LPWSTR FpDefaultDataType LPWSTR } type DRIVER_INFO_3W = _DRIVER_INFO_3W type PDRIVER_INFO_3W = uintptr type LPDRIVER_INFO_3W = uintptr type DRIVER_INFO_3 = DRIVER_INFO_3A type PDRIVER_INFO_3 = PDRIVER_INFO_3A type LPDRIVER_INFO_3 = LPDRIVER_INFO_3A type _DRIVER_INFO_4A = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPSTR FpEnvironment LPSTR FpDriverPath LPSTR FpDataFile LPSTR FpConfigFile LPSTR FpHelpFile LPSTR FpDependentFiles LPSTR FpMonitorName LPSTR FpDefaultDataType LPSTR FpszzPreviousNames LPSTR } type DRIVER_INFO_4A = _DRIVER_INFO_4A type PDRIVER_INFO_4A = uintptr type LPDRIVER_INFO_4A = uintptr type _DRIVER_INFO_4W = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPWSTR FpEnvironment LPWSTR FpDriverPath LPWSTR FpDataFile LPWSTR FpConfigFile LPWSTR FpHelpFile LPWSTR FpDependentFiles LPWSTR FpMonitorName LPWSTR FpDefaultDataType LPWSTR FpszzPreviousNames LPWSTR } type DRIVER_INFO_4W = _DRIVER_INFO_4W type PDRIVER_INFO_4W = uintptr type LPDRIVER_INFO_4W = uintptr type DRIVER_INFO_4 = DRIVER_INFO_4A type PDRIVER_INFO_4 = PDRIVER_INFO_4A type LPDRIVER_INFO_4 = LPDRIVER_INFO_4A type _DRIVER_INFO_5A = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPSTR FpEnvironment LPSTR FpDriverPath LPSTR FpDataFile LPSTR FpConfigFile LPSTR FdwDriverAttributes DWORD FdwConfigVersion DWORD FdwDriverVersion DWORD F__ccgo_pad2 [4]byte } type DRIVER_INFO_5A = _DRIVER_INFO_5A type PDRIVER_INFO_5A = uintptr type LPDRIVER_INFO_5A = uintptr type _DRIVER_INFO_5W = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPWSTR FpEnvironment LPWSTR FpDriverPath LPWSTR FpDataFile LPWSTR FpConfigFile LPWSTR FdwDriverAttributes DWORD FdwConfigVersion DWORD FdwDriverVersion DWORD F__ccgo_pad2 [4]byte } type DRIVER_INFO_5W = _DRIVER_INFO_5W type PDRIVER_INFO_5W = uintptr type LPDRIVER_INFO_5W = uintptr type DRIVER_INFO_5 = DRIVER_INFO_5A type PDRIVER_INFO_5 = PDRIVER_INFO_5A type LPDRIVER_INFO_5 = LPDRIVER_INFO_5A type _DRIVER_INFO_6A = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPSTR FpEnvironment LPSTR FpDriverPath LPSTR FpDataFile LPSTR FpConfigFile LPSTR FpHelpFile LPSTR FpDependentFiles LPSTR FpMonitorName LPSTR FpDefaultDataType LPSTR FpszzPreviousNames LPSTR FftDriverDate FILETIME FdwlDriverVersion DWORDLONG FpszMfgName LPSTR FpszOEMUrl LPSTR FpszHardwareID LPSTR FpszProvider LPSTR } type DRIVER_INFO_6A = _DRIVER_INFO_6A type PDRIVER_INFO_6A = uintptr type LPDRIVER_INFO_6A = uintptr type _DRIVER_INFO_6W = struct { FcVersion DWORD F__ccgo_pad1 [4]byte FpName LPWSTR FpEnvironment LPWSTR FpDriverPath LPWSTR FpDataFile LPWSTR FpConfigFile LPWSTR FpHelpFile LPWSTR FpDependentFiles LPWSTR FpMonitorName LPWSTR FpDefaultDataType LPWSTR FpszzPreviousNames LPWSTR FftDriverDate FILETIME FdwlDriverVersion DWORDLONG FpszMfgName LPWSTR FpszOEMUrl LPWSTR FpszHardwareID LPWSTR FpszProvider LPWSTR } type DRIVER_INFO_6W = _DRIVER_INFO_6W type PDRIVER_INFO_6W = uintptr type LPDRIVER_INFO_6W = uintptr type DRIVER_INFO_6 = DRIVER_INFO_6A type PDRIVER_INFO_6 = PDRIVER_INFO_6A type LPDRIVER_INFO_6 = LPDRIVER_INFO_6A type _DOC_INFO_1A = struct { FpDocName LPSTR FpOutputFile LPSTR FpDatatype LPSTR } type DOC_INFO_1A = _DOC_INFO_1A type PDOC_INFO_1A = uintptr type LPDOC_INFO_1A = uintptr type _DOC_INFO_1W = struct { FpDocName LPWSTR FpOutputFile LPWSTR FpDatatype LPWSTR } type DOC_INFO_1W = _DOC_INFO_1W type PDOC_INFO_1W = uintptr type LPDOC_INFO_1W = uintptr type DOC_INFO_1 = DOC_INFO_1A type PDOC_INFO_1 = PDOC_INFO_1A type LPDOC_INFO_1 = LPDOC_INFO_1A type _FORM_INFO_1A = struct { FFlags DWORD F__ccgo_pad1 [4]byte FpName LPSTR FSize SIZEL FImageableArea RECTL } type FORM_INFO_1A = _FORM_INFO_1A type PFORM_INFO_1A = uintptr type LPFORM_INFO_1A = uintptr type _FORM_INFO_1W = struct { FFlags DWORD F__ccgo_pad1 [4]byte FpName LPWSTR FSize SIZEL FImageableArea RECTL } type FORM_INFO_1W = _FORM_INFO_1W type PFORM_INFO_1W = uintptr type LPFORM_INFO_1W = uintptr type FORM_INFO_1 = FORM_INFO_1A type PFORM_INFO_1 = PFORM_INFO_1A type LPFORM_INFO_1 = LPFORM_INFO_1A type _DOC_INFO_2A = struct { FpDocName LPSTR FpOutputFile LPSTR FpDatatype LPSTR FdwMode DWORD FJobId DWORD } type DOC_INFO_2A = _DOC_INFO_2A type PDOC_INFO_2A = uintptr type LPDOC_INFO_2A = uintptr type _DOC_INFO_2W = struct { FpDocName LPWSTR FpOutputFile LPWSTR FpDatatype LPWSTR FdwMode DWORD FJobId DWORD } type DOC_INFO_2W = _DOC_INFO_2W type PDOC_INFO_2W = uintptr type LPDOC_INFO_2W = uintptr type DOC_INFO_2 = DOC_INFO_2A type PDOC_INFO_2 = PDOC_INFO_2A type LPDOC_INFO_2 = LPDOC_INFO_2A type _DOC_INFO_3A = struct { FpDocName LPSTR FpOutputFile LPSTR FpDatatype LPSTR FdwFlags DWORD F__ccgo_pad1 [4]byte } type DOC_INFO_3A = _DOC_INFO_3A type PDOC_INFO_3A = uintptr type LPDOC_INFO_3A = uintptr type _DOC_INFO_3W = struct { FpDocName LPWSTR FpOutputFile LPWSTR FpDatatype LPWSTR FdwFlags DWORD F__ccgo_pad1 [4]byte } type DOC_INFO_3W = _DOC_INFO_3W type PDOC_INFO_3W = uintptr type LPDOC_INFO_3W = uintptr type DOC_INFO_3 = DOC_INFO_3A type PDOC_INFO_3 = PDOC_INFO_3A type LPDOC_INFO_3 = LPDOC_INFO_3A type _PRINTPROCESSOR_INFO_1A = struct{ FpName LPSTR } type PRINTPROCESSOR_INFO_1A = _PRINTPROCESSOR_INFO_1A type PPRINTPROCESSOR_INFO_1A = uintptr type LPPRINTPROCESSOR_INFO_1A = uintptr type _PRINTPROCESSOR_INFO_1W = struct{ FpName LPWSTR } type PRINTPROCESSOR_INFO_1W = _PRINTPROCESSOR_INFO_1W type PPRINTPROCESSOR_INFO_1W = uintptr type LPPRINTPROCESSOR_INFO_1W = uintptr type PRINTPROCESSOR_INFO_1 = PRINTPROCESSOR_INFO_1A type PPRINTPROCESSOR_INFO_1 = PPRINTPROCESSOR_INFO_1A type LPPRINTPROCESSOR_INFO_1 = LPPRINTPROCESSOR_INFO_1A type _PRINTPROCESSOR_CAPS_1 = struct { FdwLevel DWORD FdwNupOptions DWORD FdwPageOrderFlags DWORD FdwNumberOfCopies DWORD } type PRINTPROCESSOR_CAPS_1 = _PRINTPROCESSOR_CAPS_1 type PPRINTPROCESSOR_CAPS_1 = uintptr type _PORT_INFO_1A = struct{ FpName LPSTR } type PORT_INFO_1A = _PORT_INFO_1A type PPORT_INFO_1A = uintptr type LPPORT_INFO_1A = uintptr type _PORT_INFO_1W = struct{ FpName LPWSTR } type PORT_INFO_1W = _PORT_INFO_1W type PPORT_INFO_1W = uintptr type LPPORT_INFO_1W = uintptr type PORT_INFO_1 = PORT_INFO_1A type PPORT_INFO_1 = PPORT_INFO_1A type LPPORT_INFO_1 = LPPORT_INFO_1A type _PORT_INFO_2A = struct { FpPortName LPSTR FpMonitorName LPSTR FpDescription LPSTR FfPortType DWORD FReserved DWORD } type PORT_INFO_2A = _PORT_INFO_2A type PPORT_INFO_2A = uintptr type LPPORT_INFO_2A = uintptr type _PORT_INFO_2W = struct { FpPortName LPWSTR FpMonitorName LPWSTR FpDescription LPWSTR FfPortType DWORD FReserved DWORD } type PORT_INFO_2W = _PORT_INFO_2W type PPORT_INFO_2W = uintptr type LPPORT_INFO_2W = uintptr type PORT_INFO_2 = PORT_INFO_2A type PPORT_INFO_2 = PPORT_INFO_2A type LPPORT_INFO_2 = LPPORT_INFO_2A type _PORT_INFO_3A = struct { FdwStatus DWORD F__ccgo_pad1 [4]byte FpszStatus LPSTR FdwSeverity DWORD F__ccgo_pad2 [4]byte } type PORT_INFO_3A = _PORT_INFO_3A type PPORT_INFO_3A = uintptr type LPPORT_INFO_3A = uintptr type _PORT_INFO_3W = struct { FdwStatus DWORD F__ccgo_pad1 [4]byte FpszStatus LPWSTR FdwSeverity DWORD F__ccgo_pad2 [4]byte } type PORT_INFO_3W = _PORT_INFO_3W type PPORT_INFO_3W = uintptr type LPPORT_INFO_3W = uintptr type PORT_INFO_3 = PORT_INFO_3A type PPORT_INFO_3 = PPORT_INFO_3A type LPPORT_INFO_3 = LPPORT_INFO_3A type _MONITOR_INFO_1A = struct{ FpName LPSTR } type MONITOR_INFO_1A = _MONITOR_INFO_1A type PMONITOR_INFO_1A = uintptr type LPMONITOR_INFO_1A = uintptr type _MONITOR_INFO_1W = struct{ FpName LPWSTR } type MONITOR_INFO_1W = _MONITOR_INFO_1W type PMONITOR_INFO_1W = uintptr type LPMONITOR_INFO_1W = uintptr type MONITOR_INFO_1 = MONITOR_INFO_1A type PMONITOR_INFO_1 = PMONITOR_INFO_1A type LPMONITOR_INFO_1 = LPMONITOR_INFO_1A type _MONITOR_INFO_2A = struct { FpName LPSTR FpEnvironment LPSTR FpDLLName LPSTR } type MONITOR_INFO_2A = _MONITOR_INFO_2A type PMONITOR_INFO_2A = uintptr type LPMONITOR_INFO_2A = uintptr type _MONITOR_INFO_2W = struct { FpName LPWSTR FpEnvironment LPWSTR FpDLLName LPWSTR } type MONITOR_INFO_2W = _MONITOR_INFO_2W type PMONITOR_INFO_2W = uintptr type LPMONITOR_INFO_2W = uintptr type MONITOR_INFO_2 = MONITOR_INFO_2A type PMONITOR_INFO_2 = PMONITOR_INFO_2A type LPMONITOR_INFO_2 = LPMONITOR_INFO_2A type _DATATYPES_INFO_1A = struct{ FpName LPSTR } type DATATYPES_INFO_1A = _DATATYPES_INFO_1A type PDATATYPES_INFO_1A = uintptr type LPDATATYPES_INFO_1A = uintptr type _DATATYPES_INFO_1W = struct{ FpName LPWSTR } type DATATYPES_INFO_1W = _DATATYPES_INFO_1W type PDATATYPES_INFO_1W = uintptr type LPDATATYPES_INFO_1W = uintptr type DATATYPES_INFO_1 = DATATYPES_INFO_1A type PDATATYPES_INFO_1 = PDATATYPES_INFO_1A type LPDATATYPES_INFO_1 = LPDATATYPES_INFO_1A type _PRINTER_DEFAULTSA = struct { FpDatatype LPSTR FpDevMode LPDEVMODEA FDesiredAccess ACCESS_MASK F__ccgo_pad1 [4]byte } type PRINTER_DEFAULTSA = _PRINTER_DEFAULTSA type PPRINTER_DEFAULTSA = uintptr type LPPRINTER_DEFAULTSA = uintptr type _PRINTER_DEFAULTSW = struct { FpDatatype LPWSTR FpDevMode LPDEVMODEW FDesiredAccess ACCESS_MASK F__ccgo_pad1 [4]byte } type PRINTER_DEFAULTSW = _PRINTER_DEFAULTSW type PPRINTER_DEFAULTSW = uintptr type LPPRINTER_DEFAULTSW = uintptr type PRINTER_DEFAULTS = PRINTER_DEFAULTSA type PPRINTER_DEFAULTS = PPRINTER_DEFAULTSA type LPPRINTER_DEFAULTS = LPPRINTER_DEFAULTSA type _PRINTER_ENUM_VALUESA = struct { FpValueName LPSTR FcbValueName DWORD FdwType DWORD FpData LPBYTE FcbData DWORD F__ccgo_pad1 [4]byte } type PRINTER_ENUM_VALUESA = _PRINTER_ENUM_VALUESA type PPRINTER_ENUM_VALUESA = uintptr type LPPRINTER_ENUM_VALUESA = uintptr type _PRINTER_ENUM_VALUESW = struct { FpValueName LPWSTR FcbValueName DWORD FdwType DWORD FpData LPBYTE FcbData DWORD F__ccgo_pad1 [4]byte } type PRINTER_ENUM_VALUESW = _PRINTER_ENUM_VALUESW type PPRINTER_ENUM_VALUESW = uintptr type LPPRINTER_ENUM_VALUESW = uintptr type PRINTER_ENUM_VALUES = PRINTER_ENUM_VALUESA type PPRINTER_ENUM_VALUES = PPRINTER_ENUM_VALUESA type LPPRINTER_ENUM_VALUES = LPPRINTER_ENUM_VALUESA type _PRINTER_NOTIFY_OPTIONS_TYPE = struct { FType WORD FReserved0 WORD FReserved1 DWORD FReserved2 DWORD FCount DWORD FpFields PWORD } type PRINTER_NOTIFY_OPTIONS_TYPE = _PRINTER_NOTIFY_OPTIONS_TYPE type PPRINTER_NOTIFY_OPTIONS_TYPE = uintptr type LPPRINTER_NOTIFY_OPTIONS_TYPE = uintptr type _PRINTER_NOTIFY_OPTIONS = struct { FVersion DWORD FFlags DWORD FCount DWORD F__ccgo_pad1 [4]byte FpTypes PPRINTER_NOTIFY_OPTIONS_TYPE } type PRINTER_NOTIFY_OPTIONS = _PRINTER_NOTIFY_OPTIONS type PPRINTER_NOTIFY_OPTIONS = uintptr type LPPRINTER_NOTIFY_OPTIONS = uintptr type _PRINTER_NOTIFY_INFO_DATA = struct { FType WORD FField WORD FReserved DWORD FId DWORD F__ccgo_pad1 [4]byte FNotifyData struct { F__ccgo_pad1 [0]uint64 FadwData [2]DWORD F__ccgo_pad2 [8]byte } } type PRINTER_NOTIFY_INFO_DATA = _PRINTER_NOTIFY_INFO_DATA type PPRINTER_NOTIFY_INFO_DATA = uintptr type LPPRINTER_NOTIFY_INFO_DATA = uintptr type _PRINTER_NOTIFY_INFO = struct { FVersion DWORD FFlags DWORD FCount DWORD F__ccgo_pad1 [4]byte FaData [1]PRINTER_NOTIFY_INFO_DATA } type PRINTER_NOTIFY_INFO = _PRINTER_NOTIFY_INFO type PPRINTER_NOTIFY_INFO = uintptr type LPPRINTER_NOTIFY_INFO = uintptr type _BINARY_CONTAINER = struct { FcbBuf DWORD F__ccgo_pad1 [4]byte FpData LPBYTE } type BINARY_CONTAINER = _BINARY_CONTAINER type PBINARY_CONTAINER = uintptr type _BIDI_DATA = struct { FdwBidiType DWORD F__ccgo_pad1 [4]byte Fu struct { F__ccgo_pad1 [0]uint64 FbData WINBOOL F__ccgo_pad2 [12]byte } } type BIDI_DATA = _BIDI_DATA type PBIDI_DATA = uintptr type LPBIDI_DATA = uintptr type _BIDI_REQUEST_DATA = struct { FdwReqNumber DWORD F__ccgo_pad1 [4]byte FpSchema LPWSTR Fdata BIDI_DATA } type BIDI_REQUEST_DATA = _BIDI_REQUEST_DATA type PBIDI_REQUEST_DATA = uintptr type LPBIDI_REQUEST_DATA = uintptr type _BIDI_REQUEST_CONTAINER = struct { FVersion DWORD FFlags DWORD FCount DWORD F__ccgo_pad1 [4]byte FaData [1]BIDI_REQUEST_DATA } type BIDI_REQUEST_CONTAINER = _BIDI_REQUEST_CONTAINER type PBIDI_REQUEST_CONTAINER = uintptr type LPBIDI_REQUEST_CONTAINER = uintptr type _BIDI_RESPONSE_DATA = struct { FdwResult DWORD FdwReqNumber DWORD FpSchema LPWSTR Fdata BIDI_DATA } type BIDI_RESPONSE_DATA = _BIDI_RESPONSE_DATA type PBIDI_RESPONSE_DATA = uintptr type LPBIDI_RESPONSE_DATA = uintptr type _BIDI_RESPONSE_CONTAINER = struct { FVersion DWORD FFlags DWORD FCount DWORD F__ccgo_pad1 [4]byte FaData [1]BIDI_RESPONSE_DATA } type BIDI_RESPONSE_CONTAINER = _BIDI_RESPONSE_CONTAINER type PBIDI_RESPONSE_CONTAINER = uintptr type LPBIDI_RESPONSE_CONTAINER = uintptr type BIDI_TYPE = uint32 type _PROVIDOR_INFO_1A = struct { FpName LPSTR FpEnvironment LPSTR FpDLLName LPSTR } type PROVIDOR_INFO_1A = _PROVIDOR_INFO_1A type PPROVIDOR_INFO_1A = uintptr type LPPROVIDOR_INFO_1A = uintptr type _PROVIDOR_INFO_1W = struct { FpName LPWSTR FpEnvironment LPWSTR FpDLLName LPWSTR } type PROVIDOR_INFO_1W = _PROVIDOR_INFO_1W type PPROVIDOR_INFO_1W = uintptr type LPPROVIDOR_INFO_1W = uintptr type PROVIDOR_INFO_1 = PROVIDOR_INFO_1A type PPROVIDOR_INFO_1 = PPROVIDOR_INFO_1A type LPPROVIDOR_INFO_1 = LPPROVIDOR_INFO_1A type _PROVIDOR_INFO_2A = struct{ FpOrder LPSTR } type PROVIDOR_INFO_2A = _PROVIDOR_INFO_2A type PPROVIDOR_INFO_2A = uintptr type LPPROVIDOR_INFO_2A = uintptr type _PROVIDOR_INFO_2W = struct{ FpOrder LPWSTR } type PROVIDOR_INFO_2W = _PROVIDOR_INFO_2W type PPROVIDOR_INFO_2W = uintptr type LPPROVIDOR_INFO_2W = uintptr type PROVIDOR_INFO_2 = PROVIDOR_INFO_2A type PPROVIDOR_INFO_2 = PPROVIDOR_INFO_2A type LPPROVIDOR_INFO_2 = LPPROVIDOR_INFO_2A type LPOFNHOOKPROC = uintptr type tagOFN_NT4A = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FlpstrFilter LPCSTR FlpstrCustomFilter LPSTR FnMaxCustFilter DWORD FnFilterIndex DWORD FlpstrFile LPSTR FnMaxFile DWORD F__ccgo_pad2 [4]byte FlpstrFileTitle LPSTR FnMaxFileTitle DWORD F__ccgo_pad3 [4]byte FlpstrInitialDir LPCSTR FlpstrTitle LPCSTR FFlags DWORD FnFileOffset WORD FnFileExtension WORD FlpstrDefExt LPCSTR FlCustData LPARAM FlpfnHook LPOFNHOOKPROC FlpTemplateName LPCSTR } type OPENFILENAME_NT4A = tagOFN_NT4A type LPOPENFILENAME_NT4A = uintptr type tagOFN_NT4W = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FlpstrFilter LPCWSTR FlpstrCustomFilter LPWSTR FnMaxCustFilter DWORD FnFilterIndex DWORD FlpstrFile LPWSTR FnMaxFile DWORD F__ccgo_pad2 [4]byte FlpstrFileTitle LPWSTR FnMaxFileTitle DWORD F__ccgo_pad3 [4]byte FlpstrInitialDir LPCWSTR FlpstrTitle LPCWSTR FFlags DWORD FnFileOffset WORD FnFileExtension WORD FlpstrDefExt LPCWSTR FlCustData LPARAM FlpfnHook LPOFNHOOKPROC FlpTemplateName LPCWSTR } type OPENFILENAME_NT4W = tagOFN_NT4W type LPOPENFILENAME_NT4W = uintptr type OPENFILENAME_NT4 = OPENFILENAME_NT4A type LPOPENFILENAME_NT4 = LPOPENFILENAME_NT4A type tagOFNA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FlpstrFilter LPCSTR FlpstrCustomFilter LPSTR FnMaxCustFilter DWORD FnFilterIndex DWORD FlpstrFile LPSTR FnMaxFile DWORD F__ccgo_pad2 [4]byte FlpstrFileTitle LPSTR FnMaxFileTitle DWORD F__ccgo_pad3 [4]byte FlpstrInitialDir LPCSTR FlpstrTitle LPCSTR FFlags DWORD FnFileOffset WORD FnFileExtension WORD FlpstrDefExt LPCSTR FlCustData LPARAM FlpfnHook LPOFNHOOKPROC FlpTemplateName LPCSTR FpvReserved uintptr FdwReserved DWORD FFlagsEx DWORD } type OPENFILENAMEA = tagOFNA type LPOPENFILENAMEA = uintptr type tagOFNW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FlpstrFilter LPCWSTR FlpstrCustomFilter LPWSTR FnMaxCustFilter DWORD FnFilterIndex DWORD FlpstrFile LPWSTR FnMaxFile DWORD F__ccgo_pad2 [4]byte FlpstrFileTitle LPWSTR FnMaxFileTitle DWORD F__ccgo_pad3 [4]byte FlpstrInitialDir LPCWSTR FlpstrTitle LPCWSTR FFlags DWORD FnFileOffset WORD FnFileExtension WORD FlpstrDefExt LPCWSTR FlCustData LPARAM FlpfnHook LPOFNHOOKPROC FlpTemplateName LPCWSTR FpvReserved uintptr FdwReserved DWORD FFlagsEx DWORD } type OPENFILENAMEW = tagOFNW type LPOPENFILENAMEW = uintptr type OPENFILENAME = OPENFILENAMEA type LPOPENFILENAME = LPOPENFILENAMEA type LPCCHOOKPROC = uintptr type _OFNOTIFYA = struct { Fhdr NMHDR FlpOFN LPOPENFILENAMEA FpszFile LPSTR } type OFNOTIFYA = _OFNOTIFYA type LPOFNOTIFYA = uintptr type _OFNOTIFYW = struct { Fhdr NMHDR FlpOFN LPOPENFILENAMEW FpszFile LPWSTR } type OFNOTIFYW = _OFNOTIFYW type LPOFNOTIFYW = uintptr type OFNOTIFY = OFNOTIFYA type LPOFNOTIFY = LPOFNOTIFYA type _OFNOTIFYEXA = struct { Fhdr NMHDR FlpOFN LPOPENFILENAMEA Fpsf LPVOID Fpidl LPVOID } type OFNOTIFYEXA = _OFNOTIFYEXA type LPOFNOTIFYEXA = uintptr type _OFNOTIFYEXW = struct { Fhdr NMHDR FlpOFN LPOPENFILENAMEW Fpsf LPVOID Fpidl LPVOID } type OFNOTIFYEXW = _OFNOTIFYEXW type LPOFNOTIFYEXW = uintptr type OFNOTIFYEX = OFNOTIFYEXA type LPOFNOTIFYEX = LPOFNOTIFYEXA type tagCHOOSECOLORA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HWND FrgbResult COLORREF F__ccgo_pad2 [4]byte FlpCustColors uintptr FFlags DWORD F__ccgo_pad3 [4]byte FlCustData LPARAM FlpfnHook LPCCHOOKPROC FlpTemplateName LPCSTR } type CHOOSECOLORA = tagCHOOSECOLORA type LPCHOOSECOLORA = uintptr type tagCHOOSECOLORW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HWND FrgbResult COLORREF F__ccgo_pad2 [4]byte FlpCustColors uintptr FFlags DWORD F__ccgo_pad3 [4]byte FlCustData LPARAM FlpfnHook LPCCHOOKPROC FlpTemplateName LPCWSTR } type CHOOSECOLORW = tagCHOOSECOLORW type LPCHOOSECOLORW = uintptr type CHOOSECOLOR = CHOOSECOLORA type LPCHOOSECOLOR = LPCHOOSECOLORA type LPFRHOOKPROC = uintptr type tagFINDREPLACEA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FFlags DWORD F__ccgo_pad2 [4]byte FlpstrFindWhat LPSTR FlpstrReplaceWith LPSTR FwFindWhatLen WORD FwReplaceWithLen WORD F__ccgo_pad3 [4]byte FlCustData LPARAM FlpfnHook LPFRHOOKPROC FlpTemplateName LPCSTR } type FINDREPLACEA = tagFINDREPLACEA type LPFINDREPLACEA = uintptr type tagFINDREPLACEW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhInstance HINSTANCE FFlags DWORD F__ccgo_pad2 [4]byte FlpstrFindWhat LPWSTR FlpstrReplaceWith LPWSTR FwFindWhatLen WORD FwReplaceWithLen WORD F__ccgo_pad3 [4]byte FlCustData LPARAM FlpfnHook LPFRHOOKPROC FlpTemplateName LPCWSTR } type FINDREPLACEW = tagFINDREPLACEW type LPFINDREPLACEW = uintptr type FINDREPLACE = FINDREPLACEA type LPFINDREPLACE = LPFINDREPLACEA type LPCFHOOKPROC = uintptr type tagCHOOSEFONTA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDC HDC FlpLogFont LPLOGFONTA FiPointSize INT FFlags DWORD FrgbColors COLORREF F__ccgo_pad2 [4]byte FlCustData LPARAM FlpfnHook LPCFHOOKPROC FlpTemplateName LPCSTR FhInstance HINSTANCE FlpszStyle LPSTR FnFontType WORD F___MISSING_ALIGNMENT__ WORD FnSizeMin INT FnSizeMax INT F__ccgo_pad3 [4]byte } type CHOOSEFONTA = tagCHOOSEFONTA type LPCHOOSEFONTA = uintptr type tagCHOOSEFONTW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDC HDC FlpLogFont LPLOGFONTW FiPointSize INT FFlags DWORD FrgbColors COLORREF F__ccgo_pad2 [4]byte FlCustData LPARAM FlpfnHook LPCFHOOKPROC FlpTemplateName LPCWSTR FhInstance HINSTANCE FlpszStyle LPWSTR FnFontType WORD F___MISSING_ALIGNMENT__ WORD FnSizeMin INT FnSizeMax INT F__ccgo_pad3 [4]byte } type CHOOSEFONTW = tagCHOOSEFONTW type LPCHOOSEFONTW = uintptr type CHOOSEFONT = CHOOSEFONTA type LPCHOOSEFONT = LPCHOOSEFONTA type LPPRINTHOOKPROC = uintptr type LPSETUPHOOKPROC = uintptr type tagPDA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDevMode HGLOBAL FhDevNames HGLOBAL FhDC HDC FFlags DWORD FnFromPage WORD FnToPage WORD FnMinPage WORD FnMaxPage WORD FnCopies WORD F__ccgo_pad2 [2]byte FhInstance HINSTANCE FlCustData LPARAM FlpfnPrintHook LPPRINTHOOKPROC FlpfnSetupHook LPSETUPHOOKPROC FlpPrintTemplateName LPCSTR FlpSetupTemplateName LPCSTR FhPrintTemplate HGLOBAL FhSetupTemplate HGLOBAL } type PRINTDLGA = tagPDA type LPPRINTDLGA = uintptr type tagPDW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDevMode HGLOBAL FhDevNames HGLOBAL FhDC HDC FFlags DWORD FnFromPage WORD FnToPage WORD FnMinPage WORD FnMaxPage WORD FnCopies WORD F__ccgo_pad2 [2]byte FhInstance HINSTANCE FlCustData LPARAM FlpfnPrintHook LPPRINTHOOKPROC FlpfnSetupHook LPSETUPHOOKPROC FlpPrintTemplateName LPCWSTR FlpSetupTemplateName LPCWSTR FhPrintTemplate HGLOBAL FhSetupTemplate HGLOBAL } type PRINTDLGW = tagPDW type LPPRINTDLGW = uintptr type PRINTDLG = PRINTDLGA type LPPRINTDLG = LPPRINTDLGA type IPrintDialogCallback1 = struct{ FlpVtbl uintptr } type IPrintDialogCallbackVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FInitDone uintptr FSelectionChange uintptr FHandleMessage uintptr } type IPrintDialogCallback = IPrintDialogCallback1 type IPrintDialogCallbackVtbl = IPrintDialogCallbackVtbl1 type IPrintDialogServices1 = struct{ FlpVtbl uintptr } type IPrintDialogServicesVtbl1 = struct { FQueryInterface uintptr FAddRef uintptr FRelease uintptr FGetCurrentDevMode uintptr FGetCurrentPrinterName uintptr FGetCurrentPortName uintptr } type IPrintDialogServices = IPrintDialogServices1 type IPrintDialogServicesVtbl = IPrintDialogServicesVtbl1 type tagPRINTPAGERANGE = struct { FnFromPage DWORD FnToPage DWORD } type PRINTPAGERANGE = tagPRINTPAGERANGE type LPPRINTPAGERANGE = uintptr type tagPDEXA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDevMode HGLOBAL FhDevNames HGLOBAL FhDC HDC FFlags DWORD FFlags2 DWORD FExclusionFlags DWORD FnPageRanges DWORD FnMaxPageRanges DWORD F__ccgo_pad2 [4]byte FlpPageRanges LPPRINTPAGERANGE FnMinPage DWORD FnMaxPage DWORD FnCopies DWORD F__ccgo_pad3 [4]byte FhInstance HINSTANCE FlpPrintTemplateName LPCSTR FlpCallback LPUNKNOWN FnPropertyPages DWORD F__ccgo_pad4 [4]byte FlphPropertyPages uintptr FnStartPage DWORD FdwResultAction DWORD } type PRINTDLGEXA = tagPDEXA type LPPRINTDLGEXA = uintptr type tagPDEXW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDevMode HGLOBAL FhDevNames HGLOBAL FhDC HDC FFlags DWORD FFlags2 DWORD FExclusionFlags DWORD FnPageRanges DWORD FnMaxPageRanges DWORD F__ccgo_pad2 [4]byte FlpPageRanges LPPRINTPAGERANGE FnMinPage DWORD FnMaxPage DWORD FnCopies DWORD F__ccgo_pad3 [4]byte FhInstance HINSTANCE FlpPrintTemplateName LPCWSTR FlpCallback LPUNKNOWN FnPropertyPages DWORD F__ccgo_pad4 [4]byte FlphPropertyPages uintptr FnStartPage DWORD FdwResultAction DWORD } type PRINTDLGEXW = tagPDEXW type LPPRINTDLGEXW = uintptr type PRINTDLGEX = PRINTDLGEXA type LPPRINTDLGEX = LPPRINTDLGEXA type tagDEVNAMES = struct { FwDriverOffset WORD FwDeviceOffset WORD FwOutputOffset WORD FwDefault WORD } type DEVNAMES = tagDEVNAMES type LPDEVNAMES = uintptr type LPPAGEPAINTHOOK = uintptr type LPPAGESETUPHOOK = uintptr type tagPSDA = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDevMode HGLOBAL FhDevNames HGLOBAL FFlags DWORD FptPaperSize POINT FrtMinMargin RECT FrtMargin RECT F__ccgo_pad2 [4]byte FhInstance HINSTANCE FlCustData LPARAM FlpfnPageSetupHook LPPAGESETUPHOOK FlpfnPagePaintHook LPPAGEPAINTHOOK FlpPageSetupTemplateName LPCSTR FhPageSetupTemplate HGLOBAL } type PAGESETUPDLGA = tagPSDA type LPPAGESETUPDLGA = uintptr type tagPSDW = struct { FlStructSize DWORD F__ccgo_pad1 [4]byte FhwndOwner HWND FhDevMode HGLOBAL FhDevNames HGLOBAL FFlags DWORD FptPaperSize POINT FrtMinMargin RECT FrtMargin RECT F__ccgo_pad2 [4]byte FhInstance HINSTANCE FlCustData LPARAM FlpfnPageSetupHook LPPAGESETUPHOOK FlpfnPagePaintHook LPPAGEPAINTHOOK FlpPageSetupTemplateName LPCWSTR FhPageSetupTemplate HGLOBAL } type PAGESETUPDLGW = tagPSDW type LPPAGESETUPDLGW = uintptr type PAGESETUPDLG = PAGESETUPDLGA type LPPAGESETUPDLG = LPPAGESETUPDLGA type PUWSTR_C = uintptr type _SERVICE_DESCRIPTIONA = struct{ FlpDescription LPSTR } type SERVICE_DESCRIPTIONA = _SERVICE_DESCRIPTIONA type LPSERVICE_DESCRIPTIONA = uintptr type _SERVICE_DESCRIPTIONW = struct{ FlpDescription LPWSTR } type SERVICE_DESCRIPTIONW = _SERVICE_DESCRIPTIONW type LPSERVICE_DESCRIPTIONW = uintptr type SERVICE_DESCRIPTION = SERVICE_DESCRIPTIONA type LPSERVICE_DESCRIPTION = LPSERVICE_DESCRIPTIONA type SC_ACTION_TYPE = uint32 type _SC_ACTION = struct { FType SC_ACTION_TYPE FDelay DWORD } type SC_ACTION = _SC_ACTION type LPSC_ACTION = uintptr type _SERVICE_FAILURE_ACTIONSA = struct { FdwResetPeriod DWORD F__ccgo_pad1 [4]byte FlpRebootMsg LPSTR FlpCommand LPSTR FcActions DWORD F__ccgo_pad2 [4]byte FlpsaActions uintptr } type SERVICE_FAILURE_ACTIONSA = _SERVICE_FAILURE_ACTIONSA type LPSERVICE_FAILURE_ACTIONSA = uintptr type _SERVICE_FAILURE_ACTIONSW = struct { FdwResetPeriod DWORD F__ccgo_pad1 [4]byte FlpRebootMsg LPWSTR FlpCommand LPWSTR FcActions DWORD F__ccgo_pad2 [4]byte FlpsaActions uintptr } type SERVICE_FAILURE_ACTIONSW = _SERVICE_FAILURE_ACTIONSW type LPSERVICE_FAILURE_ACTIONSW = uintptr type SERVICE_FAILURE_ACTIONS = SERVICE_FAILURE_ACTIONSA type LPSERVICE_FAILURE_ACTIONS = LPSERVICE_FAILURE_ACTIONSA type SC_HANDLE__ = struct{ Funused int32 } type SC_HANDLE = uintptr type LPSC_HANDLE = uintptr type SERVICE_STATUS_HANDLE__ = struct{ Funused int32 } type SERVICE_STATUS_HANDLE = uintptr type SC_STATUS_TYPE = uint32 type SC_ENUM_TYPE = uint32 type _SERVICE_STATUS = struct { FdwServiceType DWORD FdwCurrentState DWORD FdwControlsAccepted DWORD FdwWin32ExitCode DWORD FdwServiceSpecificExitCode DWORD FdwCheckPoint DWORD FdwWaitHint DWORD } type SERVICE_STATUS = _SERVICE_STATUS type LPSERVICE_STATUS = uintptr type _SERVICE_STATUS_PROCESS = struct { FdwServiceType DWORD FdwCurrentState DWORD FdwControlsAccepted DWORD FdwWin32ExitCode DWORD FdwServiceSpecificExitCode DWORD FdwCheckPoint DWORD FdwWaitHint DWORD FdwProcessId DWORD FdwServiceFlags DWORD } type SERVICE_STATUS_PROCESS = _SERVICE_STATUS_PROCESS type LPSERVICE_STATUS_PROCESS = uintptr type _ENUM_SERVICE_STATUSA = struct { FlpServiceName LPSTR FlpDisplayName LPSTR FServiceStatus SERVICE_STATUS F__ccgo_pad1 [4]byte } type ENUM_SERVICE_STATUSA = _ENUM_SERVICE_STATUSA type LPENUM_SERVICE_STATUSA = uintptr type _ENUM_SERVICE_STATUSW = struct { FlpServiceName LPWSTR FlpDisplayName LPWSTR FServiceStatus SERVICE_STATUS F__ccgo_pad1 [4]byte } type ENUM_SERVICE_STATUSW = _ENUM_SERVICE_STATUSW type LPENUM_SERVICE_STATUSW = uintptr type ENUM_SERVICE_STATUS = ENUM_SERVICE_STATUSA type LPENUM_SERVICE_STATUS = LPENUM_SERVICE_STATUSA type _ENUM_SERVICE_STATUS_PROCESSA = struct { FlpServiceName LPSTR FlpDisplayName LPSTR FServiceStatusProcess SERVICE_STATUS_PROCESS F__ccgo_pad1 [4]byte } type ENUM_SERVICE_STATUS_PROCESSA = _ENUM_SERVICE_STATUS_PROCESSA type LPENUM_SERVICE_STATUS_PROCESSA = uintptr type _ENUM_SERVICE_STATUS_PROCESSW = struct { FlpServiceName LPWSTR FlpDisplayName LPWSTR FServiceStatusProcess SERVICE_STATUS_PROCESS F__ccgo_pad1 [4]byte } type ENUM_SERVICE_STATUS_PROCESSW = _ENUM_SERVICE_STATUS_PROCESSW type LPENUM_SERVICE_STATUS_PROCESSW = uintptr type ENUM_SERVICE_STATUS_PROCESS = ENUM_SERVICE_STATUS_PROCESSA type LPENUM_SERVICE_STATUS_PROCESS = LPENUM_SERVICE_STATUS_PROCESSA type SC_LOCK = LPVOID type _QUERY_SERVICE_LOCK_STATUSA = struct { FfIsLocked DWORD F__ccgo_pad1 [4]byte FlpLockOwner LPSTR FdwLockDuration DWORD F__ccgo_pad2 [4]byte } type QUERY_SERVICE_LOCK_STATUSA = _QUERY_SERVICE_LOCK_STATUSA type LPQUERY_SERVICE_LOCK_STATUSA = uintptr type _QUERY_SERVICE_LOCK_STATUSW = struct { FfIsLocked DWORD F__ccgo_pad1 [4]byte FlpLockOwner LPWSTR FdwLockDuration DWORD F__ccgo_pad2 [4]byte } type QUERY_SERVICE_LOCK_STATUSW = _QUERY_SERVICE_LOCK_STATUSW type LPQUERY_SERVICE_LOCK_STATUSW = uintptr type QUERY_SERVICE_LOCK_STATUS = QUERY_SERVICE_LOCK_STATUSA type LPQUERY_SERVICE_LOCK_STATUS = LPQUERY_SERVICE_LOCK_STATUSA type _QUERY_SERVICE_CONFIGA = struct { FdwServiceType DWORD FdwStartType DWORD FdwErrorControl DWORD F__ccgo_pad1 [4]byte FlpBinaryPathName LPSTR FlpLoadOrderGroup LPSTR FdwTagId DWORD F__ccgo_pad2 [4]byte FlpDependencies LPSTR FlpServiceStartName LPSTR FlpDisplayName LPSTR } type QUERY_SERVICE_CONFIGA = _QUERY_SERVICE_CONFIGA type LPQUERY_SERVICE_CONFIGA = uintptr type _QUERY_SERVICE_CONFIGW = struct { FdwServiceType DWORD FdwStartType DWORD FdwErrorControl DWORD F__ccgo_pad1 [4]byte FlpBinaryPathName LPWSTR FlpLoadOrderGroup LPWSTR FdwTagId DWORD F__ccgo_pad2 [4]byte FlpDependencies LPWSTR FlpServiceStartName LPWSTR FlpDisplayName LPWSTR } type QUERY_SERVICE_CONFIGW = _QUERY_SERVICE_CONFIGW type LPQUERY_SERVICE_CONFIGW = uintptr type QUERY_SERVICE_CONFIG = QUERY_SERVICE_CONFIGA type LPQUERY_SERVICE_CONFIG = LPQUERY_SERVICE_CONFIGA type LPSERVICE_MAIN_FUNCTIONW = uintptr type LPSERVICE_MAIN_FUNCTIONA = uintptr type _SERVICE_TABLE_ENTRYA = struct { FlpServiceName LPSTR FlpServiceProc LPSERVICE_MAIN_FUNCTIONA } type SERVICE_TABLE_ENTRYA = _SERVICE_TABLE_ENTRYA type LPSERVICE_TABLE_ENTRYA = uintptr type _SERVICE_TABLE_ENTRYW = struct { FlpServiceName LPWSTR FlpServiceProc LPSERVICE_MAIN_FUNCTIONW } type SERVICE_TABLE_ENTRYW = _SERVICE_TABLE_ENTRYW type LPSERVICE_TABLE_ENTRYW = uintptr type SERVICE_TABLE_ENTRY = SERVICE_TABLE_ENTRYA type LPSERVICE_TABLE_ENTRY = LPSERVICE_TABLE_ENTRYA type LPHANDLER_FUNCTION = uintptr type LPHANDLER_FUNCTION_EX = uintptr type _MODEMDEVCAPS = struct { FdwActualSize DWORD FdwRequiredSize DWORD FdwDevSpecificOffset DWORD FdwDevSpecificSize DWORD FdwModemProviderVersion DWORD FdwModemManufacturerOffset DWORD FdwModemManufacturerSize DWORD FdwModemModelOffset DWORD FdwModemModelSize DWORD FdwModemVersionOffset DWORD FdwModemVersionSize DWORD FdwDialOptions DWORD FdwCallSetupFailTimer DWORD FdwInactivityTimeout DWORD FdwSpeakerVolume DWORD FdwSpeakerMode DWORD FdwModemOptions DWORD FdwMaxDTERate DWORD FdwMaxDCERate DWORD FabVariablePortion [1]BYTE F__ccgo_pad1 [3]byte } type MODEMDEVCAPS = _MODEMDEVCAPS type PMODEMDEVCAPS = uintptr type LPMODEMDEVCAPS = uintptr type _MODEMSETTINGS = struct { FdwActualSize DWORD FdwRequiredSize DWORD FdwDevSpecificOffset DWORD FdwDevSpecificSize DWORD FdwCallSetupFailTimer DWORD FdwInactivityTimeout DWORD FdwSpeakerVolume DWORD FdwSpeakerMode DWORD FdwPreferredModemOptions DWORD FdwNegotiatedModemOptions DWORD FdwNegotiatedDCERate DWORD FabVariablePortion [1]BYTE F__ccgo_pad1 [3]byte } type MODEMSETTINGS = _MODEMSETTINGS type PMODEMSETTINGS = uintptr type LPMODEMSETTINGS = uintptr type HIMC__ = struct{ Funused int32 } type HIMC = uintptr type HIMCC__ = struct{ Funused int32 } type HIMCC = uintptr type LPHKL = uintptr type tagCOMPOSITIONFORM = struct { FdwStyle DWORD FptCurrentPos POINT FrcArea RECT } type COMPOSITIONFORM = tagCOMPOSITIONFORM type PCOMPOSITIONFORM = uintptr type NPCOMPOSITIONFORM = uintptr type LPCOMPOSITIONFORM = uintptr type tagCANDIDATEFORM = struct { FdwIndex DWORD FdwStyle DWORD FptCurrentPos POINT FrcArea RECT } type CANDIDATEFORM = tagCANDIDATEFORM type PCANDIDATEFORM = uintptr type NPCANDIDATEFORM = uintptr type LPCANDIDATEFORM = uintptr type tagCANDIDATELIST = struct { FdwSize DWORD FdwStyle DWORD FdwCount DWORD FdwSelection DWORD FdwPageStart DWORD FdwPageSize DWORD FdwOffset [1]DWORD } type CANDIDATELIST = tagCANDIDATELIST type PCANDIDATELIST = uintptr type NPCANDIDATELIST = uintptr type LPCANDIDATELIST = uintptr type tagREGISTERWORDA = struct { FlpReading LPSTR FlpWord LPSTR } type REGISTERWORDA = tagREGISTERWORDA type PREGISTERWORDA = uintptr type NPREGISTERWORDA = uintptr type LPREGISTERWORDA = uintptr type tagREGISTERWORDW = struct { FlpReading LPWSTR FlpWord LPWSTR } type REGISTERWORDW = tagREGISTERWORDW type PREGISTERWORDW = uintptr type NPREGISTERWORDW = uintptr type LPREGISTERWORDW = uintptr type REGISTERWORD = REGISTERWORDA type PREGISTERWORD = PREGISTERWORDA type NPREGISTERWORD = NPREGISTERWORDA type LPREGISTERWORD = LPREGISTERWORDA type tagRECONVERTSTRING = struct { FdwSize DWORD FdwVersion DWORD FdwStrLen DWORD FdwStrOffset DWORD FdwCompStrLen DWORD FdwCompStrOffset DWORD FdwTargetStrLen DWORD FdwTargetStrOffset DWORD } type RECONVERTSTRING = tagRECONVERTSTRING type PRECONVERTSTRING = uintptr type NPRECONVERTSTRING = uintptr type LPRECONVERTSTRING = uintptr type tagSTYLEBUFA = struct { FdwStyle DWORD FszDescription [32]CHAR } type STYLEBUFA = tagSTYLEBUFA type PSTYLEBUFA = uintptr type NPSTYLEBUFA = uintptr type LPSTYLEBUFA = uintptr type tagSTYLEBUFW = struct { FdwStyle DWORD FszDescription [32]WCHAR } type STYLEBUFW = tagSTYLEBUFW type PSTYLEBUFW = uintptr type NPSTYLEBUFW = uintptr type LPSTYLEBUFW = uintptr type STYLEBUF = STYLEBUFA type PSTYLEBUF = PSTYLEBUFA type NPSTYLEBUF = NPSTYLEBUFA type LPSTYLEBUF = LPSTYLEBUFA type tagIMEMENUITEMINFOA = struct { FcbSize UINT FfType UINT FfState UINT FwID UINT FhbmpChecked HBITMAP FhbmpUnchecked HBITMAP FdwItemData DWORD FszString [80]CHAR F__ccgo_pad1 [4]byte FhbmpItem HBITMAP } type IMEMENUITEMINFOA = tagIMEMENUITEMINFOA type PIMEMENUITEMINFOA = uintptr type NPIMEMENUITEMINFOA = uintptr type LPIMEMENUITEMINFOA = uintptr type tagIMEMENUITEMINFOW = struct { FcbSize UINT FfType UINT FfState UINT FwID UINT FhbmpChecked HBITMAP FhbmpUnchecked HBITMAP FdwItemData DWORD FszString [80]WCHAR F__ccgo_pad1 [4]byte FhbmpItem HBITMAP } type IMEMENUITEMINFOW = tagIMEMENUITEMINFOW type PIMEMENUITEMINFOW = uintptr type NPIMEMENUITEMINFOW = uintptr type LPIMEMENUITEMINFOW = uintptr type IMEMENUITEMINFO = IMEMENUITEMINFOA type PIMEMENUITEMINFO = PIMEMENUITEMINFOA type NPIMEMENUITEMINFO = NPIMEMENUITEMINFOA type LPIMEMENUITEMINFO = LPIMEMENUITEMINFOA type tagIMECHARPOSITION = struct { FdwSize DWORD FdwCharPos DWORD Fpt POINT FcLineHeight UINT FrcDocument RECT } type IMECHARPOSITION = tagIMECHARPOSITION type PIMECHARPOSITION = uintptr type NPIMECHARPOSITION = uintptr type LPIMECHARPOSITION = uintptr type IMCENUMPROC = uintptr type REGISTERWORDENUMPROCA = uintptr type REGISTERWORDENUMPROCW = uintptr // Attempt to release up to n bytes of non-essential memory currently // held by SQLite. An example of non-essential memory is memory used to // cache database pages that are not currently in use. func Xsqlite3_release_memory(tls *libc.TLS, n int32) int32 { return Xsqlite3PcacheReleaseMemory(tls, n) } // State information local to the memory allocation subsystem. type Mem0Global = struct { Fmutex uintptr FalarmThreshold Sqlite3_int64 FhardLimit Sqlite3_int64 FnearlyFull int32 F__ccgo_pad1 [4]byte } var mem0 = Mem0Global{} // Return the memory allocator mutex. sqlite3_status() needs it. func Xsqlite3MallocMutex(tls *libc.TLS) uintptr { return mem0.Fmutex } // Deprecated external interface. It used to set an alarm callback // that was invoked when memory usage grew too large. Now it is a // no-op. func Xsqlite3_memory_alarm(tls *libc.TLS, xCallback uintptr, pArg uintptr, iThreshold Sqlite3_int64) int32 { _ = xCallback _ = pArg _ = iThreshold return SQLITE_OK } // Set the soft heap-size limit for the library. An argument of // zero disables the limit. A negative argument is a no-op used to // obtain the return value. // // The return value is the value of the heap limit just before this // interface was called. // // If the hard heap limit is enabled, then the soft heap limit cannot // be disabled nor raised above the hard heap limit. func Xsqlite3_soft_heap_limit64(tls *libc.TLS, n Sqlite3_int64) Sqlite3_int64 { var priorLimit Sqlite3_int64 var excess Sqlite3_int64 var nUsed Sqlite3_int64 var rc int32 = Xsqlite3_initialize(tls) if rc != 0 { return int64(-1) } Xsqlite3_mutex_enter(tls, mem0.Fmutex) priorLimit = mem0.FalarmThreshold if n < int64(0) { Xsqlite3_mutex_leave(tls, mem0.Fmutex) return priorLimit } if mem0.FhardLimit > int64(0) && (n > mem0.FhardLimit || n == int64(0)) { n = mem0.FhardLimit } mem0.FalarmThreshold = n nUsed = Xsqlite3StatusValue(tls, SQLITE_STATUS_MEMORY_USED) libc.AtomicStoreNInt32(uintptr(unsafe.Pointer(&mem0))+24, libc.Bool32(n > int64(0) && n <= nUsed), 0) Xsqlite3_mutex_leave(tls, mem0.Fmutex) excess = Xsqlite3_memory_used(tls) - n if excess > int64(0) { Xsqlite3_release_memory(tls, int32(excess&int64(0x7fffffff))) } return priorLimit } func Xsqlite3_soft_heap_limit(tls *libc.TLS, n int32) { if n < 0 { n = 0 } Xsqlite3_soft_heap_limit64(tls, int64(n)) } // Set the hard heap-size limit for the library. An argument of zero // disables the hard heap limit. A negative argument is a no-op used // to obtain the return value without affecting the hard heap limit. // // The return value is the value of the hard heap limit just prior to // calling this interface. // // Setting the hard heap limit will also activate the soft heap limit // and constrain the soft heap limit to be no more than the hard heap // limit. func Xsqlite3_hard_heap_limit64(tls *libc.TLS, n Sqlite3_int64) Sqlite3_int64 { var priorLimit Sqlite3_int64 var rc int32 = Xsqlite3_initialize(tls) if rc != 0 { return int64(-1) } Xsqlite3_mutex_enter(tls, mem0.Fmutex) priorLimit = mem0.FhardLimit if n >= int64(0) { mem0.FhardLimit = n if n < mem0.FalarmThreshold || mem0.FalarmThreshold == int64(0) { mem0.FalarmThreshold = n } } Xsqlite3_mutex_leave(tls, mem0.Fmutex) return priorLimit } // Initialize the memory allocation subsystem. func Xsqlite3MallocInit(tls *libc.TLS) int32 { var rc int32 if Xsqlite3Config.Fm.FxMalloc == uintptr(0) { Xsqlite3MemSetDefault(tls) } mem0.Fmutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MEM) if Xsqlite3Config.FpPage == uintptr(0) || Xsqlite3Config.FszPage < 512 || Xsqlite3Config.FnPage <= 0 { Xsqlite3Config.FpPage = uintptr(0) Xsqlite3Config.FszPage = 0 } rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxInit})).f(tls, Xsqlite3Config.Fm.FpAppData) if rc != SQLITE_OK { libc.Xmemset(tls, uintptr(unsafe.Pointer(&mem0)), 0, uint64(unsafe.Sizeof(mem0))) } return rc } // Return true if the heap is currently under memory pressure - in other // words if the amount of heap used is close to the limit set by // sqlite3_soft_heap_limit(). func Xsqlite3HeapNearlyFull(tls *libc.TLS) int32 { return libc.AtomicLoadNInt32(uintptr(unsafe.Pointer(&mem0))+24, 0) } // Deinitialize the memory allocation subsystem. func Xsqlite3MallocEnd(tls *libc.TLS) { if Xsqlite3Config.Fm.FxShutdown != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxShutdown})).f(tls, Xsqlite3Config.Fm.FpAppData) } libc.Xmemset(tls, uintptr(unsafe.Pointer(&mem0)), 0, uint64(unsafe.Sizeof(mem0))) } // Return the amount of memory currently checked out. func Xsqlite3_memory_used(tls *libc.TLS) Sqlite3_int64 { bp := tls.Alloc(16) defer tls.Free(16) Xsqlite3_status64(tls, SQLITE_STATUS_MEMORY_USED, bp, bp+8, 0) return *(*Sqlite3_int64)(unsafe.Pointer(bp)) } // Return the maximum amount of memory that has ever been // checked out since either the beginning of this process // or since the most recent reset. func Xsqlite3_memory_highwater(tls *libc.TLS, resetFlag int32) Sqlite3_int64 { bp := tls.Alloc(16) defer tls.Free(16) Xsqlite3_status64(tls, SQLITE_STATUS_MEMORY_USED, bp, bp+8, resetFlag) return *(*Sqlite3_int64)(unsafe.Pointer(bp + 8)) } func sqlite3MallocAlarm(tls *libc.TLS, nByte int32) { if mem0.FalarmThreshold <= int64(0) { return } Xsqlite3_mutex_leave(tls, mem0.Fmutex) Xsqlite3_release_memory(tls, nByte) Xsqlite3_mutex_enter(tls, mem0.Fmutex) } func mallocWithAlarm(tls *libc.TLS, n int32, pp uintptr) { var p uintptr var nFull int32 nFull = (*struct{ f func(*libc.TLS, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxRoundup})).f(tls, n) Xsqlite3StatusHighwater(tls, SQLITE_STATUS_MALLOC_SIZE, n) if mem0.FalarmThreshold > int64(0) { var nUsed Sqlite3_int64 = Xsqlite3StatusValue(tls, SQLITE_STATUS_MEMORY_USED) if nUsed >= mem0.FalarmThreshold-Sqlite3_int64(nFull) { libc.AtomicStoreNInt32(uintptr(unsafe.Pointer(&mem0))+24, int32(1), 0) sqlite3MallocAlarm(tls, nFull) if mem0.FhardLimit != 0 { nUsed = Xsqlite3StatusValue(tls, SQLITE_STATUS_MEMORY_USED) if nUsed >= mem0.FhardLimit-Sqlite3_int64(nFull) { *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) return } } } else { libc.AtomicStoreNInt32(uintptr(unsafe.Pointer(&mem0))+24, int32(0), 0) } } p = (*struct { f func(*libc.TLS, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxMalloc})).f(tls, nFull) if p == uintptr(0) && mem0.FalarmThreshold > int64(0) { sqlite3MallocAlarm(tls, nFull) p = (*struct { f func(*libc.TLS, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxMalloc})).f(tls, nFull) } if p != 0 { nFull = Xsqlite3MallocSize(tls, p) Xsqlite3StatusUp(tls, SQLITE_STATUS_MEMORY_USED, nFull) Xsqlite3StatusUp(tls, SQLITE_STATUS_MALLOC_COUNT, 1) } *(*uintptr)(unsafe.Pointer(pp)) = p } // Allocate memory. This routine is like sqlite3_malloc() except that it // assumes the memory subsystem has already been initialized. func Xsqlite3Malloc(tls *libc.TLS, n U64) uintptr { bp := tls.Alloc(8) defer tls.Free(8) if n == uint64(0) || n > uint64(SQLITE_MAX_ALLOCATION_SIZE) { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) } else if Xsqlite3Config.FbMemstat != 0 { Xsqlite3_mutex_enter(tls, mem0.Fmutex) mallocWithAlarm(tls, int32(n), bp) Xsqlite3_mutex_leave(tls, mem0.Fmutex) } else { *(*uintptr)(unsafe.Pointer(bp)) = (*struct { f func(*libc.TLS, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxMalloc})).f(tls, int32(n)) } return *(*uintptr)(unsafe.Pointer(bp)) } // This version of the memory allocation is for use by the application. // First make sure the memory subsystem is initialized, then do the // allocation. func Xsqlite3_malloc(tls *libc.TLS, n int32) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } if n <= 0 { return uintptr(0) } return Xsqlite3Malloc(tls, uint64(n)) } func Xsqlite3_malloc64(tls *libc.TLS, n Sqlite3_uint64) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return Xsqlite3Malloc(tls, n) } func isLookaside(tls *libc.TLS, db uintptr, p uintptr) int32 { return libc.Bool32(Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart) && Uptr(p) < Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpTrueEnd)) } // Return the size of a memory allocation previously obtained from // sqlite3Malloc() or sqlite3_malloc(). func Xsqlite3MallocSize(tls *libc.TLS, p uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxSize})).f(tls, p) } func lookasideMallocSize(tls *libc.TLS, db uintptr, p uintptr) int32 { if p < (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpMiddle { return int32((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue) } return LOOKASIDE_SMALL } func Xsqlite3DbMallocSize(tls *libc.TLS, db uintptr, p uintptr) int32 { if db != 0 { if Uptr(p) < Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpTrueEnd) { if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpMiddle) { return LOOKASIDE_SMALL } if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart) { return int32((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue) } } } return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxSize})).f(tls, p) } func Xsqlite3_msize(tls *libc.TLS, p uintptr) Sqlite3_uint64 { if p != 0 { return uint64((*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxSize})).f(tls, p)) } return uint64(0) } // Free memory previously obtained from sqlite3Malloc(). func Xsqlite3_free(tls *libc.TLS, p uintptr) { if p == uintptr(0) { return } if Xsqlite3Config.FbMemstat != 0 { Xsqlite3_mutex_enter(tls, mem0.Fmutex) Xsqlite3StatusDown(tls, SQLITE_STATUS_MEMORY_USED, Xsqlite3MallocSize(tls, p)) Xsqlite3StatusDown(tls, SQLITE_STATUS_MALLOC_COUNT, 1) (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxFree})).f(tls, p) Xsqlite3_mutex_leave(tls, mem0.Fmutex) } else { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxFree})).f(tls, p) } } func measureAllocationSize(tls *libc.TLS, db uintptr, p uintptr) { *(*int32)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed)) += Xsqlite3DbMallocSize(tls, db, p) } // Free memory that might be associated with a particular database // connection. Calling sqlite3DbFree(D,X) for X==0 is a harmless no-op. // The sqlite3DbFreeNN(D,X) version requires that X be non-NULL. func Xsqlite3DbFreeNN(tls *libc.TLS, db uintptr, p uintptr) { if db != 0 { if Uptr(p) < Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd) { if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpMiddle) { var pBuf uintptr = p (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree = pBuf return } if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart) { var pBuf uintptr = p (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree = pBuf return } } if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed != 0 { measureAllocationSize(tls, db, p) return } } Xsqlite3_free(tls, p) } func Xsqlite3DbNNFreeNN(tls *libc.TLS, db uintptr, p uintptr) { if Uptr(p) < Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd) { if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpMiddle) { var pBuf uintptr = p (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree = pBuf return } if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart) { var pBuf uintptr = p (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree = pBuf return } } if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed != 0 { measureAllocationSize(tls, db, p) return } Xsqlite3_free(tls, p) } func Xsqlite3DbFree(tls *libc.TLS, db uintptr, p uintptr) { if p != 0 { Xsqlite3DbFreeNN(tls, db, p) } } // Change the size of an existing memory allocation func Xsqlite3Realloc(tls *libc.TLS, pOld uintptr, nBytes U64) uintptr { var nOld int32 var nNew int32 var nDiff int32 var pNew uintptr if pOld == uintptr(0) { return Xsqlite3Malloc(tls, nBytes) } if nBytes == uint64(0) { Xsqlite3_free(tls, pOld) return uintptr(0) } if nBytes >= uint64(0x7fffff00) { return uintptr(0) } nOld = Xsqlite3MallocSize(tls, pOld) nNew = (*struct{ f func(*libc.TLS, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxRoundup})).f(tls, int32(nBytes)) if nOld == nNew { pNew = pOld } else if Xsqlite3Config.FbMemstat != 0 { var nUsed Sqlite3_int64 Xsqlite3_mutex_enter(tls, mem0.Fmutex) Xsqlite3StatusHighwater(tls, SQLITE_STATUS_MALLOC_SIZE, int32(nBytes)) nDiff = nNew - nOld if nDiff > 0 && libc.AssignInt64(&nUsed, Xsqlite3StatusValue(tls, SQLITE_STATUS_MEMORY_USED)) >= mem0.FalarmThreshold-Sqlite3_int64(nDiff) { sqlite3MallocAlarm(tls, nDiff) if mem0.FhardLimit > int64(0) && nUsed >= mem0.FhardLimit-Sqlite3_int64(nDiff) { Xsqlite3_mutex_leave(tls, mem0.Fmutex) return uintptr(0) } } pNew = (*struct { f func(*libc.TLS, uintptr, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxRealloc})).f(tls, pOld, nNew) if pNew == uintptr(0) && mem0.FalarmThreshold > int64(0) { sqlite3MallocAlarm(tls, int32(nBytes)) pNew = (*struct { f func(*libc.TLS, uintptr, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxRealloc})).f(tls, pOld, nNew) } if pNew != 0 { nNew = Xsqlite3MallocSize(tls, pNew) Xsqlite3StatusUp(tls, SQLITE_STATUS_MEMORY_USED, nNew-nOld) } Xsqlite3_mutex_leave(tls, mem0.Fmutex) } else { pNew = (*struct { f func(*libc.TLS, uintptr, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fm.FxRealloc})).f(tls, pOld, nNew) } return pNew } // The public interface to sqlite3Realloc. Make sure that the memory // subsystem is initialized prior to invoking sqliteRealloc. func Xsqlite3_realloc(tls *libc.TLS, pOld uintptr, n int32) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } if n < 0 { n = 0 } return Xsqlite3Realloc(tls, pOld, uint64(n)) } func Xsqlite3_realloc64(tls *libc.TLS, pOld uintptr, n Sqlite3_uint64) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return Xsqlite3Realloc(tls, pOld, n) } // Allocate and zero memory. func Xsqlite3MallocZero(tls *libc.TLS, n U64) uintptr { var p uintptr = Xsqlite3Malloc(tls, n) if p != 0 { libc.Xmemset(tls, p, 0, n) } return p } // Allocate and zero memory. If the allocation fails, make // the mallocFailed flag in the connection pointer. func Xsqlite3DbMallocZero(tls *libc.TLS, db uintptr, n U64) uintptr { var p uintptr p = Xsqlite3DbMallocRaw(tls, db, n) if p != 0 { libc.Xmemset(tls, p, 0, n) } return p } func dbMallocRawFinish(tls *libc.TLS, db uintptr, n U64) uintptr { var p uintptr p = Xsqlite3Malloc(tls, n) if !(p != 0) { Xsqlite3OomFault(tls, db) } return p } // Allocate memory, either lookaside (if possible) or heap. // If the allocation fails, set the mallocFailed flag in // the connection pointer. // // If db!=0 and db->mallocFailed is true (indicating a prior malloc // failure on the same database connection) then always return 0. // Hence for a particular database connection, once malloc starts // failing, it fails consistently until mallocFailed is reset. // This is an important assumption. There are many places in the // code that do things like this: // // int *a = (int*)sqlite3DbMallocRaw(db, 100); // int *b = (int*)sqlite3DbMallocRaw(db, 200); // if( b ) a[10] = 9; // // In other words, if a subsequent malloc (ex: "b") worked, it is assumed // that all prior mallocs (ex: "a") worked too. // // The sqlite3MallocRawNN() variant guarantees that the "db" parameter is // not a NULL pointer. func Xsqlite3DbMallocRaw(tls *libc.TLS, db uintptr, n U64) uintptr { var p uintptr if db != 0 { return Xsqlite3DbMallocRawNN(tls, db, n) } p = Xsqlite3Malloc(tls, n) return p } func Xsqlite3DbMallocRawNN(tls *libc.TLS, db uintptr, n U64) uintptr { var pBuf uintptr if n > U64((*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz) { if !(int32((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable) != 0) { *(*U32)(unsafe.Pointer(db + 440 + 16 + 1*4))++ } else if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return uintptr(0) } return dbMallocRawFinish(tls, db, n) } if n <= uint64(LOOKASIDE_SMALL) { if libc.AssignUintptr(&pBuf, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree) != uintptr(0) { (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree = (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext *(*U32)(unsafe.Pointer(db + 440 + 16))++ return pBuf } else if libc.AssignUintptr(&pBuf, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit) != uintptr(0) { (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit = (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext *(*U32)(unsafe.Pointer(db + 440 + 16))++ return pBuf } } if libc.AssignUintptr(&pBuf, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree) != uintptr(0) { (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree = (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext *(*U32)(unsafe.Pointer(db + 440 + 16))++ return pBuf } else if libc.AssignUintptr(&pBuf, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit) != uintptr(0) { (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit = (*LookasideSlot)(unsafe.Pointer(pBuf)).FpNext *(*U32)(unsafe.Pointer(db + 440 + 16))++ return pBuf } else { *(*U32)(unsafe.Pointer(db + 440 + 16 + 2*4))++ } return dbMallocRawFinish(tls, db, n) } // Resize the block of memory pointed to by p to n bytes. If the // resize fails, set the mallocFailed flag in the connection object. func Xsqlite3DbRealloc(tls *libc.TLS, db uintptr, p uintptr, n U64) uintptr { if p == uintptr(0) { return Xsqlite3DbMallocRawNN(tls, db, n) } if Uptr(p) < Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd) { if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpMiddle) { if n <= uint64(LOOKASIDE_SMALL) { return p } } else if Uptr(p) >= Uptr((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart) { if n <= U64((*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue) { return p } } } return dbReallocFinish(tls, db, p, n) } func dbReallocFinish(tls *libc.TLS, db uintptr, p uintptr, n U64) uintptr { var pNew uintptr = uintptr(0) if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 { if isLookaside(tls, db, p) != 0 { pNew = Xsqlite3DbMallocRawNN(tls, db, n) if pNew != 0 { libc.Xmemcpy(tls, pNew, p, uint64(lookasideMallocSize(tls, db, p))) Xsqlite3DbFree(tls, db, p) } } else { pNew = Xsqlite3Realloc(tls, p, n) if !(pNew != 0) { Xsqlite3OomFault(tls, db) } } } return pNew } // Attempt to reallocate p. If the reallocation fails, then free p // and set the mallocFailed flag in the database connection. func Xsqlite3DbReallocOrFree(tls *libc.TLS, db uintptr, p uintptr, n U64) uintptr { var pNew uintptr pNew = Xsqlite3DbRealloc(tls, db, p, n) if !(pNew != 0) { Xsqlite3DbFree(tls, db, p) } return pNew } // Make a copy of a string in memory obtained from sqliteMalloc(). These // functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This // is because when memory debugging is turned on, these two functions are // called via macros that record the current file and line number in the // ThreadData structure. func Xsqlite3DbStrDup(tls *libc.TLS, db uintptr, z uintptr) uintptr { var zNew uintptr var n Size_t if z == uintptr(0) { return uintptr(0) } n = libc.Xstrlen(tls, z) + uint64(1) zNew = Xsqlite3DbMallocRaw(tls, db, n) if zNew != 0 { libc.Xmemcpy(tls, zNew, z, n) } return zNew } func Xsqlite3DbStrNDup(tls *libc.TLS, db uintptr, z uintptr, n U64) uintptr { var zNew uintptr if z != 0 { zNew = Xsqlite3DbMallocRawNN(tls, db, n+uint64(1)) } else { zNew = uintptr(0) } if zNew != 0 { libc.Xmemcpy(tls, zNew, z, n) *(*int8)(unsafe.Pointer(zNew + uintptr(n))) = int8(0) } return zNew } // The text between zStart and zEnd represents a phrase within a larger // SQL statement. Make a copy of this phrase in space obtained form // sqlite3DbMalloc(). Omit leading and trailing whitespace. func Xsqlite3DbSpanDup(tls *libc.TLS, db uintptr, zStart uintptr, zEnd uintptr) uintptr { var n int32 for int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zStart)))])&0x01 != 0 { zStart++ } n = int32((int64(zEnd) - int64(zStart)) / 1) for int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zStart + uintptr(n-1))))])&0x01 != 0 { n-- } return Xsqlite3DbStrNDup(tls, db, zStart, uint64(n)) } // Free any prior content in *pz and replace it with a copy of zNew. func Xsqlite3SetString(tls *libc.TLS, pz uintptr, db uintptr, zNew uintptr) { var z uintptr = Xsqlite3DbStrDup(tls, db, zNew) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(pz))) *(*uintptr)(unsafe.Pointer(pz)) = z } // Call this routine to record the fact that an OOM (out-of-memory) error // has happened. This routine will set db->mallocFailed, and also // temporarily disable the lookaside memory allocator and interrupt // any running VDBEs. // // Always return a NULL pointer so that this routine can be invoked using // // return sqlite3OomFault(db); // // and thereby avoid unnecessary stack frame allocations for the overwhelmingly // common case where no OOM occurs. func Xsqlite3OomFault(tls *libc.TLS, db uintptr) uintptr { if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 && int32((*Sqlite3)(unsafe.Pointer(db)).FbBenignMalloc) == 0 { (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed = U8(1) if (*Sqlite3)(unsafe.Pointer(db)).FnVdbeExec > 0 { libc.AtomicStoreNInt32(db+432, int32(1), 0) } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) if (*Sqlite3)(unsafe.Pointer(db)).FpParse != 0 { var pParse uintptr Xsqlite3ErrorMsg(tls, (*Sqlite3)(unsafe.Pointer(db)).FpParse, ts+1480, 0) (*Parse)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FpParse)).Frc = SQLITE_NOMEM for pParse = (*Parse)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FpParse)).FpOuterParse; pParse != 0; pParse = (*Parse)(unsafe.Pointer(pParse)).FpOuterParse { (*Parse)(unsafe.Pointer(pParse)).FnErr++ (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } } } return uintptr(0) } // This routine reactivates the memory allocator and clears the // db->mallocFailed flag as necessary. // // The memory allocator is not restarted if there are running // VDBEs. func Xsqlite3OomClear(tls *libc.TLS, db uintptr) { if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 && (*Sqlite3)(unsafe.Pointer(db)).FnVdbeExec == 0 { (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed = U8(0) libc.AtomicStoreNInt32(db+432, int32(0), 0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable-- (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = func() uint16 { if (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable != 0 { return uint16(0) } return (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue }() } } func apiHandleError(tls *libc.TLS, db uintptr, rc int32) int32 { if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 || rc == SQLITE_IOERR|int32(12)<<8 { Xsqlite3OomClear(tls, db) Xsqlite3Error(tls, db, SQLITE_NOMEM) return SQLITE_NOMEM } return rc & (*Sqlite3)(unsafe.Pointer(db)).FerrMask } // This function must be called before exiting any API function (i.e. // returning control to the user) that has called sqlite3_malloc or // sqlite3_realloc. // // The returned value is normally a copy of the second argument to this // function. However, if a malloc() failure has occurred since the previous // invocation SQLITE_NOMEM is returned instead. // // If an OOM as occurred, then the connection error-code (the value // returned by sqlite3_errcode()) is set to SQLITE_NOMEM. func Xsqlite3ApiExit(tls *libc.TLS, db uintptr, rc int32) int32 { if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 || rc != 0 { return apiHandleError(tls, db, rc) } return rc & (*Sqlite3)(unsafe.Pointer(db)).FerrMask } // An "etByte" is an 8-bit unsigned value. type EtByte = uint8 type et_info = struct { Ffmttype int8 Fbase EtByte Fflags EtByte Ftype EtByte Fcharset EtByte Fprefix EtByte } // Each builtin conversion character (ex: the 'd' in "%d") is described // by an instance of the following structure type Et_info = et_info var aDigits = *(*[33]int8)(unsafe.Pointer(ts + 1494)) var aPrefix = *(*[7]int8)(unsafe.Pointer(ts + 1527)) var fmtinfo = [23]Et_info{ {Ffmttype: int8('d'), Fbase: EtByte(10), Fflags: EtByte(1), Ftype: EtByte(EtDECIMAL)}, {Ffmttype: int8('s'), Fflags: EtByte(4), Ftype: EtByte(EtSTRING)}, {Ffmttype: int8('g'), Fflags: EtByte(1), Ftype: EtByte(EtGENERIC), Fcharset: EtByte(30)}, {Ffmttype: int8('z'), Fflags: EtByte(4), Ftype: EtByte(EtDYNSTRING)}, {Ffmttype: int8('q'), Fflags: EtByte(4), Ftype: EtByte(EtSQLESCAPE)}, {Ffmttype: int8('Q'), Fflags: EtByte(4), Ftype: EtByte(EtSQLESCAPE2)}, {Ffmttype: int8('w'), Fflags: EtByte(4), Ftype: EtByte(EtSQLESCAPE3)}, {Ffmttype: int8('c'), Ftype: EtByte(EtCHARX)}, {Ffmttype: int8('o'), Fbase: EtByte(8), Fprefix: EtByte(2)}, {Ffmttype: int8('u'), Fbase: EtByte(10), Ftype: EtByte(EtDECIMAL)}, {Ffmttype: int8('x'), Fbase: EtByte(16), Fcharset: EtByte(16), Fprefix: EtByte(1)}, {Ffmttype: int8('X'), Fbase: EtByte(16), Fprefix: EtByte(4)}, {Ffmttype: int8('f'), Fflags: EtByte(1), Ftype: EtByte(EtFLOAT)}, {Ffmttype: int8('e'), Fflags: EtByte(1), Ftype: EtByte(EtEXP), Fcharset: EtByte(30)}, {Ffmttype: int8('E'), Fflags: EtByte(1), Ftype: EtByte(EtEXP), Fcharset: EtByte(14)}, {Ffmttype: int8('G'), Fflags: EtByte(1), Ftype: EtByte(EtGENERIC), Fcharset: EtByte(14)}, {Ffmttype: int8('i'), Fbase: EtByte(10), Fflags: EtByte(1), Ftype: EtByte(EtDECIMAL)}, {Ffmttype: int8('n'), Ftype: EtByte(EtSIZE)}, {Ffmttype: int8('%'), Ftype: EtByte(EtPERCENT)}, {Ffmttype: int8('p'), Fbase: EtByte(16), Ftype: EtByte(EtPOINTER), Fprefix: EtByte(1)}, {Ffmttype: int8('T'), Ftype: EtByte(EtTOKEN)}, {Ffmttype: int8('S'), Ftype: EtByte(EtSRCITEM)}, {Ffmttype: int8('r'), Fbase: EtByte(10), Fflags: EtByte(1), Ftype: EtByte(EtORDINAL)}, } var arRound = [10]float64{ 5.0e-01, 5.0e-02, 5.0e-03, 5.0e-04, 5.0e-05, 5.0e-06, 5.0e-07, 5.0e-08, 5.0e-09, 5.0e-10, } func et_getdigit(tls *libc.TLS, val uintptr, cnt uintptr) int8 { var digit int32 var d float64 if *(*int32)(unsafe.Pointer(cnt)) <= 0 { return int8('0') } *(*int32)(unsafe.Pointer(cnt))-- digit = int32(*(*float64)(unsafe.Pointer(val))) d = float64(digit) digit = digit + '0' *(*float64)(unsafe.Pointer(val)) = (*(*float64)(unsafe.Pointer(val)) - d) * 10.0 return int8(digit) } // Set the StrAccum object to an error mode. func Xsqlite3StrAccumSetError(tls *libc.TLS, p uintptr, eError U8) { (*StrAccum)(unsafe.Pointer(p)).FaccError = eError if (*StrAccum)(unsafe.Pointer(p)).FmxAlloc != 0 { Xsqlite3_str_reset(tls, p) } if int32(eError) == SQLITE_TOOBIG { Xsqlite3ErrorToParser(tls, (*StrAccum)(unsafe.Pointer(p)).Fdb, int32(eError)) } } func getIntArg(tls *libc.TLS, p uintptr) Sqlite3_int64 { if (*PrintfArguments)(unsafe.Pointer(p)).FnArg <= (*PrintfArguments)(unsafe.Pointer(p)).FnUsed { return int64(0) } return Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer((*PrintfArguments)(unsafe.Pointer(p)).FapArg + uintptr(libc.PostIncInt32(&(*PrintfArguments)(unsafe.Pointer(p)).FnUsed, 1))*8))) } func getDoubleArg(tls *libc.TLS, p uintptr) float64 { if (*PrintfArguments)(unsafe.Pointer(p)).FnArg <= (*PrintfArguments)(unsafe.Pointer(p)).FnUsed { return 0.0 } return Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer((*PrintfArguments)(unsafe.Pointer(p)).FapArg + uintptr(libc.PostIncInt32(&(*PrintfArguments)(unsafe.Pointer(p)).FnUsed, 1))*8))) } func getTextArg(tls *libc.TLS, p uintptr) uintptr { if (*PrintfArguments)(unsafe.Pointer(p)).FnArg <= (*PrintfArguments)(unsafe.Pointer(p)).FnUsed { return uintptr(0) } return Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer((*PrintfArguments)(unsafe.Pointer(p)).FapArg + uintptr(libc.PostIncInt32(&(*PrintfArguments)(unsafe.Pointer(p)).FnUsed, 1))*8))) } func printfTempBuf(tls *libc.TLS, pAccum uintptr, n Sqlite3_int64) uintptr { var z uintptr if (*Sqlite3_str)(unsafe.Pointer(pAccum)).FaccError != 0 { return uintptr(0) } if n > Sqlite3_int64((*Sqlite3_str)(unsafe.Pointer(pAccum)).FnAlloc) && n > Sqlite3_int64((*Sqlite3_str)(unsafe.Pointer(pAccum)).FmxAlloc) { Xsqlite3StrAccumSetError(tls, pAccum, uint8(SQLITE_TOOBIG)) return uintptr(0) } z = Xsqlite3DbMallocRaw(tls, (*Sqlite3_str)(unsafe.Pointer(pAccum)).Fdb, uint64(n)) if z == uintptr(0) { Xsqlite3StrAccumSetError(tls, pAccum, uint8(SQLITE_NOMEM)) } return z } // Render a string given by "fmt" into the StrAccum object. func Xsqlite3_str_vappendf(tls *libc.TLS, pAccum uintptr, fmt uintptr, ap Va_list) { bp := tls.Alloc(116) defer tls.Free(116) var c int32 var bufpt uintptr var precision int32 var length int32 var idx int32 var width int32 var flag_leftjustify EtByte var flag_prefix EtByte var flag_alternateform EtByte var flag_altform2 EtByte var flag_zeropad EtByte var flag_long EtByte var done EtByte var cThousand EtByte var xtype EtByte var bArgList U8 var prefix int8 var longvalue Sqlite_uint64 var infop uintptr var zOut uintptr var nOut int32 var zExtra uintptr var exp int32 var e2 int32 var rounder float64 var flag_dp EtByte var flag_rtz EtByte var pArgList uintptr var wx uint32 var px uint32 var v I64 var n U64 var x int32 var cset uintptr var base U8 var nn int32 var ix int32 var pre uintptr var x1 int8 var ex int32 var scale float64 var szBufNeeded I64 var i int32 var nPad int32 var ch uint32 var nCopyBytes I64 var nPrior I64 var z uintptr var ii int32 var i1 I64 var j I64 var k I64 var n1 I64 var needQuote int32 var isnull int32 var ch1 int8 var q int8 var escarg uintptr var pExpr uintptr var pToken uintptr var pSel uintptr var pItem uintptr xtype = EtByte(EtINVALID) zExtra = uintptr(0) pArgList = uintptr(0) bufpt = uintptr(0) if !(int32((*Sqlite3_str)(unsafe.Pointer(pAccum)).FprintfFlags)&SQLITE_PRINTF_SQLFUNC != 0) { goto __1 } pArgList = libc.VaUintptr(&ap) bArgList = U8(1) goto __2 __1: bArgList = U8(0) __2: ; __3: if !(libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(fmt)))) != 0) { goto __5 } if !(c != '%') { goto __6 } bufpt = fmt __7: fmt++ goto __8 __8: if *(*int8)(unsafe.Pointer(fmt)) != 0 && int32(*(*int8)(unsafe.Pointer(fmt))) != '%' { goto __7 } goto __9 __9: ; Xsqlite3_str_append(tls, pAccum, bufpt, int32((int64(fmt)-int64(bufpt))/1)) if !(int32(*(*int8)(unsafe.Pointer(fmt))) == 0) { goto __10 } goto __5 __10: ; __6: ; if !(libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1))))) == 0) { goto __11 } Xsqlite3_str_append(tls, pAccum, ts+1534, 1) goto __5 __11: ; flag_leftjustify = libc.AssignUint8(&flag_prefix, libc.AssignUint8(&cThousand, libc.AssignUint8(&flag_alternateform, libc.AssignUint8(&flag_altform2, libc.AssignUint8(&flag_zeropad, EtByte(0)))))) done = EtByte(0) width = 0 flag_long = EtByte(0) precision = -1 __12: switch c { case '-': goto __16 case '+': goto __17 case ' ': goto __18 case '#': goto __19 case '!': goto __20 case '0': goto __21 case ',': goto __22 default: goto __23 case 'l': goto __24 case '1': goto __25 case '2': goto __26 case '3': goto __27 case '4': goto __28 case '5': goto __29 case '6': goto __30 case '7': goto __31 case '8': goto __32 case '9': goto __33 case '*': goto __34 case '.': goto __35 } goto __15 __16: flag_leftjustify = EtByte(1) goto __15 __17: flag_prefix = EtByte('+') goto __15 __18: flag_prefix = EtByte(' ') goto __15 __19: flag_alternateform = EtByte(1) goto __15 __20: flag_altform2 = EtByte(1) goto __15 __21: flag_zeropad = EtByte(1) goto __15 __22: cThousand = EtByte(',') goto __15 __23: done = EtByte(1) goto __15 __24: flag_long = EtByte(1) c = int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1)))) if !(c == 'l') { goto __36 } c = int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1)))) flag_long = EtByte(2) __36: ; done = EtByte(1) goto __15 __25: __26: __27: __28: __29: __30: __31: __32: __33: wx = uint32(c - '0') __37: if !(libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1))))) >= '0' && c <= '9') { goto __38 } wx = wx*uint32(10) + uint32(c) - uint32('0') goto __37 __38: ; width = int32(wx & uint32(0x7fffffff)) if !(c != '.' && c != 'l') { goto __39 } done = EtByte(1) goto __40 __39: fmt-- __40: ; goto __15 __34: if !(bArgList != 0) { goto __41 } width = int32(getIntArg(tls, pArgList)) goto __42 __41: width = libc.VaInt32(&ap) __42: ; if !(width < 0) { goto __43 } flag_leftjustify = EtByte(1) if width >= -2147483647 { width = -width } else { width = 0 } __43: ; if !(libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(fmt + 1)))) != '.' && c != 'l') { goto __44 } c = int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1)))) done = EtByte(1) __44: ; goto __15 __35: c = int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1)))) if !(c == '*') { goto __45 } if !(bArgList != 0) { goto __47 } precision = int32(getIntArg(tls, pArgList)) goto __48 __47: precision = libc.VaInt32(&ap) __48: ; if !(precision < 0) { goto __49 } if precision >= -2147483647 { precision = -precision } else { precision = -1 } __49: ; c = int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1)))) goto __46 __45: px = uint32(0) __50: if !(c >= '0' && c <= '9') { goto __51 } px = px*uint32(10) + uint32(c) - uint32('0') c = int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1)))) goto __50 __51: ; precision = int32(px & uint32(0x7fffffff)) __46: ; if !(c == 'l') { goto __52 } fmt-- goto __53 __52: done = EtByte(1) __53: ; goto __15 __15: ; goto __13 __13: if !(done != 0) && libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(libc.PreIncUintptr(&fmt, 1))))) != 0 { goto __12 } goto __14 __14: ; infop = uintptr(unsafe.Pointer(&fmtinfo)) xtype = EtByte(EtINVALID) idx = 0 __54: if !(idx < int32(uint64(unsafe.Sizeof(fmtinfo))/uint64(unsafe.Sizeof(Et_info{})))) { goto __56 } if !(c == int32(fmtinfo[idx].Ffmttype)) { goto __57 } infop = uintptr(unsafe.Pointer(&fmtinfo)) + uintptr(idx)*6 xtype = (*Et_info)(unsafe.Pointer(infop)).Ftype goto __56 __57: ; goto __55 __55: idx++ goto __54 goto __56 __56: ; switch int32(xtype) { case EtPOINTER: goto __59 case EtORDINAL: goto __60 case EtRADIX: goto __61 case EtDECIMAL: goto __62 case EtFLOAT: goto __63 case EtEXP: goto __64 case EtGENERIC: goto __65 case EtSIZE: goto __66 case EtPERCENT: goto __67 case EtCHARX: goto __68 case EtSTRING: goto __69 case EtDYNSTRING: goto __70 case EtSQLESCAPE: goto __71 case EtSQLESCAPE2: goto __72 case EtSQLESCAPE3: goto __73 case EtTOKEN: goto __74 case EtSRCITEM: goto __75 default: goto __76 } goto __58 __59: if uint64(unsafe.Sizeof(uintptr(0))) == uint64(unsafe.Sizeof(I64(0))) { flag_long = uint8(2) } else { if uint64(unsafe.Sizeof(uintptr(0))) == uint64(unsafe.Sizeof(int32(0))) { flag_long = uint8(1) } else { flag_long = uint8(0) } } __60: __61: cThousand = EtByte(0) __62: if !(int32((*Et_info)(unsafe.Pointer(infop)).Fflags)&FLAG_SIGNED != 0) { goto __77 } if !(bArgList != 0) { goto __79 } v = getIntArg(tls, pArgList) goto __80 __79: if !(flag_long != 0) { goto __81 } if !(int32(flag_long) == 2) { goto __83 } v = libc.VaInt64(&ap) goto __84 __83: v = I64(libc.VaInt32(&ap)) __84: ; goto __82 __81: v = I64(libc.VaInt32(&ap)) __82: ; __80: ; if !(v < int64(0)) { goto __85 } longvalue = Sqlite_uint64(^v) longvalue++ prefix = int8('-') goto __86 __85: longvalue = Sqlite_uint64(v) prefix = int8(flag_prefix) __86: ; goto __78 __77: if !(bArgList != 0) { goto __87 } longvalue = U64(getIntArg(tls, pArgList)) goto __88 __87: if !(flag_long != 0) { goto __89 } if !(int32(flag_long) == 2) { goto __91 } longvalue = libc.VaUint64(&ap) goto __92 __91: longvalue = Sqlite_uint64(libc.VaUint32(&ap)) __92: ; goto __90 __89: longvalue = Sqlite_uint64(libc.VaUint32(&ap)) __90: ; __88: ; prefix = int8(0) __78: ; if !(longvalue == uint64(0)) { goto __93 } flag_alternateform = EtByte(0) __93: ; if !(flag_zeropad != 0 && precision < width-libc.Bool32(int32(prefix) != 0)) { goto __94 } precision = width - libc.Bool32(int32(prefix) != 0) __94: ; if !(precision < SQLITE_PRINT_BUF_SIZE-10-SQLITE_PRINT_BUF_SIZE/3) { goto __95 } nOut = SQLITE_PRINT_BUF_SIZE zOut = bp + 16 goto __96 __95: n = U64(precision) + uint64(10) if !(cThousand != 0) { goto __97 } n = n + U64(precision/3) __97: ; zOut = libc.AssignUintptr(&zExtra, printfTempBuf(tls, pAccum, int64(n))) if !(zOut == uintptr(0)) { goto __98 } return __98: ; nOut = int32(n) __96: ; bufpt = zOut + uintptr(nOut-1) if !(int32(xtype) == EtORDINAL) { goto __99 } x = int32(longvalue % uint64(10)) if !(x >= 4 || longvalue/uint64(10)%uint64(10) == uint64(1)) { goto __100 } x = 0 __100: ; *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = zOrd[x*2+1] *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = zOrd[x*2] __99: ; cset = uintptr(unsafe.Pointer(&aDigits)) + uintptr((*Et_info)(unsafe.Pointer(infop)).Fcharset) base = (*Et_info)(unsafe.Pointer(infop)).Fbase __101: *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = *(*int8)(unsafe.Pointer(cset + uintptr(longvalue%Sqlite_uint64(base)))) longvalue = longvalue / Sqlite_uint64(base) goto __102 __102: if longvalue > uint64(0) { goto __101 } goto __103 __103: ; length = int32((int64(zOut+uintptr(nOut-1)) - int64(bufpt)) / 1) __104: if !(precision > length) { goto __105 } *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = int8('0') length++ goto __104 __105: ; if !(cThousand != 0) { goto __106 } nn = (length - 1) / 3 ix = (length-1)%3 + 1 bufpt -= uintptr(nn) idx = 0 __107: if !(nn > 0) { goto __109 } *(*int8)(unsafe.Pointer(bufpt + uintptr(idx))) = *(*int8)(unsafe.Pointer(bufpt + uintptr(idx+nn))) ix-- if !(ix == 0) { goto __110 } *(*int8)(unsafe.Pointer(bufpt + uintptr(libc.PreIncInt32(&idx, 1)))) = int8(cThousand) nn-- ix = 3 __110: ; goto __108 __108: idx++ goto __107 goto __109 __109: ; __106: ; if !(prefix != 0) { goto __111 } *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = prefix __111: ; if !(flag_alternateform != 0 && (*Et_info)(unsafe.Pointer(infop)).Fprefix != 0) { goto __112 } pre = uintptr(unsafe.Pointer(&aPrefix)) + uintptr((*Et_info)(unsafe.Pointer(infop)).Fprefix) __113: if !(int32(libc.AssignInt8(&x1, *(*int8)(unsafe.Pointer(pre)))) != 0) { goto __115 } *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = x1 goto __114 __114: pre++ goto __113 goto __115 __115: ; __112: ; length = int32((int64(zOut+uintptr(nOut-1)) - int64(bufpt)) / 1) goto __58 __63: __64: __65: if !(bArgList != 0) { goto __116 } *(*float64)(unsafe.Pointer(bp + 104)) = getDoubleArg(tls, pArgList) goto __117 __116: *(*float64)(unsafe.Pointer(bp + 104)) = libc.VaFloat64(&ap) __117: ; if !(precision < 0) { goto __118 } precision = 6 __118: ; if !(precision > SQLITE_FP_PRECISION_LIMIT) { goto __119 } precision = SQLITE_FP_PRECISION_LIMIT __119: ; if !(*(*float64)(unsafe.Pointer(bp + 104)) < 0.0) { goto __120 } *(*float64)(unsafe.Pointer(bp + 104)) = -*(*float64)(unsafe.Pointer(bp + 104)) prefix = int8('-') goto __121 __120: prefix = int8(flag_prefix) __121: ; if !(int32(xtype) == EtGENERIC && precision > 0) { goto __122 } precision-- __122: ; idx = precision & 0xfff rounder = arRound[idx%10] __123: if !(idx >= 10) { goto __124 } rounder = rounder * 1.0e-10 idx = idx - 10 goto __123 __124: ; if !(int32(xtype) == EtFLOAT) { goto __125 } *(*float64)(unsafe.Pointer(bp + 96)) = *(*float64)(unsafe.Pointer(bp + 104)) libc.Xmemcpy(tls, bp+88, bp+96, uint64(unsafe.Sizeof(Sqlite3_uint64(0)))) ex = -1023 + int32(*(*Sqlite3_uint64)(unsafe.Pointer(bp + 88))>>52&uint64(0x7ff)) if !(precision+ex/3 < 15) { goto __126 } rounder = rounder + *(*float64)(unsafe.Pointer(bp + 104))*3e-16 __126: ; *(*float64)(unsafe.Pointer(bp + 104)) += rounder __125: ; exp = 0 if !(Xsqlite3IsNaN(tls, *(*float64)(unsafe.Pointer(bp + 104))) != 0) { goto __127 } bufpt = ts + 1536 length = 3 goto __58 __127: ; if !(*(*float64)(unsafe.Pointer(bp + 104)) > 0.0) { goto __128 } scale = 1.0 __129: if !(*(*float64)(unsafe.Pointer(bp + 104)) >= 1e100*scale && exp <= 350) { goto __130 } scale = scale * 1e100 exp = exp + 100 goto __129 __130: ; __131: if !(*(*float64)(unsafe.Pointer(bp + 104)) >= 1e10*scale && exp <= 350) { goto __132 } scale = scale * 1e10 exp = exp + 10 goto __131 __132: ; __133: if !(*(*float64)(unsafe.Pointer(bp + 104)) >= 10.0*scale && exp <= 350) { goto __134 } scale = scale * 10.0 exp++ goto __133 __134: ; *(*float64)(unsafe.Pointer(bp + 104)) /= scale __135: if !(*(*float64)(unsafe.Pointer(bp + 104)) < 1e-8) { goto __136 } *(*float64)(unsafe.Pointer(bp + 104)) *= 1e8 exp = exp - 8 goto __135 __136: ; __137: if !(*(*float64)(unsafe.Pointer(bp + 104)) < 1.0) { goto __138 } *(*float64)(unsafe.Pointer(bp + 104)) *= 10.0 exp-- goto __137 __138: ; if !(exp > 350) { goto __139 } bufpt = bp + 16 *(*int8)(unsafe.Pointer(bp + 16)) = prefix libc.Xmemcpy(tls, bp+16+uintptr(libc.Bool32(int32(prefix) != 0)), ts+1540, uint64(4)) length = 3 + libc.Bool32(int32(prefix) != 0) goto __58 __139: ; __128: ; bufpt = bp + 16 if !(int32(xtype) != EtFLOAT) { goto __140 } *(*float64)(unsafe.Pointer(bp + 104)) += rounder if !(*(*float64)(unsafe.Pointer(bp + 104)) >= 10.0) { goto __141 } *(*float64)(unsafe.Pointer(bp + 104)) *= 0.1 exp++ __141: ; __140: ; if !(int32(xtype) == EtGENERIC) { goto __142 } flag_rtz = libc.BoolUint8(!(flag_alternateform != 0)) if !(exp < -4 || exp > precision) { goto __144 } xtype = EtByte(EtEXP) goto __145 __144: precision = precision - exp xtype = EtByte(EtFLOAT) __145: ; goto __143 __142: flag_rtz = flag_altform2 __143: ; if !(int32(xtype) == EtEXP) { goto __146 } e2 = 0 goto __147 __146: e2 = exp __147: ; szBufNeeded = func() int64 { if e2 > 0 { return int64(e2) } return int64(0) }() + I64(precision) + I64(width) + int64(15) if !(szBufNeeded > int64(SQLITE_PRINT_BUF_SIZE)) { goto __148 } bufpt = libc.AssignUintptr(&zExtra, printfTempBuf(tls, pAccum, szBufNeeded)) if !(bufpt == uintptr(0)) { goto __149 } return __149: ; __148: ; zOut = bufpt *(*int32)(unsafe.Pointer(bp + 112)) = 16 + int32(flag_altform2)*10 flag_dp = EtByte(func() int32 { if precision > 0 { return 1 } return 0 }() | int32(flag_alternateform) | int32(flag_altform2)) if !(prefix != 0) { goto __150 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = prefix __150: ; if !(e2 < 0) { goto __151 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8('0') goto __152 __151: ; __153: if !(e2 >= 0) { goto __155 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = et_getdigit(tls, bp+104, bp+112) goto __154 __154: e2-- goto __153 goto __155 __155: ; __152: ; if !(flag_dp != 0) { goto __156 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8('.') __156: ; e2++ __157: if !(e2 < 0) { goto __159 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8('0') goto __158 __158: precision-- e2++ goto __157 goto __159 __159: ; __160: if !(libc.PostDecInt32(&precision, 1) > 0) { goto __161 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = et_getdigit(tls, bp+104, bp+112) goto __160 __161: ; if !(flag_rtz != 0 && flag_dp != 0) { goto __162 } __163: if !(int32(*(*int8)(unsafe.Pointer(bufpt + libc.UintptrFromInt32(-1)))) == '0') { goto __164 } *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = int8(0) goto __163 __164: ; if !(int32(*(*int8)(unsafe.Pointer(bufpt + libc.UintptrFromInt32(-1)))) == '.') { goto __165 } if !(flag_altform2 != 0) { goto __166 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8('0') goto __167 __166: *(*int8)(unsafe.Pointer(libc.PreDecUintptr(&bufpt, 1))) = int8(0) __167: ; __165: ; __162: ; if !(int32(xtype) == EtEXP) { goto __168 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = aDigits[(*Et_info)(unsafe.Pointer(infop)).Fcharset] if !(exp < 0) { goto __169 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8('-') exp = -exp goto __170 __169: *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8('+') __170: ; if !(exp >= 100) { goto __171 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8(exp/100 + '0') exp = exp % 100 __171: ; *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8(exp/10 + '0') *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) = int8(exp%10 + '0') __168: ; *(*int8)(unsafe.Pointer(bufpt)) = int8(0) length = int32((int64(bufpt) - int64(zOut)) / 1) bufpt = zOut if !(flag_zeropad != 0 && !(flag_leftjustify != 0) && length < width) { goto __172 } nPad = width - length i = width __173: if !(i >= nPad) { goto __175 } *(*int8)(unsafe.Pointer(bufpt + uintptr(i))) = *(*int8)(unsafe.Pointer(bufpt + uintptr(i-nPad))) goto __174 __174: i-- goto __173 goto __175 __175: ; i = libc.Bool32(int32(prefix) != 0) __176: if !(libc.PostDecInt32(&nPad, 1) != 0) { goto __177 } *(*int8)(unsafe.Pointer(bufpt + uintptr(libc.PostIncInt32(&i, 1)))) = int8('0') goto __176 __177: ; length = width __172: ; goto __58 __66: if !!(bArgList != 0) { goto __178 } *(*int32)(unsafe.Pointer(libc.VaUintptr(&ap))) = int32((*Sqlite3_str)(unsafe.Pointer(pAccum)).FnChar) __178: ; length = libc.AssignInt32(&width, 0) goto __58 __67: *(*int8)(unsafe.Pointer(bp + 16)) = int8('%') bufpt = bp + 16 length = 1 goto __58 __68: if !(bArgList != 0) { goto __179 } bufpt = getTextArg(tls, pArgList) length = 1 if !(bufpt != 0) { goto __181 } *(*int8)(unsafe.Pointer(bp + 16)) = int8(libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1)))))) if !(c&0xc0 == 0xc0) { goto __183 } __184: if !(length < 4 && int32(*(*int8)(unsafe.Pointer(bufpt)))&0xc0 == 0x80) { goto __185 } *(*int8)(unsafe.Pointer(bp + 16 + uintptr(libc.PostIncInt32(&length, 1)))) = *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&bufpt, 1))) goto __184 __185: ; __183: ; goto __182 __181: *(*int8)(unsafe.Pointer(bp + 16)) = int8(0) __182: ; goto __180 __179: ch = libc.VaUint32(&ap) if !(ch < uint32(0x00080)) { goto __186 } *(*int8)(unsafe.Pointer(bp + 16)) = int8(ch & uint32(0xff)) length = 1 goto __187 __186: if !(ch < uint32(0x00800)) { goto __188 } *(*int8)(unsafe.Pointer(bp + 16)) = int8(0xc0 + int32(U8(ch>>6&uint32(0x1f)))) *(*int8)(unsafe.Pointer(bp + 16 + 1)) = int8(0x80 + int32(U8(ch&uint32(0x3f)))) length = 2 goto __189 __188: if !(ch < uint32(0x10000)) { goto __190 } *(*int8)(unsafe.Pointer(bp + 16)) = int8(0xe0 + int32(U8(ch>>12&uint32(0x0f)))) *(*int8)(unsafe.Pointer(bp + 16 + 1)) = int8(0x80 + int32(U8(ch>>6&uint32(0x3f)))) *(*int8)(unsafe.Pointer(bp + 16 + 2)) = int8(0x80 + int32(U8(ch&uint32(0x3f)))) length = 3 goto __191 __190: *(*int8)(unsafe.Pointer(bp + 16)) = int8(0xf0 + int32(U8(ch>>18&uint32(0x07)))) *(*int8)(unsafe.Pointer(bp + 16 + 1)) = int8(0x80 + int32(U8(ch>>12&uint32(0x3f)))) *(*int8)(unsafe.Pointer(bp + 16 + 2)) = int8(0x80 + int32(U8(ch>>6&uint32(0x3f)))) *(*int8)(unsafe.Pointer(bp + 16 + 3)) = int8(0x80 + int32(U8(ch&uint32(0x3f)))) length = 4 __191: ; __189: ; __187: ; __180: ; if !(precision > 1) { goto __192 } nPrior = int64(1) width = width - (precision - 1) if !(width > 1 && !(flag_leftjustify != 0)) { goto __193 } Xsqlite3_str_appendchar(tls, pAccum, width-1, int8(' ')) width = 0 __193: ; Xsqlite3_str_append(tls, pAccum, bp+16, length) precision-- __194: if !(precision > 1) { goto __195 } if !(nPrior > I64(precision-1)) { goto __196 } nPrior = I64(precision - 1) __196: ; nCopyBytes = I64(length) * nPrior if !(nCopyBytes+I64((*Sqlite3_str)(unsafe.Pointer(pAccum)).FnChar) >= I64((*Sqlite3_str)(unsafe.Pointer(pAccum)).FnAlloc)) { goto __197 } Xsqlite3StrAccumEnlarge(tls, pAccum, nCopyBytes) __197: ; if !((*Sqlite3_str)(unsafe.Pointer(pAccum)).FaccError != 0) { goto __198 } goto __195 __198: ; Xsqlite3_str_append(tls, pAccum, (*Sqlite3_str)(unsafe.Pointer(pAccum)).FzText+uintptr(I64((*Sqlite3_str)(unsafe.Pointer(pAccum)).FnChar)-nCopyBytes), int32(nCopyBytes)) precision = int32(I64(precision) - nPrior) nPrior = nPrior * int64(2) goto __194 __195: ; __192: ; bufpt = bp + 16 flag_altform2 = EtByte(1) goto adjust_width_for_utf8 __69: __70: if !(bArgList != 0) { goto __199 } bufpt = getTextArg(tls, pArgList) xtype = EtByte(EtSTRING) goto __200 __199: bufpt = libc.VaUintptr(&ap) __200: ; if !(bufpt == uintptr(0)) { goto __201 } bufpt = ts + 1544 goto __202 __201: if !(int32(xtype) == EtDYNSTRING) { goto __203 } if !((*Sqlite3_str)(unsafe.Pointer(pAccum)).FnChar == U32(0) && (*Sqlite3_str)(unsafe.Pointer(pAccum)).FmxAlloc != 0 && width == 0 && precision < 0 && int32((*Sqlite3_str)(unsafe.Pointer(pAccum)).FaccError) == 0) { goto __204 } (*Sqlite3_str)(unsafe.Pointer(pAccum)).FzText = bufpt (*Sqlite3_str)(unsafe.Pointer(pAccum)).FnAlloc = U32(Xsqlite3DbMallocSize(tls, (*Sqlite3_str)(unsafe.Pointer(pAccum)).Fdb, bufpt)) (*Sqlite3_str)(unsafe.Pointer(pAccum)).FnChar = U32(0x7fffffff & int32(libc.Xstrlen(tls, bufpt))) *(*U8)(unsafe.Pointer(pAccum + 29)) |= U8(SQLITE_PRINTF_MALLOCED) length = 0 goto __58 __204: ; zExtra = bufpt __203: ; __202: ; if !(precision >= 0) { goto __205 } if !(flag_altform2 != 0) { goto __207 } z = bufpt __209: if !(libc.PostDecInt32(&precision, 1) > 0 && *(*uint8)(unsafe.Pointer(z)) != 0) { goto __210 } if !(int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1)))) >= 0xc0) { goto __211 } __212: if !(int32(*(*uint8)(unsafe.Pointer(z)))&0xc0 == 0x80) { goto __213 } z++ goto __212 __213: ; __211: ; goto __209 __210: ; length = int32((int64(z) - int64(bufpt)) / 1) goto __208 __207: length = 0 __214: if !(length < precision && *(*int8)(unsafe.Pointer(bufpt + uintptr(length))) != 0) { goto __216 } goto __215 __215: length++ goto __214 goto __216 __216: ; __208: ; goto __206 __205: length = 0x7fffffff & int32(libc.Xstrlen(tls, bufpt)) __206: ; adjust_width_for_utf8: if !(flag_altform2 != 0 && width > 0) { goto __217 } ii = length - 1 __218: if !(ii >= 0) { goto __219 } if !(int32(*(*int8)(unsafe.Pointer(bufpt + uintptr(libc.PostDecInt32(&ii, 1)))))&0xc0 == 0x80) { goto __220 } width++ __220: ; goto __218 __219: ; __217: ; goto __58 __71: __72: __73: q = func() int8 { if int32(xtype) == EtSQLESCAPE3 { return int8('"') } return int8('\'') }() if !(bArgList != 0) { goto __221 } escarg = getTextArg(tls, pArgList) goto __222 __221: escarg = libc.VaUintptr(&ap) __222: ; isnull = libc.Bool32(escarg == uintptr(0)) if !(isnull != 0) { goto __223 } escarg = func() uintptr { if int32(xtype) == EtSQLESCAPE2 { return ts + 1545 } return ts + 1550 }() __223: ; k = I64(precision) i1 = libc.AssignInt64(&n1, int64(0)) __224: if !(k != int64(0) && int32(libc.AssignInt8(&ch1, *(*int8)(unsafe.Pointer(escarg + uintptr(i1))))) != 0) { goto __226 } if !(int32(ch1) == int32(q)) { goto __227 } n1++ __227: ; if !(flag_altform2 != 0 && int32(ch1)&0xc0 == 0xc0) { goto __228 } __229: if !(int32(*(*int8)(unsafe.Pointer(escarg + uintptr(i1+int64(1)))))&0xc0 == 0x80) { goto __230 } i1++ goto __229 __230: ; __228: ; goto __225 __225: i1++ k-- goto __224 goto __226 __226: ; needQuote = libc.Bool32(!(isnull != 0) && int32(xtype) == EtSQLESCAPE2) n1 = n1 + (i1 + int64(3)) if !(n1 > int64(SQLITE_PRINT_BUF_SIZE)) { goto __231 } bufpt = libc.AssignUintptr(&zExtra, printfTempBuf(tls, pAccum, n1)) if !(bufpt == uintptr(0)) { goto __233 } return __233: ; goto __232 __231: bufpt = bp + 16 __232: ; j = int64(0) if !(needQuote != 0) { goto __234 } *(*int8)(unsafe.Pointer(bufpt + uintptr(libc.PostIncInt64(&j, 1)))) = q __234: ; k = i1 i1 = int64(0) __235: if !(i1 < k) { goto __237 } *(*int8)(unsafe.Pointer(bufpt + uintptr(libc.PostIncInt64(&j, 1)))) = libc.AssignInt8(&ch1, *(*int8)(unsafe.Pointer(escarg + uintptr(i1)))) if !(int32(ch1) == int32(q)) { goto __238 } *(*int8)(unsafe.Pointer(bufpt + uintptr(libc.PostIncInt64(&j, 1)))) = ch1 __238: ; goto __236 __236: i1++ goto __235 goto __237 __237: ; if !(needQuote != 0) { goto __239 } *(*int8)(unsafe.Pointer(bufpt + uintptr(libc.PostIncInt64(&j, 1)))) = q __239: ; *(*int8)(unsafe.Pointer(bufpt + uintptr(j))) = int8(0) length = int32(j) goto adjust_width_for_utf8 __74: if !(int32((*Sqlite3_str)(unsafe.Pointer(pAccum)).FprintfFlags)&SQLITE_PRINTF_INTERNAL == 0) { goto __240 } return __240: ; if !(flag_alternateform != 0) { goto __241 } pExpr = libc.VaUintptr(&ap) if !(pExpr != 0 && !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_IntValue) != U32(0))) { goto __243 } Xsqlite3_str_appendall(tls, pAccum, *(*uintptr)(unsafe.Pointer(pExpr + 8))) Xsqlite3RecordErrorOffsetOfExpr(tls, (*Sqlite3_str)(unsafe.Pointer(pAccum)).Fdb, pExpr) __243: ; goto __242 __241: pToken = libc.VaUintptr(&ap) if !(pToken != 0 && (*Token)(unsafe.Pointer(pToken)).Fn != 0) { goto __244 } Xsqlite3_str_append(tls, pAccum, (*Token)(unsafe.Pointer(pToken)).Fz, int32((*Token)(unsafe.Pointer(pToken)).Fn)) Xsqlite3RecordErrorByteOffset(tls, (*Sqlite3_str)(unsafe.Pointer(pAccum)).Fdb, (*Token)(unsafe.Pointer(pToken)).Fz) __244: ; __242: ; length = libc.AssignInt32(&width, 0) goto __58 __75: if !(int32((*Sqlite3_str)(unsafe.Pointer(pAccum)).FprintfFlags)&SQLITE_PRINTF_INTERNAL == 0) { goto __245 } return __245: ; pItem = libc.VaUintptr(&ap) if !((*SrcItem)(unsafe.Pointer(pItem)).FzAlias != 0 && !(flag_altform2 != 0)) { goto __246 } Xsqlite3_str_appendall(tls, pAccum, (*SrcItem)(unsafe.Pointer(pItem)).FzAlias) goto __247 __246: if !((*SrcItem)(unsafe.Pointer(pItem)).FzName != 0) { goto __248 } if !((*SrcItem)(unsafe.Pointer(pItem)).FzDatabase != 0) { goto __250 } Xsqlite3_str_appendall(tls, pAccum, (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase) Xsqlite3_str_append(tls, pAccum, ts+1557, 1) __250: ; Xsqlite3_str_appendall(tls, pAccum, (*SrcItem)(unsafe.Pointer(pItem)).FzName) goto __249 __248: if !((*SrcItem)(unsafe.Pointer(pItem)).FzAlias != 0) { goto __251 } Xsqlite3_str_appendall(tls, pAccum, (*SrcItem)(unsafe.Pointer(pItem)).FzAlias) goto __252 __251: pSel = (*SrcItem)(unsafe.Pointer(pItem)).FpSelect if !((*Select)(unsafe.Pointer(pSel)).FselFlags&U32(SF_NestedFrom) != 0) { goto __253 } Xsqlite3_str_appendf(tls, pAccum, ts+1559, libc.VaList(bp, (*Select)(unsafe.Pointer(pSel)).FselId)) goto __254 __253: Xsqlite3_str_appendf(tls, pAccum, ts+1569, libc.VaList(bp+8, (*Select)(unsafe.Pointer(pSel)).FselId)) __254: ; __252: ; __249: ; __247: ; length = libc.AssignInt32(&width, 0) goto __58 __76: ; return __58: ; width = width - length if !(width > 0) { goto __255 } if !!(flag_leftjustify != 0) { goto __257 } Xsqlite3_str_appendchar(tls, pAccum, width, int8(' ')) __257: ; Xsqlite3_str_append(tls, pAccum, bufpt, length) if !(flag_leftjustify != 0) { goto __258 } Xsqlite3_str_appendchar(tls, pAccum, width, int8(' ')) __258: ; goto __256 __255: Xsqlite3_str_append(tls, pAccum, bufpt, length) __256: ; if !(zExtra != 0) { goto __259 } Xsqlite3DbFree(tls, (*Sqlite3_str)(unsafe.Pointer(pAccum)).Fdb, zExtra) zExtra = uintptr(0) __259: ; goto __4 __4: fmt++ goto __3 goto __5 __5: } var zOrd = *(*[9]int8)(unsafe.Pointer(ts + 1583)) // The z string points to the first character of a token that is // associated with an error. If db does not already have an error // byte offset recorded, try to compute the error byte offset for // z and set the error byte offset in db. func Xsqlite3RecordErrorByteOffset(tls *libc.TLS, db uintptr, z uintptr) { var pParse uintptr var zText uintptr var zEnd uintptr if db == uintptr(0) { return } if (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset != -2 { return } pParse = (*Sqlite3)(unsafe.Pointer(db)).FpParse if pParse == uintptr(0) { return } zText = (*Parse)(unsafe.Pointer(pParse)).FzTail if zText == uintptr(0) { return } zEnd = zText + uintptr(libc.Xstrlen(tls, zText)) if Uptr(z) >= Uptr(zText) && Uptr(z) < Uptr(zEnd) { (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset = int32((int64(z) - int64(zText)) / 1) } } // If pExpr has a byte offset for the start of a token, record that as // as the error offset. func Xsqlite3RecordErrorOffsetOfExpr(tls *libc.TLS, db uintptr, pExpr uintptr) { for pExpr != 0 && ((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0) || *(*int32)(unsafe.Pointer(pExpr + 52)) <= 0) { pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft } if pExpr == uintptr(0) { return } (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset = *(*int32)(unsafe.Pointer(pExpr + 52)) } // Enlarge the memory allocation on a StrAccum object so that it is // able to accept at least N more bytes of text. // // Return the number of bytes of text that StrAccum is able to accept // after the attempted enlargement. The value returned might be zero. func Xsqlite3StrAccumEnlarge(tls *libc.TLS, p uintptr, N I64) int32 { var zNew uintptr if (*StrAccum)(unsafe.Pointer(p)).FaccError != 0 { return 0 } if (*StrAccum)(unsafe.Pointer(p)).FmxAlloc == U32(0) { Xsqlite3StrAccumSetError(tls, p, uint8(SQLITE_TOOBIG)) return int32((*StrAccum)(unsafe.Pointer(p)).FnAlloc - (*StrAccum)(unsafe.Pointer(p)).FnChar - U32(1)) } else { var zOld uintptr if int32((*StrAccum)(unsafe.Pointer(p)).FprintfFlags)&SQLITE_PRINTF_MALLOCED != 0 { zOld = (*StrAccum)(unsafe.Pointer(p)).FzText } else { zOld = uintptr(0) } var szNew I64 = I64((*StrAccum)(unsafe.Pointer(p)).FnChar) + N + int64(1) if szNew+I64((*StrAccum)(unsafe.Pointer(p)).FnChar) <= I64((*StrAccum)(unsafe.Pointer(p)).FmxAlloc) { szNew = szNew + I64((*StrAccum)(unsafe.Pointer(p)).FnChar) } if szNew > I64((*StrAccum)(unsafe.Pointer(p)).FmxAlloc) { Xsqlite3_str_reset(tls, p) Xsqlite3StrAccumSetError(tls, p, uint8(SQLITE_TOOBIG)) return 0 } else { (*StrAccum)(unsafe.Pointer(p)).FnAlloc = U32(int32(szNew)) } if (*StrAccum)(unsafe.Pointer(p)).Fdb != 0 { zNew = Xsqlite3DbRealloc(tls, (*StrAccum)(unsafe.Pointer(p)).Fdb, zOld, uint64((*StrAccum)(unsafe.Pointer(p)).FnAlloc)) } else { zNew = Xsqlite3Realloc(tls, zOld, uint64((*StrAccum)(unsafe.Pointer(p)).FnAlloc)) } if zNew != 0 { if !(int32((*StrAccum)(unsafe.Pointer(p)).FprintfFlags)&SQLITE_PRINTF_MALLOCED != 0) && (*StrAccum)(unsafe.Pointer(p)).FnChar > U32(0) { libc.Xmemcpy(tls, zNew, (*StrAccum)(unsafe.Pointer(p)).FzText, uint64((*StrAccum)(unsafe.Pointer(p)).FnChar)) } (*StrAccum)(unsafe.Pointer(p)).FzText = zNew (*StrAccum)(unsafe.Pointer(p)).FnAlloc = U32(Xsqlite3DbMallocSize(tls, (*StrAccum)(unsafe.Pointer(p)).Fdb, zNew)) *(*U8)(unsafe.Pointer(p + 29)) |= U8(SQLITE_PRINTF_MALLOCED) } else { Xsqlite3_str_reset(tls, p) Xsqlite3StrAccumSetError(tls, p, uint8(SQLITE_NOMEM)) return 0 } } return int32(N) } // Append N copies of character c to the given string buffer. func Xsqlite3_str_appendchar(tls *libc.TLS, p uintptr, N int32, c int8) { if I64((*Sqlite3_str)(unsafe.Pointer(p)).FnChar)+I64(N) >= I64((*Sqlite3_str)(unsafe.Pointer(p)).FnAlloc) && libc.AssignInt32(&N, Xsqlite3StrAccumEnlarge(tls, p, int64(N))) <= 0 { return } for libc.PostDecInt32(&N, 1) > 0 { *(*int8)(unsafe.Pointer((*Sqlite3_str)(unsafe.Pointer(p)).FzText + uintptr(libc.PostIncUint32(&(*Sqlite3_str)(unsafe.Pointer(p)).FnChar, 1)))) = c } } func enlargeAndAppend(tls *libc.TLS, p uintptr, z uintptr, N int32) { N = Xsqlite3StrAccumEnlarge(tls, p, int64(N)) if N > 0 { libc.Xmemcpy(tls, (*StrAccum)(unsafe.Pointer(p)).FzText+uintptr((*StrAccum)(unsafe.Pointer(p)).FnChar), z, uint64(N)) *(*U32)(unsafe.Pointer(p + 24)) += U32(N) } } // Append N bytes of text from z to the StrAccum object. Increase the // size of the memory allocation for StrAccum if necessary. func Xsqlite3_str_append(tls *libc.TLS, p uintptr, z uintptr, N int32) { if (*Sqlite3_str)(unsafe.Pointer(p)).FnChar+U32(N) >= (*Sqlite3_str)(unsafe.Pointer(p)).FnAlloc { enlargeAndAppend(tls, p, z, N) } else if N != 0 { *(*U32)(unsafe.Pointer(p + 24)) += U32(N) libc.Xmemcpy(tls, (*Sqlite3_str)(unsafe.Pointer(p)).FzText+uintptr((*Sqlite3_str)(unsafe.Pointer(p)).FnChar-U32(N)), z, uint64(N)) } } // Append the complete text of zero-terminated string z[] to the p string. func Xsqlite3_str_appendall(tls *libc.TLS, p uintptr, z uintptr) { Xsqlite3_str_append(tls, p, z, Xsqlite3Strlen30(tls, z)) } func strAccumFinishRealloc(tls *libc.TLS, p uintptr) uintptr { var zText uintptr zText = Xsqlite3DbMallocRaw(tls, (*StrAccum)(unsafe.Pointer(p)).Fdb, uint64((*StrAccum)(unsafe.Pointer(p)).FnChar+U32(1))) if zText != 0 { libc.Xmemcpy(tls, zText, (*StrAccum)(unsafe.Pointer(p)).FzText, uint64((*StrAccum)(unsafe.Pointer(p)).FnChar+U32(1))) *(*U8)(unsafe.Pointer(p + 29)) |= U8(SQLITE_PRINTF_MALLOCED) } else { Xsqlite3StrAccumSetError(tls, p, uint8(SQLITE_NOMEM)) } (*StrAccum)(unsafe.Pointer(p)).FzText = zText return zText } func Xsqlite3StrAccumFinish(tls *libc.TLS, p uintptr) uintptr { if (*StrAccum)(unsafe.Pointer(p)).FzText != 0 { *(*int8)(unsafe.Pointer((*StrAccum)(unsafe.Pointer(p)).FzText + uintptr((*StrAccum)(unsafe.Pointer(p)).FnChar))) = int8(0) if (*StrAccum)(unsafe.Pointer(p)).FmxAlloc > U32(0) && !(int32((*StrAccum)(unsafe.Pointer(p)).FprintfFlags)&SQLITE_PRINTF_MALLOCED != 0) { return strAccumFinishRealloc(tls, p) } } return (*StrAccum)(unsafe.Pointer(p)).FzText } // Use the content of the StrAccum passed as the second argument // as the result of an SQL function. func Xsqlite3ResultStrAccum(tls *libc.TLS, pCtx uintptr, p uintptr) { if (*StrAccum)(unsafe.Pointer(p)).FaccError != 0 { Xsqlite3_result_error_code(tls, pCtx, int32((*StrAccum)(unsafe.Pointer(p)).FaccError)) Xsqlite3_str_reset(tls, p) } else if int32((*StrAccum)(unsafe.Pointer(p)).FprintfFlags)&SQLITE_PRINTF_MALLOCED != 0 { Xsqlite3_result_text(tls, pCtx, (*StrAccum)(unsafe.Pointer(p)).FzText, int32((*StrAccum)(unsafe.Pointer(p)).FnChar), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) } else { Xsqlite3_result_text(tls, pCtx, ts+1544, 0, uintptr(0)) Xsqlite3_str_reset(tls, p) } } var sqlite3OomStr = Sqlite3_str{FaccError: U8(SQLITE_NOMEM)} // Finalize a string created using sqlite3_str_new(). func Xsqlite3_str_finish(tls *libc.TLS, p uintptr) uintptr { var z uintptr if p != uintptr(0) && p != uintptr(unsafe.Pointer(&sqlite3OomStr)) { z = Xsqlite3StrAccumFinish(tls, p) Xsqlite3_free(tls, p) } else { z = uintptr(0) } return z } // Return any error code associated with p func Xsqlite3_str_errcode(tls *libc.TLS, p uintptr) int32 { if p != 0 { return int32((*Sqlite3_str)(unsafe.Pointer(p)).FaccError) } return SQLITE_NOMEM } // Return the current length of p in bytes func Xsqlite3_str_length(tls *libc.TLS, p uintptr) int32 { if p != 0 { return int32((*Sqlite3_str)(unsafe.Pointer(p)).FnChar) } return 0 } // Return the current value for p func Xsqlite3_str_value(tls *libc.TLS, p uintptr) uintptr { if p == uintptr(0) || (*Sqlite3_str)(unsafe.Pointer(p)).FnChar == U32(0) { return uintptr(0) } *(*int8)(unsafe.Pointer((*Sqlite3_str)(unsafe.Pointer(p)).FzText + uintptr((*Sqlite3_str)(unsafe.Pointer(p)).FnChar))) = int8(0) return (*Sqlite3_str)(unsafe.Pointer(p)).FzText } // Reset an StrAccum string. Reclaim all malloced memory. func Xsqlite3_str_reset(tls *libc.TLS, p uintptr) { if int32((*StrAccum)(unsafe.Pointer(p)).FprintfFlags)&SQLITE_PRINTF_MALLOCED != 0 { Xsqlite3DbFree(tls, (*StrAccum)(unsafe.Pointer(p)).Fdb, (*StrAccum)(unsafe.Pointer(p)).FzText) *(*U8)(unsafe.Pointer(p + 29)) &= libc.Uint8FromInt32(libc.CplInt32(SQLITE_PRINTF_MALLOCED)) } (*StrAccum)(unsafe.Pointer(p)).FnAlloc = U32(0) (*StrAccum)(unsafe.Pointer(p)).FnChar = U32(0) (*StrAccum)(unsafe.Pointer(p)).FzText = uintptr(0) } // Initialize a string accumulator. // // p: The accumulator to be initialized. // db: Pointer to a database connection. May be NULL. Lookaside // // memory is used if not NULL. db->mallocFailed is set appropriately // when not NULL. // // zBase: An initial buffer. May be NULL in which case the initial buffer // // is malloced. // // n: Size of zBase in bytes. If total space requirements never exceed // // n then no memory allocations ever occur. // // mx: Maximum number of bytes to accumulate. If mx==0 then no memory // // allocations will ever occur. func Xsqlite3StrAccumInit(tls *libc.TLS, p uintptr, db uintptr, zBase uintptr, n int32, mx int32) { (*StrAccum)(unsafe.Pointer(p)).FzText = zBase (*StrAccum)(unsafe.Pointer(p)).Fdb = db (*StrAccum)(unsafe.Pointer(p)).FnAlloc = U32(n) (*StrAccum)(unsafe.Pointer(p)).FmxAlloc = U32(mx) (*StrAccum)(unsafe.Pointer(p)).FnChar = U32(0) (*StrAccum)(unsafe.Pointer(p)).FaccError = U8(0) (*StrAccum)(unsafe.Pointer(p)).FprintfFlags = U8(0) } // Allocate and initialize a new dynamic string object func Xsqlite3_str_new(tls *libc.TLS, db uintptr) uintptr { var p uintptr = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(Sqlite3_str{}))) if p != 0 { Xsqlite3StrAccumInit(tls, p, uintptr(0), uintptr(0), 0, func() int32 { if db != 0 { return *(*int32)(unsafe.Pointer(db + 136)) } return SQLITE_MAX_LENGTH }()) } else { p = uintptr(unsafe.Pointer(&sqlite3OomStr)) } return p } // Print into memory obtained from sqliteMalloc(). Use the internal // %-conversion extensions. func Xsqlite3VMPrintf(tls *libc.TLS, db uintptr, zFormat uintptr, ap Va_list) uintptr { bp := tls.Alloc(102) defer tls.Free(102) var z uintptr Xsqlite3StrAccumInit(tls, bp, db, bp+32, int32(unsafe.Sizeof([70]int8{})), *(*int32)(unsafe.Pointer(db + 136))) (*StrAccum)(unsafe.Pointer(bp)).FprintfFlags = U8(SQLITE_PRINTF_INTERNAL) Xsqlite3_str_vappendf(tls, bp, zFormat, ap) z = Xsqlite3StrAccumFinish(tls, bp) if int32((*StrAccum)(unsafe.Pointer(bp)).FaccError) == SQLITE_NOMEM { Xsqlite3OomFault(tls, db) } return z } // Print into memory obtained from sqliteMalloc(). Use the internal // %-conversion extensions. func Xsqlite3MPrintf(tls *libc.TLS, db uintptr, zFormat uintptr, va uintptr) uintptr { var ap Va_list _ = ap var z uintptr ap = va z = Xsqlite3VMPrintf(tls, db, zFormat, ap) _ = ap return z } // Print into memory obtained from sqlite3_malloc(). Omit the internal // %-conversion extensions. func Xsqlite3_vmprintf(tls *libc.TLS, zFormat uintptr, ap Va_list) uintptr { bp := tls.Alloc(102) defer tls.Free(102) var z uintptr if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } Xsqlite3StrAccumInit(tls, bp, uintptr(0), bp+32, int32(unsafe.Sizeof([70]int8{})), SQLITE_MAX_LENGTH) Xsqlite3_str_vappendf(tls, bp, zFormat, ap) z = Xsqlite3StrAccumFinish(tls, bp) return z } // Print into memory obtained from sqlite3_malloc()(). Omit the internal // %-conversion extensions. func Xsqlite3_mprintf(tls *libc.TLS, zFormat uintptr, va uintptr) uintptr { var ap Va_list _ = ap var z uintptr if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } ap = va z = Xsqlite3_vmprintf(tls, zFormat, ap) _ = ap return z } // 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 Va_list) uintptr { bp := tls.Alloc(32) defer tls.Free(32) if n <= 0 { return zBuf } Xsqlite3StrAccumInit(tls, bp, uintptr(0), zBuf, n, 0) Xsqlite3_str_vappendf(tls, bp, zFormat, ap) *(*int8)(unsafe.Pointer(zBuf + uintptr((*StrAccum)(unsafe.Pointer(bp)).FnChar))) = int8(0) return zBuf } func Xsqlite3_snprintf(tls *libc.TLS, n int32, zBuf uintptr, zFormat uintptr, va uintptr) uintptr { var z uintptr var ap Va_list _ = ap ap = va z = Xsqlite3_vsnprintf(tls, n, zBuf, zFormat, ap) _ = ap return z } func renderLogMsg(tls *libc.TLS, iErrCode int32, zFormat uintptr, ap Va_list) { bp := tls.Alloc(242) defer tls.Free(242) Xsqlite3StrAccumInit(tls, bp, uintptr(0), bp+32, int32(unsafe.Sizeof([210]int8{})), 0) Xsqlite3_str_vappendf(tls, bp, zFormat, ap) (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.FxLog})).f(tls, Xsqlite3Config.FpLogArg, iErrCode, Xsqlite3StrAccumFinish(tls, bp)) } // Format and write a message to the log if logging is enabled. func Xsqlite3_log(tls *libc.TLS, iErrCode int32, zFormat uintptr, va uintptr) { var ap Va_list _ = ap if Xsqlite3Config.FxLog != 0 { ap = va renderLogMsg(tls, iErrCode, zFormat, ap) _ = ap } } // variable-argument wrapper around sqlite3_str_vappendf(). The bFlags argument // can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats. func Xsqlite3_str_appendf(tls *libc.TLS, p uintptr, zFormat uintptr, va uintptr) { var ap Va_list _ = ap ap = va Xsqlite3_str_vappendf(tls, p, zFormat, ap) _ = ap } type sqlite3PrngType = struct { Fs [16]U32 Fout [64]U8 Fn U8 F__ccgo_pad1 [3]byte } var sqlite3Prng sqlite3PrngType func chacha_block(tls *libc.TLS, out uintptr, in uintptr) { bp := tls.Alloc(64) defer tls.Free(64) var i int32 libc.Xmemcpy(tls, bp, in, uint64(64)) for i = 0; i < 10; i++ { *(*U32)(unsafe.Pointer(bp)) += *(*U32)(unsafe.Pointer(bp + 4*4)) *(*U32)(unsafe.Pointer(bp + 12*4)) ^= *(*U32)(unsafe.Pointer(bp)) *(*U32)(unsafe.Pointer(bp + 12*4)) = *(*U32)(unsafe.Pointer(bp + 12*4))<<16 | *(*U32)(unsafe.Pointer(bp + 12*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 8*4)) += *(*U32)(unsafe.Pointer(bp + 12*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) ^= *(*U32)(unsafe.Pointer(bp + 8*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) = *(*U32)(unsafe.Pointer(bp + 4*4))<<12 | *(*U32)(unsafe.Pointer(bp + 4*4))>>(32-12) *(*U32)(unsafe.Pointer(bp)) += *(*U32)(unsafe.Pointer(bp + 4*4)) *(*U32)(unsafe.Pointer(bp + 12*4)) ^= *(*U32)(unsafe.Pointer(bp)) *(*U32)(unsafe.Pointer(bp + 12*4)) = *(*U32)(unsafe.Pointer(bp + 12*4))<<8 | *(*U32)(unsafe.Pointer(bp + 12*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 8*4)) += *(*U32)(unsafe.Pointer(bp + 12*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) ^= *(*U32)(unsafe.Pointer(bp + 8*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) = *(*U32)(unsafe.Pointer(bp + 4*4))<<7 | *(*U32)(unsafe.Pointer(bp + 4*4))>>(32-7) *(*U32)(unsafe.Pointer(bp + 1*4)) += *(*U32)(unsafe.Pointer(bp + 5*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) ^= *(*U32)(unsafe.Pointer(bp + 1*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) = *(*U32)(unsafe.Pointer(bp + 13*4))<<16 | *(*U32)(unsafe.Pointer(bp + 13*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 9*4)) += *(*U32)(unsafe.Pointer(bp + 13*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) ^= *(*U32)(unsafe.Pointer(bp + 9*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) = *(*U32)(unsafe.Pointer(bp + 5*4))<<12 | *(*U32)(unsafe.Pointer(bp + 5*4))>>(32-12) *(*U32)(unsafe.Pointer(bp + 1*4)) += *(*U32)(unsafe.Pointer(bp + 5*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) ^= *(*U32)(unsafe.Pointer(bp + 1*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) = *(*U32)(unsafe.Pointer(bp + 13*4))<<8 | *(*U32)(unsafe.Pointer(bp + 13*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 9*4)) += *(*U32)(unsafe.Pointer(bp + 13*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) ^= *(*U32)(unsafe.Pointer(bp + 9*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) = *(*U32)(unsafe.Pointer(bp + 5*4))<<7 | *(*U32)(unsafe.Pointer(bp + 5*4))>>(32-7) *(*U32)(unsafe.Pointer(bp + 2*4)) += *(*U32)(unsafe.Pointer(bp + 6*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) ^= *(*U32)(unsafe.Pointer(bp + 2*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) = *(*U32)(unsafe.Pointer(bp + 14*4))<<16 | *(*U32)(unsafe.Pointer(bp + 14*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 10*4)) += *(*U32)(unsafe.Pointer(bp + 14*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) ^= *(*U32)(unsafe.Pointer(bp + 10*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) = *(*U32)(unsafe.Pointer(bp + 6*4))<<12 | *(*U32)(unsafe.Pointer(bp + 6*4))>>(32-12) *(*U32)(unsafe.Pointer(bp + 2*4)) += *(*U32)(unsafe.Pointer(bp + 6*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) ^= *(*U32)(unsafe.Pointer(bp + 2*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) = *(*U32)(unsafe.Pointer(bp + 14*4))<<8 | *(*U32)(unsafe.Pointer(bp + 14*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 10*4)) += *(*U32)(unsafe.Pointer(bp + 14*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) ^= *(*U32)(unsafe.Pointer(bp + 10*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) = *(*U32)(unsafe.Pointer(bp + 6*4))<<7 | *(*U32)(unsafe.Pointer(bp + 6*4))>>(32-7) *(*U32)(unsafe.Pointer(bp + 3*4)) += *(*U32)(unsafe.Pointer(bp + 7*4)) *(*U32)(unsafe.Pointer(bp + 15*4)) ^= *(*U32)(unsafe.Pointer(bp + 3*4)) *(*U32)(unsafe.Pointer(bp + 15*4)) = *(*U32)(unsafe.Pointer(bp + 15*4))<<16 | *(*U32)(unsafe.Pointer(bp + 15*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 11*4)) += *(*U32)(unsafe.Pointer(bp + 15*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) ^= *(*U32)(unsafe.Pointer(bp + 11*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) = *(*U32)(unsafe.Pointer(bp + 7*4))<<12 | *(*U32)(unsafe.Pointer(bp + 7*4))>>(32-12) *(*U32)(unsafe.Pointer(bp + 3*4)) += *(*U32)(unsafe.Pointer(bp + 7*4)) *(*U32)(unsafe.Pointer(bp + 15*4)) ^= *(*U32)(unsafe.Pointer(bp + 3*4)) *(*U32)(unsafe.Pointer(bp + 15*4)) = *(*U32)(unsafe.Pointer(bp + 15*4))<<8 | *(*U32)(unsafe.Pointer(bp + 15*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 11*4)) += *(*U32)(unsafe.Pointer(bp + 15*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) ^= *(*U32)(unsafe.Pointer(bp + 11*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) = *(*U32)(unsafe.Pointer(bp + 7*4))<<7 | *(*U32)(unsafe.Pointer(bp + 7*4))>>(32-7) *(*U32)(unsafe.Pointer(bp)) += *(*U32)(unsafe.Pointer(bp + 5*4)) *(*U32)(unsafe.Pointer(bp + 15*4)) ^= *(*U32)(unsafe.Pointer(bp)) *(*U32)(unsafe.Pointer(bp + 15*4)) = *(*U32)(unsafe.Pointer(bp + 15*4))<<16 | *(*U32)(unsafe.Pointer(bp + 15*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 10*4)) += *(*U32)(unsafe.Pointer(bp + 15*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) ^= *(*U32)(unsafe.Pointer(bp + 10*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) = *(*U32)(unsafe.Pointer(bp + 5*4))<<12 | *(*U32)(unsafe.Pointer(bp + 5*4))>>(32-12) *(*U32)(unsafe.Pointer(bp)) += *(*U32)(unsafe.Pointer(bp + 5*4)) *(*U32)(unsafe.Pointer(bp + 15*4)) ^= *(*U32)(unsafe.Pointer(bp)) *(*U32)(unsafe.Pointer(bp + 15*4)) = *(*U32)(unsafe.Pointer(bp + 15*4))<<8 | *(*U32)(unsafe.Pointer(bp + 15*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 10*4)) += *(*U32)(unsafe.Pointer(bp + 15*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) ^= *(*U32)(unsafe.Pointer(bp + 10*4)) *(*U32)(unsafe.Pointer(bp + 5*4)) = *(*U32)(unsafe.Pointer(bp + 5*4))<<7 | *(*U32)(unsafe.Pointer(bp + 5*4))>>(32-7) *(*U32)(unsafe.Pointer(bp + 1*4)) += *(*U32)(unsafe.Pointer(bp + 6*4)) *(*U32)(unsafe.Pointer(bp + 12*4)) ^= *(*U32)(unsafe.Pointer(bp + 1*4)) *(*U32)(unsafe.Pointer(bp + 12*4)) = *(*U32)(unsafe.Pointer(bp + 12*4))<<16 | *(*U32)(unsafe.Pointer(bp + 12*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 11*4)) += *(*U32)(unsafe.Pointer(bp + 12*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) ^= *(*U32)(unsafe.Pointer(bp + 11*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) = *(*U32)(unsafe.Pointer(bp + 6*4))<<12 | *(*U32)(unsafe.Pointer(bp + 6*4))>>(32-12) *(*U32)(unsafe.Pointer(bp + 1*4)) += *(*U32)(unsafe.Pointer(bp + 6*4)) *(*U32)(unsafe.Pointer(bp + 12*4)) ^= *(*U32)(unsafe.Pointer(bp + 1*4)) *(*U32)(unsafe.Pointer(bp + 12*4)) = *(*U32)(unsafe.Pointer(bp + 12*4))<<8 | *(*U32)(unsafe.Pointer(bp + 12*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 11*4)) += *(*U32)(unsafe.Pointer(bp + 12*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) ^= *(*U32)(unsafe.Pointer(bp + 11*4)) *(*U32)(unsafe.Pointer(bp + 6*4)) = *(*U32)(unsafe.Pointer(bp + 6*4))<<7 | *(*U32)(unsafe.Pointer(bp + 6*4))>>(32-7) *(*U32)(unsafe.Pointer(bp + 2*4)) += *(*U32)(unsafe.Pointer(bp + 7*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) ^= *(*U32)(unsafe.Pointer(bp + 2*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) = *(*U32)(unsafe.Pointer(bp + 13*4))<<16 | *(*U32)(unsafe.Pointer(bp + 13*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 8*4)) += *(*U32)(unsafe.Pointer(bp + 13*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) ^= *(*U32)(unsafe.Pointer(bp + 8*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) = *(*U32)(unsafe.Pointer(bp + 7*4))<<12 | *(*U32)(unsafe.Pointer(bp + 7*4))>>(32-12) *(*U32)(unsafe.Pointer(bp + 2*4)) += *(*U32)(unsafe.Pointer(bp + 7*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) ^= *(*U32)(unsafe.Pointer(bp + 2*4)) *(*U32)(unsafe.Pointer(bp + 13*4)) = *(*U32)(unsafe.Pointer(bp + 13*4))<<8 | *(*U32)(unsafe.Pointer(bp + 13*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 8*4)) += *(*U32)(unsafe.Pointer(bp + 13*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) ^= *(*U32)(unsafe.Pointer(bp + 8*4)) *(*U32)(unsafe.Pointer(bp + 7*4)) = *(*U32)(unsafe.Pointer(bp + 7*4))<<7 | *(*U32)(unsafe.Pointer(bp + 7*4))>>(32-7) *(*U32)(unsafe.Pointer(bp + 3*4)) += *(*U32)(unsafe.Pointer(bp + 4*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) ^= *(*U32)(unsafe.Pointer(bp + 3*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) = *(*U32)(unsafe.Pointer(bp + 14*4))<<16 | *(*U32)(unsafe.Pointer(bp + 14*4))>>(32-16) *(*U32)(unsafe.Pointer(bp + 9*4)) += *(*U32)(unsafe.Pointer(bp + 14*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) ^= *(*U32)(unsafe.Pointer(bp + 9*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) = *(*U32)(unsafe.Pointer(bp + 4*4))<<12 | *(*U32)(unsafe.Pointer(bp + 4*4))>>(32-12) *(*U32)(unsafe.Pointer(bp + 3*4)) += *(*U32)(unsafe.Pointer(bp + 4*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) ^= *(*U32)(unsafe.Pointer(bp + 3*4)) *(*U32)(unsafe.Pointer(bp + 14*4)) = *(*U32)(unsafe.Pointer(bp + 14*4))<<8 | *(*U32)(unsafe.Pointer(bp + 14*4))>>(32-8) *(*U32)(unsafe.Pointer(bp + 9*4)) += *(*U32)(unsafe.Pointer(bp + 14*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) ^= *(*U32)(unsafe.Pointer(bp + 9*4)) *(*U32)(unsafe.Pointer(bp + 4*4)) = *(*U32)(unsafe.Pointer(bp + 4*4))<<7 | *(*U32)(unsafe.Pointer(bp + 4*4))>>(32-7) } for i = 0; i < 16; i++ { *(*U32)(unsafe.Pointer(out + uintptr(i)*4)) = *(*U32)(unsafe.Pointer(bp + uintptr(i)*4)) + *(*U32)(unsafe.Pointer(in + uintptr(i)*4)) } } // Return N random bytes. func Xsqlite3_randomness(tls *libc.TLS, N int32, pBuf uintptr) { var zBuf uintptr = pBuf var mutex uintptr if Xsqlite3_initialize(tls) != 0 { return } mutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_PRNG) Xsqlite3_mutex_enter(tls, mutex) if N <= 0 || pBuf == uintptr(0) { *(*U32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Prng)))) = U32(0) Xsqlite3_mutex_leave(tls, mutex) return } if *(*U32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Prng)))) == U32(0) { var pVfs uintptr = Xsqlite3_vfs_find(tls, uintptr(0)) libc.Xmemcpy(tls, uintptr(unsafe.Pointer(&sqlite3Prng)), uintptr(unsafe.Pointer(&chacha20_init)), uint64(16)) if pVfs == uintptr(0) { libc.Xmemset(tls, uintptr(unsafe.Pointer(&sqlite3Prng))+4*4, 0, uint64(44)) } else { Xsqlite3OsRandomness(tls, pVfs, 44, uintptr(unsafe.Pointer(&sqlite3Prng))+4*4) } *(*U32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Prng)) + 15*4)) = *(*U32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Prng)) + 12*4)) *(*U32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Prng)) + 12*4)) = U32(0) sqlite3Prng.Fn = U8(0) } for 1 != 0 { if N <= int32(sqlite3Prng.Fn) { libc.Xmemcpy(tls, zBuf, uintptr(unsafe.Pointer(&sqlite3Prng))+64+uintptr(int32(sqlite3Prng.Fn)-N), uint64(N)) *(*U8)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Prng)) + 128)) -= U8(N) break } if int32(sqlite3Prng.Fn) > 0 { libc.Xmemcpy(tls, zBuf, uintptr(unsafe.Pointer(&sqlite3Prng))+64, uint64(sqlite3Prng.Fn)) N = N - int32(sqlite3Prng.Fn) zBuf += uintptr(sqlite3Prng.Fn) } *(*U32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Prng)) + 12*4))++ chacha_block(tls, uintptr(unsafe.Pointer(&sqlite3Prng))+64, uintptr(unsafe.Pointer(&sqlite3Prng))) sqlite3Prng.Fn = U8(64) } Xsqlite3_mutex_leave(tls, mutex) } var chacha20_init = [4]U32{ U32(0x61707865), U32(0x3320646e), U32(0x79622d32), U32(0x6b206574), } var sqlite3SavedPrng sqlite3PrngType func Xsqlite3PrngSaveState(tls *libc.TLS) { libc.Xmemcpy(tls, uintptr(unsafe.Pointer(&sqlite3SavedPrng)), uintptr(unsafe.Pointer(&sqlite3Prng)), uint64(unsafe.Sizeof(sqlite3Prng))) } func Xsqlite3PrngRestoreState(tls *libc.TLS) { libc.Xmemcpy(tls, uintptr(unsafe.Pointer(&sqlite3Prng)), uintptr(unsafe.Pointer(&sqlite3SavedPrng)), uint64(unsafe.Sizeof(sqlite3Prng))) } type X_PVFV = uintptr type X_PIFV = uintptr type X_PVFI = uintptr type _onexit_table_t = struct { F_first uintptr F_last uintptr F_end uintptr } type X_onexit_table_t = _onexit_table_t type X_ino_t = uint16 type Ino_t = uint16 type X_dev_t = uint32 type Dev_t = uint32 type X_pid_t = int64 type Pid_t = X_pid_t type X_mode_t = uint16 type Mode_t = X_mode_t type Useconds_t = uint32 type X_sigset_t = uint64 type X_beginthread_proc_type = uintptr type X_beginthreadex_proc_type = uintptr type X_tls_callback_type = uintptr func sqlite3ThreadProc(tls *libc.TLS, pArg uintptr) uint32 { var p uintptr = pArg (*SQLiteThread)(unsafe.Pointer(p)).FpResult = (*struct { f func(*libc.TLS, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*SQLiteThread)(unsafe.Pointer(p)).FxTask})).f(tls, (*SQLiteThread)(unsafe.Pointer(p)).FpIn) libc.X_endthreadex(tls, uint32(0)) return uint32(0) } // Create a new thread func Xsqlite3ThreadCreate(tls *libc.TLS, ppThread uintptr, xTask uintptr, pIn uintptr) int32 { var p uintptr *(*uintptr)(unsafe.Pointer(ppThread)) = uintptr(0) p = Xsqlite3Malloc(tls, uint64(unsafe.Sizeof(SQLiteThread{}))) if p == uintptr(0) { return SQLITE_NOMEM } if int32(Xsqlite3Config.FbCoreMutex) == 0 || Xsqlite3FaultSim(tls, 200) != 0 { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(SQLiteThread{}))) } else { (*SQLiteThread)(unsafe.Pointer(p)).FxTask = xTask (*SQLiteThread)(unsafe.Pointer(p)).FpIn = pIn (*SQLiteThread)(unsafe.Pointer(p)).Ftid = uintptr(libc.X_beginthreadex(tls, uintptr(0), uint32(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) uint32 }{sqlite3ThreadProc})), p, uint32(0), p+8)) if (*SQLiteThread)(unsafe.Pointer(p)).Ftid == uintptr(0) { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(SQLiteThread{}))) } } if (*SQLiteThread)(unsafe.Pointer(p)).FxTask == uintptr(0) { (*SQLiteThread)(unsafe.Pointer(p)).Fid = libc.XGetCurrentThreadId(tls) (*SQLiteThread)(unsafe.Pointer(p)).FpResult = (*struct { f func(*libc.TLS, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{xTask})).f(tls, pIn) } *(*uintptr)(unsafe.Pointer(ppThread)) = p return SQLITE_OK } // Get the results of the thread func Xsqlite3ThreadJoin(tls *libc.TLS, p uintptr, ppOut uintptr) int32 { var rc DWORD var bRc WINBOOL _ = bRc if p == uintptr(0) { return SQLITE_NOMEM } if (*SQLiteThread)(unsafe.Pointer(p)).FxTask == uintptr(0) { rc = DWORD(0x00000000) + DWORD(0) } else { rc = Xsqlite3Win32Wait(tls, (*SQLiteThread)(unsafe.Pointer(p)).Ftid) bRc = libc.XCloseHandle(tls, (*SQLiteThread)(unsafe.Pointer(p)).Ftid) } if rc == DWORD(0x00000000)+DWORD(0) { *(*uintptr)(unsafe.Pointer(ppOut)) = (*SQLiteThread)(unsafe.Pointer(p)).FpResult } Xsqlite3_free(tls, p) if rc == DWORD(0x00000000)+DWORD(0) { return SQLITE_OK } return SQLITE_ERROR } var sqlite3Utf8Trans1 = [64]uint8{ uint8(0x00), uint8(0x01), uint8(0x02), uint8(0x03), uint8(0x04), uint8(0x05), uint8(0x06), uint8(0x07), uint8(0x08), uint8(0x09), uint8(0x0a), uint8(0x0b), uint8(0x0c), uint8(0x0d), uint8(0x0e), uint8(0x0f), uint8(0x10), uint8(0x11), uint8(0x12), uint8(0x13), uint8(0x14), uint8(0x15), uint8(0x16), uint8(0x17), uint8(0x18), uint8(0x19), uint8(0x1a), uint8(0x1b), uint8(0x1c), uint8(0x1d), uint8(0x1e), uint8(0x1f), uint8(0x00), uint8(0x01), uint8(0x02), uint8(0x03), uint8(0x04), uint8(0x05), uint8(0x06), uint8(0x07), uint8(0x08), uint8(0x09), uint8(0x0a), uint8(0x0b), uint8(0x0c), uint8(0x0d), uint8(0x0e), uint8(0x0f), uint8(0x00), uint8(0x01), uint8(0x02), uint8(0x03), uint8(0x04), uint8(0x05), uint8(0x06), uint8(0x07), uint8(0x00), uint8(0x01), uint8(0x02), uint8(0x03), uint8(0x00), uint8(0x01), uint8(0x00), uint8(0x00), } // Translate a single UTF-8 character. Return the unicode value. // // During translation, assume that the byte that zTerm points // is a 0x00. // // Write a pointer to the next unread byte back into *pzNext. // // Notes On Invalid UTF-8: // // - This routine never allows a 7-bit character (0x00 through 0x7f) to // be encoded as a multi-byte character. Any multi-byte character that // attempts to encode a value between 0x00 and 0x7f is rendered as 0xfffd. // // - This routine never allows a UTF16 surrogate value to be encoded. // If a multi-byte character attempts to encode a value between // 0xd800 and 0xe000 then it is rendered as 0xfffd. // // - Bytes in the range of 0x80 through 0xbf which occur as the first // byte of a character are interpreted as single-byte characters // and rendered as themselves even though they are technically // invalid characters. // // - This routine accepts over-length UTF8 encodings // for unicode values 0x80 and greater. It does not change over-length // encodings to 0xfffd as some systems recommend. func Xsqlite3Utf8Read(tls *libc.TLS, pz uintptr) U32 { var c uint32 c = uint32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(pz)), 1)))) if c >= uint32(0xc0) { c = uint32(sqlite3Utf8Trans1[c-uint32(0xc0)]) for int32(*(*uint8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pz)))))&0xc0 == 0x80 { c = c<<6 + uint32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(pz)), 1))))) } if c < uint32(0x80) || c&0xFFFFF800 == uint32(0xD800) || c&0xFFFFFFFE == uint32(0xFFFE) { c = uint32(0xFFFD) } } return c } // This routine transforms the internal text encoding used by pMem to // desiredEnc. It is an error if the string is already of the desired // encoding, or if *pMem does not contain a string value. func Xsqlite3VdbeMemTranslate(tls *libc.TLS, pMem uintptr, desiredEnc U8) int32 { var len Sqlite3_int64 var zOut uintptr var zIn uintptr var zTerm uintptr var z uintptr var c uint32 var temp U8 var rc int32 var c2 int32 var c21 int32 if !(int32((*Mem)(unsafe.Pointer(pMem)).Fenc) != SQLITE_UTF8 && int32(desiredEnc) != SQLITE_UTF8) { goto __1 } rc = Xsqlite3VdbeMemMakeWriteable(tls, pMem) if !(rc != SQLITE_OK) { goto __2 } return SQLITE_NOMEM __2: ; zIn = (*Mem)(unsafe.Pointer(pMem)).Fz zTerm = zIn + uintptr((*Mem)(unsafe.Pointer(pMem)).Fn&libc.CplInt32(1)) __3: if !(zIn < zTerm) { goto __4 } temp = *(*uint8)(unsafe.Pointer(zIn)) *(*uint8)(unsafe.Pointer(zIn)) = *(*uint8)(unsafe.Pointer(zIn + uintptr(1))) zIn++ *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))) = temp goto __3 __4: ; (*Mem)(unsafe.Pointer(pMem)).Fenc = desiredEnc goto translate_out __1: ; if !(int32(desiredEnc) == SQLITE_UTF8) { goto __5 } *(*int32)(unsafe.Pointer(pMem + 16)) &= libc.CplInt32(1) len = int64(2)*Sqlite3_int64((*Mem)(unsafe.Pointer(pMem)).Fn) + int64(1) goto __6 __5: len = int64(2)*Sqlite3_int64((*Mem)(unsafe.Pointer(pMem)).Fn) + int64(2) __6: ; zIn = (*Mem)(unsafe.Pointer(pMem)).Fz zTerm = zIn + uintptr((*Mem)(unsafe.Pointer(pMem)).Fn) zOut = Xsqlite3DbMallocRaw(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, uint64(len)) if !!(zOut != 0) { goto __7 } return SQLITE_NOMEM __7: ; z = zOut if !(int32((*Mem)(unsafe.Pointer(pMem)).Fenc) == SQLITE_UTF8) { goto __8 } if !(int32(desiredEnc) == SQLITE_UTF16LE) { goto __10 } __12: if !(zIn < zTerm) { goto __13 } c = uint32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) if !(c >= uint32(0xc0)) { goto __14 } c = uint32(sqlite3Utf8Trans1[c-uint32(0xc0)]) __15: if !(zIn != zTerm && int32(*(*uint8)(unsafe.Pointer(zIn)))&0xc0 == 0x80) { goto __16 } c = c<<6 + uint32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))))) goto __15 __16: ; if !(c < uint32(0x80) || c&0xFFFFF800 == uint32(0xD800) || c&0xFFFFFFFE == uint32(0xFFFE)) { goto __17 } c = uint32(0xFFFD) __17: ; __14: ; if !(c <= uint32(0xFFFF)) { goto __18 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c & uint32(0x00FF)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c >> 8 & uint32(0x00FF)) goto __19 __18: *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c>>10&uint32(0x003F) + (c-uint32(0x10000))>>10&uint32(0x00C0)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(uint32(0x00D8) + (c-uint32(0x10000))>>18&uint32(0x03)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c & uint32(0x00FF)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(uint32(0x00DC) + c>>8&uint32(0x03)) __19: ; goto __12 __13: ; goto __11 __10: ; __20: if !(zIn < zTerm) { goto __21 } c = uint32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) if !(c >= uint32(0xc0)) { goto __22 } c = uint32(sqlite3Utf8Trans1[c-uint32(0xc0)]) __23: if !(zIn != zTerm && int32(*(*uint8)(unsafe.Pointer(zIn)))&0xc0 == 0x80) { goto __24 } c = c<<6 + uint32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))))) goto __23 __24: ; if !(c < uint32(0x80) || c&0xFFFFF800 == uint32(0xD800) || c&0xFFFFFFFE == uint32(0xFFFE)) { goto __25 } c = uint32(0xFFFD) __25: ; __22: ; if !(c <= uint32(0xFFFF)) { goto __26 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c >> 8 & uint32(0x00FF)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c & uint32(0x00FF)) goto __27 __26: *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(uint32(0x00D8) + (c-uint32(0x10000))>>18&uint32(0x03)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c>>10&uint32(0x003F) + (c-uint32(0x10000))>>10&uint32(0x00C0)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(uint32(0x00DC) + c>>8&uint32(0x03)) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c & uint32(0x00FF)) __27: ; goto __20 __21: ; __11: ; (*Mem)(unsafe.Pointer(pMem)).Fn = int32((int64(z) - int64(zOut)) / 1) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0) goto __9 __8: ; if !(int32((*Mem)(unsafe.Pointer(pMem)).Fenc) == SQLITE_UTF16LE) { goto __28 } __30: if !(zIn < zTerm) { goto __31 } c = uint32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) c = c + uint32(int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))))<<8) if !(c >= uint32(0xd800) && c < uint32(0xe000)) { goto __32 } if !(zIn < zTerm) { goto __33 } c2 = int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) c2 = c2 + int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))))<<8 c = uint32(c2&0x03FF) + c&uint32(0x003F)<<10 + (c&uint32(0x03C0)+uint32(0x0040))<<10 __33: ; __32: ; if !(c < uint32(0x00080)) { goto __34 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c & uint32(0xFF)) goto __35 __34: if !(c < uint32(0x00800)) { goto __36 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0xC0 + int32(U8(c>>6&uint32(0x1F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) goto __37 __36: if !(c < uint32(0x10000)) { goto __38 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0xE0 + int32(U8(c>>12&uint32(0x0F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c>>6&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) goto __39 __38: *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0xF0 + int32(U8(c>>18&uint32(0x07)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c>>12&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c>>6&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) __39: ; __37: ; __35: ; goto __30 __31: ; goto __29 __28: __40: if !(zIn < zTerm) { goto __41 } c = uint32(int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) << 8) c = c + uint32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) if !(c >= uint32(0xd800) && c < uint32(0xe000)) { goto __42 } if !(zIn < zTerm) { goto __43 } c21 = int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) << 8 c21 = c21 + int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) c = uint32(c21&0x03FF) + c&uint32(0x003F)<<10 + (c&uint32(0x03C0)+uint32(0x0040))<<10 __43: ; __42: ; if !(c < uint32(0x00080)) { goto __44 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = U8(c & uint32(0xFF)) goto __45 __44: if !(c < uint32(0x00800)) { goto __46 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0xC0 + int32(U8(c>>6&uint32(0x1F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) goto __47 __46: if !(c < uint32(0x10000)) { goto __48 } *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0xE0 + int32(U8(c>>12&uint32(0x0F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c>>6&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) goto __49 __48: *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0xF0 + int32(U8(c>>18&uint32(0x07)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c>>12&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c>>6&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) __49: ; __47: ; __45: ; goto __40 __41: ; __29: ; (*Mem)(unsafe.Pointer(pMem)).Fn = int32((int64(z) - int64(zOut)) / 1) __9: ; *(*uint8)(unsafe.Pointer(z)) = uint8(0) c = uint32(MEM_Str | MEM_Term | int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_AffMask|MEM_Subtype)) Xsqlite3VdbeMemRelease(tls, pMem) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(c) (*Mem)(unsafe.Pointer(pMem)).Fenc = desiredEnc (*Mem)(unsafe.Pointer(pMem)).Fz = zOut (*Mem)(unsafe.Pointer(pMem)).FzMalloc = (*Mem)(unsafe.Pointer(pMem)).Fz (*Mem)(unsafe.Pointer(pMem)).FszMalloc = Xsqlite3DbMallocSize(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, (*Mem)(unsafe.Pointer(pMem)).Fz) translate_out: return SQLITE_OK } // This routine checks for a byte-order mark at the beginning of the // UTF-16 string stored in *pMem. If one is present, it is removed and // the encoding of the Mem adjusted. This routine does not do any // byte-swapping, it just sets Mem.enc appropriately. // // The allocation (static, dynamic etc.) and encoding of the Mem may be // changed by this function. func Xsqlite3VdbeMemHandleBom(tls *libc.TLS, pMem uintptr) int32 { var rc int32 = SQLITE_OK var bom U8 = U8(0) if (*Mem)(unsafe.Pointer(pMem)).Fn > 1 { var b1 U8 = *(*U8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz)) var b2 U8 = *(*U8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz + uintptr(1))) if int32(b1) == 0xFE && int32(b2) == 0xFF { bom = U8(SQLITE_UTF16BE) } if int32(b1) == 0xFF && int32(b2) == 0xFE { bom = U8(SQLITE_UTF16LE) } } if bom != 0 { rc = Xsqlite3VdbeMemMakeWriteable(tls, pMem) if rc == SQLITE_OK { *(*int32)(unsafe.Pointer(pMem + 16)) -= 2 libc.Xmemmove(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, (*Mem)(unsafe.Pointer(pMem)).Fz+2, uint64((*Mem)(unsafe.Pointer(pMem)).Fn)) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz + uintptr((*Mem)(unsafe.Pointer(pMem)).Fn))) = int8(0) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz + uintptr((*Mem)(unsafe.Pointer(pMem)).Fn+1))) = int8(0) *(*U16)(unsafe.Pointer(pMem + 20)) |= U16(MEM_Term) (*Mem)(unsafe.Pointer(pMem)).Fenc = bom } } return rc } // pZ is a UTF-8 encoded unicode string. If nByte is less than zero, // return the number of unicode characters in pZ up to (but not including) // the first 0x00 byte. If nByte is not less than zero, return the // number of unicode characters in the first nByte of pZ (or up to // the first 0x00, whichever comes first). func Xsqlite3Utf8CharLen(tls *libc.TLS, zIn uintptr, nByte int32) int32 { var r int32 = 0 var z uintptr = zIn var zTerm uintptr if nByte >= 0 { zTerm = z + uintptr(nByte) } else { zTerm = libc.UintptrFromInt32(-1) } for int32(*(*U8)(unsafe.Pointer(z))) != 0 && z < zTerm { { if int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1)))) >= 0xc0 { for int32(*(*U8)(unsafe.Pointer(z)))&0xc0 == 0x80 { z++ } } } r++ } return r } // Convert a UTF-16 string in the native encoding into a UTF-8 string. // Memory to hold the UTF-8 string is obtained from sqlite3_malloc and must // be freed by the calling function. // // NULL is returned if there is an allocation error. func Xsqlite3Utf16to8(tls *libc.TLS, db uintptr, z uintptr, nByte int32, enc U8) uintptr { bp := tls.Alloc(56) defer tls.Free(56) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Mem{}))) (*Mem)(unsafe.Pointer(bp)).Fdb = db Xsqlite3VdbeMemSetStr(tls, bp, z, int64(nByte), enc, uintptr(0)) Xsqlite3VdbeChangeEncoding(tls, bp, SQLITE_UTF8) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3VdbeMemRelease(tls, bp) (*Mem)(unsafe.Pointer(bp)).Fz = uintptr(0) } return (*Mem)(unsafe.Pointer(bp)).Fz } // zIn is a UTF-16 encoded unicode string at least nChar characters long. // Return the number of bytes in the first nChar unicode characters // in pZ. nChar must be non-negative. func Xsqlite3Utf16ByteLen(tls *libc.TLS, zIn uintptr, nChar int32) int32 { var c int32 var z uintptr = zIn var n int32 = 0 if SQLITE_UTF16LE == SQLITE_UTF16LE { z++ } for n < nChar { c = int32(*(*uint8)(unsafe.Pointer(z))) z += uintptr(2) if c >= 0xd8 && c < 0xdc && int32(*(*uint8)(unsafe.Pointer(z))) >= 0xdc && int32(*(*uint8)(unsafe.Pointer(z))) < 0xe0 { z += uintptr(2) } n++ } return int32((int64(z)-int64(zIn))/1) - libc.Bool32(SQLITE_UTF16LE == SQLITE_UTF16LE) } type _exception = struct { Ftype int32 F__ccgo_pad1 [4]byte Fname uintptr Farg1 float64 Farg2 float64 Fretval float64 } type __mingw_dbl_type_t = struct{ Fx float64 } type X__mingw_dbl_type_t = __mingw_dbl_type_t type __mingw_flt_type_t = struct{ Fx float32 } type X__mingw_flt_type_t = __mingw_flt_type_t type __mingw_ldbl_type_t = struct { Fx float64 F__ccgo_pad1 [8]byte } type X__mingw_ldbl_type_t = __mingw_ldbl_type_t type _complex = struct { Fx float64 Fy float64 } // Use the compiler's builtin define for FLT_EVAL_METHOD to // // set float_t and double_t. type Float_t = float32 type Double_t = float64 // Calls to sqlite3FaultSim() are used to simulate a failure during testing, // or to bypass normal error detection during testing in order to let // execute proceed futher downstream. // // In deployment, sqlite3FaultSim() *always* return SQLITE_OK (0). The // sqlite3FaultSim() function only returns non-zero during testing. // // During testing, if the test harness has set a fault-sim callback using // a call to sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL), then // each call to sqlite3FaultSim() is relayed to that application-supplied // callback and the integer return value form the application-supplied // callback is returned by sqlite3FaultSim(). // // The integer argument to sqlite3FaultSim() is a code to identify which // sqlite3FaultSim() instance is being invoked. Each call to sqlite3FaultSim() // should have a unique code. To prevent legacy testing applications from // breaking, the codes should not be changed or reused. func Xsqlite3FaultSim(tls *libc.TLS, iTest int32) int32 { var xCallback uintptr = Xsqlite3Config.FxTestCallback if xCallback != 0 { return (*struct{ f func(*libc.TLS, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xCallback})).f(tls, iTest) } return SQLITE_OK } // Return true if the floating point value is Not a Number (NaN). // // Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. // Otherwise, we have our own implementation that works on most systems. func Xsqlite3IsNaN(tls *libc.TLS, x float64) int32 { bp := tls.Alloc(16) defer tls.Free(16) *(*float64)(unsafe.Pointer(bp + 8)) = x var rc int32 libc.Xmemcpy(tls, bp, bp+8, uint64(unsafe.Sizeof(U64(0)))) rc = libc.Bool32(*(*U64)(unsafe.Pointer(bp))&(uint64(0x7ff)<<52) == uint64(0x7ff)<<52 && *(*U64)(unsafe.Pointer(bp))&(uint64(1)<<52-uint64(1)) != uint64(0)) return rc } // Compute a string length that is limited to what can be stored in // lower 30 bits of a 32-bit signed integer. // // The value returned will never be negative. Nor will it ever be greater // than the actual length of the string. For very long strings (greater // than 1GiB) the value returned might be less than the true string length. func Xsqlite3Strlen30(tls *libc.TLS, z uintptr) int32 { if z == uintptr(0) { return 0 } return 0x3fffffff & int32(libc.Xstrlen(tls, z)) } // Return the declared type of a column. Or return zDflt if the column // has no declared type. // // The column type is an extra string stored after the zero-terminator on // the column name if and only if the COLFLAG_HASTYPE flag is set. func Xsqlite3ColumnType(tls *libc.TLS, pCol uintptr, zDflt uintptr) uintptr { if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_HASTYPE != 0 { return (*Column)(unsafe.Pointer(pCol)).FzCnName + uintptr(libc.Xstrlen(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName)) + uintptr(1) } else if uint32(int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf0>>4)) != 0 { return Xsqlite3StdType[(int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf0>>4)-1)&0xf<<28>>28] } else { return zDflt } return uintptr(0) } func sqlite3ErrorFinish(tls *libc.TLS, db uintptr, err_code int32) { if (*Sqlite3)(unsafe.Pointer(db)).FpErr != 0 { Xsqlite3ValueSetNull(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) } Xsqlite3SystemError(tls, db, err_code) } // Set the current error code to err_code and clear any prior error message. // Also set iSysErrno (by calling sqlite3System) if the err_code indicates // that would be appropriate. func Xsqlite3Error(tls *libc.TLS, db uintptr, err_code int32) { (*Sqlite3)(unsafe.Pointer(db)).FerrCode = err_code if err_code != 0 || (*Sqlite3)(unsafe.Pointer(db)).FpErr != 0 { sqlite3ErrorFinish(tls, db, err_code) } else { (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset = -1 } } // The equivalent of sqlite3Error(db, SQLITE_OK). Clear the error state // and error message. func Xsqlite3ErrorClear(tls *libc.TLS, db uintptr) { (*Sqlite3)(unsafe.Pointer(db)).FerrCode = SQLITE_OK (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset = -1 if (*Sqlite3)(unsafe.Pointer(db)).FpErr != 0 { Xsqlite3ValueSetNull(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) } } // Load the sqlite3.iSysErrno field if that is an appropriate thing // to do based on the SQLite error code in rc. func Xsqlite3SystemError(tls *libc.TLS, db uintptr, rc int32) { if rc == SQLITE_IOERR|int32(12)<<8 { return } rc = rc & 0xff if rc == SQLITE_CANTOPEN || rc == SQLITE_IOERR { (*Sqlite3)(unsafe.Pointer(db)).FiSysErrno = Xsqlite3OsGetLastError(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs) } } // Set the most recent error code and error string for the sqlite // handle "db". The error code is set to "err_code". // // If it is not NULL, string zFormat specifies the format of the // error string. zFormat and any string tokens that follow it are // assumed to be encoded in UTF-8. // // To clear the most recent error for sqlite handle "db", sqlite3Error // should be called with err_code set to SQLITE_OK and zFormat set // to NULL. func Xsqlite3ErrorWithMsg(tls *libc.TLS, db uintptr, err_code int32, zFormat uintptr, va uintptr) { (*Sqlite3)(unsafe.Pointer(db)).FerrCode = err_code Xsqlite3SystemError(tls, db, err_code) if zFormat == uintptr(0) { Xsqlite3Error(tls, db, err_code) } else if (*Sqlite3)(unsafe.Pointer(db)).FpErr != 0 || libc.AssignPtrUintptr(db+424, Xsqlite3ValueNew(tls, db)) != uintptr(0) { var z uintptr var ap Va_list _ = ap ap = va z = Xsqlite3VMPrintf(tls, db, zFormat, ap) _ = ap Xsqlite3ValueSetStr(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr, -1, z, uint8(SQLITE_UTF8), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) } } // Check for interrupts and invoke progress callback. func Xsqlite3ProgressCheck(tls *libc.TLS, p uintptr) { var db uintptr = (*Parse)(unsafe.Pointer(p)).Fdb if libc.AtomicLoadNInt32(db+432, 0) != 0 { (*Parse)(unsafe.Pointer(p)).FnErr++ (*Parse)(unsafe.Pointer(p)).Frc = SQLITE_INTERRUPT } if (*Sqlite3)(unsafe.Pointer(db)).FxProgress != 0 && libc.PreIncUint32(&(*Parse)(unsafe.Pointer(p)).FnProgressSteps, 1) >= (*Sqlite3)(unsafe.Pointer(db)).FnProgressOps { if (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxProgress})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpProgressArg) != 0 { (*Parse)(unsafe.Pointer(p)).FnErr++ (*Parse)(unsafe.Pointer(p)).Frc = SQLITE_INTERRUPT } (*Parse)(unsafe.Pointer(p)).FnProgressSteps = U32(0) } } // Add an error message to pParse->zErrMsg and increment pParse->nErr. // // This function should be used to report any error that occurs while // compiling an SQL statement (i.e. within sqlite3_prepare()). The // last thing the sqlite3_prepare() function does is copy the error // stored by this function into the database handle using sqlite3Error(). // Functions sqlite3Error() or sqlite3ErrorWithMsg() should be used // during statement execution (sqlite3_step() etc.). func Xsqlite3ErrorMsg(tls *libc.TLS, pParse uintptr, zFormat uintptr, va uintptr) { var zMsg uintptr var ap Va_list _ = ap var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset = -2 ap = va zMsg = Xsqlite3VMPrintf(tls, db, zFormat, ap) _ = ap if (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset < -1 { (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset = -1 } if (*Sqlite3)(unsafe.Pointer(db)).FsuppressErr != 0 { Xsqlite3DbFree(tls, db, zMsg) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Parse)(unsafe.Pointer(pParse)).FnErr++ (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } } else { (*Parse)(unsafe.Pointer(pParse)).FnErr++ Xsqlite3DbFree(tls, db, (*Parse)(unsafe.Pointer(pParse)).FzErrMsg) (*Parse)(unsafe.Pointer(pParse)).FzErrMsg = zMsg (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_ERROR (*Parse)(unsafe.Pointer(pParse)).FpWith = uintptr(0) } } // If database connection db is currently parsing SQL, then transfer // error code errCode to that parser if the parser has not already // encountered some other kind of error. func Xsqlite3ErrorToParser(tls *libc.TLS, db uintptr, errCode int32) int32 { var pParse uintptr if db == uintptr(0) || libc.AssignUintptr(&pParse, (*Sqlite3)(unsafe.Pointer(db)).FpParse) == uintptr(0) { return errCode } (*Parse)(unsafe.Pointer(pParse)).Frc = errCode (*Parse)(unsafe.Pointer(pParse)).FnErr++ return errCode } // 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 Xsqlite3Dequote(tls *libc.TLS, z uintptr) { var quote int8 var i int32 var j int32 if z == uintptr(0) { return } quote = *(*int8)(unsafe.Pointer(z)) if !(int32(Xsqlite3CtypeMap[uint8(quote)])&0x80 != 0) { return } if int32(quote) == '[' { quote = int8(']') } i = 1 j = 0 for ; ; i++ { if int32(*(*int8)(unsafe.Pointer(z + uintptr(i)))) == int32(quote) { if int32(*(*int8)(unsafe.Pointer(z + uintptr(i+1)))) == int32(quote) { *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&j, 1)))) = quote i++ } else { break } } else { *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&j, 1)))) = *(*int8)(unsafe.Pointer(z + uintptr(i))) } } *(*int8)(unsafe.Pointer(z + uintptr(j))) = int8(0) } func Xsqlite3DequoteExpr(tls *libc.TLS, p uintptr) { *(*U32)(unsafe.Pointer(p + 4)) |= func() uint32 { if int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 8))))) == '"' { return uint32(EP_Quoted | EP_DblQuoted) } return uint32(EP_Quoted) }() Xsqlite3Dequote(tls, *(*uintptr)(unsafe.Pointer(p + 8))) } // If the input token p is quoted, try to adjust the token to remove // the quotes. This is not always possible: // // "abc" -> abc // "ab""cd" -> (not possible because of the interior "") // // Remove the quotes if possible. This is a optimization. The overall // system should still return the correct answer even if this routine // is always a no-op. func Xsqlite3DequoteToken(tls *libc.TLS, p uintptr) { var i uint32 if (*Token)(unsafe.Pointer(p)).Fn < uint32(2) { return } if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(p)).Fz)))])&0x80 != 0) { return } for i = uint32(1); i < (*Token)(unsafe.Pointer(p)).Fn-uint32(1); i++ { if int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(p)).Fz + uintptr(i))))])&0x80 != 0 { return } } *(*uint32)(unsafe.Pointer(p + 8)) -= uint32(2) (*Token)(unsafe.Pointer(p)).Fz++ } // Generate a Token object from a string func Xsqlite3TokenInit(tls *libc.TLS, p uintptr, z uintptr) { (*Token)(unsafe.Pointer(p)).Fz = z (*Token)(unsafe.Pointer(p)).Fn = uint32(Xsqlite3Strlen30(tls, z)) } // Some systems have stricmp(). Others have strcasecmp(). Because // there is no consistency, we will define our own. // // IMPLEMENTATION-OF: R-30243-02494 The sqlite3_stricmp() and // sqlite3_strnicmp() APIs allow applications and extensions to compare // the contents of two buffers containing UTF-8 strings in a // case-independent fashion, using the same definition of "case // independence" that SQLite uses internally when comparing identifiers. func Xsqlite3_stricmp(tls *libc.TLS, zLeft uintptr, zRight uintptr) int32 { if zLeft == uintptr(0) { if zRight != 0 { return -1 } return 0 } else if zRight == uintptr(0) { return 1 } return Xsqlite3StrICmp(tls, zLeft, zRight) } func Xsqlite3StrICmp(tls *libc.TLS, zLeft uintptr, zRight uintptr) int32 { var a uintptr var b uintptr var c int32 var x int32 a = zLeft b = zRight for { c = int32(*(*uint8)(unsafe.Pointer(a))) x = int32(*(*uint8)(unsafe.Pointer(b))) if c == x { if c == 0 { break } } else { c = int32(Xsqlite3UpperToLower[c]) - int32(Xsqlite3UpperToLower[x]) if c != 0 { break } } a++ b++ } return c } func Xsqlite3_strnicmp(tls *libc.TLS, zLeft uintptr, zRight uintptr, N int32) int32 { var a uintptr var b uintptr if zLeft == uintptr(0) { if zRight != 0 { return -1 } return 0 } else if zRight == uintptr(0) { return 1 } a = zLeft b = zRight for libc.PostDecInt32(&N, 1) > 0 && int32(*(*uint8)(unsafe.Pointer(a))) != 0 && int32(Xsqlite3UpperToLower[*(*uint8)(unsafe.Pointer(a))]) == int32(Xsqlite3UpperToLower[*(*uint8)(unsafe.Pointer(b))]) { a++ b++ } if N < 0 { return 0 } return int32(Xsqlite3UpperToLower[*(*uint8)(unsafe.Pointer(a))]) - int32(Xsqlite3UpperToLower[*(*uint8)(unsafe.Pointer(b))]) } // Compute an 8-bit hash on a string that is insensitive to case differences func Xsqlite3StrIHash(tls *libc.TLS, z uintptr) U8 { var h U8 = U8(0) if z == uintptr(0) { return U8(0) } for *(*int8)(unsafe.Pointer(z)) != 0 { h = U8(int32(h) + int32(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(z)))])) z++ } return h } func sqlite3Pow10(tls *libc.TLS, E int32) float64 { var r float64 = 1.0 var i int32 i = 0 __1: if !(E != 0) { goto __3 } { if E&1 != 0 { r = r * x[i] } } goto __2 __2: i++ E >>= 1 goto __1 goto __3 __3: ; return r } var x = [9]float64{ 1.0e+001, 1.0e+002, 1.0e+004, 1.0e+008, 1.0e+016, 1.0e+032, 1.0e+064, 1.0e+128, 1.0e+256, } // The string z[] is an text representation of a real number. // Convert this string to a double and write it into *pResult. // // The string z[] is length bytes in length (bytes, not characters) and // uses the encoding enc. The string is not necessarily zero-terminated. // // Return TRUE if the result is a valid real number (or integer) and FALSE // if the string is empty or contains extraneous text. More specifically // return // // 1 => The input string is a pure integer // 2 or more => The input has a decimal point or eNNN clause // 0 or less => The input string is not a valid number // -1 => Not a valid number, but has a valid prefix which // includes a decimal point and/or an eNNN clause // // Valid numbers are in one of these formats: // // [+-]digits[E[+-]digits] // [+-]digits.[digits][E[+-]digits] // [+-].digits[E[+-]digits] // // Leading and trailing whitespace is ignored for the purpose of determining // validity. // // If some prefix of the input string is a valid number, this routine // returns FALSE but it still converts the prefix and writes the result // into *pResult. func Xsqlite3AtoF(tls *libc.TLS, z uintptr, pResult uintptr, length int32, enc U8) int32 { var incr int32 var zEnd uintptr var sign int32 var s I64 var d int32 var esign int32 var e int32 var eValid int32 var result float64 var nDigit int32 var eType int32 var i int32 var scale float64 var scale1 float64 sign = 1 s = int64(0) d = 0 esign = 1 e = 0 eValid = 1 nDigit = 0 eType = 1 *(*float64)(unsafe.Pointer(pResult)) = 0.0 if !(length == 0) { goto __1 } return 0 __1: ; if !(int32(enc) == SQLITE_UTF8) { goto __2 } incr = 1 zEnd = z + uintptr(length) goto __3 __2: incr = 2 length = length & libc.CplInt32(1) i = 3 - int32(enc) __4: if !(i < length && int32(*(*int8)(unsafe.Pointer(z + uintptr(i)))) == 0) { goto __6 } goto __5 __5: i = i + 2 goto __4 goto __6 __6: ; if !(i < length) { goto __7 } eType = -100 __7: ; zEnd = z + uintptr(i^1) z += uintptr(int32(enc) & 1) __3: ; __8: if !(z < zEnd && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x01 != 0) { goto __9 } z += uintptr(incr) goto __8 __9: ; if !(z >= zEnd) { goto __10 } return 0 __10: ; if !(int32(*(*int8)(unsafe.Pointer(z))) == '-') { goto __11 } sign = -1 z += uintptr(incr) goto __12 __11: if !(int32(*(*int8)(unsafe.Pointer(z))) == '+') { goto __13 } z += uintptr(incr) __13: ; __12: ; __14: if !(z < zEnd && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x04 != 0) { goto __15 } s = s*int64(10) + I64(int32(*(*int8)(unsafe.Pointer(z)))-'0') z += uintptr(incr) nDigit++ if !(s >= (int64(0xffffffff)|int64(0x7fffffff)<<32-int64(9))/int64(10)) { goto __16 } __17: if !(z < zEnd && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x04 != 0) { goto __18 } z += uintptr(incr) d++ goto __17 __18: ; __16: ; goto __14 __15: ; if !(z >= zEnd) { goto __19 } goto do_atof_calc __19: ; if !(int32(*(*int8)(unsafe.Pointer(z))) == '.') { goto __20 } z += uintptr(incr) eType++ __21: if !(z < zEnd && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x04 != 0) { goto __22 } if !(s < (int64(0xffffffff)|int64(0x7fffffff)<<32-int64(9))/int64(10)) { goto __23 } s = s*int64(10) + I64(int32(*(*int8)(unsafe.Pointer(z)))-'0') d-- nDigit++ __23: ; z += uintptr(incr) goto __21 __22: ; __20: ; if !(z >= zEnd) { goto __24 } goto do_atof_calc __24: ; if !(int32(*(*int8)(unsafe.Pointer(z))) == 'e' || int32(*(*int8)(unsafe.Pointer(z))) == 'E') { goto __25 } z += uintptr(incr) eValid = 0 eType++ if !(z >= zEnd) { goto __26 } goto do_atof_calc __26: ; if !(int32(*(*int8)(unsafe.Pointer(z))) == '-') { goto __27 } esign = -1 z += uintptr(incr) goto __28 __27: if !(int32(*(*int8)(unsafe.Pointer(z))) == '+') { goto __29 } z += uintptr(incr) __29: ; __28: ; __30: if !(z < zEnd && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x04 != 0) { goto __31 } if e < 10000 { e = e*10 + (int32(*(*int8)(unsafe.Pointer(z))) - '0') } else { e = 10000 } z += uintptr(incr) eValid = 1 goto __30 __31: ; __25: ; __32: if !(z < zEnd && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x01 != 0) { goto __33 } z += uintptr(incr) goto __32 __33: ; do_atof_calc: e = e*esign + d if !(e < 0) { goto __34 } esign = -1 e = e * -1 goto __35 __34: esign = 1 __35: ; if !(s == int64(0)) { goto __36 } if sign < 0 { result = -libc.Float64FromFloat64(float64(0)) } else { result = float64(0) } goto __37 __36: __38: if !(e > 0) { goto __39 } if !(esign > 0) { goto __40 } if !(s >= (int64(0xffffffff)|int64(0x7fffffff)<<32)/int64(10)) { goto __42 } goto __39 __42: ; s = s * int64(10) goto __41 __40: if !(s%int64(10) != int64(0)) { goto __43 } goto __39 __43: ; s = s / int64(10) __41: ; e-- goto __38 __39: ; if sign < 0 { s = -s } else { s = s } if !(e == 0) { goto __44 } result = float64(s) goto __45 __44: if !(e > 307) { goto __46 } if !(e < 342) { goto __48 } scale = sqlite3Pow10(tls, e-308) if !(esign < 0) { goto __50 } result = float64(s) / scale result = result / 1.0e+308 goto __51 __50: result = float64(s) * scale result = result * 1.0e+308 __51: ; goto __49 __48: ; if !(esign < 0) { goto __52 } result = 0.0 * float64(s) goto __53 __52: result = float64(libc.X__builtin_inff(tls) * float32(s)) __53: ; __49: ; goto __47 __46: scale1 = sqlite3Pow10(tls, e) if !(esign < 0) { goto __54 } result = float64(s) / scale1 goto __55 __54: result = float64(s) * scale1 __55: ; __47: ; __45: ; __37: ; *(*float64)(unsafe.Pointer(pResult)) = result if !(z == zEnd && nDigit > 0 && eValid != 0 && eType > 0) { goto __56 } return eType goto __57 __56: if !(eType >= 2 && (eType == 3 || eValid != 0) && nDigit > 0) { goto __58 } return -1 goto __59 __58: return 0 __59: ; __57: ; return int32(0) } // Render an signed 64-bit integer as text. Store the result in zOut[] and // return the length of the string that was stored, in bytes. The value // returned does not include the zero terminator at the end of the output // string. // // The caller must ensure that zOut[] is at least 21 bytes in size. func Xsqlite3Int64ToText(tls *libc.TLS, v I64, zOut uintptr) int32 { bp := tls.Alloc(22) defer tls.Free(22) var i int32 var x U64 if v < int64(0) { if v == int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32) { x = uint64(1) << 63 } else { x = U64(-v) } } else { x = U64(v) } i = int32(uint64(unsafe.Sizeof([22]int8{})) - uint64(2)) *(*int8)(unsafe.Pointer(bp + 21)) = int8(0) for __ccgo := true; __ccgo; __ccgo = x != 0 { *(*int8)(unsafe.Pointer(bp + uintptr(libc.PostDecInt32(&i, 1)))) = int8(x%uint64(10) + uint64('0')) x = x / uint64(10) } if v < int64(0) { *(*int8)(unsafe.Pointer(bp + uintptr(libc.PostDecInt32(&i, 1)))) = int8('-') } libc.Xmemcpy(tls, zOut, bp+uintptr(i+1), uint64(unsafe.Sizeof([22]int8{}))-uint64(1)-uint64(i)) return int32(uint64(unsafe.Sizeof([22]int8{})) - uint64(2) - uint64(i)) } func compare2pow63(tls *libc.TLS, zNum uintptr, incr int32) int32 { var c int32 = 0 var i int32 var pow63 uintptr = ts + 1592 for i = 0; c == 0 && i < 18; i++ { c = (int32(*(*int8)(unsafe.Pointer(zNum + uintptr(i*incr)))) - int32(*(*int8)(unsafe.Pointer(pow63 + uintptr(i))))) * 10 } if c == 0 { c = int32(*(*int8)(unsafe.Pointer(zNum + uintptr(18*incr)))) - '8' } return c } // 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 Xsqlite3Atoi64(tls *libc.TLS, zNum uintptr, pNum uintptr, length int32, enc U8) int32 { var incr int32 var u U64 = uint64(0) var neg int32 = 0 var i int32 var c int32 = 0 var nonNum int32 = 0 var rc int32 var zStart uintptr var zEnd uintptr = zNum + uintptr(length) if int32(enc) == SQLITE_UTF8 { incr = 1 } else { incr = 2 length = length & libc.CplInt32(1) for i = 3 - int32(enc); i < length && int32(*(*int8)(unsafe.Pointer(zNum + uintptr(i)))) == 0; i = i + 2 { } nonNum = libc.Bool32(i < length) zEnd = zNum + uintptr(i^1) zNum += uintptr(int32(enc) & 1) } for zNum < zEnd && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zNum)))])&0x01 != 0 { zNum += uintptr(incr) } if zNum < zEnd { if int32(*(*int8)(unsafe.Pointer(zNum))) == '-' { neg = 1 zNum += uintptr(incr) } else if int32(*(*int8)(unsafe.Pointer(zNum))) == '+' { zNum += uintptr(incr) } } zStart = zNum for zNum < zEnd && int32(*(*int8)(unsafe.Pointer(zNum))) == '0' { zNum += uintptr(incr) } for i = 0; zNum+uintptr(i) < zEnd && libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(zNum + uintptr(i))))) >= '0' && c <= '9'; i = i + incr { u = u*uint64(10) + U64(c) - uint64('0') } if u > uint64(int64(0xffffffff)|int64(0x7fffffff)<<32) { *(*I64)(unsafe.Pointer(pNum)) = func() int64 { if neg != 0 { return int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32) } return int64(0xffffffff) | int64(0x7fffffff)<<32 }() } else if neg != 0 { *(*I64)(unsafe.Pointer(pNum)) = -I64(u) } else { *(*I64)(unsafe.Pointer(pNum)) = I64(u) } rc = 0 if i == 0 && zStart == zNum { rc = -1 } else if nonNum != 0 { rc = 1 } else if zNum+uintptr(i) < zEnd { var jj int32 = i for __ccgo := true; __ccgo; __ccgo = zNum+uintptr(jj) < zEnd { if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zNum + uintptr(jj))))])&0x01 != 0) { rc = 1 break } jj = jj + incr } } if i < 19*incr { return rc } else { if i > 19*incr { c = 1 } else { c = compare2pow63(tls, zNum, incr) } if c < 0 { return rc } else { *(*I64)(unsafe.Pointer(pNum)) = func() int64 { if neg != 0 { return int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32) } return int64(0xffffffff) | int64(0x7fffffff)<<32 }() if c > 0 { return 2 } else { if neg != 0 { return rc } return 3 } } } return int32(0) } // Transform a UTF-8 integer literal, in either decimal or hexadecimal, // into a 64-bit signed integer. This routine accepts hexadecimal literals, // whereas sqlite3Atoi64() does not. // // Returns: // // 0 Successful transformation. Fits in a 64-bit signed integer. // 1 Excess text after the integer value // 2 Integer too large for a 64-bit signed integer or is malformed // 3 Special case of 9223372036854775808 func Xsqlite3DecOrHexToI64(tls *libc.TLS, z uintptr, pOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if int32(*(*int8)(unsafe.Pointer(z))) == '0' && (int32(*(*int8)(unsafe.Pointer(z + 1))) == 'x' || int32(*(*int8)(unsafe.Pointer(z + 1))) == 'X') { *(*U64)(unsafe.Pointer(bp)) = uint64(0) var i int32 var k int32 for i = 2; int32(*(*int8)(unsafe.Pointer(z + uintptr(i)))) == '0'; i++ { } for k = i; int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(k))))])&0x08 != 0; k++ { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))*uint64(16) + U64(Xsqlite3HexToInt(tls, int32(*(*int8)(unsafe.Pointer(z + uintptr(k)))))) } libc.Xmemcpy(tls, pOut, bp, uint64(8)) if int32(*(*int8)(unsafe.Pointer(z + uintptr(k)))) == 0 && k-i <= 16 { return 0 } return 2 } else { return Xsqlite3Atoi64(tls, z, pOut, Xsqlite3Strlen30(tls, z), uint8(SQLITE_UTF8)) } return int32(0) } // If zNum represents an integer that will fit in 32-bits, then set // *pValue to that integer and return true. Otherwise return false. // // This routine accepts both decimal and hexadecimal notation for integers. // // Any non-numeric characters that following zNum are ignored. // This is different from sqlite3Atoi64() which requires the // input number to be zero-terminated. func Xsqlite3GetInt32(tls *libc.TLS, zNum uintptr, pValue uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var v Sqlite_int64 = int64(0) var i int32 var c int32 var neg int32 = 0 if int32(*(*int8)(unsafe.Pointer(zNum))) == '-' { neg = 1 zNum++ } else if int32(*(*int8)(unsafe.Pointer(zNum))) == '+' { zNum++ } else if int32(*(*int8)(unsafe.Pointer(zNum))) == '0' && (int32(*(*int8)(unsafe.Pointer(zNum + 1))) == 'x' || int32(*(*int8)(unsafe.Pointer(zNum + 1))) == 'X') && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zNum + 2)))])&0x08 != 0 { *(*U32)(unsafe.Pointer(bp)) = U32(0) zNum += uintptr(2) for int32(*(*int8)(unsafe.Pointer(zNum))) == '0' { zNum++ } for i = 0; int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zNum + uintptr(i))))])&0x08 != 0 && i < 8; i++ { *(*U32)(unsafe.Pointer(bp)) = *(*U32)(unsafe.Pointer(bp))*U32(16) + U32(Xsqlite3HexToInt(tls, int32(*(*int8)(unsafe.Pointer(zNum + uintptr(i)))))) } if *(*U32)(unsafe.Pointer(bp))&0x80000000 == U32(0) && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zNum + uintptr(i))))])&0x08 == 0 { libc.Xmemcpy(tls, pValue, bp, uint64(4)) return 1 } else { return 0 } } if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zNum)))])&0x04 != 0) { return 0 } for int32(*(*int8)(unsafe.Pointer(zNum))) == '0' { zNum++ } for i = 0; i < 11 && libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(zNum + uintptr(i))))-'0') >= 0 && c <= 9; i++ { v = v*int64(10) + Sqlite_int64(c) } if i > 10 { return 0 } if v-Sqlite_int64(neg) > int64(2147483647) { return 0 } if neg != 0 { v = -v } *(*int32)(unsafe.Pointer(pValue)) = int32(v) return 1 } // Return a 32-bit integer value extracted from a string. If the // string is not an integer, just return 0. func Xsqlite3Atoi(tls *libc.TLS, z uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = 0 Xsqlite3GetInt32(tls, z, bp) return *(*int32)(unsafe.Pointer(bp)) } // 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 Xsqlite3GetUInt32(tls *libc.TLS, z uintptr, pI uintptr) int32 { var v U64 = uint64(0) var i int32 for i = 0; int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(i))))])&0x04 != 0; i++ { v = v*uint64(10) + U64(*(*int8)(unsafe.Pointer(z + uintptr(i)))) - uint64('0') if v > uint64(4294967296) { *(*U32)(unsafe.Pointer(pI)) = U32(0) return 0 } } if i == 0 || int32(*(*int8)(unsafe.Pointer(z + uintptr(i)))) != 0 { *(*U32)(unsafe.Pointer(pI)) = U32(0) return 0 } *(*U32)(unsafe.Pointer(pI)) = U32(v) return 1 } func putVarint64(tls *libc.TLS, p uintptr, v U64) int32 { bp := tls.Alloc(10) defer tls.Free(10) var i int32 var j int32 var n int32 if v&(uint64(0xff000000)<<32) != 0 { *(*uint8)(unsafe.Pointer(p + 8)) = U8(v) v >>= 8 for i = 7; i >= 0; i-- { *(*uint8)(unsafe.Pointer(p + uintptr(i))) = U8(v&uint64(0x7f) | uint64(0x80)) v >>= 7 } return 9 } n = 0 for __ccgo := true; __ccgo; __ccgo = v != uint64(0) { *(*U8)(unsafe.Pointer(bp + uintptr(libc.PostIncInt32(&n, 1)))) = U8(v&uint64(0x7f) | uint64(0x80)) v >>= 7 } *(*U8)(unsafe.Pointer(bp)) &= U8(0x7f) i = 0 j = n - 1 __1: if !(j >= 0) { goto __3 } { *(*uint8)(unsafe.Pointer(p + uintptr(i))) = *(*U8)(unsafe.Pointer(bp + uintptr(j))) } goto __2 __2: j-- i++ goto __1 goto __3 __3: ; return n } func Xsqlite3PutVarint(tls *libc.TLS, p uintptr, v U64) int32 { if v <= uint64(0x7f) { *(*uint8)(unsafe.Pointer(p)) = uint8(v & uint64(0x7f)) return 1 } if v <= uint64(0x3fff) { *(*uint8)(unsafe.Pointer(p)) = uint8(v>>7&uint64(0x7f) | uint64(0x80)) *(*uint8)(unsafe.Pointer(p + 1)) = uint8(v & uint64(0x7f)) return 2 } return putVarint64(tls, p, v) } // Read a 64-bit variable-length integer from memory starting at p[0]. // Return the number of bytes read. The value is stored in *v. func Xsqlite3GetVarint(tls *libc.TLS, p uintptr, v uintptr) U8 { var a U32 var b U32 var s U32 if int32(*(*int8)(unsafe.Pointer(p))) >= 0 { *(*U64)(unsafe.Pointer(v)) = U64(*(*uint8)(unsafe.Pointer(p))) return U8(1) } if int32(*(*int8)(unsafe.Pointer(p + 1))) >= 0 { *(*U64)(unsafe.Pointer(v)) = U64(U32(int32(*(*uint8)(unsafe.Pointer(p)))&0x7f)<<7 | U32(*(*uint8)(unsafe.Pointer(p + 1)))) return U8(2) } a = U32(*(*uint8)(unsafe.Pointer(p))) << 14 b = U32(*(*uint8)(unsafe.Pointer(p + 1))) p += uintptr(2) a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { a = a & U32(SLOT_2_0) b = b & U32(0x7f) b = b << 7 a = a | b *(*U64)(unsafe.Pointer(v)) = U64(a) return U8(3) } a = a & U32(SLOT_2_0) p++ b = b << 14 b = b | U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { b = b & U32(SLOT_2_0) a = a << 7 a = a | b *(*U64)(unsafe.Pointer(v)) = U64(a) return U8(4) } b = b & U32(SLOT_2_0) s = a p++ a = a << 14 a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { b = b << 7 a = a | b s = s >> 18 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(5) } s = s << 7 s = s | b p++ b = b << 14 b = b | U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { a = a & U32(SLOT_2_0) a = a << 7 a = a | b s = s >> 18 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(6) } p++ a = a << 14 a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { a = a & SLOT_4_2_0 b = b & U32(SLOT_2_0) b = b << 7 a = a | b s = s >> 11 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(7) } a = a & U32(SLOT_2_0) p++ b = b << 14 b = b | U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { b = b & SLOT_4_2_0 a = a << 7 a = a | b s = s >> 4 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(8) } p++ a = a << 15 a = a | U32(*(*uint8)(unsafe.Pointer(p))) b = b & U32(SLOT_2_0) b = b << 8 a = a | b s = s << 4 b = U32(*(*uint8)(unsafe.Pointer(p + libc.UintptrFromInt32(-4)))) b = b & U32(0x7f) b = b >> 3 s = s | b *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(9) } // Read a 32-bit variable-length integer from memory starting at p[0]. // Return the number of bytes read. The value is stored in *v. // // If the varint stored in p[0] is larger than can fit in a 32-bit unsigned // integer, then set *v to 0xffffffff. // // A MACRO version, getVarint32, is provided which inlines the // single-byte case. All code should use the MACRO version as // this function assumes the single-byte case has already been handled. func Xsqlite3GetVarint32(tls *libc.TLS, p uintptr, v uintptr) U8 { bp := tls.Alloc(8) defer tls.Free(8) var a U32 var b U32 a = U32(*(*uint8)(unsafe.Pointer(p))) p++ b = U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { a = a & U32(0x7f) a = a << 7 *(*U32)(unsafe.Pointer(v)) = a | b return U8(2) } p++ a = a << 14 a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { a = a & U32(int32(0x7f)<<14|0x7f) b = b & U32(0x7f) b = b << 7 *(*U32)(unsafe.Pointer(v)) = a | b return U8(3) } { var n U8 n = Xsqlite3GetVarint(tls, p-uintptr(2), bp) if *(*U64)(unsafe.Pointer(bp))&(uint64(1)<<32-uint64(1)) != *(*U64)(unsafe.Pointer(bp)) { *(*U32)(unsafe.Pointer(v)) = 0xffffffff } else { *(*U32)(unsafe.Pointer(v)) = U32(*(*U64)(unsafe.Pointer(bp))) } return n } return U8(0) } // Return the number of bytes that will be needed to store the given // 64-bit integer. func Xsqlite3VarintLen(tls *libc.TLS, v U64) int32 { var i int32 for i = 1; libc.AssignShrUint64(&v, int(uint64(7))) != uint64(0); i++ { } return i } // Read or write a four-byte big-endian integer value. func Xsqlite3Get4byte(tls *libc.TLS, p uintptr) U32 { bp := tls.Alloc(4) defer tls.Free(4) libc.Xmemcpy(tls, bp, p, uint64(4)) return libc.X__builtin_bswap32(tls, *(*U32)(unsafe.Pointer(bp))) } func Xsqlite3Put4byte(tls *libc.TLS, p uintptr, v U32) { bp := tls.Alloc(4) defer tls.Free(4) *(*U32)(unsafe.Pointer(bp)) = libc.X__builtin_bswap32(tls, v) libc.Xmemcpy(tls, p, bp, uint64(4)) } // Translate a single byte of Hex into an integer. // This routine only works if h really is a valid hexadecimal // character: 0..9a..fA..F func Xsqlite3HexToInt(tls *libc.TLS, h int32) U8 { h = h + 9*(1&(h>>6)) return U8(h & 0xf) } // 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 Xsqlite3HexToBlob(tls *libc.TLS, db uintptr, z uintptr, n int32) uintptr { var zBlob uintptr var i int32 zBlob = Xsqlite3DbMallocRawNN(tls, db, uint64(n/2+1)) n-- if zBlob != 0 { for i = 0; i < n; i = i + 2 { *(*int8)(unsafe.Pointer(zBlob + uintptr(i/2))) = int8(int32(Xsqlite3HexToInt(tls, int32(*(*int8)(unsafe.Pointer(z + uintptr(i))))))<<4 | int32(Xsqlite3HexToInt(tls, int32(*(*int8)(unsafe.Pointer(z + uintptr(i+1))))))) } *(*int8)(unsafe.Pointer(zBlob + uintptr(i/2))) = int8(0) } return zBlob } func logBadConnection(tls *libc.TLS, zType uintptr) { bp := tls.Alloc(8) defer tls.Free(8) Xsqlite3_log(tls, SQLITE_MISUSE, ts+1611, libc.VaList(bp, zType)) } // Check to make sure we have a valid db pointer. This test is not // foolproof but it does provide some measure of protection against // misuse of the interface such as passing in db pointers that are // NULL or which have been previously closed. If this routine returns // 1 it means that the db pointer is valid and 0 if it should not be // dereferenced for any reason. The calling function should invoke // SQLITE_MISUSE immediately. // // sqlite3SafetyCheckOk() requires that the db pointer be valid for // use. sqlite3SafetyCheckSickOrOk() allows a db pointer that failed to // open properly and is not fit for general use but which can be // used as an argument to sqlite3_errmsg() or sqlite3_close(). func Xsqlite3SafetyCheckOk(tls *libc.TLS, db uintptr) int32 { var eOpenState U8 if db == uintptr(0) { logBadConnection(tls, ts+1545) return 0 } eOpenState = (*Sqlite3)(unsafe.Pointer(db)).FeOpenState if int32(eOpenState) != SQLITE_STATE_OPEN { if Xsqlite3SafetyCheckSickOrOk(tls, db) != 0 { logBadConnection(tls, ts+1656) } return 0 } else { return 1 } return int32(0) } func Xsqlite3SafetyCheckSickOrOk(tls *libc.TLS, db uintptr) int32 { var eOpenState U8 eOpenState = (*Sqlite3)(unsafe.Pointer(db)).FeOpenState if int32(eOpenState) != SQLITE_STATE_SICK && int32(eOpenState) != SQLITE_STATE_OPEN && int32(eOpenState) != SQLITE_STATE_BUSY { logBadConnection(tls, ts+1665) return 0 } else { return 1 } return int32(0) } // Attempt to add, substract, or multiply the 64-bit signed value iB against // the other 64-bit signed integer at *pA and store the result in *pA. // Return 0 on success. Or if the operation would have resulted in an // overflow, leave *pA unchanged and return 1. func Xsqlite3AddInt64(tls *libc.TLS, pA uintptr, iB I64) int32 { return libc.X__builtin_add_overflowInt64(tls, *(*I64)(unsafe.Pointer(pA)), iB, pA) } func Xsqlite3SubInt64(tls *libc.TLS, pA uintptr, iB I64) int32 { return libc.X__builtin_sub_overflowInt64(tls, *(*I64)(unsafe.Pointer(pA)), iB, pA) } func Xsqlite3MulInt64(tls *libc.TLS, pA uintptr, iB I64) int32 { return libc.X__builtin_mul_overflowInt64(tls, *(*I64)(unsafe.Pointer(pA)), iB, pA) } // Compute the absolute value of a 32-bit signed integer, of possible. Or // if the integer has a value of -2147483648, return +2147483647 func Xsqlite3AbsInt32(tls *libc.TLS, x int32) int32 { if x >= 0 { return x } if x == libc.Int32FromUint32(0x80000000) { return 0x7fffffff } return -x } // Find (an approximate) sum of two LogEst values. This computation is // not a simple "+" operator because LogEst is stored as a logarithmic // value. func Xsqlite3LogEstAdd(tls *libc.TLS, a LogEst, b LogEst) LogEst { if int32(a) >= int32(b) { if int32(a) > int32(b)+49 { return a } if int32(a) > int32(b)+31 { return LogEst(int32(a) + 1) } return LogEst(int32(a) + int32(x1[int32(a)-int32(b)])) } else { if int32(b) > int32(a)+49 { return b } if int32(b) > int32(a)+31 { return LogEst(int32(b) + 1) } return LogEst(int32(b) + int32(x1[int32(b)-int32(a)])) } return LogEst(0) } var x1 = [32]uint8{ uint8(10), uint8(10), uint8(9), uint8(9), uint8(8), uint8(8), uint8(7), uint8(7), uint8(7), uint8(6), uint8(6), uint8(6), uint8(5), uint8(5), uint8(5), uint8(4), uint8(4), uint8(4), uint8(4), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(2), uint8(2), uint8(2), uint8(2), uint8(2), uint8(2), uint8(2), } // Convert an integer into a LogEst. In other words, compute an // approximation for 10*log2(x). func Xsqlite3LogEst(tls *libc.TLS, x U64) LogEst { var y LogEst = int16(40) if x < uint64(8) { if x < uint64(2) { return int16(0) } for x < uint64(8) { y = int16(int32(y) - 10) x <<= 1 } } else { var i int32 = 60 - libc.X__builtin_clzll(tls, x) y = LogEst(int32(y) + i*10) x >>= i } return LogEst(int32(a[x&uint64(7)]) + int32(y) - 10) } var a = [8]LogEst{int16(0), int16(2), int16(3), int16(5), int16(6), int16(7), int16(8), int16(9)} // Convert a double into a LogEst // In other words, compute an approximation for 10*log2(x). func Xsqlite3LogEstFromDouble(tls *libc.TLS, x float64) LogEst { bp := tls.Alloc(16) defer tls.Free(16) *(*float64)(unsafe.Pointer(bp + 8)) = x var e LogEst if *(*float64)(unsafe.Pointer(bp + 8)) <= float64(1) { return int16(0) } if *(*float64)(unsafe.Pointer(bp + 8)) <= float64(2000000000) { return Xsqlite3LogEst(tls, U64(*(*float64)(unsafe.Pointer(bp + 8)))) } libc.Xmemcpy(tls, bp, bp+8, uint64(8)) e = LogEst(*(*U64)(unsafe.Pointer(bp))>>52 - uint64(1022)) return LogEst(int32(e) * 10) } // Convert a LogEst into an integer. func Xsqlite3LogEstToInt(tls *libc.TLS, x LogEst) U64 { var n U64 n = U64(int32(x) % 10) x = int16(int32(x) / 10) if n >= uint64(5) { n = n - uint64(2) } else if n >= uint64(1) { n = n - uint64(1) } if int32(x) > 60 { return uint64(int64(0xffffffff) | int64(0x7fffffff)<<32) } if int32(x) >= 3 { return (n + uint64(8)) << (int32(x) - 3) } return (n + uint64(8)) >> (3 - int32(x)) } // Add a new name/number pair to a VList. This might require that the // VList object be reallocated, so return the new VList. If an OOM // error occurs, the original VList returned and the // db->mallocFailed flag is set. // // A VList is really just an array of integers. To destroy a VList, // simply pass it to sqlite3DbFree(). // // The first integer is the number of integers allocated for the whole // VList. The second integer is the number of integers actually used. // Each name/number pair is encoded by subsequent groups of 3 or more // integers. // // Each name/number pair starts with two integers which are the numeric // value for the pair and the size of the name/number pair, respectively. // The text name overlays one or more following integers. The text name // is always zero-terminated. // // Conceptually: // // struct VList { // int nAlloc; // Number of allocated slots // int nUsed; // Number of used slots // struct VListEntry { // int iValue; // Value for this entry // int nSlot; // Slots used by this entry // // ... variable name goes here // } a[0]; // } // // During code generation, pointers to the variable names within the // VList are taken. When that happens, nAlloc is set to zero as an // indication that the VList may never again be enlarged, since the // accompanying realloc() would invalidate the pointers. func Xsqlite3VListAdd(tls *libc.TLS, db uintptr, pIn uintptr, zName uintptr, nName int32, iVal int32) uintptr { var nInt int32 var z uintptr var i int32 nInt = nName/4 + 3 if pIn == uintptr(0) || *(*VList)(unsafe.Pointer(pIn + 1*4))+nInt > *(*VList)(unsafe.Pointer(pIn)) { var nAlloc Sqlite3_int64 = func() int64 { if pIn != 0 { return int64(2) * Sqlite3_int64(*(*VList)(unsafe.Pointer(pIn))) } return int64(10) }() + Sqlite3_int64(nInt) var pOut uintptr = Xsqlite3DbRealloc(tls, db, pIn, uint64(nAlloc)*uint64(unsafe.Sizeof(int32(0)))) if pOut == uintptr(0) { return pIn } if pIn == uintptr(0) { *(*VList)(unsafe.Pointer(pOut + 1*4)) = 2 } pIn = pOut *(*VList)(unsafe.Pointer(pIn)) = VList(nAlloc) } i = *(*VList)(unsafe.Pointer(pIn + 1*4)) *(*VList)(unsafe.Pointer(pIn + uintptr(i)*4)) = iVal *(*VList)(unsafe.Pointer(pIn + uintptr(i+1)*4)) = nInt z = pIn + uintptr(i+2)*4 *(*VList)(unsafe.Pointer(pIn + 1*4)) = i + nInt libc.Xmemcpy(tls, z, zName, uint64(nName)) *(*int8)(unsafe.Pointer(z + uintptr(nName))) = int8(0) return pIn } // Return a pointer to the name of a variable in the given VList that // has the value iVal. Or return a NULL if there is no such variable in // the list func Xsqlite3VListNumToName(tls *libc.TLS, pIn uintptr, iVal int32) uintptr { var i int32 var mx int32 if pIn == uintptr(0) { return uintptr(0) } mx = *(*VList)(unsafe.Pointer(pIn + 1*4)) i = 2 for __ccgo := true; __ccgo; __ccgo = i < mx { if *(*VList)(unsafe.Pointer(pIn + uintptr(i)*4)) == iVal { return pIn + uintptr(i+2)*4 } i = i + *(*VList)(unsafe.Pointer(pIn + uintptr(i+1)*4)) } return uintptr(0) } // Return the number of the variable named zName, if it is in VList. // or return 0 if there is no such variable. func Xsqlite3VListNameToNum(tls *libc.TLS, pIn uintptr, zName uintptr, nName int32) int32 { var i int32 var mx int32 if pIn == uintptr(0) { return 0 } mx = *(*VList)(unsafe.Pointer(pIn + 1*4)) i = 2 for __ccgo := true; __ccgo; __ccgo = i < mx { var z uintptr = pIn + uintptr(i+2)*4 if libc.Xstrncmp(tls, z, zName, uint64(nName)) == 0 && int32(*(*int8)(unsafe.Pointer(z + uintptr(nName)))) == 0 { return *(*VList)(unsafe.Pointer(pIn + uintptr(i)*4)) } i = i + *(*VList)(unsafe.Pointer(pIn + uintptr(i+1)*4)) } return 0 } // Turn bulk memory into a hash table object by initializing the // fields of the Hash structure. // // "pNew" is a pointer to the hash table that is to be initialized. func Xsqlite3HashInit(tls *libc.TLS, pNew uintptr) { (*Hash)(unsafe.Pointer(pNew)).Ffirst = uintptr(0) (*Hash)(unsafe.Pointer(pNew)).Fcount = uint32(0) (*Hash)(unsafe.Pointer(pNew)).Fhtsize = uint32(0) (*Hash)(unsafe.Pointer(pNew)).Fht = uintptr(0) } // Remove all entries from a hash table. Reclaim all memory. // Call this routine to delete a hash table or to reset a hash table // to the empty state. func Xsqlite3HashClear(tls *libc.TLS, pH uintptr) { var elem uintptr elem = (*Hash)(unsafe.Pointer(pH)).Ffirst (*Hash)(unsafe.Pointer(pH)).Ffirst = uintptr(0) Xsqlite3_free(tls, (*Hash)(unsafe.Pointer(pH)).Fht) (*Hash)(unsafe.Pointer(pH)).Fht = uintptr(0) (*Hash)(unsafe.Pointer(pH)).Fhtsize = uint32(0) for elem != 0 { var next_elem uintptr = (*HashElem)(unsafe.Pointer(elem)).Fnext Xsqlite3_free(tls, elem) elem = next_elem } (*Hash)(unsafe.Pointer(pH)).Fcount = uint32(0) } func strHash(tls *libc.TLS, z uintptr) uint32 { var h uint32 = uint32(0) var c uint8 for int32(libc.AssignUint8(&c, uint8(*(*int8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1)))))) != 0 { h = h + uint32(Xsqlite3UpperToLower[c]) h = h * 0x9e3779b1 } return h } func insertElement(tls *libc.TLS, pH uintptr, pEntry uintptr, pNew uintptr) { var pHead uintptr if pEntry != 0 { if (*_ht)(unsafe.Pointer(pEntry)).Fcount != 0 { pHead = (*_ht)(unsafe.Pointer(pEntry)).Fchain } else { pHead = uintptr(0) } (*_ht)(unsafe.Pointer(pEntry)).Fcount++ (*_ht)(unsafe.Pointer(pEntry)).Fchain = pNew } else { pHead = uintptr(0) } if pHead != 0 { (*HashElem)(unsafe.Pointer(pNew)).Fnext = pHead (*HashElem)(unsafe.Pointer(pNew)).Fprev = (*HashElem)(unsafe.Pointer(pHead)).Fprev if (*HashElem)(unsafe.Pointer(pHead)).Fprev != 0 { (*HashElem)(unsafe.Pointer((*HashElem)(unsafe.Pointer(pHead)).Fprev)).Fnext = pNew } else { (*Hash)(unsafe.Pointer(pH)).Ffirst = pNew } (*HashElem)(unsafe.Pointer(pHead)).Fprev = pNew } else { (*HashElem)(unsafe.Pointer(pNew)).Fnext = (*Hash)(unsafe.Pointer(pH)).Ffirst if (*Hash)(unsafe.Pointer(pH)).Ffirst != 0 { (*HashElem)(unsafe.Pointer((*Hash)(unsafe.Pointer(pH)).Ffirst)).Fprev = pNew } (*HashElem)(unsafe.Pointer(pNew)).Fprev = uintptr(0) (*Hash)(unsafe.Pointer(pH)).Ffirst = pNew } } func rehash(tls *libc.TLS, pH uintptr, new_size uint32) int32 { var new_ht uintptr var elem uintptr var next_elem uintptr if uint64(new_size)*uint64(unsafe.Sizeof(_ht{})) > uint64(SQLITE_MALLOC_SOFT_LIMIT) { new_size = uint32(uint64(SQLITE_MALLOC_SOFT_LIMIT) / uint64(unsafe.Sizeof(_ht{}))) } if new_size == (*Hash)(unsafe.Pointer(pH)).Fhtsize { return 0 } Xsqlite3BeginBenignMalloc(tls) new_ht = Xsqlite3Malloc(tls, uint64(new_size)*uint64(unsafe.Sizeof(_ht{}))) Xsqlite3EndBenignMalloc(tls) if new_ht == uintptr(0) { return 0 } Xsqlite3_free(tls, (*Hash)(unsafe.Pointer(pH)).Fht) (*Hash)(unsafe.Pointer(pH)).Fht = new_ht (*Hash)(unsafe.Pointer(pH)).Fhtsize = libc.AssignUint32(&new_size, uint32(uint64(Xsqlite3MallocSize(tls, new_ht))/uint64(unsafe.Sizeof(_ht{})))) libc.Xmemset(tls, new_ht, 0, uint64(new_size)*uint64(unsafe.Sizeof(_ht{}))) elem = (*Hash)(unsafe.Pointer(pH)).Ffirst (*Hash)(unsafe.Pointer(pH)).Ffirst = uintptr(0) for ; elem != 0; elem = next_elem { var h uint32 = strHash(tls, (*HashElem)(unsafe.Pointer(elem)).FpKey) % new_size next_elem = (*HashElem)(unsafe.Pointer(elem)).Fnext insertElement(tls, pH, new_ht+uintptr(h)*16, elem) } return 1 } func findElementWithHash(tls *libc.TLS, pH uintptr, pKey uintptr, pHash uintptr) uintptr { var elem uintptr var count uint32 var h uint32 if (*Hash)(unsafe.Pointer(pH)).Fht != 0 { var pEntry uintptr h = strHash(tls, pKey) % (*Hash)(unsafe.Pointer(pH)).Fhtsize pEntry = (*Hash)(unsafe.Pointer(pH)).Fht + uintptr(h)*16 elem = (*_ht)(unsafe.Pointer(pEntry)).Fchain count = (*_ht)(unsafe.Pointer(pEntry)).Fcount } else { h = uint32(0) elem = (*Hash)(unsafe.Pointer(pH)).Ffirst count = (*Hash)(unsafe.Pointer(pH)).Fcount } if pHash != 0 { *(*uint32)(unsafe.Pointer(pHash)) = h } for count != 0 { if Xsqlite3StrICmp(tls, (*HashElem)(unsafe.Pointer(elem)).FpKey, pKey) == 0 { return elem } elem = (*HashElem)(unsafe.Pointer(elem)).Fnext count-- } return uintptr(unsafe.Pointer(&nullElement)) } var nullElement = HashElem{} func removeElementGivenHash(tls *libc.TLS, pH uintptr, elem uintptr, h uint32) { var pEntry uintptr if (*HashElem)(unsafe.Pointer(elem)).Fprev != 0 { (*HashElem)(unsafe.Pointer((*HashElem)(unsafe.Pointer(elem)).Fprev)).Fnext = (*HashElem)(unsafe.Pointer(elem)).Fnext } else { (*Hash)(unsafe.Pointer(pH)).Ffirst = (*HashElem)(unsafe.Pointer(elem)).Fnext } if (*HashElem)(unsafe.Pointer(elem)).Fnext != 0 { (*HashElem)(unsafe.Pointer((*HashElem)(unsafe.Pointer(elem)).Fnext)).Fprev = (*HashElem)(unsafe.Pointer(elem)).Fprev } if (*Hash)(unsafe.Pointer(pH)).Fht != 0 { pEntry = (*Hash)(unsafe.Pointer(pH)).Fht + uintptr(h)*16 if (*_ht)(unsafe.Pointer(pEntry)).Fchain == elem { (*_ht)(unsafe.Pointer(pEntry)).Fchain = (*HashElem)(unsafe.Pointer(elem)).Fnext } (*_ht)(unsafe.Pointer(pEntry)).Fcount-- } Xsqlite3_free(tls, elem) (*Hash)(unsafe.Pointer(pH)).Fcount-- if (*Hash)(unsafe.Pointer(pH)).Fcount == uint32(0) { Xsqlite3HashClear(tls, pH) } } // Attempt to locate an element of the hash table pH with a key // that matches pKey. Return the data for this element if it is // found, or NULL if there is no match. func Xsqlite3HashFind(tls *libc.TLS, pH uintptr, pKey uintptr) uintptr { return (*HashElem)(unsafe.Pointer(findElementWithHash(tls, pH, pKey, uintptr(0)))).Fdata } // Insert an element into the hash table pH. The key is pKey // and the data is "data". // // If no element exists with a matching key, then a new // element is created and NULL is returned. // // If another element already exists with the same key, then the // new data replaces the old data and the old data is returned. // The key is not copied in this instance. If a malloc fails, then // the new data is returned and the hash table is unchanged. // // If the "data" parameter to this function is NULL, then the // element corresponding to "key" is removed from the hash table. func Xsqlite3HashInsert(tls *libc.TLS, pH uintptr, pKey uintptr, data uintptr) uintptr { bp := tls.Alloc(4) defer tls.Free(4) var elem uintptr var new_elem uintptr elem = findElementWithHash(tls, pH, pKey, bp) if (*HashElem)(unsafe.Pointer(elem)).Fdata != 0 { var old_data uintptr = (*HashElem)(unsafe.Pointer(elem)).Fdata if data == uintptr(0) { removeElementGivenHash(tls, pH, elem, *(*uint32)(unsafe.Pointer(bp))) } else { (*HashElem)(unsafe.Pointer(elem)).Fdata = data (*HashElem)(unsafe.Pointer(elem)).FpKey = pKey } return old_data } if data == uintptr(0) { return uintptr(0) } new_elem = Xsqlite3Malloc(tls, uint64(unsafe.Sizeof(HashElem{}))) if new_elem == uintptr(0) { return data } (*HashElem)(unsafe.Pointer(new_elem)).FpKey = pKey (*HashElem)(unsafe.Pointer(new_elem)).Fdata = data (*Hash)(unsafe.Pointer(pH)).Fcount++ if (*Hash)(unsafe.Pointer(pH)).Fcount >= uint32(10) && (*Hash)(unsafe.Pointer(pH)).Fcount > uint32(2)*(*Hash)(unsafe.Pointer(pH)).Fhtsize { if rehash(tls, pH, (*Hash)(unsafe.Pointer(pH)).Fcount*uint32(2)) != 0 { *(*uint32)(unsafe.Pointer(bp)) = strHash(tls, pKey) % (*Hash)(unsafe.Pointer(pH)).Fhtsize } } insertElement(tls, pH, func() uintptr { if (*Hash)(unsafe.Pointer(pH)).Fht != 0 { return (*Hash)(unsafe.Pointer(pH)).Fht + uintptr(*(*uint32)(unsafe.Pointer(bp)))*16 } return uintptr(0) }(), new_elem) return uintptr(0) } // ************* End of hash.c *********************************************** // ************* Begin file opcodes.c **************************************** // Automatically generated. Do not edit // See the tool/mkopcodec.tcl script for details. func Xsqlite3OpcodeName(tls *libc.TLS, i int32) uintptr { return azName[i] } var azName = [187]uintptr{ ts + 1673, ts + 1683, ts + 1694, ts + 1706, ts + 1717, ts + 1729, ts + 1736, ts + 1744, ts + 1752, ts + 1757, ts + 1762, ts + 1768, ts + 1782, ts + 1788, ts + 1798, ts + 1803, ts + 1808, ts + 1811, ts + 1817, ts + 1824, ts + 1828, ts + 1838, ts + 1845, ts + 1852, ts + 1859, ts + 1866, ts + 1876, ts + 1885, ts + 1896, ts + 1905, ts + 1911, ts + 1921, ts + 1931, ts + 1936, ts + 1946, ts + 1957, ts + 1962, ts + 1969, ts + 1980, ts + 1985, ts + 1990, ts + 1996, ts + 2002, ts + 2008, ts + 2011, ts + 2015, ts + 2021, ts + 2032, ts + 2043, ts + 2051, ts + 2060, ts + 2067, ts + 2075, ts + 2078, ts + 2081, ts + 2084, ts + 2087, ts + 2090, ts + 2093, ts + 2100, ts + 2106, ts + 2116, ts + 2129, ts + 2140, ts + 2146, ts + 2153, ts + 2162, ts + 2171, ts + 2178, ts + 2191, ts + 2202, ts + 2207, ts + 2215, ts + 2221, ts + 2228, ts + 2240, ts + 2245, ts + 2254, ts + 2259, ts + 2268, ts + 2273, ts + 2278, ts + 2284, ts + 2292, ts + 2300, ts + 2310, ts + 2318, ts + 2325, ts + 2338, ts + 2343, ts + 2355, ts + 2363, ts + 2370, ts + 2381, ts + 2388, ts + 2395, ts + 2405, ts + 2414, ts + 2425, ts + 2431, ts + 2442, ts + 2452, ts + 2462, ts + 2469, ts + 2475, ts + 2485, ts + 2496, ts + 2500, ts + 2509, ts + 2518, ts + 2525, ts + 2535, ts + 2542, ts + 2551, ts + 2561, ts + 2568, ts + 2576, ts + 2590, ts + 2598, ts + 2612, ts + 2623, ts + 2636, ts + 2647, ts + 2653, ts + 2665, ts + 2674, ts + 2682, ts + 2691, ts + 2700, ts + 2707, ts + 2715, ts + 2722, ts + 2733, ts + 2747, ts + 2758, ts + 2766, ts + 2772, ts + 2780, ts + 2788, ts + 2798, ts + 2811, ts + 2821, ts + 2834, ts + 2843, ts + 2854, ts + 2862, ts + 2868, ts + 2880, ts + 2892, ts + 2900, ts + 2912, ts + 2925, ts + 2935, ts + 2945, ts + 2950, ts + 2962, ts + 2974, ts + 2984, ts + 2990, ts + 3000, ts + 3007, ts + 3019, ts + 3030, ts + 3038, ts + 3047, ts + 3056, ts + 3065, ts + 3072, ts + 3083, ts + 3096, ts + 3106, ts + 3113, ts + 3121, ts + 3130, ts + 3136, ts + 3144, ts + 3152, ts + 3160, ts + 3170, ts + 3179, ts + 3190, ts + 3200, ts + 3206, ts + 3217, ts + 3228, ts + 3233, ts + 3241, } type winShm = struct { FpShmNode uintptr FpNext uintptr FhasMutex U8 F__ccgo_pad1 [1]byte FsharedMask U16 FexclMask U16 F__ccgo_pad2 [2]byte } // Forward references to structures used for WAL type WinShm = winShm type winShmNode = struct { Fmutex uintptr FzFilename uintptr FhFile WinFile FszRegion int32 FnRegion int32 FisReadonly U8 FisUnlocked U8 F__ccgo_pad1 [6]byte FaRegion uintptr FlastErrno DWORD FnRef int32 FpFirst uintptr FpNext uintptr } // A connection to shared-memory type WinShmNode = winShmNode type winFile = struct { FpMethod uintptr FpVfs uintptr Fh HANDLE Flocktype U8 F__ccgo_pad1 [1]byte FsharedLockByte int16 FctrlFlags U8 F__ccgo_pad2 [3]byte FlastErrno DWORD F__ccgo_pad3 [4]byte FpShm uintptr FzPath uintptr FszChunk int32 FnFetchOut int32 FhMap HANDLE FpMapRegion uintptr FmmapSize Sqlite3_int64 FmmapSizeMax Sqlite3_int64 } // The winFile structure is a subclass of sqlite3_file* specific to the win32 // portability layer. type WinFile = winFile type winVfsAppData = struct { FpMethod uintptr FpAppData uintptr FbNoLock WINBOOL F__ccgo_pad1 [4]byte } // The winVfsAppData structure is used for the pAppData member for all of the // Win32 VFS variants. type WinVfsAppData = winVfsAppData var sqlite3_os_type LONG = 0 type win_syscall = struct { FzName uintptr FpCurrent Sqlite3_syscall_ptr FpDefault Sqlite3_syscall_ptr } var aSyscall = [80]win_syscall{ {FzName: ts + 3251, FpCurrent: 0}, {FzName: ts + 3267}, {FzName: ts + 3278}, {FzName: ts + 3289, FpCurrent: 0}, {FzName: ts + 3301, FpCurrent: 0}, {FzName: ts + 3313, FpCurrent: 0}, {FzName: ts + 3325, FpCurrent: 0}, {FzName: ts + 3344, FpCurrent: 0}, {FzName: ts + 3363, FpCurrent: 0}, {FzName: ts + 3376, FpCurrent: 0}, {FzName: ts + 3388, FpCurrent: 0}, {FzName: ts + 3400}, {FzName: ts + 3424}, {FzName: ts + 3445, FpCurrent: 0}, {FzName: ts + 3462, FpCurrent: 0}, {FzName: ts + 3477, FpCurrent: 0}, {FzName: ts + 3492, FpCurrent: 0}, {FzName: ts + 3504, FpCurrent: 0}, {FzName: ts + 3524, FpCurrent: 0}, {FzName: ts + 3542, FpCurrent: 0}, {FzName: ts + 3560, FpCurrent: 0}, {FzName: ts + 3579, FpCurrent: 0}, {FzName: ts + 3598, FpCurrent: 0}, {FzName: ts + 3619, FpCurrent: 0}, {FzName: ts + 3631, FpCurrent: 0}, {FzName: ts + 3648, FpCurrent: 0}, {FzName: ts + 3665, FpCurrent: 0}, {FzName: ts + 3678, FpCurrent: 0}, {FzName: ts + 3694, FpCurrent: 0}, {FzName: ts + 3708, FpCurrent: 0}, {FzName: ts + 3722, FpCurrent: 0}, {FzName: ts + 3746, FpCurrent: 0}, {FzName: ts + 3759, FpCurrent: 0}, {FzName: ts + 3772, FpCurrent: 0}, {FzName: ts + 3785, FpCurrent: 0}, {FzName: ts + 3799, FpCurrent: 0}, {FzName: ts + 3813, FpCurrent: 0}, {FzName: ts + 3823, FpCurrent: 0}, {FzName: ts + 3834, FpCurrent: 0}, {FzName: ts + 3846, FpCurrent: 0}, {FzName: ts + 3855, FpCurrent: 0}, {FzName: ts + 3867, FpCurrent: 0}, {FzName: ts + 3876, FpCurrent: 0}, {FzName: ts + 3889, FpCurrent: 0}, {FzName: ts + 3901, FpCurrent: 0}, {FzName: ts + 3914, FpCurrent: 0}, {FzName: ts + 3927, FpCurrent: 0}, {FzName: ts + 3937, FpCurrent: 0}, {FzName: ts + 3946, FpCurrent: 0}, {FzName: ts + 3957, FpCurrent: 0}, {FzName: ts + 3971, FpCurrent: 0}, {FzName: ts + 3991, FpCurrent: 0}, {FzName: ts + 4015, FpCurrent: 0}, {FzName: ts + 4024, FpCurrent: 0}, {FzName: ts + 4037, FpCurrent: 0}, {FzName: ts + 4052, FpCurrent: 0}, {FzName: ts + 4058, FpCurrent: 0}, {FzName: ts + 4079, FpCurrent: 0}, {FzName: ts + 4090, FpCurrent: 0}, {FzName: ts + 4103, FpCurrent: 0}, {FzName: ts + 4119, FpCurrent: 0}, {FzName: ts + 4139, FpCurrent: 0}, {FzName: ts + 4149}, {FzName: ts + 4164, FpCurrent: 0}, {FzName: ts + 4184, FpCurrent: 0}, {FzName: ts + 4206}, {FzName: ts + 4223}, {FzName: ts + 4252}, {FzName: ts + 4273}, {FzName: ts + 4285}, {FzName: ts + 4305}, {FzName: ts + 4320}, {FzName: ts + 4340, FpCurrent: 0}, {FzName: ts + 4359, FpCurrent: 0}, {FzName: ts + 4378, FpCurrent: 0}, {FzName: ts + 4393}, {FzName: ts + 4418}, {FzName: ts + 4445}, {FzName: ts + 4456}, {FzName: ts + 4477, FpCurrent: 0}, } func winSetSystemCall(tls *libc.TLS, pNotUsed uintptr, zName uintptr, pNewFunc Sqlite3_syscall_ptr) int32 { var i uint32 var rc int32 = SQLITE_NOTFOUND _ = pNotUsed if zName == uintptr(0) { rc = SQLITE_OK for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(aSyscall))/uint64(unsafe.Sizeof(win_syscall{})); i++ { if aSyscall[i].FpDefault != 0 { aSyscall[i].FpCurrent = aSyscall[i].FpDefault } } } else { for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(aSyscall))/uint64(unsafe.Sizeof(win_syscall{})); i++ { if libc.Xstrcmp(tls, zName, aSyscall[i].FzName) == 0 { if aSyscall[i].FpDefault == uintptr(0) { aSyscall[i].FpDefault = aSyscall[i].FpCurrent } rc = SQLITE_OK if pNewFunc == uintptr(0) { pNewFunc = aSyscall[i].FpDefault } aSyscall[i].FpCurrent = pNewFunc break } } } return rc } func winGetSystemCall(tls *libc.TLS, pNotUsed uintptr, zName uintptr) Sqlite3_syscall_ptr { var i uint32 _ = pNotUsed for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(aSyscall))/uint64(unsafe.Sizeof(win_syscall{})); i++ { if libc.Xstrcmp(tls, zName, aSyscall[i].FzName) == 0 { return aSyscall[i].FpCurrent } } return uintptr(0) } func winNextSystemCall(tls *libc.TLS, p uintptr, zName uintptr) uintptr { var i int32 = -1 _ = p if zName != 0 { for i = 0; i < int32(uint64(unsafe.Sizeof(aSyscall))/uint64(unsafe.Sizeof(win_syscall{})))-1; i++ { if libc.Xstrcmp(tls, zName, aSyscall[i].FzName) == 0 { break } } } for i++; i < int32(uint64(unsafe.Sizeof(aSyscall))/uint64(unsafe.Sizeof(win_syscall{}))); i++ { if aSyscall[i].FpCurrent != uintptr(0) { return aSyscall[i].FzName } } return uintptr(0) } func Xsqlite3_win32_write_debug(tls *libc.TLS, zBuf uintptr, nBuf int32) { bp := tls.Alloc(4092) defer tls.Free(4092) var nMin int32 = func() int32 { if nBuf < int32(uint64(4096)-uint64(unsafe.Sizeof(DWORD(0))))-1 { return nBuf } return int32(uint64(4096)-uint64(unsafe.Sizeof(DWORD(0)))) - 1 }() if nMin < -1 { nMin = -1 } if nMin > 0 { libc.Xmemset(tls, bp, 0, uint64(int32(uint64(4096)-uint64(unsafe.Sizeof(DWORD(0)))))) libc.Xmemcpy(tls, bp, zBuf, uint64(nMin)) (*(*func(*libc.TLS, LPCSTR))(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 72*24 + 8)))(tls, bp) } else { (*(*func(*libc.TLS, LPCSTR))(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 72*24 + 8)))(tls, zBuf) } } func Xsqlite3_win32_sleep(tls *libc.TLS, milliseconds DWORD) { (*(*func(*libc.TLS, DWORD))(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 55*24 + 8)))(tls, milliseconds) } func Xsqlite3Win32Wait(tls *libc.TLS, hObject HANDLE) DWORD { var rc DWORD for libc.AssignUint32(&rc, (*(*func(*libc.TLS, HANDLE, DWORD, WINBOOL) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 64*24 + 8)))(tls, hObject, INFINITE, TRUE)) == DWORD(0x000000C0) { } return rc } // This function determines if the machine is running a version of Windows // based on the NT kernel. func Xsqlite3_win32_is_nt(tls *libc.TLS) int32 { bp := tls.Alloc(148) defer tls.Free(148) if libc.X_InterlockedCompareExchange(tls, uintptr(unsafe.Pointer(&sqlite3_os_type)), 0, 0) == 0 { (*OSVERSIONINFOA)(unsafe.Pointer(bp)).FdwOSVersionInfoSize = DWORD(unsafe.Sizeof(OSVERSIONINFOA{})) (*(*func(*libc.TLS, LPOSVERSIONINFOA) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 34*24 + 8)))(tls, bp) libc.X_InterlockedCompareExchange(tls, uintptr(unsafe.Pointer(&sqlite3_os_type)), func() int32 { if (*OSVERSIONINFOA)(unsafe.Pointer(bp)).FdwPlatformId == DWORD(VER_PLATFORM_WIN32_NT) { return 2 } return 1 }(), 0) } return libc.Bool32(libc.X_InterlockedCompareExchange(tls, uintptr(unsafe.Pointer(&sqlite3_os_type)), 2, 2) == 2) } func winUtf8ToUnicode(tls *libc.TLS, zText uintptr) LPWSTR { var nChar int32 var zWideText LPWSTR nChar = (*(*func(*libc.TLS, UINT, DWORD, LPCSTR, int32, LPWSTR, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 50*24 + 8)))(tls, uint32(CP_UTF8), uint32(0), zText, -1, uintptr(0), 0) if nChar == 0 { return uintptr(0) } zWideText = Xsqlite3MallocZero(tls, uint64(nChar)*uint64(unsafe.Sizeof(WCHAR(0)))) if zWideText == uintptr(0) { return uintptr(0) } nChar = (*(*func(*libc.TLS, UINT, DWORD, LPCSTR, int32, LPWSTR, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 50*24 + 8)))(tls, uint32(CP_UTF8), uint32(0), zText, -1, zWideText, nChar) if nChar == 0 { Xsqlite3_free(tls, zWideText) zWideText = uintptr(0) } return zWideText } func winUnicodeToUtf8(tls *libc.TLS, zWideText LPCWSTR) uintptr { var nByte int32 var zText uintptr nByte = (*(*func(*libc.TLS, UINT, DWORD, LPCWSTR, int32, LPSTR, int32, LPCSTR, LPBOOL) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 60*24 + 8)))(tls, uint32(CP_UTF8), uint32(0), zWideText, -1, uintptr(0), 0, uintptr(0), uintptr(0)) if nByte == 0 { return uintptr(0) } zText = Xsqlite3MallocZero(tls, uint64(nByte)) if zText == uintptr(0) { return uintptr(0) } nByte = (*(*func(*libc.TLS, UINT, DWORD, LPCWSTR, int32, LPSTR, int32, LPCSTR, LPBOOL) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 60*24 + 8)))(tls, uint32(CP_UTF8), uint32(0), zWideText, -1, zText, nByte, uintptr(0), uintptr(0)) if nByte == 0 { Xsqlite3_free(tls, zText) zText = uintptr(0) } return zText } func winMbcsToUnicode(tls *libc.TLS, zText uintptr, useAnsi int32) LPWSTR { var nByte int32 var zMbcsText LPWSTR var codepage int32 if useAnsi != 0 { codepage = CP_ACP } else { codepage = CP_OEMCP } nByte = int32(uint64((*(*func(*libc.TLS, UINT, DWORD, LPCSTR, int32, LPWSTR, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 50*24 + 8)))(tls, uint32(codepage), uint32(0), zText, -1, uintptr(0), 0)) * uint64(unsafe.Sizeof(WCHAR(0)))) if nByte == 0 { return uintptr(0) } zMbcsText = Xsqlite3MallocZero(tls, uint64(nByte)*uint64(unsafe.Sizeof(WCHAR(0)))) if zMbcsText == uintptr(0) { return uintptr(0) } nByte = (*(*func(*libc.TLS, UINT, DWORD, LPCSTR, int32, LPWSTR, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 50*24 + 8)))(tls, uint32(codepage), uint32(0), zText, -1, zMbcsText, nByte) if nByte == 0 { Xsqlite3_free(tls, zMbcsText) zMbcsText = uintptr(0) } return zMbcsText } func winUnicodeToMbcs(tls *libc.TLS, zWideText LPCWSTR, useAnsi int32) uintptr { var nByte int32 var zText uintptr var codepage int32 if useAnsi != 0 { codepage = CP_ACP } else { codepage = CP_OEMCP } nByte = (*(*func(*libc.TLS, UINT, DWORD, LPCWSTR, int32, LPSTR, int32, LPCSTR, LPBOOL) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 60*24 + 8)))(tls, uint32(codepage), uint32(0), zWideText, -1, uintptr(0), 0, uintptr(0), uintptr(0)) if nByte == 0 { return uintptr(0) } zText = Xsqlite3MallocZero(tls, uint64(nByte)) if zText == uintptr(0) { return uintptr(0) } nByte = (*(*func(*libc.TLS, UINT, DWORD, LPCWSTR, int32, LPSTR, int32, LPCSTR, LPBOOL) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 60*24 + 8)))(tls, uint32(codepage), uint32(0), zWideText, -1, zText, nByte, uintptr(0), uintptr(0)) if nByte == 0 { Xsqlite3_free(tls, zText) zText = uintptr(0) } return zText } func winMbcsToUtf8(tls *libc.TLS, zText uintptr, useAnsi int32) uintptr { var zTextUtf8 uintptr var zTmpWide LPWSTR zTmpWide = winMbcsToUnicode(tls, zText, useAnsi) if zTmpWide == uintptr(0) { return uintptr(0) } zTextUtf8 = winUnicodeToUtf8(tls, zTmpWide) Xsqlite3_free(tls, zTmpWide) return zTextUtf8 } func winUtf8ToMbcs(tls *libc.TLS, zText uintptr, useAnsi int32) uintptr { var zTextMbcs uintptr var zTmpWide LPWSTR zTmpWide = winUtf8ToUnicode(tls, zText) if zTmpWide == uintptr(0) { return uintptr(0) } zTextMbcs = winUnicodeToMbcs(tls, zTmpWide, useAnsi) Xsqlite3_free(tls, zTmpWide) return zTextMbcs } // This is a public wrapper for the winUtf8ToUnicode() function. func Xsqlite3_win32_utf8_to_unicode(tls *libc.TLS, zText uintptr) LPWSTR { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return winUtf8ToUnicode(tls, zText) } // This is a public wrapper for the winUnicodeToUtf8() function. func Xsqlite3_win32_unicode_to_utf8(tls *libc.TLS, zWideText LPCWSTR) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return winUnicodeToUtf8(tls, zWideText) } // This is a public wrapper for the winMbcsToUtf8() function. func Xsqlite3_win32_mbcs_to_utf8(tls *libc.TLS, zText uintptr) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return winMbcsToUtf8(tls, zText, (*(*func(*libc.TLS) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 8)))(tls)) } // This is a public wrapper for the winMbcsToUtf8() function. func Xsqlite3_win32_mbcs_to_utf8_v2(tls *libc.TLS, zText uintptr, useAnsi int32) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return winMbcsToUtf8(tls, zText, useAnsi) } // This is a public wrapper for the winUtf8ToMbcs() function. func Xsqlite3_win32_utf8_to_mbcs(tls *libc.TLS, zText uintptr) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return winUtf8ToMbcs(tls, zText, (*(*func(*libc.TLS) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 8)))(tls)) } // This is a public wrapper for the winUtf8ToMbcs() function. func Xsqlite3_win32_utf8_to_mbcs_v2(tls *libc.TLS, zText uintptr, useAnsi int32) uintptr { if Xsqlite3_initialize(tls) != 0 { return uintptr(0) } return winUtf8ToMbcs(tls, zText, useAnsi) } // This function is the same as sqlite3_win32_set_directory (below); however, // it accepts a UTF-8 string. func Xsqlite3_win32_set_directory8(tls *libc.TLS, type1 uint32, zValue uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var ppDirectory uintptr var rc int32 var zCopy uintptr ppDirectory = uintptr(0) rc = Xsqlite3_initialize(tls) if !(rc != 0) { goto __1 } return rc __1: ; Xsqlite3_mutex_enter(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) if !(type1 == uint32(SQLITE_WIN32_DATA_DIRECTORY_TYPE)) { goto __2 } ppDirectory = uintptr(unsafe.Pointer(&Xsqlite3_data_directory)) goto __3 __2: if !(type1 == uint32(SQLITE_WIN32_TEMP_DIRECTORY_TYPE)) { goto __4 } ppDirectory = uintptr(unsafe.Pointer(&Xsqlite3_temp_directory)) __4: ; __3: ; if !(ppDirectory != 0) { goto __5 } zCopy = uintptr(0) if !(zValue != 0 && *(*int8)(unsafe.Pointer(zValue)) != 0) { goto __7 } zCopy = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, zValue)) if !(zCopy == uintptr(0)) { goto __8 } rc = SQLITE_NOMEM goto set_directory8_done __8: ; __7: ; Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(ppDirectory))) *(*uintptr)(unsafe.Pointer(ppDirectory)) = zCopy rc = SQLITE_OK goto __6 __5: rc = SQLITE_ERROR __6: ; set_directory8_done: Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) return rc } // This function is the same as sqlite3_win32_set_directory (below); however, // it accepts a UTF-16 string. func Xsqlite3_win32_set_directory16(tls *libc.TLS, type1 uint32, zValue uintptr) int32 { var rc int32 var zUtf8 uintptr = uintptr(0) if zValue != 0 { zUtf8 = Xsqlite3_win32_unicode_to_utf8(tls, zValue) if zUtf8 == uintptr(0) { return SQLITE_NOMEM } } rc = Xsqlite3_win32_set_directory8(tls, type1, zUtf8) if zUtf8 != 0 { Xsqlite3_free(tls, zUtf8) } return rc } // This function sets the data directory or the temporary directory based on // the provided arguments. The type argument must be 1 in order to set the // data directory or 2 in order to set the temporary directory. The zValue // argument is the name of the directory to use. The return value will be // SQLITE_OK if successful. func Xsqlite3_win32_set_directory(tls *libc.TLS, type1 uint32, zValue uintptr) int32 { return Xsqlite3_win32_set_directory16(tls, type1, zValue) } func winGetLastErrorMsg(tls *libc.TLS, lastErrno DWORD, nBuf int32, zBuf uintptr) int32 { bp := tls.Alloc(40) defer tls.Free(40) var dwLen DWORD = DWORD(0) var zOut uintptr = uintptr(0) if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { *(*LPWSTR)(unsafe.Pointer(bp + 24)) = uintptr(0) dwLen = (*(*func(*libc.TLS, DWORD, LPCVOID, DWORD, DWORD, LPWSTR, DWORD, uintptr) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 15*24 + 8)))(tls, uint32(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS), uintptr(0), lastErrno, uint32(0), bp+24, uint32(0), uintptr(0)) if dwLen > DWORD(0) { Xsqlite3BeginBenignMalloc(tls) zOut = winUnicodeToUtf8(tls, *(*LPWSTR)(unsafe.Pointer(bp + 24))) Xsqlite3EndBenignMalloc(tls) (*(*func(*libc.TLS, HLOCAL) HLOCAL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 46*24 + 8)))(tls, *(*LPWSTR)(unsafe.Pointer(bp + 24))) } } else { *(*uintptr)(unsafe.Pointer(bp + 32)) = uintptr(0) dwLen = (*(*func(*libc.TLS, DWORD, LPCVOID, DWORD, DWORD, LPSTR, DWORD, uintptr) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 14*24 + 8)))(tls, uint32(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS), uintptr(0), lastErrno, uint32(0), bp+32, uint32(0), uintptr(0)) if dwLen > DWORD(0) { Xsqlite3BeginBenignMalloc(tls) zOut = winMbcsToUtf8(tls, *(*uintptr)(unsafe.Pointer(bp + 32)), (*(*func(*libc.TLS) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 8)))(tls)) Xsqlite3EndBenignMalloc(tls) (*(*func(*libc.TLS, HLOCAL) HLOCAL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 46*24 + 8)))(tls, *(*uintptr)(unsafe.Pointer(bp + 32))) } } if DWORD(0) == dwLen { Xsqlite3_snprintf(tls, nBuf, zBuf, ts+4496, libc.VaList(bp, lastErrno, lastErrno)) } else { Xsqlite3_snprintf(tls, nBuf, zBuf, ts+4493, libc.VaList(bp+16, zOut)) Xsqlite3_free(tls, zOut) } return 0 } func winLogErrorAtLine(tls *libc.TLS, errcode int32, lastErrno DWORD, zFunc uintptr, zPath uintptr, iLine int32) int32 { bp := tls.Alloc(540) defer tls.Free(540) var i int32 *(*int8)(unsafe.Pointer(bp + 40)) = int8(0) winGetLastErrorMsg(tls, lastErrno, int32(unsafe.Sizeof([500]int8{})), bp+40) if zPath == uintptr(0) { zPath = ts + 1544 } for i = 0; *(*int8)(unsafe.Pointer(bp + 40 + uintptr(i))) != 0 && int32(*(*int8)(unsafe.Pointer(bp + 40 + uintptr(i)))) != '\r' && int32(*(*int8)(unsafe.Pointer(bp + 40 + uintptr(i)))) != '\n'; i++ { } *(*int8)(unsafe.Pointer(bp + 40 + uintptr(i))) = int8(0) Xsqlite3_log(tls, errcode, ts+4516, libc.VaList(bp, iLine, lastErrno, zFunc, zPath, bp+40)) return errcode } var winIoerrRetry int32 = SQLITE_WIN32_IOERR_RETRY var winIoerrRetryDelay int32 = SQLITE_WIN32_IOERR_RETRY_DELAY func winRetryIoerr(tls *libc.TLS, pnRetry uintptr, pError uintptr) int32 { var e DWORD = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) if *(*int32)(unsafe.Pointer(pnRetry)) >= winIoerrRetry { if pError != 0 { *(*DWORD)(unsafe.Pointer(pError)) = e } return 0 } if e == DWORD(5) || e == DWORD(32) || e == DWORD(33) || e == DWORD(55) || e == DWORD(64) || e == DWORD(121) || e == DWORD(1231) { Xsqlite3_win32_sleep(tls, uint32(winIoerrRetryDelay*(1+*(*int32)(unsafe.Pointer(pnRetry))))) *(*int32)(unsafe.Pointer(pnRetry))++ return 1 } if pError != 0 { *(*DWORD)(unsafe.Pointer(pError)) = e } return 0 } func winLogIoerr(tls *libc.TLS, nRetry int32, lineno int32) { bp := tls.Alloc(16) defer tls.Free(16) if nRetry != 0 { Xsqlite3_log(tls, SQLITE_NOTICE, ts+4547, libc.VaList(bp, winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno)) } } func winLockFile(tls *libc.TLS, phFile LPHANDLE, flags DWORD, offsetLow DWORD, offsetHigh DWORD, numBytesLow DWORD, numBytesHigh DWORD) WINBOOL { bp := tls.Alloc(32) defer tls.Free(32) if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(OVERLAPPED{}))) *(*DWORD)(unsafe.Pointer(bp + 16)) = offsetLow *(*DWORD)(unsafe.Pointer(bp + 20)) = offsetHigh return (*(*func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 48*24 + 8)))(tls, *(*HANDLE)(unsafe.Pointer(phFile)), flags, uint32(0), numBytesLow, numBytesHigh, bp) } else { return (*(*func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, DWORD) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 47*24 + 8)))(tls, *(*HANDLE)(unsafe.Pointer(phFile)), offsetLow, offsetHigh, numBytesLow, numBytesHigh) } return WINBOOL(0) } func winUnlockFile(tls *libc.TLS, phFile LPHANDLE, offsetLow DWORD, offsetHigh DWORD, numBytesLow DWORD, numBytesHigh DWORD) WINBOOL { bp := tls.Alloc(32) defer tls.Free(32) if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(OVERLAPPED{}))) *(*DWORD)(unsafe.Pointer(bp + 16)) = offsetLow *(*DWORD)(unsafe.Pointer(bp + 20)) = offsetHigh return (*(*func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, LPOVERLAPPED) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 58*24 + 8)))(tls, *(*HANDLE)(unsafe.Pointer(phFile)), uint32(0), numBytesLow, numBytesHigh, bp) } else { return (*(*func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, DWORD) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 57*24 + 8)))(tls, *(*HANDLE)(unsafe.Pointer(phFile)), offsetLow, offsetHigh, numBytesLow, numBytesHigh) } return WINBOOL(0) } func winSeekFile(tls *libc.TLS, pFile uintptr, iOffset Sqlite3_int64) int32 { bp := tls.Alloc(4) defer tls.Free(4) var lowerBits LONG var dwRet DWORD var lastErrno DWORD *(*LONG)(unsafe.Pointer(bp)) = LONG(iOffset >> 32 & int64(0x7fffffff)) lowerBits = LONG(iOffset & int64(0xffffffff)) dwRet = (*(*func(*libc.TLS, HANDLE, LONG, PLONG, DWORD) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 54*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).Fh, lowerBits, bp, uint32(FILE_BEGIN)) if dwRet == libc.Uint32(libc.Uint32FromInt32(-1)) && libc.AssignUint32(&lastErrno, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls)) != DWORD(0) { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = lastErrno winLogErrorAtLine(tls, SQLITE_IOERR|int32(22)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4597, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 47688) return 1 } return 0 } func winClose(tls *libc.TLS, id uintptr) int32 { var rc int32 var cnt int32 = 0 var pFile uintptr = id winUnmapfile(tls, pFile) for __ccgo := true; __ccgo; __ccgo = rc == 0 && libc.PreIncInt32(&cnt, 1) < MX_CLOSE_ATTEMPT && func() bool { Xsqlite3_win32_sleep(tls, uint32(100)); return 1 != 0 }() { rc = (*(*func(*libc.TLS, HANDLE) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 3*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).Fh) } if rc != 0 { (*WinFile)(unsafe.Pointer(pFile)).Fh = uintptr(0) } if rc != 0 { return SQLITE_OK } return winLogErrorAtLine(tls, SQLITE_IOERR|int32(16)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+4609, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 47784) } func winRead(tls *libc.TLS, id uintptr, pBuf uintptr, amt int32, offset Sqlite3_int64) int32 { bp := tls.Alloc(44) defer tls.Free(44) var pFile uintptr = id *(*int32)(unsafe.Pointer(bp + 36)) = 0 if offset < (*WinFile)(unsafe.Pointer(pFile)).FmmapSize { if offset+Sqlite3_int64(amt) <= (*WinFile)(unsafe.Pointer(pFile)).FmmapSize { libc.Xmemcpy(tls, pBuf, (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion+uintptr(offset), uint64(amt)) return SQLITE_OK } else { var nCopy int32 = int32((*WinFile)(unsafe.Pointer(pFile)).FmmapSize - offset) libc.Xmemcpy(tls, pBuf, (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion+uintptr(offset), uint64(nCopy)) pBuf = pBuf + uintptr(nCopy) amt = amt - nCopy offset = offset + Sqlite3_int64(nCopy) } } libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(OVERLAPPED{}))) *(*DWORD)(unsafe.Pointer(bp + 16)) = DWORD(LONG(offset & int64(0xffffffff))) *(*DWORD)(unsafe.Pointer(bp + 20)) = DWORD(LONG(offset >> 32 & int64(0x7fffffff))) for !((*(*func(*libc.TLS, HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 52*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).Fh, pBuf, uint32(amt), bp+32, bp) != 0) && (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) != DWORD(38) { if winRetryIoerr(tls, bp+36, bp+40) != 0 { continue } (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = *(*DWORD)(unsafe.Pointer(bp + 40)) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(1)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4618, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 47852) } winLogIoerr(tls, *(*int32)(unsafe.Pointer(bp + 36)), 47855) if *(*DWORD)(unsafe.Pointer(bp + 32)) < DWORD(amt) { libc.Xmemset(tls, pBuf+uintptr(*(*DWORD)(unsafe.Pointer(bp + 32))), 0, uint64(DWORD(amt)-*(*DWORD)(unsafe.Pointer(bp + 32)))) return SQLITE_IOERR | int32(2)<<8 } return SQLITE_OK } func winWrite(tls *libc.TLS, id uintptr, pBuf uintptr, amt int32, offset Sqlite3_int64) int32 { bp := tls.Alloc(44) defer tls.Free(44) var rc int32 = 0 var pFile uintptr = id *(*int32)(unsafe.Pointer(bp + 36)) = 0 { var aRem uintptr = pBuf var nRem int32 = amt *(*DWORD)(unsafe.Pointer(bp + 40)) = DWORD(0) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(OVERLAPPED{}))) *(*DWORD)(unsafe.Pointer(bp + 16)) = DWORD(LONG(offset & int64(0xffffffff))) *(*DWORD)(unsafe.Pointer(bp + 20)) = DWORD(LONG(offset >> 32 & int64(0x7fffffff))) for nRem > 0 { if !((*(*func(*libc.TLS, HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 61*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).Fh, aRem, uint32(nRem), bp+32, bp) != 0) { if winRetryIoerr(tls, bp+36, bp+40) != 0 { continue } break } if *(*DWORD)(unsafe.Pointer(bp + 32)) == DWORD(0) || *(*DWORD)(unsafe.Pointer(bp + 32)) > DWORD(nRem) { *(*DWORD)(unsafe.Pointer(bp + 40)) = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) break } offset = offset + Sqlite3_int64(*(*DWORD)(unsafe.Pointer(bp + 32))) *(*DWORD)(unsafe.Pointer(bp + 16)) = DWORD(LONG(offset & int64(0xffffffff))) *(*DWORD)(unsafe.Pointer(bp + 20)) = DWORD(LONG(offset >> 32 & int64(0x7fffffff))) aRem += uintptr(*(*DWORD)(unsafe.Pointer(bp + 32))) nRem = int32(DWORD(nRem) - *(*DWORD)(unsafe.Pointer(bp + 32))) } if nRem > 0 { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = *(*DWORD)(unsafe.Pointer(bp + 40)) rc = 1 } } if rc != 0 { if (*WinFile)(unsafe.Pointer(pFile)).FlastErrno == DWORD(39) || (*WinFile)(unsafe.Pointer(pFile)).FlastErrno == DWORD(112) { return winLogErrorAtLine(tls, SQLITE_FULL, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4626, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 47964) } return winLogErrorAtLine(tls, SQLITE_IOERR|int32(3)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4636, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 47969) } else { winLogIoerr(tls, *(*int32)(unsafe.Pointer(bp + 36)), 47972) } return SQLITE_OK } func winTruncate(tls *libc.TLS, id uintptr, nByte Sqlite3_int64) int32 { var pFile uintptr = id var rc int32 = SQLITE_OK var lastErrno DWORD var oldMmapSize Sqlite3_int64 if (*WinFile)(unsafe.Pointer(pFile)).FnFetchOut > 0 { return SQLITE_OK } if (*WinFile)(unsafe.Pointer(pFile)).FszChunk > 0 { nByte = (nByte + Sqlite3_int64((*WinFile)(unsafe.Pointer(pFile)).FszChunk) - int64(1)) / Sqlite3_int64((*WinFile)(unsafe.Pointer(pFile)).FszChunk) * Sqlite3_int64((*WinFile)(unsafe.Pointer(pFile)).FszChunk) } if (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion != 0 { oldMmapSize = (*WinFile)(unsafe.Pointer(pFile)).FmmapSize } else { oldMmapSize = int64(0) } winUnmapfile(tls, pFile) if winSeekFile(tls, pFile, nByte) != 0 { rc = winLogErrorAtLine(tls, SQLITE_IOERR|int32(6)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4646, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 48035) } else if 0 == (*(*func(*libc.TLS, HANDLE) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 53*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).Fh) && libc.AssignUint32(&lastErrno, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls)) != DWORD(1224) { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = lastErrno rc = winLogErrorAtLine(tls, SQLITE_IOERR|int32(6)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4659, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 48040) } if rc == SQLITE_OK && oldMmapSize > int64(0) { if oldMmapSize > nByte { winMapfile(tls, pFile, int64(-1)) } else { winMapfile(tls, pFile, oldMmapSize) } } return rc } func winSync(tls *libc.TLS, id uintptr, flags int32) int32 { var rc WINBOOL var pFile uintptr = id _ = flags if (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion != 0 { if (*(*func(*libc.TLS, LPCVOID, SIZE_T) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 79*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion, uint64(0)) != 0 { } else { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(24)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4672, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 48132) } } rc = (*(*func(*libc.TLS, HANDLE) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 13*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).Fh) if rc != 0 { return SQLITE_OK } else { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(4)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4681, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 48147) } return int32(0) } func winFileSize(tls *libc.TLS, id uintptr, pSize uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pFile uintptr = id var rc int32 = SQLITE_OK { var lowerBits DWORD var lastErrno DWORD lowerBits = (*(*func(*libc.TLS, HANDLE, LPDWORD) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 23*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).Fh, bp) *(*Sqlite3_int64)(unsafe.Pointer(pSize)) = Sqlite3_int64(*(*DWORD)(unsafe.Pointer(bp)))<<32 + Sqlite3_int64(lowerBits) if lowerBits == 0xffffffff && libc.AssignUint32(&lastErrno, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls)) != DWORD(0) { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = lastErrno rc = winLogErrorAtLine(tls, SQLITE_IOERR|int32(7)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4690, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 48188) } } return rc } func winGetReadLock(tls *libc.TLS, pFile uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var res int32 if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { res = winLockFile(tls, pFile+16, uint32(LOCKFILE_FAIL_IMMEDIATELY), uint32(Xsqlite3PendingByte+2), uint32(0), uint32(SHARED_SIZE), uint32(0)) } else { Xsqlite3_randomness(tls, int32(unsafe.Sizeof(int32(0))), bp) (*WinFile)(unsafe.Pointer(pFile)).FsharedLockByte = int16(*(*int32)(unsafe.Pointer(bp)) & 0x7fffffff % (SHARED_SIZE - 1)) res = winLockFile(tls, pFile+16, uint32(LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK), uint32(Xsqlite3PendingByte+2+int32((*WinFile)(unsafe.Pointer(pFile)).FsharedLockByte)), uint32(0), uint32(1), uint32(0)) } if res == 0 { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) } return res } func winUnlockReadLock(tls *libc.TLS, pFile uintptr) int32 { var res int32 var lastErrno DWORD if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { res = winUnlockFile(tls, pFile+16, uint32(Xsqlite3PendingByte+2), uint32(0), uint32(SHARED_SIZE), uint32(0)) } else { res = winUnlockFile(tls, pFile+16, uint32(Xsqlite3PendingByte+2+int32((*WinFile)(unsafe.Pointer(pFile)).FsharedLockByte)), uint32(0), uint32(1), uint32(0)) } if res == 0 && libc.AssignUint32(&lastErrno, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls)) != DWORD(158) { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = lastErrno winLogErrorAtLine(tls, SQLITE_IOERR|int32(8)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4702, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 48283) } return res } func winLock(tls *libc.TLS, id uintptr, locktype int32) int32 { var rc int32 = SQLITE_OK var res int32 = 1 var newLocktype int32 var gotPendingLock int32 = 0 var pFile uintptr = id var lastErrno DWORD = DWORD(0) if int32((*WinFile)(unsafe.Pointer(pFile)).Flocktype) >= locktype { return SQLITE_OK } if int32((*WinFile)(unsafe.Pointer(pFile)).FctrlFlags)&WINFILE_RDONLY != 0 && locktype >= RESERVED_LOCK { return SQLITE_IOERR | int32(15)<<8 } newLocktype = int32((*WinFile)(unsafe.Pointer(pFile)).Flocktype) if int32((*WinFile)(unsafe.Pointer(pFile)).Flocktype) == NO_LOCK || locktype == EXCLUSIVE_LOCK && int32((*WinFile)(unsafe.Pointer(pFile)).Flocktype) <= RESERVED_LOCK { var cnt int32 = 3 for libc.PostDecInt32(&cnt, 1) > 0 && libc.AssignInt32(&res, winLockFile(tls, pFile+16, uint32(LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK), uint32(Xsqlite3PendingByte), uint32(0), uint32(1), uint32(0))) == 0 { lastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) if lastErrno == DWORD(6) { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = lastErrno rc = SQLITE_IOERR | int32(15)<<8 return rc } if cnt != 0 { Xsqlite3_win32_sleep(tls, uint32(1)) } } gotPendingLock = res if !(res != 0) { lastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) } } if locktype == SHARED_LOCK && res != 0 { res = winGetReadLock(tls, pFile) if res != 0 { newLocktype = SHARED_LOCK } else { lastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) } } if locktype == RESERVED_LOCK && res != 0 { res = winLockFile(tls, pFile+16, uint32(LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK), uint32(Xsqlite3PendingByte+1), uint32(0), uint32(1), uint32(0)) if res != 0 { newLocktype = RESERVED_LOCK } else { lastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) } } if locktype == EXCLUSIVE_LOCK && res != 0 { newLocktype = PENDING_LOCK gotPendingLock = 0 } if locktype == EXCLUSIVE_LOCK && res != 0 { res = winUnlockReadLock(tls, pFile) res = winLockFile(tls, pFile+16, uint32(LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK), uint32(Xsqlite3PendingByte+2), uint32(0), uint32(SHARED_SIZE), uint32(0)) if res != 0 { newLocktype = EXCLUSIVE_LOCK } else { lastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) winGetReadLock(tls, pFile) } } if gotPendingLock != 0 && locktype == SHARED_LOCK { winUnlockFile(tls, pFile+16, uint32(Xsqlite3PendingByte), uint32(0), uint32(1), uint32(0)) } if res != 0 { rc = SQLITE_OK } else { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = lastErrno rc = SQLITE_BUSY } (*WinFile)(unsafe.Pointer(pFile)).Flocktype = U8(newLocktype) return rc } func winCheckReservedLock(tls *libc.TLS, id uintptr, pResOut uintptr) int32 { var res int32 var pFile uintptr = id if int32((*WinFile)(unsafe.Pointer(pFile)).Flocktype) >= RESERVED_LOCK { res = 1 } else { res = winLockFile(tls, pFile+16, uint32(LOCKFILE_FAIL_IMMEDIATELY), uint32(Xsqlite3PendingByte+1), uint32(0), uint32(1), uint32(0)) if res != 0 { winUnlockFile(tls, pFile+16, uint32(Xsqlite3PendingByte+1), uint32(0), uint32(1), uint32(0)) } res = libc.BoolInt32(!(res != 0)) } *(*int32)(unsafe.Pointer(pResOut)) = res return SQLITE_OK } func winUnlock(tls *libc.TLS, id uintptr, locktype int32) int32 { var type1 int32 var pFile uintptr = id var rc int32 = SQLITE_OK type1 = int32((*WinFile)(unsafe.Pointer(pFile)).Flocktype) if type1 >= EXCLUSIVE_LOCK { winUnlockFile(tls, pFile+16, uint32(Xsqlite3PendingByte+2), uint32(0), uint32(SHARED_SIZE), uint32(0)) if locktype == SHARED_LOCK && !(winGetReadLock(tls, pFile) != 0) { rc = winLogErrorAtLine(tls, SQLITE_IOERR|int32(8)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+4720, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 48509) } } if type1 >= RESERVED_LOCK { winUnlockFile(tls, pFile+16, uint32(Xsqlite3PendingByte+1), uint32(0), uint32(1), uint32(0)) } if locktype == NO_LOCK && type1 >= SHARED_LOCK { winUnlockReadLock(tls, pFile) } if type1 >= PENDING_LOCK { winUnlockFile(tls, pFile+16, uint32(Xsqlite3PendingByte), uint32(0), uint32(1), uint32(0)) } (*WinFile)(unsafe.Pointer(pFile)).Flocktype = U8(locktype) return rc } func winNolockLock(tls *libc.TLS, id uintptr, locktype int32) int32 { _ = id _ = locktype return SQLITE_OK } func winNolockCheckReservedLock(tls *libc.TLS, id uintptr, pResOut uintptr) int32 { _ = id _ = pResOut return SQLITE_OK } func winNolockUnlock(tls *libc.TLS, id uintptr, locktype int32) int32 { _ = id _ = locktype return SQLITE_OK } func winModeBit(tls *libc.TLS, pFile uintptr, mask uint8, pArg uintptr) { if *(*int32)(unsafe.Pointer(pArg)) < 0 { *(*int32)(unsafe.Pointer(pArg)) = libc.Bool32(int32((*WinFile)(unsafe.Pointer(pFile)).FctrlFlags)&int32(mask) != 0) } else if *(*int32)(unsafe.Pointer(pArg)) == 0 { *(*U8)(unsafe.Pointer(pFile + 28)) &= U8(^int32(mask)) } else { *(*U8)(unsafe.Pointer(pFile + 28)) |= U8(int32(mask)) } } func winFileControl(tls *libc.TLS, id uintptr, op int32, pArg uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var pFile uintptr = id switch op { case SQLITE_FCNTL_LOCKSTATE: { *(*int32)(unsafe.Pointer(pArg)) = int32((*WinFile)(unsafe.Pointer(pFile)).Flocktype) return SQLITE_OK } case SQLITE_FCNTL_LAST_ERRNO: { *(*int32)(unsafe.Pointer(pArg)) = int32((*WinFile)(unsafe.Pointer(pFile)).FlastErrno) return SQLITE_OK } case SQLITE_FCNTL_CHUNK_SIZE: { (*WinFile)(unsafe.Pointer(pFile)).FszChunk = *(*int32)(unsafe.Pointer(pArg)) return SQLITE_OK } case SQLITE_FCNTL_SIZE_HINT: { if (*WinFile)(unsafe.Pointer(pFile)).FszChunk > 0 { var rc int32 = winFileSize(tls, id, bp+8) if rc == SQLITE_OK { var newSz Sqlite3_int64 = *(*Sqlite3_int64)(unsafe.Pointer(pArg)) if newSz > *(*Sqlite3_int64)(unsafe.Pointer(bp + 8)) { rc = winTruncate(tls, id, newSz) } } return rc } return SQLITE_OK } case SQLITE_FCNTL_PERSIST_WAL: { winModeBit(tls, pFile, uint8(WINFILE_PERSIST_WAL), pArg) return SQLITE_OK } case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { winModeBit(tls, pFile, uint8(WINFILE_PSOW), pArg) return SQLITE_OK } case SQLITE_FCNTL_VFSNAME: { *(*uintptr)(unsafe.Pointer(pArg)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, (*Sqlite3_vfs)(unsafe.Pointer((*WinFile)(unsafe.Pointer(pFile)).FpVfs)).FzName)) return SQLITE_OK } case SQLITE_FCNTL_WIN32_AV_RETRY: { var a uintptr = pArg if *(*int32)(unsafe.Pointer(a)) > 0 { winIoerrRetry = *(*int32)(unsafe.Pointer(a)) } else { *(*int32)(unsafe.Pointer(a)) = winIoerrRetry } if *(*int32)(unsafe.Pointer(a + 1*4)) > 0 { winIoerrRetryDelay = *(*int32)(unsafe.Pointer(a + 1*4)) } else { *(*int32)(unsafe.Pointer(a + 1*4)) = winIoerrRetryDelay } return SQLITE_OK } case SQLITE_FCNTL_WIN32_GET_HANDLE: { var phFile LPHANDLE = pArg *(*HANDLE)(unsafe.Pointer(phFile)) = (*WinFile)(unsafe.Pointer(pFile)).Fh return SQLITE_OK } case SQLITE_FCNTL_TEMPFILENAME: { *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var rc int32 = winGetTempname(tls, (*WinFile)(unsafe.Pointer(pFile)).FpVfs, bp+16) if rc == SQLITE_OK { *(*uintptr)(unsafe.Pointer(pArg)) = *(*uintptr)(unsafe.Pointer(bp + 16)) } return rc } case SQLITE_FCNTL_MMAP_SIZE: { var newLimit I64 = *(*I64)(unsafe.Pointer(pArg)) var rc int32 = SQLITE_OK if newLimit > Xsqlite3Config.FmxMmap { newLimit = Xsqlite3Config.FmxMmap } if newLimit > int64(0) && uint64(unsafe.Sizeof(SIZE_T(0))) < uint64(8) { newLimit = newLimit & int64(0x7FFFFFFF) } *(*I64)(unsafe.Pointer(pArg)) = (*WinFile)(unsafe.Pointer(pFile)).FmmapSizeMax if newLimit >= int64(0) && newLimit != (*WinFile)(unsafe.Pointer(pFile)).FmmapSizeMax && (*WinFile)(unsafe.Pointer(pFile)).FnFetchOut == 0 { (*WinFile)(unsafe.Pointer(pFile)).FmmapSizeMax = newLimit if (*WinFile)(unsafe.Pointer(pFile)).FmmapSize > int64(0) { winUnmapfile(tls, pFile) rc = winMapfile(tls, pFile, int64(-1)) } } return rc } } return SQLITE_NOTFOUND } func winSectorSize(tls *libc.TLS, id uintptr) int32 { _ = id return SQLITE_DEFAULT_SECTOR_SIZE } func winDeviceCharacteristics(tls *libc.TLS, id uintptr) int32 { var p uintptr = id return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | func() int32 { if int32((*WinFile)(unsafe.Pointer(p)).FctrlFlags)&WINFILE_PSOW != 0 { return SQLITE_IOCAP_POWERSAFE_OVERWRITE } return 0 }() } var winSysInfo SYSTEM_INFO var winBigLock uintptr = uintptr(0) func winShmEnterMutex(tls *libc.TLS) { Xsqlite3_mutex_enter(tls, winBigLock) } func winShmLeaveMutex(tls *libc.TLS) { Xsqlite3_mutex_leave(tls, winBigLock) } // Object used to represent a single file opened and mmapped to provide // shared memory. When multiple threads all reference the same // log-summary, each thread has its own winFile object, but they all // point to a single instance of this object. In other words, each // log-summary is opened only once per process. // // winShmMutexHeld() must be true when creating or destroying // this object or while reading or writing the following fields: // // nRef // pNext // // The following fields are read-only after the object is created: // // fid // zFilename // // Either winShmNode.mutex must be held or winShmNode.nRef==0 and // winShmMutexHeld() is true when reading or writing any other field // in this structure. type ShmRegion = struct { FhMap HANDLE FpMap uintptr } var winShmNodeList uintptr = uintptr(0) func winShmSystemLock(tls *libc.TLS, pFile uintptr, lockType int32, ofst int32, nByte int32) int32 { var rc int32 = 0 if lockType == WINSHM_UNLCK { rc = winUnlockFile(tls, pFile+16+16, uint32(ofst), uint32(0), uint32(nByte), uint32(0)) } else { var dwFlags DWORD = DWORD(LOCKFILE_FAIL_IMMEDIATELY) if lockType == WINSHM_WRLCK { dwFlags = dwFlags | DWORD(LOCKFILE_EXCLUSIVE_LOCK) } rc = winLockFile(tls, pFile+16+16, dwFlags, uint32(ofst), uint32(0), uint32(nByte), uint32(0)) } if rc != 0 { rc = SQLITE_OK } else { (*WinShmNode)(unsafe.Pointer(pFile)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) rc = SQLITE_BUSY } return rc } func winShmPurge(tls *libc.TLS, pVfs uintptr, deleteFlag int32) { var pp uintptr var p uintptr pp = uintptr(unsafe.Pointer(&winShmNodeList)) for libc.AssignUintptr(&p, *(*uintptr)(unsafe.Pointer(pp))) != uintptr(0) { if (*WinShmNode)(unsafe.Pointer(p)).FnRef == 0 { var i int32 if (*WinShmNode)(unsafe.Pointer(p)).Fmutex != 0 { Xsqlite3_mutex_free(tls, (*WinShmNode)(unsafe.Pointer(p)).Fmutex) } for i = 0; i < (*WinShmNode)(unsafe.Pointer(p)).FnRegion; i++ { var bRc WINBOOL = (*(*func(*libc.TLS, LPCVOID) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 59*24 + 8)))(tls, (*ShmRegion)(unsafe.Pointer((*WinShmNode)(unsafe.Pointer(p)).FaRegion+uintptr(i)*16)).FpMap) _ = bRc _ = bRc bRc = (*(*func(*libc.TLS, HANDLE) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 3*24 + 8)))(tls, (*ShmRegion)(unsafe.Pointer((*WinShmNode)(unsafe.Pointer(p)).FaRegion+uintptr(i)*16)).FhMap) _ = bRc } if (*WinShmNode)(unsafe.Pointer(p)).FhFile.Fh != uintptr(0) && (*WinShmNode)(unsafe.Pointer(p)).FhFile.Fh != libc.UintptrFromInt64(int64(-1)) { winClose(tls, p+16) } if deleteFlag != 0 { Xsqlite3BeginBenignMalloc(tls) winDelete(tls, pVfs, (*WinShmNode)(unsafe.Pointer(p)).FzFilename, 0) Xsqlite3EndBenignMalloc(tls) } *(*uintptr)(unsafe.Pointer(pp)) = (*WinShmNode)(unsafe.Pointer(p)).FpNext Xsqlite3_free(tls, (*WinShmNode)(unsafe.Pointer(p)).FaRegion) Xsqlite3_free(tls, p) } else { pp = p + 152 } } } func winLockSharedMemory(tls *libc.TLS, pShmNode uintptr) int32 { var rc int32 = winShmSystemLock(tls, pShmNode, WINSHM_WRLCK, (22+SQLITE_SHM_NLOCK)*4+SQLITE_SHM_NLOCK, 1) if rc == SQLITE_OK { if (*WinShmNode)(unsafe.Pointer(pShmNode)).FisReadonly != 0 { (*WinShmNode)(unsafe.Pointer(pShmNode)).FisUnlocked = U8(1) winShmSystemLock(tls, pShmNode, WINSHM_UNLCK, (22+SQLITE_SHM_NLOCK)*4+SQLITE_SHM_NLOCK, 1) return SQLITE_READONLY | int32(5)<<8 } else if winTruncate(tls, pShmNode+16, int64(0)) != 0 { winShmSystemLock(tls, pShmNode, WINSHM_UNLCK, (22+SQLITE_SHM_NLOCK)*4+SQLITE_SHM_NLOCK, 1) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(18)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+4730, (*WinShmNode)(unsafe.Pointer(pShmNode)).FzFilename, 48975) } } if rc == SQLITE_OK { winShmSystemLock(tls, pShmNode, WINSHM_UNLCK, (22+SQLITE_SHM_NLOCK)*4+SQLITE_SHM_NLOCK, 1) } return winShmSystemLock(tls, pShmNode, WINSHM_RDLCK, (22+SQLITE_SHM_NLOCK)*4+SQLITE_SHM_NLOCK, 1) } func winOpenSharedMemory(tls *libc.TLS, pDbFd uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var p uintptr var pShmNode uintptr var rc int32 var pNew uintptr var nName int32 var inFlags int32 pShmNode = uintptr(0) rc = SQLITE_OK p = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(winShm{}))) if !(p == uintptr(0)) { goto __1 } return SQLITE_IOERR | int32(12)<<8 __1: ; nName = Xsqlite3Strlen30(tls, (*WinFile)(unsafe.Pointer(pDbFd)).FzPath) pNew = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(WinShmNode{}))+uint64(nName)+uint64(17)) if !(pNew == uintptr(0)) { goto __2 } Xsqlite3_free(tls, p) return SQLITE_IOERR | int32(12)<<8 __2: ; (*WinShmNode)(unsafe.Pointer(pNew)).FzFilename = pNew + 1*160 Xsqlite3_snprintf(tls, nName+15, (*WinShmNode)(unsafe.Pointer(pNew)).FzFilename, ts+4750, libc.VaList(bp, (*WinFile)(unsafe.Pointer(pDbFd)).FzPath)) winShmEnterMutex(tls) pShmNode = winShmNodeList __3: if !(pShmNode != 0) { goto __5 } if !(Xsqlite3StrICmp(tls, (*WinShmNode)(unsafe.Pointer(pShmNode)).FzFilename, (*WinShmNode)(unsafe.Pointer(pNew)).FzFilename) == 0) { goto __6 } goto __5 __6: ; goto __4 __4: pShmNode = (*WinShmNode)(unsafe.Pointer(pShmNode)).FpNext goto __3 goto __5 __5: ; if !(pShmNode != 0) { goto __7 } Xsqlite3_free(tls, pNew) goto __8 __7: inFlags = SQLITE_OPEN_WAL *(*int32)(unsafe.Pointer(bp + 8)) = 0 pShmNode = pNew pNew = uintptr(0) (*WinFile)(unsafe.Pointer(pShmNode + 16)).Fh = libc.UintptrFromInt64(int64(-1)) (*WinShmNode)(unsafe.Pointer(pShmNode)).FpNext = winShmNodeList winShmNodeList = pShmNode if !(Xsqlite3Config.FbCoreMutex != 0) { goto __9 } (*WinShmNode)(unsafe.Pointer(pShmNode)).Fmutex = Xsqlite3_mutex_alloc(tls, SQLITE_MUTEX_FAST) if !((*WinShmNode)(unsafe.Pointer(pShmNode)).Fmutex == uintptr(0)) { goto __10 } rc = SQLITE_IOERR | int32(12)<<8 goto shm_open_err __10: ; __9: ; if !(0 == Xsqlite3_uri_boolean(tls, (*WinFile)(unsafe.Pointer(pDbFd)).FzPath, ts+4757, 0)) { goto __11 } inFlags = inFlags | (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) goto __12 __11: inFlags = inFlags | SQLITE_OPEN_READONLY __12: ; rc = winOpen(tls, (*WinFile)(unsafe.Pointer(pDbFd)).FpVfs, (*WinShmNode)(unsafe.Pointer(pShmNode)).FzFilename, pShmNode+16, inFlags, bp+8) if !(rc != SQLITE_OK) { goto __13 } rc = winLogErrorAtLine(tls, rc, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+4770, (*WinShmNode)(unsafe.Pointer(pShmNode)).FzFilename, 49057) goto shm_open_err __13: ; if !(*(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OPEN_READONLY) { goto __14 } (*WinShmNode)(unsafe.Pointer(pShmNode)).FisReadonly = U8(1) __14: ; rc = winLockSharedMemory(tls, pShmNode) if !(rc != SQLITE_OK && rc != SQLITE_READONLY|int32(5)<<8) { goto __15 } goto shm_open_err __15: ; __8: ; (*winShm)(unsafe.Pointer(p)).FpShmNode = pShmNode (*WinShmNode)(unsafe.Pointer(pShmNode)).FnRef++ (*WinFile)(unsafe.Pointer(pDbFd)).FpShm = p winShmLeaveMutex(tls) Xsqlite3_mutex_enter(tls, (*WinShmNode)(unsafe.Pointer(pShmNode)).Fmutex) (*winShm)(unsafe.Pointer(p)).FpNext = (*WinShmNode)(unsafe.Pointer(pShmNode)).FpFirst (*WinShmNode)(unsafe.Pointer(pShmNode)).FpFirst = p Xsqlite3_mutex_leave(tls, (*WinShmNode)(unsafe.Pointer(pShmNode)).Fmutex) return rc shm_open_err: winShmSystemLock(tls, pShmNode, WINSHM_UNLCK, (22+SQLITE_SHM_NLOCK)*4+SQLITE_SHM_NLOCK, 1) winShmPurge(tls, (*WinFile)(unsafe.Pointer(pDbFd)).FpVfs, 0) Xsqlite3_free(tls, p) Xsqlite3_free(tls, pNew) winShmLeaveMutex(tls) return rc } func winShmUnmap(tls *libc.TLS, fd uintptr, deleteFlag int32) int32 { var pDbFd uintptr var p uintptr var pShmNode uintptr var pp uintptr pDbFd = fd p = (*WinFile)(unsafe.Pointer(pDbFd)).FpShm if p == uintptr(0) { return SQLITE_OK } pShmNode = (*WinShm)(unsafe.Pointer(p)).FpShmNode Xsqlite3_mutex_enter(tls, (*WinShmNode)(unsafe.Pointer(pShmNode)).Fmutex) for pp = pShmNode + 144; *(*uintptr)(unsafe.Pointer(pp)) != p; pp = *(*uintptr)(unsafe.Pointer(pp)) + 8 { } *(*uintptr)(unsafe.Pointer(pp)) = (*WinShm)(unsafe.Pointer(p)).FpNext Xsqlite3_free(tls, p) (*WinFile)(unsafe.Pointer(pDbFd)).FpShm = uintptr(0) Xsqlite3_mutex_leave(tls, (*WinShmNode)(unsafe.Pointer(pShmNode)).Fmutex) winShmEnterMutex(tls) (*WinShmNode)(unsafe.Pointer(pShmNode)).FnRef-- if (*WinShmNode)(unsafe.Pointer(pShmNode)).FnRef == 0 { winShmPurge(tls, (*WinFile)(unsafe.Pointer(pDbFd)).FpVfs, deleteFlag) } winShmLeaveMutex(tls) return SQLITE_OK } func winShmLock(tls *libc.TLS, fd uintptr, ofst int32, n int32, flags int32) int32 { var pDbFd uintptr = fd var p uintptr = (*WinFile)(unsafe.Pointer(pDbFd)).FpShm var pX uintptr var pShmNode uintptr var rc int32 = SQLITE_OK var mask U16 if p == uintptr(0) { return SQLITE_IOERR | int32(20)<<8 } pShmNode = (*WinShm)(unsafe.Pointer(p)).FpShmNode if pShmNode == uintptr(0) { return SQLITE_IOERR | int32(20)<<8 } mask = U16(uint32(1)<<(ofst+n) - uint32(1)< iRegion) { goto __17 } iOffset1 = iRegion * szRegion iOffsetShift1 = int32(DWORD(iOffset1) % winSysInfo.FdwAllocationGranularity) p = (*ShmRegion)(unsafe.Pointer((*WinShmNode)(unsafe.Pointer(pShmNode)).FaRegion + uintptr(iRegion)*16)).FpMap *(*uintptr)(unsafe.Pointer(pp)) = p + uintptr(iOffsetShift1) goto __18 __17: *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) __18: ; if !((*WinShmNode)(unsafe.Pointer(pShmNode)).FisReadonly != 0 && rc == SQLITE_OK) { goto __19 } rc = SQLITE_READONLY __19: ; Xsqlite3_mutex_leave(tls, (*WinShmNode)(unsafe.Pointer(pShmNode)).Fmutex) return rc } func winUnmapfile(tls *libc.TLS, pFile uintptr) int32 { if (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion != 0 { if !((*(*func(*libc.TLS, LPCVOID) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 59*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion) != 0) { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(24)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4814, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 49451) } (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion = uintptr(0) (*WinFile)(unsafe.Pointer(pFile)).FmmapSize = int64(0) } if (*WinFile)(unsafe.Pointer(pFile)).FhMap != uintptr(0) { if !((*(*func(*libc.TLS, HANDLE) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 3*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFile)).FhMap) != 0) { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(24)<<8, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+4828, (*WinFile)(unsafe.Pointer(pFile)).FzPath, 49462) } (*WinFile)(unsafe.Pointer(pFile)).FhMap = uintptr(0) } return SQLITE_OK } func winMapfile(tls *libc.TLS, pFd uintptr, nByte Sqlite3_int64) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*Sqlite3_int64)(unsafe.Pointer(bp)) = nByte var rc int32 if (*WinFile)(unsafe.Pointer(pFd)).FnFetchOut > 0 { return SQLITE_OK } if *(*Sqlite3_int64)(unsafe.Pointer(bp)) < int64(0) { rc = winFileSize(tls, pFd, bp) if rc != 0 { return SQLITE_IOERR | int32(7)<<8 } } if *(*Sqlite3_int64)(unsafe.Pointer(bp)) > (*WinFile)(unsafe.Pointer(pFd)).FmmapSizeMax { *(*Sqlite3_int64)(unsafe.Pointer(bp)) = (*WinFile)(unsafe.Pointer(pFd)).FmmapSizeMax } *(*Sqlite3_int64)(unsafe.Pointer(bp)) &= ^Sqlite3_int64(winSysInfo.FdwPageSize - DWORD(1)) if *(*Sqlite3_int64)(unsafe.Pointer(bp)) == int64(0) && (*WinFile)(unsafe.Pointer(pFd)).FmmapSize > int64(0) { winUnmapfile(tls, pFd) } if *(*Sqlite3_int64)(unsafe.Pointer(bp)) != (*WinFile)(unsafe.Pointer(pFd)).FmmapSize { var pNew uintptr = uintptr(0) var protect DWORD = DWORD(PAGE_READONLY) var flags DWORD = DWORD(SECTION_MAP_READ) winUnmapfile(tls, pFd) (*WinFile)(unsafe.Pointer(pFd)).FhMap = (*(*func(*libc.TLS, HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCWSTR) HANDLE)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 7*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFd)).Fh, uintptr(0), protect, DWORD(*(*Sqlite3_int64)(unsafe.Pointer(bp))>>32&int64(0xffffffff)), DWORD(*(*Sqlite3_int64)(unsafe.Pointer(bp))&int64(0xffffffff)), uintptr(0)) if (*WinFile)(unsafe.Pointer(pFd)).FhMap == uintptr(0) { (*WinFile)(unsafe.Pointer(pFd)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) rc = winLogErrorAtLine(tls, SQLITE_IOERR|int32(24)<<8, (*WinFile)(unsafe.Pointer(pFd)).FlastErrno, ts+4842, (*WinFile)(unsafe.Pointer(pFd)).FzPath, 49539) return SQLITE_OK } pNew = (*(*func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, SIZE_T) LPVOID)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 49*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFd)).FhMap, flags, uint32(0), uint32(0), SIZE_T(*(*Sqlite3_int64)(unsafe.Pointer(bp)))) if pNew == uintptr(0) { (*(*func(*libc.TLS, HANDLE) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 3*24 + 8)))(tls, (*WinFile)(unsafe.Pointer(pFd)).FhMap) (*WinFile)(unsafe.Pointer(pFd)).FhMap = uintptr(0) (*WinFile)(unsafe.Pointer(pFd)).FlastErrno = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) rc = winLogErrorAtLine(tls, SQLITE_IOERR|int32(24)<<8, (*WinFile)(unsafe.Pointer(pFd)).FlastErrno, ts+4854, (*WinFile)(unsafe.Pointer(pFd)).FzPath, 49557) return SQLITE_OK } (*WinFile)(unsafe.Pointer(pFd)).FpMapRegion = pNew (*WinFile)(unsafe.Pointer(pFd)).FmmapSize = *(*Sqlite3_int64)(unsafe.Pointer(bp)) } return SQLITE_OK } func winFetch(tls *libc.TLS, fd uintptr, iOff I64, nAmt int32, pp uintptr) int32 { var pFd uintptr = fd *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) if (*WinFile)(unsafe.Pointer(pFd)).FmmapSizeMax > int64(0) { if (*WinFile)(unsafe.Pointer(pFd)).FpMapRegion == uintptr(0) { var rc int32 = winMapfile(tls, pFd, int64(-1)) if rc != SQLITE_OK { return rc } } if (*WinFile)(unsafe.Pointer(pFd)).FmmapSize >= iOff+I64(nAmt) { *(*uintptr)(unsafe.Pointer(pp)) = (*WinFile)(unsafe.Pointer(pFd)).FpMapRegion + uintptr(iOff) (*WinFile)(unsafe.Pointer(pFd)).FnFetchOut++ } } return SQLITE_OK } func winUnfetch(tls *libc.TLS, fd uintptr, iOff I64, p uintptr) int32 { var pFd uintptr = fd if p != 0 { (*WinFile)(unsafe.Pointer(pFd)).FnFetchOut-- } else { winUnmapfile(tls, pFd) } return SQLITE_OK } var winIoMethod = Sqlite3_io_methods{ FiVersion: 3, FxClose: 0, FxRead: 0, FxWrite: 0, FxTruncate: 0, FxSync: 0, FxFileSize: 0, FxLock: 0, FxUnlock: 0, FxCheckReservedLock: 0, FxFileControl: 0, FxSectorSize: 0, FxDeviceCharacteristics: 0, FxShmMap: 0, FxShmLock: 0, FxShmBarrier: 0, FxShmUnmap: 0, FxFetch: 0, FxUnfetch: 0, } var winIoNolockMethod = Sqlite3_io_methods{ FiVersion: 3, FxClose: 0, FxRead: 0, FxWrite: 0, FxTruncate: 0, FxSync: 0, FxFileSize: 0, FxLock: 0, FxUnlock: 0, FxCheckReservedLock: 0, FxFileControl: 0, FxSectorSize: 0, FxDeviceCharacteristics: 0, FxShmMap: 0, FxShmLock: 0, FxShmBarrier: 0, FxShmUnmap: 0, FxFetch: 0, FxUnfetch: 0, } var winAppData = WinVfsAppData{ FpMethod: 0, } var winNolockAppData = WinVfsAppData{ FpMethod: 0, FbNoLock: 1, } func winConvertFromUtf8Filename(tls *libc.TLS, zFilename uintptr) uintptr { var zConverted uintptr = uintptr(0) if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { zConverted = winUtf8ToUnicode(tls, zFilename) } else { zConverted = winUtf8ToMbcs(tls, zFilename, (*(*func(*libc.TLS) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 8)))(tls)) } return zConverted } func winMakeEndInDirSep(tls *libc.TLS, nBuf int32, zBuf uintptr) int32 { if zBuf != 0 { var nLen int32 = Xsqlite3Strlen30(tls, zBuf) if nLen > 0 { if int32(*(*int8)(unsafe.Pointer(zBuf + uintptr(nLen-1)))) == '/' || int32(*(*int8)(unsafe.Pointer(zBuf + uintptr(nLen-1)))) == '\\' { return 1 } else if nLen+1 < nBuf { *(*int8)(unsafe.Pointer(zBuf + uintptr(nLen))) = int8('\\') *(*int8)(unsafe.Pointer(zBuf + uintptr(nLen+1))) = int8(0) return 1 } } } return 0 } func winTempDirDefined(tls *libc.TLS) int32 { Xsqlite3_mutex_enter(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) if Xsqlite3_temp_directory != uintptr(0) { return 1 } Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) return 0 } func winGetTempname(tls *libc.TLS, pVfs uintptr, pzBuf uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var i Size_t var j Size_t var nPre int32 = Xsqlite3Strlen30(tls, ts+4866) var nMax int32 var nBuf int32 var nDir int32 var nLen int32 var zBuf uintptr nMax = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname nBuf = nMax + 2 zBuf = Xsqlite3MallocZero(tls, uint64(nBuf)) if !(zBuf != 0) { return SQLITE_IOERR | int32(12)<<8 } nDir = nMax - (nPre + 15) if winTempDirDefined(tls) != 0 { var nDirLen int32 = Xsqlite3Strlen30(tls, Xsqlite3_temp_directory) if nDirLen > 0 { if !(int32(*(*int8)(unsafe.Pointer(Xsqlite3_temp_directory + uintptr(nDirLen-1)))) == '/' || int32(*(*int8)(unsafe.Pointer(Xsqlite3_temp_directory + uintptr(nDirLen-1)))) == '\\') { nDirLen++ } if nDirLen > nDir { Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) Xsqlite3_free(tls, zBuf) return winLogErrorAtLine(tls, SQLITE_ERROR, uint32(0), ts+4874, uintptr(0), 49859) } Xsqlite3_snprintf(tls, nMax, zBuf, ts+4493, libc.VaList(bp, Xsqlite3_temp_directory)) } Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) } else if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { var zMulti uintptr var zWidePath LPWSTR = Xsqlite3MallocZero(tls, uint64(nMax)*uint64(unsafe.Sizeof(WCHAR(0)))) if !(zWidePath != 0) { Xsqlite3_free(tls, zBuf) return SQLITE_IOERR | int32(12)<<8 } if (*(*func(*libc.TLS, DWORD, LPWSTR) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 32*24 + 8)))(tls, uint32(nMax), zWidePath) == DWORD(0) { Xsqlite3_free(tls, zWidePath) Xsqlite3_free(tls, zBuf) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(25)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+4890, uintptr(0), 49959) } zMulti = winUnicodeToUtf8(tls, zWidePath) if zMulti != 0 { Xsqlite3_snprintf(tls, nMax, zBuf, ts+4493, libc.VaList(bp+8, zMulti)) Xsqlite3_free(tls, zMulti) Xsqlite3_free(tls, zWidePath) } else { Xsqlite3_free(tls, zWidePath) Xsqlite3_free(tls, zBuf) return SQLITE_IOERR | int32(12)<<8 } } else { var zUtf8 uintptr var zMbcsPath uintptr = Xsqlite3MallocZero(tls, uint64(nMax)) if !(zMbcsPath != 0) { Xsqlite3_free(tls, zBuf) return SQLITE_IOERR | int32(12)<<8 } if (*(*func(*libc.TLS, DWORD, LPSTR) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 31*24 + 8)))(tls, uint32(nMax), zMbcsPath) == DWORD(0) { Xsqlite3_free(tls, zBuf) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(25)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+4906, uintptr(0), 49986) } zUtf8 = winMbcsToUtf8(tls, zMbcsPath, (*(*func(*libc.TLS) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 8)))(tls)) if zUtf8 != 0 { Xsqlite3_snprintf(tls, nMax, zBuf, ts+4493, libc.VaList(bp+16, zUtf8)) Xsqlite3_free(tls, zUtf8) } else { Xsqlite3_free(tls, zBuf) return SQLITE_IOERR | int32(12)<<8 } } if !(winMakeEndInDirSep(tls, nDir+1, zBuf) != 0) { Xsqlite3_free(tls, zBuf) return winLogErrorAtLine(tls, SQLITE_ERROR, uint32(0), ts+4922, uintptr(0), 50010) } nLen = Xsqlite3Strlen30(tls, zBuf) if nLen+nPre+17 > nBuf { Xsqlite3_free(tls, zBuf) return winLogErrorAtLine(tls, SQLITE_ERROR, uint32(0), ts+4938, uintptr(0), 50028) } Xsqlite3_snprintf(tls, nBuf-16-nLen, zBuf+uintptr(nLen), ts+4866, 0) j = Size_t(Xsqlite3Strlen30(tls, zBuf)) Xsqlite3_randomness(tls, 15, zBuf+uintptr(j)) i = uint64(0) __1: if !(i < uint64(15)) { goto __3 } { *(*int8)(unsafe.Pointer(zBuf + uintptr(j))) = zChars[uint64(uint8(*(*int8)(unsafe.Pointer(zBuf + uintptr(j)))))%(uint64(unsafe.Sizeof(zChars))-uint64(1))] } goto __2 __2: i++ j++ goto __1 goto __3 __3: ; *(*int8)(unsafe.Pointer(zBuf + uintptr(j))) = int8(0) *(*int8)(unsafe.Pointer(zBuf + uintptr(j+uint64(1)))) = int8(0) *(*uintptr)(unsafe.Pointer(pzBuf)) = zBuf return SQLITE_OK } var zChars = *(*[63]int8)(unsafe.Pointer(ts + 4954)) func winIsDir(tls *libc.TLS, zConverted uintptr) int32 { bp := tls.Alloc(44) defer tls.Free(44) var attr DWORD var rc int32 = 0 if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { *(*int32)(unsafe.Pointer(bp + 36)) = 0 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(WIN32_FILE_ATTRIBUTE_DATA{}))) for !(libc.AssignInt32(&rc, (*(*func(*libc.TLS, LPCWSTR, GET_FILEEX_INFO_LEVELS, LPVOID) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 22*24 + 8)))(tls, zConverted, GetFileExInfoStandard, bp)) != 0) && winRetryIoerr(tls, bp+36, bp+40) != 0 { } if !(rc != 0) { return 0 } attr = (*WIN32_FILE_ATTRIBUTE_DATA)(unsafe.Pointer(bp)).FdwFileAttributes } else { attr = (*(*func(*libc.TLS, LPCSTR) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 20*24 + 8)))(tls, zConverted) } return libc.Bool32(attr != libc.Uint32(libc.Uint32FromInt32(-1)) && attr&DWORD(FILE_ATTRIBUTE_DIRECTORY) != 0) } func winOpen(tls *libc.TLS, pVfs uintptr, zName uintptr, id uintptr, flags int32, pOutFlags uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var h HANDLE *(*DWORD)(unsafe.Pointer(bp + 12)) = DWORD(0) var dwDesiredAccess DWORD var dwShareMode DWORD var dwCreationDisposition DWORD var dwFlagsAndAttributes DWORD = DWORD(0) var pAppData uintptr var pFile uintptr = id var zConverted uintptr var zUtf8Name uintptr = zName *(*int32)(unsafe.Pointer(bp + 8)) = 0 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 = SQLITE_OK var isExclusive int32 = flags & SQLITE_OPEN_EXCLUSIVE var isDelete int32 = flags & SQLITE_OPEN_DELETEONCLOSE var isCreate int32 = flags & SQLITE_OPEN_CREATE var isReadonly int32 = flags & SQLITE_OPEN_READONLY var isReadWrite int32 = flags & SQLITE_OPEN_READWRITE libc.Xmemset(tls, pFile, 0, uint64(unsafe.Sizeof(WinFile{}))) (*WinFile)(unsafe.Pointer(pFile)).Fh = libc.UintptrFromInt64(int64(-1)) if !(zUtf8Name != 0) { rc = winGetTempname(tls, pVfs, bp) if rc != SQLITE_OK { return rc } zUtf8Name = *(*uintptr)(unsafe.Pointer(bp)) } zConverted = winConvertFromUtf8Filename(tls, zUtf8Name) if zConverted == uintptr(0) { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) return SQLITE_IOERR | int32(12)<<8 } if winIsDir(tls, zConverted) != 0 { Xsqlite3_free(tls, zConverted) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) return SQLITE_CANTOPEN | int32(2)<<8 } if isReadWrite != 0 { dwDesiredAccess = 0x80000000 | uint32(0x40000000) } else { dwDesiredAccess = 0x80000000 } if isExclusive != 0 { dwCreationDisposition = DWORD(CREATE_NEW) } else if isCreate != 0 { dwCreationDisposition = DWORD(OPEN_ALWAYS) } else { dwCreationDisposition = DWORD(OPEN_EXISTING) } if 0 == Xsqlite3_uri_boolean(tls, zName, ts+5017, 0) { dwShareMode = DWORD(FILE_SHARE_READ | FILE_SHARE_WRITE) } else { dwShareMode = DWORD(0) } if isDelete != 0 { dwFlagsAndAttributes = DWORD(FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_DELETE_ON_CLOSE) } else { dwFlagsAndAttributes = DWORD(FILE_ATTRIBUTE_NORMAL) } if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { for __ccgo := true; __ccgo; __ccgo = winRetryIoerr(tls, bp+8, bp+12) != 0 { h = (*(*func(*libc.TLS, LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE) HANDLE)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 5*24 + 8)))(tls, zConverted, dwDesiredAccess, dwShareMode, uintptr(0), dwCreationDisposition, dwFlagsAndAttributes, uintptr(0)) if h != libc.UintptrFromInt64(int64(-1)) { break } if isReadWrite != 0 { var rc2 int32 *(*int32)(unsafe.Pointer(bp + 16)) = 0 Xsqlite3BeginBenignMalloc(tls) rc2 = winAccess(tls, pVfs, zName, SQLITE_ACCESS_READ, bp+16) Xsqlite3EndBenignMalloc(tls) if rc2 == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 16)) != 0 { break } } } } else { for __ccgo1 := true; __ccgo1; __ccgo1 = winRetryIoerr(tls, bp+8, bp+12) != 0 { h = (*(*func(*libc.TLS, LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE) HANDLE)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 4*24 + 8)))(tls, zConverted, dwDesiredAccess, dwShareMode, uintptr(0), dwCreationDisposition, dwFlagsAndAttributes, uintptr(0)) if h != libc.UintptrFromInt64(int64(-1)) { break } if isReadWrite != 0 { var rc2 int32 *(*int32)(unsafe.Pointer(bp + 20)) = 0 Xsqlite3BeginBenignMalloc(tls) rc2 = winAccess(tls, pVfs, zName, SQLITE_ACCESS_READ, bp+20) Xsqlite3EndBenignMalloc(tls) if rc2 == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 20)) != 0 { break } } } } winLogIoerr(tls, *(*int32)(unsafe.Pointer(bp + 8)), 50317) if h == libc.UintptrFromInt64(int64(-1)) { Xsqlite3_free(tls, zConverted) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) if isReadWrite != 0 && !(isExclusive != 0) { return winOpen(tls, pVfs, zName, id, (flags|SQLITE_OPEN_READONLY)&libc.CplInt32(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE), pOutFlags) } else { (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = *(*DWORD)(unsafe.Pointer(bp + 12)) winLogErrorAtLine(tls, SQLITE_CANTOPEN, (*WinFile)(unsafe.Pointer(pFile)).FlastErrno, ts+5027, zUtf8Name, 50332) return Xsqlite3CantopenError(tls, 50333) } } if pOutFlags != 0 { if isReadWrite != 0 { *(*int32)(unsafe.Pointer(pOutFlags)) = SQLITE_OPEN_READWRITE } else { *(*int32)(unsafe.Pointer(pOutFlags)) = SQLITE_OPEN_READONLY } } pAppData = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData { Xsqlite3_free(tls, zConverted) } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) (*Sqlite3_file)(unsafe.Pointer(id)).FpMethods = func() uintptr { if pAppData != 0 { return (*WinVfsAppData)(unsafe.Pointer(pAppData)).FpMethod } return uintptr(unsafe.Pointer(&winIoMethod)) }() (*WinFile)(unsafe.Pointer(pFile)).FpVfs = pVfs (*WinFile)(unsafe.Pointer(pFile)).Fh = h if isReadonly != 0 { *(*U8)(unsafe.Pointer(pFile + 28)) |= U8(WINFILE_RDONLY) } if flags&SQLITE_OPEN_MAIN_DB != 0 && Xsqlite3_uri_boolean(tls, zName, ts+5035, SQLITE_POWERSAFE_OVERWRITE) != 0 { *(*U8)(unsafe.Pointer(pFile + 28)) |= U8(WINFILE_PSOW) } (*WinFile)(unsafe.Pointer(pFile)).FlastErrno = DWORD(0) (*WinFile)(unsafe.Pointer(pFile)).FzPath = zName (*WinFile)(unsafe.Pointer(pFile)).FhMap = uintptr(0) (*WinFile)(unsafe.Pointer(pFile)).FpMapRegion = uintptr(0) (*WinFile)(unsafe.Pointer(pFile)).FmmapSize = int64(0) (*WinFile)(unsafe.Pointer(pFile)).FmmapSizeMax = Xsqlite3Config.FszMmap return rc } func winDelete(tls *libc.TLS, pVfs uintptr, zFilename uintptr, syncDir int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*int32)(unsafe.Pointer(bp)) = 0 var rc int32 var attr DWORD *(*DWORD)(unsafe.Pointer(bp + 4)) = DWORD(0) var zConverted uintptr _ = pVfs _ = syncDir zConverted = winConvertFromUtf8Filename(tls, zFilename) if zConverted == uintptr(0) { return SQLITE_IOERR | int32(12)<<8 } if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { for __ccgo := true; __ccgo; __ccgo = 1 != 0 { attr = (*(*func(*libc.TLS, LPCWSTR) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 21*24 + 8)))(tls, zConverted) if attr == libc.Uint32(libc.Uint32FromInt32(-1)) { *(*DWORD)(unsafe.Pointer(bp + 4)) = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) if *(*DWORD)(unsafe.Pointer(bp + 4)) == DWORD(2) || *(*DWORD)(unsafe.Pointer(bp + 4)) == DWORD(3) { rc = SQLITE_IOERR | int32(23)<<8 } else { rc = SQLITE_ERROR } break } if attr&DWORD(FILE_ATTRIBUTE_DIRECTORY) != 0 { rc = SQLITE_ERROR break } if (*(*func(*libc.TLS, LPCWSTR) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 10*24 + 8)))(tls, zConverted) != 0 { rc = SQLITE_OK break } if !(winRetryIoerr(tls, bp, bp+4) != 0) { rc = SQLITE_ERROR break } } } else { for __ccgo1 := true; __ccgo1; __ccgo1 = 1 != 0 { attr = (*(*func(*libc.TLS, LPCSTR) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 20*24 + 8)))(tls, zConverted) if attr == libc.Uint32(libc.Uint32FromInt32(-1)) { *(*DWORD)(unsafe.Pointer(bp + 4)) = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) if *(*DWORD)(unsafe.Pointer(bp + 4)) == DWORD(2) || *(*DWORD)(unsafe.Pointer(bp + 4)) == DWORD(3) { rc = SQLITE_IOERR | int32(23)<<8 } else { rc = SQLITE_ERROR } break } if attr&DWORD(FILE_ATTRIBUTE_DIRECTORY) != 0 { rc = SQLITE_ERROR break } if (*(*func(*libc.TLS, LPCSTR) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 9*24 + 8)))(tls, zConverted) != 0 { rc = SQLITE_OK break } if !(winRetryIoerr(tls, bp, bp+4) != 0) { rc = SQLITE_ERROR break } } } if rc != 0 && rc != SQLITE_IOERR|int32(23)<<8 { rc = winLogErrorAtLine(tls, SQLITE_IOERR|int32(10)<<8, *(*DWORD)(unsafe.Pointer(bp + 4)), ts+5040, zFilename, 50505) } else { winLogIoerr(tls, *(*int32)(unsafe.Pointer(bp)), 50507) } Xsqlite3_free(tls, zConverted) return rc } func winAccess(tls *libc.TLS, pVfs uintptr, zFilename uintptr, flags int32, pResOut uintptr) int32 { bp := tls.Alloc(44) defer tls.Free(44) var attr DWORD var rc int32 = 0 *(*DWORD)(unsafe.Pointer(bp + 40)) = DWORD(0) var zConverted uintptr _ = pVfs zConverted = winConvertFromUtf8Filename(tls, zFilename) if zConverted == uintptr(0) { return SQLITE_IOERR | int32(12)<<8 } if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { *(*int32)(unsafe.Pointer(bp + 36)) = 0 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(WIN32_FILE_ATTRIBUTE_DATA{}))) for !(libc.AssignInt32(&rc, (*(*func(*libc.TLS, LPCWSTR, GET_FILEEX_INFO_LEVELS, LPVOID) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 22*24 + 8)))(tls, zConverted, GetFileExInfoStandard, bp)) != 0) && winRetryIoerr(tls, bp+36, bp+40) != 0 { } if rc != 0 { if flags == SQLITE_ACCESS_EXISTS && (*WIN32_FILE_ATTRIBUTE_DATA)(unsafe.Pointer(bp)).FnFileSizeHigh == DWORD(0) && (*WIN32_FILE_ATTRIBUTE_DATA)(unsafe.Pointer(bp)).FnFileSizeLow == DWORD(0) { attr = libc.Uint32(libc.Uint32FromInt32(-1)) } else { attr = (*WIN32_FILE_ATTRIBUTE_DATA)(unsafe.Pointer(bp)).FdwFileAttributes } } else { winLogIoerr(tls, *(*int32)(unsafe.Pointer(bp + 36)), 50557) if *(*DWORD)(unsafe.Pointer(bp + 40)) != DWORD(2) && *(*DWORD)(unsafe.Pointer(bp + 40)) != DWORD(3) { Xsqlite3_free(tls, zConverted) return winLogErrorAtLine(tls, SQLITE_IOERR|int32(13)<<8, *(*DWORD)(unsafe.Pointer(bp + 40)), ts+5050, zFilename, 50560) } else { attr = libc.Uint32(libc.Uint32FromInt32(-1)) } } } else { attr = (*(*func(*libc.TLS, LPCSTR) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 20*24 + 8)))(tls, zConverted) } Xsqlite3_free(tls, zConverted) switch flags { case SQLITE_ACCESS_READ: fallthrough case SQLITE_ACCESS_EXISTS: rc = libc.Bool32(attr != libc.Uint32(libc.Uint32FromInt32(-1))) break case SQLITE_ACCESS_READWRITE: rc = libc.Bool32(attr != libc.Uint32(libc.Uint32FromInt32(-1)) && attr&DWORD(FILE_ATTRIBUTE_READONLY) == DWORD(0)) break default: } *(*int32)(unsafe.Pointer(pResOut)) = rc return SQLITE_OK } func winIsLongPathPrefix(tls *libc.TLS, zPathname uintptr) WINBOOL { return libc.Bool32(int32(*(*int8)(unsafe.Pointer(zPathname))) == '\\' && int32(*(*int8)(unsafe.Pointer(zPathname + 1))) == '\\' && int32(*(*int8)(unsafe.Pointer(zPathname + 2))) == '?' && int32(*(*int8)(unsafe.Pointer(zPathname + 3))) == '\\') } func winIsDriveLetterAndColon(tls *libc.TLS, zPathname uintptr) WINBOOL { return libc.Bool32(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zPathname)))])&0x02 != 0 && int32(*(*int8)(unsafe.Pointer(zPathname + 1))) == ':') } func winIsVerbatimPathname(tls *libc.TLS, zPathname uintptr) WINBOOL { if int32(*(*int8)(unsafe.Pointer(zPathname))) == '/' || int32(*(*int8)(unsafe.Pointer(zPathname))) == '\\' { return TRUE } if winIsDriveLetterAndColon(tls, zPathname) != 0 { return TRUE } return FALSE } func winFullPathnameNoMutex(tls *libc.TLS, pVfs uintptr, zRelative uintptr, nFull int32, zFull uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var nByte DWORD var zConverted uintptr var zOut uintptr if int32(*(*int8)(unsafe.Pointer(zRelative))) == '/' && (winIsDriveLetterAndColon(tls, zRelative+uintptr(1)) != 0 || winIsLongPathPrefix(tls, zRelative+uintptr(1)) != 0) { zRelative++ } if Xsqlite3_data_directory != 0 && !(winIsVerbatimPathname(tls, zRelative) != 0) { Xsqlite3_snprintf(tls, func() int32 { if nFull < (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname { return nFull } return (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname }(), zFull, ts+5060, libc.VaList(bp, Xsqlite3_data_directory, '\\', zRelative)) return SQLITE_OK } zConverted = winConvertFromUtf8Filename(tls, zRelative) if zConverted == uintptr(0) { return SQLITE_IOERR | int32(12)<<8 } if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { var zTemp LPWSTR nByte = (*(*func(*libc.TLS, LPCWSTR, DWORD, LPWSTR, uintptr) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 25*24 + 8)))(tls, zConverted, uint32(0), uintptr(0), uintptr(0)) if nByte == DWORD(0) { Xsqlite3_free(tls, zConverted) return winLogErrorAtLine(tls, SQLITE_CANTOPEN|int32(3)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+5067, zRelative, 50777) } nByte = nByte + DWORD(3) zTemp = Xsqlite3MallocZero(tls, uint64(nByte)*uint64(unsafe.Sizeof(WCHAR(0)))) if zTemp == uintptr(0) { Xsqlite3_free(tls, zConverted) return SQLITE_IOERR | int32(12)<<8 } nByte = (*(*func(*libc.TLS, LPCWSTR, DWORD, LPWSTR, uintptr) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 25*24 + 8)))(tls, zConverted, nByte, zTemp, uintptr(0)) if nByte == DWORD(0) { Xsqlite3_free(tls, zConverted) Xsqlite3_free(tls, zTemp) return winLogErrorAtLine(tls, SQLITE_CANTOPEN|int32(3)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+5084, zRelative, 50790) } Xsqlite3_free(tls, zConverted) zOut = winUnicodeToUtf8(tls, zTemp) Xsqlite3_free(tls, zTemp) } else { var zTemp uintptr nByte = (*(*func(*libc.TLS, LPCSTR, DWORD, LPSTR, uintptr) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 24*24 + 8)))(tls, zConverted, uint32(0), uintptr(0), uintptr(0)) if nByte == DWORD(0) { Xsqlite3_free(tls, zConverted) return winLogErrorAtLine(tls, SQLITE_CANTOPEN|int32(3)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+5101, zRelative, 50803) } nByte = nByte + DWORD(3) zTemp = Xsqlite3MallocZero(tls, uint64(nByte)*uint64(unsafe.Sizeof(int8(0)))) if zTemp == uintptr(0) { Xsqlite3_free(tls, zConverted) return SQLITE_IOERR | int32(12)<<8 } nByte = (*(*func(*libc.TLS, LPCSTR, DWORD, LPSTR, uintptr) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 24*24 + 8)))(tls, zConverted, nByte, zTemp, uintptr(0)) if nByte == DWORD(0) { Xsqlite3_free(tls, zConverted) Xsqlite3_free(tls, zTemp) return winLogErrorAtLine(tls, SQLITE_CANTOPEN|int32(3)<<8, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), ts+5118, zRelative, 50816) } Xsqlite3_free(tls, zConverted) zOut = winMbcsToUtf8(tls, zTemp, (*(*func(*libc.TLS) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 8)))(tls)) Xsqlite3_free(tls, zTemp) } if zOut != 0 { Xsqlite3_snprintf(tls, func() int32 { if nFull < (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname { return nFull } return (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname }(), zFull, ts+4493, libc.VaList(bp+24, zOut)) Xsqlite3_free(tls, zOut) return SQLITE_OK } else { return SQLITE_IOERR | int32(12)<<8 } return int32(0) } func winFullPathname(tls *libc.TLS, pVfs uintptr, zRelative uintptr, nFull int32, zFull uintptr) int32 { var rc int32 var pMutex uintptr pMutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1) Xsqlite3_mutex_enter(tls, pMutex) rc = winFullPathnameNoMutex(tls, pVfs, zRelative, nFull, zFull) Xsqlite3_mutex_leave(tls, pMutex) return rc } func winDlOpen(tls *libc.TLS, pVfs uintptr, zFilename uintptr) uintptr { var h HANDLE var zConverted uintptr = winConvertFromUtf8Filename(tls, zFilename) _ = pVfs if zConverted == uintptr(0) { return uintptr(0) } if sqlite3_os_type == 2 || Xsqlite3_win32_is_nt(tls) != 0 { h = (*(*func(*libc.TLS, LPCWSTR) HMODULE)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 45*24 + 8)))(tls, zConverted) } else { h = (*(*func(*libc.TLS, LPCSTR) HMODULE)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 44*24 + 8)))(tls, zConverted) } Xsqlite3_free(tls, zConverted) return h } func winDlError(tls *libc.TLS, pVfs uintptr, nBuf int32, zBufOut uintptr) { _ = pVfs winGetLastErrorMsg(tls, (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls), nBuf, zBufOut) } func winDlSym(tls *libc.TLS, pVfs uintptr, pH uintptr, zSym uintptr) uintptr { var proc FARPROC _ = pVfs proc = (*(*func(*libc.TLS, HMODULE, LPCSTR) FARPROC)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 27*24 + 8)))(tls, pH, zSym) return proc } func winDlClose(tls *libc.TLS, pVfs uintptr, pHandle uintptr) { _ = pVfs (*(*func(*libc.TLS, HMODULE) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 16*24 + 8)))(tls, pHandle) } // State information for the randomness gatherer. type EntropyGatherer1 = struct { Fa uintptr Fna int32 Fi int32 FnXor int32 F__ccgo_pad1 [4]byte } // State information for the randomness gatherer. type EntropyGatherer = EntropyGatherer1 func xorMemory(tls *libc.TLS, p uintptr, x uintptr, sz int32) { var j int32 var k int32 j = 0 k = (*EntropyGatherer)(unsafe.Pointer(p)).Fi for ; j < sz; j++ { *(*uint8)(unsafe.Pointer((*EntropyGatherer)(unsafe.Pointer(p)).Fa + uintptr(libc.PostIncInt32(&k, 1)))) ^= uint8(int32(*(*uint8)(unsafe.Pointer(x + uintptr(j))))) if k >= (*EntropyGatherer)(unsafe.Pointer(p)).Fna { k = 0 } } (*EntropyGatherer)(unsafe.Pointer(p)).Fi = k *(*int32)(unsafe.Pointer(p + 16)) += sz } func winRandomness(tls *libc.TLS, pVfs uintptr, nBuf int32, zBuf uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) _ = pVfs libc.Xmemset(tls, zBuf, 0, uint64(nBuf)) (*EntropyGatherer)(unsafe.Pointer(bp + 16)).Fa = zBuf (*EntropyGatherer)(unsafe.Pointer(bp + 16)).Fna = nBuf (*EntropyGatherer)(unsafe.Pointer(bp + 16)).FnXor = 0 (*EntropyGatherer)(unsafe.Pointer(bp + 16)).Fi = 0 { (*(*func(*libc.TLS, LPSYSTEMTIME))(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 29*24 + 8)))(tls, bp) xorMemory(tls, bp+16, bp, int32(unsafe.Sizeof(SYSTEMTIME{}))) } { *(*DWORD)(unsafe.Pointer(bp + 40)) = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 17*24 + 8)))(tls) xorMemory(tls, bp+16, bp+40, int32(unsafe.Sizeof(DWORD(0)))) } { *(*DWORD)(unsafe.Pointer(bp + 44)) = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 33*24 + 8)))(tls) xorMemory(tls, bp+16, bp+44, int32(unsafe.Sizeof(DWORD(0)))) } { (*(*func(*libc.TLS, uintptr) WINBOOL)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 51*24 + 8)))(tls, bp+48) xorMemory(tls, bp+16, bp+48, int32(unsafe.Sizeof(LARGE_INTEGER{}))) } if (*EntropyGatherer)(unsafe.Pointer(bp+16)).FnXor > nBuf { return nBuf } return (*EntropyGatherer)(unsafe.Pointer(bp + 16)).FnXor } func winSleep(tls *libc.TLS, pVfs uintptr, microsec int32) int32 { Xsqlite3_win32_sleep(tls, uint32((microsec+999)/1000)) _ = pVfs return (microsec + 999) / 1000 * 1000 } func winCurrentTimeInt64(tls *libc.TLS, pVfs uintptr, piNow uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) (*(*func(*libc.TLS, LPFILETIME))(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 30*24 + 8)))(tls, bp) *(*Sqlite3_int64)(unsafe.Pointer(piNow)) = winFiletimeEpoch + (Sqlite3_int64((*FILETIME)(unsafe.Pointer(bp)).FdwHighDateTime)*max32BitValue+Sqlite3_int64((*FILETIME)(unsafe.Pointer(bp)).FdwLowDateTime))/int64(10000) _ = pVfs return SQLITE_OK } var winFiletimeEpoch Sqlite3_int64 = int64(23058135) * int64(8640000) var max32BitValue Sqlite3_int64 = int64(2000000000) + int64(2000000000) + int64(294967296) func winCurrentTime(tls *libc.TLS, pVfs uintptr, prNow uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = winCurrentTimeInt64(tls, pVfs, bp) if !(rc != 0) { *(*float64)(unsafe.Pointer(prNow)) = float64(*(*Sqlite3_int64)(unsafe.Pointer(bp))) / 86400000.0 } return rc } func winGetLastError(tls *libc.TLS, pVfs uintptr, nBuf int32, zBuf uintptr) int32 { var e DWORD = (*(*func(*libc.TLS) DWORD)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 26*24 + 8)))(tls) _ = pVfs if nBuf > 0 { winGetLastErrorMsg(tls, e, nBuf, zBuf) } return int32(e) } // Initialize and deinitialize the operating system interface. func Xsqlite3_os_init(tls *libc.TLS) int32 { libc.Xmemset(tls, uintptr(unsafe.Pointer(&winSysInfo)), 0, uint64(unsafe.Sizeof(SYSTEM_INFO{}))) (*(*func(*libc.TLS, LPSYSTEM_INFO))(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 28*24 + 8)))(tls, uintptr(unsafe.Pointer(&winSysInfo))) Xsqlite3_vfs_register(tls, uintptr(unsafe.Pointer(&winVfs)), 1) Xsqlite3_vfs_register(tls, uintptr(unsafe.Pointer(&winLongPathVfs)), 0) Xsqlite3_vfs_register(tls, uintptr(unsafe.Pointer(&winNolockVfs)), 0) Xsqlite3_vfs_register(tls, uintptr(unsafe.Pointer(&winLongPathNolockVfs)), 0) winBigLock = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1) return SQLITE_OK } var winVfs = Sqlite3_vfs{ FiVersion: 3, FszOsFile: int32(unsafe.Sizeof(WinFile{})), FmxPathname: MAX_PATH * 4, FzName: ts + 5135, FpAppData: 0, FxOpen: 0, FxDelete: 0, FxAccess: 0, FxFullPathname: 0, FxDlOpen: 0, FxDlError: 0, FxDlSym: 0, FxDlClose: 0, FxRandomness: 0, FxSleep: 0, FxCurrentTime: 0, FxGetLastError: 0, FxCurrentTimeInt64: 0, FxSetSystemCall: 0, FxGetSystemCall: 0, FxNextSystemCall: 0, } var winLongPathVfs = Sqlite3_vfs{ FiVersion: 3, FszOsFile: int32(unsafe.Sizeof(WinFile{})), FmxPathname: int32(uint64(unsafe.Sizeof(WCHAR(0))) * uint64(32767)), FzName: ts + 5141, FpAppData: 0, FxOpen: 0, FxDelete: 0, FxAccess: 0, FxFullPathname: 0, FxDlOpen: 0, FxDlError: 0, FxDlSym: 0, FxDlClose: 0, FxRandomness: 0, FxSleep: 0, FxCurrentTime: 0, FxGetLastError: 0, FxCurrentTimeInt64: 0, FxSetSystemCall: 0, FxGetSystemCall: 0, FxNextSystemCall: 0, } var winNolockVfs = Sqlite3_vfs{ FiVersion: 3, FszOsFile: int32(unsafe.Sizeof(WinFile{})), FmxPathname: MAX_PATH * 4, FzName: ts + 5156, FpAppData: 0, FxOpen: 0, FxDelete: 0, FxAccess: 0, FxFullPathname: 0, FxDlOpen: 0, FxDlError: 0, FxDlSym: 0, FxDlClose: 0, FxRandomness: 0, FxSleep: 0, FxCurrentTime: 0, FxGetLastError: 0, FxCurrentTimeInt64: 0, FxSetSystemCall: 0, FxGetSystemCall: 0, FxNextSystemCall: 0, } var winLongPathNolockVfs = Sqlite3_vfs{ FiVersion: 3, FszOsFile: int32(unsafe.Sizeof(WinFile{})), FmxPathname: int32(uint64(unsafe.Sizeof(WCHAR(0))) * uint64(32767)), FzName: ts + 5167, FpAppData: 0, FxOpen: 0, FxDelete: 0, FxAccess: 0, FxFullPathname: 0, FxDlOpen: 0, FxDlError: 0, FxDlSym: 0, FxDlClose: 0, FxRandomness: 0, FxSleep: 0, FxCurrentTime: 0, FxGetLastError: 0, FxCurrentTimeInt64: 0, FxSetSystemCall: 0, FxGetSystemCall: 0, FxNextSystemCall: 0, } func Xsqlite3_os_end(tls *libc.TLS) int32 { winBigLock = uintptr(0) return SQLITE_OK } // Forward declaration of objects used by this utility type MemVfs = sqlite3_vfs type MemFile1 = struct { Fbase Sqlite3_file FpStore uintptr FeLock int32 F__ccgo_pad1 [4]byte } type MemFile = MemFile1 type MemStore1 = struct { Fsz Sqlite3_int64 FszAlloc Sqlite3_int64 FszMax Sqlite3_int64 FaData uintptr FpMutex uintptr FnMmap int32 FmFlags uint32 FnRdLock int32 FnWrLock int32 FnRef int32 F__ccgo_pad1 [4]byte FzFName uintptr } type MemStore = MemStore1 // File-scope variables for holding the memdb files that are accessible // to multiple database connections in separate threads. // // Must hold SQLITE_MUTEX_STATIC_VFS1 to access any part of this object. type MemFS = struct { FnMemStore int32 F__ccgo_pad1 [4]byte FapMemStore uintptr } var memdb_g MemFS var memdb_vfs = Sqlite3_vfs{ FiVersion: 2, FmxPathname: 1024, FzName: ts + 5187, FxOpen: 0, FxAccess: 0, FxFullPathname: 0, FxDlOpen: 0, FxDlError: 0, FxDlSym: 0, FxDlClose: 0, FxRandomness: 0, FxSleep: 0, FxGetLastError: 0, FxCurrentTimeInt64: 0, } var memdb_io_methods = Sqlite3_io_methods{ FiVersion: 3, FxClose: 0, FxRead: 0, FxWrite: 0, FxTruncate: 0, FxSync: 0, FxFileSize: 0, FxLock: 0, FxUnlock: 0, FxFileControl: 0, FxDeviceCharacteristics: 0, FxFetch: 0, FxUnfetch: 0, } func memdbEnter(tls *libc.TLS, p uintptr) { Xsqlite3_mutex_enter(tls, (*MemStore)(unsafe.Pointer(p)).FpMutex) } func memdbLeave(tls *libc.TLS, p uintptr) { Xsqlite3_mutex_leave(tls, (*MemStore)(unsafe.Pointer(p)).FpMutex) } func memdbClose(tls *libc.TLS, pFile uintptr) int32 { var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore if (*MemStore)(unsafe.Pointer(p)).FzFName != 0 { var i int32 var pVfsMutex uintptr = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1) Xsqlite3_mutex_enter(tls, pVfsMutex) for i = 0; i < memdb_g.FnMemStore; i++ { if *(*uintptr)(unsafe.Pointer(memdb_g.FapMemStore + uintptr(i)*8)) == p { memdbEnter(tls, p) if (*MemStore)(unsafe.Pointer(p)).FnRef == 1 { *(*uintptr)(unsafe.Pointer(memdb_g.FapMemStore + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer(memdb_g.FapMemStore + uintptr(libc.PreDecInt32(&memdb_g.FnMemStore, 1))*8)) if memdb_g.FnMemStore == 0 { Xsqlite3_free(tls, memdb_g.FapMemStore) memdb_g.FapMemStore = uintptr(0) } } break } } Xsqlite3_mutex_leave(tls, pVfsMutex) } else { memdbEnter(tls, p) } (*MemStore)(unsafe.Pointer(p)).FnRef-- if (*MemStore)(unsafe.Pointer(p)).FnRef <= 0 { if (*MemStore)(unsafe.Pointer(p)).FmFlags&uint32(SQLITE_DESERIALIZE_FREEONCLOSE) != 0 { Xsqlite3_free(tls, (*MemStore)(unsafe.Pointer(p)).FaData) } memdbLeave(tls, p) Xsqlite3_mutex_free(tls, (*MemStore)(unsafe.Pointer(p)).FpMutex) Xsqlite3_free(tls, p) } else { memdbLeave(tls, p) } return SQLITE_OK } func memdbRead(tls *libc.TLS, pFile uintptr, zBuf uintptr, iAmt int32, iOfst Sqlite_int64) int32 { var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore memdbEnter(tls, p) if iOfst+Sqlite_int64(iAmt) > (*MemStore)(unsafe.Pointer(p)).Fsz { libc.Xmemset(tls, zBuf, 0, uint64(iAmt)) if iOfst < (*MemStore)(unsafe.Pointer(p)).Fsz { libc.Xmemcpy(tls, zBuf, (*MemStore)(unsafe.Pointer(p)).FaData+uintptr(iOfst), uint64((*MemStore)(unsafe.Pointer(p)).Fsz-iOfst)) } memdbLeave(tls, p) return SQLITE_IOERR | int32(2)<<8 } libc.Xmemcpy(tls, zBuf, (*MemStore)(unsafe.Pointer(p)).FaData+uintptr(iOfst), uint64(iAmt)) memdbLeave(tls, p) return SQLITE_OK } func memdbEnlarge(tls *libc.TLS, p uintptr, newSz Sqlite3_int64) int32 { var pNew uintptr if (*MemStore)(unsafe.Pointer(p)).FmFlags&uint32(SQLITE_DESERIALIZE_RESIZEABLE) == uint32(0) || (*MemStore)(unsafe.Pointer(p)).FnMmap > 0 { return SQLITE_FULL } if newSz > (*MemStore)(unsafe.Pointer(p)).FszMax { return SQLITE_FULL } newSz = newSz * int64(2) if newSz > (*MemStore)(unsafe.Pointer(p)).FszMax { newSz = (*MemStore)(unsafe.Pointer(p)).FszMax } pNew = Xsqlite3Realloc(tls, (*MemStore)(unsafe.Pointer(p)).FaData, uint64(newSz)) if pNew == uintptr(0) { return SQLITE_IOERR | int32(12)<<8 } (*MemStore)(unsafe.Pointer(p)).FaData = pNew (*MemStore)(unsafe.Pointer(p)).FszAlloc = newSz return SQLITE_OK } func memdbWrite(tls *libc.TLS, pFile uintptr, z uintptr, iAmt int32, iOfst Sqlite_int64) int32 { var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore memdbEnter(tls, p) if (*MemStore)(unsafe.Pointer(p)).FmFlags&uint32(SQLITE_DESERIALIZE_READONLY) != 0 { memdbLeave(tls, p) return SQLITE_IOERR | int32(3)<<8 } if iOfst+Sqlite_int64(iAmt) > (*MemStore)(unsafe.Pointer(p)).Fsz { var rc int32 if iOfst+Sqlite_int64(iAmt) > (*MemStore)(unsafe.Pointer(p)).FszAlloc && libc.AssignInt32(&rc, memdbEnlarge(tls, p, iOfst+Sqlite_int64(iAmt))) != SQLITE_OK { memdbLeave(tls, p) return rc } if iOfst > (*MemStore)(unsafe.Pointer(p)).Fsz { libc.Xmemset(tls, (*MemStore)(unsafe.Pointer(p)).FaData+uintptr((*MemStore)(unsafe.Pointer(p)).Fsz), 0, uint64(iOfst-(*MemStore)(unsafe.Pointer(p)).Fsz)) } (*MemStore)(unsafe.Pointer(p)).Fsz = iOfst + Sqlite_int64(iAmt) } libc.Xmemcpy(tls, (*MemStore)(unsafe.Pointer(p)).FaData+uintptr(iOfst), z, uint64(iAmt)) memdbLeave(tls, p) return SQLITE_OK } func memdbTruncate(tls *libc.TLS, pFile uintptr, size Sqlite_int64) int32 { var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore var rc int32 = SQLITE_OK memdbEnter(tls, p) if size > (*MemStore)(unsafe.Pointer(p)).Fsz { rc = SQLITE_CORRUPT } else { (*MemStore)(unsafe.Pointer(p)).Fsz = size } memdbLeave(tls, p) return rc } func memdbSync(tls *libc.TLS, pFile uintptr, flags int32) int32 { _ = pFile _ = flags return SQLITE_OK } func memdbFileSize(tls *libc.TLS, pFile uintptr, pSize uintptr) int32 { var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore memdbEnter(tls, p) *(*Sqlite_int64)(unsafe.Pointer(pSize)) = (*MemStore)(unsafe.Pointer(p)).Fsz memdbLeave(tls, p) return SQLITE_OK } func memdbLock(tls *libc.TLS, pFile uintptr, eLock int32) int32 { var pThis uintptr = pFile var p uintptr = (*MemFile)(unsafe.Pointer(pThis)).FpStore var rc int32 = SQLITE_OK if eLock <= (*MemFile)(unsafe.Pointer(pThis)).FeLock { return SQLITE_OK } memdbEnter(tls, p) if eLock > SQLITE_LOCK_SHARED && (*MemStore)(unsafe.Pointer(p)).FmFlags&uint32(SQLITE_DESERIALIZE_READONLY) != 0 { rc = SQLITE_READONLY } else { switch eLock { case SQLITE_LOCK_SHARED: { if (*MemStore)(unsafe.Pointer(p)).FnWrLock > 0 { rc = SQLITE_BUSY } else { (*MemStore)(unsafe.Pointer(p)).FnRdLock++ } break } fallthrough case SQLITE_LOCK_RESERVED: fallthrough case SQLITE_LOCK_PENDING: { if (*MemFile)(unsafe.Pointer(pThis)).FeLock == SQLITE_LOCK_SHARED { if (*MemStore)(unsafe.Pointer(p)).FnWrLock > 0 { rc = SQLITE_BUSY } else { (*MemStore)(unsafe.Pointer(p)).FnWrLock = 1 } } break } fallthrough default: { if (*MemStore)(unsafe.Pointer(p)).FnRdLock > 1 { rc = SQLITE_BUSY } else if (*MemFile)(unsafe.Pointer(pThis)).FeLock == SQLITE_LOCK_SHARED { (*MemStore)(unsafe.Pointer(p)).FnWrLock = 1 } break } } } if rc == SQLITE_OK { (*MemFile)(unsafe.Pointer(pThis)).FeLock = eLock } memdbLeave(tls, p) return rc } func memdbUnlock(tls *libc.TLS, pFile uintptr, eLock int32) int32 { var pThis uintptr = pFile var p uintptr = (*MemFile)(unsafe.Pointer(pThis)).FpStore if eLock >= (*MemFile)(unsafe.Pointer(pThis)).FeLock { return SQLITE_OK } memdbEnter(tls, p) if eLock == SQLITE_LOCK_SHARED { if (*MemFile)(unsafe.Pointer(pThis)).FeLock > SQLITE_LOCK_SHARED { (*MemStore)(unsafe.Pointer(p)).FnWrLock-- } } else { if (*MemFile)(unsafe.Pointer(pThis)).FeLock > SQLITE_LOCK_SHARED { (*MemStore)(unsafe.Pointer(p)).FnWrLock-- } (*MemStore)(unsafe.Pointer(p)).FnRdLock-- } (*MemFile)(unsafe.Pointer(pThis)).FeLock = eLock memdbLeave(tls, p) return SQLITE_OK } func memdbFileControl(tls *libc.TLS, pFile uintptr, op int32, pArg uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore var rc int32 = SQLITE_NOTFOUND memdbEnter(tls, p) if op == SQLITE_FCNTL_VFSNAME { *(*uintptr)(unsafe.Pointer(pArg)) = Xsqlite3_mprintf(tls, ts+5193, libc.VaList(bp, (*MemStore)(unsafe.Pointer(p)).FaData, (*MemStore)(unsafe.Pointer(p)).Fsz)) rc = SQLITE_OK } if op == SQLITE_FCNTL_SIZE_LIMIT { var iLimit Sqlite3_int64 = *(*Sqlite3_int64)(unsafe.Pointer(pArg)) if iLimit < (*MemStore)(unsafe.Pointer(p)).Fsz { if iLimit < int64(0) { iLimit = (*MemStore)(unsafe.Pointer(p)).FszMax } else { iLimit = (*MemStore)(unsafe.Pointer(p)).Fsz } } (*MemStore)(unsafe.Pointer(p)).FszMax = iLimit *(*Sqlite3_int64)(unsafe.Pointer(pArg)) = iLimit rc = SQLITE_OK } memdbLeave(tls, p) return rc } func memdbDeviceCharacteristics(tls *libc.TLS, pFile uintptr) int32 { _ = pFile return SQLITE_IOCAP_ATOMIC | SQLITE_IOCAP_POWERSAFE_OVERWRITE | SQLITE_IOCAP_SAFE_APPEND | SQLITE_IOCAP_SEQUENTIAL } func memdbFetch(tls *libc.TLS, pFile uintptr, iOfst Sqlite3_int64, iAmt int32, pp uintptr) int32 { var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore memdbEnter(tls, p) if iOfst+Sqlite3_int64(iAmt) > (*MemStore)(unsafe.Pointer(p)).Fsz || (*MemStore)(unsafe.Pointer(p)).FmFlags&uint32(SQLITE_DESERIALIZE_RESIZEABLE) != uint32(0) { *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) } else { (*MemStore)(unsafe.Pointer(p)).FnMmap++ *(*uintptr)(unsafe.Pointer(pp)) = (*MemStore)(unsafe.Pointer(p)).FaData + uintptr(iOfst) } memdbLeave(tls, p) return SQLITE_OK } func memdbUnfetch(tls *libc.TLS, pFile uintptr, iOfst Sqlite3_int64, pPage uintptr) int32 { var p uintptr = (*MemFile)(unsafe.Pointer(pFile)).FpStore _ = iOfst _ = pPage memdbEnter(tls, p) (*MemStore)(unsafe.Pointer(p)).FnMmap-- memdbLeave(tls, p) return SQLITE_OK } func memdbOpen(tls *libc.TLS, pVfs uintptr, zName uintptr, pFd uintptr, flags int32, pOutFlags uintptr) int32 { var pFile uintptr = pFd var p uintptr = uintptr(0) var szName int32 _ = pVfs libc.Xmemset(tls, pFile, 0, uint64(unsafe.Sizeof(MemFile{}))) szName = Xsqlite3Strlen30(tls, zName) if szName > 1 && (int32(*(*int8)(unsafe.Pointer(zName))) == '/' || int32(*(*int8)(unsafe.Pointer(zName))) == '\\') { var i int32 var pVfsMutex uintptr = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1) Xsqlite3_mutex_enter(tls, pVfsMutex) for i = 0; i < memdb_g.FnMemStore; i++ { if libc.Xstrcmp(tls, (*MemStore)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(memdb_g.FapMemStore + uintptr(i)*8)))).FzFName, zName) == 0 { p = *(*uintptr)(unsafe.Pointer(memdb_g.FapMemStore + uintptr(i)*8)) break } } if p == uintptr(0) { var apNew uintptr p = Xsqlite3Malloc(tls, uint64(unsafe.Sizeof(MemStore{}))+uint64(szName)+uint64(3)) if p == uintptr(0) { Xsqlite3_mutex_leave(tls, pVfsMutex) return SQLITE_NOMEM } apNew = Xsqlite3Realloc(tls, memdb_g.FapMemStore, uint64(unsafe.Sizeof(uintptr(0)))*uint64(memdb_g.FnMemStore+1)) if apNew == uintptr(0) { Xsqlite3_free(tls, p) Xsqlite3_mutex_leave(tls, pVfsMutex) return SQLITE_NOMEM } *(*uintptr)(unsafe.Pointer(apNew + uintptr(libc.PostIncInt32(&memdb_g.FnMemStore, 1))*8)) = p memdb_g.FapMemStore = apNew libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(MemStore{}))) (*MemStore)(unsafe.Pointer(p)).FmFlags = uint32(SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE) (*MemStore)(unsafe.Pointer(p)).FszMax = Xsqlite3Config.FmxMemdbSize (*MemStore)(unsafe.Pointer(p)).FzFName = p + 1*72 libc.Xmemcpy(tls, (*MemStore)(unsafe.Pointer(p)).FzFName, zName, uint64(szName+1)) (*MemStore)(unsafe.Pointer(p)).FpMutex = Xsqlite3_mutex_alloc(tls, SQLITE_MUTEX_FAST) if (*MemStore)(unsafe.Pointer(p)).FpMutex == uintptr(0) { memdb_g.FnMemStore-- Xsqlite3_free(tls, p) Xsqlite3_mutex_leave(tls, pVfsMutex) return SQLITE_NOMEM } (*MemStore)(unsafe.Pointer(p)).FnRef = 1 memdbEnter(tls, p) } else { memdbEnter(tls, p) (*MemStore)(unsafe.Pointer(p)).FnRef++ } Xsqlite3_mutex_leave(tls, pVfsMutex) } else { p = Xsqlite3Malloc(tls, uint64(unsafe.Sizeof(MemStore{}))) if p == uintptr(0) { return SQLITE_NOMEM } libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(MemStore{}))) (*MemStore)(unsafe.Pointer(p)).FmFlags = uint32(SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE) (*MemStore)(unsafe.Pointer(p)).FszMax = Xsqlite3Config.FmxMemdbSize } (*MemFile)(unsafe.Pointer(pFile)).FpStore = p if pOutFlags != uintptr(0) { *(*int32)(unsafe.Pointer(pOutFlags)) = flags | SQLITE_OPEN_MEMORY } (*Sqlite3_file)(unsafe.Pointer(pFd)).FpMethods = uintptr(unsafe.Pointer(&memdb_io_methods)) memdbLeave(tls, p) return SQLITE_OK } func memdbAccess(tls *libc.TLS, pVfs uintptr, zPath uintptr, flags int32, pResOut uintptr) int32 { _ = pVfs _ = zPath _ = flags *(*int32)(unsafe.Pointer(pResOut)) = 0 return SQLITE_OK } func memdbFullPathname(tls *libc.TLS, pVfs uintptr, zPath uintptr, nOut int32, zOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) _ = pVfs Xsqlite3_snprintf(tls, nOut, zOut, ts+4493, libc.VaList(bp, zPath)) return SQLITE_OK } func memdbDlOpen(tls *libc.TLS, pVfs uintptr, zPath uintptr) uintptr { return (*struct { f func(*libc.TLS, uintptr, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxDlOpen})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, zPath) } func memdbDlError(tls *libc.TLS, pVfs uintptr, nByte int32, zErrMsg uintptr) { (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxDlError})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, nByte, zErrMsg) } func memdbDlSym(tls *libc.TLS, pVfs uintptr, p uintptr, zSym uintptr) uintptr { return (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxDlSym})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, p, zSym) } func memdbDlClose(tls *libc.TLS, pVfs uintptr, pHandle uintptr) { (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxDlClose})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, pHandle) } func memdbRandomness(tls *libc.TLS, pVfs uintptr, nByte int32, zBufOut uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxRandomness})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, nByte, zBufOut) } func memdbSleep(tls *libc.TLS, pVfs uintptr, nMicro int32) int32 { return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxSleep})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, nMicro) } func memdbGetLastError(tls *libc.TLS, pVfs uintptr, a int32, b uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxGetLastError})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, a, b) } func memdbCurrentTimeInt64(tls *libc.TLS, pVfs uintptr, p uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData)).FxCurrentTimeInt64})).f(tls, (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FpAppData, p) } func memdbFromDbSchema(tls *libc.TLS, db uintptr, zSchema uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var pStore uintptr var rc int32 = Xsqlite3_file_control(tls, db, zSchema, SQLITE_FCNTL_FILE_POINTER, bp) if rc != 0 { return uintptr(0) } if (*MemFile)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fbase.FpMethods != uintptr(unsafe.Pointer(&memdb_io_methods)) { return uintptr(0) } pStore = (*MemFile)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpStore memdbEnter(tls, pStore) if (*MemStore)(unsafe.Pointer(pStore)).FzFName != uintptr(0) { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) } memdbLeave(tls, pStore) return *(*uintptr)(unsafe.Pointer(bp)) } // Return the serialization of a database func Xsqlite3_serialize(tls *libc.TLS, db uintptr, zSchema uintptr, piSize uintptr, mFlags uint32) uintptr { bp := tls.Alloc(24) defer tls.Free(24) var p uintptr var iDb int32 var pBt uintptr var sz Sqlite3_int64 var szPage int32 = 0 *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var pOut uintptr var zSql uintptr var rc int32 if zSchema == uintptr(0) { zSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FzDbSName } p = memdbFromDbSchema(tls, db, zSchema) iDb = Xsqlite3FindDbName(tls, db, zSchema) if piSize != 0 { *(*Sqlite3_int64)(unsafe.Pointer(piSize)) = int64(-1) } if iDb < 0 { return uintptr(0) } if p != 0 { var pStore uintptr = (*MemFile)(unsafe.Pointer(p)).FpStore if piSize != 0 { *(*Sqlite3_int64)(unsafe.Pointer(piSize)) = (*MemStore)(unsafe.Pointer(pStore)).Fsz } if mFlags&uint32(SQLITE_SERIALIZE_NOCOPY) != 0 { pOut = (*MemStore)(unsafe.Pointer(pStore)).FaData } else { pOut = Xsqlite3_malloc64(tls, uint64((*MemStore)(unsafe.Pointer(pStore)).Fsz)) if pOut != 0 { libc.Xmemcpy(tls, pOut, (*MemStore)(unsafe.Pointer(pStore)).FaData, uint64((*MemStore)(unsafe.Pointer(pStore)).Fsz)) } } return pOut } pBt = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt if pBt == uintptr(0) { return uintptr(0) } szPage = Xsqlite3BtreeGetPageSize(tls, pBt) zSql = Xsqlite3_mprintf(tls, ts+5208, libc.VaList(bp, zSchema)) if zSql != 0 { rc = Xsqlite3_prepare_v2(tls, db, zSql, -1, bp+8, uintptr(0)) } else { rc = SQLITE_NOMEM } Xsqlite3_free(tls, zSql) if rc != 0 { return uintptr(0) } rc = Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) if rc != SQLITE_ROW { pOut = uintptr(0) } else { sz = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 0) * Sqlite_int64(szPage) if piSize != 0 { *(*Sqlite3_int64)(unsafe.Pointer(piSize)) = sz } if mFlags&uint32(SQLITE_SERIALIZE_NOCOPY) != 0 { pOut = uintptr(0) } else { pOut = Xsqlite3_malloc64(tls, uint64(sz)) if pOut != 0 { var nPage int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 0) var pPager uintptr = Xsqlite3BtreePager(tls, pBt) var pgno int32 for pgno = 1; pgno <= nPage; pgno++ { *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var pTo uintptr = pOut + uintptr(Sqlite3_int64(szPage)*Sqlite3_int64(pgno-1)) rc = Xsqlite3PagerGet(tls, pPager, uint32(pgno), bp+16, 0) if rc == SQLITE_OK { libc.Xmemcpy(tls, pTo, Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp + 16))), uint64(szPage)) } else { libc.Xmemset(tls, pTo, 0, uint64(szPage)) } Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) } } } } Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) return pOut } // Convert zSchema to a MemDB and initialize its content. func Xsqlite3_deserialize(tls *libc.TLS, db uintptr, zSchema uintptr, pData uintptr, szDb Sqlite3_int64, szBuf Sqlite3_int64, mFlags uint32) int32 { bp := tls.Alloc(16) defer tls.Free(16) var p uintptr var zSql uintptr var rc int32 var iDb int32 var pStore uintptr *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if !(zSchema == uintptr(0)) { goto __1 } zSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FzDbSName __1: ; iDb = Xsqlite3FindDbName(tls, db, zSchema) if !(iDb < 2 && iDb != 0) { goto __2 } rc = SQLITE_ERROR goto end_deserialize __2: ; zSql = Xsqlite3_mprintf(tls, ts+5231, libc.VaList(bp, zSchema)) if !(zSql == uintptr(0)) { goto __3 } rc = SQLITE_NOMEM goto __4 __3: rc = Xsqlite3_prepare_v2(tls, db, zSql, -1, bp+8, uintptr(0)) Xsqlite3_free(tls, zSql) __4: ; if !(rc != 0) { goto __5 } goto end_deserialize __5: ; (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(iDb) libc.SetBitFieldPtr8Uint32(db+192+8, uint32(1), 2, 0x4) rc = Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) libc.SetBitFieldPtr8Uint32(db+192+8, uint32(0), 2, 0x4) if !(rc != SQLITE_DONE) { goto __6 } rc = SQLITE_ERROR goto end_deserialize __6: ; p = memdbFromDbSchema(tls, db, zSchema) if !(p == uintptr(0)) { goto __7 } rc = SQLITE_ERROR goto __8 __7: pStore = (*MemFile)(unsafe.Pointer(p)).FpStore (*MemStore)(unsafe.Pointer(pStore)).FaData = pData pData = uintptr(0) (*MemStore)(unsafe.Pointer(pStore)).Fsz = szDb (*MemStore)(unsafe.Pointer(pStore)).FszAlloc = szBuf (*MemStore)(unsafe.Pointer(pStore)).FszMax = szBuf if !((*MemStore)(unsafe.Pointer(pStore)).FszMax < Xsqlite3Config.FmxMemdbSize) { goto __9 } (*MemStore)(unsafe.Pointer(pStore)).FszMax = Xsqlite3Config.FmxMemdbSize __9: ; (*MemStore)(unsafe.Pointer(pStore)).FmFlags = mFlags rc = SQLITE_OK __8: ; end_deserialize: Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) if !(pData != 0 && mFlags&uint32(SQLITE_DESERIALIZE_FREEONCLOSE) != uint32(0)) { goto __10 } Xsqlite3_free(tls, pData) __10: ; Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Return true if the VFS is the memvfs. func Xsqlite3IsMemdb(tls *libc.TLS, pVfs uintptr) int32 { return libc.Bool32(pVfs == uintptr(unsafe.Pointer(&memdb_vfs))) } // This routine is called when the extension is loaded. // Register the new VFS. func Xsqlite3MemdbInit(tls *libc.TLS) int32 { var pLower uintptr = Xsqlite3_vfs_find(tls, uintptr(0)) var sz uint32 if pLower == uintptr(0) { return SQLITE_ERROR } sz = uint32((*Sqlite3_vfs)(unsafe.Pointer(pLower)).FszOsFile) memdb_vfs.FpAppData = pLower if uint64(sz) < uint64(unsafe.Sizeof(MemFile{})) { sz = uint32(unsafe.Sizeof(MemFile{})) } memdb_vfs.FszOsFile = int32(sz) return Xsqlite3_vfs_register(tls, uintptr(unsafe.Pointer(&memdb_vfs)), 0) } // Create a new bitmap object able to handle bits between 0 and iSize, // inclusive. Return a pointer to the new object. Return NULL if // malloc fails. func Xsqlite3BitvecCreate(tls *libc.TLS, iSize U32) uintptr { var p uintptr p = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(Bitvec{}))) if p != 0 { (*Bitvec)(unsafe.Pointer(p)).FiSize = iSize } return p } // Check to see if the i-th bit is set. Return true or false. // If p is NULL (if the bitmap has not been created) or if // i is out of range, then return false. func Xsqlite3BitvecTestNotNull(tls *libc.TLS, p uintptr, i U32) int32 { i-- if i >= (*Bitvec)(unsafe.Pointer(p)).FiSize { return 0 } for (*Bitvec)(unsafe.Pointer(p)).FiDivisor != 0 { var bin U32 = i / (*Bitvec)(unsafe.Pointer(p)).FiDivisor i = i % (*Bitvec)(unsafe.Pointer(p)).FiDivisor p = *(*uintptr)(unsafe.Pointer(p + 16 + uintptr(bin)*8)) if !(p != 0) { return 0 } } if uint64((*Bitvec)(unsafe.Pointer(p)).FiSize) <= (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U8(0)))*uint64(BITVEC_SZELEM) { return libc.Bool32(int32(*(*U8)(unsafe.Pointer(p + 16 + uintptr(i/U32(BITVEC_SZELEM)))))&(int32(1)<<(i&U32(BITVEC_SZELEM-1))) != 0) } else { var h U32 = U32(uint64(libc.PostIncUint32(&i, 1)*U32(1)) % ((uint64(BITVEC_SZ) - uint64(3)*uint64(unsafe.Sizeof(U32(0)))) / uint64(unsafe.Sizeof(uintptr(0))) * uint64(unsafe.Sizeof(uintptr(0))) / uint64(unsafe.Sizeof(U32(0))))) for *(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4)) != 0 { if *(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4)) == i { return 1 } h = U32(uint64(h+U32(1)) % ((uint64(BITVEC_SZ) - uint64(3)*uint64(unsafe.Sizeof(U32(0)))) / uint64(unsafe.Sizeof(uintptr(0))) * uint64(unsafe.Sizeof(uintptr(0))) / uint64(unsafe.Sizeof(U32(0))))) } return 0 } return int32(0) } func Xsqlite3BitvecTest(tls *libc.TLS, p uintptr, i U32) int32 { return libc.Bool32(p != uintptr(0) && Xsqlite3BitvecTestNotNull(tls, p, i) != 0) } // Set the i-th bit. Return 0 on success and an error code if // anything goes wrong. // // This routine might cause sub-bitmaps to be allocated. Failing // to get the memory needed to hold the sub-bitmap is the only // that can go wrong with an insert, assuming p and i are valid. // // The calling function must ensure that p is a valid Bitvec object // and that the value for "i" is within range of the Bitvec object. // Otherwise the behavior is undefined. func Xsqlite3BitvecSet(tls *libc.TLS, p uintptr, i U32) int32 { var h U32 var bin U32 var j uint32 var rc int32 var aiValues uintptr if !(p == uintptr(0)) { goto __1 } return SQLITE_OK __1: ; i-- __2: if !(uint64((*Bitvec)(unsafe.Pointer(p)).FiSize) > (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U8(0)))*uint64(BITVEC_SZELEM) && (*Bitvec)(unsafe.Pointer(p)).FiDivisor != 0) { goto __3 } bin = i / (*Bitvec)(unsafe.Pointer(p)).FiDivisor i = i % (*Bitvec)(unsafe.Pointer(p)).FiDivisor if !(*(*uintptr)(unsafe.Pointer(p + 16 + uintptr(bin)*8)) == uintptr(0)) { goto __4 } *(*uintptr)(unsafe.Pointer(p + 16 + uintptr(bin)*8)) = Xsqlite3BitvecCreate(tls, (*Bitvec)(unsafe.Pointer(p)).FiDivisor) if !(*(*uintptr)(unsafe.Pointer(p + 16 + uintptr(bin)*8)) == uintptr(0)) { goto __5 } return SQLITE_NOMEM __5: ; __4: ; p = *(*uintptr)(unsafe.Pointer(p + 16 + uintptr(bin)*8)) goto __2 __3: ; if !(uint64((*Bitvec)(unsafe.Pointer(p)).FiSize) <= (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U8(0)))*uint64(BITVEC_SZELEM)) { goto __6 } *(*U8)(unsafe.Pointer(p + 16 + uintptr(i/U32(BITVEC_SZELEM)))) |= U8(int32(1) << (i & U32(BITVEC_SZELEM-1))) return SQLITE_OK __6: ; h = U32(uint64(libc.PostIncUint32(&i, 1)*U32(1)) % ((uint64(BITVEC_SZ) - uint64(3)*uint64(unsafe.Sizeof(U32(0)))) / uint64(unsafe.Sizeof(uintptr(0))) * uint64(unsafe.Sizeof(uintptr(0))) / uint64(unsafe.Sizeof(U32(0))))) if !!(int32(*(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4))) != 0) { goto __7 } if !(uint64((*Bitvec)(unsafe.Pointer(p)).FnSet) < (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U32(0)))-uint64(1)) { goto __8 } goto bitvec_set_end goto __9 __8: goto bitvec_set_rehash __9: ; __7: ; __10: if !(*(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4)) == i) { goto __13 } return SQLITE_OK __13: ; h++ if !(uint64(h) >= (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U32(0)))) { goto __14 } h = U32(0) __14: ; goto __11 __11: if *(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4)) != 0 { goto __10 } goto __12 __12: ; bitvec_set_rehash: if !(uint64((*Bitvec)(unsafe.Pointer(p)).FnSet) >= (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U32(0)))/uint64(2)) { goto __15 } aiValues = Xsqlite3DbMallocRaw(tls, uintptr(0), uint64(unsafe.Sizeof([124]U32{}))) if !(aiValues == uintptr(0)) { goto __16 } return SQLITE_NOMEM goto __17 __16: libc.Xmemcpy(tls, aiValues, p+16, uint64(unsafe.Sizeof([124]U32{}))) libc.Xmemset(tls, p+16, 0, uint64(unsafe.Sizeof([62]uintptr{}))) (*Bitvec)(unsafe.Pointer(p)).FiDivisor = U32((uint64((*Bitvec)(unsafe.Pointer(p)).FiSize) + (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(uintptr(0))) - uint64(1)) / ((uint64(BITVEC_SZ) - uint64(3)*uint64(unsafe.Sizeof(U32(0)))) / uint64(unsafe.Sizeof(uintptr(0))) * uint64(unsafe.Sizeof(uintptr(0))) / uint64(unsafe.Sizeof(uintptr(0))))) rc = Xsqlite3BitvecSet(tls, p, i) j = uint32(0) __18: if !(uint64(j) < (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U32(0)))) { goto __20 } if !(*(*U32)(unsafe.Pointer(aiValues + uintptr(j)*4)) != 0) { goto __21 } rc = rc | Xsqlite3BitvecSet(tls, p, *(*U32)(unsafe.Pointer(aiValues + uintptr(j)*4))) __21: ; goto __19 __19: j++ goto __18 goto __20 __20: ; Xsqlite3DbFree(tls, uintptr(0), aiValues) return rc __17: ; __15: ; bitvec_set_end: (*Bitvec)(unsafe.Pointer(p)).FnSet++ *(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4)) = i return SQLITE_OK } // Clear the i-th bit. // // pBuf must be a pointer to at least BITVEC_SZ bytes of temporary storage // that BitvecClear can use to rebuilt its hash table. func Xsqlite3BitvecClear(tls *libc.TLS, p uintptr, i U32, pBuf uintptr) { if p == uintptr(0) { return } i-- for (*Bitvec)(unsafe.Pointer(p)).FiDivisor != 0 { var bin U32 = i / (*Bitvec)(unsafe.Pointer(p)).FiDivisor i = i % (*Bitvec)(unsafe.Pointer(p)).FiDivisor p = *(*uintptr)(unsafe.Pointer(p + 16 + uintptr(bin)*8)) if !(p != 0) { return } } if uint64((*Bitvec)(unsafe.Pointer(p)).FiSize) <= (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U8(0)))*uint64(BITVEC_SZELEM) { *(*U8)(unsafe.Pointer(p + 16 + uintptr(i/U32(BITVEC_SZELEM)))) &= U8(^(int32(1) << (i & U32(BITVEC_SZELEM-1)))) } else { var j uint32 var aiValues uintptr = pBuf libc.Xmemcpy(tls, aiValues, p+16, uint64(unsafe.Sizeof([124]U32{}))) libc.Xmemset(tls, p+16, 0, uint64(unsafe.Sizeof([124]U32{}))) (*Bitvec)(unsafe.Pointer(p)).FnSet = U32(0) for j = uint32(0); uint64(j) < (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U32(0))); j++ { if *(*U32)(unsafe.Pointer(aiValues + uintptr(j)*4)) != 0 && *(*U32)(unsafe.Pointer(aiValues + uintptr(j)*4)) != i+U32(1) { var h U32 = U32(uint64((*(*U32)(unsafe.Pointer(aiValues + uintptr(j)*4))-U32(1))*U32(1)) % ((uint64(BITVEC_SZ) - uint64(3)*uint64(unsafe.Sizeof(U32(0)))) / uint64(unsafe.Sizeof(uintptr(0))) * uint64(unsafe.Sizeof(uintptr(0))) / uint64(unsafe.Sizeof(U32(0))))) (*Bitvec)(unsafe.Pointer(p)).FnSet++ for *(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4)) != 0 { h++ if uint64(h) >= (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(U32(0))) { h = U32(0) } } *(*U32)(unsafe.Pointer(p + 16 + uintptr(h)*4)) = *(*U32)(unsafe.Pointer(aiValues + uintptr(j)*4)) } } } } // Destroy a bitmap object. Reclaim all memory used. func Xsqlite3BitvecDestroy(tls *libc.TLS, p uintptr) { if p == uintptr(0) { return } if (*Bitvec)(unsafe.Pointer(p)).FiDivisor != 0 { var i uint32 for i = uint32(0); uint64(i) < (uint64(BITVEC_SZ)-uint64(3)*uint64(unsafe.Sizeof(U32(0))))/uint64(unsafe.Sizeof(uintptr(0)))*uint64(unsafe.Sizeof(uintptr(0)))/uint64(unsafe.Sizeof(uintptr(0))); i++ { Xsqlite3BitvecDestroy(tls, *(*uintptr)(unsafe.Pointer(p + 16 + uintptr(i)*8))) } } Xsqlite3_free(tls, p) } // Return the value of the iSize parameter specified when Bitvec *p // was created. func Xsqlite3BitvecSize(tls *libc.TLS, p uintptr) U32 { return (*Bitvec)(unsafe.Pointer(p)).FiSize } // This routine runs an extensive test of the Bitvec code. // // The input is an array of integers that acts as a program // to test the Bitvec. The integers are opcodes followed // by 0, 1, or 3 operands, depending on the opcode. Another // opcode follows immediately after the last operand. // // There are 6 opcodes numbered from 0 through 5. 0 is the // "halt" opcode and causes the test to end. // // 0 Halt and return the number of errors // 1 N S X Set N bits beginning with S and incrementing by X // 2 N S X Clear N bits beginning with S and incrementing by X // 3 N Set N randomly chosen bits // 4 N Clear N randomly chosen bits // 5 N S X Set N bits from S increment X in array only, not in bitvec // // The opcodes 1 through 4 perform set and clear operations are performed // on both a Bitvec object and on a linear array of bits obtained from malloc. // Opcode 5 works on the linear array only, not on the Bitvec. // Opcode 5 is used to deliberately induce a fault in order to // confirm that error detection works. // // At the conclusion of the test the linear array is compared // against the Bitvec object. If there are any differences, // an error is returned. If they are the same, zero is returned. // // If a memory allocation error occurs, return -1. func Xsqlite3BitvecBuiltinTest(tls *libc.TLS, sz int32, aOp uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pBitvec uintptr var pV uintptr var rc int32 var nx int32 var pc int32 var op int32 var pTmpSpace uintptr pBitvec = uintptr(0) pV = uintptr(0) rc = -1 pBitvec = Xsqlite3BitvecCreate(tls, uint32(sz)) pV = Xsqlite3MallocZero(tls, uint64((sz+7)/8+1)) pTmpSpace = Xsqlite3_malloc64(tls, uint64(BITVEC_SZ)) if !(pBitvec == uintptr(0) || pV == uintptr(0) || pTmpSpace == uintptr(0)) { goto __1 } goto bitvec_end __1: ; Xsqlite3BitvecSet(tls, uintptr(0), uint32(1)) Xsqlite3BitvecClear(tls, uintptr(0), uint32(1), pTmpSpace) pc = libc.AssignPtrInt32(bp, 0) __2: if !(libc.AssignInt32(&op, *(*int32)(unsafe.Pointer(aOp + uintptr(pc)*4))) != 0) { goto __3 } switch op { case 1: goto __5 case 2: goto __6 case 5: goto __7 case 3: goto __8 case 4: goto __9 default: goto __10 } goto __4 __5: __6: __7: nx = 4 *(*int32)(unsafe.Pointer(bp)) = *(*int32)(unsafe.Pointer(aOp + uintptr(pc+2)*4)) - 1 *(*int32)(unsafe.Pointer(aOp + uintptr(pc+2)*4)) += *(*int32)(unsafe.Pointer(aOp + uintptr(pc+3)*4)) goto __4 __8: __9: __10: nx = 2 Xsqlite3_randomness(tls, int32(unsafe.Sizeof(int32(0))), bp) goto __4 __4: ; if !(libc.PreDecInt32(&*(*int32)(unsafe.Pointer(aOp + uintptr(pc+1)*4)), 1) > 0) { goto __11 } nx = 0 __11: ; pc = pc + nx *(*int32)(unsafe.Pointer(bp)) = *(*int32)(unsafe.Pointer(bp)) & 0x7fffffff % sz if !(op&1 != 0) { goto __12 } *(*uint8)(unsafe.Pointer(pV + uintptr((*(*int32)(unsafe.Pointer(bp))+1)>>3))) |= uint8(int32(1) << ((*(*int32)(unsafe.Pointer(bp)) + 1) & 7)) if !(op != 5) { goto __14 } if !(Xsqlite3BitvecSet(tls, pBitvec, uint32(*(*int32)(unsafe.Pointer(bp))+1)) != 0) { goto __15 } goto bitvec_end __15: ; __14: ; goto __13 __12: *(*uint8)(unsafe.Pointer(pV + uintptr((*(*int32)(unsafe.Pointer(bp))+1)>>3))) &= uint8(^(int32(1) << ((*(*int32)(unsafe.Pointer(bp)) + 1) & 7))) Xsqlite3BitvecClear(tls, pBitvec, uint32(*(*int32)(unsafe.Pointer(bp))+1), pTmpSpace) __13: ; goto __2 __3: ; rc = int32(U32(Xsqlite3BitvecTest(tls, uintptr(0), uint32(0))+Xsqlite3BitvecTest(tls, pBitvec, uint32(sz+1))+ Xsqlite3BitvecTest(tls, pBitvec, uint32(0))) + (Xsqlite3BitvecSize(tls, pBitvec) - U32(sz))) *(*int32)(unsafe.Pointer(bp)) = 1 __16: if !(*(*int32)(unsafe.Pointer(bp)) <= sz) { goto __18 } if !(libc.Bool32(int32(*(*uint8)(unsafe.Pointer(pV + uintptr(*(*int32)(unsafe.Pointer(bp))>>3))))&(int32(1)<<(*(*int32)(unsafe.Pointer(bp))&7)) != 0) != Xsqlite3BitvecTest(tls, pBitvec, uint32(*(*int32)(unsafe.Pointer(bp))))) { goto __19 } rc = *(*int32)(unsafe.Pointer(bp)) goto __18 __19: ; goto __17 __17: *(*int32)(unsafe.Pointer(bp))++ goto __16 goto __18 __18: ; bitvec_end: Xsqlite3_free(tls, pTmpSpace) Xsqlite3_free(tls, pV) Xsqlite3BitvecDestroy(tls, pBitvec) return rc } func pcacheManageDirtyList(tls *libc.TLS, pPage uintptr, addRemove U8) { var p uintptr = (*PgHdr)(unsafe.Pointer(pPage)).FpCache if int32(addRemove)&PCACHE_DIRTYLIST_REMOVE != 0 { if (*PCache)(unsafe.Pointer(p)).FpSynced == pPage { (*PCache)(unsafe.Pointer(p)).FpSynced = (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyPrev } if (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyNext != 0 { (*PgHdr)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(pPage)).FpDirtyNext)).FpDirtyPrev = (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyPrev } else { (*PCache)(unsafe.Pointer(p)).FpDirtyTail = (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyPrev } if (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyPrev != 0 { (*PgHdr)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(pPage)).FpDirtyPrev)).FpDirtyNext = (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyNext } else { (*PCache)(unsafe.Pointer(p)).FpDirty = (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyNext if (*PCache)(unsafe.Pointer(p)).FpDirty == uintptr(0) { (*PCache)(unsafe.Pointer(p)).FeCreate = U8(2) } } } if int32(addRemove)&PCACHE_DIRTYLIST_ADD != 0 { (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyPrev = uintptr(0) (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyNext = (*PCache)(unsafe.Pointer(p)).FpDirty if (*PgHdr)(unsafe.Pointer(pPage)).FpDirtyNext != 0 { (*PgHdr)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(pPage)).FpDirtyNext)).FpDirtyPrev = pPage } else { (*PCache)(unsafe.Pointer(p)).FpDirtyTail = pPage if (*PCache)(unsafe.Pointer(p)).FbPurgeable != 0 { (*PCache)(unsafe.Pointer(p)).FeCreate = U8(1) } } (*PCache)(unsafe.Pointer(p)).FpDirty = pPage if !(int32((*PCache)(unsafe.Pointer(p)).FpSynced) != 0) && 0 == int32((*PgHdr)(unsafe.Pointer(pPage)).Fflags)&PGHDR_NEED_SYNC { (*PCache)(unsafe.Pointer(p)).FpSynced = pPage } } } func pcacheUnpin(tls *libc.TLS, p uintptr) { if (*PCache)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(p)).FpCache)).FbPurgeable != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxUnpin})).f(tls, (*PCache)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(p)).FpCache)).FpCache, (*PgHdr)(unsafe.Pointer(p)).FpPage, 0) } } func numberOfCachePages(tls *libc.TLS, p uintptr) int32 { if (*PCache)(unsafe.Pointer(p)).FszCache >= 0 { return (*PCache)(unsafe.Pointer(p)).FszCache } else { var n I64 n = int64(-1024) * I64((*PCache)(unsafe.Pointer(p)).FszCache) / I64((*PCache)(unsafe.Pointer(p)).FszPage+(*PCache)(unsafe.Pointer(p)).FszExtra) if n > int64(1000000000) { n = int64(1000000000) } return int32(n) } return int32(0) } // ************************************************** General Interfaces ****** // // Initialize and shutdown the page cache subsystem. Neither of these // functions are threadsafe. func Xsqlite3PcacheInitialize(tls *libc.TLS) int32 { if Xsqlite3Config.Fpcache2.FxInit == uintptr(0) { Xsqlite3PCacheSetDefault(tls) } return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxInit})).f(tls, Xsqlite3Config.Fpcache2.FpArg) } func Xsqlite3PcacheShutdown(tls *libc.TLS) { if Xsqlite3Config.Fpcache2.FxShutdown != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxShutdown})).f(tls, Xsqlite3Config.Fpcache2.FpArg) } } // Return the size in bytes of a PCache object. func Xsqlite3PcacheSize(tls *libc.TLS) int32 { return int32(unsafe.Sizeof(PCache{})) } // Create a new PCache object. Storage space to hold the object // has already been allocated and is passed in as the p pointer. // The caller discovers how much space needs to be allocated by // calling sqlite3PcacheSize(). // // szExtra is some extra space allocated for each page. The first // 8 bytes of the extra space will be zeroed as the page is allocated, // but remaining content will be uninitialized. Though it is opaque // to this module, the extra space really ends up being the MemPage // structure in the pager. func Xsqlite3PcacheOpen(tls *libc.TLS, szPage int32, szExtra int32, bPurgeable int32, xStress uintptr, pStress uintptr, p uintptr) int32 { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(PCache{}))) (*PCache)(unsafe.Pointer(p)).FszPage = 1 (*PCache)(unsafe.Pointer(p)).FszExtra = szExtra (*PCache)(unsafe.Pointer(p)).FbPurgeable = U8(bPurgeable) (*PCache)(unsafe.Pointer(p)).FeCreate = U8(2) (*PCache)(unsafe.Pointer(p)).FxStress = xStress (*PCache)(unsafe.Pointer(p)).FpStress = pStress (*PCache)(unsafe.Pointer(p)).FszCache = 100 (*PCache)(unsafe.Pointer(p)).FszSpill = 1 return Xsqlite3PcacheSetPageSize(tls, p, szPage) } // Change the page size for PCache object. The caller must ensure that there // are no outstanding page references when this function is called. func Xsqlite3PcacheSetPageSize(tls *libc.TLS, pCache uintptr, szPage int32) int32 { if (*PCache)(unsafe.Pointer(pCache)).FszPage != 0 { var pNew uintptr pNew = (*struct { f func(*libc.TLS, int32, int32, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxCreate})).f(tls, szPage, int32(uint64((*PCache)(unsafe.Pointer(pCache)).FszExtra)+(uint64(unsafe.Sizeof(PgHdr{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))), int32((*PCache)(unsafe.Pointer(pCache)).FbPurgeable)) if pNew == uintptr(0) { return SQLITE_NOMEM } (*struct { f func(*libc.TLS, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxCachesize})).f(tls, pNew, numberOfCachePages(tls, pCache)) if (*PCache)(unsafe.Pointer(pCache)).FpCache != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxDestroy})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache) } (*PCache)(unsafe.Pointer(pCache)).FpCache = pNew (*PCache)(unsafe.Pointer(pCache)).FszPage = szPage } return SQLITE_OK } // Try to obtain a page from the cache. // // This routine returns a pointer to an sqlite3_pcache_page object if // such an object is already in cache, or if a new one is created. // This routine returns a NULL pointer if the object was not in cache // and could not be created. // // The createFlags should be 0 to check for existing pages and should // be 3 (not 1, but 3) to try to create a new page. // // If the createFlag is 0, then NULL is always returned if the page // is not already in the cache. If createFlag is 1, then a new page // is created only if that can be done without spilling dirty pages // and without exceeding the cache size limit. // // The caller needs to invoke sqlite3PcacheFetchFinish() to properly // initialize the sqlite3_pcache_page object and convert it into a // PgHdr object. The sqlite3PcacheFetch() and sqlite3PcacheFetchFinish() // routines are split this way for performance reasons. When separated // they can both (usually) operate without having to push values to // the stack on entry and pop them back off on exit, which saves a // lot of pushing and popping. func Xsqlite3PcacheFetch(tls *libc.TLS, pCache uintptr, pgno Pgno, createFlag int32) uintptr { var eCreate int32 var pRes uintptr eCreate = createFlag & int32((*PCache)(unsafe.Pointer(pCache)).FeCreate) pRes = (*struct { f func(*libc.TLS, uintptr, uint32, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxFetch})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache, pgno, eCreate) return pRes } // If the sqlite3PcacheFetch() routine is unable to allocate a new // page because no clean pages are available for reuse and the cache // size limit has been reached, then this routine can be invoked to // try harder to allocate a page. This routine might invoke the stress // callback to spill dirty pages to the journal. It will then try to // allocate the new page and will only fail to allocate a new page on // an OOM error. // // This routine should be invoked only after sqlite3PcacheFetch() fails. func Xsqlite3PcacheFetchStress(tls *libc.TLS, pCache uintptr, pgno Pgno, ppPage uintptr) int32 { var pPg uintptr if int32((*PCache)(unsafe.Pointer(pCache)).FeCreate) == 2 { return 0 } if Xsqlite3PcachePagecount(tls, pCache) > (*PCache)(unsafe.Pointer(pCache)).FszSpill { for pPg = (*PCache)(unsafe.Pointer(pCache)).FpSynced; pPg != 0 && ((*PgHdr)(unsafe.Pointer(pPg)).FnRef != 0 || int32((*PgHdr)(unsafe.Pointer(pPg)).Fflags)&PGHDR_NEED_SYNC != 0); pPg = (*PgHdr)(unsafe.Pointer(pPg)).FpDirtyPrev { } (*PCache)(unsafe.Pointer(pCache)).FpSynced = pPg if !(pPg != 0) { for pPg = (*PCache)(unsafe.Pointer(pCache)).FpDirtyTail; pPg != 0 && (*PgHdr)(unsafe.Pointer(pPg)).FnRef != 0; pPg = (*PgHdr)(unsafe.Pointer(pPg)).FpDirtyPrev { } } if pPg != 0 { var rc int32 rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*PCache)(unsafe.Pointer(pCache)).FxStress})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpStress, pPg) if rc != SQLITE_OK && rc != SQLITE_BUSY { return rc } } } *(*uintptr)(unsafe.Pointer(ppPage)) = (*struct { f func(*libc.TLS, uintptr, uint32, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxFetch})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache, pgno, 2) if *(*uintptr)(unsafe.Pointer(ppPage)) == uintptr(0) { return SQLITE_NOMEM } return SQLITE_OK } func pcacheFetchFinishWithInit(tls *libc.TLS, pCache uintptr, pgno Pgno, pPage uintptr) uintptr { var pPgHdr uintptr pPgHdr = (*Sqlite3_pcache_page)(unsafe.Pointer(pPage)).FpExtra libc.Xmemset(tls, pPgHdr+32, 0, uint64(unsafe.Sizeof(PgHdr{}))-uint64(uintptr(0)+32)) (*PgHdr)(unsafe.Pointer(pPgHdr)).FpPage = pPage (*PgHdr)(unsafe.Pointer(pPgHdr)).FpData = (*Sqlite3_pcache_page)(unsafe.Pointer(pPage)).FpBuf (*PgHdr)(unsafe.Pointer(pPgHdr)).FpExtra = pPgHdr + 1*80 libc.Xmemset(tls, (*PgHdr)(unsafe.Pointer(pPgHdr)).FpExtra, 0, uint64(8)) (*PgHdr)(unsafe.Pointer(pPgHdr)).FpCache = pCache (*PgHdr)(unsafe.Pointer(pPgHdr)).Fpgno = pgno (*PgHdr)(unsafe.Pointer(pPgHdr)).Fflags = U16(PGHDR_CLEAN) return Xsqlite3PcacheFetchFinish(tls, pCache, pgno, pPage) } // This routine converts the sqlite3_pcache_page object returned by // sqlite3PcacheFetch() into an initialized PgHdr object. This routine // must be called after sqlite3PcacheFetch() in order to get a usable // result. func Xsqlite3PcacheFetchFinish(tls *libc.TLS, pCache uintptr, pgno Pgno, pPage uintptr) uintptr { var pPgHdr uintptr pPgHdr = (*Sqlite3_pcache_page)(unsafe.Pointer(pPage)).FpExtra if !(int32((*PgHdr)(unsafe.Pointer(pPgHdr)).FpPage) != 0) { return pcacheFetchFinishWithInit(tls, pCache, pgno, pPage) } (*PCache)(unsafe.Pointer(pCache)).FnRefSum++ (*PgHdr)(unsafe.Pointer(pPgHdr)).FnRef++ return pPgHdr } // Decrement the reference count on a page. If the page is clean and the // reference count drops to 0, then it is made eligible for recycling. func Xsqlite3PcacheRelease(tls *libc.TLS, p uintptr) { (*PCache)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(p)).FpCache)).FnRefSum-- if libc.PreDecInt64(&(*PgHdr)(unsafe.Pointer(p)).FnRef, 1) == int64(0) { if int32((*PgHdr)(unsafe.Pointer(p)).Fflags)&PGHDR_CLEAN != 0 { pcacheUnpin(tls, p) } else { pcacheManageDirtyList(tls, p, uint8(PCACHE_DIRTYLIST_FRONT)) } } } // Increase the reference count of a supplied page by 1. func Xsqlite3PcacheRef(tls *libc.TLS, p uintptr) { (*PgHdr)(unsafe.Pointer(p)).FnRef++ (*PCache)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(p)).FpCache)).FnRefSum++ } // Drop a page from the cache. There must be exactly one reference to the // page. This function deletes that reference, so after it returns the // page pointed to by p is invalid. func Xsqlite3PcacheDrop(tls *libc.TLS, p uintptr) { if int32((*PgHdr)(unsafe.Pointer(p)).Fflags)&PGHDR_DIRTY != 0 { pcacheManageDirtyList(tls, p, uint8(PCACHE_DIRTYLIST_REMOVE)) } (*PCache)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(p)).FpCache)).FnRefSum-- (*struct { f func(*libc.TLS, uintptr, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxUnpin})).f(tls, (*PCache)(unsafe.Pointer((*PgHdr)(unsafe.Pointer(p)).FpCache)).FpCache, (*PgHdr)(unsafe.Pointer(p)).FpPage, 1) } // Make sure the page is marked as dirty. If it isn't dirty already, // make it so. func Xsqlite3PcacheMakeDirty(tls *libc.TLS, p uintptr) { if int32((*PgHdr)(unsafe.Pointer(p)).Fflags)&(PGHDR_CLEAN|PGHDR_DONT_WRITE) != 0 { *(*U16)(unsafe.Pointer(p + 52)) &= libc.Uint16FromInt32(libc.CplInt32(PGHDR_DONT_WRITE)) if int32((*PgHdr)(unsafe.Pointer(p)).Fflags)&PGHDR_CLEAN != 0 { *(*U16)(unsafe.Pointer(p + 52)) ^= U16(PGHDR_DIRTY | PGHDR_CLEAN) pcacheManageDirtyList(tls, p, uint8(PCACHE_DIRTYLIST_ADD)) } } } // Make sure the page is marked as clean. If it isn't clean already, // make it so. func Xsqlite3PcacheMakeClean(tls *libc.TLS, p uintptr) { pcacheManageDirtyList(tls, p, uint8(PCACHE_DIRTYLIST_REMOVE)) *(*U16)(unsafe.Pointer(p + 52)) &= libc.Uint16FromInt32(libc.CplInt32(PGHDR_DIRTY | PGHDR_NEED_SYNC | PGHDR_WRITEABLE)) *(*U16)(unsafe.Pointer(p + 52)) |= U16(PGHDR_CLEAN) if (*PgHdr)(unsafe.Pointer(p)).FnRef == int64(0) { pcacheUnpin(tls, p) } } // Make every page in the cache clean. func Xsqlite3PcacheCleanAll(tls *libc.TLS, pCache uintptr) { var p uintptr for libc.AssignUintptr(&p, (*PCache)(unsafe.Pointer(pCache)).FpDirty) != uintptr(0) { Xsqlite3PcacheMakeClean(tls, p) } } // Clear the PGHDR_NEED_SYNC and PGHDR_WRITEABLE flag from all dirty pages. func Xsqlite3PcacheClearWritable(tls *libc.TLS, pCache uintptr) { var p uintptr for p = (*PCache)(unsafe.Pointer(pCache)).FpDirty; p != 0; p = (*PgHdr)(unsafe.Pointer(p)).FpDirtyNext { *(*U16)(unsafe.Pointer(p + 52)) &= libc.Uint16FromInt32(libc.CplInt32(PGHDR_NEED_SYNC | PGHDR_WRITEABLE)) } (*PCache)(unsafe.Pointer(pCache)).FpSynced = (*PCache)(unsafe.Pointer(pCache)).FpDirtyTail } // Clear the PGHDR_NEED_SYNC flag from all dirty pages. func Xsqlite3PcacheClearSyncFlags(tls *libc.TLS, pCache uintptr) { var p uintptr for p = (*PCache)(unsafe.Pointer(pCache)).FpDirty; p != 0; p = (*PgHdr)(unsafe.Pointer(p)).FpDirtyNext { *(*U16)(unsafe.Pointer(p + 52)) &= libc.Uint16FromInt32(libc.CplInt32(PGHDR_NEED_SYNC)) } (*PCache)(unsafe.Pointer(pCache)).FpSynced = (*PCache)(unsafe.Pointer(pCache)).FpDirtyTail } // Change the page number of page p to newPgno. func Xsqlite3PcacheMove(tls *libc.TLS, p uintptr, newPgno Pgno) { var pCache uintptr = (*PgHdr)(unsafe.Pointer(p)).FpCache var pOther uintptr pOther = (*struct { f func(*libc.TLS, uintptr, uint32, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxFetch})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache, newPgno, 0) if pOther != 0 { var pXPage uintptr = (*Sqlite3_pcache_page)(unsafe.Pointer(pOther)).FpExtra (*PgHdr)(unsafe.Pointer(pXPage)).FnRef++ (*PCache)(unsafe.Pointer(pCache)).FnRefSum++ Xsqlite3PcacheDrop(tls, pXPage) } (*struct { f func(*libc.TLS, uintptr, uintptr, uint32, uint32) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxRekey})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache, (*PgHdr)(unsafe.Pointer(p)).FpPage, (*PgHdr)(unsafe.Pointer(p)).Fpgno, newPgno) (*PgHdr)(unsafe.Pointer(p)).Fpgno = newPgno if int32((*PgHdr)(unsafe.Pointer(p)).Fflags)&PGHDR_DIRTY != 0 && int32((*PgHdr)(unsafe.Pointer(p)).Fflags)&PGHDR_NEED_SYNC != 0 { pcacheManageDirtyList(tls, p, uint8(PCACHE_DIRTYLIST_FRONT)) } } // Drop every cache entry whose page number is greater than "pgno". The // caller must ensure that there are no outstanding references to any pages // other than page 1 with a page number greater than pgno. // // If there is a reference to page 1 and the pgno parameter passed to this // function is 0, then the data area associated with page 1 is zeroed, but // the page object is not dropped. func Xsqlite3PcacheTruncate(tls *libc.TLS, pCache uintptr, pgno Pgno) { if (*PCache)(unsafe.Pointer(pCache)).FpCache != 0 { var p uintptr var pNext uintptr for p = (*PCache)(unsafe.Pointer(pCache)).FpDirty; p != 0; p = pNext { pNext = (*PgHdr)(unsafe.Pointer(p)).FpDirtyNext if (*PgHdr)(unsafe.Pointer(p)).Fpgno > pgno { Xsqlite3PcacheMakeClean(tls, p) } } if pgno == Pgno(0) && (*PCache)(unsafe.Pointer(pCache)).FnRefSum != 0 { var pPage1 uintptr pPage1 = (*struct { f func(*libc.TLS, uintptr, uint32, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxFetch})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache, uint32(1), 0) if pPage1 != 0 { libc.Xmemset(tls, (*Sqlite3_pcache_page)(unsafe.Pointer(pPage1)).FpBuf, 0, uint64((*PCache)(unsafe.Pointer(pCache)).FszPage)) pgno = Pgno(1) } } (*struct { f func(*libc.TLS, uintptr, uint32) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxTruncate})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache, pgno+Pgno(1)) } } // Close a cache. func Xsqlite3PcacheClose(tls *libc.TLS, pCache uintptr) { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxDestroy})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache) } // Discard the contents of the cache. func Xsqlite3PcacheClear(tls *libc.TLS, pCache uintptr) { Xsqlite3PcacheTruncate(tls, pCache, uint32(0)) } func pcacheMergeDirtyList(tls *libc.TLS, pA uintptr, pB uintptr) uintptr { bp := tls.Alloc(80) defer tls.Free(80) var pTail uintptr pTail = bp for { if (*PgHdr)(unsafe.Pointer(pA)).Fpgno < (*PgHdr)(unsafe.Pointer(pB)).Fpgno { (*PgHdr)(unsafe.Pointer(pTail)).FpDirty = pA pTail = pA pA = (*PgHdr)(unsafe.Pointer(pA)).FpDirty if pA == uintptr(0) { (*PgHdr)(unsafe.Pointer(pTail)).FpDirty = pB break } } else { (*PgHdr)(unsafe.Pointer(pTail)).FpDirty = pB pTail = pB pB = (*PgHdr)(unsafe.Pointer(pB)).FpDirty if pB == uintptr(0) { (*PgHdr)(unsafe.Pointer(pTail)).FpDirty = pA break } } } return (*PgHdr)(unsafe.Pointer(bp)).FpDirty } func pcacheSortDirtyList(tls *libc.TLS, pIn uintptr) uintptr { bp := tls.Alloc(256) defer tls.Free(256) var p uintptr var i int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([32]uintptr{}))) for pIn != 0 { p = pIn pIn = (*PgHdr)(unsafe.Pointer(p)).FpDirty (*PgHdr)(unsafe.Pointer(p)).FpDirty = uintptr(0) for i = 0; i < N_SORT_BUCKET-1; i++ { if *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) == uintptr(0) { *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = p break } else { p = pcacheMergeDirtyList(tls, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)), p) *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = uintptr(0) } } if i == N_SORT_BUCKET-1 { *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = pcacheMergeDirtyList(tls, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)), p) } } p = *(*uintptr)(unsafe.Pointer(bp)) for i = 1; i < N_SORT_BUCKET; i++ { if *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) == uintptr(0) { continue } if p != 0 { p = pcacheMergeDirtyList(tls, p, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8))) } else { p = *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) } } return p } // Return a list of all dirty pages in the cache, sorted by page number. func Xsqlite3PcacheDirtyList(tls *libc.TLS, pCache uintptr) uintptr { var p uintptr for p = (*PCache)(unsafe.Pointer(pCache)).FpDirty; p != 0; p = (*PgHdr)(unsafe.Pointer(p)).FpDirtyNext { (*PgHdr)(unsafe.Pointer(p)).FpDirty = (*PgHdr)(unsafe.Pointer(p)).FpDirtyNext } return pcacheSortDirtyList(tls, (*PCache)(unsafe.Pointer(pCache)).FpDirty) } // Return the total number of references to all pages held by the cache. // // This is not the total number of pages referenced, but the sum of the // reference count for all pages. func Xsqlite3PcacheRefCount(tls *libc.TLS, pCache uintptr) I64 { return (*PCache)(unsafe.Pointer(pCache)).FnRefSum } // Return the number of references to the page supplied as an argument. func Xsqlite3PcachePageRefcount(tls *libc.TLS, p uintptr) I64 { return (*PgHdr)(unsafe.Pointer(p)).FnRef } // Return the total number of pages in the cache. func Xsqlite3PcachePagecount(tls *libc.TLS, pCache uintptr) int32 { return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxPagecount})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache) } // Set the suggested cache-size value. func Xsqlite3PcacheSetCachesize(tls *libc.TLS, pCache uintptr, mxPage int32) { (*PCache)(unsafe.Pointer(pCache)).FszCache = mxPage (*struct { f func(*libc.TLS, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxCachesize})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache, numberOfCachePages(tls, pCache)) } // Set the suggested cache-spill value. Make no changes if if the // argument is zero. Return the effective cache-spill size, which will // be the larger of the szSpill and szCache. func Xsqlite3PcacheSetSpillsize(tls *libc.TLS, p uintptr, mxPage int32) int32 { var res int32 if mxPage != 0 { if mxPage < 0 { mxPage = int32(int64(-1024) * I64(mxPage) / I64((*PCache)(unsafe.Pointer(p)).FszPage+(*PCache)(unsafe.Pointer(p)).FszExtra)) } (*PCache)(unsafe.Pointer(p)).FszSpill = mxPage } res = numberOfCachePages(tls, p) if res < (*PCache)(unsafe.Pointer(p)).FszSpill { res = (*PCache)(unsafe.Pointer(p)).FszSpill } return res } // Free up as much memory as possible from the page cache. func Xsqlite3PcacheShrink(tls *libc.TLS, pCache uintptr) { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{Xsqlite3Config.Fpcache2.FxShrink})).f(tls, (*PCache)(unsafe.Pointer(pCache)).FpCache) } // Return the size of the header added by this middleware layer // in the page-cache hierarchy. func Xsqlite3HeaderSizePcache(tls *libc.TLS) int32 { return int32((uint64(unsafe.Sizeof(PgHdr{})) + uint64(7)) & libc.Uint64FromInt32(libc.CplInt32(7))) } // Return the number of dirty pages currently in the cache, as a percentage // of the configured cache size. func Xsqlite3PCachePercentDirty(tls *libc.TLS, pCache uintptr) int32 { var pDirty uintptr var nDirty int32 = 0 var nCache int32 = numberOfCachePages(tls, pCache) for pDirty = (*PCache)(unsafe.Pointer(pCache)).FpDirty; pDirty != 0; pDirty = (*PgHdr)(unsafe.Pointer(pDirty)).FpDirtyNext { nDirty++ } if nCache != 0 { return int32(I64(nDirty) * int64(100) / I64(nCache)) } return 0 } type PCache11 = struct { FpGroup uintptr FpnPurgeable uintptr FszPage int32 FszExtra int32 FszAlloc int32 FbPurgeable int32 FnMin uint32 FnMax uint32 Fn90pct uint32 FiMaxKey uint32 FnPurgeableDummy uint32 FnRecyclable uint32 FnPage uint32 FnHash uint32 FapHash uintptr FpFree uintptr FpBulk uintptr } type PCache1 = PCache11 type PgHdr11 = struct { Fpage Sqlite3_pcache_page FiKey uint32 FisBulkLocal U16 FisAnchor U16 FpNext uintptr FpCache uintptr FpLruNext uintptr FpLruPrev uintptr } type PgHdr1 = PgHdr11 type PgFreeslot1 = struct{ FpNext uintptr } type PgFreeslot = PgFreeslot1 type PGroup1 = struct { Fmutex uintptr FnMaxPage uint32 FnMinPage uint32 FmxPinned uint32 FnPurgeable uint32 Flru PgHdr1 } type PGroup = PGroup1 // Global data used by this cache. type PCacheGlobal = struct { Fgrp PGroup FisInit int32 FseparateCache int32 FnInitPage int32 FszSlot int32 FnSlot int32 FnReserve int32 FpStart uintptr FpEnd uintptr Fmutex uintptr FpFree uintptr FnFreeSlot int32 FbUnderPressure int32 } var pcache1_g PCacheGlobal // This function is called during initialization if a static buffer is // supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE // verb to sqlite3_config(). Parameter pBuf points to an allocation large // enough to contain 'n' buffers of 'sz' bytes each. // // This routine is called from sqlite3_initialize() and so it is guaranteed // to be serialized already. There is no need for further mutexing. func Xsqlite3PCacheBufferSetup(tls *libc.TLS, pBuf uintptr, sz int32, n int32) { if pcache1_g.FisInit != 0 { var p uintptr if pBuf == uintptr(0) { sz = libc.AssignInt32(&n, 0) } if n == 0 { sz = 0 } sz = sz & libc.CplInt32(7) pcache1_g.FszSlot = sz pcache1_g.FnSlot = libc.AssignPtrInt32(uintptr(unsafe.Pointer(&pcache1_g))+136, n) pcache1_g.FnReserve = func() int32 { if n > 90 { return 10 } return n/10 + 1 }() pcache1_g.FpStart = pBuf pcache1_g.FpFree = uintptr(0) pcache1_g.FbUnderPressure = 0 for libc.PostDecInt32(&n, 1) != 0 { p = pBuf (*PgFreeslot)(unsafe.Pointer(p)).FpNext = pcache1_g.FpFree pcache1_g.FpFree = p pBuf = pBuf + uintptr(sz) } pcache1_g.FpEnd = pBuf } } func pcache1InitBulk(tls *libc.TLS, pCache uintptr) int32 { var szBulk I64 var zBulk uintptr if pcache1_g.FnInitPage == 0 { return 0 } if (*PCache1)(unsafe.Pointer(pCache)).FnMax < uint32(3) { return 0 } Xsqlite3BeginBenignMalloc(tls) if pcache1_g.FnInitPage > 0 { szBulk = I64((*PCache1)(unsafe.Pointer(pCache)).FszAlloc) * I64(pcache1_g.FnInitPage) } else { szBulk = int64(-1024) * I64(pcache1_g.FnInitPage) } if szBulk > I64((*PCache1)(unsafe.Pointer(pCache)).FszAlloc)*I64((*PCache1)(unsafe.Pointer(pCache)).FnMax) { szBulk = I64((*PCache1)(unsafe.Pointer(pCache)).FszAlloc) * I64((*PCache1)(unsafe.Pointer(pCache)).FnMax) } zBulk = libc.AssignPtrUintptr(pCache+80, Xsqlite3Malloc(tls, uint64(szBulk))) Xsqlite3EndBenignMalloc(tls) if zBulk != 0 { var nBulk int32 = Xsqlite3MallocSize(tls, zBulk) / (*PCache1)(unsafe.Pointer(pCache)).FszAlloc for __ccgo := true; __ccgo; __ccgo = libc.PreDecInt32(&nBulk, 1) != 0 { var pX uintptr = zBulk + uintptr((*PCache1)(unsafe.Pointer(pCache)).FszPage) (*PgHdr1)(unsafe.Pointer(pX)).Fpage.FpBuf = zBulk (*PgHdr1)(unsafe.Pointer(pX)).Fpage.FpExtra = pX + 1*56 (*PgHdr1)(unsafe.Pointer(pX)).FisBulkLocal = U16(1) (*PgHdr1)(unsafe.Pointer(pX)).FisAnchor = U16(0) (*PgHdr1)(unsafe.Pointer(pX)).FpNext = (*PCache1)(unsafe.Pointer(pCache)).FpFree (*PgHdr1)(unsafe.Pointer(pX)).FpLruPrev = uintptr(0) (*PCache1)(unsafe.Pointer(pCache)).FpFree = pX zBulk += uintptr((*PCache1)(unsafe.Pointer(pCache)).FszAlloc) } } return libc.Bool32((*PCache1)(unsafe.Pointer(pCache)).FpFree != uintptr(0)) } func pcache1Alloc(tls *libc.TLS, nByte int32) uintptr { var p uintptr = uintptr(0) if nByte <= pcache1_g.FszSlot { Xsqlite3_mutex_enter(tls, pcache1_g.Fmutex) p = pcache1_g.FpFree if p != 0 { pcache1_g.FpFree = (*PgFreeslot)(unsafe.Pointer(pcache1_g.FpFree)).FpNext pcache1_g.FnFreeSlot-- pcache1_g.FbUnderPressure = libc.Bool32(pcache1_g.FnFreeSlot < pcache1_g.FnReserve) Xsqlite3StatusHighwater(tls, SQLITE_STATUS_PAGECACHE_SIZE, nByte) Xsqlite3StatusUp(tls, SQLITE_STATUS_PAGECACHE_USED, 1) } Xsqlite3_mutex_leave(tls, pcache1_g.Fmutex) } if p == uintptr(0) { p = Xsqlite3Malloc(tls, uint64(nByte)) if p != 0 { var sz int32 = Xsqlite3MallocSize(tls, p) Xsqlite3_mutex_enter(tls, pcache1_g.Fmutex) Xsqlite3StatusHighwater(tls, SQLITE_STATUS_PAGECACHE_SIZE, nByte) Xsqlite3StatusUp(tls, SQLITE_STATUS_PAGECACHE_OVERFLOW, sz) Xsqlite3_mutex_leave(tls, pcache1_g.Fmutex) } } return p } func pcache1Free(tls *libc.TLS, p uintptr) { if p == uintptr(0) { return } if Uptr(p) >= Uptr(pcache1_g.FpStart) && Uptr(p) < Uptr(pcache1_g.FpEnd) { var pSlot uintptr Xsqlite3_mutex_enter(tls, pcache1_g.Fmutex) Xsqlite3StatusDown(tls, SQLITE_STATUS_PAGECACHE_USED, 1) pSlot = p (*PgFreeslot)(unsafe.Pointer(pSlot)).FpNext = pcache1_g.FpFree pcache1_g.FpFree = pSlot pcache1_g.FnFreeSlot++ pcache1_g.FbUnderPressure = libc.Bool32(pcache1_g.FnFreeSlot < pcache1_g.FnReserve) Xsqlite3_mutex_leave(tls, pcache1_g.Fmutex) } else { { var nFreed int32 = 0 nFreed = Xsqlite3MallocSize(tls, p) Xsqlite3_mutex_enter(tls, pcache1_g.Fmutex) Xsqlite3StatusDown(tls, SQLITE_STATUS_PAGECACHE_OVERFLOW, nFreed) Xsqlite3_mutex_leave(tls, pcache1_g.Fmutex) } Xsqlite3_free(tls, p) } } func pcache1MemSize(tls *libc.TLS, p uintptr) int32 { if p >= pcache1_g.FpStart && p < pcache1_g.FpEnd { return pcache1_g.FszSlot } else { var iSize int32 iSize = Xsqlite3MallocSize(tls, p) return iSize } return int32(0) } func pcache1AllocPage(tls *libc.TLS, pCache uintptr, benignMalloc int32) uintptr { var p uintptr = uintptr(0) var pPg uintptr if (*PCache1)(unsafe.Pointer(pCache)).FpFree != 0 || (*PCache1)(unsafe.Pointer(pCache)).FnPage == uint32(0) && pcache1InitBulk(tls, pCache) != 0 { p = (*PCache1)(unsafe.Pointer(pCache)).FpFree (*PCache1)(unsafe.Pointer(pCache)).FpFree = (*PgHdr1)(unsafe.Pointer(p)).FpNext (*PgHdr1)(unsafe.Pointer(p)).FpNext = uintptr(0) } else { Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) if benignMalloc != 0 { Xsqlite3BeginBenignMalloc(tls) } pPg = pcache1Alloc(tls, (*PCache1)(unsafe.Pointer(pCache)).FszAlloc) if benignMalloc != 0 { Xsqlite3EndBenignMalloc(tls) } Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) if pPg == uintptr(0) { return uintptr(0) } p = pPg + uintptr((*PCache1)(unsafe.Pointer(pCache)).FszPage) (*PgHdr1)(unsafe.Pointer(p)).Fpage.FpBuf = pPg (*PgHdr1)(unsafe.Pointer(p)).Fpage.FpExtra = p + 1*56 (*PgHdr1)(unsafe.Pointer(p)).FisBulkLocal = U16(0) (*PgHdr1)(unsafe.Pointer(p)).FisAnchor = U16(0) (*PgHdr1)(unsafe.Pointer(p)).FpLruPrev = uintptr(0) } *(*uint32)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpnPurgeable))++ return p } func pcache1FreePage(tls *libc.TLS, p uintptr) { var pCache uintptr pCache = (*PgHdr1)(unsafe.Pointer(p)).FpCache if (*PgHdr1)(unsafe.Pointer(p)).FisBulkLocal != 0 { (*PgHdr1)(unsafe.Pointer(p)).FpNext = (*PCache1)(unsafe.Pointer(pCache)).FpFree (*PCache1)(unsafe.Pointer(pCache)).FpFree = p } else { pcache1Free(tls, (*PgHdr1)(unsafe.Pointer(p)).Fpage.FpBuf) } *(*uint32)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpnPurgeable))-- } // Malloc function used by SQLite to obtain space from the buffer configured // using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no such buffer // exists, this function falls back to sqlite3Malloc(). func Xsqlite3PageMalloc(tls *libc.TLS, sz int32) uintptr { return pcache1Alloc(tls, sz) } // Free an allocated buffer obtained from sqlite3PageMalloc(). func Xsqlite3PageFree(tls *libc.TLS, p uintptr) { pcache1Free(tls, p) } func pcache1UnderMemoryPressure(tls *libc.TLS, pCache uintptr) int32 { if pcache1_g.FnSlot != 0 && (*PCache1)(unsafe.Pointer(pCache)).FszPage+(*PCache1)(unsafe.Pointer(pCache)).FszExtra <= pcache1_g.FszSlot { return pcache1_g.FbUnderPressure } else { return Xsqlite3HeapNearlyFull(tls) } return int32(0) } func pcache1ResizeHash(tls *libc.TLS, p uintptr) { var apNew uintptr var nNew uint32 var i uint32 nNew = (*PCache1)(unsafe.Pointer(p)).FnHash * uint32(2) if nNew < uint32(256) { nNew = uint32(256) } Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(p)).FpGroup)).Fmutex) if (*PCache1)(unsafe.Pointer(p)).FnHash != 0 { Xsqlite3BeginBenignMalloc(tls) } apNew = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(uintptr(0)))*uint64(nNew)) if (*PCache1)(unsafe.Pointer(p)).FnHash != 0 { Xsqlite3EndBenignMalloc(tls) } Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(p)).FpGroup)).Fmutex) if apNew != 0 { for i = uint32(0); i < (*PCache1)(unsafe.Pointer(p)).FnHash; i++ { var pPage uintptr var pNext uintptr = *(*uintptr)(unsafe.Pointer((*PCache1)(unsafe.Pointer(p)).FapHash + uintptr(i)*8)) for libc.AssignUintptr(&pPage, pNext) != uintptr(0) { var h uint32 = (*PgHdr1)(unsafe.Pointer(pPage)).FiKey % nNew pNext = (*PgHdr1)(unsafe.Pointer(pPage)).FpNext (*PgHdr1)(unsafe.Pointer(pPage)).FpNext = *(*uintptr)(unsafe.Pointer(apNew + uintptr(h)*8)) *(*uintptr)(unsafe.Pointer(apNew + uintptr(h)*8)) = pPage } } Xsqlite3_free(tls, (*PCache1)(unsafe.Pointer(p)).FapHash) (*PCache1)(unsafe.Pointer(p)).FapHash = apNew (*PCache1)(unsafe.Pointer(p)).FnHash = nNew } } func pcache1PinPage(tls *libc.TLS, pPage uintptr) uintptr { (*PgHdr1)(unsafe.Pointer((*PgHdr1)(unsafe.Pointer(pPage)).FpLruPrev)).FpLruNext = (*PgHdr1)(unsafe.Pointer(pPage)).FpLruNext (*PgHdr1)(unsafe.Pointer((*PgHdr1)(unsafe.Pointer(pPage)).FpLruNext)).FpLruPrev = (*PgHdr1)(unsafe.Pointer(pPage)).FpLruPrev (*PgHdr1)(unsafe.Pointer(pPage)).FpLruNext = uintptr(0) (*PCache1)(unsafe.Pointer((*PgHdr1)(unsafe.Pointer(pPage)).FpCache)).FnRecyclable-- return pPage } func pcache1RemoveFromHash(tls *libc.TLS, pPage uintptr, freeFlag int32) { var h uint32 var pCache uintptr = (*PgHdr1)(unsafe.Pointer(pPage)).FpCache var pp uintptr h = (*PgHdr1)(unsafe.Pointer(pPage)).FiKey % (*PCache1)(unsafe.Pointer(pCache)).FnHash for pp = (*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(h)*8; *(*uintptr)(unsafe.Pointer(pp)) != pPage; pp = *(*uintptr)(unsafe.Pointer(pp)) + 24 { } *(*uintptr)(unsafe.Pointer(pp)) = (*PgHdr1)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FpNext (*PCache1)(unsafe.Pointer(pCache)).FnPage-- if freeFlag != 0 { pcache1FreePage(tls, pPage) } } func pcache1EnforceMaxPage(tls *libc.TLS, pCache uintptr) { var pGroup uintptr = (*PCache1)(unsafe.Pointer(pCache)).FpGroup var p uintptr for (*PGroup)(unsafe.Pointer(pGroup)).FnPurgeable > (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage && int32((*PgHdr1)(unsafe.Pointer(libc.AssignUintptr(&p, (*PGroup)(unsafe.Pointer(pGroup)).Flru.FpLruPrev))).FisAnchor) == 0 { pcache1PinPage(tls, p) pcache1RemoveFromHash(tls, p, 1) } if (*PCache1)(unsafe.Pointer(pCache)).FnPage == uint32(0) && (*PCache1)(unsafe.Pointer(pCache)).FpBulk != 0 { Xsqlite3_free(tls, (*PCache1)(unsafe.Pointer(pCache)).FpBulk) (*PCache1)(unsafe.Pointer(pCache)).FpBulk = libc.AssignPtrUintptr(pCache+72, uintptr(0)) } } func pcache1TruncateUnsafe(tls *libc.TLS, pCache uintptr, iLimit uint32) { var h uint32 var iStop uint32 if (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey-iLimit < (*PCache1)(unsafe.Pointer(pCache)).FnHash { h = iLimit % (*PCache1)(unsafe.Pointer(pCache)).FnHash iStop = (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey % (*PCache1)(unsafe.Pointer(pCache)).FnHash } else { h = (*PCache1)(unsafe.Pointer(pCache)).FnHash / uint32(2) iStop = h - uint32(1) } for { var pp uintptr var pPage uintptr pp = (*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(h)*8 for libc.AssignUintptr(&pPage, *(*uintptr)(unsafe.Pointer(pp))) != uintptr(0) { if (*PgHdr1)(unsafe.Pointer(pPage)).FiKey >= iLimit { (*PCache1)(unsafe.Pointer(pCache)).FnPage-- *(*uintptr)(unsafe.Pointer(pp)) = (*PgHdr1)(unsafe.Pointer(pPage)).FpNext if (*PgHdr1)(unsafe.Pointer(pPage)).FpLruNext != uintptr(0) { pcache1PinPage(tls, pPage) } pcache1FreePage(tls, pPage) } else { pp = pPage + 24 } } if h == iStop { break } h = (h + uint32(1)) % (*PCache1)(unsafe.Pointer(pCache)).FnHash } } func pcache1Init(tls *libc.TLS, NotUsed uintptr) int32 { _ = NotUsed libc.Xmemset(tls, uintptr(unsafe.Pointer(&pcache1_g)), 0, uint64(unsafe.Sizeof(pcache1_g))) pcache1_g.FseparateCache = 0 if Xsqlite3Config.FbCoreMutex != 0 { pcache1_g.Fgrp.Fmutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_LRU) pcache1_g.Fmutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_PMEM) } if pcache1_g.FseparateCache != 0 && Xsqlite3Config.FnPage != 0 && Xsqlite3Config.FpPage == uintptr(0) { pcache1_g.FnInitPage = Xsqlite3Config.FnPage } else { pcache1_g.FnInitPage = 0 } pcache1_g.Fgrp.FmxPinned = uint32(10) pcache1_g.FisInit = 1 return SQLITE_OK } func pcache1Shutdown(tls *libc.TLS, NotUsed uintptr) { _ = NotUsed libc.Xmemset(tls, uintptr(unsafe.Pointer(&pcache1_g)), 0, uint64(unsafe.Sizeof(pcache1_g))) } func pcache1Create(tls *libc.TLS, szPage int32, szExtra int32, bPurgeable int32) uintptr { var pCache uintptr var pGroup uintptr var sz int32 sz = int32(uint64(unsafe.Sizeof(PCache1{})) + uint64(unsafe.Sizeof(PGroup{}))*uint64(pcache1_g.FseparateCache)) pCache = Xsqlite3MallocZero(tls, uint64(sz)) if pCache != 0 { if pcache1_g.FseparateCache != 0 { pGroup = pCache + 1*88 (*PGroup)(unsafe.Pointer(pGroup)).FmxPinned = uint32(10) } else { pGroup = uintptr(unsafe.Pointer(&pcache1_g)) } Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) if int32((*PGroup)(unsafe.Pointer(pGroup)).Flru.FisAnchor) == 0 { (*PGroup)(unsafe.Pointer(pGroup)).Flru.FisAnchor = U16(1) (*PGroup)(unsafe.Pointer(pGroup)).Flru.FpLruPrev = libc.AssignPtrUintptr(pGroup+24+40, pGroup+24) } (*PCache1)(unsafe.Pointer(pCache)).FpGroup = pGroup (*PCache1)(unsafe.Pointer(pCache)).FszPage = szPage (*PCache1)(unsafe.Pointer(pCache)).FszExtra = szExtra (*PCache1)(unsafe.Pointer(pCache)).FszAlloc = int32(uint64(szPage+szExtra) + (uint64(unsafe.Sizeof(PgHdr1{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))) (*PCache1)(unsafe.Pointer(pCache)).FbPurgeable = func() int32 { if bPurgeable != 0 { return 1 } return 0 }() pcache1ResizeHash(tls, pCache) if bPurgeable != 0 { (*PCache1)(unsafe.Pointer(pCache)).FnMin = uint32(10) *(*uint32)(unsafe.Pointer(pGroup + 12)) += (*PCache1)(unsafe.Pointer(pCache)).FnMin (*PGroup)(unsafe.Pointer(pGroup)).FmxPinned = (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage + uint32(10) - (*PGroup)(unsafe.Pointer(pGroup)).FnMinPage (*PCache1)(unsafe.Pointer(pCache)).FpnPurgeable = pGroup + 20 } else { (*PCache1)(unsafe.Pointer(pCache)).FpnPurgeable = pCache + 48 } Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) if (*PCache1)(unsafe.Pointer(pCache)).FnHash == uint32(0) { pcache1Destroy(tls, pCache) pCache = uintptr(0) } } return pCache } func pcache1Cachesize(tls *libc.TLS, p uintptr, nMax int32) { var pCache uintptr = p var n U32 if (*PCache1)(unsafe.Pointer(pCache)).FbPurgeable != 0 { var pGroup uintptr = (*PCache1)(unsafe.Pointer(pCache)).FpGroup Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) n = U32(nMax) if n > uint32(0x7fff0000)-(*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage+(*PCache1)(unsafe.Pointer(pCache)).FnMax { n = uint32(0x7fff0000) - (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage + (*PCache1)(unsafe.Pointer(pCache)).FnMax } *(*uint32)(unsafe.Pointer(pGroup + 8)) += n - (*PCache1)(unsafe.Pointer(pCache)).FnMax (*PGroup)(unsafe.Pointer(pGroup)).FmxPinned = (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage + uint32(10) - (*PGroup)(unsafe.Pointer(pGroup)).FnMinPage (*PCache1)(unsafe.Pointer(pCache)).FnMax = n (*PCache1)(unsafe.Pointer(pCache)).Fn90pct = (*PCache1)(unsafe.Pointer(pCache)).FnMax * uint32(9) / uint32(10) pcache1EnforceMaxPage(tls, pCache) Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) } } func pcache1Shrink(tls *libc.TLS, p uintptr) { var pCache uintptr = p if (*PCache1)(unsafe.Pointer(pCache)).FbPurgeable != 0 { var pGroup uintptr = (*PCache1)(unsafe.Pointer(pCache)).FpGroup var savedMaxPage uint32 Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) savedMaxPage = (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage = uint32(0) pcache1EnforceMaxPage(tls, pCache) (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage = savedMaxPage Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) } } func pcache1Pagecount(tls *libc.TLS, p uintptr) int32 { var n int32 var pCache uintptr = p Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) n = int32((*PCache1)(unsafe.Pointer(pCache)).FnPage) Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) return n } func pcache1FetchStage2(tls *libc.TLS, pCache uintptr, iKey uint32, createFlag int32) uintptr { var nPinned uint32 var pGroup uintptr = (*PCache1)(unsafe.Pointer(pCache)).FpGroup var pPage uintptr = uintptr(0) nPinned = (*PCache1)(unsafe.Pointer(pCache)).FnPage - (*PCache1)(unsafe.Pointer(pCache)).FnRecyclable if createFlag == 1 && (nPinned >= (*PGroup)(unsafe.Pointer(pGroup)).FmxPinned || nPinned >= (*PCache1)(unsafe.Pointer(pCache)).Fn90pct || pcache1UnderMemoryPressure(tls, pCache) != 0 && (*PCache1)(unsafe.Pointer(pCache)).FnRecyclable < nPinned) { return uintptr(0) } if (*PCache1)(unsafe.Pointer(pCache)).FnPage >= (*PCache1)(unsafe.Pointer(pCache)).FnHash { pcache1ResizeHash(tls, pCache) } if (*PCache1)(unsafe.Pointer(pCache)).FbPurgeable != 0 && !(int32((*PgHdr1)(unsafe.Pointer((*PGroup)(unsafe.Pointer(pGroup)).Flru.FpLruPrev)).FisAnchor) != 0) && ((*PCache1)(unsafe.Pointer(pCache)).FnPage+uint32(1) >= (*PCache1)(unsafe.Pointer(pCache)).FnMax || pcache1UnderMemoryPressure(tls, pCache) != 0) { var pOther uintptr pPage = (*PGroup)(unsafe.Pointer(pGroup)).Flru.FpLruPrev pcache1RemoveFromHash(tls, pPage, 0) pcache1PinPage(tls, pPage) pOther = (*PgHdr1)(unsafe.Pointer(pPage)).FpCache if (*PCache1)(unsafe.Pointer(pOther)).FszAlloc != (*PCache1)(unsafe.Pointer(pCache)).FszAlloc { pcache1FreePage(tls, pPage) pPage = uintptr(0) } else { *(*uint32)(unsafe.Pointer(pGroup + 20)) -= uint32((*PCache1)(unsafe.Pointer(pOther)).FbPurgeable - (*PCache1)(unsafe.Pointer(pCache)).FbPurgeable) } } if !(pPage != 0) { pPage = pcache1AllocPage(tls, pCache, libc.Bool32(createFlag == 1)) } if pPage != 0 { var h uint32 = iKey % (*PCache1)(unsafe.Pointer(pCache)).FnHash (*PCache1)(unsafe.Pointer(pCache)).FnPage++ (*PgHdr1)(unsafe.Pointer(pPage)).FiKey = iKey (*PgHdr1)(unsafe.Pointer(pPage)).FpNext = *(*uintptr)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(h)*8)) (*PgHdr1)(unsafe.Pointer(pPage)).FpCache = pCache (*PgHdr1)(unsafe.Pointer(pPage)).FpLruNext = uintptr(0) *(*uintptr)(unsafe.Pointer((*PgHdr1)(unsafe.Pointer(pPage)).Fpage.FpExtra)) = uintptr(0) *(*uintptr)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(h)*8)) = pPage if iKey > (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey { (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey = iKey } } return pPage } func pcache1FetchNoMutex(tls *libc.TLS, p uintptr, iKey uint32, createFlag int32) uintptr { var pCache uintptr = p var pPage uintptr = uintptr(0) pPage = *(*uintptr)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(iKey%(*PCache1)(unsafe.Pointer(pCache)).FnHash)*8)) for pPage != 0 && (*PgHdr1)(unsafe.Pointer(pPage)).FiKey != iKey { pPage = (*PgHdr1)(unsafe.Pointer(pPage)).FpNext } if pPage != 0 { if (*PgHdr1)(unsafe.Pointer(pPage)).FpLruNext != uintptr(0) { return pcache1PinPage(tls, pPage) } else { return pPage } } else if createFlag != 0 { return pcache1FetchStage2(tls, pCache, iKey, createFlag) } else { return uintptr(0) } return uintptr(0) } func pcache1FetchWithMutex(tls *libc.TLS, p uintptr, iKey uint32, createFlag int32) uintptr { var pCache uintptr = p var pPage uintptr Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) pPage = pcache1FetchNoMutex(tls, p, iKey, createFlag) Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) return pPage } func pcache1Fetch(tls *libc.TLS, p uintptr, iKey uint32, createFlag int32) uintptr { var pCache uintptr = p if (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex != 0 { return pcache1FetchWithMutex(tls, p, iKey, createFlag) } else { return pcache1FetchNoMutex(tls, p, iKey, createFlag) } return uintptr(0) } func pcache1Unpin(tls *libc.TLS, p uintptr, pPg uintptr, reuseUnlikely int32) { var pCache uintptr = p var pPage uintptr = pPg var pGroup uintptr = (*PCache1)(unsafe.Pointer(pCache)).FpGroup Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) if reuseUnlikely != 0 || (*PGroup)(unsafe.Pointer(pGroup)).FnPurgeable > (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage { pcache1RemoveFromHash(tls, pPage, 1) } else { var ppFirst uintptr = pGroup + 24 + 40 (*PgHdr1)(unsafe.Pointer(pPage)).FpLruPrev = pGroup + 24 (*PgHdr1)(unsafe.Pointer(libc.AssignPtrUintptr(pPage+40, *(*uintptr)(unsafe.Pointer(ppFirst))))).FpLruPrev = pPage *(*uintptr)(unsafe.Pointer(ppFirst)) = pPage (*PCache1)(unsafe.Pointer(pCache)).FnRecyclable++ } Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) } func pcache1Rekey(tls *libc.TLS, p uintptr, pPg uintptr, iOld uint32, iNew uint32) { var pCache uintptr = p var pPage uintptr = pPg var pp uintptr var hOld uint32 var hNew uint32 Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) hOld = iOld % (*PCache1)(unsafe.Pointer(pCache)).FnHash pp = (*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(hOld)*8 for *(*uintptr)(unsafe.Pointer(pp)) != pPage { pp = *(*uintptr)(unsafe.Pointer(pp)) + 24 } *(*uintptr)(unsafe.Pointer(pp)) = (*PgHdr1)(unsafe.Pointer(pPage)).FpNext hNew = iNew % (*PCache1)(unsafe.Pointer(pCache)).FnHash (*PgHdr1)(unsafe.Pointer(pPage)).FiKey = iNew (*PgHdr1)(unsafe.Pointer(pPage)).FpNext = *(*uintptr)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(hNew)*8)) *(*uintptr)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FapHash + uintptr(hNew)*8)) = pPage if iNew > (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey { (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey = iNew } Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) } func pcache1Truncate(tls *libc.TLS, p uintptr, iLimit uint32) { var pCache uintptr = p Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) if iLimit <= (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey { pcache1TruncateUnsafe(tls, pCache, iLimit) (*PCache1)(unsafe.Pointer(pCache)).FiMaxKey = iLimit - uint32(1) } Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer((*PCache1)(unsafe.Pointer(pCache)).FpGroup)).Fmutex) } func pcache1Destroy(tls *libc.TLS, p uintptr) { var pCache uintptr = p var pGroup uintptr = (*PCache1)(unsafe.Pointer(pCache)).FpGroup Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) if (*PCache1)(unsafe.Pointer(pCache)).FnPage != 0 { pcache1TruncateUnsafe(tls, pCache, uint32(0)) } *(*uint32)(unsafe.Pointer(pGroup + 8)) -= (*PCache1)(unsafe.Pointer(pCache)).FnMax *(*uint32)(unsafe.Pointer(pGroup + 12)) -= (*PCache1)(unsafe.Pointer(pCache)).FnMin (*PGroup)(unsafe.Pointer(pGroup)).FmxPinned = (*PGroup)(unsafe.Pointer(pGroup)).FnMaxPage + uint32(10) - (*PGroup)(unsafe.Pointer(pGroup)).FnMinPage pcache1EnforceMaxPage(tls, pCache) Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer(pGroup)).Fmutex) Xsqlite3_free(tls, (*PCache1)(unsafe.Pointer(pCache)).FpBulk) Xsqlite3_free(tls, (*PCache1)(unsafe.Pointer(pCache)).FapHash) Xsqlite3_free(tls, pCache) } // This function is called during initialization (sqlite3_initialize()) to // install the default pluggable cache module, assuming the user has not // already provided an alternative. func Xsqlite3PCacheSetDefault(tls *libc.TLS) { bp := tls.Alloc(8) defer tls.Free(8) Xsqlite3_config(tls, SQLITE_CONFIG_PCACHE2, libc.VaList(bp, uintptr(unsafe.Pointer(&defaultMethods1)))) } var defaultMethods1 = Sqlite3_pcache_methods2{ FiVersion: 1, FxInit: 0, FxShutdown: 0, FxCreate: 0, FxCachesize: 0, FxPagecount: 0, FxFetch: 0, FxUnpin: 0, FxRekey: 0, FxTruncate: 0, FxDestroy: 0, FxShrink: 0, } // Return the size of the header on each page of this PCACHE implementation. func Xsqlite3HeaderSizePcache1(tls *libc.TLS) int32 { return int32((uint64(unsafe.Sizeof(PgHdr1{})) + uint64(7)) & libc.Uint64FromInt32(libc.CplInt32(7))) } // Return the global mutex used by this PCACHE implementation. The // sqlite3_status() routine needs access to this mutex. func Xsqlite3Pcache1Mutex(tls *libc.TLS) uintptr { return pcache1_g.Fmutex } // This function is called to free superfluous dynamically allocated memory // held by the pager system. Memory in use by any SQLite pager allocated // by the current thread may be sqlite3_free()ed. // // nReq is the number of bytes of memory required. Once this much has // been released, the function returns. The return value is the total number // of bytes of memory released. func Xsqlite3PcacheReleaseMemory(tls *libc.TLS, nReq int32) int32 { var nFree int32 = 0 if Xsqlite3Config.FpPage == uintptr(0) { var p uintptr Xsqlite3_mutex_enter(tls, (*PGroup)(unsafe.Pointer(uintptr(unsafe.Pointer(&pcache1_g)))).Fmutex) for (nReq < 0 || nFree < nReq) && libc.AssignUintptr(&p, pcache1_g.Fgrp.Flru.FpLruPrev) != uintptr(0) && int32((*PgHdr1)(unsafe.Pointer(p)).FisAnchor) == 0 { nFree = nFree + pcache1MemSize(tls, (*PgHdr1)(unsafe.Pointer(p)).Fpage.FpBuf) pcache1PinPage(tls, p) pcache1RemoveFromHash(tls, p, 1) } Xsqlite3_mutex_leave(tls, (*PGroup)(unsafe.Pointer(uintptr(unsafe.Pointer(&pcache1_g)))).Fmutex) } return nFree } // Each entry in a RowSet is an instance of the following object. // // This same object is reused to store a linked list of trees of RowSetEntry // objects. In that alternative use, pRight points to the next entry // in the list, pLeft points to the tree, and v is unused. The // RowSet.pForest value points to the head of this forest list. type RowSetEntry = struct { Fv I64 FpRight uintptr FpLeft uintptr } // RowSetEntry objects are allocated in large chunks (instances of the // following structure) to reduce memory allocation overhead. The // chunks are kept on a linked list so that they can be deallocated // when the RowSet is destroyed. type RowSetChunk = struct { FpNextChunk uintptr FaEntry [42]struct { Fv I64 FpRight uintptr FpLeft uintptr } } // Allocate a RowSet object. Return NULL if a memory allocation // error occurs. func Xsqlite3RowSetInit(tls *libc.TLS, db uintptr) uintptr { var p uintptr = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(RowSet{}))) if p != 0 { var N int32 = Xsqlite3DbMallocSize(tls, db, p) (*RowSet)(unsafe.Pointer(p)).FpChunk = uintptr(0) (*RowSet)(unsafe.Pointer(p)).Fdb = db (*RowSet)(unsafe.Pointer(p)).FpEntry = uintptr(0) (*RowSet)(unsafe.Pointer(p)).FpLast = uintptr(0) (*RowSet)(unsafe.Pointer(p)).FpForest = uintptr(0) (*RowSet)(unsafe.Pointer(p)).FpFresh = uintptr((uint64(unsafe.Sizeof(RowSet{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))) + p (*RowSet)(unsafe.Pointer(p)).FnFresh = U16((uint64(N) - (uint64(unsafe.Sizeof(RowSet{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))) / uint64(unsafe.Sizeof(RowSetEntry{}))) (*RowSet)(unsafe.Pointer(p)).FrsFlags = U16(ROWSET_SORTED) (*RowSet)(unsafe.Pointer(p)).FiBatch = 0 } return p } // Deallocate all chunks from a RowSet. This frees all memory that // the RowSet has allocated over its lifetime. This routine is // the destructor for the RowSet. func Xsqlite3RowSetClear(tls *libc.TLS, pArg uintptr) { var p uintptr = pArg var pChunk uintptr var pNextChunk uintptr for pChunk = (*RowSet)(unsafe.Pointer(p)).FpChunk; pChunk != 0; pChunk = pNextChunk { pNextChunk = (*RowSetChunk)(unsafe.Pointer(pChunk)).FpNextChunk Xsqlite3DbFree(tls, (*RowSet)(unsafe.Pointer(p)).Fdb, pChunk) } (*RowSet)(unsafe.Pointer(p)).FpChunk = uintptr(0) (*RowSet)(unsafe.Pointer(p)).FnFresh = U16(0) (*RowSet)(unsafe.Pointer(p)).FpEntry = uintptr(0) (*RowSet)(unsafe.Pointer(p)).FpLast = uintptr(0) (*RowSet)(unsafe.Pointer(p)).FpForest = uintptr(0) (*RowSet)(unsafe.Pointer(p)).FrsFlags = U16(ROWSET_SORTED) } // Deallocate all chunks from a RowSet. This frees all memory that // the RowSet has allocated over its lifetime. This routine is // the destructor for the RowSet. func Xsqlite3RowSetDelete(tls *libc.TLS, pArg uintptr) { Xsqlite3RowSetClear(tls, pArg) Xsqlite3DbFree(tls, (*RowSet)(unsafe.Pointer(pArg)).Fdb, pArg) } func rowSetEntryAlloc(tls *libc.TLS, p uintptr) uintptr { if int32((*RowSet)(unsafe.Pointer(p)).FnFresh) == 0 { var pNew uintptr pNew = Xsqlite3DbMallocRawNN(tls, (*RowSet)(unsafe.Pointer(p)).Fdb, uint64(unsafe.Sizeof(RowSetChunk{}))) if pNew == uintptr(0) { return uintptr(0) } (*RowSetChunk)(unsafe.Pointer(pNew)).FpNextChunk = (*RowSet)(unsafe.Pointer(p)).FpChunk (*RowSet)(unsafe.Pointer(p)).FpChunk = pNew (*RowSet)(unsafe.Pointer(p)).FpFresh = pNew + 8 (*RowSet)(unsafe.Pointer(p)).FnFresh = uint16(uint64(ROWSET_ALLOCATION_SIZE-8) / uint64(unsafe.Sizeof(RowSetEntry{}))) } (*RowSet)(unsafe.Pointer(p)).FnFresh-- return libc.PostIncUintptr(&(*RowSet)(unsafe.Pointer(p)).FpFresh, 24) } // Insert a new value into a RowSet. // // The mallocFailed flag of the database connection is set if a // memory allocation fails. func Xsqlite3RowSetInsert(tls *libc.TLS, p uintptr, rowid I64) { var pEntry uintptr var pLast uintptr pEntry = rowSetEntryAlloc(tls, p) if pEntry == uintptr(0) { return } (*RowSetEntry)(unsafe.Pointer(pEntry)).Fv = rowid (*RowSetEntry)(unsafe.Pointer(pEntry)).FpRight = uintptr(0) pLast = (*RowSet)(unsafe.Pointer(p)).FpLast if pLast != 0 { if rowid <= (*RowSetEntry)(unsafe.Pointer(pLast)).Fv { *(*U16)(unsafe.Pointer(p + 50)) &= libc.Uint16FromInt32(libc.CplInt32(ROWSET_SORTED)) } (*RowSetEntry)(unsafe.Pointer(pLast)).FpRight = pEntry } else { (*RowSet)(unsafe.Pointer(p)).FpEntry = pEntry } (*RowSet)(unsafe.Pointer(p)).FpLast = pEntry } func rowSetEntryMerge(tls *libc.TLS, pA uintptr, pB uintptr) uintptr { bp := tls.Alloc(24) defer tls.Free(24) var pTail uintptr pTail = bp for { if (*RowSetEntry)(unsafe.Pointer(pA)).Fv <= (*RowSetEntry)(unsafe.Pointer(pB)).Fv { if (*RowSetEntry)(unsafe.Pointer(pA)).Fv < (*RowSetEntry)(unsafe.Pointer(pB)).Fv { pTail = libc.AssignPtrUintptr(pTail+8, pA) } pA = (*RowSetEntry)(unsafe.Pointer(pA)).FpRight if pA == uintptr(0) { (*RowSetEntry)(unsafe.Pointer(pTail)).FpRight = pB break } } else { pTail = libc.AssignPtrUintptr(pTail+8, pB) pB = (*RowSetEntry)(unsafe.Pointer(pB)).FpRight if pB == uintptr(0) { (*RowSetEntry)(unsafe.Pointer(pTail)).FpRight = pA break } } } return (*RowSetEntry)(unsafe.Pointer(bp)).FpRight } func rowSetEntrySort(tls *libc.TLS, pIn uintptr) uintptr { bp := tls.Alloc(320) defer tls.Free(320) var i uint32 var pNext uintptr libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([40]uintptr{}))) for pIn != 0 { pNext = (*RowSetEntry)(unsafe.Pointer(pIn)).FpRight (*RowSetEntry)(unsafe.Pointer(pIn)).FpRight = uintptr(0) for i = uint32(0); *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) != 0; i++ { pIn = rowSetEntryMerge(tls, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)), pIn) *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = uintptr(0) } *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = pIn pIn = pNext } pIn = *(*uintptr)(unsafe.Pointer(bp)) for i = uint32(1); uint64(i) < uint64(unsafe.Sizeof([40]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0))); i++ { if *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) == uintptr(0) { continue } if pIn != 0 { pIn = rowSetEntryMerge(tls, pIn, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8))) } else { pIn = *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) } } return pIn } func rowSetTreeToList(tls *libc.TLS, pIn uintptr, ppFirst uintptr, ppLast uintptr) { bp := tls.Alloc(8) defer tls.Free(8) if (*RowSetEntry)(unsafe.Pointer(pIn)).FpLeft != 0 { rowSetTreeToList(tls, (*RowSetEntry)(unsafe.Pointer(pIn)).FpLeft, ppFirst, bp) (*RowSetEntry)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpRight = pIn } else { *(*uintptr)(unsafe.Pointer(ppFirst)) = pIn } if (*RowSetEntry)(unsafe.Pointer(pIn)).FpRight != 0 { rowSetTreeToList(tls, (*RowSetEntry)(unsafe.Pointer(pIn)).FpRight, pIn+8, ppLast) } else { *(*uintptr)(unsafe.Pointer(ppLast)) = pIn } } func rowSetNDeepTree(tls *libc.TLS, ppList uintptr, iDepth int32) uintptr { var p uintptr var pLeft uintptr if *(*uintptr)(unsafe.Pointer(ppList)) == uintptr(0) { return uintptr(0) } if iDepth > 1 { pLeft = rowSetNDeepTree(tls, ppList, iDepth-1) p = *(*uintptr)(unsafe.Pointer(ppList)) if p == uintptr(0) { return pLeft } (*RowSetEntry)(unsafe.Pointer(p)).FpLeft = pLeft *(*uintptr)(unsafe.Pointer(ppList)) = (*RowSetEntry)(unsafe.Pointer(p)).FpRight (*RowSetEntry)(unsafe.Pointer(p)).FpRight = rowSetNDeepTree(tls, ppList, iDepth-1) } else { p = *(*uintptr)(unsafe.Pointer(ppList)) *(*uintptr)(unsafe.Pointer(ppList)) = (*RowSetEntry)(unsafe.Pointer(p)).FpRight (*RowSetEntry)(unsafe.Pointer(p)).FpLeft = libc.AssignPtrUintptr(p+8, uintptr(0)) } return p } func rowSetListToTree(tls *libc.TLS, pList uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = pList var iDepth int32 var p uintptr var pLeft uintptr p = *(*uintptr)(unsafe.Pointer(bp)) *(*uintptr)(unsafe.Pointer(bp)) = (*RowSetEntry)(unsafe.Pointer(p)).FpRight (*RowSetEntry)(unsafe.Pointer(p)).FpLeft = libc.AssignPtrUintptr(p+8, uintptr(0)) for iDepth = 1; *(*uintptr)(unsafe.Pointer(bp)) != 0; iDepth++ { pLeft = p p = *(*uintptr)(unsafe.Pointer(bp)) *(*uintptr)(unsafe.Pointer(bp)) = (*RowSetEntry)(unsafe.Pointer(p)).FpRight (*RowSetEntry)(unsafe.Pointer(p)).FpLeft = pLeft (*RowSetEntry)(unsafe.Pointer(p)).FpRight = rowSetNDeepTree(tls, bp, iDepth) } return p } // Extract the smallest element from the RowSet. // Write the element into *pRowid. Return 1 on success. Return // 0 if the RowSet is already empty. // // After this routine has been called, the sqlite3RowSetInsert() // routine may not be called again. // // This routine may not be called after sqlite3RowSetTest() has // been used. Older versions of RowSet allowed that, but as the // capability was not used by the code generator, it was removed // for code economy. func Xsqlite3RowSetNext(tls *libc.TLS, p uintptr, pRowid uintptr) int32 { if int32((*RowSet)(unsafe.Pointer(p)).FrsFlags)&ROWSET_NEXT == 0 { if int32((*RowSet)(unsafe.Pointer(p)).FrsFlags)&ROWSET_SORTED == 0 { (*RowSet)(unsafe.Pointer(p)).FpEntry = rowSetEntrySort(tls, (*RowSet)(unsafe.Pointer(p)).FpEntry) } *(*U16)(unsafe.Pointer(p + 50)) |= U16(ROWSET_SORTED | ROWSET_NEXT) } if (*RowSet)(unsafe.Pointer(p)).FpEntry != 0 { *(*I64)(unsafe.Pointer(pRowid)) = (*RowSetEntry)(unsafe.Pointer((*RowSet)(unsafe.Pointer(p)).FpEntry)).Fv (*RowSet)(unsafe.Pointer(p)).FpEntry = (*RowSetEntry)(unsafe.Pointer((*RowSet)(unsafe.Pointer(p)).FpEntry)).FpRight if (*RowSet)(unsafe.Pointer(p)).FpEntry == uintptr(0) { Xsqlite3RowSetClear(tls, p) } return 1 } else { return 0 } return int32(0) } // Check to see if element iRowid was inserted into the rowset as // part of any insert batch prior to iBatch. Return 1 or 0. // // If this is the first test of a new batch and if there exist entries // on pRowSet->pEntry, then sort those entries into the forest at // pRowSet->pForest so that they can be tested. func Xsqlite3RowSetTest(tls *libc.TLS, pRowSet uintptr, iBatch int32, iRowid Sqlite3_int64) int32 { bp := tls.Alloc(16) defer tls.Free(16) var p uintptr var pTree uintptr if iBatch != (*RowSet)(unsafe.Pointer(pRowSet)).FiBatch { p = (*RowSet)(unsafe.Pointer(pRowSet)).FpEntry if p != 0 { var ppPrevTree uintptr = pRowSet + 40 if int32((*RowSet)(unsafe.Pointer(pRowSet)).FrsFlags)&ROWSET_SORTED == 0 { p = rowSetEntrySort(tls, p) } for pTree = (*RowSet)(unsafe.Pointer(pRowSet)).FpForest; pTree != 0; pTree = (*RowSetEntry)(unsafe.Pointer(pTree)).FpRight { ppPrevTree = pTree + 8 if (*RowSetEntry)(unsafe.Pointer(pTree)).FpLeft == uintptr(0) { (*RowSetEntry)(unsafe.Pointer(pTree)).FpLeft = rowSetListToTree(tls, p) break } else { rowSetTreeToList(tls, (*RowSetEntry)(unsafe.Pointer(pTree)).FpLeft, bp, bp+8) (*RowSetEntry)(unsafe.Pointer(pTree)).FpLeft = uintptr(0) p = rowSetEntryMerge(tls, *(*uintptr)(unsafe.Pointer(bp)), p) } } if pTree == uintptr(0) { *(*uintptr)(unsafe.Pointer(ppPrevTree)) = libc.AssignUintptr(&pTree, rowSetEntryAlloc(tls, pRowSet)) if pTree != 0 { (*RowSetEntry)(unsafe.Pointer(pTree)).Fv = int64(0) (*RowSetEntry)(unsafe.Pointer(pTree)).FpRight = uintptr(0) (*RowSetEntry)(unsafe.Pointer(pTree)).FpLeft = rowSetListToTree(tls, p) } } (*RowSet)(unsafe.Pointer(pRowSet)).FpEntry = uintptr(0) (*RowSet)(unsafe.Pointer(pRowSet)).FpLast = uintptr(0) *(*U16)(unsafe.Pointer(pRowSet + 50)) |= U16(ROWSET_SORTED) } (*RowSet)(unsafe.Pointer(pRowSet)).FiBatch = iBatch } for pTree = (*RowSet)(unsafe.Pointer(pRowSet)).FpForest; pTree != 0; pTree = (*RowSetEntry)(unsafe.Pointer(pTree)).FpRight { p = (*RowSetEntry)(unsafe.Pointer(pTree)).FpLeft for p != 0 { if (*RowSetEntry)(unsafe.Pointer(p)).Fv < iRowid { p = (*RowSetEntry)(unsafe.Pointer(p)).FpRight } else if (*RowSetEntry)(unsafe.Pointer(p)).Fv > iRowid { p = (*RowSetEntry)(unsafe.Pointer(p)).FpLeft } else { return 1 } } } return 0 } // Connection to a write-ahead log (WAL) file. // There is one object of this type for each pager. type Wal1 = struct { FpVfs uintptr FpDbFd uintptr FpWalFd uintptr FiCallback U32 F__ccgo_pad1 [4]byte FmxWalSize I64 FnWiData int32 FszFirstBlock int32 FapWiData uintptr FszPage U32 FreadLock I16 FsyncFlags U8 FexclusiveMode U8 FwriteLock U8 FckptLock U8 FreadOnly U8 FtruncateOnCommit U8 FsyncHeader U8 FpadToSectorBoundary U8 FbShmUnreliable U8 F__ccgo_pad2 [1]byte Fhdr WalIndexHdr FminFrame U32 FiReCksum U32 FzWalName uintptr FnCkpt U32 F__ccgo_pad3 [4]byte FpSnapshot uintptr } // Connection to a write-ahead log (WAL) file. // There is one object of this type for each pager. type Wal = Wal1 // An instance of the following structure is allocated for each active // savepoint and statement transaction in the system. All such structures // are stored in the Pager.aSavepoint[] array, which is allocated and // resized using sqlite3Realloc(). // // When a savepoint is created, the PagerSavepoint.iHdrOffset field is // set to 0. If a journal-header is written into the main journal while // the savepoint is active, then iHdrOffset is set to the byte offset // immediately following the last journal record written into the main // journal before the journal-header. This is required during savepoint // rollback (see pagerPlaybackSavepoint()). type PagerSavepoint1 = struct { FiOffset I64 FiHdrOffset I64 FpInSavepoint uintptr FnOrig Pgno FiSubRec Pgno FbTruncateOnRelease int32 FaWalData [4]U32 F__ccgo_pad1 [4]byte } // An instance of the following structure is allocated for each active // savepoint and statement transaction in the system. All such structures // are stored in the Pager.aSavepoint[] array, which is allocated and // resized using sqlite3Realloc(). // // When a savepoint is created, the PagerSavepoint.iHdrOffset field is // set to 0. If a journal-header is written into the main journal while // the savepoint is active, then iHdrOffset is set to the byte offset // immediately following the last journal record written into the main // journal before the journal-header. This is required during savepoint // rollback (see pagerPlaybackSavepoint()). type PagerSavepoint = PagerSavepoint1 var aJournalMagic = [8]uint8{ uint8(0xd9), uint8(0xd5), uint8(0x05), uint8(0xf9), uint8(0x20), uint8(0xa1), uint8(0x63), uint8(0xd7), } func setGetterMethod(tls *libc.TLS, pPager uintptr) { if (*Pager)(unsafe.Pointer(pPager)).FerrCode != 0 { (*Pager)(unsafe.Pointer(pPager)).FxGet = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, Pgno, uintptr, int32) int32 }{getPageError})) } else if (*Pager)(unsafe.Pointer(pPager)).FbUseFetch != 0 { (*Pager)(unsafe.Pointer(pPager)).FxGet = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, Pgno, uintptr, int32) int32 }{getPageMMap})) } else { (*Pager)(unsafe.Pointer(pPager)).FxGet = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, Pgno, uintptr, int32) int32 }{getPageNormal})) } } func subjRequiresPage(tls *libc.TLS, pPg uintptr) int32 { var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager var p uintptr var pgno Pgno = (*PgHdr)(unsafe.Pointer(pPg)).Fpgno var i int32 for i = 0; i < (*Pager)(unsafe.Pointer(pPager)).FnSavepoint; i++ { p = (*Pager)(unsafe.Pointer(pPager)).FaSavepoint + uintptr(i)*56 if (*PagerSavepoint)(unsafe.Pointer(p)).FnOrig >= pgno && 0 == Xsqlite3BitvecTestNotNull(tls, (*PagerSavepoint)(unsafe.Pointer(p)).FpInSavepoint, pgno) { for i = i + 1; i < (*Pager)(unsafe.Pointer(pPager)).FnSavepoint; i++ { (*PagerSavepoint)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).FaSavepoint + uintptr(i)*56)).FbTruncateOnRelease = 0 } return 1 } } return 0 } func read32bits(tls *libc.TLS, fd uintptr, offset I64, pRes uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 = Xsqlite3OsRead(tls, fd, bp, int32(unsafe.Sizeof([4]uint8{})), offset) if rc == SQLITE_OK { *(*U32)(unsafe.Pointer(pRes)) = Xsqlite3Get4byte(tls, bp) } return rc } func write32bits(tls *libc.TLS, fd uintptr, offset I64, val U32) int32 { bp := tls.Alloc(4) defer tls.Free(4) Xsqlite3Put4byte(tls, bp, val) return Xsqlite3OsWrite(tls, fd, bp, 4, offset) } func pagerUnlockDb(tls *libc.TLS, pPager uintptr, eLock int32) int32 { var rc int32 = SQLITE_OK if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0) { if (*Pager)(unsafe.Pointer(pPager)).FnoLock != 0 { rc = SQLITE_OK } else { rc = Xsqlite3OsUnlock(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, eLock) } if int32((*Pager)(unsafe.Pointer(pPager)).FeLock) != EXCLUSIVE_LOCK+1 { (*Pager)(unsafe.Pointer(pPager)).FeLock = U8(eLock) } } (*Pager)(unsafe.Pointer(pPager)).FchangeCountDone = (*Pager)(unsafe.Pointer(pPager)).FtempFile return rc } func pagerLockDb(tls *libc.TLS, pPager uintptr, eLock int32) int32 { var rc int32 = SQLITE_OK if int32((*Pager)(unsafe.Pointer(pPager)).FeLock) < eLock || int32((*Pager)(unsafe.Pointer(pPager)).FeLock) == EXCLUSIVE_LOCK+1 { if (*Pager)(unsafe.Pointer(pPager)).FnoLock != 0 { rc = SQLITE_OK } else { rc = Xsqlite3OsLock(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, eLock) } if rc == SQLITE_OK && (int32((*Pager)(unsafe.Pointer(pPager)).FeLock) != EXCLUSIVE_LOCK+1 || eLock == EXCLUSIVE_LOCK) { (*Pager)(unsafe.Pointer(pPager)).FeLock = U8(eLock) } } return rc } func jrnlBufferSize(tls *libc.TLS, pPager uintptr) int32 { _ = pPager return 0 } func readSuperJournal(tls *libc.TLS, pJrnl uintptr, zSuper uintptr, nSuper U32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 var u U32 *(*int8)(unsafe.Pointer(zSuper)) = int8(0) if SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3OsFileSize(tls, pJrnl, bp)) || *(*I64)(unsafe.Pointer(bp)) < int64(16) || SQLITE_OK != libc.AssignInt32(&rc, read32bits(tls, pJrnl, *(*I64)(unsafe.Pointer(bp))-int64(16), bp+8)) || *(*U32)(unsafe.Pointer(bp + 8)) >= nSuper || I64(*(*U32)(unsafe.Pointer(bp + 8))) > *(*I64)(unsafe.Pointer(bp))-int64(16) || *(*U32)(unsafe.Pointer(bp + 8)) == U32(0) || SQLITE_OK != libc.AssignInt32(&rc, read32bits(tls, pJrnl, *(*I64)(unsafe.Pointer(bp))-int64(12), bp+12)) || SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3OsRead(tls, pJrnl, bp+16, 8, *(*I64)(unsafe.Pointer(bp))-int64(8))) || libc.Xmemcmp(tls, bp+16, uintptr(unsafe.Pointer(&aJournalMagic)), uint64(8)) != 0 || SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3OsRead(tls, pJrnl, zSuper, int32(*(*U32)(unsafe.Pointer(bp + 8))), *(*I64)(unsafe.Pointer(bp))-int64(16)-I64(*(*U32)(unsafe.Pointer(bp + 8))))) { return rc } for u = U32(0); u < *(*U32)(unsafe.Pointer(bp + 8)); u++ { *(*U32)(unsafe.Pointer(bp + 12)) -= U32(*(*int8)(unsafe.Pointer(zSuper + uintptr(u)))) } if *(*U32)(unsafe.Pointer(bp + 12)) != 0 { *(*U32)(unsafe.Pointer(bp + 8)) = U32(0) } *(*int8)(unsafe.Pointer(zSuper + uintptr(*(*U32)(unsafe.Pointer(bp + 8))))) = int8(0) *(*int8)(unsafe.Pointer(zSuper + uintptr(*(*U32)(unsafe.Pointer(bp + 8))+U32(1)))) = int8(0) return SQLITE_OK } func journalHdrOffset(tls *libc.TLS, pPager uintptr) I64 { var offset I64 = int64(0) var c I64 = (*Pager)(unsafe.Pointer(pPager)).FjournalOff if c != 0 { offset = ((c-int64(1))/I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) + int64(1)) * I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) } return offset } func zeroJournalHdr(tls *libc.TLS, pPager uintptr, doTruncate int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK if (*Pager)(unsafe.Pointer(pPager)).FjournalOff != 0 { var iLimit I64 = (*Pager)(unsafe.Pointer(pPager)).FjournalSizeLimit if doTruncate != 0 || iLimit == int64(0) { rc = Xsqlite3OsTruncate(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, int64(0)) } else { rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, uintptr(unsafe.Pointer(&zeroHdr)), int32(unsafe.Sizeof(zeroHdr)), int64(0)) } if rc == SQLITE_OK && !(int32((*Pager)(unsafe.Pointer(pPager)).FnoSync) != 0) { rc = Xsqlite3OsSync(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, SQLITE_SYNC_DATAONLY|int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags)) } if rc == SQLITE_OK && iLimit > int64(0) { rc = Xsqlite3OsFileSize(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, bp) if rc == SQLITE_OK && *(*I64)(unsafe.Pointer(bp)) > iLimit { rc = Xsqlite3OsTruncate(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iLimit) } } } return rc } var zeroHdr = [28]int8{0: int8(0)} func writeJournalHdr(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = SQLITE_OK var zHeader uintptr = (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace var nHeader U32 = U32((*Pager)(unsafe.Pointer(pPager)).FpageSize) var nWrite U32 var ii int32 if nHeader > (*Pager)(unsafe.Pointer(pPager)).FsectorSize { nHeader = (*Pager)(unsafe.Pointer(pPager)).FsectorSize } for ii = 0; ii < (*Pager)(unsafe.Pointer(pPager)).FnSavepoint; ii++ { if (*PagerSavepoint)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).FaSavepoint+uintptr(ii)*56)).FiHdrOffset == int64(0) { (*PagerSavepoint)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).FaSavepoint + uintptr(ii)*56)).FiHdrOffset = (*Pager)(unsafe.Pointer(pPager)).FjournalOff } } (*Pager)(unsafe.Pointer(pPager)).FjournalHdr = libc.AssignPtrInt64(pPager+96, journalHdrOffset(tls, pPager)) if (*Pager)(unsafe.Pointer(pPager)).FnoSync != 0 || int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_MEMORY || Xsqlite3OsDeviceCharacteristics(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd)&SQLITE_IOCAP_SAFE_APPEND != 0 { libc.Xmemcpy(tls, zHeader, uintptr(unsafe.Pointer(&aJournalMagic)), uint64(unsafe.Sizeof(aJournalMagic))) Xsqlite3Put4byte(tls, zHeader+8, 0xffffffff) } else { libc.Xmemset(tls, zHeader, 0, uint64(unsafe.Sizeof(aJournalMagic))+uint64(4)) } Xsqlite3_randomness(tls, int32(unsafe.Sizeof(U32(0))), pPager+56) Xsqlite3Put4byte(tls, zHeader+12, (*Pager)(unsafe.Pointer(pPager)).FcksumInit) Xsqlite3Put4byte(tls, zHeader+16, (*Pager)(unsafe.Pointer(pPager)).FdbOrigSize) Xsqlite3Put4byte(tls, zHeader+20, (*Pager)(unsafe.Pointer(pPager)).FsectorSize) Xsqlite3Put4byte(tls, zHeader+24, uint32((*Pager)(unsafe.Pointer(pPager)).FpageSize)) libc.Xmemset(tls, zHeader+28, 0, uint64(nHeader)-(uint64(unsafe.Sizeof(aJournalMagic))+uint64(20))) for nWrite = U32(0); rc == SQLITE_OK && nWrite < (*Pager)(unsafe.Pointer(pPager)).FsectorSize; nWrite = nWrite + nHeader { rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, zHeader, int32(nHeader), (*Pager)(unsafe.Pointer(pPager)).FjournalOff) *(*I64)(unsafe.Pointer(pPager + 96)) += I64(nHeader) } return rc } func readJournalHdr(tls *libc.TLS, pPager uintptr, isHot int32, journalSize I64, pNRec uintptr, pDbSize uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 var iHdrOff I64 (*Pager)(unsafe.Pointer(pPager)).FjournalOff = journalHdrOffset(tls, pPager) if (*Pager)(unsafe.Pointer(pPager)).FjournalOff+I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) > journalSize { return SQLITE_DONE } iHdrOff = (*Pager)(unsafe.Pointer(pPager)).FjournalOff if isHot != 0 || iHdrOff != (*Pager)(unsafe.Pointer(pPager)).FjournalHdr { rc = Xsqlite3OsRead(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, bp, int32(unsafe.Sizeof([8]uint8{})), iHdrOff) if rc != 0 { return rc } if libc.Xmemcmp(tls, bp, uintptr(unsafe.Pointer(&aJournalMagic)), uint64(unsafe.Sizeof([8]uint8{}))) != 0 { return SQLITE_DONE } } if SQLITE_OK != libc.AssignInt32(&rc, read32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff+int64(8), pNRec)) || SQLITE_OK != libc.AssignInt32(&rc, read32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff+int64(12), pPager+56)) || SQLITE_OK != libc.AssignInt32(&rc, read32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff+int64(16), pDbSize)) { return rc } if (*Pager)(unsafe.Pointer(pPager)).FjournalOff == int64(0) { if SQLITE_OK != libc.AssignInt32(&rc, read32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff+int64(20), bp+8)) || SQLITE_OK != libc.AssignInt32(&rc, read32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff+int64(24), bp+12)) { return rc } if *(*U32)(unsafe.Pointer(bp + 12)) == U32(0) { *(*U32)(unsafe.Pointer(bp + 12)) = U32((*Pager)(unsafe.Pointer(pPager)).FpageSize) } if *(*U32)(unsafe.Pointer(bp + 12)) < U32(512) || *(*U32)(unsafe.Pointer(bp + 8)) < U32(32) || *(*U32)(unsafe.Pointer(bp + 12)) > U32(SQLITE_MAX_PAGE_SIZE) || *(*U32)(unsafe.Pointer(bp + 8)) > U32(MAX_SECTOR_SIZE) || (*(*U32)(unsafe.Pointer(bp + 12))-U32(1))&*(*U32)(unsafe.Pointer(bp + 12)) != U32(0) || (*(*U32)(unsafe.Pointer(bp + 8))-U32(1))&*(*U32)(unsafe.Pointer(bp + 8)) != U32(0) { return SQLITE_DONE } rc = Xsqlite3PagerSetPagesize(tls, pPager, bp+12, -1) (*Pager)(unsafe.Pointer(pPager)).FsectorSize = *(*U32)(unsafe.Pointer(bp + 8)) } *(*I64)(unsafe.Pointer(pPager + 96)) += I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) return rc } func writeSuperJournal(tls *libc.TLS, pPager uintptr, zSuper uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var nSuper int32 var iHdrOff I64 var cksum U32 = U32(0) if !(zSuper != 0) || int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_MEMORY || !((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0)) { return SQLITE_OK } (*Pager)(unsafe.Pointer(pPager)).FsetSuper = U8(1) for nSuper = 0; *(*int8)(unsafe.Pointer(zSuper + uintptr(nSuper))) != 0; nSuper++ { cksum = cksum + U32(*(*int8)(unsafe.Pointer(zSuper + uintptr(nSuper)))) } if (*Pager)(unsafe.Pointer(pPager)).FfullSync != 0 { (*Pager)(unsafe.Pointer(pPager)).FjournalOff = journalHdrOffset(tls, pPager) } iHdrOff = (*Pager)(unsafe.Pointer(pPager)).FjournalOff if 0 != libc.AssignInt32(&rc, write32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff, (*Pager)(unsafe.Pointer(pPager)).FlckPgno)) || 0 != libc.AssignInt32(&rc, Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, zSuper, nSuper, iHdrOff+int64(4))) || 0 != libc.AssignInt32(&rc, write32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff+int64(4)+I64(nSuper), uint32(nSuper))) || 0 != libc.AssignInt32(&rc, write32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iHdrOff+int64(4)+I64(nSuper)+int64(4), cksum)) || 0 != libc.AssignInt32(&rc, Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, uintptr(unsafe.Pointer(&aJournalMagic)), 8, iHdrOff+int64(4)+I64(nSuper)+int64(8))) { return rc } *(*I64)(unsafe.Pointer(pPager + 96)) += I64(nSuper + 20) if SQLITE_OK == libc.AssignInt32(&rc, Xsqlite3OsFileSize(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, bp)) && *(*I64)(unsafe.Pointer(bp)) > (*Pager)(unsafe.Pointer(pPager)).FjournalOff { rc = Xsqlite3OsTruncate(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, (*Pager)(unsafe.Pointer(pPager)).FjournalOff) } return rc } func pager_reset(tls *libc.TLS, pPager uintptr) { (*Pager)(unsafe.Pointer(pPager)).FiDataVersion++ Xsqlite3BackupRestart(tls, (*Pager)(unsafe.Pointer(pPager)).FpBackup) Xsqlite3PcacheClear(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) } // Return the pPager->iDataVersion value func Xsqlite3PagerDataVersion(tls *libc.TLS, pPager uintptr) U32 { return (*Pager)(unsafe.Pointer(pPager)).FiDataVersion } func releaseAllSavepoints(tls *libc.TLS, pPager uintptr) { var ii int32 for ii = 0; ii < (*Pager)(unsafe.Pointer(pPager)).FnSavepoint; ii++ { Xsqlite3BitvecDestroy(tls, (*PagerSavepoint)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).FaSavepoint+uintptr(ii)*56)).FpInSavepoint) } if !(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) || Xsqlite3JournalIsInMemory(tls, (*Pager)(unsafe.Pointer(pPager)).Fsjfd) != 0 { Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fsjfd) } Xsqlite3_free(tls, (*Pager)(unsafe.Pointer(pPager)).FaSavepoint) (*Pager)(unsafe.Pointer(pPager)).FaSavepoint = uintptr(0) (*Pager)(unsafe.Pointer(pPager)).FnSavepoint = 0 (*Pager)(unsafe.Pointer(pPager)).FnSubRec = U32(0) } func addToSavepointBitvecs(tls *libc.TLS, pPager uintptr, pgno Pgno) int32 { var ii int32 var rc int32 = SQLITE_OK for ii = 0; ii < (*Pager)(unsafe.Pointer(pPager)).FnSavepoint; ii++ { var p uintptr = (*Pager)(unsafe.Pointer(pPager)).FaSavepoint + uintptr(ii)*56 if pgno <= (*PagerSavepoint)(unsafe.Pointer(p)).FnOrig { rc = rc | Xsqlite3BitvecSet(tls, (*PagerSavepoint)(unsafe.Pointer(p)).FpInSavepoint, pgno) } } return rc } func pager_unlock(tls *libc.TLS, pPager uintptr) { Xsqlite3BitvecDestroy(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal) (*Pager)(unsafe.Pointer(pPager)).FpInJournal = uintptr(0) releaseAllSavepoints(tls, pPager) if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { Xsqlite3WalEndReadTransaction(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_OPEN) } else if !(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) { var rc int32 var iDc int32 if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0) { iDc = Xsqlite3OsDeviceCharacteristics(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd) } else { iDc = 0 } if 0 == iDc&SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN || 1 != int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode)&5 { Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) } rc = pagerUnlockDb(tls, pPager, NO_LOCK) if rc != SQLITE_OK && int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_ERROR { (*Pager)(unsafe.Pointer(pPager)).FeLock = U8(EXCLUSIVE_LOCK + 1) } (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_OPEN) } if (*Pager)(unsafe.Pointer(pPager)).FerrCode != 0 { if int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) == 0 { pager_reset(tls, pPager) (*Pager)(unsafe.Pointer(pPager)).FchangeCountDone = U8(0) (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_OPEN) } else { (*Pager)(unsafe.Pointer(pPager)).FeState = func() uint8 { if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0) { return uint8(PAGER_OPEN) } return uint8(PAGER_READER) }() } if (*Pager)(unsafe.Pointer(pPager)).FbUseFetch != 0 { Xsqlite3OsUnfetch(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, int64(0), uintptr(0)) } (*Pager)(unsafe.Pointer(pPager)).FerrCode = SQLITE_OK setGetterMethod(tls, pPager) } (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) (*Pager)(unsafe.Pointer(pPager)).FjournalHdr = int64(0) (*Pager)(unsafe.Pointer(pPager)).FsetSuper = U8(0) } func pager_error(tls *libc.TLS, pPager uintptr, rc int32) int32 { var rc2 int32 = rc & 0xff if rc2 == SQLITE_FULL || rc2 == SQLITE_IOERR { (*Pager)(unsafe.Pointer(pPager)).FerrCode = rc (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_ERROR) setGetterMethod(tls, pPager) } return rc } func pagerFlushOnCommit(tls *libc.TLS, pPager uintptr, bCommit int32) int32 { if int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) == 0 { return 1 } if !(bCommit != 0) { return 0 } if !((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0)) { return 0 } return libc.Bool32(Xsqlite3PCachePercentDirty(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) >= 25) } func pager_end_transaction(tls *libc.TLS, pPager uintptr, hasSuper int32, bCommit int32) int32 { var rc int32 = SQLITE_OK var rc2 int32 = SQLITE_OK if int32((*Pager)(unsafe.Pointer(pPager)).FeState) < PAGER_WRITER_LOCKED && int32((*Pager)(unsafe.Pointer(pPager)).FeLock) < RESERVED_LOCK { return SQLITE_OK } releaseAllSavepoints(tls, pPager) if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0) { if Xsqlite3JournalIsInMemory(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) != 0 { Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) } else if int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_TRUNCATE { if (*Pager)(unsafe.Pointer(pPager)).FjournalOff == int64(0) { rc = SQLITE_OK } else { rc = Xsqlite3OsTruncate(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, int64(0)) if rc == SQLITE_OK && (*Pager)(unsafe.Pointer(pPager)).FfullSync != 0 { rc = Xsqlite3OsSync(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags)) } } (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) } else if int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_PERSIST || (*Pager)(unsafe.Pointer(pPager)).FexclusiveMode != 0 && int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) != PAGER_JOURNALMODE_WAL { rc = zeroJournalHdr(tls, pPager, libc.Bool32(hasSuper != 0 || (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0)) (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) } else { var bDelete int32 = libc.BoolInt32(!((*Pager)(unsafe.Pointer(pPager)).FtempFile != 0)) Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) if bDelete != 0 { rc = Xsqlite3OsDelete(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, int32((*Pager)(unsafe.Pointer(pPager)).FextraSync)) } } } Xsqlite3BitvecDestroy(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal) (*Pager)(unsafe.Pointer(pPager)).FpInJournal = uintptr(0) (*Pager)(unsafe.Pointer(pPager)).FnRec = 0 if rc == SQLITE_OK { if (*Pager)(unsafe.Pointer(pPager)).FmemDb != 0 || pagerFlushOnCommit(tls, pPager, bCommit) != 0 { Xsqlite3PcacheCleanAll(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) } else { Xsqlite3PcacheClearWritable(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) } Xsqlite3PcacheTruncate(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, (*Pager)(unsafe.Pointer(pPager)).FdbSize) } if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { rc2 = Xsqlite3WalEndWriteTransaction(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) } else if rc == SQLITE_OK && bCommit != 0 && (*Pager)(unsafe.Pointer(pPager)).FdbFileSize > (*Pager)(unsafe.Pointer(pPager)).FdbSize { rc = pager_truncate(tls, pPager, (*Pager)(unsafe.Pointer(pPager)).FdbSize) } if rc == SQLITE_OK && bCommit != 0 { rc = Xsqlite3OsFileControl(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, SQLITE_FCNTL_COMMIT_PHASETWO, uintptr(0)) if rc == SQLITE_NOTFOUND { rc = SQLITE_OK } } if !(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) && (!((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0)) || Xsqlite3WalExclusiveMode(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, 0) != 0) { rc2 = pagerUnlockDb(tls, pPager, SHARED_LOCK) } (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_READER) (*Pager)(unsafe.Pointer(pPager)).FsetSuper = U8(0) return func() int32 { if rc == SQLITE_OK { return rc2 } return rc }() } func pagerUnlockAndRollback(tls *libc.TLS, pPager uintptr) { if int32((*Pager)(unsafe.Pointer(pPager)).FeState) != PAGER_ERROR && int32((*Pager)(unsafe.Pointer(pPager)).FeState) != PAGER_OPEN { if int32((*Pager)(unsafe.Pointer(pPager)).FeState) >= PAGER_WRITER_LOCKED { Xsqlite3BeginBenignMalloc(tls) Xsqlite3PagerRollback(tls, pPager) Xsqlite3EndBenignMalloc(tls) } else if !(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) { pager_end_transaction(tls, pPager, 0, 0) } } pager_unlock(tls, pPager) } func pager_cksum(tls *libc.TLS, pPager uintptr, aData uintptr) U32 { var cksum U32 = (*Pager)(unsafe.Pointer(pPager)).FcksumInit var i int32 = int32((*Pager)(unsafe.Pointer(pPager)).FpageSize - int64(200)) for i > 0 { cksum = cksum + U32(*(*U8)(unsafe.Pointer(aData + uintptr(i)))) i = i - 200 } return cksum } func pager_playback_one_page(tls *libc.TLS, pPager uintptr, pOffset uintptr, pDone uintptr, isMainJrnl int32, isSavepnt int32) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 var aData uintptr var jfd uintptr var isSynced int32 aData = (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace if isMainJrnl != 0 { jfd = (*Pager)(unsafe.Pointer(pPager)).Fjfd } else { jfd = (*Pager)(unsafe.Pointer(pPager)).Fsjfd } rc = read32bits(tls, jfd, *(*I64)(unsafe.Pointer(pOffset)), bp) if rc != SQLITE_OK { return rc } rc = Xsqlite3OsRead(tls, jfd, aData, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), *(*I64)(unsafe.Pointer(pOffset))+int64(4)) if rc != SQLITE_OK { return rc } *(*I64)(unsafe.Pointer(pOffset)) += (*Pager)(unsafe.Pointer(pPager)).FpageSize + int64(4) + I64(isMainJrnl*4) if *(*Pgno)(unsafe.Pointer(bp)) == Pgno(0) || *(*Pgno)(unsafe.Pointer(bp)) == (*Pager)(unsafe.Pointer(pPager)).FlckPgno { return SQLITE_DONE } if *(*Pgno)(unsafe.Pointer(bp)) > (*Pager)(unsafe.Pointer(pPager)).FdbSize || Xsqlite3BitvecTest(tls, pDone, *(*Pgno)(unsafe.Pointer(bp))) != 0 { return SQLITE_OK } if isMainJrnl != 0 { rc = read32bits(tls, jfd, *(*I64)(unsafe.Pointer(pOffset))-int64(4), bp+4) if rc != 0 { return rc } if !(isSavepnt != 0) && pager_cksum(tls, pPager, aData) != *(*U32)(unsafe.Pointer(bp + 4)) { return SQLITE_DONE } } if pDone != 0 && libc.AssignInt32(&rc, Xsqlite3BitvecSet(tls, pDone, *(*Pgno)(unsafe.Pointer(bp)))) != SQLITE_OK { return rc } if *(*Pgno)(unsafe.Pointer(bp)) == Pgno(1) && int32((*Pager)(unsafe.Pointer(pPager)).FnReserve) != int32(*(*U8)(unsafe.Pointer(aData + 20))) { (*Pager)(unsafe.Pointer(pPager)).FnReserve = I16(*(*U8)(unsafe.Pointer(aData + 20))) } if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) } else { *(*uintptr)(unsafe.Pointer(bp + 8)) = Xsqlite3PagerLookup(tls, pPager, *(*Pgno)(unsafe.Pointer(bp))) } if isMainJrnl != 0 { isSynced = libc.Bool32((*Pager)(unsafe.Pointer(pPager)).FnoSync != 0 || *(*I64)(unsafe.Pointer(pOffset)) <= (*Pager)(unsafe.Pointer(pPager)).FjournalHdr) } else { isSynced = libc.Bool32(*(*uintptr)(unsafe.Pointer(bp + 8)) == uintptr(0) || 0 == int32((*PgHdr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).Fflags)&PGHDR_NEED_SYNC) } if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0) && (int32((*Pager)(unsafe.Pointer(pPager)).FeState) >= PAGER_WRITER_DBMOD || int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_OPEN) && isSynced != 0 { var ofst I64 = I64(*(*Pgno)(unsafe.Pointer(bp))-Pgno(1)) * (*Pager)(unsafe.Pointer(pPager)).FpageSize rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, aData, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), ofst) if *(*Pgno)(unsafe.Pointer(bp)) > (*Pager)(unsafe.Pointer(pPager)).FdbFileSize { (*Pager)(unsafe.Pointer(pPager)).FdbFileSize = *(*Pgno)(unsafe.Pointer(bp)) } if (*Pager)(unsafe.Pointer(pPager)).FpBackup != 0 { Xsqlite3BackupUpdate(tls, (*Pager)(unsafe.Pointer(pPager)).FpBackup, *(*Pgno)(unsafe.Pointer(bp)), aData) } } else if !(isMainJrnl != 0) && *(*uintptr)(unsafe.Pointer(bp + 8)) == uintptr(0) { *(*U8)(unsafe.Pointer(pPager + 25)) |= U8(SPILLFLAG_ROLLBACK) rc = Xsqlite3PagerGet(tls, pPager, *(*Pgno)(unsafe.Pointer(bp)), bp+8, 1) *(*U8)(unsafe.Pointer(pPager + 25)) &= libc.Uint8FromInt32(libc.CplInt32(SPILLFLAG_ROLLBACK)) if rc != SQLITE_OK { return rc } Xsqlite3PcacheMakeDirty(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } if *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { var pData uintptr pData = (*PgHdr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpData libc.Xmemcpy(tls, pData, aData, uint64((*Pager)(unsafe.Pointer(pPager)).FpageSize)) (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Pager)(unsafe.Pointer(pPager)).FxReiniter})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) if *(*Pgno)(unsafe.Pointer(bp)) == Pgno(1) { libc.Xmemcpy(tls, pPager+136, pData+24, uint64(unsafe.Sizeof([16]int8{}))) } Xsqlite3PcacheRelease(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } return rc } func pager_delsuper(tls *libc.TLS, pPager uintptr, zSuper uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var pVfs uintptr var rc int32 var pSuper uintptr var pJournal uintptr var zSuperJournal uintptr var zJournal uintptr var zSuperPtr uintptr var zFree uintptr var nSuperPtr int32 var flags int32 var c int32 var flags1 int32 pVfs = (*Pager)(unsafe.Pointer(pPager)).FpVfs zSuperJournal = uintptr(0) zFree = uintptr(0) pSuper = Xsqlite3MallocZero(tls, uint64((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile*2)) if !!(pSuper != 0) { goto __1 } rc = SQLITE_NOMEM pJournal = uintptr(0) goto __2 __1: flags = SQLITE_OPEN_READONLY | SQLITE_OPEN_SUPER_JOURNAL rc = Xsqlite3OsOpen(tls, pVfs, zSuper, pSuper, flags, uintptr(0)) pJournal = pSuper + uintptr((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile) __2: ; if !(rc != SQLITE_OK) { goto __3 } goto delsuper_out __3: ; rc = Xsqlite3OsFileSize(tls, pSuper, bp) if !(rc != SQLITE_OK) { goto __4 } goto delsuper_out __4: ; nSuperPtr = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname + 1 zFree = Xsqlite3Malloc(tls, uint64(int64(4)+*(*I64)(unsafe.Pointer(bp))+I64(nSuperPtr)+int64(2))) if !!(zFree != 0) { goto __5 } rc = SQLITE_NOMEM goto delsuper_out __5: ; *(*int8)(unsafe.Pointer(zFree)) = libc.AssignPtrInt8(zFree+1, libc.AssignPtrInt8(zFree+2, libc.AssignPtrInt8(zFree+3, int8(0)))) zSuperJournal = zFree + 4 zSuperPtr = zSuperJournal + uintptr(*(*I64)(unsafe.Pointer(bp))+int64(2)) rc = Xsqlite3OsRead(tls, pSuper, zSuperJournal, int32(*(*I64)(unsafe.Pointer(bp))), int64(0)) if !(rc != SQLITE_OK) { goto __6 } goto delsuper_out __6: ; *(*int8)(unsafe.Pointer(zSuperJournal + uintptr(*(*I64)(unsafe.Pointer(bp))))) = int8(0) *(*int8)(unsafe.Pointer(zSuperJournal + uintptr(*(*I64)(unsafe.Pointer(bp))+int64(1)))) = int8(0) zJournal = zSuperJournal __7: if !((int64(zJournal)-int64(zSuperJournal))/1 < *(*I64)(unsafe.Pointer(bp))) { goto __8 } rc = Xsqlite3OsAccess(tls, pVfs, zJournal, SQLITE_ACCESS_EXISTS, bp+8) if !(rc != SQLITE_OK) { goto __9 } goto delsuper_out __9: ; if !(*(*int32)(unsafe.Pointer(bp + 8)) != 0) { goto __10 } flags1 = SQLITE_OPEN_READONLY | SQLITE_OPEN_SUPER_JOURNAL rc = Xsqlite3OsOpen(tls, pVfs, zJournal, pJournal, flags1, uintptr(0)) if !(rc != SQLITE_OK) { goto __11 } goto delsuper_out __11: ; rc = readSuperJournal(tls, pJournal, zSuperPtr, uint32(nSuperPtr)) Xsqlite3OsClose(tls, pJournal) if !(rc != SQLITE_OK) { goto __12 } goto delsuper_out __12: ; c = libc.Bool32(int32(*(*int8)(unsafe.Pointer(zSuperPtr))) != 0 && libc.Xstrcmp(tls, zSuperPtr, zSuper) == 0) if !(c != 0) { goto __13 } goto delsuper_out __13: ; __10: ; zJournal += uintptr(Xsqlite3Strlen30(tls, zJournal) + 1) goto __7 __8: ; Xsqlite3OsClose(tls, pSuper) rc = Xsqlite3OsDelete(tls, pVfs, zSuper, 0) delsuper_out: Xsqlite3_free(tls, zFree) if !(pSuper != 0) { goto __14 } Xsqlite3OsClose(tls, pSuper) Xsqlite3_free(tls, pSuper) __14: ; return rc } func pager_truncate(tls *libc.TLS, pPager uintptr, nPage Pgno) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 = SQLITE_OK if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0) && (int32((*Pager)(unsafe.Pointer(pPager)).FeState) >= PAGER_WRITER_DBMOD || int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_OPEN) { var szPage int32 = int32((*Pager)(unsafe.Pointer(pPager)).FpageSize) rc = Xsqlite3OsFileSize(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, bp) *(*I64)(unsafe.Pointer(bp + 8)) = I64(szPage) * I64(nPage) if rc == SQLITE_OK && *(*I64)(unsafe.Pointer(bp)) != *(*I64)(unsafe.Pointer(bp + 8)) { if *(*I64)(unsafe.Pointer(bp)) > *(*I64)(unsafe.Pointer(bp + 8)) { rc = Xsqlite3OsTruncate(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, *(*I64)(unsafe.Pointer(bp + 8))) } else if *(*I64)(unsafe.Pointer(bp))+I64(szPage) <= *(*I64)(unsafe.Pointer(bp + 8)) { var pTmp uintptr = (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace libc.Xmemset(tls, pTmp, 0, uint64(szPage)) Xsqlite3OsFileControlHint(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, SQLITE_FCNTL_SIZE_HINT, bp+8) rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, pTmp, szPage, *(*I64)(unsafe.Pointer(bp + 8))-I64(szPage)) } if rc == SQLITE_OK { (*Pager)(unsafe.Pointer(pPager)).FdbFileSize = nPage } } } return rc } // Return a sanitized version of the sector-size of OS file pFile. The // return value is guaranteed to lie between 32 and MAX_SECTOR_SIZE. func Xsqlite3SectorSize(tls *libc.TLS, pFile uintptr) int32 { var iRet int32 = Xsqlite3OsSectorSize(tls, pFile) if iRet < 32 { iRet = 512 } else if iRet > MAX_SECTOR_SIZE { iRet = MAX_SECTOR_SIZE } return iRet } func setSectorSize(tls *libc.TLS, pPager uintptr) { if (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 || Xsqlite3OsDeviceCharacteristics(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd)&SQLITE_IOCAP_POWERSAFE_OVERWRITE != 0 { (*Pager)(unsafe.Pointer(pPager)).FsectorSize = U32(512) } else { (*Pager)(unsafe.Pointer(pPager)).FsectorSize = U32(Xsqlite3SectorSize(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd)) } } func pager_playback(tls *libc.TLS, pPager uintptr, isHot int32) int32 { bp := tls.Alloc(40) defer tls.Free(40) var pVfs uintptr var u U32 var rc int32 var zSuper uintptr var needPagerReset int32 var nPlayback int32 pVfs = (*Pager)(unsafe.Pointer(pPager)).FpVfs *(*Pgno)(unsafe.Pointer(bp + 32)) = Pgno(0) *(*int32)(unsafe.Pointer(bp + 24)) = 1 zSuper = uintptr(0) nPlayback = 0 *(*U32)(unsafe.Pointer(bp + 36)) = U32((*Pager)(unsafe.Pointer(pPager)).FpageSize) rc = Xsqlite3OsFileSize(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, bp+16) if !(rc != SQLITE_OK) { goto __1 } goto end_playback __1: ; zSuper = (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace rc = readSuperJournal(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, zSuper, uint32((*Sqlite3_vfs)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).FpVfs)).FmxPathname+1)) if !(rc == SQLITE_OK && *(*int8)(unsafe.Pointer(zSuper)) != 0) { goto __2 } rc = Xsqlite3OsAccess(tls, pVfs, zSuper, SQLITE_ACCESS_EXISTS, bp+24) __2: ; zSuper = uintptr(0) if !(rc != SQLITE_OK || !(*(*int32)(unsafe.Pointer(bp + 24)) != 0)) { goto __3 } goto end_playback __3: ; (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) needPagerReset = isHot __4: if !(1 != 0) { goto __5 } rc = readJournalHdr(tls, pPager, isHot, *(*I64)(unsafe.Pointer(bp + 16)), bp+28, bp+32) if !(rc != SQLITE_OK) { goto __6 } if !(rc == SQLITE_DONE) { goto __7 } rc = SQLITE_OK __7: ; goto end_playback __6: ; if !(*(*U32)(unsafe.Pointer(bp + 28)) == 0xffffffff) { goto __8 } *(*U32)(unsafe.Pointer(bp + 28)) = U32(int32((*(*I64)(unsafe.Pointer(bp + 16)) - I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize)) / ((*Pager)(unsafe.Pointer(pPager)).FpageSize + int64(8)))) __8: ; if !(*(*U32)(unsafe.Pointer(bp + 28)) == U32(0) && !(isHot != 0) && (*Pager)(unsafe.Pointer(pPager)).FjournalHdr+I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) == (*Pager)(unsafe.Pointer(pPager)).FjournalOff) { goto __9 } *(*U32)(unsafe.Pointer(bp + 28)) = U32(int32((*(*I64)(unsafe.Pointer(bp + 16)) - (*Pager)(unsafe.Pointer(pPager)).FjournalOff) / ((*Pager)(unsafe.Pointer(pPager)).FpageSize + int64(8)))) __9: ; if !((*Pager)(unsafe.Pointer(pPager)).FjournalOff == I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize)) { goto __10 } rc = pager_truncate(tls, pPager, *(*Pgno)(unsafe.Pointer(bp + 32))) if !(rc != SQLITE_OK) { goto __11 } goto end_playback __11: ; (*Pager)(unsafe.Pointer(pPager)).FdbSize = *(*Pgno)(unsafe.Pointer(bp + 32)) if !((*Pager)(unsafe.Pointer(pPager)).FmxPgno < *(*Pgno)(unsafe.Pointer(bp + 32))) { goto __12 } (*Pager)(unsafe.Pointer(pPager)).FmxPgno = *(*Pgno)(unsafe.Pointer(bp + 32)) __12: ; __10: ; u = U32(0) __13: if !(u < *(*U32)(unsafe.Pointer(bp + 28))) { goto __15 } if !(needPagerReset != 0) { goto __16 } pager_reset(tls, pPager) needPagerReset = 0 __16: ; rc = pager_playback_one_page(tls, pPager, pPager+96, uintptr(0), 1, 0) if !(rc == SQLITE_OK) { goto __17 } nPlayback++ goto __18 __17: if !(rc == SQLITE_DONE) { goto __19 } (*Pager)(unsafe.Pointer(pPager)).FjournalOff = *(*I64)(unsafe.Pointer(bp + 16)) goto __15 goto __20 __19: if !(rc == SQLITE_IOERR|int32(2)<<8) { goto __21 } rc = SQLITE_OK goto end_playback goto __22 __21: goto end_playback __22: ; __20: ; __18: ; goto __14 __14: u++ goto __13 goto __15 __15: ; goto __4 __5: ; end_playback: if !(rc == SQLITE_OK) { goto __23 } rc = Xsqlite3PagerSetPagesize(tls, pPager, bp+36, -1) __23: ; (*Pager)(unsafe.Pointer(pPager)).FchangeCountDone = (*Pager)(unsafe.Pointer(pPager)).FtempFile if !(rc == SQLITE_OK) { goto __24 } zSuper = (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace + 4 rc = readSuperJournal(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, zSuper, uint32((*Sqlite3_vfs)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).FpVfs)).FmxPathname+1)) __24: ; if !(rc == SQLITE_OK && (int32((*Pager)(unsafe.Pointer(pPager)).FeState) >= PAGER_WRITER_DBMOD || int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_OPEN)) { goto __25 } rc = Xsqlite3PagerSync(tls, pPager, uintptr(0)) __25: ; if !(rc == SQLITE_OK) { goto __26 } rc = pager_end_transaction(tls, pPager, libc.Bool32(int32(*(*int8)(unsafe.Pointer(zSuper))) != 0), 0) __26: ; if !(rc == SQLITE_OK && *(*int8)(unsafe.Pointer(zSuper)) != 0 && *(*int32)(unsafe.Pointer(bp + 24)) != 0) { goto __27 } libc.Xmemset(tls, (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace, 0, uint64(4)) rc = pager_delsuper(tls, pPager, zSuper) __27: ; if !(isHot != 0 && nPlayback != 0) { goto __28 } Xsqlite3_log(tls, SQLITE_NOTICE|int32(2)<<8, ts+5246, libc.VaList(bp, nPlayback, (*Pager)(unsafe.Pointer(pPager)).FzJournal)) __28: ; setSectorSize(tls, pPager) return rc } func readDbPage(tls *libc.TLS, pPg uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager var rc int32 = SQLITE_OK *(*U32)(unsafe.Pointer(bp)) = U32(0) if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { rc = Xsqlite3WalFindFrame(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, (*PgHdr)(unsafe.Pointer(pPg)).Fpgno, bp) if rc != 0 { return rc } } if *(*U32)(unsafe.Pointer(bp)) != 0 { rc = Xsqlite3WalReadFrame(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, *(*U32)(unsafe.Pointer(bp)), int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), (*PgHdr)(unsafe.Pointer(pPg)).FpData) } else { var iOffset I64 = I64((*PgHdr)(unsafe.Pointer(pPg)).Fpgno-Pgno(1)) * (*Pager)(unsafe.Pointer(pPager)).FpageSize rc = Xsqlite3OsRead(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, (*PgHdr)(unsafe.Pointer(pPg)).FpData, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), iOffset) if rc == SQLITE_IOERR|int32(2)<<8 { rc = SQLITE_OK } } if (*PgHdr)(unsafe.Pointer(pPg)).Fpgno == Pgno(1) { if rc != 0 { libc.Xmemset(tls, pPager+136, 0xff, uint64(unsafe.Sizeof([16]int8{}))) } else { var dbFileVers uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpData + 24 libc.Xmemcpy(tls, pPager+136, dbFileVers, uint64(unsafe.Sizeof([16]int8{}))) } } return rc } func pager_write_changecounter(tls *libc.TLS, pPg uintptr) { var change_counter U32 if pPg == uintptr(0) { return } change_counter = Xsqlite3Get4byte(tls, (*PgHdr)(unsafe.Pointer(pPg)).FpPager+136) + U32(1) Xsqlite3Put4byte(tls, (*PgHdr)(unsafe.Pointer(pPg)).FpData+uintptr(24), change_counter) Xsqlite3Put4byte(tls, (*PgHdr)(unsafe.Pointer(pPg)).FpData+uintptr(92), change_counter) Xsqlite3Put4byte(tls, (*PgHdr)(unsafe.Pointer(pPg)).FpData+uintptr(96), uint32(SQLITE_VERSION_NUMBER)) } func pagerUndoCallback(tls *libc.TLS, pCtx uintptr, iPg Pgno) int32 { var rc int32 = SQLITE_OK var pPager uintptr = pCtx var pPg uintptr pPg = Xsqlite3PagerLookup(tls, pPager, iPg) if pPg != 0 { if Xsqlite3PcachePageRefcount(tls, pPg) == int64(1) { Xsqlite3PcacheDrop(tls, pPg) } else { rc = readDbPage(tls, pPg) if rc == SQLITE_OK { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Pager)(unsafe.Pointer(pPager)).FxReiniter})).f(tls, pPg) } Xsqlite3PagerUnrefNotNull(tls, pPg) } } Xsqlite3BackupRestart(tls, (*Pager)(unsafe.Pointer(pPager)).FpBackup) return rc } func pagerRollbackWal(tls *libc.TLS, pPager uintptr) int32 { var rc int32 var pList uintptr (*Pager)(unsafe.Pointer(pPager)).FdbSize = (*Pager)(unsafe.Pointer(pPager)).FdbOrigSize rc = Xsqlite3WalUndo(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, Pgno) int32 }{pagerUndoCallback})), pPager) pList = Xsqlite3PcacheDirtyList(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) for pList != 0 && rc == SQLITE_OK { var pNext uintptr = (*PgHdr)(unsafe.Pointer(pList)).FpDirty rc = pagerUndoCallback(tls, pPager, (*PgHdr)(unsafe.Pointer(pList)).Fpgno) pList = pNext } return rc } func pagerWalFrames(tls *libc.TLS, pPager uintptr, pList uintptr, nTruncate Pgno, isCommit int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = pList var rc int32 var nList int32 var p uintptr if isCommit != 0 { var ppNext uintptr = bp nList = 0 for p = *(*uintptr)(unsafe.Pointer(bp)); libc.AssignPtrUintptr(ppNext, p) != uintptr(0); p = (*PgHdr)(unsafe.Pointer(p)).FpDirty { if (*PgHdr)(unsafe.Pointer(p)).Fpgno <= nTruncate { ppNext = p + 32 nList++ } } } else { nList = 1 } *(*int32)(unsafe.Pointer(pPager + 248 + 2*4)) += nList if (*PgHdr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fpgno == Pgno(1) { pager_write_changecounter(tls, *(*uintptr)(unsafe.Pointer(bp))) } rc = Xsqlite3WalFrames(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), *(*uintptr)(unsafe.Pointer(bp)), nTruncate, isCommit, int32((*Pager)(unsafe.Pointer(pPager)).FwalSyncFlags)) if rc == SQLITE_OK && (*Pager)(unsafe.Pointer(pPager)).FpBackup != 0 { for p = *(*uintptr)(unsafe.Pointer(bp)); p != 0; p = (*PgHdr)(unsafe.Pointer(p)).FpDirty { Xsqlite3BackupUpdate(tls, (*Pager)(unsafe.Pointer(pPager)).FpBackup, (*PgHdr)(unsafe.Pointer(p)).Fpgno, (*PgHdr)(unsafe.Pointer(p)).FpData) } } return rc } func pagerBeginReadTransaction(tls *libc.TLS, pPager uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 *(*int32)(unsafe.Pointer(bp)) = 0 Xsqlite3WalEndReadTransaction(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) rc = Xsqlite3WalBeginReadTransaction(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, bp) if rc != SQLITE_OK || *(*int32)(unsafe.Pointer(bp)) != 0 { pager_reset(tls, pPager) if (*Pager)(unsafe.Pointer(pPager)).FbUseFetch != 0 { Xsqlite3OsUnfetch(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, int64(0), uintptr(0)) } } return rc } func pagerPagecount(tls *libc.TLS, pPager uintptr, pnPage uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var nPage Pgno nPage = Xsqlite3WalDbsize(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) if nPage == Pgno(0) && (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0) { *(*I64)(unsafe.Pointer(bp)) = int64(0) var rc int32 = Xsqlite3OsFileSize(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, bp) if rc != SQLITE_OK { return rc } nPage = Pgno((*(*I64)(unsafe.Pointer(bp)) + (*Pager)(unsafe.Pointer(pPager)).FpageSize - int64(1)) / (*Pager)(unsafe.Pointer(pPager)).FpageSize) } if nPage > (*Pager)(unsafe.Pointer(pPager)).FmxPgno { (*Pager)(unsafe.Pointer(pPager)).FmxPgno = nPage } *(*Pgno)(unsafe.Pointer(pnPage)) = nPage return SQLITE_OK } func pagerOpenWalIfPresent(tls *libc.TLS, pPager uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK if !(int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) != 0) { rc = Xsqlite3OsAccess(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, (*Pager)(unsafe.Pointer(pPager)).FzWal, SQLITE_ACCESS_EXISTS, bp) if rc == SQLITE_OK { if *(*int32)(unsafe.Pointer(bp)) != 0 { rc = pagerPagecount(tls, pPager, bp+4) if rc != 0 { return rc } if *(*Pgno)(unsafe.Pointer(bp + 4)) == Pgno(0) { rc = Xsqlite3OsDelete(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, (*Pager)(unsafe.Pointer(pPager)).FzWal, 0) } else { rc = Xsqlite3PagerOpenWal(tls, pPager, uintptr(0)) } } else if int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_WAL { (*Pager)(unsafe.Pointer(pPager)).FjournalMode = U8(PAGER_JOURNALMODE_DELETE) } } } return rc } func pagerPlaybackSavepoint(tls *libc.TLS, pPager uintptr, pSavepoint uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var szJ I64 var iHdrOff I64 var rc int32 = SQLITE_OK var pDone uintptr = uintptr(0) if pSavepoint != 0 { pDone = Xsqlite3BitvecCreate(tls, (*PagerSavepoint)(unsafe.Pointer(pSavepoint)).FnOrig) if !(pDone != 0) { return SQLITE_NOMEM } } (*Pager)(unsafe.Pointer(pPager)).FdbSize = func() uint32 { if pSavepoint != 0 { return (*PagerSavepoint)(unsafe.Pointer(pSavepoint)).FnOrig } return (*Pager)(unsafe.Pointer(pPager)).FdbOrigSize }() (*Pager)(unsafe.Pointer(pPager)).FchangeCountDone = (*Pager)(unsafe.Pointer(pPager)).FtempFile if !(pSavepoint != 0) && (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { return pagerRollbackWal(tls, pPager) } szJ = (*Pager)(unsafe.Pointer(pPager)).FjournalOff if pSavepoint != 0 && !((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0)) { if (*PagerSavepoint)(unsafe.Pointer(pSavepoint)).FiHdrOffset != 0 { iHdrOff = (*PagerSavepoint)(unsafe.Pointer(pSavepoint)).FiHdrOffset } else { iHdrOff = szJ } (*Pager)(unsafe.Pointer(pPager)).FjournalOff = (*PagerSavepoint)(unsafe.Pointer(pSavepoint)).FiOffset for rc == SQLITE_OK && (*Pager)(unsafe.Pointer(pPager)).FjournalOff < iHdrOff { rc = pager_playback_one_page(tls, pPager, pPager+96, pDone, 1, 1) } } else { (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) } for rc == SQLITE_OK && (*Pager)(unsafe.Pointer(pPager)).FjournalOff < szJ { var ii U32 *(*U32)(unsafe.Pointer(bp)) = U32(0) rc = readJournalHdr(tls, pPager, 0, szJ, bp, bp+4) if *(*U32)(unsafe.Pointer(bp)) == U32(0) && (*Pager)(unsafe.Pointer(pPager)).FjournalHdr+I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) == (*Pager)(unsafe.Pointer(pPager)).FjournalOff { *(*U32)(unsafe.Pointer(bp)) = U32((szJ - (*Pager)(unsafe.Pointer(pPager)).FjournalOff) / ((*Pager)(unsafe.Pointer(pPager)).FpageSize + int64(8))) } for ii = U32(0); rc == SQLITE_OK && ii < *(*U32)(unsafe.Pointer(bp)) && (*Pager)(unsafe.Pointer(pPager)).FjournalOff < szJ; ii++ { rc = pager_playback_one_page(tls, pPager, pPager+96, pDone, 1, 1) } } if pSavepoint != 0 { var ii U32 *(*I64)(unsafe.Pointer(bp + 8)) = I64((*PagerSavepoint)(unsafe.Pointer(pSavepoint)).FiSubRec) * (int64(4) + (*Pager)(unsafe.Pointer(pPager)).FpageSize) if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { rc = Xsqlite3WalSavepointUndo(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, pSavepoint+36) } for ii = (*PagerSavepoint)(unsafe.Pointer(pSavepoint)).FiSubRec; rc == SQLITE_OK && ii < (*Pager)(unsafe.Pointer(pPager)).FnSubRec; ii++ { rc = pager_playback_one_page(tls, pPager, bp+8, pDone, 0, 1) } } Xsqlite3BitvecDestroy(tls, pDone) if rc == SQLITE_OK { (*Pager)(unsafe.Pointer(pPager)).FjournalOff = szJ } return rc } // Change the maximum number of in-memory pages that are allowed // before attempting to recycle clean and unused pages. func Xsqlite3PagerSetCachesize(tls *libc.TLS, pPager uintptr, mxPage int32) { Xsqlite3PcacheSetCachesize(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, mxPage) } // Change the maximum number of in-memory pages that are allowed // before attempting to spill pages to journal. func Xsqlite3PagerSetSpillsize(tls *libc.TLS, pPager uintptr, mxPage int32) int32 { return Xsqlite3PcacheSetSpillsize(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, mxPage) } func pagerFixMaplimit(tls *libc.TLS, pPager uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var fd uintptr = (*Pager)(unsafe.Pointer(pPager)).Ffd if (*Sqlite3_file)(unsafe.Pointer(fd)).FpMethods != uintptr(0) && (*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(fd)).FpMethods)).FiVersion >= 3 { *(*Sqlite3_int64)(unsafe.Pointer(bp)) = (*Pager)(unsafe.Pointer(pPager)).FszMmap (*Pager)(unsafe.Pointer(pPager)).FbUseFetch = U8(libc.Bool32(*(*Sqlite3_int64)(unsafe.Pointer(bp)) > int64(0))) setGetterMethod(tls, pPager) Xsqlite3OsFileControlHint(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, SQLITE_FCNTL_MMAP_SIZE, bp) } } // Change the maximum size of any memory mapping made of the database file. func Xsqlite3PagerSetMmapLimit(tls *libc.TLS, pPager uintptr, szMmap Sqlite3_int64) { (*Pager)(unsafe.Pointer(pPager)).FszMmap = szMmap pagerFixMaplimit(tls, pPager) } // Free as much memory as possible from the pager. func Xsqlite3PagerShrink(tls *libc.TLS, pPager uintptr) { Xsqlite3PcacheShrink(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) } // Adjust settings of the pager to those specified in the pgFlags parameter. // // The "level" in pgFlags & PAGER_SYNCHRONOUS_MASK sets the robustness // of the database to damage due to OS crashes or power failures by // changing the number of syncs()s when writing the journals. // There are four levels: // // OFF sqlite3OsSync() is never called. This is the default // for temporary and transient files. // // NORMAL The journal is synced once before writes begin on the // database. This is normally adequate protection, but // it is theoretically possible, though very unlikely, // that an inopertune power failure could leave the journal // in a state which would cause damage to the database // when it is rolled back. // // FULL The journal is synced twice before writes begin on the // database (with some additional information - the nRec field // of the journal header - being written in between the two // syncs). If we assume that writing a // single disk sector is atomic, then this mode provides // assurance that the journal will not be corrupted to the // point of causing damage to the database during rollback. // // EXTRA This is like FULL except that is also syncs the directory // that contains the rollback journal after the rollback // journal is unlinked. // // The above is for a rollback-journal mode. For WAL mode, OFF continues // to mean that no syncs ever occur. NORMAL means that the WAL is synced // prior to the start of checkpoint and that the database file is synced // at the conclusion of the checkpoint if the entire content of the WAL // was written back into the database. But no sync operations occur for // an ordinary commit in NORMAL mode with WAL. FULL means that the WAL // file is synced following each commit operation, in addition to the // syncs associated with NORMAL. There is no difference between FULL // and EXTRA for WAL mode. // // Do not confuse synchronous=FULL with SQLITE_SYNC_FULL. The // SQLITE_SYNC_FULL macro means to use the MacOSX-style full-fsync // using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an // ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL // and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the // synchronous=FULL versus synchronous=NORMAL setting determines when // the xSync primitive is called and is relevant to all platforms. // // Numeric values associated with these states are OFF==1, NORMAL=2, // and FULL=3. func Xsqlite3PagerSetFlags(tls *libc.TLS, pPager uintptr, pgFlags uint32) { var level uint32 = pgFlags & uint32(PAGER_SYNCHRONOUS_MASK) if (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 { (*Pager)(unsafe.Pointer(pPager)).FnoSync = U8(1) (*Pager)(unsafe.Pointer(pPager)).FfullSync = U8(0) (*Pager)(unsafe.Pointer(pPager)).FextraSync = U8(0) } else { (*Pager)(unsafe.Pointer(pPager)).FnoSync = func() uint8 { if level == uint32(PAGER_SYNCHRONOUS_OFF) { return uint8(1) } return uint8(0) }() (*Pager)(unsafe.Pointer(pPager)).FfullSync = func() uint8 { if level >= uint32(PAGER_SYNCHRONOUS_FULL) { return uint8(1) } return uint8(0) }() (*Pager)(unsafe.Pointer(pPager)).FextraSync = func() uint8 { if level == uint32(PAGER_SYNCHRONOUS_EXTRA) { return uint8(1) } return uint8(0) }() } if (*Pager)(unsafe.Pointer(pPager)).FnoSync != 0 { (*Pager)(unsafe.Pointer(pPager)).FsyncFlags = U8(0) } else if pgFlags&uint32(PAGER_FULLFSYNC) != 0 { (*Pager)(unsafe.Pointer(pPager)).FsyncFlags = U8(SQLITE_SYNC_FULL) } else { (*Pager)(unsafe.Pointer(pPager)).FsyncFlags = U8(SQLITE_SYNC_NORMAL) } (*Pager)(unsafe.Pointer(pPager)).FwalSyncFlags = U8(int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags) << 2) if (*Pager)(unsafe.Pointer(pPager)).FfullSync != 0 { *(*U8)(unsafe.Pointer(pPager + 15)) |= U8(int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags)) } if pgFlags&uint32(PAGER_CKPT_FULLFSYNC) != 0 && !(int32((*Pager)(unsafe.Pointer(pPager)).FnoSync) != 0) { *(*U8)(unsafe.Pointer(pPager + 15)) |= U8(int32(SQLITE_SYNC_FULL) << 2) } if pgFlags&uint32(PAGER_CACHESPILL) != 0 { *(*U8)(unsafe.Pointer(pPager + 25)) &= libc.Uint8FromInt32(libc.CplInt32(SPILLFLAG_OFF)) } else { *(*U8)(unsafe.Pointer(pPager + 25)) |= U8(SPILLFLAG_OFF) } } func pagerOpentemp(tls *libc.TLS, pPager uintptr, pFile uintptr, vfsFlags int32) int32 { var rc int32 vfsFlags = vfsFlags | (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE) rc = Xsqlite3OsOpen(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, uintptr(0), pFile, vfsFlags, uintptr(0)) return rc } // Set the busy handler function. // // The pager invokes the busy-handler if sqlite3OsLock() returns // SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock, // or when trying to upgrade from a RESERVED lock to an EXCLUSIVE // lock. It does *not* invoke the busy handler when upgrading from // SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE // (which occurs during hot-journal rollback). Summary: // // Transition | Invokes xBusyHandler // -------------------------------------------------------- // NO_LOCK -> SHARED_LOCK | Yes // SHARED_LOCK -> RESERVED_LOCK | No // SHARED_LOCK -> EXCLUSIVE_LOCK | No // RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes // // If the busy-handler callback returns non-zero, the lock is // retried. If it returns zero, then the SQLITE_BUSY error is // returned to the caller of the pager API function. func Xsqlite3PagerSetBusyHandler(tls *libc.TLS, pPager uintptr, xBusyHandler uintptr, pBusyHandlerArg uintptr) { var ap uintptr (*Pager)(unsafe.Pointer(pPager)).FxBusyHandler = xBusyHandler (*Pager)(unsafe.Pointer(pPager)).FpBusyHandlerArg = pBusyHandlerArg ap = pPager + 232 Xsqlite3OsFileControlHint(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, SQLITE_FCNTL_BUSYHANDLER, ap) } // Change the page size used by the Pager object. The new page size // is passed in *pPageSize. // // If the pager is in the error state when this function is called, it // is a no-op. The value returned is the error state error code (i.e. // one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL). // // Otherwise, if all of the following are true: // // - the new page size (value of *pPageSize) is valid (a power // of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and // // - there are no outstanding page references, and // // - the database is either not an in-memory database or it is // an in-memory database that currently consists of zero pages. // // then the pager object page size is set to *pPageSize. // // If the page size is changed, then this function uses sqlite3PagerMalloc() // to obtain a new Pager.pTmpSpace buffer. If this allocation attempt // fails, SQLITE_NOMEM is returned and the page size remains unchanged. // In all other cases, SQLITE_OK is returned. // // If the page size is not changed, either because one of the enumerated // conditions above is not true, the pager was in error state when this // function was called, or because the memory allocation attempt failed, // then *pPageSize is set to the old, retained page size before returning. func Xsqlite3PagerSetPagesize(tls *libc.TLS, pPager uintptr, pPageSize uintptr, nReserve int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var pageSize U32 = *(*U32)(unsafe.Pointer(pPageSize)) if (int32((*Pager)(unsafe.Pointer(pPager)).FmemDb) == 0 || (*Pager)(unsafe.Pointer(pPager)).FdbSize == Pgno(0)) && Xsqlite3PcacheRefCount(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) == int64(0) && pageSize != 0 && pageSize != U32((*Pager)(unsafe.Pointer(pPager)).FpageSize) { var pNew uintptr = uintptr(0) *(*I64)(unsafe.Pointer(bp)) = int64(0) if int32((*Pager)(unsafe.Pointer(pPager)).FeState) > PAGER_OPEN && (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0) { rc = Xsqlite3OsFileSize(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, bp) } if rc == SQLITE_OK { pNew = Xsqlite3PageMalloc(tls, int32(pageSize+U32(8))) if !(pNew != 0) { rc = SQLITE_NOMEM } else { libc.Xmemset(tls, pNew+uintptr(pageSize), 0, uint64(8)) } } if rc == SQLITE_OK { pager_reset(tls, pPager) rc = Xsqlite3PcacheSetPageSize(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, int32(pageSize)) } if rc == SQLITE_OK { Xsqlite3PageFree(tls, (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace) (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace = pNew (*Pager)(unsafe.Pointer(pPager)).FdbSize = Pgno((*(*I64)(unsafe.Pointer(bp)) + I64(pageSize) - int64(1)) / I64(pageSize)) (*Pager)(unsafe.Pointer(pPager)).FpageSize = I64(pageSize) (*Pager)(unsafe.Pointer(pPager)).FlckPgno = U32(Xsqlite3PendingByte)/pageSize + Pgno(1) } else { Xsqlite3PageFree(tls, pNew) } } *(*U32)(unsafe.Pointer(pPageSize)) = U32((*Pager)(unsafe.Pointer(pPager)).FpageSize) if rc == SQLITE_OK { if nReserve < 0 { nReserve = int32((*Pager)(unsafe.Pointer(pPager)).FnReserve) } (*Pager)(unsafe.Pointer(pPager)).FnReserve = I16(nReserve) pagerFixMaplimit(tls, pPager) } return rc } // Return a pointer to the "temporary page" buffer held internally // by the pager. This is a buffer that is big enough to hold the // entire content of a database page. This buffer is used internally // during rollback and will be overwritten whenever a rollback // occurs. But other modules are free to use it too, as long as // no rollbacks are happening. func Xsqlite3PagerTempSpace(tls *libc.TLS, pPager uintptr) uintptr { return (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace } // Attempt to set the maximum database page count if mxPage is positive. // Make no changes if mxPage is zero or negative. And never reduce the // maximum page count below the current size of the database. // // Regardless of mxPage, return the current maximum page count. func Xsqlite3PagerMaxPageCount(tls *libc.TLS, pPager uintptr, mxPage Pgno) Pgno { if mxPage > Pgno(0) { (*Pager)(unsafe.Pointer(pPager)).FmxPgno = mxPage } return (*Pager)(unsafe.Pointer(pPager)).FmxPgno } // Read the first N bytes from the beginning of the file into memory // that pDest points to. // // If the pager was opened on a transient file (zFilename==""), or // opened on a file less than N bytes in size, the output buffer is // zeroed and SQLITE_OK returned. The rationale for this is that this // function is used to read database headers, and a new transient or // zero sized database has a header than consists entirely of zeroes. // // If any IO error apart from SQLITE_IOERR_SHORT_READ is encountered, // the error code is returned to the caller and the contents of the // output buffer undefined. func Xsqlite3PagerReadFileheader(tls *libc.TLS, pPager uintptr, N int32, pDest uintptr) int32 { var rc int32 = SQLITE_OK libc.Xmemset(tls, pDest, 0, uint64(N)) if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0) { rc = Xsqlite3OsRead(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, pDest, N, int64(0)) if rc == SQLITE_IOERR|int32(2)<<8 { rc = SQLITE_OK } } return rc } // This function may only be called when a read-transaction is open on // the pager. It returns the total number of pages in the database. // // However, if the file is between 1 and bytes in size, then // this is considered a 1 page file. func Xsqlite3PagerPagecount(tls *libc.TLS, pPager uintptr, pnPage uintptr) { *(*int32)(unsafe.Pointer(pnPage)) = int32((*Pager)(unsafe.Pointer(pPager)).FdbSize) } func pager_wait_on_lock(tls *libc.TLS, pPager uintptr, locktype int32) int32 { var rc int32 for __ccgo := true; __ccgo; __ccgo = rc == SQLITE_BUSY && (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Pager)(unsafe.Pointer(pPager)).FxBusyHandler})).f(tls, (*Pager)(unsafe.Pointer(pPager)).FpBusyHandlerArg) != 0 { rc = pagerLockDb(tls, pPager, locktype) } return rc } // Truncate the in-memory database file image to nPage pages. This // function does not actually modify the database file on disk. It // just sets the internal state of the pager object so that the // truncation will be done when the current transaction is committed. // // This function is only called right before committing a transaction. // Once this function has been called, the transaction must either be // rolled back or committed. It is not safe to call this function and // then continue writing to the database. func Xsqlite3PagerTruncateImage(tls *libc.TLS, pPager uintptr, nPage Pgno) { (*Pager)(unsafe.Pointer(pPager)).FdbSize = nPage } func pagerSyncHotJournal(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = SQLITE_OK if !(int32((*Pager)(unsafe.Pointer(pPager)).FnoSync) != 0) { rc = Xsqlite3OsSync(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, SQLITE_SYNC_NORMAL) } if rc == SQLITE_OK { rc = Xsqlite3OsFileSize(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, pPager+104) } return rc } func pagerAcquireMapPage(tls *libc.TLS, pPager uintptr, pgno Pgno, pData uintptr, ppPage uintptr) int32 { var p uintptr if (*Pager)(unsafe.Pointer(pPager)).FpMmapFreelist != 0 { *(*uintptr)(unsafe.Pointer(ppPage)) = libc.AssignUintptr(&p, (*Pager)(unsafe.Pointer(pPager)).FpMmapFreelist) (*Pager)(unsafe.Pointer(pPager)).FpMmapFreelist = (*PgHdr)(unsafe.Pointer(p)).FpDirty (*PgHdr)(unsafe.Pointer(p)).FpDirty = uintptr(0) libc.Xmemset(tls, (*PgHdr)(unsafe.Pointer(p)).FpExtra, 0, uint64(8)) } else { *(*uintptr)(unsafe.Pointer(ppPage)) = libc.AssignUintptr(&p, Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(PgHdr{}))+uint64((*Pager)(unsafe.Pointer(pPager)).FnExtra))) if p == uintptr(0) { Xsqlite3OsUnfetch(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, I64(pgno-Pgno(1))*(*Pager)(unsafe.Pointer(pPager)).FpageSize, pData) return SQLITE_NOMEM } (*PgHdr)(unsafe.Pointer(p)).FpExtra = p + 1*80 (*PgHdr)(unsafe.Pointer(p)).Fflags = U16(PGHDR_MMAP) (*PgHdr)(unsafe.Pointer(p)).FnRef = int64(1) (*PgHdr)(unsafe.Pointer(p)).FpPager = pPager } (*PgHdr)(unsafe.Pointer(p)).Fpgno = pgno (*PgHdr)(unsafe.Pointer(p)).FpData = pData (*Pager)(unsafe.Pointer(pPager)).FnMmapOut++ return SQLITE_OK } func pagerReleaseMapPage(tls *libc.TLS, pPg uintptr) { var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager (*Pager)(unsafe.Pointer(pPager)).FnMmapOut-- (*PgHdr)(unsafe.Pointer(pPg)).FpDirty = (*Pager)(unsafe.Pointer(pPager)).FpMmapFreelist (*Pager)(unsafe.Pointer(pPager)).FpMmapFreelist = pPg Xsqlite3OsUnfetch(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, I64((*PgHdr)(unsafe.Pointer(pPg)).Fpgno-Pgno(1))*(*Pager)(unsafe.Pointer(pPager)).FpageSize, (*PgHdr)(unsafe.Pointer(pPg)).FpData) } func pagerFreeMapHdrs(tls *libc.TLS, pPager uintptr) { var p uintptr var pNext uintptr for p = (*Pager)(unsafe.Pointer(pPager)).FpMmapFreelist; p != 0; p = pNext { pNext = (*PgHdr)(unsafe.Pointer(p)).FpDirty Xsqlite3_free(tls, p) } } func databaseIsUnmoved(tls *libc.TLS, pPager uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = 0 var rc int32 if (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 { return SQLITE_OK } if (*Pager)(unsafe.Pointer(pPager)).FdbSize == Pgno(0) { return SQLITE_OK } rc = Xsqlite3OsFileControl(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, SQLITE_FCNTL_HAS_MOVED, bp) if rc == SQLITE_NOTFOUND { rc = SQLITE_OK } else if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp)) != 0 { rc = SQLITE_READONLY | int32(4)<<8 } return rc } // Shutdown the page cache. Free all memory and close all files. // // If a transaction was in progress when this routine is called, that // transaction is rolled back. All outstanding pages are invalidated // and their memory is freed. Any attempt to use a page associated // with this page cache after this function returns will likely // result in a coredump. // // This function always succeeds. If a transaction is active an attempt // is made to roll it back. If an error occurs during the rollback // a hot journal may be left in the filesystem but no error is returned // to the caller. func Xsqlite3PagerClose(tls *libc.TLS, pPager uintptr, db uintptr) int32 { var pTmp uintptr = (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace Xsqlite3BeginBenignMalloc(tls) pagerFreeMapHdrs(tls, pPager) (*Pager)(unsafe.Pointer(pPager)).FexclusiveMode = U8(0) { var a uintptr = uintptr(0) if db != 0 && uint64(0) == (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_NoCkptOnClose) && SQLITE_OK == databaseIsUnmoved(tls, pPager) { a = pTmp } Xsqlite3WalClose(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, db, int32((*Pager)(unsafe.Pointer(pPager)).FwalSyncFlags), int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), a) (*Pager)(unsafe.Pointer(pPager)).FpWal = uintptr(0) } pager_reset(tls, pPager) if (*Pager)(unsafe.Pointer(pPager)).FmemDb != 0 { pager_unlock(tls, pPager) } else { if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0) { pager_error(tls, pPager, pagerSyncHotJournal(tls, pPager)) } pagerUnlockAndRollback(tls, pPager) } Xsqlite3EndBenignMalloc(tls) Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd) Xsqlite3PageFree(tls, pTmp) Xsqlite3PcacheClose(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) Xsqlite3_free(tls, pPager) return SQLITE_OK } // Increment the reference count for page pPg. func Xsqlite3PagerRef(tls *libc.TLS, pPg uintptr) { Xsqlite3PcacheRef(tls, pPg) } func syncJournal(tls *libc.TLS, pPager uintptr, newHdr int32) int32 { bp := tls.Alloc(20) defer tls.Free(20) var rc int32 rc = Xsqlite3PagerExclusiveLock(tls, pPager) if rc != SQLITE_OK { return rc } if !(int32((*Pager)(unsafe.Pointer(pPager)).FnoSync) != 0) { if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0) && int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) != PAGER_JOURNALMODE_MEMORY { var iDc int32 = Xsqlite3OsDeviceCharacteristics(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd) if 0 == iDc&SQLITE_IOCAP_SAFE_APPEND { var iNextHdrOffset I64 libc.Xmemcpy(tls, bp, uintptr(unsafe.Pointer(&aJournalMagic)), uint64(unsafe.Sizeof(aJournalMagic))) Xsqlite3Put4byte(tls, bp+8, uint32((*Pager)(unsafe.Pointer(pPager)).FnRec)) iNextHdrOffset = journalHdrOffset(tls, pPager) rc = Xsqlite3OsRead(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, bp+12, 8, iNextHdrOffset) if rc == SQLITE_OK && 0 == libc.Xmemcmp(tls, bp+12, uintptr(unsafe.Pointer(&aJournalMagic)), uint64(8)) { rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, uintptr(unsafe.Pointer(&zerobyte)), 1, iNextHdrOffset) } if rc != SQLITE_OK && rc != SQLITE_IOERR|int32(2)<<8 { return rc } if (*Pager)(unsafe.Pointer(pPager)).FfullSync != 0 && 0 == iDc&SQLITE_IOCAP_SEQUENTIAL { rc = Xsqlite3OsSync(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags)) if rc != SQLITE_OK { return rc } } rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, bp, int32(unsafe.Sizeof([12]U8{})), (*Pager)(unsafe.Pointer(pPager)).FjournalHdr) if rc != SQLITE_OK { return rc } } if 0 == iDc&SQLITE_IOCAP_SEQUENTIAL { rc = Xsqlite3OsSync(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags)|func() int32 { if int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags) == SQLITE_SYNC_FULL { return SQLITE_SYNC_DATAONLY } return 0 }()) if rc != SQLITE_OK { return rc } } (*Pager)(unsafe.Pointer(pPager)).FjournalHdr = (*Pager)(unsafe.Pointer(pPager)).FjournalOff if newHdr != 0 && 0 == iDc&SQLITE_IOCAP_SAFE_APPEND { (*Pager)(unsafe.Pointer(pPager)).FnRec = 0 rc = writeJournalHdr(tls, pPager) if rc != SQLITE_OK { return rc } } } else { (*Pager)(unsafe.Pointer(pPager)).FjournalHdr = (*Pager)(unsafe.Pointer(pPager)).FjournalOff } } Xsqlite3PcacheClearSyncFlags(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_WRITER_DBMOD) return SQLITE_OK } var zerobyte U8 = U8(0) func pager_write_pagelist(tls *libc.TLS, pPager uintptr, pList uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK if !((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0)) { rc = pagerOpentemp(tls, pPager, (*Pager)(unsafe.Pointer(pPager)).Ffd, int32((*Pager)(unsafe.Pointer(pPager)).FvfsFlags)) } if rc == SQLITE_OK && (*Pager)(unsafe.Pointer(pPager)).FdbHintSize < (*Pager)(unsafe.Pointer(pPager)).FdbSize && ((*PgHdr)(unsafe.Pointer(pList)).FpDirty != 0 || (*PgHdr)(unsafe.Pointer(pList)).Fpgno > (*Pager)(unsafe.Pointer(pPager)).FdbHintSize) { *(*Sqlite3_int64)(unsafe.Pointer(bp)) = (*Pager)(unsafe.Pointer(pPager)).FpageSize * Sqlite3_int64((*Pager)(unsafe.Pointer(pPager)).FdbSize) Xsqlite3OsFileControlHint(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, SQLITE_FCNTL_SIZE_HINT, bp) (*Pager)(unsafe.Pointer(pPager)).FdbHintSize = (*Pager)(unsafe.Pointer(pPager)).FdbSize } for rc == SQLITE_OK && pList != 0 { var pgno Pgno = (*PgHdr)(unsafe.Pointer(pList)).Fpgno if pgno <= (*Pager)(unsafe.Pointer(pPager)).FdbSize && 0 == int32((*PgHdr)(unsafe.Pointer(pList)).Fflags)&PGHDR_DONT_WRITE { var offset I64 = I64(pgno-Pgno(1)) * (*Pager)(unsafe.Pointer(pPager)).FpageSize var pData uintptr if (*PgHdr)(unsafe.Pointer(pList)).Fpgno == Pgno(1) { pager_write_changecounter(tls, pList) } pData = (*PgHdr)(unsafe.Pointer(pList)).FpData rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, pData, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), offset) if pgno == Pgno(1) { libc.Xmemcpy(tls, pPager+136, pData+24, uint64(unsafe.Sizeof([16]int8{}))) } if pgno > (*Pager)(unsafe.Pointer(pPager)).FdbFileSize { (*Pager)(unsafe.Pointer(pPager)).FdbFileSize = pgno } *(*int32)(unsafe.Pointer(pPager + 248 + 2*4))++ Xsqlite3BackupUpdate(tls, (*Pager)(unsafe.Pointer(pPager)).FpBackup, pgno, (*PgHdr)(unsafe.Pointer(pList)).FpData) } else { } pList = (*PgHdr)(unsafe.Pointer(pList)).FpDirty } return rc } func openSubJournal(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = SQLITE_OK if !((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fsjfd)).FpMethods != uintptr(0)) { var flags int32 = SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE var nStmtSpill int32 = Xsqlite3Config.FnStmtSpill if int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_MEMORY || (*Pager)(unsafe.Pointer(pPager)).FsubjInMemory != 0 { nStmtSpill = -1 } rc = Xsqlite3JournalOpen(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, uintptr(0), (*Pager)(unsafe.Pointer(pPager)).Fsjfd, flags, nStmtSpill) } return rc } func subjournalPage(tls *libc.TLS, pPg uintptr) int32 { var rc int32 = SQLITE_OK var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager if int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) != PAGER_JOURNALMODE_OFF { rc = openSubJournal(tls, pPager) if rc == SQLITE_OK { var pData uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpData var offset I64 = I64((*Pager)(unsafe.Pointer(pPager)).FnSubRec) * (int64(4) + (*Pager)(unsafe.Pointer(pPager)).FpageSize) var pData2 uintptr pData2 = pData rc = write32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fsjfd, offset, (*PgHdr)(unsafe.Pointer(pPg)).Fpgno) if rc == SQLITE_OK { rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fsjfd, pData2, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), offset+int64(4)) } } } if rc == SQLITE_OK { (*Pager)(unsafe.Pointer(pPager)).FnSubRec++ rc = addToSavepointBitvecs(tls, pPager, (*PgHdr)(unsafe.Pointer(pPg)).Fpgno) } return rc } func subjournalPageIfRequired(tls *libc.TLS, pPg uintptr) int32 { if subjRequiresPage(tls, pPg) != 0 { return subjournalPage(tls, pPg) } else { return SQLITE_OK } return int32(0) } func pagerStress(tls *libc.TLS, p uintptr, pPg uintptr) int32 { var pPager uintptr = p var rc int32 = SQLITE_OK if (*Pager)(unsafe.Pointer(pPager)).FerrCode != 0 { return SQLITE_OK } if (*Pager)(unsafe.Pointer(pPager)).FdoNotSpill != 0 && (int32((*Pager)(unsafe.Pointer(pPager)).FdoNotSpill)&(SPILLFLAG_ROLLBACK|SPILLFLAG_OFF) != 0 || int32((*PgHdr)(unsafe.Pointer(pPg)).Fflags)&PGHDR_NEED_SYNC != 0) { return SQLITE_OK } *(*int32)(unsafe.Pointer(pPager + 248 + 3*4))++ (*PgHdr)(unsafe.Pointer(pPg)).FpDirty = uintptr(0) if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { rc = subjournalPageIfRequired(tls, pPg) if rc == SQLITE_OK { rc = pagerWalFrames(tls, pPager, pPg, uint32(0), 0) } } else { if int32((*PgHdr)(unsafe.Pointer(pPg)).Fflags)&PGHDR_NEED_SYNC != 0 || int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_WRITER_CACHEMOD { rc = syncJournal(tls, pPager, 1) } if rc == SQLITE_OK { rc = pager_write_pagelist(tls, pPager, pPg) } } if rc == SQLITE_OK { Xsqlite3PcacheMakeClean(tls, pPg) } return pager_error(tls, pPager, rc) } // Flush all unreferenced dirty pages to disk. func Xsqlite3PagerFlush(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = (*Pager)(unsafe.Pointer(pPager)).FerrCode if !(int32((*Pager)(unsafe.Pointer(pPager)).FmemDb) != 0) { var pList uintptr = Xsqlite3PcacheDirtyList(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) for rc == SQLITE_OK && pList != 0 { var pNext uintptr = (*PgHdr)(unsafe.Pointer(pList)).FpDirty if (*PgHdr)(unsafe.Pointer(pList)).FnRef == int64(0) { rc = pagerStress(tls, pPager, pList) } pList = pNext } } return rc } // Allocate and initialize a new Pager object and put a pointer to it // in *ppPager. The pager should eventually be freed by passing it // to sqlite3PagerClose(). // // The zFilename argument is the path to the database file to open. // If zFilename is NULL then a randomly-named temporary file is created // and used as the file to be cached. Temporary files are be deleted // automatically when they are closed. If zFilename is ":memory:" then // all information is held in cache. It is never written to disk. // This can be used to implement an in-memory database. // // The nExtra parameter specifies the number of bytes of space allocated // along with each page reference. This space is available to the user // via the sqlite3PagerGetExtra() API. When a new page is allocated, the // first 8 bytes of this space are zeroed but the remainder is uninitialized. // (The extra space is used by btree as the MemPage object.) // // The flags argument is used to specify properties that affect the // operation of the pager. It should be passed some bitwise combination // of the PAGER_* flags. // // The vfsFlags parameter is a bitmask to pass to the flags parameter // of the xOpen() method of the supplied VFS when opening files. // // If the pager object is allocated and the specified file opened // successfully, SQLITE_OK is returned and *ppPager set to point to // the new pager object. If an error occurs, *ppPager is set to NULL // and error code returned. This function may return SQLITE_NOMEM // (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or // various SQLITE_IO_XXX errors. func Xsqlite3PagerOpen(tls *libc.TLS, pVfs uintptr, ppPager uintptr, zFilename uintptr, nExtra int32, flags int32, vfsFlags int32, xReinit uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pPtr uintptr _ = pPtr var rc int32 var tempFile int32 var memDb int32 var memJM int32 var readOnly int32 var journalFileSize int32 var zPathname uintptr var nPathname int32 var useJournal int32 var pcacheSize int32 var zUri uintptr var nUriByte int32 var z uintptr var iDc int32 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = SQLITE_OK tempFile = 0 memDb = 0 memJM = 0 readOnly = 0 zPathname = uintptr(0) nPathname = 0 useJournal = libc.Bool32(flags&PAGER_OMIT_JOURNAL == 0) pcacheSize = Xsqlite3PcacheSize(tls) *(*U32)(unsafe.Pointer(bp + 12)) = U32(SQLITE_DEFAULT_PAGE_SIZE) zUri = uintptr(0) nUriByte = 1 journalFileSize = (Xsqlite3JournalSize(tls, pVfs) + 7) & libc.CplInt32(7) *(*uintptr)(unsafe.Pointer(ppPager)) = uintptr(0) if !(flags&PAGER_MEMORY != 0) { goto __1 } memDb = 1 if !(zFilename != 0 && *(*int8)(unsafe.Pointer(zFilename)) != 0) { goto __2 } zPathname = Xsqlite3DbStrDup(tls, uintptr(0), zFilename) if !(zPathname == uintptr(0)) { goto __3 } return SQLITE_NOMEM __3: ; nPathname = Xsqlite3Strlen30(tls, zPathname) zFilename = uintptr(0) __2: ; __1: ; if !(zFilename != 0 && *(*int8)(unsafe.Pointer(zFilename)) != 0) { goto __4 } nPathname = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname + 1 zPathname = Xsqlite3DbMallocRaw(tls, uintptr(0), uint64(nPathname*2)) if !(zPathname == uintptr(0)) { goto __5 } return SQLITE_NOMEM __5: ; *(*int8)(unsafe.Pointer(zPathname)) = int8(0) rc = Xsqlite3OsFullPathname(tls, pVfs, zFilename, nPathname, zPathname) if !(rc != SQLITE_OK) { goto __6 } if !(rc == SQLITE_OK|int32(2)<<8) { goto __7 } if !(vfsFlags&SQLITE_OPEN_NOFOLLOW != 0) { goto __8 } rc = SQLITE_CANTOPEN | int32(6)<<8 goto __9 __8: rc = SQLITE_OK __9: ; __7: ; __6: ; nPathname = Xsqlite3Strlen30(tls, zPathname) z = libc.AssignUintptr(&zUri, zFilename+uintptr(Xsqlite3Strlen30(tls, zFilename)+1)) __10: if !(*(*int8)(unsafe.Pointer(z)) != 0) { goto __11 } z += uintptr(libc.Xstrlen(tls, z) + uint64(1)) z += uintptr(libc.Xstrlen(tls, z) + uint64(1)) goto __10 __11: ; nUriByte = int32((int64(z+1) - int64(zUri)) / 1) if !(rc == SQLITE_OK && nPathname+8 > (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname) { goto __12 } rc = Xsqlite3CantopenError(tls, 60239) __12: ; if !(rc != SQLITE_OK) { goto __13 } Xsqlite3DbFree(tls, uintptr(0), zPathname) return rc __13: ; __4: ; pPtr = Xsqlite3MallocZero(tls, (uint64(unsafe.Sizeof(Pager{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))+uint64((pcacheSize+7)&libc.CplInt32(7))+uint64(((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile+7)&libc.CplInt32(7))+uint64(journalFileSize*2)+uint64(unsafe.Sizeof(uintptr(0)))+uint64(4)+uint64(nPathname)+uint64(1)+uint64(nUriByte)+uint64(nPathname)+uint64(8)+uint64(1)+uint64(nPathname)+uint64(4)+uint64(1)+uint64(3)) if !!(pPtr != 0) { goto __14 } Xsqlite3DbFree(tls, uintptr(0), zPathname) return SQLITE_NOMEM __14: ; *(*uintptr)(unsafe.Pointer(bp)) = pPtr pPtr += uintptr((uint64(unsafe.Sizeof(Pager{})) + uint64(7)) & libc.Uint64FromInt32(libc.CplInt32(7))) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpPCache = pPtr pPtr += uintptr((pcacheSize + 7) & libc.CplInt32(7)) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Ffd = pPtr pPtr += uintptr(((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile + 7) & libc.CplInt32(7)) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fsjfd = pPtr pPtr += uintptr(journalFileSize) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fjfd = pPtr pPtr += uintptr(journalFileSize) libc.Xmemcpy(tls, pPtr, bp, uint64(unsafe.Sizeof(uintptr(0)))) pPtr += unsafe.Sizeof(uintptr(0)) pPtr += uintptr(4) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzFilename = pPtr if !(nPathname > 0) { goto __15 } libc.Xmemcpy(tls, pPtr, zPathname, uint64(nPathname)) pPtr += uintptr(nPathname + 1) if !(zUri != 0) { goto __16 } libc.Xmemcpy(tls, pPtr, zUri, uint64(nUriByte)) pPtr += uintptr(nUriByte) goto __17 __16: pPtr++ __17: ; __15: ; if !(nPathname > 0) { goto __18 } (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzJournal = pPtr libc.Xmemcpy(tls, pPtr, zPathname, uint64(nPathname)) pPtr += uintptr(nPathname) libc.Xmemcpy(tls, pPtr, ts+5273, uint64(8)) pPtr += uintptr(8 + 1) goto __19 __18: (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzJournal = uintptr(0) __19: ; if !(nPathname > 0) { goto __20 } (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzWal = pPtr libc.Xmemcpy(tls, pPtr, zPathname, uint64(nPathname)) pPtr += uintptr(nPathname) libc.Xmemcpy(tls, pPtr, ts+5282, uint64(4)) pPtr += uintptr(4 + 1) goto __21 __20: (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzWal = uintptr(0) __21: ; _ = pPtr if !(nPathname != 0) { goto __22 } Xsqlite3DbFree(tls, uintptr(0), zPathname) __22: ; (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpVfs = pVfs (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FvfsFlags = U32(vfsFlags) if !(zFilename != 0 && *(*int8)(unsafe.Pointer(zFilename)) != 0) { goto __23 } *(*int32)(unsafe.Pointer(bp + 8)) = 0 rc = Xsqlite3OsOpen(tls, pVfs, (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzFilename, (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Ffd, vfsFlags, bp+8) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FmemVfs = U8(libc.AssignInt32(&memJM, libc.Bool32(*(*int32)(unsafe.Pointer(bp + 8))&SQLITE_OPEN_MEMORY != 0))) readOnly = libc.Bool32(*(*int32)(unsafe.Pointer(bp + 8))&SQLITE_OPEN_READONLY != 0) if !(rc == SQLITE_OK) { goto __25 } iDc = Xsqlite3OsDeviceCharacteristics(tls, (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Ffd) if !!(readOnly != 0) { goto __26 } setSectorSize(tls, *(*uintptr)(unsafe.Pointer(bp))) if !(*(*U32)(unsafe.Pointer(bp + 12)) < (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FsectorSize) { goto __27 } if !((*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FsectorSize > U32(SQLITE_MAX_DEFAULT_PAGE_SIZE)) { goto __28 } *(*U32)(unsafe.Pointer(bp + 12)) = U32(SQLITE_MAX_DEFAULT_PAGE_SIZE) goto __29 __28: *(*U32)(unsafe.Pointer(bp + 12)) = (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FsectorSize __29: ; __27: ; __26: ; (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnoLock = U8(Xsqlite3_uri_boolean(tls, (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzFilename, ts+5287, 0)) if !(iDc&SQLITE_IOCAP_IMMUTABLE != 0 || Xsqlite3_uri_boolean(tls, (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzFilename, ts+5294, 0) != 0) { goto __30 } vfsFlags = vfsFlags | SQLITE_OPEN_READONLY goto act_like_temp_file __30: ; __25: ; goto __24 __23: act_like_temp_file: tempFile = 1 (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FeState = U8(PAGER_READER) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FeLock = U8(EXCLUSIVE_LOCK) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnoLock = U8(1) readOnly = vfsFlags & SQLITE_OPEN_READONLY __24: ; if !(rc == SQLITE_OK) { goto __31 } rc = Xsqlite3PagerSetPagesize(tls, *(*uintptr)(unsafe.Pointer(bp)), bp+12, -1) __31: ; if !(rc == SQLITE_OK) { goto __32 } nExtra = (nExtra + 7) & libc.CplInt32(7) rc = Xsqlite3PcacheOpen(tls, int32(*(*U32)(unsafe.Pointer(bp + 12))), nExtra, libc.BoolInt32(!(memDb != 0)), func() uintptr { if !(memDb != 0) { return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{pagerStress})) } return uintptr(0) }(), *(*uintptr)(unsafe.Pointer(bp)), (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpPCache) __32: ; if !(rc != SQLITE_OK) { goto __33 } Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Ffd) Xsqlite3PageFree(tls, (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpTmpSpace) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc __33: ; (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FuseJournal = U8(useJournal) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FmxPgno = Pgno(SQLITE_MAX_PAGE_COUNT) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FtempFile = U8(tempFile) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FexclusiveMode = U8(tempFile) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FchangeCountDone = (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FtempFile (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FmemDb = U8(memDb) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FreadOnly = U8(readOnly) Xsqlite3PagerSetFlags(tls, *(*uintptr)(unsafe.Pointer(bp)), uint32(SQLITE_DEFAULT_SYNCHRONOUS+1|PAGER_CACHESPILL)) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnExtra = U16(nExtra) (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FjournalSizeLimit = int64(-1) setSectorSize(tls, *(*uintptr)(unsafe.Pointer(bp))) if !!(useJournal != 0) { goto __34 } (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FjournalMode = U8(PAGER_JOURNALMODE_OFF) goto __35 __34: if !(memDb != 0 || memJM != 0) { goto __36 } (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FjournalMode = U8(PAGER_JOURNALMODE_MEMORY) __36: ; __35: ; (*Pager)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FxReiniter = xReinit setGetterMethod(tls, *(*uintptr)(unsafe.Pointer(bp))) *(*uintptr)(unsafe.Pointer(ppPager)) = *(*uintptr)(unsafe.Pointer(bp)) return SQLITE_OK } // Return the sqlite3_file for the main database given the name // of the corresonding WAL or Journal name as passed into // xOpen. func Xsqlite3_database_file_object(tls *libc.TLS, zName uintptr) uintptr { var pPager uintptr for int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-1)))) != 0 || int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-2)))) != 0 || int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-3)))) != 0 || int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-4)))) != 0 { zName-- } pPager = *(*uintptr)(unsafe.Pointer(zName - uintptr(4) - uintptr(uint64(unsafe.Sizeof(uintptr(0)))))) return (*Pager)(unsafe.Pointer(pPager)).Ffd } func hasHotJournal(tls *libc.TLS, pPager uintptr, pExists uintptr) int32 { bp := tls.Alloc(17) defer tls.Free(17) var pVfs uintptr = (*Pager)(unsafe.Pointer(pPager)).FpVfs var rc int32 = SQLITE_OK *(*int32)(unsafe.Pointer(bp)) = 1 var jrnlOpen int32 = libc.BoolInt32(!!((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0))) *(*int32)(unsafe.Pointer(pExists)) = 0 if !(jrnlOpen != 0) { rc = Xsqlite3OsAccess(tls, pVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, SQLITE_ACCESS_EXISTS, bp) } if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp)) != 0 { *(*int32)(unsafe.Pointer(bp + 4)) = 0 rc = Xsqlite3OsCheckReservedLock(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, bp+4) if rc == SQLITE_OK && !(*(*int32)(unsafe.Pointer(bp + 4)) != 0) { rc = pagerPagecount(tls, pPager, bp+8) if rc == SQLITE_OK { if *(*Pgno)(unsafe.Pointer(bp + 8)) == Pgno(0) && !(jrnlOpen != 0) { Xsqlite3BeginBenignMalloc(tls) if pagerLockDb(tls, pPager, RESERVED_LOCK) == SQLITE_OK { Xsqlite3OsDelete(tls, pVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, 0) if !(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) { pagerUnlockDb(tls, pPager, SHARED_LOCK) } } Xsqlite3EndBenignMalloc(tls) } else { if !(jrnlOpen != 0) { *(*int32)(unsafe.Pointer(bp + 12)) = SQLITE_OPEN_READONLY | SQLITE_OPEN_MAIN_JOURNAL rc = Xsqlite3OsOpen(tls, pVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, (*Pager)(unsafe.Pointer(pPager)).Fjfd, *(*int32)(unsafe.Pointer(bp + 12)), bp+12) } if rc == SQLITE_OK { *(*U8)(unsafe.Pointer(bp + 16)) = U8(0) rc = Xsqlite3OsRead(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, bp+16, 1, int64(0)) if rc == SQLITE_IOERR|int32(2)<<8 { rc = SQLITE_OK } if !(jrnlOpen != 0) { Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) } *(*int32)(unsafe.Pointer(pExists)) = libc.Bool32(int32(*(*U8)(unsafe.Pointer(bp + 16))) != 0) } else if rc == SQLITE_CANTOPEN { *(*int32)(unsafe.Pointer(pExists)) = 1 rc = SQLITE_OK } } } } } return rc } // This function is called to obtain a shared lock on the database file. // It is illegal to call sqlite3PagerGet() until after this function // has been successfully called. If a shared-lock is already held when // this function is called, it is a no-op. // // The following operations are also performed by this function. // // 1. If the pager is currently in PAGER_OPEN state (no lock held // on the database file), then an attempt is made to obtain a // SHARED lock on the database file. Immediately after obtaining // the SHARED lock, the file-system is checked for a hot-journal, // which is played back if present. Following any hot-journal // rollback, the contents of the cache are validated by checking // the 'change-counter' field of the database file header and // discarded if they are found to be invalid. // // 2. If the pager is running in exclusive-mode, and there are currently // no outstanding references to any pages, and is in the error state, // then an attempt is made to clear the error state by discarding // the contents of the page cache and rolling back any open journal // file. // // If everything is successful, SQLITE_OK is returned. If an IO error // occurs while locking the database, checking for a hot-journal file or // rolling back a journal file, the IO error code is returned. func Xsqlite3PagerSharedLock(tls *libc.TLS, pPager uintptr) int32 { bp := tls.Alloc(28) defer tls.Free(28) var rc int32 var f int32 var pVfs uintptr rc = SQLITE_OK if !(!((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0)) && int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_OPEN) { goto __1 } *(*int32)(unsafe.Pointer(bp)) = 1 rc = pager_wait_on_lock(tls, pPager, SHARED_LOCK) if !(rc != SQLITE_OK) { goto __2 } goto failed __2: ; if !(int32((*Pager)(unsafe.Pointer(pPager)).FeLock) <= SHARED_LOCK) { goto __3 } rc = hasHotJournal(tls, pPager, bp) __3: ; if !(rc != SQLITE_OK) { goto __4 } goto failed __4: ; if !(*(*int32)(unsafe.Pointer(bp)) != 0) { goto __5 } if !((*Pager)(unsafe.Pointer(pPager)).FreadOnly != 0) { goto __6 } rc = SQLITE_READONLY | int32(3)<<8 goto failed __6: ; rc = pagerLockDb(tls, pPager, EXCLUSIVE_LOCK) if !(rc != SQLITE_OK) { goto __7 } goto failed __7: ; if !(!((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0)) && int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) != PAGER_JOURNALMODE_OFF) { goto __8 } pVfs = (*Pager)(unsafe.Pointer(pPager)).FpVfs rc = Xsqlite3OsAccess(tls, pVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, SQLITE_ACCESS_EXISTS, bp+4) if !(rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 4)) != 0) { goto __9 } *(*int32)(unsafe.Pointer(bp + 8)) = 0 f = SQLITE_OPEN_READWRITE | SQLITE_OPEN_MAIN_JOURNAL rc = Xsqlite3OsOpen(tls, pVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, (*Pager)(unsafe.Pointer(pPager)).Fjfd, f, bp+8) if !(rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 8))&SQLITE_OPEN_READONLY != 0) { goto __10 } rc = Xsqlite3CantopenError(tls, 60758) Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) __10: ; __9: ; __8: ; if !((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0)) { goto __11 } rc = pagerSyncHotJournal(tls, pPager) if !(rc == SQLITE_OK) { goto __13 } rc = pager_playback(tls, pPager, libc.BoolInt32(!((*Pager)(unsafe.Pointer(pPager)).FtempFile != 0))) (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_OPEN) __13: ; goto __12 __11: if !!(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) { goto __14 } pagerUnlockDb(tls, pPager, SHARED_LOCK) __14: ; __12: ; if !(rc != SQLITE_OK) { goto __15 } pager_error(tls, pPager, rc) goto failed __15: ; __5: ; if !(!(int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) != 0) && (*Pager)(unsafe.Pointer(pPager)).FhasHeldSharedLock != 0) { goto __16 } rc = Xsqlite3OsRead(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, bp+12, int32(unsafe.Sizeof([16]int8{})), int64(24)) if !(rc != SQLITE_OK) { goto __17 } if !(rc != SQLITE_IOERR|int32(2)<<8) { goto __18 } goto failed __18: ; libc.Xmemset(tls, bp+12, 0, uint64(unsafe.Sizeof([16]int8{}))) __17: ; if !(libc.Xmemcmp(tls, pPager+136, bp+12, uint64(unsafe.Sizeof([16]int8{}))) != 0) { goto __19 } pager_reset(tls, pPager) if !((*Pager)(unsafe.Pointer(pPager)).FbUseFetch != 0) { goto __20 } Xsqlite3OsUnfetch(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, int64(0), uintptr(0)) __20: ; __19: ; __16: ; rc = pagerOpenWalIfPresent(tls, pPager) __1: ; if !((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0)) { goto __21 } rc = pagerBeginReadTransaction(tls, pPager) __21: ; if !(int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) == 0 && int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_OPEN && rc == SQLITE_OK) { goto __22 } rc = pagerPagecount(tls, pPager, pPager+32) __22: ; failed: if !(rc != SQLITE_OK) { goto __23 } pager_unlock(tls, pPager) goto __24 __23: (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_READER) (*Pager)(unsafe.Pointer(pPager)).FhasHeldSharedLock = U8(1) __24: ; return rc } func pagerUnlockIfUnused(tls *libc.TLS, pPager uintptr) { if Xsqlite3PcacheRefCount(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) == int64(0) { pagerUnlockAndRollback(tls, pPager) } } func getPageNormal(tls *libc.TLS, pPager uintptr, pgno Pgno, ppPage uintptr, flags int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var pPg uintptr var noContent U8 rc = SQLITE_OK if !(pgno == Pgno(0)) { goto __1 } return Xsqlite3CorruptError(tls, 60971) __1: ; *(*uintptr)(unsafe.Pointer(bp)) = Xsqlite3PcacheFetch(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, pgno, 3) if !(*(*uintptr)(unsafe.Pointer(bp)) == uintptr(0)) { goto __2 } pPg = uintptr(0) rc = Xsqlite3PcacheFetchStress(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, pgno, bp) if !(rc != SQLITE_OK) { goto __3 } goto pager_acquire_err __3: ; if !(*(*uintptr)(unsafe.Pointer(bp)) == uintptr(0)) { goto __4 } rc = SQLITE_NOMEM goto pager_acquire_err __4: ; __2: ; pPg = libc.AssignPtrUintptr(ppPage, Xsqlite3PcacheFetchFinish(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, pgno, *(*uintptr)(unsafe.Pointer(bp)))) noContent = U8(libc.Bool32(flags&PAGER_GET_NOCONTENT != 0)) if !((*PgHdr)(unsafe.Pointer(pPg)).FpPager != 0 && !(noContent != 0)) { goto __5 } *(*int32)(unsafe.Pointer(pPager + 248))++ return SQLITE_OK goto __6 __5: if !(pgno == (*Pager)(unsafe.Pointer(pPager)).FlckPgno) { goto __7 } rc = Xsqlite3CorruptError(tls, 61003) goto pager_acquire_err __7: ; (*PgHdr)(unsafe.Pointer(pPg)).FpPager = pPager if !(!((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods != uintptr(0)) || (*Pager)(unsafe.Pointer(pPager)).FdbSize < pgno || noContent != 0) { goto __8 } if !(pgno > (*Pager)(unsafe.Pointer(pPager)).FmxPgno) { goto __10 } rc = SQLITE_FULL goto pager_acquire_err __10: ; if !(noContent != 0) { goto __11 } Xsqlite3BeginBenignMalloc(tls) if !(pgno <= (*Pager)(unsafe.Pointer(pPager)).FdbOrigSize) { goto __12 } Xsqlite3BitvecSet(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal, pgno) __12: ; addToSavepointBitvecs(tls, pPager, pgno) Xsqlite3EndBenignMalloc(tls) __11: ; libc.Xmemset(tls, (*PgHdr)(unsafe.Pointer(pPg)).FpData, 0, uint64((*Pager)(unsafe.Pointer(pPager)).FpageSize)) goto __9 __8: ; *(*int32)(unsafe.Pointer(pPager + 248 + 1*4))++ rc = readDbPage(tls, pPg) if !(rc != SQLITE_OK) { goto __13 } goto pager_acquire_err __13: ; __9: ; __6: ; return SQLITE_OK pager_acquire_err: ; if !(pPg != 0) { goto __14 } Xsqlite3PcacheDrop(tls, pPg) __14: ; pagerUnlockIfUnused(tls, pPager) *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) return rc } func getPageMMap(tls *libc.TLS, pPager uintptr, pgno Pgno, ppPage uintptr, flags int32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) *(*U32)(unsafe.Pointer(bp)) = U32(0) var bMmapOk int32 = libc.Bool32(pgno > Pgno(1) && (int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_READER || flags&PAGER_GET_READONLY != 0)) if pgno <= Pgno(1) && pgno == Pgno(0) { return Xsqlite3CorruptError(tls, 61082) } if bMmapOk != 0 && (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { rc = Xsqlite3WalFindFrame(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, pgno, bp) if rc != SQLITE_OK { *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) return rc } } if bMmapOk != 0 && *(*U32)(unsafe.Pointer(bp)) == U32(0) { *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) rc = Xsqlite3OsFetch(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, I64(pgno-Pgno(1))*(*Pager)(unsafe.Pointer(pPager)).FpageSize, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), bp+8) if rc == SQLITE_OK && *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { if int32((*Pager)(unsafe.Pointer(pPager)).FeState) > PAGER_READER || (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 { *(*uintptr)(unsafe.Pointer(bp + 16)) = Xsqlite3PagerLookup(tls, pPager, pgno) } if *(*uintptr)(unsafe.Pointer(bp + 16)) == uintptr(0) { rc = pagerAcquireMapPage(tls, pPager, pgno, *(*uintptr)(unsafe.Pointer(bp + 8)), bp+16) } else { Xsqlite3OsUnfetch(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, I64(pgno-Pgno(1))*(*Pager)(unsafe.Pointer(pPager)).FpageSize, *(*uintptr)(unsafe.Pointer(bp + 8))) } if *(*uintptr)(unsafe.Pointer(bp + 16)) != 0 { *(*uintptr)(unsafe.Pointer(ppPage)) = *(*uintptr)(unsafe.Pointer(bp + 16)) return SQLITE_OK } } if rc != SQLITE_OK { *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) return rc } } return getPageNormal(tls, pPager, pgno, ppPage, flags) } func getPageError(tls *libc.TLS, pPager uintptr, pgno Pgno, ppPage uintptr, flags int32) int32 { _ = pgno _ = flags *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) return (*Pager)(unsafe.Pointer(pPager)).FerrCode } // Dispatch all page fetch requests to the appropriate getter method. func Xsqlite3PagerGet(tls *libc.TLS, pPager uintptr, pgno Pgno, ppPage uintptr, flags int32) int32 { return (*struct { f func(*libc.TLS, uintptr, Pgno, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Pager)(unsafe.Pointer(pPager)).FxGet})).f(tls, pPager, pgno, ppPage, flags) } // Acquire a page if it is already in the in-memory cache. Do // not read the page from disk. Return a pointer to the page, // or 0 if the page is not in cache. // // See also sqlite3PagerGet(). The difference between this routine // and sqlite3PagerGet() is that _get() will go to the disk and read // in the page if the page is not already in cache. This routine // returns NULL if the page is not in cache or if a disk I/O error // has ever happened. func Xsqlite3PagerLookup(tls *libc.TLS, pPager uintptr, pgno Pgno) uintptr { var pPage uintptr pPage = Xsqlite3PcacheFetch(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, pgno, 0) if pPage == uintptr(0) { return uintptr(0) } return Xsqlite3PcacheFetchFinish(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache, pgno, pPage) } // Release a page reference. // // The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be // used if we know that the page being released is not the last page. // The btree layer always holds page1 open until the end, so these first // to routines can be used to release any page other than BtShared.pPage1. // // Use sqlite3PagerUnrefPageOne() to release page1. This latter routine // checks the total number of outstanding pages and if the number of // pages reaches zero it drops the database lock. func Xsqlite3PagerUnrefNotNull(tls *libc.TLS, pPg uintptr) { if int32((*DbPage)(unsafe.Pointer(pPg)).Fflags)&PGHDR_MMAP != 0 { pagerReleaseMapPage(tls, pPg) } else { Xsqlite3PcacheRelease(tls, pPg) } } func Xsqlite3PagerUnref(tls *libc.TLS, pPg uintptr) { if pPg != 0 { Xsqlite3PagerUnrefNotNull(tls, pPg) } } func Xsqlite3PagerUnrefPageOne(tls *libc.TLS, pPg uintptr) { var pPager uintptr pPager = (*DbPage)(unsafe.Pointer(pPg)).FpPager Xsqlite3PcacheRelease(tls, pPg) pagerUnlockIfUnused(tls, pPager) } func pager_open_journal(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = SQLITE_OK var pVfs uintptr = (*Pager)(unsafe.Pointer(pPager)).FpVfs if (*Pager)(unsafe.Pointer(pPager)).FerrCode != 0 { return (*Pager)(unsafe.Pointer(pPager)).FerrCode } if !((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0)) && int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) != PAGER_JOURNALMODE_OFF { (*Pager)(unsafe.Pointer(pPager)).FpInJournal = Xsqlite3BitvecCreate(tls, (*Pager)(unsafe.Pointer(pPager)).FdbSize) if (*Pager)(unsafe.Pointer(pPager)).FpInJournal == uintptr(0) { return SQLITE_NOMEM } if !((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0)) { if int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_MEMORY { Xsqlite3MemJournalOpen(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) } else { var flags int32 = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE var nSpill int32 if (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 { flags = flags | (SQLITE_OPEN_DELETEONCLOSE | SQLITE_OPEN_TEMP_JOURNAL) flags = flags | SQLITE_OPEN_EXCLUSIVE nSpill = Xsqlite3Config.FnStmtSpill } else { flags = flags | SQLITE_OPEN_MAIN_JOURNAL nSpill = jrnlBufferSize(tls, pPager) } rc = databaseIsUnmoved(tls, pPager) if rc == SQLITE_OK { rc = Xsqlite3JournalOpen(tls, pVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, (*Pager)(unsafe.Pointer(pPager)).Fjfd, flags, nSpill) } } } if rc == SQLITE_OK { (*Pager)(unsafe.Pointer(pPager)).FnRec = 0 (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) (*Pager)(unsafe.Pointer(pPager)).FsetSuper = U8(0) (*Pager)(unsafe.Pointer(pPager)).FjournalHdr = int64(0) rc = writeJournalHdr(tls, pPager) } } if rc != SQLITE_OK { Xsqlite3BitvecDestroy(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal) (*Pager)(unsafe.Pointer(pPager)).FpInJournal = uintptr(0) (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) } else { (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_WRITER_CACHEMOD) } return rc } // Begin a write-transaction on the specified pager object. If a // write-transaction has already been opened, this function is a no-op. // // If the exFlag argument is false, then acquire at least a RESERVED // lock on the database file. If exFlag is true, then acquire at least // an EXCLUSIVE lock. If such a lock is already held, no locking // functions need be called. // // If the subjInMemory argument is non-zero, then any sub-journal opened // within this transaction will be opened as an in-memory file. This // has no effect if the sub-journal is already opened (as it may be when // running in exclusive mode) or if the transaction does not require a // sub-journal. If the subjInMemory argument is zero, then any required // sub-journal is implemented in-memory if pPager is an in-memory database, // or using a temporary file otherwise. func Xsqlite3PagerBegin(tls *libc.TLS, pPager uintptr, exFlag int32, subjInMemory int32) int32 { var rc int32 = SQLITE_OK if (*Pager)(unsafe.Pointer(pPager)).FerrCode != 0 { return (*Pager)(unsafe.Pointer(pPager)).FerrCode } (*Pager)(unsafe.Pointer(pPager)).FsubjInMemory = U8(subjInMemory) if int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_READER { if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { if (*Pager)(unsafe.Pointer(pPager)).FexclusiveMode != 0 && Xsqlite3WalExclusiveMode(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, -1) != 0 { rc = pagerLockDb(tls, pPager, EXCLUSIVE_LOCK) if rc != SQLITE_OK { return rc } Xsqlite3WalExclusiveMode(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, 1) } rc = Xsqlite3WalBeginWriteTransaction(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) } else { rc = pagerLockDb(tls, pPager, RESERVED_LOCK) if rc == SQLITE_OK && exFlag != 0 { rc = pager_wait_on_lock(tls, pPager, EXCLUSIVE_LOCK) } } if rc == SQLITE_OK { (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_WRITER_LOCKED) (*Pager)(unsafe.Pointer(pPager)).FdbHintSize = (*Pager)(unsafe.Pointer(pPager)).FdbSize (*Pager)(unsafe.Pointer(pPager)).FdbFileSize = (*Pager)(unsafe.Pointer(pPager)).FdbSize (*Pager)(unsafe.Pointer(pPager)).FdbOrigSize = (*Pager)(unsafe.Pointer(pPager)).FdbSize (*Pager)(unsafe.Pointer(pPager)).FjournalOff = int64(0) } } return rc } func pagerAddPageToRollbackJournal(tls *libc.TLS, pPg uintptr) int32 { var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager var rc int32 var cksum U32 var pData2 uintptr var iOff I64 = (*Pager)(unsafe.Pointer(pPager)).FjournalOff pData2 = (*PgHdr)(unsafe.Pointer(pPg)).FpData cksum = pager_cksum(tls, pPager, pData2) *(*U16)(unsafe.Pointer(pPg + 52)) |= U16(PGHDR_NEED_SYNC) rc = write32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iOff, (*PgHdr)(unsafe.Pointer(pPg)).Fpgno) if rc != SQLITE_OK { return rc } rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, pData2, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), iOff+int64(4)) if rc != SQLITE_OK { return rc } rc = write32bits(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd, iOff+(*Pager)(unsafe.Pointer(pPager)).FpageSize+int64(4), cksum) if rc != SQLITE_OK { return rc } *(*I64)(unsafe.Pointer(pPager + 96)) += int64(8) + (*Pager)(unsafe.Pointer(pPager)).FpageSize (*Pager)(unsafe.Pointer(pPager)).FnRec++ rc = Xsqlite3BitvecSet(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal, (*PgHdr)(unsafe.Pointer(pPg)).Fpgno) rc = rc | addToSavepointBitvecs(tls, pPager, (*PgHdr)(unsafe.Pointer(pPg)).Fpgno) return rc } func pager_write(tls *libc.TLS, pPg uintptr) int32 { var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager var rc int32 = SQLITE_OK if int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_WRITER_LOCKED { rc = pager_open_journal(tls, pPager) if rc != SQLITE_OK { return rc } } Xsqlite3PcacheMakeDirty(tls, pPg) if (*Pager)(unsafe.Pointer(pPager)).FpInJournal != uintptr(0) && Xsqlite3BitvecTestNotNull(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal, (*PgHdr)(unsafe.Pointer(pPg)).Fpgno) == 0 { if (*PgHdr)(unsafe.Pointer(pPg)).Fpgno <= (*Pager)(unsafe.Pointer(pPager)).FdbOrigSize { rc = pagerAddPageToRollbackJournal(tls, pPg) if rc != SQLITE_OK { return rc } } else { if int32((*Pager)(unsafe.Pointer(pPager)).FeState) != PAGER_WRITER_DBMOD { *(*U16)(unsafe.Pointer(pPg + 52)) |= U16(PGHDR_NEED_SYNC) } } } *(*U16)(unsafe.Pointer(pPg + 52)) |= U16(PGHDR_WRITEABLE) if (*Pager)(unsafe.Pointer(pPager)).FnSavepoint > 0 { rc = subjournalPageIfRequired(tls, pPg) } if (*Pager)(unsafe.Pointer(pPager)).FdbSize < (*PgHdr)(unsafe.Pointer(pPg)).Fpgno { (*Pager)(unsafe.Pointer(pPager)).FdbSize = (*PgHdr)(unsafe.Pointer(pPg)).Fpgno } return rc } func pagerWriteLargeSector(tls *libc.TLS, pPg uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var nPageCount Pgno var pg1 Pgno var nPage int32 = 0 var ii int32 var needSync int32 = 0 var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager var nPagePerSector Pgno = Pgno(I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) / (*Pager)(unsafe.Pointer(pPager)).FpageSize) *(*U8)(unsafe.Pointer(pPager + 25)) |= U8(SPILLFLAG_NOSYNC) pg1 = ((*PgHdr)(unsafe.Pointer(pPg)).Fpgno-Pgno(1)) & ^(nPagePerSector-Pgno(1)) + Pgno(1) nPageCount = (*Pager)(unsafe.Pointer(pPager)).FdbSize if (*PgHdr)(unsafe.Pointer(pPg)).Fpgno > nPageCount { nPage = int32((*PgHdr)(unsafe.Pointer(pPg)).Fpgno - pg1 + Pgno(1)) } else if pg1+nPagePerSector-Pgno(1) > nPageCount { nPage = int32(nPageCount + Pgno(1) - pg1) } else { nPage = int32(nPagePerSector) } for ii = 0; ii < nPage && rc == SQLITE_OK; ii++ { var pg Pgno = pg1 + Pgno(ii) if pg == (*PgHdr)(unsafe.Pointer(pPg)).Fpgno || !(Xsqlite3BitvecTest(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal, pg) != 0) { if pg != (*Pager)(unsafe.Pointer(pPager)).FlckPgno { rc = Xsqlite3PagerGet(tls, pPager, pg, bp, 0) if rc == SQLITE_OK { rc = pager_write(tls, *(*uintptr)(unsafe.Pointer(bp))) if int32((*PgHdr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fflags)&PGHDR_NEED_SYNC != 0 { needSync = 1 } Xsqlite3PagerUnrefNotNull(tls, *(*uintptr)(unsafe.Pointer(bp))) } } } else if libc.AssignPtrUintptr(bp, Xsqlite3PagerLookup(tls, pPager, pg)) != uintptr(0) { if int32((*PgHdr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fflags)&PGHDR_NEED_SYNC != 0 { needSync = 1 } Xsqlite3PagerUnrefNotNull(tls, *(*uintptr)(unsafe.Pointer(bp))) } } if rc == SQLITE_OK && needSync != 0 { for ii = 0; ii < nPage; ii++ { var pPage uintptr = Xsqlite3PagerLookup(tls, pPager, pg1+Pgno(ii)) if pPage != 0 { *(*U16)(unsafe.Pointer(pPage + 52)) |= U16(PGHDR_NEED_SYNC) Xsqlite3PagerUnrefNotNull(tls, pPage) } } } *(*U8)(unsafe.Pointer(pPager + 25)) &= libc.Uint8FromInt32(libc.CplInt32(SPILLFLAG_NOSYNC)) return rc } // Mark a data page as writeable. This routine must be called before // making changes to a page. The caller must check the return value // of this function and be careful not to change any page data unless // this routine returns SQLITE_OK. // // The difference between this function and pager_write() is that this // function also deals with the special case where 2 or more pages // fit on a single disk sector. In this case all co-resident pages // must have been written to the journal file before returning. // // If an error occurs, SQLITE_NOMEM or an IO error code is returned // as appropriate. Otherwise, SQLITE_OK. func Xsqlite3PagerWrite(tls *libc.TLS, pPg uintptr) int32 { var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager if int32((*PgHdr)(unsafe.Pointer(pPg)).Fflags)&PGHDR_WRITEABLE != 0 && (*Pager)(unsafe.Pointer(pPager)).FdbSize >= (*PgHdr)(unsafe.Pointer(pPg)).Fpgno { if (*Pager)(unsafe.Pointer(pPager)).FnSavepoint != 0 { return subjournalPageIfRequired(tls, pPg) } return SQLITE_OK } else if (*Pager)(unsafe.Pointer(pPager)).FerrCode != 0 { return (*Pager)(unsafe.Pointer(pPager)).FerrCode } else if (*Pager)(unsafe.Pointer(pPager)).FsectorSize > U32((*Pager)(unsafe.Pointer(pPager)).FpageSize) { return pagerWriteLargeSector(tls, pPg) } else { return pager_write(tls, pPg) } return int32(0) } // A call to this routine tells the pager that it is not necessary to // write the information on page pPg back to the disk, even though // that page might be marked as dirty. This happens, for example, when // the page has been added as a leaf of the freelist and so its // content no longer matters. // // The overlying software layer calls this routine when all of the data // on the given page is unused. The pager marks the page as clean so // that it does not get written to disk. // // Tests show that this optimization can quadruple the speed of large // DELETE operations. // // This optimization cannot be used with a temp-file, as the page may // have been dirty at the start of the transaction. In that case, if // memory pressure forces page pPg out of the cache, the data does need // to be written out to disk so that it may be read back in if the // current transaction is rolled back. func Xsqlite3PagerDontWrite(tls *libc.TLS, pPg uintptr) { var pPager uintptr = (*PgHdr)(unsafe.Pointer(pPg)).FpPager if !(int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) != 0) && int32((*PgHdr)(unsafe.Pointer(pPg)).Fflags)&PGHDR_DIRTY != 0 && (*Pager)(unsafe.Pointer(pPager)).FnSavepoint == 0 { *(*U16)(unsafe.Pointer(pPg + 52)) |= U16(PGHDR_DONT_WRITE) *(*U16)(unsafe.Pointer(pPg + 52)) &= libc.Uint16FromInt32(libc.CplInt32(PGHDR_WRITEABLE)) } } func pager_incr_changecounter(tls *libc.TLS, pPager uintptr, isDirectMode int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK _ = isDirectMode if !(int32((*Pager)(unsafe.Pointer(pPager)).FchangeCountDone) != 0) && (*Pager)(unsafe.Pointer(pPager)).FdbSize > Pgno(0) { rc = Xsqlite3PagerGet(tls, pPager, uint32(1), bp, 0) if !(0 != 0) && rc == SQLITE_OK { rc = Xsqlite3PagerWrite(tls, *(*uintptr)(unsafe.Pointer(bp))) } if rc == SQLITE_OK { pager_write_changecounter(tls, *(*uintptr)(unsafe.Pointer(bp))) if 0 != 0 { var zBuf uintptr zBuf = (*PgHdr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpData if rc == SQLITE_OK { rc = Xsqlite3OsWrite(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, zBuf, int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), int64(0)) *(*int32)(unsafe.Pointer(pPager + 248 + 2*4))++ } if rc == SQLITE_OK { var pCopy uintptr = zBuf + 24 libc.Xmemcpy(tls, pPager+136, pCopy, uint64(unsafe.Sizeof([16]int8{}))) (*Pager)(unsafe.Pointer(pPager)).FchangeCountDone = U8(1) } } else { (*Pager)(unsafe.Pointer(pPager)).FchangeCountDone = U8(1) } } Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) } return rc } // Sync the database file to disk. This is a no-op for in-memory databases // or pages with the Pager.noSync flag set. // // If successful, or if called on a pager for which it is a no-op, this // function returns SQLITE_OK. Otherwise, an IO error code is returned. func Xsqlite3PagerSync(tls *libc.TLS, pPager uintptr, zSuper uintptr) int32 { var rc int32 = SQLITE_OK var pArg uintptr = zSuper rc = Xsqlite3OsFileControl(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, SQLITE_FCNTL_SYNC, pArg) if rc == SQLITE_NOTFOUND { rc = SQLITE_OK } if rc == SQLITE_OK && !(int32((*Pager)(unsafe.Pointer(pPager)).FnoSync) != 0) { rc = Xsqlite3OsSync(tls, (*Pager)(unsafe.Pointer(pPager)).Ffd, int32((*Pager)(unsafe.Pointer(pPager)).FsyncFlags)) } return rc } // This function may only be called while a write-transaction is active in // rollback. If the connection is in WAL mode, this call is a no-op. // Otherwise, if the connection does not already have an EXCLUSIVE lock on // the database file, an attempt is made to obtain one. // // If the EXCLUSIVE lock is already held or the attempt to obtain it is // successful, or the connection is in WAL mode, SQLITE_OK is returned. // Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is // returned. func Xsqlite3PagerExclusiveLock(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = (*Pager)(unsafe.Pointer(pPager)).FerrCode if rc == SQLITE_OK { if 0 == libc.Bool32((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0)) { rc = pager_wait_on_lock(tls, pPager, EXCLUSIVE_LOCK) } } return rc } // Sync the database file for the pager pPager. zSuper points to the name // of a super-journal file that should be written into the individual // journal file. zSuper may be NULL, which is interpreted as no // super-journal (a single database transaction). // // This routine ensures that: // // - The database file change-counter is updated, // - the journal is synced (unless the atomic-write optimization is used), // - all dirty pages are written to the database file, // - the database file is truncated (if required), and // - the database file synced. // // The only thing that remains to commit the transaction is to finalize // (delete, truncate or zero the first part of) the journal file (or // delete the super-journal file if specified). // // Note that if zSuper==NULL, this does not overwrite a previous value // passed to an sqlite3PagerCommitPhaseOne() call. // // If the final parameter - noSync - is true, then the database file itself // is not synced. The caller must call sqlite3PagerSync() directly to // sync the database file before calling CommitPhaseTwo() to delete the // journal file in this case. func Xsqlite3PagerCommitPhaseOne(tls *libc.TLS, pPager uintptr, zSuper uintptr, noSync int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var nNew Pgno var pList uintptr rc = SQLITE_OK if !((*Pager)(unsafe.Pointer(pPager)).FerrCode != 0) { goto __1 } return (*Pager)(unsafe.Pointer(pPager)).FerrCode __1: ; if !(Xsqlite3FaultSim(tls, 400) != 0) { goto __2 } return SQLITE_IOERR __2: ; if !(int32((*Pager)(unsafe.Pointer(pPager)).FeState) < PAGER_WRITER_CACHEMOD) { goto __3 } return SQLITE_OK __3: ; if !(0 == pagerFlushOnCommit(tls, pPager, 1)) { goto __4 } Xsqlite3BackupRestart(tls, (*Pager)(unsafe.Pointer(pPager)).FpBackup) goto __5 __4: if !((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0)) { goto __6 } *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) pList = Xsqlite3PcacheDirtyList(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) if !(pList == uintptr(0)) { goto __8 } rc = Xsqlite3PagerGet(tls, pPager, uint32(1), bp, 0) pList = *(*uintptr)(unsafe.Pointer(bp)) (*PgHdr)(unsafe.Pointer(pList)).FpDirty = uintptr(0) __8: ; if !(pList != 0) { goto __9 } rc = pagerWalFrames(tls, pPager, pList, (*Pager)(unsafe.Pointer(pPager)).FdbSize, 1) __9: ; Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) if !(rc == SQLITE_OK) { goto __10 } Xsqlite3PcacheCleanAll(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) __10: ; goto __7 __6: rc = pager_incr_changecounter(tls, pPager, 0) if !(rc != SQLITE_OK) { goto __11 } goto commit_phase_one_exit __11: ; rc = writeSuperJournal(tls, pPager, zSuper) if !(rc != SQLITE_OK) { goto __12 } goto commit_phase_one_exit __12: ; rc = syncJournal(tls, pPager, 0) if !(rc != SQLITE_OK) { goto __13 } goto commit_phase_one_exit __13: ; pList = Xsqlite3PcacheDirtyList(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) if !(BBatch == 0) { goto __14 } rc = pager_write_pagelist(tls, pPager, pList) __14: ; if !(rc != SQLITE_OK) { goto __15 } goto commit_phase_one_exit __15: ; Xsqlite3PcacheCleanAll(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache) if !((*Pager)(unsafe.Pointer(pPager)).FdbSize > (*Pager)(unsafe.Pointer(pPager)).FdbFileSize) { goto __16 } nNew = (*Pager)(unsafe.Pointer(pPager)).FdbSize - Pgno(libc.Bool32((*Pager)(unsafe.Pointer(pPager)).FdbSize == (*Pager)(unsafe.Pointer(pPager)).FlckPgno)) rc = pager_truncate(tls, pPager, nNew) if !(rc != SQLITE_OK) { goto __17 } goto commit_phase_one_exit __17: ; __16: ; if !!(noSync != 0) { goto __18 } rc = Xsqlite3PagerSync(tls, pPager, zSuper) __18: ; __7: ; __5: ; commit_phase_one_exit: if !(rc == SQLITE_OK && !((*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0))) { goto __19 } (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_WRITER_FINISHED) __19: ; return rc } // When this function is called, the database file has been completely // updated to reflect the changes made by the current transaction and // synced to disk. The journal file still exists in the file-system // though, and if a failure occurs at this point it will eventually // be used as a hot-journal and the current transaction rolled back. // // This function finalizes the journal file, either by deleting, // truncating or partially zeroing it, so that it cannot be used // for hot-journal rollback. Once this is done the transaction is // irrevocably committed. // // If an error occurs, an IO error code is returned and the pager // moves into the error state. Otherwise, SQLITE_OK is returned. func Xsqlite3PagerCommitPhaseTwo(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = SQLITE_OK if (*Pager)(unsafe.Pointer(pPager)).FerrCode != 0 { return (*Pager)(unsafe.Pointer(pPager)).FerrCode } (*Pager)(unsafe.Pointer(pPager)).FiDataVersion++ if int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_WRITER_LOCKED && (*Pager)(unsafe.Pointer(pPager)).FexclusiveMode != 0 && int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_PERSIST { (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_READER) return SQLITE_OK } rc = pager_end_transaction(tls, pPager, int32((*Pager)(unsafe.Pointer(pPager)).FsetSuper), 1) return pager_error(tls, pPager, rc) } // If a write transaction is open, then all changes made within the // transaction are reverted and the current write-transaction is closed. // The pager falls back to PAGER_READER state if successful, or PAGER_ERROR // state if an error occurs. // // If the pager is already in PAGER_ERROR state when this function is called, // it returns Pager.errCode immediately. No work is performed in this case. // // Otherwise, in rollback mode, this function performs two functions: // // 1. It rolls back the journal file, restoring all database file and // in-memory cache pages to the state they were in when the transaction // was opened, and // // 2. It finalizes the journal file, so that it is not used for hot // rollback at any point in the future. // // Finalization of the journal file (task 2) is only performed if the // rollback is successful. // // In WAL mode, all cache-entries containing data modified within the // current transaction are either expelled from the cache or reverted to // their pre-transaction state by re-reading data from the database or // WAL files. The WAL transaction is then closed. func Xsqlite3PagerRollback(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = SQLITE_OK if int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_ERROR { return (*Pager)(unsafe.Pointer(pPager)).FerrCode } if int32((*Pager)(unsafe.Pointer(pPager)).FeState) <= PAGER_READER { return SQLITE_OK } if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { var rc2 int32 rc = Xsqlite3PagerSavepoint(tls, pPager, SAVEPOINT_ROLLBACK, -1) rc2 = pager_end_transaction(tls, pPager, int32((*Pager)(unsafe.Pointer(pPager)).FsetSuper), 0) if rc == SQLITE_OK { rc = rc2 } } else if !((*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0)) || int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_WRITER_LOCKED { var eState int32 = int32((*Pager)(unsafe.Pointer(pPager)).FeState) rc = pager_end_transaction(tls, pPager, 0, 0) if !(int32((*Pager)(unsafe.Pointer(pPager)).FmemDb) != 0) && eState > PAGER_WRITER_LOCKED { (*Pager)(unsafe.Pointer(pPager)).FerrCode = SQLITE_ABORT (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_ERROR) setGetterMethod(tls, pPager) return rc } } else { rc = pager_playback(tls, pPager, 0) } return pager_error(tls, pPager, rc) } // Return TRUE if the database file is opened read-only. Return FALSE // if the database is (in theory) writable. func Xsqlite3PagerIsreadonly(tls *libc.TLS, pPager uintptr) U8 { return (*Pager)(unsafe.Pointer(pPager)).FreadOnly } // Return the approximate number of bytes of memory currently // used by the pager and its associated cache. func Xsqlite3PagerMemUsed(tls *libc.TLS, pPager uintptr) int32 { var perPageSize int32 = int32((*Pager)(unsafe.Pointer(pPager)).FpageSize + I64((*Pager)(unsafe.Pointer(pPager)).FnExtra) + I64(int32(uint64(unsafe.Sizeof(PgHdr{}))+uint64(5)*uint64(unsafe.Sizeof(uintptr(0)))))) return int32(I64(perPageSize*Xsqlite3PcachePagecount(tls, (*Pager)(unsafe.Pointer(pPager)).FpPCache)+ Xsqlite3MallocSize(tls, pPager)) + (*Pager)(unsafe.Pointer(pPager)).FpageSize) } // Return the number of references to the specified page. func Xsqlite3PagerPageRefcount(tls *libc.TLS, pPage uintptr) int32 { return int32(Xsqlite3PcachePageRefcount(tls, pPage)) } // Parameter eStat must be one of SQLITE_DBSTATUS_CACHE_HIT, _MISS, _WRITE, // or _WRITE+1. The SQLITE_DBSTATUS_CACHE_WRITE+1 case is a translation // of SQLITE_DBSTATUS_CACHE_SPILL. The _SPILL case is not contiguous because // it was added later. // // Before returning, *pnVal is incremented by the // current cache hit or miss count, according to the value of eStat. If the // reset parameter is non-zero, the cache hit or miss count is zeroed before // returning. func Xsqlite3PagerCacheStat(tls *libc.TLS, pPager uintptr, eStat int32, reset int32, pnVal uintptr) { eStat = eStat - SQLITE_DBSTATUS_CACHE_HIT *(*int32)(unsafe.Pointer(pnVal)) += *(*int32)(unsafe.Pointer(pPager + 248 + uintptr(eStat)*4)) if reset != 0 { *(*int32)(unsafe.Pointer(pPager + 248 + uintptr(eStat)*4)) = 0 } } // Return true if this is an in-memory or temp-file backed pager. func Xsqlite3PagerIsMemdb(tls *libc.TLS, pPager uintptr) int32 { return libc.Bool32((*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 || (*Pager)(unsafe.Pointer(pPager)).FmemVfs != 0) } func pagerOpenSavepoint(tls *libc.TLS, pPager uintptr, nSavepoint int32) int32 { var rc int32 = SQLITE_OK var nCurrent int32 = (*Pager)(unsafe.Pointer(pPager)).FnSavepoint var ii int32 var aNew uintptr aNew = Xsqlite3Realloc(tls, (*Pager)(unsafe.Pointer(pPager)).FaSavepoint, uint64(unsafe.Sizeof(PagerSavepoint{}))*uint64(nSavepoint)) if !(aNew != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, aNew+uintptr(nCurrent)*56, 0, uint64(nSavepoint-nCurrent)*uint64(unsafe.Sizeof(PagerSavepoint{}))) (*Pager)(unsafe.Pointer(pPager)).FaSavepoint = aNew for ii = nCurrent; ii < nSavepoint; ii++ { (*PagerSavepoint)(unsafe.Pointer(aNew + uintptr(ii)*56)).FnOrig = (*Pager)(unsafe.Pointer(pPager)).FdbSize if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0) && (*Pager)(unsafe.Pointer(pPager)).FjournalOff > int64(0) { (*PagerSavepoint)(unsafe.Pointer(aNew + uintptr(ii)*56)).FiOffset = (*Pager)(unsafe.Pointer(pPager)).FjournalOff } else { (*PagerSavepoint)(unsafe.Pointer(aNew + uintptr(ii)*56)).FiOffset = I64((*Pager)(unsafe.Pointer(pPager)).FsectorSize) } (*PagerSavepoint)(unsafe.Pointer(aNew + uintptr(ii)*56)).FiSubRec = (*Pager)(unsafe.Pointer(pPager)).FnSubRec (*PagerSavepoint)(unsafe.Pointer(aNew + uintptr(ii)*56)).FpInSavepoint = Xsqlite3BitvecCreate(tls, (*Pager)(unsafe.Pointer(pPager)).FdbSize) (*PagerSavepoint)(unsafe.Pointer(aNew + uintptr(ii)*56)).FbTruncateOnRelease = 1 if !(int32((*PagerSavepoint)(unsafe.Pointer(aNew+uintptr(ii)*56)).FpInSavepoint) != 0) { return SQLITE_NOMEM } if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) { Xsqlite3WalSavepoint(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, aNew+uintptr(ii)*56+36) } (*Pager)(unsafe.Pointer(pPager)).FnSavepoint = ii + 1 } return rc } func Xsqlite3PagerOpenSavepoint(tls *libc.TLS, pPager uintptr, nSavepoint int32) int32 { if nSavepoint > (*Pager)(unsafe.Pointer(pPager)).FnSavepoint && (*Pager)(unsafe.Pointer(pPager)).FuseJournal != 0 { return pagerOpenSavepoint(tls, pPager, nSavepoint) } else { return SQLITE_OK } return int32(0) } // This function is called to rollback or release (commit) a savepoint. // The savepoint to release or rollback need not be the most recently // created savepoint. // // Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE. // If it is SAVEPOINT_RELEASE, then release and destroy the savepoint with // index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes // that have occurred since the specified savepoint was created. // // The savepoint to rollback or release is identified by parameter // iSavepoint. A value of 0 means to operate on the outermost savepoint // (the first created). A value of (Pager.nSavepoint-1) means operate // on the most recently created savepoint. If iSavepoint is greater than // (Pager.nSavepoint-1), then this function is a no-op. // // If a negative value is passed to this function, then the current // transaction is rolled back. This is different to calling // sqlite3PagerRollback() because this function does not terminate // the transaction or unlock the database, it just restores the // contents of the database to its original state. // // In any case, all savepoints with an index greater than iSavepoint // are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE), // then savepoint iSavepoint is also destroyed. // // This function may return SQLITE_NOMEM if a memory allocation fails, // or an IO error code if an IO error occurs while rolling back a // savepoint. If no errors occur, SQLITE_OK is returned. func Xsqlite3PagerSavepoint(tls *libc.TLS, pPager uintptr, op int32, iSavepoint int32) int32 { var rc int32 = (*Pager)(unsafe.Pointer(pPager)).FerrCode if rc == SQLITE_OK && iSavepoint < (*Pager)(unsafe.Pointer(pPager)).FnSavepoint { var ii int32 var nNew int32 nNew = iSavepoint + func() int32 { if op == SAVEPOINT_RELEASE { return 0 } return 1 }() for ii = nNew; ii < (*Pager)(unsafe.Pointer(pPager)).FnSavepoint; ii++ { Xsqlite3BitvecDestroy(tls, (*PagerSavepoint)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).FaSavepoint+uintptr(ii)*56)).FpInSavepoint) } (*Pager)(unsafe.Pointer(pPager)).FnSavepoint = nNew if op == SAVEPOINT_RELEASE { var pRel uintptr = (*Pager)(unsafe.Pointer(pPager)).FaSavepoint + uintptr(nNew)*56 if (*PagerSavepoint)(unsafe.Pointer(pRel)).FbTruncateOnRelease != 0 && (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fsjfd)).FpMethods != uintptr(0) { if Xsqlite3JournalIsInMemory(tls, (*Pager)(unsafe.Pointer(pPager)).Fsjfd) != 0 { var sz I64 = ((*Pager)(unsafe.Pointer(pPager)).FpageSize + int64(4)) * I64((*PagerSavepoint)(unsafe.Pointer(pRel)).FiSubRec) rc = Xsqlite3OsTruncate(tls, (*Pager)(unsafe.Pointer(pPager)).Fsjfd, sz) } (*Pager)(unsafe.Pointer(pPager)).FnSubRec = (*PagerSavepoint)(unsafe.Pointer(pRel)).FiSubRec } } else if (*Pager)(unsafe.Pointer(pPager)).FpWal != uintptr(0) || (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0) { var pSavepoint uintptr if nNew == 0 { pSavepoint = uintptr(0) } else { pSavepoint = (*Pager)(unsafe.Pointer(pPager)).FaSavepoint + uintptr(nNew-1)*56 } rc = pagerPlaybackSavepoint(tls, pPager, pSavepoint) } } return rc } // Return the full pathname of the database file. // // Except, if the pager is in-memory only, then return an empty string if // nullIfMemDb is true. This routine is called with nullIfMemDb==1 when // used to report the filename to the user, for compatibility with legacy // behavior. But when the Btree needs to know the filename for matching to // shared cache, it uses nullIfMemDb==0 so that in-memory databases can // participate in shared-cache. // // The return value to this routine is always safe to use with // sqlite3_uri_parameter() and sqlite3_filename_database() and friends. func Xsqlite3PagerFilename(tls *libc.TLS, pPager uintptr, nullIfMemDb int32) uintptr { if nullIfMemDb != 0 && ((*Pager)(unsafe.Pointer(pPager)).FmemDb != 0 || Xsqlite3IsMemdb(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs) != 0) { return uintptr(unsafe.Pointer(&zFake)) + 4 } else { return (*Pager)(unsafe.Pointer(pPager)).FzFilename } return uintptr(0) } var zFake = [8]int8{int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0)} // Return the VFS structure for the pager. func Xsqlite3PagerVfs(tls *libc.TLS, pPager uintptr) uintptr { return (*Pager)(unsafe.Pointer(pPager)).FpVfs } // Return the file handle for the database file associated // with the pager. This might return NULL if the file has // not yet been opened. func Xsqlite3PagerFile(tls *libc.TLS, pPager uintptr) uintptr { return (*Pager)(unsafe.Pointer(pPager)).Ffd } // Return the file handle for the journal file (if it exists). // This will be either the rollback journal or the WAL file. func Xsqlite3PagerJrnlFile(tls *libc.TLS, pPager uintptr) uintptr { if (*Pager)(unsafe.Pointer(pPager)).FpWal != 0 { return Xsqlite3WalFile(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) } return (*Pager)(unsafe.Pointer(pPager)).Fjfd } // Return the full pathname of the journal file. func Xsqlite3PagerJournalname(tls *libc.TLS, pPager uintptr) uintptr { return (*Pager)(unsafe.Pointer(pPager)).FzJournal } // Move the page pPg to location pgno in the file. // // There must be no references to the page previously located at // pgno (which we call pPgOld) though that page is allowed to be // in cache. If the page previously located at pgno is not already // in the rollback journal, it is not put there by by this routine. // // References to the page pPg remain valid. Updating any // meta-data associated with pPg (i.e. data stored in the nExtra bytes // allocated along with the page) is the responsibility of the caller. // // A transaction must be active when this routine is called. It used to be // required that a statement transaction was not active, but this restriction // has been removed (CREATE INDEX needs to move a page when a statement // transaction is active). // // If the fourth argument, isCommit, is non-zero, then this page is being // moved as part of a database reorganization just before the transaction // is being committed. In this case, it is guaranteed that the database page // pPg refers to will not be written to again within this transaction. // // This function may return SQLITE_NOMEM or an IO error code if an error // occurs. Otherwise, it returns SQLITE_OK. func Xsqlite3PagerMovepage(tls *libc.TLS, pPager uintptr, pPg uintptr, pgno Pgno, isCommit int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pPgOld uintptr var needSyncPgno Pgno = Pgno(0) var rc int32 var origPgno Pgno if (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 { rc = Xsqlite3PagerWrite(tls, pPg) if rc != 0 { return rc } } if int32((*DbPage)(unsafe.Pointer(pPg)).Fflags)&PGHDR_DIRTY != 0 && SQLITE_OK != libc.AssignInt32(&rc, subjournalPageIfRequired(tls, pPg)) { return rc } if int32((*DbPage)(unsafe.Pointer(pPg)).Fflags)&PGHDR_NEED_SYNC != 0 && !(isCommit != 0) { needSyncPgno = (*DbPage)(unsafe.Pointer(pPg)).Fpgno } *(*U16)(unsafe.Pointer(pPg + 52)) &= libc.Uint16FromInt32(libc.CplInt32(PGHDR_NEED_SYNC)) pPgOld = Xsqlite3PagerLookup(tls, pPager, pgno) if pPgOld != 0 { if (*PgHdr)(unsafe.Pointer(pPgOld)).FnRef > int64(1) { Xsqlite3PagerUnrefNotNull(tls, pPgOld) return Xsqlite3CorruptError(tls, 62627) } *(*U16)(unsafe.Pointer(pPg + 52)) |= U16(int32((*PgHdr)(unsafe.Pointer(pPgOld)).Fflags) & PGHDR_NEED_SYNC) if (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 { Xsqlite3PcacheMove(tls, pPgOld, (*Pager)(unsafe.Pointer(pPager)).FdbSize+Pgno(1)) } else { Xsqlite3PcacheDrop(tls, pPgOld) } } origPgno = (*DbPage)(unsafe.Pointer(pPg)).Fpgno Xsqlite3PcacheMove(tls, pPg, pgno) Xsqlite3PcacheMakeDirty(tls, pPg) if (*Pager)(unsafe.Pointer(pPager)).FtempFile != 0 && pPgOld != 0 { Xsqlite3PcacheMove(tls, pPgOld, origPgno) Xsqlite3PagerUnrefNotNull(tls, pPgOld) } if needSyncPgno != 0 { rc = Xsqlite3PagerGet(tls, pPager, needSyncPgno, bp, 0) if rc != SQLITE_OK { if needSyncPgno <= (*Pager)(unsafe.Pointer(pPager)).FdbOrigSize { Xsqlite3BitvecClear(tls, (*Pager)(unsafe.Pointer(pPager)).FpInJournal, needSyncPgno, (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace) } return rc } *(*U16)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)) + 52)) |= U16(PGHDR_NEED_SYNC) Xsqlite3PcacheMakeDirty(tls, *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3PagerUnrefNotNull(tls, *(*uintptr)(unsafe.Pointer(bp))) } return SQLITE_OK } // The page handle passed as the first argument refers to a dirty page // with a page number other than iNew. This function changes the page's // page number to iNew and sets the value of the PgHdr.flags field to // the value passed as the third parameter. func Xsqlite3PagerRekey(tls *libc.TLS, pPg uintptr, iNew Pgno, flags U16) { (*DbPage)(unsafe.Pointer(pPg)).Fflags = flags Xsqlite3PcacheMove(tls, pPg, iNew) } // Return a pointer to the data for the specified page. func Xsqlite3PagerGetData(tls *libc.TLS, pPg uintptr) uintptr { return (*DbPage)(unsafe.Pointer(pPg)).FpData } // Return a pointer to the Pager.nExtra bytes of "extra" space // allocated along with the specified page. func Xsqlite3PagerGetExtra(tls *libc.TLS, pPg uintptr) uintptr { return (*DbPage)(unsafe.Pointer(pPg)).FpExtra } // Get/set the locking-mode for this pager. Parameter eMode must be one // of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or // PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then // the locking-mode is set to the value specified. // // The returned value is either PAGER_LOCKINGMODE_NORMAL or // PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated) // locking-mode. func Xsqlite3PagerLockingMode(tls *libc.TLS, pPager uintptr, eMode int32) int32 { if eMode >= 0 && !(int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) != 0) && !(Xsqlite3WalHeapMemory(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) != 0) { (*Pager)(unsafe.Pointer(pPager)).FexclusiveMode = U8(eMode) } return int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) } // Set the journal-mode for this pager. Parameter eMode must be one of: // // PAGER_JOURNALMODE_DELETE // PAGER_JOURNALMODE_TRUNCATE // PAGER_JOURNALMODE_PERSIST // PAGER_JOURNALMODE_OFF // PAGER_JOURNALMODE_MEMORY // PAGER_JOURNALMODE_WAL // // The journalmode is set to the value specified if the change is allowed. // The change may be disallowed for the following reasons: // // - An in-memory database can only have its journal_mode set to _OFF // or _MEMORY. // // - Temporary databases cannot have _WAL journalmode. // // The returned indicate the current (possibly updated) journal-mode. func Xsqlite3PagerSetJournalMode(tls *libc.TLS, pPager uintptr, eMode int32) int32 { var eOld U8 = (*Pager)(unsafe.Pointer(pPager)).FjournalMode if (*Pager)(unsafe.Pointer(pPager)).FmemDb != 0 { if eMode != PAGER_JOURNALMODE_MEMORY && eMode != PAGER_JOURNALMODE_OFF { eMode = int32(eOld) } } if eMode != int32(eOld) { (*Pager)(unsafe.Pointer(pPager)).FjournalMode = U8(eMode) if !(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) && int32(eOld)&5 == 1 && eMode&1 == 0 { Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) if int32((*Pager)(unsafe.Pointer(pPager)).FeLock) >= RESERVED_LOCK { Xsqlite3OsDelete(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, 0) } else { var rc int32 = SQLITE_OK var state int32 = int32((*Pager)(unsafe.Pointer(pPager)).FeState) if state == PAGER_OPEN { rc = Xsqlite3PagerSharedLock(tls, pPager) } if int32((*Pager)(unsafe.Pointer(pPager)).FeState) == PAGER_READER { rc = pagerLockDb(tls, pPager, RESERVED_LOCK) } if rc == SQLITE_OK { Xsqlite3OsDelete(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, (*Pager)(unsafe.Pointer(pPager)).FzJournal, 0) } if rc == SQLITE_OK && state == PAGER_READER { pagerUnlockDb(tls, pPager, SHARED_LOCK) } else if state == PAGER_OPEN { pager_unlock(tls, pPager) } } } else if eMode == PAGER_JOURNALMODE_OFF { Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) } } return int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) } // Return the current journal mode. func Xsqlite3PagerGetJournalMode(tls *libc.TLS, pPager uintptr) int32 { return int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) } // Return TRUE if the pager is in a state where it is OK to change the // journalmode. Journalmode changes can only happen when the database // is unmodified. func Xsqlite3PagerOkToChangeJournalMode(tls *libc.TLS, pPager uintptr) int32 { if int32((*Pager)(unsafe.Pointer(pPager)).FeState) >= PAGER_WRITER_CACHEMOD { return 0 } if (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Fjfd)).FpMethods != uintptr(0) && (*Pager)(unsafe.Pointer(pPager)).FjournalOff > int64(0) { return 0 } return 1 } // Get/set the size-limit used for persistent journal files. // // Setting the size limit to -1 means no limit is enforced. // An attempt to set a limit smaller than -1 is a no-op. func Xsqlite3PagerJournalSizeLimit(tls *libc.TLS, pPager uintptr, iLimit I64) I64 { if iLimit >= int64(-1) { (*Pager)(unsafe.Pointer(pPager)).FjournalSizeLimit = iLimit Xsqlite3WalLimit(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, iLimit) } return (*Pager)(unsafe.Pointer(pPager)).FjournalSizeLimit } // Return a pointer to the pPager->pBackup variable. The backup module // in backup.c maintains the content of this variable. This module // uses it opaquely as an argument to sqlite3BackupRestart() and // sqlite3BackupUpdate() only. func Xsqlite3PagerBackupPtr(tls *libc.TLS, pPager uintptr) uintptr { return pPager + 112 } // Unless this is an in-memory or temporary database, clear the pager cache. func Xsqlite3PagerClearCache(tls *libc.TLS, pPager uintptr) { if int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) == 0 { pager_reset(tls, pPager) } } // This function is called when the user invokes "PRAGMA wal_checkpoint", // "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint() // or wal_blocking_checkpoint() API functions. // // Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. func Xsqlite3PagerCheckpoint(tls *libc.TLS, pPager uintptr, db uintptr, eMode int32, pnLog uintptr, pnCkpt uintptr) int32 { var rc int32 = SQLITE_OK if (*Pager)(unsafe.Pointer(pPager)).FpWal == uintptr(0) && int32((*Pager)(unsafe.Pointer(pPager)).FjournalMode) == PAGER_JOURNALMODE_WAL { Xsqlite3_exec(tls, db, ts+5304, uintptr(0), uintptr(0), uintptr(0)) } if (*Pager)(unsafe.Pointer(pPager)).FpWal != 0 { rc = Xsqlite3WalCheckpoint(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, db, eMode, func() uintptr { if eMode == SQLITE_CHECKPOINT_PASSIVE { return uintptr(0) } return (*Pager)(unsafe.Pointer(pPager)).FxBusyHandler }(), (*Pager)(unsafe.Pointer(pPager)).FpBusyHandlerArg, int32((*Pager)(unsafe.Pointer(pPager)).FwalSyncFlags), int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace, pnLog, pnCkpt) } return rc } func Xsqlite3PagerWalCallback(tls *libc.TLS, pPager uintptr) int32 { return Xsqlite3WalCallback(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) } // Return true if the underlying VFS for the given pager supports the // primitives necessary for write-ahead logging. func Xsqlite3PagerWalSupported(tls *libc.TLS, pPager uintptr) int32 { var pMethods uintptr = (*Sqlite3_file)(unsafe.Pointer((*Pager)(unsafe.Pointer(pPager)).Ffd)).FpMethods if (*Pager)(unsafe.Pointer(pPager)).FnoLock != 0 { return 0 } return libc.Bool32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode != 0 || (*Sqlite3_io_methods)(unsafe.Pointer(pMethods)).FiVersion >= 2 && (*Sqlite3_io_methods)(unsafe.Pointer(pMethods)).FxShmMap != 0) } func pagerExclusiveLock(tls *libc.TLS, pPager uintptr) int32 { var rc int32 rc = pagerLockDb(tls, pPager, EXCLUSIVE_LOCK) if rc != SQLITE_OK { pagerUnlockDb(tls, pPager, SHARED_LOCK) } return rc } func pagerOpenWal(tls *libc.TLS, pPager uintptr) int32 { var rc int32 = SQLITE_OK if (*Pager)(unsafe.Pointer(pPager)).FexclusiveMode != 0 { rc = pagerExclusiveLock(tls, pPager) } if rc == SQLITE_OK { rc = Xsqlite3WalOpen(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, (*Pager)(unsafe.Pointer(pPager)).Ffd, (*Pager)(unsafe.Pointer(pPager)).FzWal, int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode), (*Pager)(unsafe.Pointer(pPager)).FjournalSizeLimit, pPager+296) } pagerFixMaplimit(tls, pPager) return rc } // The caller must be holding a SHARED lock on the database file to call // this function. // // If the pager passed as the first argument is open on a real database // file (not a temp file or an in-memory database), and the WAL file // is not already open, make an attempt to open it now. If successful, // return SQLITE_OK. If an error occurs or the VFS used by the pager does // not support the xShmXXX() methods, return an error code. *pbOpen is // not modified in either case. // // If the pager is open on a temp-file (or in-memory database), or if // the WAL file is already open, set *pbOpen to 1 and return SQLITE_OK // without doing anything. func Xsqlite3PagerOpenWal(tls *libc.TLS, pPager uintptr, pbOpen uintptr) int32 { var rc int32 = SQLITE_OK if !(int32((*Pager)(unsafe.Pointer(pPager)).FtempFile) != 0) && !(int32((*Pager)(unsafe.Pointer(pPager)).FpWal) != 0) { if !(Xsqlite3PagerWalSupported(tls, pPager) != 0) { return SQLITE_CANTOPEN } Xsqlite3OsClose(tls, (*Pager)(unsafe.Pointer(pPager)).Fjfd) rc = pagerOpenWal(tls, pPager) if rc == SQLITE_OK { (*Pager)(unsafe.Pointer(pPager)).FjournalMode = U8(PAGER_JOURNALMODE_WAL) (*Pager)(unsafe.Pointer(pPager)).FeState = U8(PAGER_OPEN) } } else { *(*int32)(unsafe.Pointer(pbOpen)) = 1 } return rc } // This function is called to close the connection to the log file prior // to switching from WAL to rollback mode. // // Before closing the log file, this function attempts to take an // EXCLUSIVE lock on the database file. If this cannot be obtained, an // error (SQLITE_BUSY) is returned and the log connection is not closed. // If successful, the EXCLUSIVE lock is not released before returning. func Xsqlite3PagerCloseWal(tls *libc.TLS, pPager uintptr, db uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 = SQLITE_OK if !(int32((*Pager)(unsafe.Pointer(pPager)).FpWal) != 0) { *(*int32)(unsafe.Pointer(bp)) = 0 rc = pagerLockDb(tls, pPager, SHARED_LOCK) if rc == SQLITE_OK { rc = Xsqlite3OsAccess(tls, (*Pager)(unsafe.Pointer(pPager)).FpVfs, (*Pager)(unsafe.Pointer(pPager)).FzWal, SQLITE_ACCESS_EXISTS, bp) } if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp)) != 0 { rc = pagerOpenWal(tls, pPager) } } if rc == SQLITE_OK && (*Pager)(unsafe.Pointer(pPager)).FpWal != 0 { rc = pagerExclusiveLock(tls, pPager) if rc == SQLITE_OK { rc = Xsqlite3WalClose(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, db, int32((*Pager)(unsafe.Pointer(pPager)).FwalSyncFlags), int32((*Pager)(unsafe.Pointer(pPager)).FpageSize), (*Pager)(unsafe.Pointer(pPager)).FpTmpSpace) (*Pager)(unsafe.Pointer(pPager)).FpWal = uintptr(0) pagerFixMaplimit(tls, pPager) if rc != 0 && !(int32((*Pager)(unsafe.Pointer(pPager)).FexclusiveMode) != 0) { pagerUnlockDb(tls, pPager, SHARED_LOCK) } } } return rc } // If this is a WAL database, obtain a snapshot handle for the snapshot // currently open. Otherwise, return an error. func Xsqlite3PagerSnapshotGet(tls *libc.TLS, pPager uintptr, ppSnapshot uintptr) int32 { var rc int32 = SQLITE_ERROR if (*Pager)(unsafe.Pointer(pPager)).FpWal != 0 { rc = Xsqlite3WalSnapshotGet(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, ppSnapshot) } return rc } // If this is a WAL database, store a pointer to pSnapshot. Next time a // read transaction is opened, attempt to read from the snapshot it // identifies. If this is not a WAL database, return an error. func Xsqlite3PagerSnapshotOpen(tls *libc.TLS, pPager uintptr, pSnapshot uintptr) int32 { var rc int32 = SQLITE_OK if (*Pager)(unsafe.Pointer(pPager)).FpWal != 0 { Xsqlite3WalSnapshotOpen(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, pSnapshot) } else { rc = SQLITE_ERROR } return rc } // If this is a WAL database, call sqlite3WalSnapshotRecover(). If this // is not a WAL database, return an error. func Xsqlite3PagerSnapshotRecover(tls *libc.TLS, pPager uintptr) int32 { var rc int32 if (*Pager)(unsafe.Pointer(pPager)).FpWal != 0 { rc = Xsqlite3WalSnapshotRecover(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) } else { rc = SQLITE_ERROR } return rc } // The caller currently has a read transaction open on the database. // If this is not a WAL database, SQLITE_ERROR is returned. Otherwise, // this function takes a SHARED lock on the CHECKPOINTER slot and then // checks if the snapshot passed as the second argument is still // available. If so, SQLITE_OK is returned. // // If the snapshot is not available, SQLITE_ERROR is returned. Or, if // the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error // occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER // lock is released before returning. func Xsqlite3PagerSnapshotCheck(tls *libc.TLS, pPager uintptr, pSnapshot uintptr) int32 { var rc int32 if (*Pager)(unsafe.Pointer(pPager)).FpWal != 0 { rc = Xsqlite3WalSnapshotCheck(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal, pSnapshot) } else { rc = SQLITE_ERROR } return rc } // Release a lock obtained by an earlier successful call to // sqlite3PagerSnapshotCheck(). func Xsqlite3PagerSnapshotUnlock(tls *libc.TLS, pPager uintptr) { Xsqlite3WalSnapshotUnlock(tls, (*Pager)(unsafe.Pointer(pPager)).FpWal) } // Object declarations type WalIndexHdr1 = struct { FiVersion U32 Funused U32 FiChange U32 FisInit U8 FbigEndCksum U8 FszPage U16 FmxFrame U32 FnPage U32 FaFrameCksum [2]U32 FaSalt [2]U32 FaCksum [2]U32 } // Object declarations type WalIndexHdr = WalIndexHdr1 type WalIterator1 = struct { FiPrior U32 FnSegment int32 FaSegment [1]struct { FiNext int32 F__ccgo_pad1 [4]byte FaIndex uintptr FaPgno uintptr FnEntry int32 FiZero int32 } } type WalIterator = WalIterator1 type WalCkptInfo1 = struct { FnBackfill U32 FaReadMark [5]U32 FaLock [8]U8 FnBackfillAttempted U32 FnotUsed0 U32 } type WalCkptInfo = WalCkptInfo1 // Each page of the wal-index mapping contains a hash-table made up of // an array of HASHTABLE_NSLOT elements of the following type. type Ht_slot = U16 // This structure is used to implement an iterator that loops through // all frames in the WAL in database page order. Where two or more frames // correspond to the same database page, the iterator visits only the // frame most recently written to the WAL (in other words, the frame with // the largest index). // // The internals of this structure are only accessed by: // // walIteratorInit() - Create a new iterator, // walIteratorNext() - Step an iterator, // walIteratorFree() - Free an iterator. // // This functionality is used by the checkpoint code (see walCheckpoint()). type WalSegment = struct { FiNext int32 F__ccgo_pad1 [4]byte FaIndex uintptr FaPgno uintptr FnEntry int32 FiZero int32 } func walIndexPageRealloc(tls *libc.TLS, pWal uintptr, iPage int32, ppPage uintptr) int32 { var rc int32 = SQLITE_OK if (*Wal)(unsafe.Pointer(pWal)).FnWiData <= iPage { var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(uintptr(0))) * uint64(iPage+1)) var apNew uintptr libc.AtomicStoreUintptr(&apNew, Xsqlite3Realloc(tls, (*Wal)(unsafe.Pointer(pWal)).FapWiData, uint64(nByte))) if !(apNew != 0) { *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) return SQLITE_NOMEM } libc.Xmemset(tls, apNew+uintptr((*Wal)(unsafe.Pointer(pWal)).FnWiData)*8, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64(iPage+1-(*Wal)(unsafe.Pointer(pWal)).FnWiData)) (*Wal)(unsafe.Pointer(pWal)).FapWiData = apNew (*Wal)(unsafe.Pointer(pWal)).FnWiData = iPage + 1 } if int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) == WAL_HEAPMEMORY_MODE { *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(iPage)*8)) = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(Ht_slot(0)))*uint64(HASHTABLE_NPAGE*2)+uint64(HASHTABLE_NPAGE)*uint64(unsafe.Sizeof(U32(0)))) if !(int32(*(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(iPage)*8))) != 0) { rc = SQLITE_NOMEM } } else { rc = Xsqlite3OsShmMap(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, iPage, int32(uint64(unsafe.Sizeof(Ht_slot(0)))*uint64(HASHTABLE_NPAGE*2)+uint64(HASHTABLE_NPAGE)*uint64(unsafe.Sizeof(U32(0)))), int32((*Wal)(unsafe.Pointer(pWal)).FwriteLock), (*Wal)(unsafe.Pointer(pWal)).FapWiData+uintptr(iPage)*8) if rc == SQLITE_OK { if iPage > 0 && Xsqlite3FaultSim(tls, 600) != 0 { rc = SQLITE_NOMEM } } else if rc&0xff == SQLITE_READONLY { *(*U8)(unsafe.Pointer(pWal + 66)) |= U8(WAL_SHM_RDONLY) if rc == SQLITE_READONLY { rc = SQLITE_OK } } } *(*uintptr)(unsafe.Pointer(ppPage)) = *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(iPage)*8)) return rc } func walIndexPage(tls *libc.TLS, pWal uintptr, iPage int32, ppPage uintptr) int32 { if (*Wal)(unsafe.Pointer(pWal)).FnWiData <= iPage || libc.AssignPtrUintptr(ppPage, *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(iPage)*8))) == uintptr(0) { return walIndexPageRealloc(tls, pWal, iPage, ppPage) } return SQLITE_OK } func walCkptInfo(tls *libc.TLS, pWal uintptr) uintptr { return *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData)) + 24*4 } func walIndexHdr(tls *libc.TLS, pWal uintptr) uintptr { return *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData)) } func walChecksumBytes(tls *libc.TLS, nativeCksum int32, a uintptr, nByte int32, aIn uintptr, aOut uintptr) { var s1 U32 var s2 U32 var aData uintptr = a var aEnd uintptr = a + uintptr(nByte) if aIn != 0 { s1 = *(*U32)(unsafe.Pointer(aIn)) s2 = *(*U32)(unsafe.Pointer(aIn + 1*4)) } else { s1 = libc.AssignUint32(&s2, U32(0)) } if nativeCksum != 0 { for __ccgo := true; __ccgo; __ccgo = aData < aEnd { s1 = s1 + (*(*U32)(unsafe.Pointer(libc.PostIncUintptr(&aData, 4))) + s2) s2 = s2 + (*(*U32)(unsafe.Pointer(libc.PostIncUintptr(&aData, 4))) + s1) } } else { for __ccgo1 := true; __ccgo1; __ccgo1 = aData < aEnd { s1 = s1 + (*(*U32)(unsafe.Pointer(aData))&U32(0x000000FF)<<24 + *(*U32)(unsafe.Pointer(aData))&U32(0x0000FF00)<<8 + *(*U32)(unsafe.Pointer(aData))&U32(0x00FF0000)>>8 + *(*U32)(unsafe.Pointer(aData))&0xFF000000>>24 + s2) s2 = s2 + (*(*U32)(unsafe.Pointer(aData + 1*4))&U32(0x000000FF)<<24 + *(*U32)(unsafe.Pointer(aData + 1*4))&U32(0x0000FF00)<<8 + *(*U32)(unsafe.Pointer(aData + 1*4))&U32(0x00FF0000)>>8 + *(*U32)(unsafe.Pointer(aData + 1*4))&0xFF000000>>24 + s1) aData += 4 * uintptr(2) } } *(*U32)(unsafe.Pointer(aOut)) = s1 *(*U32)(unsafe.Pointer(aOut + 1*4)) = s2 } func walShmBarrier(tls *libc.TLS, pWal uintptr) { if int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) != WAL_HEAPMEMORY_MODE { Xsqlite3OsShmBarrier(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd) } } func walIndexWriteHdr(tls *libc.TLS, pWal uintptr) { var aHdr uintptr = walIndexHdr(tls, pWal) var nCksum int32 = int32(uintptr(0) + 40) (*Wal)(unsafe.Pointer(pWal)).Fhdr.FisInit = U8(1) (*Wal)(unsafe.Pointer(pWal)).Fhdr.FiVersion = U32(WALINDEX_MAX_VERSION) walChecksumBytes(tls, 1, pWal+72, nCksum, uintptr(0), pWal+72+40) libc.Xmemcpy(tls, aHdr+1*48, pWal+72, uint64(unsafe.Sizeof(WalIndexHdr{}))) walShmBarrier(tls, pWal) libc.Xmemcpy(tls, aHdr, pWal+72, uint64(unsafe.Sizeof(WalIndexHdr{}))) } func walEncodeFrame(tls *libc.TLS, pWal uintptr, iPage U32, nTruncate U32, aData uintptr, aFrame uintptr) { var nativeCksum int32 var aCksum uintptr = pWal + 72 + 24 Xsqlite3Put4byte(tls, aFrame, iPage) Xsqlite3Put4byte(tls, aFrame+4, nTruncate) if (*Wal)(unsafe.Pointer(pWal)).FiReCksum == U32(0) { libc.Xmemcpy(tls, aFrame+8, pWal+72+32, uint64(8)) nativeCksum = libc.Bool32(int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FbigEndCksum) == SQLITE_BIGENDIAN) walChecksumBytes(tls, nativeCksum, aFrame, 8, aCksum, aCksum) walChecksumBytes(tls, nativeCksum, aData, int32((*Wal)(unsafe.Pointer(pWal)).FszPage), aCksum, aCksum) Xsqlite3Put4byte(tls, aFrame+16, *(*U32)(unsafe.Pointer(aCksum))) Xsqlite3Put4byte(tls, aFrame+20, *(*U32)(unsafe.Pointer(aCksum + 1*4))) } else { libc.Xmemset(tls, aFrame+8, 0, uint64(16)) } } func walDecodeFrame(tls *libc.TLS, pWal uintptr, piPage uintptr, pnTruncate uintptr, aData uintptr, aFrame uintptr) int32 { var nativeCksum int32 var aCksum uintptr = pWal + 72 + 24 var pgno U32 if libc.Xmemcmp(tls, pWal+72+32, aFrame+8, uint64(8)) != 0 { return 0 } pgno = Xsqlite3Get4byte(tls, aFrame) if pgno == U32(0) { return 0 } nativeCksum = libc.Bool32(int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FbigEndCksum) == SQLITE_BIGENDIAN) walChecksumBytes(tls, nativeCksum, aFrame, 8, aCksum, aCksum) walChecksumBytes(tls, nativeCksum, aData, int32((*Wal)(unsafe.Pointer(pWal)).FszPage), aCksum, aCksum) if *(*U32)(unsafe.Pointer(aCksum)) != Xsqlite3Get4byte(tls, aFrame+16) || *(*U32)(unsafe.Pointer(aCksum + 1*4)) != Xsqlite3Get4byte(tls, aFrame+20) { return 0 } *(*U32)(unsafe.Pointer(piPage)) = pgno *(*U32)(unsafe.Pointer(pnTruncate)) = Xsqlite3Get4byte(tls, aFrame+4) return 1 } func walLockShared(tls *libc.TLS, pWal uintptr, lockIdx int32) int32 { var rc int32 if (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode != 0 { return SQLITE_OK } rc = Xsqlite3OsShmLock(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, lockIdx, 1, SQLITE_SHM_LOCK|SQLITE_SHM_SHARED) return rc } func walUnlockShared(tls *libc.TLS, pWal uintptr, lockIdx int32) { if (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode != 0 { return } Xsqlite3OsShmLock(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, lockIdx, 1, SQLITE_SHM_UNLOCK|SQLITE_SHM_SHARED) } func walLockExclusive(tls *libc.TLS, pWal uintptr, lockIdx int32, n int32) int32 { var rc int32 if (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode != 0 { return SQLITE_OK } rc = Xsqlite3OsShmLock(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, lockIdx, n, SQLITE_SHM_LOCK|SQLITE_SHM_EXCLUSIVE) return rc } func walUnlockExclusive(tls *libc.TLS, pWal uintptr, lockIdx int32, n int32) { if (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode != 0 { return } Xsqlite3OsShmLock(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, lockIdx, n, SQLITE_SHM_UNLOCK|SQLITE_SHM_EXCLUSIVE) } func walHash(tls *libc.TLS, iPage U32) int32 { return int32(iPage * U32(HASHTABLE_HASH_1) & U32(HASHTABLE_NPAGE*2-1)) } func walNextHash(tls *libc.TLS, iPriorHash int32) int32 { return (iPriorHash + 1) & (HASHTABLE_NPAGE*2 - 1) } // An instance of the WalHashLoc object is used to describe the location // of a page hash table in the wal-index. This becomes the return value // from walHashGet(). type WalHashLoc1 = struct { FaHash uintptr FaPgno uintptr FiZero U32 F__ccgo_pad1 [4]byte } // An instance of the WalHashLoc object is used to describe the location // of a page hash table in the wal-index. This becomes the return value // from walHashGet(). type WalHashLoc = WalHashLoc1 func walHashGet(tls *libc.TLS, pWal uintptr, iHash int32, pLoc uintptr) int32 { var rc int32 rc = walIndexPage(tls, pWal, iHash, pLoc+8) if (*WalHashLoc)(unsafe.Pointer(pLoc)).FaPgno != 0 { (*WalHashLoc)(unsafe.Pointer(pLoc)).FaHash = (*WalHashLoc)(unsafe.Pointer(pLoc)).FaPgno + 4096*4 if iHash == 0 { (*WalHashLoc)(unsafe.Pointer(pLoc)).FaPgno = (*WalHashLoc)(unsafe.Pointer(pLoc)).FaPgno + 34*4 (*WalHashLoc)(unsafe.Pointer(pLoc)).FiZero = U32(0) } else { (*WalHashLoc)(unsafe.Pointer(pLoc)).FiZero = U32(uint64(HASHTABLE_NPAGE) - (uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2)+uint64(unsafe.Sizeof(WalCkptInfo{})))/uint64(unsafe.Sizeof(U32(0))) + uint64((iHash-1)*HASHTABLE_NPAGE)) } } else if rc == SQLITE_OK { rc = SQLITE_ERROR } return rc } func walFramePage(tls *libc.TLS, iFrame U32) int32 { var iHash int32 = int32((uint64(iFrame+U32(HASHTABLE_NPAGE)) - (uint64(HASHTABLE_NPAGE) - (uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2)+uint64(unsafe.Sizeof(WalCkptInfo{})))/uint64(unsafe.Sizeof(U32(0)))) - uint64(1)) / uint64(HASHTABLE_NPAGE)) return iHash } func walFramePgno(tls *libc.TLS, pWal uintptr, iFrame U32) U32 { var iHash int32 = walFramePage(tls, iFrame) if iHash == 0 { return *(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData)) + uintptr((uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2)+uint64(unsafe.Sizeof(WalCkptInfo{})))/uint64(unsafe.Sizeof(U32(0)))+uint64(iFrame)-uint64(1))*4)) } return *(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(iHash)*8)) + uintptr((uint64(iFrame-U32(1))-(uint64(HASHTABLE_NPAGE)-(uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2)+uint64(unsafe.Sizeof(WalCkptInfo{})))/uint64(unsafe.Sizeof(U32(0)))))%uint64(HASHTABLE_NPAGE))*4)) } func walCleanupHash(tls *libc.TLS, pWal uintptr) { bp := tls.Alloc(24) defer tls.Free(24) var iLimit int32 = 0 var nByte int32 var i int32 if (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame == U32(0) { return } i = walHashGet(tls, pWal, walFramePage(tls, (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame), bp) if i != 0 { return } iLimit = int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame - (*WalHashLoc)(unsafe.Pointer(bp)).FiZero) for i = 0; i < HASHTABLE_NPAGE*2; i++ { if int32(*(*Ht_slot)(unsafe.Pointer((*WalHashLoc)(unsafe.Pointer(bp)).FaHash + uintptr(i)*2))) > iLimit { *(*Ht_slot)(unsafe.Pointer((*WalHashLoc)(unsafe.Pointer(bp)).FaHash + uintptr(i)*2)) = Ht_slot(0) } } nByte = int32((int64((*WalHashLoc)(unsafe.Pointer(bp)).FaHash) - int64((*WalHashLoc)(unsafe.Pointer(bp)).FaPgno+uintptr(iLimit)*4)) / 1) libc.Xmemset(tls, (*WalHashLoc)(unsafe.Pointer(bp)).FaPgno+uintptr(iLimit)*4, 0, uint64(nByte)) } func walIndexAppend(tls *libc.TLS, pWal uintptr, iFrame U32, iPage U32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 rc = walHashGet(tls, pWal, walFramePage(tls, iFrame), bp) if rc == SQLITE_OK { var iKey int32 var idx int32 var nCollide int32 idx = int32(iFrame - (*WalHashLoc)(unsafe.Pointer(bp)).FiZero) if idx == 1 { var nByte int32 = int32((int64((*WalHashLoc)(unsafe.Pointer(bp)).FaHash+8192*2) - int64((*WalHashLoc)(unsafe.Pointer(bp)).FaPgno)) / 1) libc.Xmemset(tls, (*WalHashLoc)(unsafe.Pointer(bp)).FaPgno, 0, uint64(nByte)) } if *(*U32)(unsafe.Pointer((*WalHashLoc)(unsafe.Pointer(bp)).FaPgno + uintptr(idx-1)*4)) != 0 { walCleanupHash(tls, pWal) } nCollide = idx for iKey = walHash(tls, iPage); *(*Ht_slot)(unsafe.Pointer((*WalHashLoc)(unsafe.Pointer(bp)).FaHash + uintptr(iKey)*2)) != 0; iKey = walNextHash(tls, iKey) { if libc.PostDecInt32(&nCollide, 1) == 0 { return Xsqlite3CorruptError(tls, 64391) } } *(*U32)(unsafe.Pointer((*WalHashLoc)(unsafe.Pointer(bp)).FaPgno + uintptr(idx-1)*4)) = iPage libc.AtomicStoreNUint16((*WalHashLoc)(unsafe.Pointer(bp)).FaHash+uintptr(iKey)*2, Ht_slot(idx), 0) } return rc } func walIndexRecover(tls *libc.TLS, pWal uintptr) int32 { bp := tls.Alloc(80) defer tls.Free(80) var rc int32 var iLock int32 var iOffset I64 var iFrame U32 var iLast U32 var iFirst U32 var nHdr U32 var nHdr32 U32 var aPrivate uintptr var aFrame uintptr var szFrame int32 var aData uintptr var szPage int32 var magic U32 var version U32 var isValid int32 var iPg U32 var iLastFrame U32 var pInfo uintptr var i int32 *(*[2]U32)(unsafe.Pointer(bp + 72)) = [2]U32{U32(0), U32(0)} iLock = WAL_ALL_BUT_WRITE + int32((*Wal)(unsafe.Pointer(pWal)).FckptLock) rc = walLockExclusive(tls, pWal, iLock, 3+0-iLock) if !(rc != 0) { goto __1 } return rc __1: ; libc.Xmemset(tls, pWal+72, 0, uint64(unsafe.Sizeof(WalIndexHdr{}))) rc = Xsqlite3OsFileSize(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, bp+16) if !(rc != SQLITE_OK) { goto __2 } goto recovery_error __2: ; if !(*(*I64)(unsafe.Pointer(bp + 16)) > int64(WAL_HDRSIZE)) { goto __3 } aPrivate = uintptr(0) aFrame = uintptr(0) rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, bp+24, WAL_HDRSIZE, int64(0)) if !(rc != SQLITE_OK) { goto __4 } goto recovery_error __4: ; magic = Xsqlite3Get4byte(tls, bp+24) szPage = int32(Xsqlite3Get4byte(tls, bp+24+8)) if !(magic&0xFFFFFFFE != U32(WAL_MAGIC) || szPage&(szPage-1) != 0 || szPage > SQLITE_MAX_PAGE_SIZE || szPage < 512) { goto __5 } goto finished __5: ; (*Wal)(unsafe.Pointer(pWal)).Fhdr.FbigEndCksum = U8(magic & U32(0x00000001)) (*Wal)(unsafe.Pointer(pWal)).FszPage = U32(szPage) (*Wal)(unsafe.Pointer(pWal)).FnCkpt = Xsqlite3Get4byte(tls, bp+24+12) libc.Xmemcpy(tls, pWal+72+32, bp+24+16, uint64(8)) walChecksumBytes(tls, libc.Bool32(int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FbigEndCksum) == SQLITE_BIGENDIAN), bp+24, WAL_HDRSIZE-2*4, uintptr(0), pWal+72+24) if !(*(*U32)(unsafe.Pointer(pWal + 72 + 24)) != Xsqlite3Get4byte(tls, bp+24+24) || *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) != Xsqlite3Get4byte(tls, bp+24+28)) { goto __6 } goto finished __6: ; version = Xsqlite3Get4byte(tls, bp+24+4) if !(version != U32(WAL_MAX_VERSION)) { goto __7 } rc = Xsqlite3CantopenError(tls, 64523) goto finished __7: ; szFrame = szPage + WAL_FRAME_HDRSIZE aFrame = Xsqlite3_malloc64(tls, uint64(szFrame)+(uint64(unsafe.Sizeof(Ht_slot(0)))*uint64(HASHTABLE_NPAGE*2)+uint64(HASHTABLE_NPAGE)*uint64(unsafe.Sizeof(U32(0))))) if !!(aFrame != 0) { goto __8 } rc = SQLITE_NOMEM goto recovery_error __8: ; aData = aFrame + 24 aPrivate = aData + uintptr(szPage) iLastFrame = U32((*(*I64)(unsafe.Pointer(bp + 16)) - int64(WAL_HDRSIZE)) / I64(szFrame)) iPg = U32(0) __9: if !(iPg <= U32(walFramePage(tls, iLastFrame))) { goto __11 } iLast = func() uint32 { if uint64(iLastFrame) < uint64(HASHTABLE_NPAGE)-(uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2)+uint64(unsafe.Sizeof(WalCkptInfo{})))/uint64(unsafe.Sizeof(U32(0)))+uint64(iPg*U32(HASHTABLE_NPAGE)) { return iLastFrame } return uint32(uint64(HASHTABLE_NPAGE) - (uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2)+uint64(unsafe.Sizeof(WalCkptInfo{})))/uint64(unsafe.Sizeof(U32(0))) + uint64(iPg*U32(HASHTABLE_NPAGE))) }() iFirst = U32(uint64(1) + func() uint64 { if iPg == U32(0) { return uint64(0) } return uint64(HASHTABLE_NPAGE) - (uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2)+uint64(unsafe.Sizeof(WalCkptInfo{})))/uint64(unsafe.Sizeof(U32(0))) + uint64((iPg-U32(1))*U32(HASHTABLE_NPAGE)) }()) rc = walIndexPage(tls, pWal, int32(iPg), bp+56) if !(*(*uintptr)(unsafe.Pointer(bp + 56)) == uintptr(0)) { goto __12 } goto __11 __12: ; *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(iPg)*8)) = aPrivate iFrame = iFirst __13: if !(iFrame <= iLast) { goto __15 } iOffset = int64(WAL_HDRSIZE) + I64(iFrame-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, aFrame, szFrame, iOffset) if !(rc != SQLITE_OK) { goto __16 } goto __15 __16: ; isValid = walDecodeFrame(tls, pWal, bp+64, bp+68, aData, aFrame) if !!(isValid != 0) { goto __17 } goto __15 __17: ; rc = walIndexAppend(tls, pWal, iFrame, *(*U32)(unsafe.Pointer(bp + 64))) if !(rc != SQLITE_OK) { goto __18 } goto __15 __18: ; if !(*(*U32)(unsafe.Pointer(bp + 68)) != 0) { goto __19 } (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame = iFrame (*Wal)(unsafe.Pointer(pWal)).Fhdr.FnPage = *(*U32)(unsafe.Pointer(bp + 68)) (*Wal)(unsafe.Pointer(pWal)).Fhdr.FszPage = U16(szPage&0xff00 | szPage>>16) *(*U32)(unsafe.Pointer(bp + 72)) = *(*U32)(unsafe.Pointer(pWal + 72 + 24)) *(*U32)(unsafe.Pointer(bp + 72 + 1*4)) = *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) __19: ; goto __14 __14: iFrame++ goto __13 goto __15 __15: ; *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(iPg)*8)) = *(*uintptr)(unsafe.Pointer(bp + 56)) nHdr = func() uint32 { if iPg == U32(0) { return uint32(uint64(unsafe.Sizeof(WalIndexHdr{}))*uint64(2) + uint64(unsafe.Sizeof(WalCkptInfo{}))) } return uint32(0) }() nHdr32 = U32(uint64(nHdr) / uint64(unsafe.Sizeof(U32(0)))) libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp + 56))+uintptr(nHdr32)*4, aPrivate+uintptr(nHdr32)*4, uint64(unsafe.Sizeof(Ht_slot(0)))*uint64(HASHTABLE_NPAGE*2)+uint64(HASHTABLE_NPAGE)*uint64(unsafe.Sizeof(U32(0)))-uint64(nHdr)) if !(iFrame <= iLast) { goto __20 } goto __11 __20: ; goto __10 __10: iPg++ goto __9 goto __11 __11: ; Xsqlite3_free(tls, aFrame) __3: ; finished: if !(rc == SQLITE_OK) { goto __21 } *(*U32)(unsafe.Pointer(pWal + 72 + 24)) = *(*U32)(unsafe.Pointer(bp + 72)) *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) = *(*U32)(unsafe.Pointer(bp + 72 + 1*4)) walIndexWriteHdr(tls, pWal) libc.AtomicStoreUintptr(&pInfo, walCkptInfo(tls, pWal)) (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfill = U32(0) (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfillAttempted = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame *(*U32)(unsafe.Pointer(pInfo + 4)) = U32(0) i = 1 __22: if !(i < SQLITE_SHM_NLOCK-3) { goto __24 } rc = walLockExclusive(tls, pWal, 3+i, 1) if !(rc == SQLITE_OK) { goto __25 } if !(i == 1 && (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame != 0) { goto __27 } *(*U32)(unsafe.Pointer(pInfo + 4 + uintptr(i)*4)) = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame goto __28 __27: *(*U32)(unsafe.Pointer(pInfo + 4 + uintptr(i)*4)) = READMARK_NOT_USED __28: ; walUnlockExclusive(tls, pWal, 3+i, 1) goto __26 __25: if !(rc != SQLITE_BUSY) { goto __29 } goto recovery_error __29: ; __26: ; goto __23 __23: i++ goto __22 goto __24 __24: ; if !((*Wal)(unsafe.Pointer(pWal)).Fhdr.FnPage != 0) { goto __30 } Xsqlite3_log(tls, SQLITE_NOTICE|int32(1)<<8, ts+5322, libc.VaList(bp, (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame, (*Wal)(unsafe.Pointer(pWal)).FzWalName)) __30: ; __21: ; recovery_error: ; walUnlockExclusive(tls, pWal, iLock, 3+0-iLock) return rc } func walIndexClose(tls *libc.TLS, pWal uintptr, isDelete int32) { if int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) == WAL_HEAPMEMORY_MODE || (*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable != 0 { var i int32 for i = 0; i < (*Wal)(unsafe.Pointer(pWal)).FnWiData; i++ { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(i)*8)) = uintptr(0) } } if int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) != WAL_HEAPMEMORY_MODE { Xsqlite3OsShmUnmap(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, isDelete) } } // Open a connection to the WAL file zWalName. The database file must // already be opened on connection pDbFd. The buffer that zWalName points // to must remain valid for the lifetime of the returned Wal* handle. // // A SHARED lock should be held on the database file when this function // is called. The purpose of this SHARED lock is to prevent any other // client from unlinking the WAL or wal-index file. If another process // were to do this just after this client opened one of these files, the // system would be badly broken. // // If the log file is successfully opened, SQLITE_OK is returned and // *ppWal is set to point to a new WAL handle. If an error occurs, // an SQLite error code is returned and *ppWal is left unmodified. func Xsqlite3WalOpen(tls *libc.TLS, pVfs uintptr, pDbFd uintptr, zWalName uintptr, bNoShm int32, mxWalSize I64, ppWal uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 var pRet uintptr *(*uintptr)(unsafe.Pointer(ppWal)) = uintptr(0) pRet = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(Wal{}))+uint64((*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile)) if !(pRet != 0) { return SQLITE_NOMEM } (*Wal)(unsafe.Pointer(pRet)).FpVfs = pVfs (*Wal)(unsafe.Pointer(pRet)).FpWalFd = pRet + 1*152 (*Wal)(unsafe.Pointer(pRet)).FpDbFd = pDbFd (*Wal)(unsafe.Pointer(pRet)).FreadLock = int16(-1) (*Wal)(unsafe.Pointer(pRet)).FmxWalSize = mxWalSize (*Wal)(unsafe.Pointer(pRet)).FzWalName = zWalName (*Wal)(unsafe.Pointer(pRet)).FsyncHeader = U8(1) (*Wal)(unsafe.Pointer(pRet)).FpadToSectorBoundary = U8(1) (*Wal)(unsafe.Pointer(pRet)).FexclusiveMode = func() uint8 { if bNoShm != 0 { return uint8(WAL_HEAPMEMORY_MODE) } return uint8(WAL_NORMAL_MODE) }() *(*int32)(unsafe.Pointer(bp)) = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_WAL rc = Xsqlite3OsOpen(tls, pVfs, zWalName, (*Wal)(unsafe.Pointer(pRet)).FpWalFd, *(*int32)(unsafe.Pointer(bp)), bp) if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp))&SQLITE_OPEN_READONLY != 0 { (*Wal)(unsafe.Pointer(pRet)).FreadOnly = U8(WAL_RDONLY) } if rc != SQLITE_OK { walIndexClose(tls, pRet, 0) Xsqlite3OsClose(tls, (*Wal)(unsafe.Pointer(pRet)).FpWalFd) Xsqlite3_free(tls, pRet) } else { var iDC int32 = Xsqlite3OsDeviceCharacteristics(tls, pDbFd) if iDC&SQLITE_IOCAP_SEQUENTIAL != 0 { (*Wal)(unsafe.Pointer(pRet)).FsyncHeader = U8(0) } if iDC&SQLITE_IOCAP_POWERSAFE_OVERWRITE != 0 { (*Wal)(unsafe.Pointer(pRet)).FpadToSectorBoundary = U8(0) } *(*uintptr)(unsafe.Pointer(ppWal)) = pRet } return rc } // Change the size to which the WAL file is trucated on each reset. func Xsqlite3WalLimit(tls *libc.TLS, pWal uintptr, iLimit I64) { if pWal != 0 { (*Wal)(unsafe.Pointer(pWal)).FmxWalSize = iLimit } } func walIteratorNext(tls *libc.TLS, p uintptr, piPage uintptr, piFrame uintptr) int32 { var iMin U32 var iRet U32 = 0xFFFFFFFF var i int32 iMin = (*WalIterator)(unsafe.Pointer(p)).FiPrior for i = (*WalIterator)(unsafe.Pointer(p)).FnSegment - 1; i >= 0; i-- { var pSegment uintptr = p + 8 + uintptr(i)*32 for (*WalSegment)(unsafe.Pointer(pSegment)).FiNext < (*WalSegment)(unsafe.Pointer(pSegment)).FnEntry { var iPg U32 = *(*U32)(unsafe.Pointer((*WalSegment)(unsafe.Pointer(pSegment)).FaPgno + uintptr(*(*Ht_slot)(unsafe.Pointer((*WalSegment)(unsafe.Pointer(pSegment)).FaIndex + uintptr((*WalSegment)(unsafe.Pointer(pSegment)).FiNext)*2)))*4)) if iPg > iMin { if iPg < iRet { iRet = iPg *(*U32)(unsafe.Pointer(piFrame)) = U32((*WalSegment)(unsafe.Pointer(pSegment)).FiZero + int32(*(*Ht_slot)(unsafe.Pointer((*WalSegment)(unsafe.Pointer(pSegment)).FaIndex + uintptr((*WalSegment)(unsafe.Pointer(pSegment)).FiNext)*2)))) } break } (*WalSegment)(unsafe.Pointer(pSegment)).FiNext++ } } *(*U32)(unsafe.Pointer(piPage)) = libc.AssignPtrUint32(p, iRet) return libc.Bool32(iRet == 0xFFFFFFFF) } func walMerge(tls *libc.TLS, aContent uintptr, aLeft uintptr, nLeft int32, paRight uintptr, pnRight uintptr, aTmp uintptr) { var iLeft int32 = 0 var iRight int32 = 0 var iOut int32 = 0 var nRight int32 = *(*int32)(unsafe.Pointer(pnRight)) var aRight uintptr = *(*uintptr)(unsafe.Pointer(paRight)) for iRight < nRight || iLeft < nLeft { var logpage Ht_slot var dbpage Pgno if iLeft < nLeft && (iRight >= nRight || *(*U32)(unsafe.Pointer(aContent + uintptr(*(*Ht_slot)(unsafe.Pointer(aLeft + uintptr(iLeft)*2)))*4)) < *(*U32)(unsafe.Pointer(aContent + uintptr(*(*Ht_slot)(unsafe.Pointer(aRight + uintptr(iRight)*2)))*4))) { logpage = *(*Ht_slot)(unsafe.Pointer(aLeft + uintptr(libc.PostIncInt32(&iLeft, 1))*2)) } else { logpage = *(*Ht_slot)(unsafe.Pointer(aRight + uintptr(libc.PostIncInt32(&iRight, 1))*2)) } dbpage = *(*U32)(unsafe.Pointer(aContent + uintptr(logpage)*4)) *(*Ht_slot)(unsafe.Pointer(aTmp + uintptr(libc.PostIncInt32(&iOut, 1))*2)) = logpage if iLeft < nLeft && *(*U32)(unsafe.Pointer(aContent + uintptr(*(*Ht_slot)(unsafe.Pointer(aLeft + uintptr(iLeft)*2)))*4)) == dbpage { iLeft++ } } *(*uintptr)(unsafe.Pointer(paRight)) = aLeft *(*int32)(unsafe.Pointer(pnRight)) = iOut libc.Xmemcpy(tls, aLeft, aTmp, uint64(unsafe.Sizeof(Ht_slot(0)))*uint64(iOut)) } func walMergesort(tls *libc.TLS, aContent uintptr, aBuffer uintptr, aList uintptr, pnList uintptr) { bp := tls.Alloc(220) defer tls.Free(220) var nList int32 = *(*int32)(unsafe.Pointer(pnList)) *(*int32)(unsafe.Pointer(bp + 216)) = 0 *(*uintptr)(unsafe.Pointer(bp + 208)) = uintptr(0) var iList int32 var iSub U32 = U32(0) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([13]Sublist{}))) for iList = 0; iList < nList; iList++ { *(*int32)(unsafe.Pointer(bp + 216)) = 1 *(*uintptr)(unsafe.Pointer(bp + 208)) = aList + uintptr(iList)*2 for iSub = U32(0); iList&(int32(1)< U32(HASHTABLE_NPAGE) { return uint64(HASHTABLE_NPAGE) } return uint64(iLast) }()) if !(aTmp != 0) { rc = SQLITE_NOMEM } for i = walFramePage(tls, nBackfill+U32(1)); rc == SQLITE_OK && i < nSegment; i++ { rc = walHashGet(tls, pWal, i, bp) if rc == SQLITE_OK { var j int32 var aIndex uintptr if i+1 == nSegment { *(*int32)(unsafe.Pointer(bp + 24)) = int32(iLast - (*WalHashLoc)(unsafe.Pointer(bp)).FiZero) } else { *(*int32)(unsafe.Pointer(bp + 24)) = int32((int64((*WalHashLoc)(unsafe.Pointer(bp)).FaHash) - int64((*WalHashLoc)(unsafe.Pointer(bp)).FaPgno)) / 4) } aIndex = p + 8 + uintptr((*WalIterator)(unsafe.Pointer(p)).FnSegment)*32 + uintptr((*WalHashLoc)(unsafe.Pointer(bp)).FiZero)*2 (*WalHashLoc)(unsafe.Pointer(bp)).FiZero++ for j = 0; j < *(*int32)(unsafe.Pointer(bp + 24)); j++ { *(*Ht_slot)(unsafe.Pointer(aIndex + uintptr(j)*2)) = Ht_slot(j) } walMergesort(tls, (*WalHashLoc)(unsafe.Pointer(bp)).FaPgno, aTmp, aIndex, bp+24) (*WalSegment)(unsafe.Pointer(p + 8 + uintptr(i)*32)).FiZero = int32((*WalHashLoc)(unsafe.Pointer(bp)).FiZero) (*WalSegment)(unsafe.Pointer(p + 8 + uintptr(i)*32)).FnEntry = *(*int32)(unsafe.Pointer(bp + 24)) (*WalSegment)(unsafe.Pointer(p + 8 + uintptr(i)*32)).FaIndex = aIndex (*WalSegment)(unsafe.Pointer(p + 8 + uintptr(i)*32)).FaPgno = (*WalHashLoc)(unsafe.Pointer(bp)).FaPgno } } Xsqlite3_free(tls, aTmp) if rc != SQLITE_OK { walIteratorFree(tls, p) p = uintptr(0) } *(*uintptr)(unsafe.Pointer(pp)) = p return rc } func walBusyLock(tls *libc.TLS, pWal uintptr, xBusy uintptr, pBusyArg uintptr, lockIdx int32, n int32) int32 { var rc int32 for __ccgo := true; __ccgo; __ccgo = xBusy != 0 && rc == SQLITE_BUSY && (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xBusy})).f(tls, pBusyArg) != 0 { rc = walLockExclusive(tls, pWal, lockIdx, n) } return rc } func walPagesize(tls *libc.TLS, pWal uintptr) int32 { return int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FszPage)&0xfe00 + int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FszPage)&0x0001<<16 } func walRestartHdr(tls *libc.TLS, pWal uintptr, salt1 U32) { bp := tls.Alloc(4) defer tls.Free(4) *(*U32)(unsafe.Pointer(bp)) = salt1 var pInfo uintptr = walCkptInfo(tls, pWal) var i int32 var aSalt uintptr = pWal + 72 + 32 (*Wal)(unsafe.Pointer(pWal)).FnCkpt++ (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame = U32(0) Xsqlite3Put4byte(tls, aSalt, U32(1)+Xsqlite3Get4byte(tls, aSalt)) libc.Xmemcpy(tls, pWal+72+32+1*4, bp, uint64(4)) walIndexWriteHdr(tls, pWal) libc.AtomicStoreNInt32(pInfo, int32(0), 0) (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfillAttempted = U32(0) *(*U32)(unsafe.Pointer(pInfo + 4 + 1*4)) = U32(0) for i = 2; i < SQLITE_SHM_NLOCK-3; i++ { *(*U32)(unsafe.Pointer(pInfo + 4 + uintptr(i)*4)) = READMARK_NOT_USED } } func walCheckpoint(tls *libc.TLS, pWal uintptr, db uintptr, eMode int32, xBusy uintptr, pBusyArg uintptr, sync_flags int32, zBuf uintptr) int32 { bp := tls.Alloc(36) defer tls.Free(36) var rc int32 var szPage int32 var mxSafeFrame U32 var mxPage U32 var i int32 var pInfo uintptr var iMark U32 var y U32 var iOffset I64 var szDb I64 var nBackfill U32 rc = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*U32)(unsafe.Pointer(bp + 24)) = U32(0) *(*U32)(unsafe.Pointer(bp + 28)) = U32(0) szPage = walPagesize(tls, pWal) libc.AtomicStoreUintptr(&pInfo, walCkptInfo(tls, pWal)) if !((*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfill < (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame) { goto __1 } mxSafeFrame = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame mxPage = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FnPage i = 1 __2: if !(i < SQLITE_SHM_NLOCK-3) { goto __4 } y = libc.AtomicLoadNUint32(pInfo+4+uintptr(i)*4, 0) if !(mxSafeFrame > y) { goto __5 } rc = walBusyLock(tls, pWal, xBusy, pBusyArg, 3+i, 1) if !(rc == SQLITE_OK) { goto __6 } iMark = func() uint32 { if i == 1 { return mxSafeFrame } return READMARK_NOT_USED }() libc.AtomicStoreNUint32(pInfo+4+uintptr(i)*4, iMark, 0) walUnlockExclusive(tls, pWal, 3+i, 1) goto __7 __6: if !(rc == SQLITE_BUSY) { goto __8 } mxSafeFrame = y xBusy = uintptr(0) goto __9 __8: goto walcheckpoint_out __9: ; __7: ; __5: ; goto __3 __3: i++ goto __2 goto __4 __4: ; if !((*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfill < mxSafeFrame) { goto __10 } rc = walIteratorInit(tls, pWal, (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfill, bp) __10: ; if !(*(*uintptr)(unsafe.Pointer(bp)) != 0 && libc.AssignInt32(&rc, walBusyLock(tls, pWal, xBusy, pBusyArg, 3+0, 1)) == SQLITE_OK) { goto __11 } nBackfill = (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfill (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfillAttempted = mxSafeFrame rc = Xsqlite3OsSync(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, sync_flags>>2&0x03) if !(rc == SQLITE_OK) { goto __12 } *(*I64)(unsafe.Pointer(bp + 16)) = I64(mxPage) * I64(szPage) Xsqlite3OsFileControl(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, SQLITE_FCNTL_CKPT_START, uintptr(0)) rc = Xsqlite3OsFileSize(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, bp+8) if !(rc == SQLITE_OK && *(*I64)(unsafe.Pointer(bp + 8)) < *(*I64)(unsafe.Pointer(bp + 16))) { goto __13 } if !(*(*I64)(unsafe.Pointer(bp + 8))+int64(65536)+I64((*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame)*I64(szPage) < *(*I64)(unsafe.Pointer(bp + 16))) { goto __14 } rc = Xsqlite3CorruptError(tls, 65337) goto __15 __14: Xsqlite3OsFileControlHint(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, SQLITE_FCNTL_SIZE_HINT, bp+16) __15: ; __13: ; __12: ; __16: if !(rc == SQLITE_OK && 0 == walIteratorNext(tls, *(*uintptr)(unsafe.Pointer(bp)), bp+24, bp+28)) { goto __17 } if !(libc.AtomicLoadNInt32(db+432, 0) != 0) { goto __18 } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { rc = SQLITE_NOMEM } else { rc = SQLITE_INTERRUPT } goto __17 __18: ; if !(*(*U32)(unsafe.Pointer(bp + 28)) <= nBackfill || *(*U32)(unsafe.Pointer(bp + 28)) > mxSafeFrame || *(*U32)(unsafe.Pointer(bp + 24)) > mxPage) { goto __19 } goto __16 __19: ; iOffset = int64(WAL_HDRSIZE) + I64(*(*U32)(unsafe.Pointer(bp + 28))-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) + int64(WAL_FRAME_HDRSIZE) rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, zBuf, szPage, iOffset) if !(rc != SQLITE_OK) { goto __20 } goto __17 __20: ; iOffset = I64(*(*U32)(unsafe.Pointer(bp + 24))-U32(1)) * I64(szPage) rc = Xsqlite3OsWrite(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, zBuf, szPage, iOffset) if !(rc != SQLITE_OK) { goto __21 } goto __17 __21: ; goto __16 __17: ; Xsqlite3OsFileControl(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, SQLITE_FCNTL_CKPT_DONE, uintptr(0)) if !(rc == SQLITE_OK) { goto __22 } if !(mxSafeFrame == (*WalIndexHdr)(unsafe.Pointer(walIndexHdr(tls, pWal))).FmxFrame) { goto __23 } szDb = I64((*Wal)(unsafe.Pointer(pWal)).Fhdr.FnPage) * I64(szPage) rc = Xsqlite3OsTruncate(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, szDb) if !(rc == SQLITE_OK) { goto __24 } rc = Xsqlite3OsSync(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, sync_flags>>2&0x03) __24: ; __23: ; if !(rc == SQLITE_OK) { goto __25 } libc.AtomicStoreNUint32(pInfo, mxSafeFrame, 0) __25: ; __22: ; walUnlockExclusive(tls, pWal, 3+0, 1) __11: ; if !(rc == SQLITE_BUSY) { goto __26 } rc = SQLITE_OK __26: ; __1: ; if !(rc == SQLITE_OK && eMode != SQLITE_CHECKPOINT_PASSIVE) { goto __27 } if !((*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfill < (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame) { goto __28 } rc = SQLITE_BUSY goto __29 __28: if !(eMode >= SQLITE_CHECKPOINT_RESTART) { goto __30 } Xsqlite3_randomness(tls, 4, bp+32) rc = walBusyLock(tls, pWal, xBusy, pBusyArg, 3+1, SQLITE_SHM_NLOCK-3-1) if !(rc == SQLITE_OK) { goto __31 } if !(eMode == SQLITE_CHECKPOINT_TRUNCATE) { goto __32 } walRestartHdr(tls, pWal, *(*U32)(unsafe.Pointer(bp + 32))) rc = Xsqlite3OsTruncate(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, int64(0)) __32: ; walUnlockExclusive(tls, pWal, 3+1, SQLITE_SHM_NLOCK-3-1) __31: ; __30: ; __29: ; __27: ; walcheckpoint_out: walIteratorFree(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } func walLimitSize(tls *libc.TLS, pWal uintptr, nMax I64) { bp := tls.Alloc(16) defer tls.Free(16) var rx int32 Xsqlite3BeginBenignMalloc(tls) rx = Xsqlite3OsFileSize(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, bp+8) if rx == SQLITE_OK && *(*I64)(unsafe.Pointer(bp + 8)) > nMax { rx = Xsqlite3OsTruncate(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, nMax) } Xsqlite3EndBenignMalloc(tls) if rx != 0 { Xsqlite3_log(tls, rx, ts+5359, libc.VaList(bp, (*Wal)(unsafe.Pointer(pWal)).FzWalName)) } } // Close a connection to a log file. func Xsqlite3WalClose(tls *libc.TLS, pWal uintptr, db uintptr, sync_flags int32, nBuf int32, zBuf uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 = SQLITE_OK if pWal != 0 { var isDelete int32 = 0 if zBuf != uintptr(0) && SQLITE_OK == libc.AssignInt32(&rc, Xsqlite3OsLock(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, SQLITE_LOCK_EXCLUSIVE)) { if int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) == WAL_NORMAL_MODE { (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode = U8(WAL_EXCLUSIVE_MODE) } rc = Xsqlite3WalCheckpoint(tls, pWal, db, SQLITE_CHECKPOINT_PASSIVE, uintptr(0), uintptr(0), sync_flags, nBuf, zBuf, uintptr(0), uintptr(0)) if rc == SQLITE_OK { *(*int32)(unsafe.Pointer(bp)) = -1 Xsqlite3OsFileControlHint(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, SQLITE_FCNTL_PERSIST_WAL, bp) if *(*int32)(unsafe.Pointer(bp)) != 1 { isDelete = 1 } else if (*Wal)(unsafe.Pointer(pWal)).FmxWalSize >= int64(0) { walLimitSize(tls, pWal, int64(0)) } } } walIndexClose(tls, pWal, isDelete) Xsqlite3OsClose(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd) if isDelete != 0 { Xsqlite3BeginBenignMalloc(tls) Xsqlite3OsDelete(tls, (*Wal)(unsafe.Pointer(pWal)).FpVfs, (*Wal)(unsafe.Pointer(pWal)).FzWalName, 0) Xsqlite3EndBenignMalloc(tls) } Xsqlite3_free(tls, (*Wal)(unsafe.Pointer(pWal)).FapWiData) Xsqlite3_free(tls, pWal) } return rc } func walIndexTryHdr(tls *libc.TLS, pWal uintptr, pChanged uintptr) int32 { bp := tls.Alloc(104) defer tls.Free(104) var aHdr uintptr libc.AtomicStoreUintptr(&aHdr, walIndexHdr(tls, pWal)) libc.Xmemcpy(tls, bp, aHdr, uint64(unsafe.Sizeof(WalIndexHdr{}))) walShmBarrier(tls, pWal) libc.Xmemcpy(tls, bp+48, aHdr+1*48, uint64(unsafe.Sizeof(WalIndexHdr{}))) if libc.Xmemcmp(tls, bp, bp+48, uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { return 1 } if int32((*WalIndexHdr)(unsafe.Pointer(bp)).FisInit) == 0 { return 1 } walChecksumBytes(tls, 1, bp, int32(uint64(unsafe.Sizeof(WalIndexHdr{}))-uint64(unsafe.Sizeof([2]U32{}))), uintptr(0), bp+96) if *(*U32)(unsafe.Pointer(bp + 96)) != *(*U32)(unsafe.Pointer(bp + 40)) || *(*U32)(unsafe.Pointer(bp + 96 + 1*4)) != *(*U32)(unsafe.Pointer(bp + 40 + 1*4)) { return 1 } if libc.Xmemcmp(tls, pWal+72, bp, uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { *(*int32)(unsafe.Pointer(pChanged)) = 1 libc.Xmemcpy(tls, pWal+72, bp, uint64(unsafe.Sizeof(WalIndexHdr{}))) (*Wal)(unsafe.Pointer(pWal)).FszPage = U32(int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FszPage)&0xfe00 + int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FszPage)&0x0001<<16) } return 0 } func walIndexReadHdr(tls *libc.TLS, pWal uintptr, pChanged uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var badHdr int32 rc = walIndexPage(tls, pWal, 0, bp) if rc != SQLITE_OK { if rc == SQLITE_READONLY|int32(5)<<8 { (*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable = U8(1) (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode = U8(WAL_HEAPMEMORY_MODE) *(*int32)(unsafe.Pointer(pChanged)) = 1 } else { return rc } } else { } badHdr = func() int32 { if *(*uintptr)(unsafe.Pointer(bp)) != 0 { return walIndexTryHdr(tls, pWal, pChanged) } return 1 }() if badHdr != 0 { if int32((*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable) == 0 && int32((*Wal)(unsafe.Pointer(pWal)).FreadOnly)&WAL_SHM_RDONLY != 0 { if SQLITE_OK == libc.AssignInt32(&rc, walLockShared(tls, pWal, WAL_WRITE_LOCK)) { walUnlockShared(tls, pWal, WAL_WRITE_LOCK) rc = SQLITE_READONLY | int32(1)<<8 } } else { var bWriteLock int32 = int32((*Wal)(unsafe.Pointer(pWal)).FwriteLock) if bWriteLock != 0 || SQLITE_OK == libc.AssignInt32(&rc, walLockExclusive(tls, pWal, WAL_WRITE_LOCK, 1)) { (*Wal)(unsafe.Pointer(pWal)).FwriteLock = U8(1) if SQLITE_OK == libc.AssignInt32(&rc, walIndexPage(tls, pWal, 0, bp)) { badHdr = walIndexTryHdr(tls, pWal, pChanged) if badHdr != 0 { rc = walIndexRecover(tls, pWal) *(*int32)(unsafe.Pointer(pChanged)) = 1 } } if bWriteLock == 0 { (*Wal)(unsafe.Pointer(pWal)).FwriteLock = U8(0) walUnlockExclusive(tls, pWal, WAL_WRITE_LOCK, 1) } } } } if badHdr == 0 && (*Wal)(unsafe.Pointer(pWal)).Fhdr.FiVersion != U32(WALINDEX_MAX_VERSION) { rc = Xsqlite3CantopenError(tls, 65686) } if (*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable != 0 { if rc != SQLITE_OK { walIndexClose(tls, pWal, 0) (*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable = U8(0) if rc == SQLITE_IOERR|int32(2)<<8 { rc = -1 } } (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode = U8(WAL_NORMAL_MODE) } return rc } func walBeginShmUnreliable(tls *libc.TLS, pWal uintptr, pChanged uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var iOffset I64 var aFrame uintptr var szFrame int32 var aData uintptr var rc int32 var i int32 aFrame = uintptr(0) rc = walLockShared(tls, pWal, 3+0) if !(rc != SQLITE_OK) { goto __1 } if !(rc == SQLITE_BUSY) { goto __2 } rc = -1 __2: ; goto begin_unreliable_shm_out __1: ; (*Wal)(unsafe.Pointer(pWal)).FreadLock = int16(0) rc = Xsqlite3OsShmMap(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, 0, int32(uint64(unsafe.Sizeof(Ht_slot(0)))*uint64(HASHTABLE_NPAGE*2)+uint64(HASHTABLE_NPAGE)*uint64(unsafe.Sizeof(U32(0)))), 0, bp) if !(rc != SQLITE_READONLY|int32(5)<<8) { goto __3 } rc = func() int32 { if rc == SQLITE_READONLY { return -1 } return rc }() goto begin_unreliable_shm_out __3: ; libc.Xmemcpy(tls, pWal+72, walIndexHdr(tls, pWal), uint64(unsafe.Sizeof(WalIndexHdr{}))) rc = Xsqlite3OsFileSize(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, bp+8) if !(rc != SQLITE_OK) { goto __4 } goto begin_unreliable_shm_out __4: ; if !(*(*I64)(unsafe.Pointer(bp + 8)) < int64(WAL_HDRSIZE)) { goto __5 } *(*int32)(unsafe.Pointer(pChanged)) = 1 rc = func() int32 { if (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame == U32(0) { return SQLITE_OK } return -1 }() goto begin_unreliable_shm_out __5: ; rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, bp+16, WAL_HDRSIZE, int64(0)) if !(rc != SQLITE_OK) { goto __6 } goto begin_unreliable_shm_out __6: ; if !(libc.Xmemcmp(tls, pWal+72+32, bp+16+16, uint64(8)) != 0) { goto __7 } rc = -1 goto begin_unreliable_shm_out __7: ; szFrame = int32((*Wal)(unsafe.Pointer(pWal)).FszPage + U32(WAL_FRAME_HDRSIZE)) aFrame = Xsqlite3_malloc64(tls, uint64(szFrame)) if !(aFrame == uintptr(0)) { goto __8 } rc = SQLITE_NOMEM goto begin_unreliable_shm_out __8: ; aData = aFrame + 24 *(*U32)(unsafe.Pointer(bp + 48)) = *(*U32)(unsafe.Pointer(pWal + 72 + 24)) *(*U32)(unsafe.Pointer(bp + 48 + 1*4)) = *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) iOffset = int64(WAL_HDRSIZE) + I64((*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame+U32(1)-U32(1))*I64((*Wal)(unsafe.Pointer(pWal)).FszPage+U32(WAL_FRAME_HDRSIZE)) __9: if !(iOffset+I64(szFrame) <= *(*I64)(unsafe.Pointer(bp + 8))) { goto __11 } rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, aFrame, szFrame, iOffset) if !(rc != SQLITE_OK) { goto __12 } goto __11 __12: ; if !!(walDecodeFrame(tls, pWal, bp+56, bp+60, aData, aFrame) != 0) { goto __13 } goto __11 __13: ; if !(*(*U32)(unsafe.Pointer(bp + 60)) != 0) { goto __14 } rc = -1 goto __11 __14: ; goto __10 __10: iOffset = iOffset + I64(szFrame) goto __9 goto __11 __11: ; *(*U32)(unsafe.Pointer(pWal + 72 + 24)) = *(*U32)(unsafe.Pointer(bp + 48)) *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) = *(*U32)(unsafe.Pointer(bp + 48 + 1*4)) begin_unreliable_shm_out: Xsqlite3_free(tls, aFrame) if !(rc != SQLITE_OK) { goto __15 } i = 0 __16: if !(i < (*Wal)(unsafe.Pointer(pWal)).FnWiData) { goto __18 } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData + uintptr(i)*8)) = uintptr(0) goto __17 __17: i++ goto __16 goto __18 __18: ; (*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable = U8(0) Xsqlite3WalEndReadTransaction(tls, pWal) *(*int32)(unsafe.Pointer(pChanged)) = 1 __15: ; return rc } func walTryBeginRead(tls *libc.TLS, pWal uintptr, pChanged uintptr, useWal int32, cnt int32) int32 { var pInfo uintptr var mxReadMark U32 var mxI int32 var i int32 var rc int32 = SQLITE_OK var mxFrame U32 if cnt > 5 { var nDelay int32 = 1 if cnt > 100 { return SQLITE_PROTOCOL } if cnt >= 10 { nDelay = (cnt - 9) * (cnt - 9) * 39 } Xsqlite3OsSleep(tls, (*Wal)(unsafe.Pointer(pWal)).FpVfs, nDelay) } if !(useWal != 0) { if int32((*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable) == 0 { rc = walIndexReadHdr(tls, pWal, pChanged) } if rc == SQLITE_BUSY { if *(*uintptr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FapWiData)) == uintptr(0) { rc = -1 } else if SQLITE_OK == libc.AssignInt32(&rc, walLockShared(tls, pWal, WAL_RECOVER_LOCK)) { walUnlockShared(tls, pWal, WAL_RECOVER_LOCK) rc = -1 } else if rc == SQLITE_BUSY { rc = SQLITE_BUSY | int32(1)<<8 } } if rc != SQLITE_OK { return rc } else if (*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable != 0 { return walBeginShmUnreliable(tls, pWal, pChanged) } } libc.AtomicStoreUintptr(&pInfo, walCkptInfo(tls, pWal)) if !(useWal != 0) && libc.AtomicLoadNUint32(pInfo, 0) == (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame && ((*Wal)(unsafe.Pointer(pWal)).FpSnapshot == uintptr(0) || (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame == U32(0)) { rc = walLockShared(tls, pWal, 3+0) walShmBarrier(tls, pWal) if rc == SQLITE_OK { if libc.Xmemcmp(tls, walIndexHdr(tls, pWal), pWal+72, uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { walUnlockShared(tls, pWal, 3+0) return -1 } (*Wal)(unsafe.Pointer(pWal)).FreadLock = int16(0) return SQLITE_OK } else if rc != SQLITE_BUSY { return rc } } mxReadMark = U32(0) mxI = 0 mxFrame = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame if (*Wal)(unsafe.Pointer(pWal)).FpSnapshot != 0 && (*WalIndexHdr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FpSnapshot)).FmxFrame < mxFrame { mxFrame = (*WalIndexHdr)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FpSnapshot)).FmxFrame } for i = 1; i < SQLITE_SHM_NLOCK-3; i++ { var thisMark U32 = libc.AtomicLoadNUint32(pInfo+4+uintptr(i)*4, 0) if mxReadMark <= thisMark && thisMark <= mxFrame { mxReadMark = thisMark mxI = i } } if int32((*Wal)(unsafe.Pointer(pWal)).FreadOnly)&WAL_SHM_RDONLY == 0 && (mxReadMark < mxFrame || mxI == 0) { for i = 1; i < SQLITE_SHM_NLOCK-3; i++ { rc = walLockExclusive(tls, pWal, 3+i, 1) if rc == SQLITE_OK { libc.AtomicStoreNUint32(pInfo+4+uintptr(i)*4, mxFrame, 0) mxReadMark = mxFrame mxI = i walUnlockExclusive(tls, pWal, 3+i, 1) break } else if rc != SQLITE_BUSY { return rc } } } if mxI == 0 { if rc == SQLITE_BUSY { return -1 } return SQLITE_READONLY | int32(5)<<8 } rc = walLockShared(tls, pWal, 3+mxI) if rc != 0 { if rc == SQLITE_BUSY { return -1 } return rc } (*Wal)(unsafe.Pointer(pWal)).FminFrame = libc.AtomicLoadNUint32(pInfo, 0) + 1 walShmBarrier(tls, pWal) if libc.AtomicLoadNUint32(pInfo+4+uintptr(mxI)*4, 0) != mxReadMark || libc.Xmemcmp(tls, walIndexHdr(tls, pWal), pWal+72, uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { walUnlockShared(tls, pWal, 3+mxI) return -1 } else { (*Wal)(unsafe.Pointer(pWal)).FreadLock = I16(mxI) } return rc } // Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted // variable so that older snapshots can be accessed. To do this, loop // through all wal frames from nBackfillAttempted to (nBackfill+1), // comparing their content to the corresponding page with the database // file, if any. Set nBackfillAttempted to the frame number of the // first frame for which the wal file content matches the db file. // // This is only really safe if the file-system is such that any page // writes made by earlier checkpointers were atomic operations, which // is not always true. It is also possible that nBackfillAttempted // may be left set to a value larger than expected, if a wal frame // contains content that duplicate of an earlier version of the same // page. // // SQLITE_OK is returned if successful, or an SQLite error code if an // error occurs. It is not an error if nBackfillAttempted cannot be // decreased at all. func Xsqlite3WalSnapshotRecover(tls *libc.TLS, pWal uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var rc int32 rc = walLockExclusive(tls, pWal, WAL_CKPT_LOCK, 1) if rc == SQLITE_OK { var pInfo uintptr = walCkptInfo(tls, pWal) var szPage int32 = int32((*Wal)(unsafe.Pointer(pWal)).FszPage) rc = Xsqlite3OsFileSize(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, bp) if rc == SQLITE_OK { var pBuf1 uintptr = Xsqlite3_malloc(tls, szPage) var pBuf2 uintptr = Xsqlite3_malloc(tls, szPage) if pBuf1 == uintptr(0) || pBuf2 == uintptr(0) { rc = SQLITE_NOMEM } else { var i U32 = (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfillAttempted for i = (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfillAttempted; i > libc.AtomicLoadNUint32(pInfo, 0); i-- { var pgno U32 var iDbOff I64 var iWalOff I64 rc = walHashGet(tls, pWal, walFramePage(tls, i), bp+8) if rc != SQLITE_OK { break } pgno = *(*U32)(unsafe.Pointer((*WalHashLoc)(unsafe.Pointer(bp+8)).FaPgno + uintptr(i-(*WalHashLoc)(unsafe.Pointer(bp+8)).FiZero-U32(1))*4)) iDbOff = I64(pgno-U32(1)) * I64(szPage) if iDbOff+I64(szPage) <= *(*I64)(unsafe.Pointer(bp)) { iWalOff = int64(WAL_HDRSIZE) + I64(i-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) + int64(WAL_FRAME_HDRSIZE) rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, pBuf1, szPage, iWalOff) if rc == SQLITE_OK { rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, pBuf2, szPage, iDbOff) } if rc != SQLITE_OK || 0 == libc.Xmemcmp(tls, pBuf1, pBuf2, uint64(szPage)) { break } } (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfillAttempted = i - U32(1) } } Xsqlite3_free(tls, pBuf1) Xsqlite3_free(tls, pBuf2) } walUnlockExclusive(tls, pWal, WAL_CKPT_LOCK, 1) } return rc } // Begin a read transaction on the database. // // This routine used to be called sqlite3OpenSnapshot() and with good reason: // it takes a snapshot of the state of the WAL and wal-index for the current // instant in time. The current thread will continue to use this snapshot. // Other threads might append new content to the WAL and wal-index but // that extra content is ignored by the current thread. // // If the database contents have changes since the previous read // transaction, then *pChanged is set to 1 before returning. The // Pager layer will use this to know that its cache is stale and // needs to be flushed. func Xsqlite3WalBeginReadTransaction(tls *libc.TLS, pWal uintptr, pChanged uintptr) int32 { var rc int32 var cnt int32 = 0 var bChanged int32 = 0 var pSnapshot uintptr = (*Wal)(unsafe.Pointer(pWal)).FpSnapshot if pSnapshot != 0 { if libc.Xmemcmp(tls, pSnapshot, pWal+72, uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { bChanged = 1 } rc = walLockShared(tls, pWal, WAL_CKPT_LOCK) if rc != SQLITE_OK { return rc } (*Wal)(unsafe.Pointer(pWal)).FckptLock = U8(1) } for __ccgo := true; __ccgo; __ccgo = rc == -1 { rc = walTryBeginRead(tls, pWal, pChanged, 0, libc.PreIncInt32(&cnt, 1)) } if rc == SQLITE_OK { if pSnapshot != 0 && libc.Xmemcmp(tls, pSnapshot, pWal+72, uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { var pInfo uintptr = walCkptInfo(tls, pWal) if !(libc.Xmemcmp(tls, pSnapshot+32, pWal+72+32, uint64(unsafe.Sizeof([2]U32{}))) != 0) && (*WalIndexHdr)(unsafe.Pointer(pSnapshot)).FmxFrame >= (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfillAttempted { libc.Xmemcpy(tls, pWal+72, pSnapshot, uint64(unsafe.Sizeof(WalIndexHdr{}))) *(*int32)(unsafe.Pointer(pChanged)) = bChanged } else { rc = SQLITE_ERROR | int32(3)<<8 } (*Wal)(unsafe.Pointer(pWal)).FminFrame = U32(1) if rc != SQLITE_OK { Xsqlite3WalEndReadTransaction(tls, pWal) } } } if (*Wal)(unsafe.Pointer(pWal)).FckptLock != 0 { walUnlockShared(tls, pWal, WAL_CKPT_LOCK) (*Wal)(unsafe.Pointer(pWal)).FckptLock = U8(0) } return rc } // Finish with a read transaction. All this does is release the // read-lock. func Xsqlite3WalEndReadTransaction(tls *libc.TLS, pWal uintptr) { Xsqlite3WalEndWriteTransaction(tls, pWal) if int32((*Wal)(unsafe.Pointer(pWal)).FreadLock) >= 0 { walUnlockShared(tls, pWal, 3+int32((*Wal)(unsafe.Pointer(pWal)).FreadLock)) (*Wal)(unsafe.Pointer(pWal)).FreadLock = int16(-1) } } // Search the wal file for page pgno. If found, set *piRead to the frame that // contains the page. Otherwise, if pgno is not in the wal file, set *piRead // to zero. // // Return SQLITE_OK if successful, or an error code if an error occurs. If an // error does occur, the final value of *piRead is undefined. func Xsqlite3WalFindFrame(tls *libc.TLS, pWal uintptr, pgno Pgno, piRead uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var iRead U32 = U32(0) var iLast U32 = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame var iHash int32 var iMinHash int32 if iLast == U32(0) || int32((*Wal)(unsafe.Pointer(pWal)).FreadLock) == 0 && int32((*Wal)(unsafe.Pointer(pWal)).FbShmUnreliable) == 0 { *(*U32)(unsafe.Pointer(piRead)) = U32(0) return SQLITE_OK } iMinHash = walFramePage(tls, (*Wal)(unsafe.Pointer(pWal)).FminFrame) for iHash = walFramePage(tls, iLast); iHash >= iMinHash; iHash-- { var iKey int32 var nCollide int32 var rc int32 var iH U32 rc = walHashGet(tls, pWal, iHash, bp) if rc != SQLITE_OK { return rc } nCollide = HASHTABLE_NPAGE * 2 iKey = walHash(tls, pgno) for libc.AssignUint32(&iH, U32(libc.AtomicLoadNUint16((*WalHashLoc)(unsafe.Pointer(bp)).FaHash+uintptr(iKey)*2, 0))) != U32(0) { var iFrame U32 = iH + (*WalHashLoc)(unsafe.Pointer(bp)).FiZero if iFrame <= iLast && iFrame >= (*Wal)(unsafe.Pointer(pWal)).FminFrame && *(*U32)(unsafe.Pointer((*WalHashLoc)(unsafe.Pointer(bp)).FaPgno + uintptr(iH-U32(1))*4)) == pgno { iRead = iFrame } if libc.PostDecInt32(&nCollide, 1) == 0 { return Xsqlite3CorruptError(tls, 66423) } iKey = walNextHash(tls, iKey) } if iRead != 0 { break } } *(*U32)(unsafe.Pointer(piRead)) = iRead return SQLITE_OK } // Read the contents of frame iRead from the wal file into buffer pOut // (which is nOut bytes in size). Return SQLITE_OK if successful, or an // error code otherwise. func Xsqlite3WalReadFrame(tls *libc.TLS, pWal uintptr, iRead U32, nOut int32, pOut uintptr) int32 { var sz int32 var iOffset I64 sz = int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FszPage) sz = sz&0xfe00 + sz&0x0001<<16 iOffset = int64(WAL_HDRSIZE) + I64(iRead-U32(1))*I64(sz+WAL_FRAME_HDRSIZE) + int64(WAL_FRAME_HDRSIZE) return Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, pOut, func() int32 { if nOut > sz { return sz } return nOut }(), iOffset) } // Return the size of the database in pages (or zero, if unknown). func Xsqlite3WalDbsize(tls *libc.TLS, pWal uintptr) Pgno { if pWal != 0 && int32((*Wal)(unsafe.Pointer(pWal)).FreadLock) >= 0 { return (*Wal)(unsafe.Pointer(pWal)).Fhdr.FnPage } return Pgno(0) } // This function starts a write transaction on the WAL. // // A read transaction must have already been started by a prior call // to sqlite3WalBeginReadTransaction(). // // If another thread or process has written into the database since // the read transaction was started, then it is not possible for this // thread to write as doing so would cause a fork. So this routine // returns SQLITE_BUSY in that case and no write transaction is started. // // There can only be a single writer active at a time. func Xsqlite3WalBeginWriteTransaction(tls *libc.TLS, pWal uintptr) int32 { var rc int32 if (*Wal)(unsafe.Pointer(pWal)).FreadOnly != 0 { return SQLITE_READONLY } rc = walLockExclusive(tls, pWal, WAL_WRITE_LOCK, 1) if rc != 0 { return rc } (*Wal)(unsafe.Pointer(pWal)).FwriteLock = U8(1) if libc.Xmemcmp(tls, pWal+72, walIndexHdr(tls, pWal), uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { walUnlockExclusive(tls, pWal, WAL_WRITE_LOCK, 1) (*Wal)(unsafe.Pointer(pWal)).FwriteLock = U8(0) rc = SQLITE_BUSY | int32(2)<<8 } return rc } // End a write transaction. The commit has already been done. This // routine merely releases the lock. func Xsqlite3WalEndWriteTransaction(tls *libc.TLS, pWal uintptr) int32 { if (*Wal)(unsafe.Pointer(pWal)).FwriteLock != 0 { walUnlockExclusive(tls, pWal, WAL_WRITE_LOCK, 1) (*Wal)(unsafe.Pointer(pWal)).FwriteLock = U8(0) (*Wal)(unsafe.Pointer(pWal)).FiReCksum = U32(0) (*Wal)(unsafe.Pointer(pWal)).FtruncateOnCommit = U8(0) } return SQLITE_OK } // If any data has been written (but not committed) to the log file, this // function moves the write-pointer back to the start of the transaction. // // Additionally, the callback function is invoked for each frame written // to the WAL since the start of the transaction. If the callback returns // other than SQLITE_OK, it is not invoked again and the error code is // returned to the caller. // // Otherwise, if the callback function does not return an error, this // function returns SQLITE_OK. func Xsqlite3WalUndo(tls *libc.TLS, pWal uintptr, xUndo uintptr, pUndoCtx uintptr) int32 { var rc int32 = SQLITE_OK if (*Wal)(unsafe.Pointer(pWal)).FwriteLock != 0 { var iMax Pgno = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame var iFrame Pgno libc.Xmemcpy(tls, pWal+72, walIndexHdr(tls, pWal), uint64(unsafe.Sizeof(WalIndexHdr{}))) for iFrame = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame + U32(1); rc == SQLITE_OK && iFrame <= iMax; iFrame++ { rc = (*struct { f func(*libc.TLS, uintptr, Pgno) int32 })(unsafe.Pointer(&struct{ uintptr }{xUndo})).f(tls, pUndoCtx, walFramePgno(tls, pWal, iFrame)) } if iMax != (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame { walCleanupHash(tls, pWal) } } return rc } // Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32 // values. This function populates the array with values required to // "rollback" the write position of the WAL handle back to the current // point in the event of a savepoint rollback (via WalSavepointUndo()). func Xsqlite3WalSavepoint(tls *libc.TLS, pWal uintptr, aWalData uintptr) { *(*U32)(unsafe.Pointer(aWalData)) = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame *(*U32)(unsafe.Pointer(aWalData + 1*4)) = *(*U32)(unsafe.Pointer(pWal + 72 + 24)) *(*U32)(unsafe.Pointer(aWalData + 2*4)) = *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) *(*U32)(unsafe.Pointer(aWalData + 3*4)) = (*Wal)(unsafe.Pointer(pWal)).FnCkpt } // Move the write position of the WAL back to the point identified by // the values in the aWalData[] array. aWalData must point to an array // of WAL_SAVEPOINT_NDATA u32 values that has been previously populated // by a call to WalSavepoint(). func Xsqlite3WalSavepointUndo(tls *libc.TLS, pWal uintptr, aWalData uintptr) int32 { var rc int32 = SQLITE_OK if *(*U32)(unsafe.Pointer(aWalData + 3*4)) != (*Wal)(unsafe.Pointer(pWal)).FnCkpt { *(*U32)(unsafe.Pointer(aWalData)) = U32(0) *(*U32)(unsafe.Pointer(aWalData + 3*4)) = (*Wal)(unsafe.Pointer(pWal)).FnCkpt } if *(*U32)(unsafe.Pointer(aWalData)) < (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame { (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame = *(*U32)(unsafe.Pointer(aWalData)) *(*U32)(unsafe.Pointer(pWal + 72 + 24)) = *(*U32)(unsafe.Pointer(aWalData + 1*4)) *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) = *(*U32)(unsafe.Pointer(aWalData + 2*4)) walCleanupHash(tls, pWal) } return rc } func walRestartLog(tls *libc.TLS, pWal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var cnt int32 if int32((*Wal)(unsafe.Pointer(pWal)).FreadLock) == 0 { var pInfo uintptr = walCkptInfo(tls, pWal) if (*WalCkptInfo)(unsafe.Pointer(pInfo)).FnBackfill > U32(0) { Xsqlite3_randomness(tls, 4, bp) rc = walLockExclusive(tls, pWal, 3+1, SQLITE_SHM_NLOCK-3-1) if rc == SQLITE_OK { walRestartHdr(tls, pWal, *(*U32)(unsafe.Pointer(bp))) walUnlockExclusive(tls, pWal, 3+1, SQLITE_SHM_NLOCK-3-1) } else if rc != SQLITE_BUSY { return rc } } walUnlockShared(tls, pWal, 3+0) (*Wal)(unsafe.Pointer(pWal)).FreadLock = int16(-1) cnt = 0 for __ccgo := true; __ccgo; __ccgo = rc == -1 { rc = walTryBeginRead(tls, pWal, bp+4, 1, libc.PreIncInt32(&cnt, 1)) } } return rc } // Information about the current state of the WAL file and where // the next fsync should occur - passed from sqlite3WalFrames() into // walWriteToLog(). type WalWriter1 = struct { FpWal uintptr FpFd uintptr FiSyncPoint Sqlite3_int64 FsyncFlags int32 FszPage int32 } // Information about the current state of the WAL file and where // the next fsync should occur - passed from sqlite3WalFrames() into // walWriteToLog(). type WalWriter = WalWriter1 func walWriteToLog(tls *libc.TLS, p uintptr, pContent uintptr, iAmt int32, iOffset Sqlite3_int64) int32 { var rc int32 if iOffset < (*WalWriter)(unsafe.Pointer(p)).FiSyncPoint && iOffset+Sqlite3_int64(iAmt) >= (*WalWriter)(unsafe.Pointer(p)).FiSyncPoint { var iFirstAmt int32 = int32((*WalWriter)(unsafe.Pointer(p)).FiSyncPoint - iOffset) rc = Xsqlite3OsWrite(tls, (*WalWriter)(unsafe.Pointer(p)).FpFd, pContent, iFirstAmt, iOffset) if rc != 0 { return rc } iOffset = iOffset + Sqlite3_int64(iFirstAmt) iAmt = iAmt - iFirstAmt pContent = uintptr(iFirstAmt) + pContent rc = Xsqlite3OsSync(tls, (*WalWriter)(unsafe.Pointer(p)).FpFd, (*WalWriter)(unsafe.Pointer(p)).FsyncFlags&0x03) if iAmt == 0 || rc != 0 { return rc } } rc = Xsqlite3OsWrite(tls, (*WalWriter)(unsafe.Pointer(p)).FpFd, pContent, iAmt, iOffset) return rc } func walWriteOneFrame(tls *libc.TLS, p uintptr, pPage uintptr, nTruncate int32, iOffset Sqlite3_int64) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 var pData uintptr pData = (*PgHdr)(unsafe.Pointer(pPage)).FpData walEncodeFrame(tls, (*WalWriter)(unsafe.Pointer(p)).FpWal, (*PgHdr)(unsafe.Pointer(pPage)).Fpgno, uint32(nTruncate), pData, bp) rc = walWriteToLog(tls, p, bp, int32(unsafe.Sizeof([24]U8{})), iOffset) if rc != 0 { return rc } rc = walWriteToLog(tls, p, pData, (*WalWriter)(unsafe.Pointer(p)).FszPage, int64(uint64(iOffset)+uint64(unsafe.Sizeof([24]U8{})))) return rc } func walRewriteChecksums(tls *libc.TLS, pWal uintptr, iLast U32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var szPage int32 = int32((*Wal)(unsafe.Pointer(pWal)).FszPage) var rc int32 = SQLITE_OK var aBuf uintptr var iRead U32 var iCksumOff I64 aBuf = Xsqlite3_malloc(tls, szPage+WAL_FRAME_HDRSIZE) if aBuf == uintptr(0) { return SQLITE_NOMEM } if (*Wal)(unsafe.Pointer(pWal)).FiReCksum == U32(1) { iCksumOff = int64(24) } else { iCksumOff = int64(WAL_HDRSIZE) + I64((*Wal)(unsafe.Pointer(pWal)).FiReCksum-U32(1)-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) + int64(16) } rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, aBuf, int32(uint64(unsafe.Sizeof(U32(0)))*uint64(2)), iCksumOff) *(*U32)(unsafe.Pointer(pWal + 72 + 24)) = Xsqlite3Get4byte(tls, aBuf) *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) = Xsqlite3Get4byte(tls, aBuf+4) iRead = (*Wal)(unsafe.Pointer(pWal)).FiReCksum (*Wal)(unsafe.Pointer(pWal)).FiReCksum = U32(0) for ; rc == SQLITE_OK && iRead <= iLast; iRead++ { var iOff I64 = int64(WAL_HDRSIZE) + I64(iRead-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) rc = Xsqlite3OsRead(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, aBuf, szPage+WAL_FRAME_HDRSIZE, iOff) if rc == SQLITE_OK { var iPgno U32 var nDbSize U32 iPgno = Xsqlite3Get4byte(tls, aBuf) nDbSize = Xsqlite3Get4byte(tls, aBuf+4) walEncodeFrame(tls, pWal, iPgno, nDbSize, aBuf+24, bp) rc = Xsqlite3OsWrite(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, bp, int32(unsafe.Sizeof([24]U8{})), iOff) } } Xsqlite3_free(tls, aBuf) return rc } // Write a set of frames to the log. The caller must hold the write-lock // on the log file (obtained using sqlite3WalBeginWriteTransaction()). func Xsqlite3WalFrames(tls *libc.TLS, pWal uintptr, szPage int32, pList uintptr, nTruncate Pgno, isCommit int32, sync_flags int32) int32 { bp := tls.Alloc(80) defer tls.Free(80) var rc int32 var iFrame U32 var p uintptr var pLast uintptr = uintptr(0) var nExtra int32 = 0 var szFrame int32 var iOffset I64 var iFirst U32 = U32(0) var pLive uintptr pLive = walIndexHdr(tls, pWal) if libc.Xmemcmp(tls, pWal+72, pLive, uint64(unsafe.Sizeof(WalIndexHdr{}))) != 0 { iFirst = (*WalIndexHdr)(unsafe.Pointer(pLive)).FmxFrame + U32(1) } if SQLITE_OK != libc.AssignInt32(&rc, walRestartLog(tls, pWal)) { return rc } iFrame = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame if iFrame == U32(0) { Xsqlite3Put4byte(tls, bp, uint32(WAL_MAGIC|SQLITE_BIGENDIAN)) Xsqlite3Put4byte(tls, bp+4, uint32(WAL_MAX_VERSION)) Xsqlite3Put4byte(tls, bp+8, uint32(szPage)) Xsqlite3Put4byte(tls, bp+12, (*Wal)(unsafe.Pointer(pWal)).FnCkpt) if (*Wal)(unsafe.Pointer(pWal)).FnCkpt == U32(0) { Xsqlite3_randomness(tls, 8, pWal+72+32) } libc.Xmemcpy(tls, bp+16, pWal+72+32, uint64(8)) walChecksumBytes(tls, 1, bp, WAL_HDRSIZE-2*4, uintptr(0), bp+32) Xsqlite3Put4byte(tls, bp+24, *(*U32)(unsafe.Pointer(bp + 32))) Xsqlite3Put4byte(tls, bp+28, *(*U32)(unsafe.Pointer(bp + 32 + 1*4))) (*Wal)(unsafe.Pointer(pWal)).FszPage = U32(szPage) (*Wal)(unsafe.Pointer(pWal)).Fhdr.FbigEndCksum = U8(SQLITE_BIGENDIAN) *(*U32)(unsafe.Pointer(pWal + 72 + 24)) = *(*U32)(unsafe.Pointer(bp + 32)) *(*U32)(unsafe.Pointer(pWal + 72 + 24 + 1*4)) = *(*U32)(unsafe.Pointer(bp + 32 + 1*4)) (*Wal)(unsafe.Pointer(pWal)).FtruncateOnCommit = U8(1) rc = Xsqlite3OsWrite(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, bp, int32(unsafe.Sizeof([32]U8{})), int64(0)) if rc != SQLITE_OK { return rc } if (*Wal)(unsafe.Pointer(pWal)).FsyncHeader != 0 { rc = Xsqlite3OsSync(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, sync_flags>>2&0x03) if rc != 0 { return rc } } } (*WalWriter)(unsafe.Pointer(bp + 48)).FpWal = pWal (*WalWriter)(unsafe.Pointer(bp + 48)).FpFd = (*Wal)(unsafe.Pointer(pWal)).FpWalFd (*WalWriter)(unsafe.Pointer(bp + 48)).FiSyncPoint = int64(0) (*WalWriter)(unsafe.Pointer(bp + 48)).FsyncFlags = sync_flags (*WalWriter)(unsafe.Pointer(bp + 48)).FszPage = szPage iOffset = int64(WAL_HDRSIZE) + I64(iFrame+U32(1)-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) szFrame = szPage + WAL_FRAME_HDRSIZE for p = pList; p != 0; p = (*PgHdr)(unsafe.Pointer(p)).FpDirty { var nDbSize int32 if iFirst != 0 && ((*PgHdr)(unsafe.Pointer(p)).FpDirty != 0 || isCommit == 0) { *(*U32)(unsafe.Pointer(bp + 40)) = U32(0) Xsqlite3WalFindFrame(tls, pWal, (*PgHdr)(unsafe.Pointer(p)).Fpgno, bp+40) if *(*U32)(unsafe.Pointer(bp + 40)) >= iFirst { var iOff I64 = int64(WAL_HDRSIZE) + I64(*(*U32)(unsafe.Pointer(bp + 40))-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) + int64(WAL_FRAME_HDRSIZE) var pData uintptr if (*Wal)(unsafe.Pointer(pWal)).FiReCksum == U32(0) || *(*U32)(unsafe.Pointer(bp + 40)) < (*Wal)(unsafe.Pointer(pWal)).FiReCksum { (*Wal)(unsafe.Pointer(pWal)).FiReCksum = *(*U32)(unsafe.Pointer(bp + 40)) } pData = (*PgHdr)(unsafe.Pointer(p)).FpData rc = Xsqlite3OsWrite(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd, pData, szPage, iOff) if rc != 0 { return rc } *(*U16)(unsafe.Pointer(p + 52)) &= libc.Uint16FromInt32(libc.CplInt32(PGHDR_WAL_APPEND)) continue } } iFrame++ if isCommit != 0 && (*PgHdr)(unsafe.Pointer(p)).FpDirty == uintptr(0) { nDbSize = int32(nTruncate) } else { nDbSize = 0 } rc = walWriteOneFrame(tls, bp+48, p, nDbSize, iOffset) if rc != 0 { return rc } pLast = p iOffset = iOffset + I64(szFrame) *(*U16)(unsafe.Pointer(p + 52)) |= U16(PGHDR_WAL_APPEND) } if isCommit != 0 && (*Wal)(unsafe.Pointer(pWal)).FiReCksum != 0 { rc = walRewriteChecksums(tls, pWal, iFrame) if rc != 0 { return rc } } if isCommit != 0 && sync_flags&0x03 != 0 { var bSync int32 = 1 if (*Wal)(unsafe.Pointer(pWal)).FpadToSectorBoundary != 0 { var sectorSize int32 = Xsqlite3SectorSize(tls, (*Wal)(unsafe.Pointer(pWal)).FpWalFd) (*WalWriter)(unsafe.Pointer(bp + 48)).FiSyncPoint = (iOffset + I64(sectorSize) - int64(1)) / I64(sectorSize) * I64(sectorSize) bSync = libc.Bool32((*WalWriter)(unsafe.Pointer(bp+48)).FiSyncPoint == iOffset) for iOffset < (*WalWriter)(unsafe.Pointer(bp+48)).FiSyncPoint { rc = walWriteOneFrame(tls, bp+48, pLast, int32(nTruncate), iOffset) if rc != 0 { return rc } iOffset = iOffset + I64(szFrame) nExtra++ } } if bSync != 0 { rc = Xsqlite3OsSync(tls, (*WalWriter)(unsafe.Pointer(bp+48)).FpFd, sync_flags&0x03) } } if isCommit != 0 && (*Wal)(unsafe.Pointer(pWal)).FtruncateOnCommit != 0 && (*Wal)(unsafe.Pointer(pWal)).FmxWalSize >= int64(0) { var sz I64 = (*Wal)(unsafe.Pointer(pWal)).FmxWalSize if int64(WAL_HDRSIZE)+I64(iFrame+U32(nExtra)+U32(1)-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) > (*Wal)(unsafe.Pointer(pWal)).FmxWalSize { sz = int64(WAL_HDRSIZE) + I64(iFrame+U32(nExtra)+U32(1)-U32(1))*I64(szPage+WAL_FRAME_HDRSIZE) } walLimitSize(tls, pWal, sz) (*Wal)(unsafe.Pointer(pWal)).FtruncateOnCommit = U8(0) } iFrame = (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame for p = pList; p != 0 && rc == SQLITE_OK; p = (*PgHdr)(unsafe.Pointer(p)).FpDirty { if int32((*PgHdr)(unsafe.Pointer(p)).Fflags)&PGHDR_WAL_APPEND == 0 { continue } iFrame++ rc = walIndexAppend(tls, pWal, iFrame, (*PgHdr)(unsafe.Pointer(p)).Fpgno) } for rc == SQLITE_OK && nExtra > 0 { iFrame++ nExtra-- rc = walIndexAppend(tls, pWal, iFrame, (*PgHdr)(unsafe.Pointer(pLast)).Fpgno) } if rc == SQLITE_OK { (*Wal)(unsafe.Pointer(pWal)).Fhdr.FszPage = U16(szPage&0xff00 | szPage>>16) (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame = iFrame if isCommit != 0 { (*Wal)(unsafe.Pointer(pWal)).Fhdr.FiChange++ (*Wal)(unsafe.Pointer(pWal)).Fhdr.FnPage = nTruncate } if isCommit != 0 { walIndexWriteHdr(tls, pWal) (*Wal)(unsafe.Pointer(pWal)).FiCallback = iFrame } } return rc } // This routine is called to implement sqlite3_wal_checkpoint() and // related interfaces. // // Obtain a CHECKPOINT lock and then backfill as much information as // we can from WAL into the database. // // If parameter xBusy is not NULL, it is a pointer to a busy-handler // callback. In this case this function runs a blocking checkpoint. func Xsqlite3WalCheckpoint(tls *libc.TLS, pWal uintptr, db uintptr, eMode int32, xBusy uintptr, pBusyArg uintptr, sync_flags int32, nBuf int32, zBuf uintptr, pnLog uintptr, pnCkpt uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 *(*int32)(unsafe.Pointer(bp)) = 0 var eMode2 int32 = eMode var xBusy2 uintptr = xBusy if (*Wal)(unsafe.Pointer(pWal)).FreadOnly != 0 { return SQLITE_READONLY } rc = walLockExclusive(tls, pWal, WAL_CKPT_LOCK, 1) if rc == SQLITE_OK { (*Wal)(unsafe.Pointer(pWal)).FckptLock = U8(1) if eMode != SQLITE_CHECKPOINT_PASSIVE { rc = walBusyLock(tls, pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1) if rc == SQLITE_OK { (*Wal)(unsafe.Pointer(pWal)).FwriteLock = U8(1) } else if rc == SQLITE_BUSY { eMode2 = SQLITE_CHECKPOINT_PASSIVE xBusy2 = uintptr(0) rc = SQLITE_OK } } } if rc == SQLITE_OK { rc = walIndexReadHdr(tls, pWal, bp) if *(*int32)(unsafe.Pointer(bp)) != 0 && (*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Wal)(unsafe.Pointer(pWal)).FpDbFd)).FpMethods)).FiVersion >= 3 { Xsqlite3OsUnfetch(tls, (*Wal)(unsafe.Pointer(pWal)).FpDbFd, int64(0), uintptr(0)) } } if rc == SQLITE_OK { if (*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame != 0 && walPagesize(tls, pWal) != nBuf { rc = Xsqlite3CorruptError(tls, 67142) } else { rc = walCheckpoint(tls, pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf) } if rc == SQLITE_OK || rc == SQLITE_BUSY { if pnLog != 0 { *(*int32)(unsafe.Pointer(pnLog)) = int32((*Wal)(unsafe.Pointer(pWal)).Fhdr.FmxFrame) } if pnCkpt != 0 { *(*int32)(unsafe.Pointer(pnCkpt)) = int32((*WalCkptInfo)(unsafe.Pointer(walCkptInfo(tls, pWal))).FnBackfill) } } } if *(*int32)(unsafe.Pointer(bp)) != 0 { libc.Xmemset(tls, pWal+72, 0, uint64(unsafe.Sizeof(WalIndexHdr{}))) } Xsqlite3WalEndWriteTransaction(tls, pWal) if (*Wal)(unsafe.Pointer(pWal)).FckptLock != 0 { walUnlockExclusive(tls, pWal, WAL_CKPT_LOCK, 1) (*Wal)(unsafe.Pointer(pWal)).FckptLock = U8(0) } return func() int32 { if rc == SQLITE_OK && eMode != eMode2 { return SQLITE_BUSY } return rc }() } // Return the value to pass to a sqlite3_wal_hook callback, the // number of frames in the WAL at the point of the last commit since // sqlite3WalCallback() was called. If no commits have occurred since // the last call, then return 0. func Xsqlite3WalCallback(tls *libc.TLS, pWal uintptr) int32 { var ret U32 = U32(0) if pWal != 0 { ret = (*Wal)(unsafe.Pointer(pWal)).FiCallback (*Wal)(unsafe.Pointer(pWal)).FiCallback = U32(0) } return int32(ret) } // This function is called to change the WAL subsystem into or out // of locking_mode=EXCLUSIVE. // // If op is zero, then attempt to change from locking_mode=EXCLUSIVE // into locking_mode=NORMAL. This means that we must acquire a lock // on the pWal->readLock byte. If the WAL is already in locking_mode=NORMAL // or if the acquisition of the lock fails, then return 0. If the // transition out of exclusive-mode is successful, return 1. This // operation must occur while the pager is still holding the exclusive // lock on the main database file. // // If op is one, then change from locking_mode=NORMAL into // locking_mode=EXCLUSIVE. This means that the pWal->readLock must // be released. Return 1 if the transition is made and 0 if the // WAL is already in exclusive-locking mode - meaning that this // routine is a no-op. The pager must already hold the exclusive lock // on the main database file before invoking this operation. // // If op is negative, then do a dry-run of the op==1 case but do // not actually change anything. The pager uses this to see if it // should acquire the database exclusive lock prior to invoking // the op==1 case. func Xsqlite3WalExclusiveMode(tls *libc.TLS, pWal uintptr, op int32) int32 { var rc int32 if op == 0 { if int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) != WAL_NORMAL_MODE { (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode = U8(WAL_NORMAL_MODE) if walLockShared(tls, pWal, 3+int32((*Wal)(unsafe.Pointer(pWal)).FreadLock)) != SQLITE_OK { (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode = U8(WAL_EXCLUSIVE_MODE) } rc = libc.Bool32(int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) == WAL_NORMAL_MODE) } else { rc = 0 } } else if op > 0 { walUnlockShared(tls, pWal, 3+int32((*Wal)(unsafe.Pointer(pWal)).FreadLock)) (*Wal)(unsafe.Pointer(pWal)).FexclusiveMode = U8(WAL_EXCLUSIVE_MODE) rc = 1 } else { rc = libc.Bool32(int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) == WAL_NORMAL_MODE) } return rc } // Return true if the argument is non-NULL and the WAL module is using // heap-memory for the wal-index. Otherwise, if the argument is NULL or the // WAL module is using shared-memory, return false. func Xsqlite3WalHeapMemory(tls *libc.TLS, pWal uintptr) int32 { return libc.Bool32(pWal != 0 && int32((*Wal)(unsafe.Pointer(pWal)).FexclusiveMode) == WAL_HEAPMEMORY_MODE) } // Create a snapshot object. The content of a snapshot is opaque to // every other subsystem, so the WAL module can put whatever it needs // in the object. func Xsqlite3WalSnapshotGet(tls *libc.TLS, pWal uintptr, ppSnapshot uintptr) int32 { var rc int32 = SQLITE_OK var pRet uintptr if libc.Xmemcmp(tls, pWal+72+24, uintptr(unsafe.Pointer(&aZero)), uint64(16)) == 0 { *(*uintptr)(unsafe.Pointer(ppSnapshot)) = uintptr(0) return SQLITE_ERROR } pRet = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(WalIndexHdr{}))) if pRet == uintptr(0) { rc = SQLITE_NOMEM } else { libc.Xmemcpy(tls, pRet, pWal+72, uint64(unsafe.Sizeof(WalIndexHdr{}))) *(*uintptr)(unsafe.Pointer(ppSnapshot)) = pRet } return rc } var aZero = [4]U32{U32(0), U32(0), U32(0), U32(0)} // Try to open on pSnapshot when the next read-transaction starts func Xsqlite3WalSnapshotOpen(tls *libc.TLS, pWal uintptr, pSnapshot uintptr) { (*Wal)(unsafe.Pointer(pWal)).FpSnapshot = pSnapshot } // Return a +ve value if snapshot p1 is newer than p2. A -ve value if // p1 is older than p2 and zero if p1 and p2 are the same snapshot. func Xsqlite3_snapshot_cmp(tls *libc.TLS, p1 uintptr, p2 uintptr) int32 { var pHdr1 uintptr = p1 var pHdr2 uintptr = p2 if *(*U32)(unsafe.Pointer(pHdr1 + 32)) < *(*U32)(unsafe.Pointer(pHdr2 + 32)) { return -1 } if *(*U32)(unsafe.Pointer(pHdr1 + 32)) > *(*U32)(unsafe.Pointer(pHdr2 + 32)) { return +1 } if (*WalIndexHdr)(unsafe.Pointer(pHdr1)).FmxFrame < (*WalIndexHdr)(unsafe.Pointer(pHdr2)).FmxFrame { return -1 } if (*WalIndexHdr)(unsafe.Pointer(pHdr1)).FmxFrame > (*WalIndexHdr)(unsafe.Pointer(pHdr2)).FmxFrame { return +1 } return 0 } // The caller currently has a read transaction open on the database. // This function takes a SHARED lock on the CHECKPOINTER slot and then // checks if the snapshot passed as the second argument is still // available. If so, SQLITE_OK is returned. // // If the snapshot is not available, SQLITE_ERROR is returned. Or, if // the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error // occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER // lock is released before returning. func Xsqlite3WalSnapshotCheck(tls *libc.TLS, pWal uintptr, pSnapshot uintptr) int32 { var rc int32 rc = walLockShared(tls, pWal, WAL_CKPT_LOCK) if rc == SQLITE_OK { var pNew uintptr = pSnapshot if libc.Xmemcmp(tls, pNew+32, pWal+72+32, uint64(unsafe.Sizeof([2]U32{}))) != 0 || (*WalIndexHdr)(unsafe.Pointer(pNew)).FmxFrame < (*WalCkptInfo)(unsafe.Pointer(walCkptInfo(tls, pWal))).FnBackfillAttempted { rc = SQLITE_ERROR | int32(3)<<8 walUnlockShared(tls, pWal, WAL_CKPT_LOCK) } } return rc } // Release a lock obtained by an earlier successful call to // sqlite3WalSnapshotCheck(). func Xsqlite3WalSnapshotUnlock(tls *libc.TLS, pWal uintptr) { walUnlockShared(tls, pWal, WAL_CKPT_LOCK) } // Return the sqlite3_file object for the WAL file func Xsqlite3WalFile(tls *libc.TLS, pWal uintptr) uintptr { return (*Wal)(unsafe.Pointer(pWal)).FpWalFd } // Forward declarations type MemPage1 = struct { FisInit U8 FintKey U8 FintKeyLeaf U8 F__ccgo_pad1 [1]byte Fpgno Pgno Fleaf U8 FhdrOffset U8 FchildPtrSize U8 Fmax1bytePayload U8 FnOverflow U8 F__ccgo_pad2 [1]byte FmaxLocal U16 FminLocal U16 FcellOffset U16 FnFree int32 FnCell U16 FmaskPage U16 FaiOvfl [4]U16 F__ccgo_pad3 [4]byte FapOvfl [4]uintptr FpBt uintptr FaData uintptr FaDataEnd uintptr FaCellIdx uintptr FaDataOfst uintptr FpDbPage uintptr FxCellSize uintptr FxParseCell uintptr } // Forward declarations type MemPage = MemPage1 type BtLock1 = struct { FpBtree uintptr FiTable Pgno FeLock U8 F__ccgo_pad1 [3]byte FpNext uintptr } type BtLock = BtLock1 type CellInfo1 = struct { FnKey I64 FpPayload uintptr FnPayload U32 FnLocal U16 FnSize U16 } type CellInfo = CellInfo1 // This structure is passed around through all the PRAGMA integrity_check // checking routines in order to keep track of some global state information. // // The aRef[] array is allocated so that there is 1 bit for each page in // the database. As the integrity-check proceeds, for each page used in // the database the corresponding bit is set. This allows integrity-check to // detect pages that are used twice and orphaned pages (both of which // indicate corruption). type IntegrityCk1 = struct { FpBt uintptr FpPager uintptr FaPgRef uintptr FnPage Pgno FmxErr int32 FnErr int32 Frc int32 FnStep U32 F__ccgo_pad1 [4]byte FzPfx uintptr Fv1 Pgno Fv2 int32 FerrMsg StrAccum Fheap uintptr Fdb uintptr } // This structure is passed around through all the PRAGMA integrity_check // checking routines in order to keep track of some global state information. // // The aRef[] array is allocated so that there is 1 bit for each page in // the database. As the integrity-check proceeds, for each page used in // the database the corresponding bit is set. This allows integrity-check to // detect pages that are used twice and orphaned pages (both of which // indicate corruption). type IntegrityCk = IntegrityCk1 func lockBtreeMutex(tls *libc.TLS, p uintptr) { Xsqlite3_mutex_enter(tls, (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).Fmutex) (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).Fdb = (*Btree)(unsafe.Pointer(p)).Fdb (*Btree)(unsafe.Pointer(p)).Flocked = U8(1) } func unlockBtreeMutex(tls *libc.TLS, p uintptr) { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3_mutex_leave(tls, (*BtShared)(unsafe.Pointer(pBt)).Fmutex) (*Btree)(unsafe.Pointer(p)).Flocked = U8(0) } // Enter a mutex on the given BTree object. // // If the object is not sharable, then no mutex is ever required // and this routine is a no-op. The underlying mutex is non-recursive. // But we keep a reference count in Btree.wantToLock so the behavior // of this interface is recursive. // // To avoid deadlocks, multiple Btrees are locked in the same order // by all database connections. The p->pNext is a list of other // Btrees belonging to the same database connection as the p Btree // which need to be locked after p. If we cannot get a lock on // p, then first unlock all of the others on p->pNext, then wait // for the lock to become available on p, then relock all of the // subsequent Btrees that desire a lock. func Xsqlite3BtreeEnter(tls *libc.TLS, p uintptr) { if !(int32((*Btree)(unsafe.Pointer(p)).Fsharable) != 0) { return } (*Btree)(unsafe.Pointer(p)).FwantToLock++ if (*Btree)(unsafe.Pointer(p)).Flocked != 0 { return } btreeLockCarefully(tls, p) } func btreeLockCarefully(tls *libc.TLS, p uintptr) { var pLater uintptr if Xsqlite3_mutex_try(tls, (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).Fmutex) == SQLITE_OK { (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).Fdb = (*Btree)(unsafe.Pointer(p)).Fdb (*Btree)(unsafe.Pointer(p)).Flocked = U8(1) return } for pLater = (*Btree)(unsafe.Pointer(p)).FpNext; pLater != 0; pLater = (*Btree)(unsafe.Pointer(pLater)).FpNext { if (*Btree)(unsafe.Pointer(pLater)).Flocked != 0 { unlockBtreeMutex(tls, pLater) } } lockBtreeMutex(tls, p) for pLater = (*Btree)(unsafe.Pointer(p)).FpNext; pLater != 0; pLater = (*Btree)(unsafe.Pointer(pLater)).FpNext { if (*Btree)(unsafe.Pointer(pLater)).FwantToLock != 0 { lockBtreeMutex(tls, pLater) } } } // Exit the recursive mutex on a Btree. func Xsqlite3BtreeLeave(tls *libc.TLS, p uintptr) { if (*Btree)(unsafe.Pointer(p)).Fsharable != 0 { (*Btree)(unsafe.Pointer(p)).FwantToLock-- if (*Btree)(unsafe.Pointer(p)).FwantToLock == 0 { unlockBtreeMutex(tls, p) } } } func btreeEnterAll(tls *libc.TLS, db uintptr) { var i int32 var skipOk int32 = 1 var p uintptr for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { p = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if p != 0 && (*Btree)(unsafe.Pointer(p)).Fsharable != 0 { Xsqlite3BtreeEnter(tls, p) skipOk = 0 } } (*Sqlite3)(unsafe.Pointer(db)).FnoSharedCache = U8(skipOk) } func Xsqlite3BtreeEnterAll(tls *libc.TLS, db uintptr) { if int32((*Sqlite3)(unsafe.Pointer(db)).FnoSharedCache) == 0 { btreeEnterAll(tls, db) } } func btreeLeaveAll(tls *libc.TLS, db uintptr) { var i int32 var p uintptr for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { p = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if p != 0 { Xsqlite3BtreeLeave(tls, p) } } } func Xsqlite3BtreeLeaveAll(tls *libc.TLS, db uintptr) { if int32((*Sqlite3)(unsafe.Pointer(db)).FnoSharedCache) == 0 { btreeLeaveAll(tls, db) } } // Enter a mutex on a Btree given a cursor owned by that Btree. // // These entry points are used by incremental I/O only. Enter() is required // any time OMIT_SHARED_CACHE is not defined, regardless of whether or not // the build is threadsafe. Leave() is only required by threadsafe builds. func Xsqlite3BtreeEnterCursor(tls *libc.TLS, pCur uintptr) { Xsqlite3BtreeEnter(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpBtree) } func Xsqlite3BtreeLeaveCursor(tls *libc.TLS, pCur uintptr) { Xsqlite3BtreeLeave(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpBtree) } var zMagicHeader = *(*[16]int8)(unsafe.Pointer(ts + 5385)) var sqlite3SharedCacheList uintptr = uintptr(0) // Enable or disable the shared pager and schema features. // // This routine has no effect on existing database connections. // The shared cache setting effects only future calls to // sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2(). func Xsqlite3_enable_shared_cache(tls *libc.TLS, enable int32) int32 { Xsqlite3Config.FsharedCacheEnabled = enable return SQLITE_OK } func querySharedCacheTableLock(tls *libc.TLS, p uintptr, iTab Pgno, eLock U8) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var pIter uintptr if !(int32((*Btree)(unsafe.Pointer(p)).Fsharable) != 0) { return SQLITE_OK } if (*BtShared)(unsafe.Pointer(pBt)).FpWriter != p && int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_EXCLUSIVE != 0 { Xsqlite3ConnectionBlocked(tls, (*Btree)(unsafe.Pointer(p)).Fdb, (*Btree)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpWriter)).Fdb) return SQLITE_LOCKED | int32(1)<<8 } for pIter = (*BtShared)(unsafe.Pointer(pBt)).FpLock; pIter != 0; pIter = (*BtLock)(unsafe.Pointer(pIter)).FpNext { if (*BtLock)(unsafe.Pointer(pIter)).FpBtree != p && (*BtLock)(unsafe.Pointer(pIter)).FiTable == iTab && int32((*BtLock)(unsafe.Pointer(pIter)).FeLock) != int32(eLock) { Xsqlite3ConnectionBlocked(tls, (*Btree)(unsafe.Pointer(p)).Fdb, (*Btree)(unsafe.Pointer((*BtLock)(unsafe.Pointer(pIter)).FpBtree)).Fdb) if int32(eLock) == WRITE_LOCK { *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_PENDING) } return SQLITE_LOCKED | int32(1)<<8 } } return SQLITE_OK } func setSharedCacheTableLock(tls *libc.TLS, p uintptr, iTable Pgno, eLock U8) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var pLock uintptr = uintptr(0) var pIter uintptr for pIter = (*BtShared)(unsafe.Pointer(pBt)).FpLock; pIter != 0; pIter = (*BtLock)(unsafe.Pointer(pIter)).FpNext { if (*BtLock)(unsafe.Pointer(pIter)).FiTable == iTable && (*BtLock)(unsafe.Pointer(pIter)).FpBtree == p { pLock = pIter break } } if !(pLock != 0) { pLock = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(BtLock{}))) if !(pLock != 0) { return SQLITE_NOMEM } (*BtLock)(unsafe.Pointer(pLock)).FiTable = iTable (*BtLock)(unsafe.Pointer(pLock)).FpBtree = p (*BtLock)(unsafe.Pointer(pLock)).FpNext = (*BtShared)(unsafe.Pointer(pBt)).FpLock (*BtShared)(unsafe.Pointer(pBt)).FpLock = pLock } if int32(eLock) > int32((*BtLock)(unsafe.Pointer(pLock)).FeLock) { (*BtLock)(unsafe.Pointer(pLock)).FeLock = eLock } return SQLITE_OK } func clearAllSharedCacheTableLocks(tls *libc.TLS, p uintptr) { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var ppIter uintptr = pBt + 120 for *(*uintptr)(unsafe.Pointer(ppIter)) != 0 { var pLock uintptr = *(*uintptr)(unsafe.Pointer(ppIter)) if (*BtLock)(unsafe.Pointer(pLock)).FpBtree == p { *(*uintptr)(unsafe.Pointer(ppIter)) = (*BtLock)(unsafe.Pointer(pLock)).FpNext if (*BtLock)(unsafe.Pointer(pLock)).FiTable != Pgno(1) { Xsqlite3_free(tls, pLock) } } else { ppIter = pLock + 16 } } if (*BtShared)(unsafe.Pointer(pBt)).FpWriter == p { (*BtShared)(unsafe.Pointer(pBt)).FpWriter = uintptr(0) *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_EXCLUSIVE | BTS_PENDING)) } else if (*BtShared)(unsafe.Pointer(pBt)).FnTransaction == 2 { *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_PENDING)) } } func downgradeAllSharedCacheTableLocks(tls *libc.TLS, p uintptr) { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt if (*BtShared)(unsafe.Pointer(pBt)).FpWriter == p { var pLock uintptr (*BtShared)(unsafe.Pointer(pBt)).FpWriter = uintptr(0) *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_EXCLUSIVE | BTS_PENDING)) for pLock = (*BtShared)(unsafe.Pointer(pBt)).FpLock; pLock != 0; pLock = (*BtLock)(unsafe.Pointer(pLock)).FpNext { (*BtLock)(unsafe.Pointer(pLock)).FeLock = U8(READ_LOCK) } } } func invalidateAllOverflowCache(tls *libc.TLS, pBt uintptr) { var p uintptr for p = (*BtShared)(unsafe.Pointer(pBt)).FpCursor; p != 0; p = (*BtCursor)(unsafe.Pointer(p)).FpNext { *(*U8)(unsafe.Pointer(p + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidOvfl)) } } func invalidateIncrblobCursors(tls *libc.TLS, pBtree uintptr, pgnoRoot Pgno, iRow I64, isClearTable int32) { var p uintptr (*Btree)(unsafe.Pointer(pBtree)).FhasIncrblobCur = U8(0) for p = (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(pBtree)).FpBt)).FpCursor; p != 0; p = (*BtCursor)(unsafe.Pointer(p)).FpNext { if int32((*BtCursor)(unsafe.Pointer(p)).FcurFlags)&BTCF_Incrblob != 0 { (*Btree)(unsafe.Pointer(pBtree)).FhasIncrblobCur = U8(1) if (*BtCursor)(unsafe.Pointer(p)).FpgnoRoot == pgnoRoot && (isClearTable != 0 || (*BtCursor)(unsafe.Pointer(p)).Finfo.FnKey == iRow) { (*BtCursor)(unsafe.Pointer(p)).FeState = U8(CURSOR_INVALID) } } } } func btreeSetHasContent(tls *libc.TLS, pBt uintptr, pgno Pgno) int32 { var rc int32 = SQLITE_OK if !(int32((*BtShared)(unsafe.Pointer(pBt)).FpHasContent) != 0) { (*BtShared)(unsafe.Pointer(pBt)).FpHasContent = Xsqlite3BitvecCreate(tls, (*BtShared)(unsafe.Pointer(pBt)).FnPage) if !(int32((*BtShared)(unsafe.Pointer(pBt)).FpHasContent) != 0) { rc = SQLITE_NOMEM } } if rc == SQLITE_OK && pgno <= Xsqlite3BitvecSize(tls, (*BtShared)(unsafe.Pointer(pBt)).FpHasContent) { rc = Xsqlite3BitvecSet(tls, (*BtShared)(unsafe.Pointer(pBt)).FpHasContent, pgno) } return rc } func btreeGetHasContent(tls *libc.TLS, pBt uintptr, pgno Pgno) int32 { var p uintptr = (*BtShared)(unsafe.Pointer(pBt)).FpHasContent return libc.Bool32(p != 0 && (pgno > Xsqlite3BitvecSize(tls, p) || Xsqlite3BitvecTestNotNull(tls, p, pgno) != 0)) } func btreeClearHasContent(tls *libc.TLS, pBt uintptr) { Xsqlite3BitvecDestroy(tls, (*BtShared)(unsafe.Pointer(pBt)).FpHasContent) (*BtShared)(unsafe.Pointer(pBt)).FpHasContent = uintptr(0) } func btreeReleaseAllCursorPages(tls *libc.TLS, pCur uintptr) { var i int32 if int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) >= 0 { for i = 0; i < int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage); i++ { releasePageNotNull(tls, *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr(i)*8))) } releasePageNotNull(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpPage) (*BtCursor)(unsafe.Pointer(pCur)).FiPage = int8(-1) } } func saveCursorKey(tls *libc.TLS, pCur uintptr) int32 { var rc int32 = SQLITE_OK if (*BtCursor)(unsafe.Pointer(pCur)).FcurIntKey != 0 { (*BtCursor)(unsafe.Pointer(pCur)).FnKey = Xsqlite3BtreeIntegerKey(tls, pCur) } else { var pKey uintptr (*BtCursor)(unsafe.Pointer(pCur)).FnKey = I64(Xsqlite3BtreePayloadSize(tls, pCur)) pKey = Xsqlite3Malloc(tls, uint64((*BtCursor)(unsafe.Pointer(pCur)).FnKey+int64(9)+int64(8))) if pKey != 0 { rc = Xsqlite3BtreePayload(tls, pCur, uint32(0), uint32(int32((*BtCursor)(unsafe.Pointer(pCur)).FnKey)), pKey) if rc == SQLITE_OK { libc.Xmemset(tls, pKey+uintptr((*BtCursor)(unsafe.Pointer(pCur)).FnKey), 0, uint64(9+8)) (*BtCursor)(unsafe.Pointer(pCur)).FpKey = pKey } else { Xsqlite3_free(tls, pKey) } } else { rc = SQLITE_NOMEM } } return rc } func saveCursorPosition(tls *libc.TLS, pCur uintptr) int32 { var rc int32 if int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_Pinned != 0 { return SQLITE_CONSTRAINT | int32(11)<<8 } if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_SKIPNEXT { (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_VALID) } else { (*BtCursor)(unsafe.Pointer(pCur)).FskipNext = 0 } rc = saveCursorKey(tls, pCur) if rc == SQLITE_OK { btreeReleaseAllCursorPages(tls, pCur) (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_REQUIRESEEK) } *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidNKey | BTCF_ValidOvfl | BTCF_AtLast)) return rc } func saveAllCursors(tls *libc.TLS, pBt uintptr, iRoot Pgno, pExcept uintptr) int32 { var p uintptr for p = (*BtShared)(unsafe.Pointer(pBt)).FpCursor; p != 0; p = (*BtCursor)(unsafe.Pointer(p)).FpNext { if p != pExcept && (Pgno(0) == iRoot || (*BtCursor)(unsafe.Pointer(p)).FpgnoRoot == iRoot) { break } } if p != 0 { return saveCursorsOnList(tls, p, iRoot, pExcept) } if pExcept != 0 { *(*U8)(unsafe.Pointer(pExcept + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_Multiple)) } return SQLITE_OK } func saveCursorsOnList(tls *libc.TLS, p uintptr, iRoot Pgno, pExcept uintptr) int32 { for __ccgo := true; __ccgo; __ccgo = p != 0 { if p != pExcept && (Pgno(0) == iRoot || (*BtCursor)(unsafe.Pointer(p)).FpgnoRoot == iRoot) { if int32((*BtCursor)(unsafe.Pointer(p)).FeState) == CURSOR_VALID || int32((*BtCursor)(unsafe.Pointer(p)).FeState) == CURSOR_SKIPNEXT { var rc int32 = saveCursorPosition(tls, p) if SQLITE_OK != rc { return rc } } else { btreeReleaseAllCursorPages(tls, p) } } p = (*BtCursor)(unsafe.Pointer(p)).FpNext } return SQLITE_OK } // Clear the current cursor position. func Xsqlite3BtreeClearCursor(tls *libc.TLS, pCur uintptr) { Xsqlite3_free(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpKey) (*BtCursor)(unsafe.Pointer(pCur)).FpKey = uintptr(0) (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) } func btreeMoveto(tls *libc.TLS, pCur uintptr, pKey uintptr, nKey I64, bias int32, pRes uintptr) int32 { var rc int32 var pIdxKey uintptr if pKey != 0 { var pKeyInfo uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo pIdxKey = Xsqlite3VdbeAllocUnpackedRecord(tls, pKeyInfo) if pIdxKey == uintptr(0) { return SQLITE_NOMEM } Xsqlite3VdbeRecordUnpack(tls, pKeyInfo, int32(nKey), pKey, pIdxKey) if int32((*UnpackedRecord)(unsafe.Pointer(pIdxKey)).FnField) == 0 || int32((*UnpackedRecord)(unsafe.Pointer(pIdxKey)).FnField) > int32((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnAllField) { rc = Xsqlite3CorruptError(tls, 69253) } else { rc = Xsqlite3BtreeIndexMoveto(tls, pCur, pIdxKey, pRes) } Xsqlite3DbFree(tls, (*KeyInfo1)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo)).Fdb, pIdxKey) } else { pIdxKey = uintptr(0) rc = Xsqlite3BtreeTableMoveto(tls, pCur, nKey, bias, pRes) } return rc } func btreeRestoreCursorPosition(tls *libc.TLS, pCur uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 *(*int32)(unsafe.Pointer(bp)) = 0 if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_FAULT { return (*BtCursor)(unsafe.Pointer(pCur)).FskipNext } (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) if Xsqlite3FaultSim(tls, 410) != 0 { rc = SQLITE_IOERR } else { rc = btreeMoveto(tls, pCur, (*BtCursor)(unsafe.Pointer(pCur)).FpKey, (*BtCursor)(unsafe.Pointer(pCur)).FnKey, 0, bp) } if rc == SQLITE_OK { Xsqlite3_free(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpKey) (*BtCursor)(unsafe.Pointer(pCur)).FpKey = uintptr(0) if *(*int32)(unsafe.Pointer(bp)) != 0 { (*BtCursor)(unsafe.Pointer(pCur)).FskipNext = *(*int32)(unsafe.Pointer(bp)) } if (*BtCursor)(unsafe.Pointer(pCur)).FskipNext != 0 && int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_VALID { (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_SKIPNEXT) } } return rc } // Determine whether or not a cursor has moved from the position where // it was last placed, or has been invalidated for any other reason. // Cursors can move when the row they are pointing at is deleted out // from under them, for example. Cursor might also move if a btree // is rebalanced. // // Calling this routine with a NULL cursor pointer returns false. // // Use the separate sqlite3BtreeCursorRestore() routine to restore a cursor // back to where it ought to be if this routine returns true. func Xsqlite3BtreeCursorHasMoved(tls *libc.TLS, pCur uintptr) int32 { return libc.Bool32(CURSOR_VALID != int32(*(*U8)(unsafe.Pointer(pCur)))) } // Return a pointer to a fake BtCursor object that will always answer // false to the sqlite3BtreeCursorHasMoved() routine above. The fake // cursor returned must not be used with any other Btree interface. func Xsqlite3BtreeFakeValidCursor(tls *libc.TLS) uintptr { return uintptr(unsafe.Pointer(&fakeCursor)) } var fakeCursor U8 = U8(CURSOR_VALID) // This routine restores a cursor back to its original position after it // has been moved by some outside activity (such as a btree rebalance or // a row having been deleted out from under the cursor). // // On success, the *pDifferentRow parameter is false if the cursor is left // pointing at exactly the same row. *pDifferntRow is the row the cursor // was pointing to has been deleted, forcing the cursor to point to some // nearby row. // // This routine should only be called for a cursor that just returned // TRUE from sqlite3BtreeCursorHasMoved(). func Xsqlite3BtreeCursorRestore(tls *libc.TLS, pCur uintptr, pDifferentRow uintptr) int32 { var rc int32 rc = func() int32 { if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) >= CURSOR_REQUIRESEEK { return btreeRestoreCursorPosition(tls, pCur) } return SQLITE_OK }() if rc != 0 { *(*int32)(unsafe.Pointer(pDifferentRow)) = 1 return rc } if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID { *(*int32)(unsafe.Pointer(pDifferentRow)) = 1 } else { *(*int32)(unsafe.Pointer(pDifferentRow)) = 0 } return SQLITE_OK } // Provide flag hints to the cursor. func Xsqlite3BtreeCursorHintFlags(tls *libc.TLS, pCur uintptr, x uint32) { (*BtCursor)(unsafe.Pointer(pCur)).Fhints = U8(x) } func ptrmapPageno(tls *libc.TLS, pBt uintptr, pgno Pgno) Pgno { var nPagesPerMapPage int32 var iPtrMap Pgno var ret Pgno if pgno < Pgno(2) { return Pgno(0) } nPagesPerMapPage = int32((*BtShared)(unsafe.Pointer(pBt)).FusableSize/U32(5) + U32(1)) iPtrMap = (pgno - Pgno(2)) / Pgno(nPagesPerMapPage) ret = iPtrMap*Pgno(nPagesPerMapPage) + Pgno(2) if ret == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { ret++ } return ret } func ptrmapPut(tls *libc.TLS, pBt uintptr, key Pgno, eType U8, parent Pgno, pRC uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var pPtrmap uintptr var iPtrmap Pgno var offset int32 var rc int32 if !(*(*int32)(unsafe.Pointer(pRC)) != 0) { goto __1 } return __1: ; if !(key == Pgno(0)) { goto __2 } *(*int32)(unsafe.Pointer(pRC)) = Xsqlite3CorruptError(tls, 69434) return __2: ; iPtrmap = ptrmapPageno(tls, pBt, key) rc = Xsqlite3PagerGet(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, iPtrmap, bp, 0) if !(rc != SQLITE_OK) { goto __3 } *(*int32)(unsafe.Pointer(pRC)) = rc return __3: ; if !(int32(*(*int8)(unsafe.Pointer(Xsqlite3PagerGetExtra(tls, *(*uintptr)(unsafe.Pointer(bp)))))) != 0) { goto __4 } *(*int32)(unsafe.Pointer(pRC)) = Xsqlite3CorruptError(tls, 69447) goto ptrmap_exit __4: ; offset = int32(Pgno(5) * (key - iPtrmap - Pgno(1))) if !(offset < 0) { goto __5 } *(*int32)(unsafe.Pointer(pRC)) = Xsqlite3CorruptError(tls, 69452) goto ptrmap_exit __5: ; pPtrmap = Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp))) if !(int32(eType) != int32(*(*U8)(unsafe.Pointer(pPtrmap + uintptr(offset)))) || Xsqlite3Get4byte(tls, pPtrmap+uintptr(offset+1)) != parent) { goto __6 } *(*int32)(unsafe.Pointer(pRC)) = libc.AssignInt32(&rc, Xsqlite3PagerWrite(tls, *(*uintptr)(unsafe.Pointer(bp)))) if !(rc == SQLITE_OK) { goto __7 } *(*U8)(unsafe.Pointer(pPtrmap + uintptr(offset))) = eType Xsqlite3Put4byte(tls, pPtrmap+uintptr(offset+1), parent) __7: ; __6: ; ptrmap_exit: Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) } func ptrmapGet(tls *libc.TLS, pBt uintptr, key Pgno, pEType uintptr, pPgno uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var iPtrmap int32 var pPtrmap uintptr var offset int32 var rc int32 iPtrmap = int32(ptrmapPageno(tls, pBt, key)) rc = Xsqlite3PagerGet(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, uint32(iPtrmap), bp, 0) if rc != 0 { return rc } pPtrmap = Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp))) offset = int32(Pgno(5) * (key - Pgno(iPtrmap) - Pgno(1))) if offset < 0 { Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) return Xsqlite3CorruptError(tls, 69497) } *(*U8)(unsafe.Pointer(pEType)) = *(*U8)(unsafe.Pointer(pPtrmap + uintptr(offset))) if pPgno != 0 { *(*Pgno)(unsafe.Pointer(pPgno)) = Xsqlite3Get4byte(tls, pPtrmap+uintptr(offset+1)) } Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) if int32(*(*U8)(unsafe.Pointer(pEType))) < 1 || int32(*(*U8)(unsafe.Pointer(pEType))) > 5 { return Xsqlite3CorruptError(tls, 69505) } return SQLITE_OK } func btreeParseCellAdjustSizeForOverflow(tls *libc.TLS, pPage uintptr, pCell uintptr, pInfo uintptr) { var minLocal int32 var maxLocal int32 var surplus int32 minLocal = int32((*MemPage)(unsafe.Pointer(pPage)).FminLocal) maxLocal = int32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) surplus = int32(U32(minLocal) + ((*CellInfo)(unsafe.Pointer(pInfo)).FnPayload-U32(minLocal))%((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize-U32(4))) if surplus <= maxLocal { (*CellInfo)(unsafe.Pointer(pInfo)).FnLocal = U16(surplus) } else { (*CellInfo)(unsafe.Pointer(pInfo)).FnLocal = U16(minLocal) } (*CellInfo)(unsafe.Pointer(pInfo)).FnSize = U16(int32(U16((int64((*CellInfo)(unsafe.Pointer(pInfo)).FpPayload+uintptr((*CellInfo)(unsafe.Pointer(pInfo)).FnLocal))-int64(pCell))/1)) + 4) } func btreePayloadToLocal(tls *libc.TLS, pPage uintptr, nPayload I64) int32 { var maxLocal int32 maxLocal = int32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) if nPayload <= I64(maxLocal) { return int32(nPayload) } else { var minLocal int32 var surplus int32 minLocal = int32((*MemPage)(unsafe.Pointer(pPage)).FminLocal) surplus = int32(I64(minLocal) + (nPayload-I64(minLocal))%I64((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize-U32(4))) if surplus <= maxLocal { return surplus } return minLocal } return int32(0) } func btreeParseCellPtrNoPayload(tls *libc.TLS, pPage uintptr, pCell uintptr, pInfo uintptr) { _ = pPage (*CellInfo)(unsafe.Pointer(pInfo)).FnSize = U16(4 + int32(Xsqlite3GetVarint(tls, pCell+4, pInfo))) (*CellInfo)(unsafe.Pointer(pInfo)).FnPayload = U32(0) (*CellInfo)(unsafe.Pointer(pInfo)).FnLocal = U16(0) (*CellInfo)(unsafe.Pointer(pInfo)).FpPayload = uintptr(0) return } func btreeParseCellPtr(tls *libc.TLS, pPage uintptr, pCell uintptr, pInfo uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var pIter uintptr var nPayload U32 pIter = pCell nPayload = U32(*(*U8)(unsafe.Pointer(pIter))) if nPayload >= U32(0x80) { var pEnd uintptr = pIter + 8 nPayload = nPayload & U32(0x7f) for __ccgo := true; __ccgo; __ccgo = int32(*(*U8)(unsafe.Pointer(pIter))) >= 0x80 && pIter < pEnd { nPayload = nPayload<<7 | U32(int32(*(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1))))&0x7f) } } pIter++ *(*U64)(unsafe.Pointer(bp)) = U64(*(*U8)(unsafe.Pointer(pIter))) if *(*U64)(unsafe.Pointer(bp)) >= uint64(0x80) { var x U8 *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))&uint64(0x7f)<<7 | U64(int32(libc.AssignUint8(&x, *(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))))&0x7f) if int32(x) >= 0x80 { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<7 | U64(int32(libc.AssignUint8(&x, *(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))))&0x7f) if int32(x) >= 0x80 { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<7 | U64(int32(libc.AssignUint8(&x, *(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))))&0x7f) if int32(x) >= 0x80 { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<7 | U64(int32(libc.AssignUint8(&x, *(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))))&0x7f) if int32(x) >= 0x80 { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<7 | U64(int32(libc.AssignUint8(&x, *(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))))&0x7f) if int32(x) >= 0x80 { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<7 | U64(int32(libc.AssignUint8(&x, *(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))))&0x7f) if int32(x) >= 0x80 { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<7 | U64(int32(libc.AssignUint8(&x, *(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))))&0x7f) if int32(x) >= 0x80 { *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<8 | U64(*(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1)))) } } } } } } } } pIter++ (*CellInfo)(unsafe.Pointer(pInfo)).FnKey = *(*I64)(unsafe.Pointer(bp)) (*CellInfo)(unsafe.Pointer(pInfo)).FnPayload = nPayload (*CellInfo)(unsafe.Pointer(pInfo)).FpPayload = pIter if nPayload <= U32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { (*CellInfo)(unsafe.Pointer(pInfo)).FnSize = U16(nPayload + U32(U16((int64(pIter)-int64(pCell))/1))) if int32((*CellInfo)(unsafe.Pointer(pInfo)).FnSize) < 4 { (*CellInfo)(unsafe.Pointer(pInfo)).FnSize = U16(4) } (*CellInfo)(unsafe.Pointer(pInfo)).FnLocal = U16(nPayload) } else { btreeParseCellAdjustSizeForOverflow(tls, pPage, pCell, pInfo) } } func btreeParseCellPtrIndex(tls *libc.TLS, pPage uintptr, pCell uintptr, pInfo uintptr) { var pIter uintptr var nPayload U32 pIter = pCell + uintptr((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) nPayload = U32(*(*U8)(unsafe.Pointer(pIter))) if nPayload >= U32(0x80) { var pEnd uintptr = pIter + 8 nPayload = nPayload & U32(0x7f) for __ccgo := true; __ccgo; __ccgo = int32(*(*U8)(unsafe.Pointer(pIter))) >= 0x80 && pIter < pEnd { nPayload = nPayload<<7 | U32(int32(*(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1))))&0x7f) } } pIter++ (*CellInfo)(unsafe.Pointer(pInfo)).FnKey = I64(nPayload) (*CellInfo)(unsafe.Pointer(pInfo)).FnPayload = nPayload (*CellInfo)(unsafe.Pointer(pInfo)).FpPayload = pIter if nPayload <= U32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { (*CellInfo)(unsafe.Pointer(pInfo)).FnSize = U16(nPayload + U32(U16((int64(pIter)-int64(pCell))/1))) if int32((*CellInfo)(unsafe.Pointer(pInfo)).FnSize) < 4 { (*CellInfo)(unsafe.Pointer(pInfo)).FnSize = U16(4) } (*CellInfo)(unsafe.Pointer(pInfo)).FnLocal = U16(nPayload) } else { btreeParseCellAdjustSizeForOverflow(tls, pPage, pCell, pInfo) } } func btreeParseCell(tls *libc.TLS, pPage uintptr, iCell int32, pInfo uintptr) { (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxParseCell})).f(tls, pPage, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*iCell)))))), pInfo) } func cellSizePtr(tls *libc.TLS, pPage uintptr, pCell uintptr) U16 { var pIter uintptr = pCell + uintptr((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) var pEnd uintptr var nSize U32 nSize = U32(*(*U8)(unsafe.Pointer(pIter))) if nSize >= U32(0x80) { pEnd = pIter + 8 nSize = nSize & U32(0x7f) for __ccgo := true; __ccgo; __ccgo = int32(*(*U8)(unsafe.Pointer(pIter))) >= 0x80 && pIter < pEnd { nSize = nSize<<7 | U32(int32(*(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1))))&0x7f) } } pIter++ if nSize <= U32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { nSize = nSize + U32((int64(pIter)-int64(pCell))/1) if nSize < U32(4) { nSize = U32(4) } } else { var minLocal int32 = int32((*MemPage)(unsafe.Pointer(pPage)).FminLocal) nSize = U32(minLocal) + (nSize-U32(minLocal))%((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize-U32(4)) if nSize > U32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { nSize = U32(minLocal) } nSize = nSize + U32(4+int32(U16((int64(pIter)-int64(pCell))/1))) } return U16(nSize) } func cellSizePtrNoPayload(tls *libc.TLS, pPage uintptr, pCell uintptr) U16 { var pIter uintptr = pCell + uintptr(4) var pEnd uintptr _ = pPage pEnd = pIter + uintptr(9) for int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && pIter < pEnd { } return U16((int64(pIter) - int64(pCell)) / 1) } func cellSizePtrTableLeaf(tls *libc.TLS, pPage uintptr, pCell uintptr) U16 { var pIter uintptr = pCell var pEnd uintptr var nSize U32 nSize = U32(*(*U8)(unsafe.Pointer(pIter))) if nSize >= U32(0x80) { pEnd = pIter + 8 nSize = nSize & U32(0x7f) for __ccgo := true; __ccgo; __ccgo = int32(*(*U8)(unsafe.Pointer(pIter))) >= 0x80 && pIter < pEnd { nSize = nSize<<7 | U32(int32(*(*U8)(unsafe.Pointer(libc.PreIncUintptr(&pIter, 1))))&0x7f) } } pIter++ if int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 && int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pIter, 1))))&0x80 != 0 { pIter++ } if nSize <= U32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { nSize = nSize + U32((int64(pIter)-int64(pCell))/1) if nSize < U32(4) { nSize = U32(4) } } else { var minLocal int32 = int32((*MemPage)(unsafe.Pointer(pPage)).FminLocal) nSize = U32(minLocal) + (nSize-U32(minLocal))%((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize-U32(4)) if nSize > U32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { nSize = U32(minLocal) } nSize = nSize + U32(4+int32(U16((int64(pIter)-int64(pCell))/1))) } return U16(nSize) } func ptrmapPutOvflPtr(tls *libc.TLS, pPage uintptr, pSrc uintptr, pCell uintptr, pRC uintptr) { bp := tls.Alloc(24) defer tls.Free(24) if *(*int32)(unsafe.Pointer(pRC)) != 0 { return } (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxParseCell})).f(tls, pPage, pCell, bp) if U32((*CellInfo)(unsafe.Pointer(bp)).FnLocal) < (*CellInfo)(unsafe.Pointer(bp)).FnPayload { var ovfl Pgno if Uptr((*MemPage)(unsafe.Pointer(pSrc)).FaDataEnd) >= Uptr(pCell) && Uptr((*MemPage)(unsafe.Pointer(pSrc)).FaDataEnd) < Uptr(pCell+uintptr((*CellInfo)(unsafe.Pointer(bp)).FnLocal)) { *(*int32)(unsafe.Pointer(pRC)) = Xsqlite3CorruptError(tls, 69897) return } ovfl = Xsqlite3Get4byte(tls, pCell+uintptr(int32((*CellInfo)(unsafe.Pointer(bp)).FnSize)-4)) ptrmapPut(tls, (*MemPage)(unsafe.Pointer(pPage)).FpBt, ovfl, uint8(PTRMAP_OVERFLOW1), (*MemPage)(unsafe.Pointer(pPage)).Fpgno, pRC) } } func defragmentPage(tls *libc.TLS, pPage uintptr, nMaxFrag int32) int32 { var i int32 var pc int32 var hdr int32 var size int32 var usableSize int32 var cellOffset int32 var cbrk int32 var nCell int32 var data uintptr var temp uintptr var src uintptr var iCellFirst int32 var iCellLast int32 var iCellStart int32 var pEnd uintptr var pAddr uintptr var sz2 int32 var sz int32 var top int32 var iFree2 int32 var iFree int32 var pAddr1 uintptr data = (*MemPage)(unsafe.Pointer(pPage)).FaData hdr = int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset) cellOffset = int32((*MemPage)(unsafe.Pointer(pPage)).FcellOffset) nCell = int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) iCellFirst = cellOffset + 2*nCell usableSize = int32((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize) if !(int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+7)))) <= nMaxFrag) { goto __1 } iFree = int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+1))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+1) + 1))) if !(iFree > usableSize-4) { goto __2 } return Xsqlite3CorruptError(tls, 69955) __2: ; if !(iFree != 0) { goto __3 } iFree2 = int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree) + 1))) if !(iFree2 > usableSize-4) { goto __4 } return Xsqlite3CorruptError(tls, 69958) __4: ; if !(0 == iFree2 || int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree2)))) == 0 && int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree2+1)))) == 0) { goto __5 } pEnd = data + uintptr(cellOffset+nCell*2) sz2 = 0 sz = int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree+2))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree+2) + 1))) top = int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+5))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+5) + 1))) if !(top >= iFree) { goto __6 } return Xsqlite3CorruptError(tls, 69966) __6: ; if !(iFree2 != 0) { goto __7 } if !(iFree+sz > iFree2) { goto __9 } return Xsqlite3CorruptError(tls, 69969) __9: ; sz2 = int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree2+2))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFree2+2) + 1))) if !(iFree2+sz2 > usableSize) { goto __10 } return Xsqlite3CorruptError(tls, 69971) __10: ; libc.Xmemmove(tls, data+uintptr(iFree+sz+sz2), data+uintptr(iFree+sz), uint64(iFree2-(iFree+sz))) sz = sz + sz2 goto __8 __7: if !(iFree+sz > usableSize) { goto __11 } return Xsqlite3CorruptError(tls, 69975) __11: ; __8: ; cbrk = top + sz libc.Xmemmove(tls, data+uintptr(cbrk), data+uintptr(top), uint64(iFree-top)) pAddr = data + uintptr(cellOffset) __12: if !(pAddr < pEnd) { goto __14 } pc = int32(*(*U8)(unsafe.Pointer(pAddr)))<<8 | int32(*(*U8)(unsafe.Pointer(pAddr + 1))) if !(pc < iFree) { goto __15 } *(*U8)(unsafe.Pointer(pAddr)) = U8((pc + sz) >> 8) *(*U8)(unsafe.Pointer(pAddr + 1)) = U8(pc + sz) goto __16 __15: if !(pc < iFree2) { goto __17 } *(*U8)(unsafe.Pointer(pAddr)) = U8((pc + sz2) >> 8) *(*U8)(unsafe.Pointer(pAddr + 1)) = U8(pc + sz2) __17: ; __16: ; goto __13 __13: pAddr += uintptr(2) goto __12 goto __14 __14: ; goto defragment_out __5: ; __3: ; __1: ; cbrk = usableSize iCellLast = usableSize - 4 iCellStart = int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+5))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+5) + 1))) if !(nCell > 0) { goto __18 } temp = Xsqlite3PagerTempSpace(tls, (*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FpPager) libc.Xmemcpy(tls, temp+uintptr(iCellStart), data+uintptr(iCellStart), uint64(usableSize-iCellStart)) src = temp i = 0 __19: if !(i < nCell) { goto __21 } pAddr1 = data + uintptr(cellOffset+i*2) pc = int32(*(*U8)(unsafe.Pointer(pAddr1)))<<8 | int32(*(*U8)(unsafe.Pointer(pAddr1 + 1))) if !(pc < iCellStart || pc > iCellLast) { goto __22 } return Xsqlite3CorruptError(tls, 70008) __22: ; size = int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxCellSize})).f(tls, pPage, src+uintptr(pc))) cbrk = cbrk - size if !(cbrk < iCellStart || pc+size > usableSize) { goto __23 } return Xsqlite3CorruptError(tls, 70014) __23: ; *(*U8)(unsafe.Pointer(pAddr1)) = U8(cbrk >> 8) *(*U8)(unsafe.Pointer(pAddr1 + 1)) = U8(cbrk) libc.Xmemcpy(tls, data+uintptr(cbrk), src+uintptr(pc), uint64(size)) goto __20 __20: i++ goto __19 goto __21 __21: ; __18: ; *(*uint8)(unsafe.Pointer(data + uintptr(hdr+7))) = uint8(0) defragment_out: ; if !(int32(*(*uint8)(unsafe.Pointer(data + uintptr(hdr+7))))+cbrk-iCellFirst != (*MemPage)(unsafe.Pointer(pPage)).FnFree) { goto __24 } return Xsqlite3CorruptError(tls, 70028) __24: ; *(*uint8)(unsafe.Pointer(data + uintptr(hdr+5))) = U8(cbrk >> 8) *(*uint8)(unsafe.Pointer(data + uintptr(hdr+5) + 1)) = U8(cbrk) *(*uint8)(unsafe.Pointer(data + uintptr(hdr+1))) = uint8(0) *(*uint8)(unsafe.Pointer(data + uintptr(hdr+2))) = uint8(0) libc.Xmemset(tls, data+uintptr(iCellFirst), 0, uint64(cbrk-iCellFirst)) return SQLITE_OK } func pageFindSlot(tls *libc.TLS, pPg uintptr, nByte int32, pRc uintptr) uintptr { var hdr int32 = int32((*MemPage)(unsafe.Pointer(pPg)).FhdrOffset) var aData uintptr = (*MemPage)(unsafe.Pointer(pPg)).FaData var iAddr int32 = hdr + 1 var pTmp uintptr = aData + uintptr(iAddr) var pc int32 = int32(*(*U8)(unsafe.Pointer(pTmp)))<<8 | int32(*(*U8)(unsafe.Pointer(pTmp + 1))) var x int32 var maxPC int32 = int32((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPg)).FpBt)).FusableSize - U32(nByte)) var size int32 for pc <= maxPC { pTmp = aData + uintptr(pc+2) size = int32(*(*U8)(unsafe.Pointer(pTmp)))<<8 | int32(*(*U8)(unsafe.Pointer(pTmp + 1))) if libc.AssignInt32(&x, size-nByte) >= 0 { if x < 4 { if int32(*(*U8)(unsafe.Pointer(aData + uintptr(hdr+7)))) > 57 { return uintptr(0) } libc.Xmemcpy(tls, aData+uintptr(iAddr), aData+uintptr(pc), uint64(2)) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+7))) += U8(int32(U8(x))) return aData + uintptr(pc) } else if x+pc > maxPC { *(*int32)(unsafe.Pointer(pRc)) = Xsqlite3CorruptError(tls, 70085) return uintptr(0) } else { *(*U8)(unsafe.Pointer(aData + uintptr(pc+2))) = U8(x >> 8) *(*U8)(unsafe.Pointer(aData + uintptr(pc+2) + 1)) = U8(x) } return aData + uintptr(pc+x) } iAddr = pc pTmp = aData + uintptr(pc) pc = int32(*(*U8)(unsafe.Pointer(pTmp)))<<8 | int32(*(*U8)(unsafe.Pointer(pTmp + 1))) if pc <= iAddr { if pc != 0 { *(*int32)(unsafe.Pointer(pRc)) = Xsqlite3CorruptError(tls, 70100) } return uintptr(0) } } if pc > maxPC+nByte-4 { *(*int32)(unsafe.Pointer(pRc)) = Xsqlite3CorruptError(tls, 70107) } return uintptr(0) } func allocateSpace(tls *libc.TLS, pPage uintptr, nByte int32, pIdx uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var hdr int32 = int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset) var data uintptr = (*MemPage)(unsafe.Pointer(pPage)).FaData var top int32 *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var pTmp uintptr var gap int32 gap = int32((*MemPage)(unsafe.Pointer(pPage)).FcellOffset) + 2*int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) pTmp = data + uintptr(hdr+5) top = int32(*(*U8)(unsafe.Pointer(pTmp)))<<8 | int32(*(*U8)(unsafe.Pointer(pTmp + 1))) if gap > top { if top == 0 && (*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize == U32(65536) { top = 65536 } else { return Xsqlite3CorruptError(tls, 70156) } } if (*(*U8)(unsafe.Pointer(data + uintptr(hdr+2))) != 0 || *(*U8)(unsafe.Pointer(data + uintptr(hdr+1))) != 0) && gap+2 <= top { var pSpace uintptr = pageFindSlot(tls, pPage, nByte, bp) if pSpace != 0 { var g2 int32 *(*int32)(unsafe.Pointer(pIdx)) = libc.AssignInt32(&g2, int32((int64(pSpace)-int64(data))/1)) if g2 <= gap { return Xsqlite3CorruptError(tls, 70174) } else { return SQLITE_OK } } else if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } } if gap+2+nByte > top { *(*int32)(unsafe.Pointer(bp)) = defragmentPage(tls, pPage, func() int32 { if 4 < (*MemPage)(unsafe.Pointer(pPage)).FnFree-(2+nByte) { return 4 } return (*MemPage)(unsafe.Pointer(pPage)).FnFree - (2 + nByte) }()) if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } top = (int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+5))))<<8|int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+5) + 1)))-1)&0xffff + 1 } top = top - nByte *(*U8)(unsafe.Pointer(data + uintptr(hdr+5))) = U8(top >> 8) *(*U8)(unsafe.Pointer(data + uintptr(hdr+5) + 1)) = U8(top) *(*int32)(unsafe.Pointer(pIdx)) = top return SQLITE_OK } func freeSpace(tls *libc.TLS, pPage uintptr, iStart U16, iSize U16) int32 { var iPtr U16 var iFreeBlk U16 var hdr U8 var nFrag U8 = U8(0) var iOrigSize U16 = iSize var x U16 var iEnd U32 = U32(int32(iStart) + int32(iSize)) var data uintptr = (*MemPage)(unsafe.Pointer(pPage)).FaData var pTmp uintptr hdr = (*MemPage)(unsafe.Pointer(pPage)).FhdrOffset iPtr = U16(int32(hdr) + 1) if int32(*(*uint8)(unsafe.Pointer(data + uintptr(int32(iPtr)+1)))) == 0 && int32(*(*uint8)(unsafe.Pointer(data + uintptr(iPtr)))) == 0 { iFreeBlk = U16(0) } else { for int32(libc.AssignUint16(&iFreeBlk, U16(int32(*(*uint8)(unsafe.Pointer(data + uintptr(iPtr))))<<8|int32(*(*uint8)(unsafe.Pointer(data + uintptr(iPtr) + 1)))))) < int32(iStart) { if int32(iFreeBlk) <= int32(iPtr) { if int32(iFreeBlk) == 0 { break } return Xsqlite3CorruptError(tls, 70253) } iPtr = iFreeBlk } if U32(iFreeBlk) > (*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize-U32(4) { return Xsqlite3CorruptError(tls, 70258) } if iFreeBlk != 0 && iEnd+U32(3) >= U32(iFreeBlk) { nFrag = U8(U32(iFreeBlk) - iEnd) if iEnd > U32(iFreeBlk) { return Xsqlite3CorruptError(tls, 70270) } iEnd = U32(int32(iFreeBlk) + (int32(*(*uint8)(unsafe.Pointer(data + uintptr(int32(iFreeBlk)+2))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(int32(iFreeBlk)+2) + 1))))) if iEnd > (*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize { return Xsqlite3CorruptError(tls, 70273) } iSize = U16(iEnd - U32(iStart)) iFreeBlk = U16(int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFreeBlk))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(iFreeBlk) + 1)))) } if int32(iPtr) > int32(hdr)+1 { var iPtrEnd int32 = int32(iPtr) + (int32(*(*uint8)(unsafe.Pointer(data + uintptr(int32(iPtr)+2))))<<8 | int32(*(*uint8)(unsafe.Pointer(data + uintptr(int32(iPtr)+2) + 1)))) if iPtrEnd+3 >= int32(iStart) { if iPtrEnd > int32(iStart) { return Xsqlite3CorruptError(tls, 70286) } nFrag = U8(int32(nFrag) + (int32(iStart) - iPtrEnd)) iSize = U16(iEnd - U32(iPtr)) iStart = iPtr } } if int32(nFrag) > int32(*(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+7)))) { return Xsqlite3CorruptError(tls, 70292) } *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+7))) -= uint8(int32(nFrag)) } pTmp = data + uintptr(int32(hdr)+5) x = U16(int32(*(*U8)(unsafe.Pointer(pTmp)))<<8 | int32(*(*U8)(unsafe.Pointer(pTmp + 1)))) if int32(iStart) <= int32(x) { if int32(iStart) < int32(x) { return Xsqlite3CorruptError(tls, 70301) } if int32(iPtr) != int32(hdr)+1 { return Xsqlite3CorruptError(tls, 70302) } *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+1))) = U8(int32(iFreeBlk) >> 8) *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+1) + 1)) = U8(iFreeBlk) *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+5))) = U8(iEnd >> 8) *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+5) + 1)) = U8(iEnd) } else { *(*uint8)(unsafe.Pointer(data + uintptr(iPtr))) = U8(int32(iStart) >> 8) *(*uint8)(unsafe.Pointer(data + uintptr(iPtr) + 1)) = U8(iStart) } if int32((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FbtsFlags)&BTS_FAST_SECURE != 0 { libc.Xmemset(tls, data+uintptr(iStart), 0, uint64(iSize)) } *(*uint8)(unsafe.Pointer(data + uintptr(iStart))) = U8(int32(iFreeBlk) >> 8) *(*uint8)(unsafe.Pointer(data + uintptr(iStart) + 1)) = U8(iFreeBlk) *(*uint8)(unsafe.Pointer(data + uintptr(int32(iStart)+2))) = U8(int32(iSize) >> 8) *(*uint8)(unsafe.Pointer(data + uintptr(int32(iStart)+2) + 1)) = U8(iSize) *(*int32)(unsafe.Pointer(pPage + 20)) += int32(iOrigSize) return SQLITE_OK } func decodeFlags(tls *libc.TLS, pPage uintptr, flagByte int32) int32 { var pBt uintptr pBt = (*MemPage)(unsafe.Pointer(pPage)).FpBt (*MemPage)(unsafe.Pointer(pPage)).Fmax1bytePayload = (*BtShared)(unsafe.Pointer(pBt)).Fmax1bytePayload if flagByte >= PTF_ZERODATA|PTF_LEAF { (*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize = U8(0) (*MemPage)(unsafe.Pointer(pPage)).Fleaf = U8(1) if flagByte == PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF { (*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf = U8(1) (*MemPage)(unsafe.Pointer(pPage)).FxCellSize = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) U16 }{cellSizePtrTableLeaf})) (*MemPage)(unsafe.Pointer(pPage)).FxParseCell = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{btreeParseCellPtr})) (*MemPage)(unsafe.Pointer(pPage)).FintKey = U8(1) (*MemPage)(unsafe.Pointer(pPage)).FmaxLocal = (*BtShared)(unsafe.Pointer(pBt)).FmaxLeaf (*MemPage)(unsafe.Pointer(pPage)).FminLocal = (*BtShared)(unsafe.Pointer(pBt)).FminLeaf } else if flagByte == PTF_ZERODATA|PTF_LEAF { (*MemPage)(unsafe.Pointer(pPage)).FintKey = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FxCellSize = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) U16 }{cellSizePtr})) (*MemPage)(unsafe.Pointer(pPage)).FxParseCell = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{btreeParseCellPtrIndex})) (*MemPage)(unsafe.Pointer(pPage)).FmaxLocal = (*BtShared)(unsafe.Pointer(pBt)).FmaxLocal (*MemPage)(unsafe.Pointer(pPage)).FminLocal = (*BtShared)(unsafe.Pointer(pBt)).FminLocal } else { (*MemPage)(unsafe.Pointer(pPage)).FintKey = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FxCellSize = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) U16 }{cellSizePtr})) (*MemPage)(unsafe.Pointer(pPage)).FxParseCell = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{btreeParseCellPtrIndex})) return Xsqlite3CorruptError(tls, 70361) } } else { (*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize = U8(4) (*MemPage)(unsafe.Pointer(pPage)).Fleaf = U8(0) if flagByte == PTF_ZERODATA { (*MemPage)(unsafe.Pointer(pPage)).FintKey = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FxCellSize = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) U16 }{cellSizePtr})) (*MemPage)(unsafe.Pointer(pPage)).FxParseCell = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{btreeParseCellPtrIndex})) (*MemPage)(unsafe.Pointer(pPage)).FmaxLocal = (*BtShared)(unsafe.Pointer(pBt)).FmaxLocal (*MemPage)(unsafe.Pointer(pPage)).FminLocal = (*BtShared)(unsafe.Pointer(pBt)).FminLocal } else if flagByte == PTF_LEAFDATA|PTF_INTKEY { (*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FxCellSize = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) U16 }{cellSizePtrNoPayload})) (*MemPage)(unsafe.Pointer(pPage)).FxParseCell = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{btreeParseCellPtrNoPayload})) (*MemPage)(unsafe.Pointer(pPage)).FintKey = U8(1) (*MemPage)(unsafe.Pointer(pPage)).FmaxLocal = (*BtShared)(unsafe.Pointer(pBt)).FmaxLeaf (*MemPage)(unsafe.Pointer(pPage)).FminLocal = (*BtShared)(unsafe.Pointer(pBt)).FminLeaf } else { (*MemPage)(unsafe.Pointer(pPage)).FintKey = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FxCellSize = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) U16 }{cellSizePtr})) (*MemPage)(unsafe.Pointer(pPage)).FxParseCell = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{btreeParseCellPtrIndex})) return Xsqlite3CorruptError(tls, 70385) } } return SQLITE_OK } func btreeComputeFreeSpace(tls *libc.TLS, pPage uintptr) int32 { var pc int32 var hdr U8 var data uintptr var usableSize int32 var nFree int32 var top int32 var iCellFirst int32 var iCellLast int32 usableSize = int32((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize) hdr = (*MemPage)(unsafe.Pointer(pPage)).FhdrOffset data = (*MemPage)(unsafe.Pointer(pPage)).FaData top = (int32(*(*U8)(unsafe.Pointer(data + uintptr(int32(hdr)+5))))<<8|int32(*(*U8)(unsafe.Pointer(data + uintptr(int32(hdr)+5) + 1)))-1)&0xffff + 1 iCellFirst = int32(hdr) + 8 + int32((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) + 2*int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) iCellLast = usableSize - 4 pc = int32(*(*U8)(unsafe.Pointer(data + uintptr(int32(hdr)+1))))<<8 | int32(*(*U8)(unsafe.Pointer(data + uintptr(int32(hdr)+1) + 1))) nFree = int32(*(*U8)(unsafe.Pointer(data + uintptr(int32(hdr)+7)))) + top if pc > 0 { var next U32 var size U32 if pc < top { return Xsqlite3CorruptError(tls, 70436) } for 1 != 0 { if pc > iCellLast { return Xsqlite3CorruptError(tls, 70441) } next = U32(int32(*(*U8)(unsafe.Pointer(data + uintptr(pc))))<<8 | int32(*(*U8)(unsafe.Pointer(data + uintptr(pc) + 1)))) size = U32(int32(*(*U8)(unsafe.Pointer(data + uintptr(pc+2))))<<8 | int32(*(*U8)(unsafe.Pointer(data + uintptr(pc+2) + 1)))) nFree = int32(U32(nFree) + size) if next <= U32(pc)+size+U32(3) { break } pc = int32(next) } if next > U32(0) { return Xsqlite3CorruptError(tls, 70451) } if U32(pc)+size > uint32(usableSize) { return Xsqlite3CorruptError(tls, 70455) } } if nFree > usableSize || nFree < iCellFirst { return Xsqlite3CorruptError(tls, 70467) } (*MemPage)(unsafe.Pointer(pPage)).FnFree = int32(U16(nFree - iCellFirst)) return SQLITE_OK } func btreeCellSizeCheck(tls *libc.TLS, pPage uintptr) int32 { var iCellFirst int32 var iCellLast int32 var i int32 var sz int32 var pc int32 var data uintptr var usableSize int32 var cellOffset int32 iCellFirst = int32((*MemPage)(unsafe.Pointer(pPage)).FcellOffset) + 2*int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) usableSize = int32((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize) iCellLast = usableSize - 4 data = (*MemPage)(unsafe.Pointer(pPage)).FaData cellOffset = int32((*MemPage)(unsafe.Pointer(pPage)).FcellOffset) if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { iCellLast-- } for i = 0; i < int32((*MemPage)(unsafe.Pointer(pPage)).FnCell); i++ { pc = int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer(data + uintptr(cellOffset+i*2))))) if pc < iCellFirst || pc > iCellLast { return Xsqlite3CorruptError(tls, 70498) } sz = int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxCellSize})).f(tls, pPage, data+uintptr(pc))) if pc+sz > usableSize { return Xsqlite3CorruptError(tls, 70503) } } return SQLITE_OK } func btreeInitPage(tls *libc.TLS, pPage uintptr) int32 { var data uintptr var pBt uintptr pBt = (*MemPage)(unsafe.Pointer(pPage)).FpBt data = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset) if decodeFlags(tls, pPage, int32(*(*U8)(unsafe.Pointer(data)))) != 0 { return Xsqlite3CorruptError(tls, 70535) } (*MemPage)(unsafe.Pointer(pPage)).FmaskPage = U16((*BtShared)(unsafe.Pointer(pBt)).FpageSize - U32(1)) (*MemPage)(unsafe.Pointer(pPage)).FnOverflow = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FcellOffset = U16(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset) + 8 + int32((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize)) (*MemPage)(unsafe.Pointer(pPage)).FaCellIdx = data + uintptr((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) + uintptr(8) (*MemPage)(unsafe.Pointer(pPage)).FaDataEnd = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr((*BtShared)(unsafe.Pointer(pBt)).FpageSize) (*MemPage)(unsafe.Pointer(pPage)).FaDataOfst = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) (*MemPage)(unsafe.Pointer(pPage)).FnCell = U16(int32(*(*U8)(unsafe.Pointer(data + 3)))<<8 | int32(*(*U8)(unsafe.Pointer(data + 3 + 1)))) if U32((*MemPage)(unsafe.Pointer(pPage)).FnCell) > ((*BtShared)(unsafe.Pointer(pBt)).FpageSize-U32(8))/U32(6) { return Xsqlite3CorruptError(tls, 70549) } (*MemPage)(unsafe.Pointer(pPage)).FnFree = -1 (*MemPage)(unsafe.Pointer(pPage)).FisInit = U8(1) if (*Sqlite3)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).Fdb)).Fflags&uint64(SQLITE_CellSizeCk) != 0 { return btreeCellSizeCheck(tls, pPage) } return SQLITE_OK } func zeroPage(tls *libc.TLS, pPage uintptr, flags int32) { var data uintptr = (*MemPage)(unsafe.Pointer(pPage)).FaData var pBt uintptr = (*MemPage)(unsafe.Pointer(pPage)).FpBt var hdr U8 = (*MemPage)(unsafe.Pointer(pPage)).FhdrOffset var first U16 if int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_FAST_SECURE != 0 { libc.Xmemset(tls, data+uintptr(hdr), 0, uint64((*BtShared)(unsafe.Pointer(pBt)).FusableSize-U32(hdr))) } *(*uint8)(unsafe.Pointer(data + uintptr(hdr))) = uint8(int8(flags)) first = U16(int32(hdr) + func() int32 { if flags&PTF_LEAF == 0 { return 12 } return 8 }()) libc.Xmemset(tls, data+uintptr(int32(hdr)+1), 0, uint64(4)) *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+7))) = uint8(0) *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+5))) = U8((*BtShared)(unsafe.Pointer(pBt)).FusableSize >> 8) *(*uint8)(unsafe.Pointer(data + uintptr(int32(hdr)+5) + 1)) = U8((*BtShared)(unsafe.Pointer(pBt)).FusableSize) (*MemPage)(unsafe.Pointer(pPage)).FnFree = int32(U16((*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(first))) decodeFlags(tls, pPage, flags) (*MemPage)(unsafe.Pointer(pPage)).FcellOffset = first (*MemPage)(unsafe.Pointer(pPage)).FaDataEnd = data + uintptr((*BtShared)(unsafe.Pointer(pBt)).FpageSize) (*MemPage)(unsafe.Pointer(pPage)).FaCellIdx = data + uintptr(first) (*MemPage)(unsafe.Pointer(pPage)).FaDataOfst = data + uintptr((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) (*MemPage)(unsafe.Pointer(pPage)).FnOverflow = U8(0) (*MemPage)(unsafe.Pointer(pPage)).FmaskPage = U16((*BtShared)(unsafe.Pointer(pBt)).FpageSize - U32(1)) (*MemPage)(unsafe.Pointer(pPage)).FnCell = U16(0) (*MemPage)(unsafe.Pointer(pPage)).FisInit = U8(1) } func btreePageFromDbPage(tls *libc.TLS, pDbPage uintptr, pgno Pgno, pBt uintptr) uintptr { var pPage uintptr = Xsqlite3PagerGetExtra(tls, pDbPage) if pgno != (*MemPage)(unsafe.Pointer(pPage)).Fpgno { (*MemPage)(unsafe.Pointer(pPage)).FaData = Xsqlite3PagerGetData(tls, pDbPage) (*MemPage)(unsafe.Pointer(pPage)).FpDbPage = pDbPage (*MemPage)(unsafe.Pointer(pPage)).FpBt = pBt (*MemPage)(unsafe.Pointer(pPage)).Fpgno = pgno (*MemPage)(unsafe.Pointer(pPage)).FhdrOffset = func() uint8 { if pgno == Pgno(1) { return uint8(100) } return uint8(0) }() } return pPage } func btreeGetPage(tls *libc.TLS, pBt uintptr, pgno Pgno, ppPage uintptr, flags int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = Xsqlite3PagerGet(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, pgno, bp, flags) if rc != 0 { return rc } *(*uintptr)(unsafe.Pointer(ppPage)) = btreePageFromDbPage(tls, *(*uintptr)(unsafe.Pointer(bp)), pgno, pBt) return SQLITE_OK } func btreePageLookup(tls *libc.TLS, pBt uintptr, pgno Pgno) uintptr { var pDbPage uintptr pDbPage = Xsqlite3PagerLookup(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, pgno) if pDbPage != 0 { return btreePageFromDbPage(tls, pDbPage, pgno, pBt) } return uintptr(0) } func btreePagecount(tls *libc.TLS, pBt uintptr) Pgno { return (*BtShared)(unsafe.Pointer(pBt)).FnPage } func Xsqlite3BtreeLastPage(tls *libc.TLS, p uintptr) Pgno { return btreePagecount(tls, (*Btree)(unsafe.Pointer(p)).FpBt) } func getAndInitPage(tls *libc.TLS, pBt uintptr, pgno Pgno, ppPage uintptr, pCur uintptr, bReadOnly int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 if !(pgno > btreePagecount(tls, pBt)) { goto __1 } rc = Xsqlite3CorruptError(tls, 70704) goto getAndInitPage_error1 __1: ; rc = Xsqlite3PagerGet(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, pgno, bp, bReadOnly) if !(rc != 0) { goto __2 } goto getAndInitPage_error1 __2: ; *(*uintptr)(unsafe.Pointer(ppPage)) = Xsqlite3PagerGetExtra(tls, *(*uintptr)(unsafe.Pointer(bp))) if !(int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppPage)))).FisInit) == 0) { goto __3 } btreePageFromDbPage(tls, *(*uintptr)(unsafe.Pointer(bp)), pgno, pBt) rc = btreeInitPage(tls, *(*uintptr)(unsafe.Pointer(ppPage))) if !(rc != SQLITE_OK) { goto __4 } goto getAndInitPage_error2 __4: ; __3: ; if !(pCur != 0 && (int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppPage)))).FnCell) < 1 || int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppPage)))).FintKey) != int32((*BtCursor)(unsafe.Pointer(pCur)).FcurIntKey))) { goto __5 } rc = Xsqlite3CorruptError(tls, 70725) goto getAndInitPage_error2 __5: ; return SQLITE_OK getAndInitPage_error2: releasePage(tls, *(*uintptr)(unsafe.Pointer(ppPage))) getAndInitPage_error1: if !(pCur != 0) { goto __6 } (*BtCursor)(unsafe.Pointer(pCur)).FiPage-- (*BtCursor)(unsafe.Pointer(pCur)).FpPage = *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr((*BtCursor)(unsafe.Pointer(pCur)).FiPage)*8)) __6: ; return rc } func releasePageNotNull(tls *libc.TLS, pPage uintptr) { Xsqlite3PagerUnrefNotNull(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) } func releasePage(tls *libc.TLS, pPage uintptr) { if pPage != 0 { releasePageNotNull(tls, pPage) } } func releasePageOne(tls *libc.TLS, pPage uintptr) { Xsqlite3PagerUnrefPageOne(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) } func btreeGetUnusedPage(tls *libc.TLS, pBt uintptr, pgno Pgno, ppPage uintptr, flags int32) int32 { var rc int32 = btreeGetPage(tls, pBt, pgno, ppPage, flags) if rc == SQLITE_OK { if Xsqlite3PagerPageRefcount(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppPage)))).FpDbPage) > 1 { releasePage(tls, *(*uintptr)(unsafe.Pointer(ppPage))) *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) return Xsqlite3CorruptError(tls, 70791) } (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppPage)))).FisInit = U8(0) } else { *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) } return rc } func pageReinit(tls *libc.TLS, pData uintptr) { var pPage uintptr pPage = Xsqlite3PagerGetExtra(tls, pData) if (*MemPage)(unsafe.Pointer(pPage)).FisInit != 0 { (*MemPage)(unsafe.Pointer(pPage)).FisInit = U8(0) if Xsqlite3PagerPageRefcount(tls, pData) > 1 { btreeInitPage(tls, pPage) } } } func btreeInvokeBusyHandler(tls *libc.TLS, pArg uintptr) int32 { var pBt uintptr = pArg return Xsqlite3InvokeBusyHandler(tls, (*BtShared)(unsafe.Pointer(pBt)).Fdb+672) } // Open a database file. // // zFilename is the name of the database file. If zFilename is NULL // then an ephemeral database is created. The ephemeral database might // be exclusively in memory, or it might use a disk-based memory cache. // Either way, the ephemeral database will be automatically deleted // when sqlite3BtreeClose() is called. // // If zFilename is ":memory:" then an in-memory database is created // that is automatically destroyed when it is closed. // // The "flags" parameter is a bitmask that might contain bits like // BTREE_OMIT_JOURNAL and/or BTREE_MEMORY. // // If the database is already opened in the same database connection // and we are in shared cache mode, then the open will fail with an // SQLITE_CONSTRAINT error. We cannot allow two or more BtShared // objects in the same database connection since doing so will lead // to problems with locking. func Xsqlite3BtreeOpen(tls *libc.TLS, pVfs uintptr, zFilename uintptr, db uintptr, ppBtree uintptr, flags int32, vfsFlags int32) int32 { bp := tls.Alloc(100) defer tls.Free(100) var pBt uintptr var p uintptr var mutexOpen uintptr var rc int32 var nReserve U8 var isTempDb int32 var isMemdb int32 var pExisting uintptr var iDb int32 var nFilename int32 var nFullPathname int32 var zFullPathname uintptr var mutexShared uintptr var mutexShared1 uintptr var i int32 var pSib uintptr var pFile uintptr pBt = uintptr(0) mutexOpen = uintptr(0) rc = SQLITE_OK isTempDb = libc.Bool32(zFilename == uintptr(0) || int32(*(*int8)(unsafe.Pointer(zFilename))) == 0) isMemdb = libc.Bool32(zFilename != 0 && libc.Xstrcmp(tls, zFilename, ts+5401) == 0 || isTempDb != 0 && Xsqlite3TempInMemory(tls, db) != 0 || vfsFlags&SQLITE_OPEN_MEMORY != 0) if !(isMemdb != 0) { goto __1 } flags = flags | BTREE_MEMORY __1: ; if !(vfsFlags&SQLITE_OPEN_MAIN_DB != 0 && (isMemdb != 0 || isTempDb != 0)) { goto __2 } vfsFlags = vfsFlags&libc.CplInt32(SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB __2: ; p = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(Btree{}))) if !!(p != 0) { goto __3 } return SQLITE_NOMEM __3: ; (*Btree)(unsafe.Pointer(p)).FinTrans = U8(TRANS_NONE) (*Btree)(unsafe.Pointer(p)).Fdb = db (*Btree)(unsafe.Pointer(p)).Flock.FpBtree = p (*Btree)(unsafe.Pointer(p)).Flock.FiTable = Pgno(1) if !(isTempDb == 0 && (isMemdb == 0 || vfsFlags&SQLITE_OPEN_URI != 0)) { goto __4 } if !(vfsFlags&SQLITE_OPEN_SHAREDCACHE != 0) { goto __5 } nFilename = Xsqlite3Strlen30(tls, zFilename) + 1 nFullPathname = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FmxPathname + 1 zFullPathname = Xsqlite3Malloc(tls, func() uint64 { if nFullPathname > nFilename { return uint64(nFullPathname) } return uint64(nFilename) }()) (*Btree)(unsafe.Pointer(p)).Fsharable = U8(1) if !!(zFullPathname != 0) { goto __6 } Xsqlite3_free(tls, p) return SQLITE_NOMEM __6: ; if !(isMemdb != 0) { goto __7 } libc.Xmemcpy(tls, zFullPathname, zFilename, uint64(nFilename)) goto __8 __7: rc = Xsqlite3OsFullPathname(tls, pVfs, zFilename, nFullPathname, zFullPathname) if !(rc != 0) { goto __9 } if !(rc == SQLITE_OK|int32(2)<<8) { goto __10 } rc = SQLITE_OK goto __11 __10: Xsqlite3_free(tls, zFullPathname) Xsqlite3_free(tls, p) return rc __11: ; __9: ; __8: ; mutexOpen = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_OPEN) Xsqlite3_mutex_enter(tls, mutexOpen) mutexShared = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, mutexShared) pBt = sqlite3SharedCacheList __12: if !(pBt != 0) { goto __14 } if !(0 == libc.Xstrcmp(tls, zFullPathname, Xsqlite3PagerFilename(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, 0)) && Xsqlite3PagerVfs(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) == pVfs) { goto __15 } iDb = (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1 __16: if !(iDb >= 0) { goto __18 } pExisting = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt if !(pExisting != 0 && (*Btree)(unsafe.Pointer(pExisting)).FpBt == pBt) { goto __19 } Xsqlite3_mutex_leave(tls, mutexShared) Xsqlite3_mutex_leave(tls, mutexOpen) Xsqlite3_free(tls, zFullPathname) Xsqlite3_free(tls, p) return SQLITE_CONSTRAINT __19: ; goto __17 __17: iDb-- goto __16 goto __18 __18: ; (*Btree)(unsafe.Pointer(p)).FpBt = pBt (*BtShared)(unsafe.Pointer(pBt)).FnRef++ goto __14 __15: ; goto __13 __13: pBt = (*BtShared)(unsafe.Pointer(pBt)).FpNext goto __12 goto __14 __14: ; Xsqlite3_mutex_leave(tls, mutexShared) Xsqlite3_free(tls, zFullPathname) __5: ; __4: ; if !(pBt == uintptr(0)) { goto __20 } pBt = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(BtShared{}))) if !(pBt == uintptr(0)) { goto __21 } rc = SQLITE_NOMEM goto btree_open_out __21: ; rc = Xsqlite3PagerOpen(tls, pVfs, pBt, zFilename, int32(unsafe.Sizeof(MemPage{})), flags, vfsFlags, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{pageReinit}))) if !(rc == SQLITE_OK) { goto __22 } Xsqlite3PagerSetMmapLimit(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, (*Sqlite3)(unsafe.Pointer(db)).FszMmap) rc = Xsqlite3PagerReadFileheader(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, int32(unsafe.Sizeof([100]uint8{})), bp) __22: ; if !(rc != SQLITE_OK) { goto __23 } goto btree_open_out __23: ; (*BtShared)(unsafe.Pointer(pBt)).FopenFlags = U8(flags) (*BtShared)(unsafe.Pointer(pBt)).Fdb = db Xsqlite3PagerSetBusyHandler(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) int32 }{btreeInvokeBusyHandler})), pBt) (*Btree)(unsafe.Pointer(p)).FpBt = pBt (*BtShared)(unsafe.Pointer(pBt)).FpCursor = uintptr(0) (*BtShared)(unsafe.Pointer(pBt)).FpPage1 = uintptr(0) if !(Xsqlite3PagerIsreadonly(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) != 0) { goto __24 } *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_READ_ONLY) __24: ; (*BtShared)(unsafe.Pointer(pBt)).FpageSize = U32(int32(*(*uint8)(unsafe.Pointer(bp + 16)))<<8 | int32(*(*uint8)(unsafe.Pointer(bp + 17)))<<16) if !((*BtShared)(unsafe.Pointer(pBt)).FpageSize < U32(512) || (*BtShared)(unsafe.Pointer(pBt)).FpageSize > U32(SQLITE_MAX_PAGE_SIZE) || ((*BtShared)(unsafe.Pointer(pBt)).FpageSize-U32(1))&(*BtShared)(unsafe.Pointer(pBt)).FpageSize != U32(0)) { goto __25 } (*BtShared)(unsafe.Pointer(pBt)).FpageSize = U32(0) if !(zFilename != 0 && !(isMemdb != 0)) { goto __27 } (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum = func() uint8 { if 0 != 0 { return uint8(1) } return uint8(0) }() (*BtShared)(unsafe.Pointer(pBt)).FincrVacuum = func() uint8 { if SQLITE_DEFAULT_AUTOVACUUM == 2 { return uint8(1) } return uint8(0) }() __27: ; nReserve = U8(0) goto __26 __25: nReserve = *(*uint8)(unsafe.Pointer(bp + 20)) *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_PAGESIZE_FIXED) (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum = func() uint8 { if Xsqlite3Get4byte(tls, bp+52) != 0 { return uint8(1) } return uint8(0) }() (*BtShared)(unsafe.Pointer(pBt)).FincrVacuum = func() uint8 { if Xsqlite3Get4byte(tls, bp+64) != 0 { return uint8(1) } return uint8(0) }() __26: ; rc = Xsqlite3PagerSetPagesize(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, pBt+52, int32(nReserve)) if !(rc != 0) { goto __28 } goto btree_open_out __28: ; (*BtShared)(unsafe.Pointer(pBt)).FusableSize = (*BtShared)(unsafe.Pointer(pBt)).FpageSize - U32(nReserve) (*BtShared)(unsafe.Pointer(pBt)).FnRef = 1 if !((*Btree)(unsafe.Pointer(p)).Fsharable != 0) { goto __29 } mutexShared1 = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) if !(1 != 0 && Xsqlite3Config.FbCoreMutex != 0) { goto __30 } (*BtShared)(unsafe.Pointer(pBt)).Fmutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_FAST) if !((*BtShared)(unsafe.Pointer(pBt)).Fmutex == uintptr(0)) { goto __31 } rc = SQLITE_NOMEM goto btree_open_out __31: ; __30: ; Xsqlite3_mutex_enter(tls, mutexShared1) (*BtShared)(unsafe.Pointer(pBt)).FpNext = sqlite3SharedCacheList sqlite3SharedCacheList = pBt Xsqlite3_mutex_leave(tls, mutexShared1) __29: ; __20: ; if !((*Btree)(unsafe.Pointer(p)).Fsharable != 0) { goto __32 } i = 0 __33: if !(i < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __35 } if !(libc.AssignUintptr(&pSib, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpBt) != uintptr(0) && (*Btree)(unsafe.Pointer(pSib)).Fsharable != 0) { goto __36 } __37: if !((*Btree)(unsafe.Pointer(pSib)).FpPrev != 0) { goto __38 } pSib = (*Btree)(unsafe.Pointer(pSib)).FpPrev goto __37 __38: ; if !(Uptr((*Btree)(unsafe.Pointer(p)).FpBt) < Uptr((*Btree)(unsafe.Pointer(pSib)).FpBt)) { goto __39 } (*Btree)(unsafe.Pointer(p)).FpNext = pSib (*Btree)(unsafe.Pointer(p)).FpPrev = uintptr(0) (*Btree)(unsafe.Pointer(pSib)).FpPrev = p goto __40 __39: __41: if !((*Btree)(unsafe.Pointer(pSib)).FpNext != 0 && Uptr((*Btree)(unsafe.Pointer((*Btree)(unsafe.Pointer(pSib)).FpNext)).FpBt) < Uptr((*Btree)(unsafe.Pointer(p)).FpBt)) { goto __42 } pSib = (*Btree)(unsafe.Pointer(pSib)).FpNext goto __41 __42: ; (*Btree)(unsafe.Pointer(p)).FpNext = (*Btree)(unsafe.Pointer(pSib)).FpNext (*Btree)(unsafe.Pointer(p)).FpPrev = pSib if !((*Btree)(unsafe.Pointer(p)).FpNext != 0) { goto __43 } (*Btree)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpNext)).FpPrev = p __43: ; (*Btree)(unsafe.Pointer(pSib)).FpNext = p __40: ; goto __35 __36: ; goto __34 __34: i++ goto __33 goto __35 __35: ; __32: ; *(*uintptr)(unsafe.Pointer(ppBtree)) = p btree_open_out: if !(rc != SQLITE_OK) { goto __44 } if !(pBt != 0 && (*BtShared)(unsafe.Pointer(pBt)).FpPager != 0) { goto __46 } Xsqlite3PagerClose(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, uintptr(0)) __46: ; Xsqlite3_free(tls, pBt) Xsqlite3_free(tls, p) *(*uintptr)(unsafe.Pointer(ppBtree)) = uintptr(0) goto __45 __44: if !(Xsqlite3BtreeSchema(tls, p, 0, uintptr(0)) == uintptr(0)) { goto __47 } Xsqlite3BtreeSetCacheSize(tls, p, -2000) __47: ; pFile = Xsqlite3PagerFile(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) if !((*Sqlite3_file)(unsafe.Pointer(pFile)).FpMethods != 0) { goto __48 } Xsqlite3OsFileControlHint(tls, pFile, SQLITE_FCNTL_PDB, pBt+8) __48: ; __45: ; if !(mutexOpen != 0) { goto __49 } Xsqlite3_mutex_leave(tls, mutexOpen) __49: ; return rc } func removeFromSharingList(tls *libc.TLS, pBt uintptr) int32 { var pMainMtx uintptr var pList uintptr var removed int32 = 0 pMainMtx = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, pMainMtx) (*BtShared)(unsafe.Pointer(pBt)).FnRef-- if (*BtShared)(unsafe.Pointer(pBt)).FnRef <= 0 { if sqlite3SharedCacheList == pBt { sqlite3SharedCacheList = (*BtShared)(unsafe.Pointer(pBt)).FpNext } else { pList = sqlite3SharedCacheList for pList != 0 && (*BtShared)(unsafe.Pointer(pList)).FpNext != pBt { pList = (*BtShared)(unsafe.Pointer(pList)).FpNext } if pList != 0 { (*BtShared)(unsafe.Pointer(pList)).FpNext = (*BtShared)(unsafe.Pointer(pBt)).FpNext } } if 1 != 0 { Xsqlite3_mutex_free(tls, (*BtShared)(unsafe.Pointer(pBt)).Fmutex) } removed = 1 } Xsqlite3_mutex_leave(tls, pMainMtx) return removed } func allocateTempSpace(tls *libc.TLS, pBt uintptr) int32 { (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace = Xsqlite3PageMalloc(tls, int32((*BtShared)(unsafe.Pointer(pBt)).FpageSize)) if (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace == uintptr(0) { var pCur uintptr = (*BtShared)(unsafe.Pointer(pBt)).FpCursor (*BtShared)(unsafe.Pointer(pBt)).FpCursor = (*BtCursor)(unsafe.Pointer(pCur)).FpNext libc.Xmemset(tls, pCur, 0, uint64(unsafe.Sizeof(BtCursor{}))) return SQLITE_NOMEM } libc.Xmemset(tls, (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace, 0, uint64(8)) *(*uintptr)(unsafe.Pointer(pBt + 136)) += uintptr(4) return SQLITE_OK } func freeTempSpace(tls *libc.TLS, pBt uintptr) { if (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace != 0 { *(*uintptr)(unsafe.Pointer(pBt + 136)) -= uintptr(4) Xsqlite3PageFree(tls, (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace) (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace = uintptr(0) } } // Close an open database and invalidate all cursors. func Xsqlite3BtreeClose(tls *libc.TLS, p uintptr) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) Xsqlite3BtreeRollback(tls, p, SQLITE_OK, 0) Xsqlite3BtreeLeave(tls, p) if !(int32((*Btree)(unsafe.Pointer(p)).Fsharable) != 0) || removeFromSharingList(tls, pBt) != 0 { Xsqlite3PagerClose(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, (*Btree)(unsafe.Pointer(p)).Fdb) if (*BtShared)(unsafe.Pointer(pBt)).FxFreeSchema != 0 && (*BtShared)(unsafe.Pointer(pBt)).FpSchema != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*BtShared)(unsafe.Pointer(pBt)).FxFreeSchema})).f(tls, (*BtShared)(unsafe.Pointer(pBt)).FpSchema) } Xsqlite3DbFree(tls, uintptr(0), (*BtShared)(unsafe.Pointer(pBt)).FpSchema) freeTempSpace(tls, pBt) Xsqlite3_free(tls, pBt) } if (*Btree)(unsafe.Pointer(p)).FpPrev != 0 { (*Btree)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpPrev)).FpNext = (*Btree)(unsafe.Pointer(p)).FpNext } if (*Btree)(unsafe.Pointer(p)).FpNext != 0 { (*Btree)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpNext)).FpPrev = (*Btree)(unsafe.Pointer(p)).FpPrev } Xsqlite3_free(tls, p) return SQLITE_OK } // Change the "soft" limit on the number of pages in the cache. // Unused and unmodified pages will be recycled when the number of // pages in the cache exceeds this soft limit. But the size of the // cache is allowed to grow larger than this limit if it contains // dirty pages or pages still in active use. func Xsqlite3BtreeSetCacheSize(tls *libc.TLS, p uintptr, mxPage int32) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) Xsqlite3PagerSetCachesize(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, mxPage) Xsqlite3BtreeLeave(tls, p) return SQLITE_OK } // Change the "spill" limit on the number of pages in the cache. // If the number of pages exceeds this limit during a write transaction, // the pager might attempt to "spill" pages to the journal early in // order to free up memory. // // The value returned is the current spill size. If zero is passed // as an argument, no changes are made to the spill size setting, so // using mxPage of 0 is a way to query the current spill size. func Xsqlite3BtreeSetSpillSize(tls *libc.TLS, p uintptr, mxPage int32) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var res int32 Xsqlite3BtreeEnter(tls, p) res = Xsqlite3PagerSetSpillsize(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, mxPage) Xsqlite3BtreeLeave(tls, p) return res } // Change the limit on the amount of the database file that may be // memory mapped. func Xsqlite3BtreeSetMmapLimit(tls *libc.TLS, p uintptr, szMmap Sqlite3_int64) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) Xsqlite3PagerSetMmapLimit(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, szMmap) Xsqlite3BtreeLeave(tls, p) return SQLITE_OK } // Change the way data is synced to disk in order to increase or decrease // how well the database resists damage due to OS crashes and power // failures. Level 1 is the same as asynchronous (no syncs() occur and // there is a high probability of damage) Level 2 is the default. There // is a very low but non-zero probability of damage. Level 3 reduces the // probability of damage to near zero but with a write performance reduction. func Xsqlite3BtreeSetPagerFlags(tls *libc.TLS, p uintptr, pgFlags uint32) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) Xsqlite3PagerSetFlags(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, pgFlags) Xsqlite3BtreeLeave(tls, p) return SQLITE_OK } // Change the default pages size and the number of reserved bytes per page. // Or, if the page size has already been fixed, return SQLITE_READONLY // without changing anything. // // The page size must be a power of 2 between 512 and 65536. If the page // size supplied does not meet this constraint then the page size is not // changed. // // Page sizes are constrained to be a power of two so that the region // of the database file used for locking (beginning at PENDING_BYTE, // the first byte past the 1GB boundary, 0x40000000) needs to occur // at the beginning of a page. // // If parameter nReserve is less than zero, then the number of reserved // bytes per page is left unchanged. // // If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size // and autovacuum mode can no longer be changed. func Xsqlite3BtreeSetPageSize(tls *libc.TLS, p uintptr, pageSize int32, nReserve int32, iFix int32) int32 { var rc int32 = SQLITE_OK var x int32 var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) (*BtShared)(unsafe.Pointer(pBt)).FnReserveWanted = U8(nReserve) x = int32((*BtShared)(unsafe.Pointer(pBt)).FpageSize - (*BtShared)(unsafe.Pointer(pBt)).FusableSize) if nReserve < x { nReserve = x } if int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_PAGESIZE_FIXED != 0 { Xsqlite3BtreeLeave(tls, p) return SQLITE_READONLY } if pageSize >= 512 && pageSize <= SQLITE_MAX_PAGE_SIZE && (pageSize-1)&pageSize == 0 { if nReserve > 32 && pageSize == 512 { pageSize = 1024 } (*BtShared)(unsafe.Pointer(pBt)).FpageSize = U32(pageSize) freeTempSpace(tls, pBt) } rc = Xsqlite3PagerSetPagesize(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, pBt+52, nReserve) (*BtShared)(unsafe.Pointer(pBt)).FusableSize = (*BtShared)(unsafe.Pointer(pBt)).FpageSize - U32(U16(nReserve)) if iFix != 0 { *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_PAGESIZE_FIXED) } Xsqlite3BtreeLeave(tls, p) return rc } // Return the currently defined page size func Xsqlite3BtreeGetPageSize(tls *libc.TLS, p uintptr) int32 { return int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FpageSize) } // This function is similar to sqlite3BtreeGetReserve(), except that it // may only be called if it is guaranteed that the b-tree mutex is already // held. // // This is useful in one special case in the backup API code where it is // known that the shared b-tree mutex is held, but the mutex on the // database handle that owns *p is not. In this case if sqlite3BtreeEnter() // were to be called, it might collide with some other operation on the // database handle that owns *p, causing undefined behavior. func Xsqlite3BtreeGetReserveNoMutex(tls *libc.TLS, p uintptr) int32 { var n int32 n = int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FpageSize - (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FusableSize) return n } // Return the number of bytes of space at the end of every page that // are intentually left unused. This is the "reserved" space that is // sometimes used by extensions. // // The value returned is the larger of the current reserve size and // the latest reserve size requested by SQLITE_FILECTRL_RESERVE_BYTES. // The amount of reserve can only grow - never shrink. func Xsqlite3BtreeGetRequestedReserve(tls *libc.TLS, p uintptr) int32 { var n1 int32 var n2 int32 Xsqlite3BtreeEnter(tls, p) n1 = int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FnReserveWanted) n2 = Xsqlite3BtreeGetReserveNoMutex(tls, p) Xsqlite3BtreeLeave(tls, p) if n1 > n2 { return n1 } return n2 } // Set the maximum page count for a database if mxPage is positive. // No changes are made if mxPage is 0 or negative. // Regardless of the value of mxPage, return the maximum page count. func Xsqlite3BtreeMaxPageCount(tls *libc.TLS, p uintptr, mxPage Pgno) Pgno { var n Pgno Xsqlite3BtreeEnter(tls, p) n = Xsqlite3PagerMaxPageCount(tls, (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FpPager, mxPage) Xsqlite3BtreeLeave(tls, p) return n } // Change the values for the BTS_SECURE_DELETE and BTS_OVERWRITE flags: // // newFlag==0 Both BTS_SECURE_DELETE and BTS_OVERWRITE are cleared // newFlag==1 BTS_SECURE_DELETE set and BTS_OVERWRITE is cleared // newFlag==2 BTS_SECURE_DELETE cleared and BTS_OVERWRITE is set // newFlag==(-1) No changes // // # This routine acts as a query if newFlag is less than zero // // With BTS_OVERWRITE set, deleted content is overwritten by zeros, but // freelist leaf pages are not written back to the database. Thus in-page // deleted content is cleared, but freelist deleted content is not. // // With BTS_SECURE_DELETE, operation is like BTS_OVERWRITE with the addition // that freelist leaf pages are written back into the database, increasing // the amount of disk I/O. func Xsqlite3BtreeSecureDelete(tls *libc.TLS, p uintptr, newFlag int32) int32 { var b int32 if p == uintptr(0) { return 0 } Xsqlite3BtreeEnter(tls, p) if newFlag >= 0 { *(*U16)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_FAST_SECURE)) *(*U16)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt + 40)) |= U16(BTS_SECURE_DELETE * newFlag) } b = int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FbtsFlags) & BTS_FAST_SECURE / BTS_SECURE_DELETE Xsqlite3BtreeLeave(tls, p) return b } // Change the 'auto-vacuum' property of the database. If the 'autoVacuum' // parameter is non-zero, then auto-vacuum mode is enabled. If zero, it // is disabled. The default value for the auto-vacuum property is // determined by the SQLITE_DEFAULT_AUTOVACUUM macro. func Xsqlite3BtreeSetAutoVacuum(tls *libc.TLS, p uintptr, autoVacuum int32) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var rc int32 = SQLITE_OK var av U8 = U8(autoVacuum) Xsqlite3BtreeEnter(tls, p) if int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_PAGESIZE_FIXED != 0 && func() int32 { if av != 0 { return 1 } return 0 }() != int32((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum) { rc = SQLITE_READONLY } else { (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum = func() uint8 { if av != 0 { return uint8(1) } return uint8(0) }() (*BtShared)(unsafe.Pointer(pBt)).FincrVacuum = func() uint8 { if int32(av) == 2 { return uint8(1) } return uint8(0) }() } Xsqlite3BtreeLeave(tls, p) return rc } // Return the value of the 'auto-vacuum' property. If auto-vacuum is // enabled 1 is returned. Otherwise 0. func Xsqlite3BtreeGetAutoVacuum(tls *libc.TLS, p uintptr) int32 { var rc int32 Xsqlite3BtreeEnter(tls, p) rc = func() int32 { if !(int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FautoVacuum) != 0) { return BTREE_AUTOVACUUM_NONE } return func() int32 { if !(int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FincrVacuum) != 0) { return BTREE_AUTOVACUUM_FULL } return BTREE_AUTOVACUUM_INCR }() }() Xsqlite3BtreeLeave(tls, p) return rc } func lockBtree(tls *libc.TLS, pBt uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 var nPage U32 var pageSize U32 var usableSize U32 var page1 uintptr *(*U32)(unsafe.Pointer(bp + 8)) = U32(0) rc = Xsqlite3PagerSharedLock(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) if !(rc != SQLITE_OK) { goto __1 } return rc __1: ; rc = btreeGetPage(tls, pBt, uint32(1), bp, 0) if !(rc != SQLITE_OK) { goto __2 } return rc __2: ; nPage = Xsqlite3Get4byte(tls, uintptr(28)+(*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData) Xsqlite3PagerPagecount(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, bp+8) if !(nPage == U32(0) || libc.Xmemcmp(tls, uintptr(24)+(*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData, uintptr(92)+(*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData, uint64(4)) != 0) { goto __3 } nPage = *(*U32)(unsafe.Pointer(bp + 8)) __3: ; if !((*Sqlite3)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).Fdb)).Fflags&uint64(SQLITE_ResetDatabase) != uint64(0)) { goto __4 } nPage = U32(0) __4: ; if !(nPage > U32(0)) { goto __5 } page1 = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData rc = SQLITE_NOTADB if !(libc.Xmemcmp(tls, page1, uintptr(unsafe.Pointer(&zMagicHeader)), uint64(16)) != 0) { goto __6 } goto page1_init_failed __6: ; if !(int32(*(*U8)(unsafe.Pointer(page1 + 18))) > 2) { goto __7 } *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_READ_ONLY) __7: ; if !(int32(*(*U8)(unsafe.Pointer(page1 + 19))) > 2) { goto __8 } goto page1_init_failed __8: ; if !(int32(*(*U8)(unsafe.Pointer(page1 + 19))) == 2 && int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_NO_WAL == 0) { goto __9 } *(*int32)(unsafe.Pointer(bp + 12)) = 0 rc = Xsqlite3PagerOpenWal(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, bp+12) if !(rc != SQLITE_OK) { goto __11 } goto page1_init_failed goto __12 __11: ; if !(*(*int32)(unsafe.Pointer(bp + 12)) == 0) { goto __13 } releasePageOne(tls, *(*uintptr)(unsafe.Pointer(bp))) return SQLITE_OK __13: ; __12: ; rc = SQLITE_NOTADB goto __10 __9: ; __10: ; if !(libc.Xmemcmp(tls, page1+21, ts+5410, uint64(3)) != 0) { goto __14 } goto page1_init_failed __14: ; pageSize = U32(int32(*(*U8)(unsafe.Pointer(page1 + 16)))<<8 | int32(*(*U8)(unsafe.Pointer(page1 + 17)))<<16) if !((pageSize-U32(1))&pageSize != U32(0) || pageSize > U32(SQLITE_MAX_PAGE_SIZE) || pageSize <= U32(256)) { goto __15 } goto page1_init_failed __15: ; *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_PAGESIZE_FIXED) usableSize = pageSize - U32(*(*U8)(unsafe.Pointer(page1 + 20))) if !(pageSize != (*BtShared)(unsafe.Pointer(pBt)).FpageSize) { goto __16 } releasePageOne(tls, *(*uintptr)(unsafe.Pointer(bp))) (*BtShared)(unsafe.Pointer(pBt)).FusableSize = usableSize (*BtShared)(unsafe.Pointer(pBt)).FpageSize = pageSize freeTempSpace(tls, pBt) rc = Xsqlite3PagerSetPagesize(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, pBt+52, int32(pageSize-usableSize)) return rc __16: ; if !(nPage > *(*U32)(unsafe.Pointer(bp + 8))) { goto __17 } if !(Xsqlite3WritableSchema(tls, (*BtShared)(unsafe.Pointer(pBt)).Fdb) == 0) { goto __18 } rc = Xsqlite3CorruptError(tls, 71726) goto page1_init_failed goto __19 __18: nPage = *(*U32)(unsafe.Pointer(bp + 8)) __19: ; __17: ; if !(usableSize < U32(480)) { goto __20 } goto page1_init_failed __20: ; (*BtShared)(unsafe.Pointer(pBt)).FpageSize = pageSize (*BtShared)(unsafe.Pointer(pBt)).FusableSize = usableSize (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum = func() uint8 { if Xsqlite3Get4byte(tls, page1+52) != 0 { return uint8(1) } return uint8(0) }() (*BtShared)(unsafe.Pointer(pBt)).FincrVacuum = func() uint8 { if Xsqlite3Get4byte(tls, page1+64) != 0 { return uint8(1) } return uint8(0) }() __5: ; (*BtShared)(unsafe.Pointer(pBt)).FmaxLocal = U16(((*BtShared)(unsafe.Pointer(pBt)).FusableSize-U32(12))*U32(64)/U32(255) - U32(23)) (*BtShared)(unsafe.Pointer(pBt)).FminLocal = U16(((*BtShared)(unsafe.Pointer(pBt)).FusableSize-U32(12))*U32(32)/U32(255) - U32(23)) (*BtShared)(unsafe.Pointer(pBt)).FmaxLeaf = U16((*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(35)) (*BtShared)(unsafe.Pointer(pBt)).FminLeaf = U16(((*BtShared)(unsafe.Pointer(pBt)).FusableSize-U32(12))*U32(32)/U32(255) - U32(23)) if !(int32((*BtShared)(unsafe.Pointer(pBt)).FmaxLocal) > 127) { goto __21 } (*BtShared)(unsafe.Pointer(pBt)).Fmax1bytePayload = U8(127) goto __22 __21: (*BtShared)(unsafe.Pointer(pBt)).Fmax1bytePayload = U8((*BtShared)(unsafe.Pointer(pBt)).FmaxLocal) __22: ; (*BtShared)(unsafe.Pointer(pBt)).FpPage1 = *(*uintptr)(unsafe.Pointer(bp)) (*BtShared)(unsafe.Pointer(pBt)).FnPage = nPage return SQLITE_OK page1_init_failed: releasePageOne(tls, *(*uintptr)(unsafe.Pointer(bp))) (*BtShared)(unsafe.Pointer(pBt)).FpPage1 = uintptr(0) return rc } func unlockBtreeIfUnused(tls *libc.TLS, pBt uintptr) { if int32((*BtShared)(unsafe.Pointer(pBt)).FinTransaction) == TRANS_NONE && (*BtShared)(unsafe.Pointer(pBt)).FpPage1 != uintptr(0) { var pPage1 uintptr = (*BtShared)(unsafe.Pointer(pBt)).FpPage1 (*BtShared)(unsafe.Pointer(pBt)).FpPage1 = uintptr(0) releasePageOne(tls, pPage1) } } func newDatabase(tls *libc.TLS, pBt uintptr) int32 { var pP1 uintptr var data uintptr var rc int32 if (*BtShared)(unsafe.Pointer(pBt)).FnPage > U32(0) { return SQLITE_OK } pP1 = (*BtShared)(unsafe.Pointer(pBt)).FpPage1 data = (*MemPage)(unsafe.Pointer(pP1)).FaData rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pP1)).FpDbPage) if rc != 0 { return rc } libc.Xmemcpy(tls, data, uintptr(unsafe.Pointer(&zMagicHeader)), uint64(unsafe.Sizeof(zMagicHeader))) *(*uint8)(unsafe.Pointer(data + 16)) = U8((*BtShared)(unsafe.Pointer(pBt)).FpageSize >> 8 & U32(0xff)) *(*uint8)(unsafe.Pointer(data + 17)) = U8((*BtShared)(unsafe.Pointer(pBt)).FpageSize >> 16 & U32(0xff)) *(*uint8)(unsafe.Pointer(data + 18)) = uint8(1) *(*uint8)(unsafe.Pointer(data + 19)) = uint8(1) *(*uint8)(unsafe.Pointer(data + 20)) = U8((*BtShared)(unsafe.Pointer(pBt)).FpageSize - (*BtShared)(unsafe.Pointer(pBt)).FusableSize) *(*uint8)(unsafe.Pointer(data + 21)) = uint8(64) *(*uint8)(unsafe.Pointer(data + 22)) = uint8(32) *(*uint8)(unsafe.Pointer(data + 23)) = uint8(32) libc.Xmemset(tls, data+24, 0, uint64(100-24)) zeroPage(tls, pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA) *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_PAGESIZE_FIXED) Xsqlite3Put4byte(tls, data+52, uint32((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum)) Xsqlite3Put4byte(tls, data+64, uint32((*BtShared)(unsafe.Pointer(pBt)).FincrVacuum)) (*BtShared)(unsafe.Pointer(pBt)).FnPage = U32(1) *(*uint8)(unsafe.Pointer(data + 31)) = uint8(1) return SQLITE_OK } // Initialize the first page of the database file (creating a database // consisting of a single page and no schema objects). Return SQLITE_OK // if successful, or an SQLite error code otherwise. func Xsqlite3BtreeNewDb(tls *libc.TLS, p uintptr) int32 { var rc int32 Xsqlite3BtreeEnter(tls, p) (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FnPage = U32(0) rc = newDatabase(tls, (*Btree)(unsafe.Pointer(p)).FpBt) Xsqlite3BtreeLeave(tls, p) return rc } // Attempt to start a new transaction. A write-transaction // is started if the second argument is nonzero, otherwise a read- // transaction. If the second argument is 2 or more and exclusive // transaction is started, meaning that no other process is allowed // to access the database. A preexisting transaction may not be // upgraded to exclusive by calling this routine a second time - the // exclusivity flag only works for a new transaction. // // A write-transaction must be started before attempting any // changes to the database. None of the following routines // will work unless a transaction is started first: // // sqlite3BtreeCreateTable() // sqlite3BtreeCreateIndex() // sqlite3BtreeClearTable() // sqlite3BtreeDropTable() // sqlite3BtreeInsert() // sqlite3BtreeDelete() // sqlite3BtreeUpdateMeta() // // If an initial attempt to acquire the lock fails because of lock contention // and the database was previously unlocked, then invoke the busy handler // if there is one. But if there was previously a read-lock, do not // invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is // returned when there is already a read-lock in order to avoid a deadlock. // // Suppose there are two processes A and B. A has a read lock and B has // a reserved lock. B tries to promote to exclusive but is blocked because // of A's read lock. A tries to promote to reserved but is blocked by B. // One or the other of the two processes must give way or there can be // no progress. By returning SQLITE_BUSY and not invoking the busy callback // when A already has a read lock, we encourage A to give up and let B // proceed. func Xsqlite3BtreeBeginTrans(tls *libc.TLS, p uintptr, wrflag int32, pSchemaVersion uintptr) int32 { var pBt uintptr var pPager uintptr var rc int32 var pIter uintptr var pBlock uintptr var pPage1 uintptr pBt = (*Btree)(unsafe.Pointer(p)).FpBt pPager = (*BtShared)(unsafe.Pointer(pBt)).FpPager rc = SQLITE_OK Xsqlite3BtreeEnter(tls, p) if !(int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_WRITE || int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_READ && !(wrflag != 0)) { goto __1 } goto trans_begun __1: ; if !((*Sqlite3)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).Fdb)).Fflags&uint64(SQLITE_ResetDatabase) != 0 && int32(Xsqlite3PagerIsreadonly(tls, pPager)) == 0) { goto __2 } *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_READ_ONLY)) __2: ; if !(int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_READ_ONLY != 0 && wrflag != 0) { goto __3 } rc = SQLITE_READONLY goto trans_begun __3: ; pBlock = uintptr(0) if !(wrflag != 0 && int32((*BtShared)(unsafe.Pointer(pBt)).FinTransaction) == TRANS_WRITE || int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_PENDING != 0) { goto __4 } pBlock = (*Btree)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpWriter)).Fdb goto __5 __4: if !(wrflag > 1) { goto __6 } pIter = (*BtShared)(unsafe.Pointer(pBt)).FpLock __7: if !(pIter != 0) { goto __9 } if !((*BtLock)(unsafe.Pointer(pIter)).FpBtree != p) { goto __10 } pBlock = (*Btree)(unsafe.Pointer((*BtLock)(unsafe.Pointer(pIter)).FpBtree)).Fdb goto __9 __10: ; goto __8 __8: pIter = (*BtLock)(unsafe.Pointer(pIter)).FpNext goto __7 goto __9 __9: ; __6: ; __5: ; if !(pBlock != 0) { goto __11 } Xsqlite3ConnectionBlocked(tls, (*Btree)(unsafe.Pointer(p)).Fdb, pBlock) rc = SQLITE_LOCKED | int32(1)<<8 goto trans_begun __11: ; rc = querySharedCacheTableLock(tls, p, uint32(SCHEMA_ROOT), uint8(READ_LOCK)) if !(SQLITE_OK != rc) { goto __12 } goto trans_begun __12: ; *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_INITIALLY_EMPTY)) if !((*BtShared)(unsafe.Pointer(pBt)).FnPage == U32(0)) { goto __13 } *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_INITIALLY_EMPTY) __13: ; __14: ; __17: if !((*BtShared)(unsafe.Pointer(pBt)).FpPage1 == uintptr(0) && SQLITE_OK == libc.AssignInt32(&rc, lockBtree(tls, pBt))) { goto __18 } goto __17 __18: ; if !(rc == SQLITE_OK && wrflag != 0) { goto __19 } if !(int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_READ_ONLY != 0) { goto __20 } rc = SQLITE_READONLY goto __21 __20: rc = Xsqlite3PagerBegin(tls, pPager, libc.Bool32(wrflag > 1), Xsqlite3TempInMemory(tls, (*Btree)(unsafe.Pointer(p)).Fdb)) if !(rc == SQLITE_OK) { goto __22 } rc = newDatabase(tls, pBt) goto __23 __22: if !(rc == SQLITE_BUSY|int32(2)<<8 && int32((*BtShared)(unsafe.Pointer(pBt)).FinTransaction) == TRANS_NONE) { goto __24 } rc = SQLITE_BUSY __24: ; __23: ; __21: ; __19: ; if !(rc != SQLITE_OK) { goto __25 } unlockBtreeIfUnused(tls, pBt) __25: ; goto __15 __15: if rc&0xFF == SQLITE_BUSY && int32((*BtShared)(unsafe.Pointer(pBt)).FinTransaction) == TRANS_NONE && btreeInvokeBusyHandler(tls, pBt) != 0 { goto __14 } goto __16 __16: ; if !(rc == SQLITE_OK) { goto __26 } if !(int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_NONE) { goto __27 } (*BtShared)(unsafe.Pointer(pBt)).FnTransaction++ if !((*Btree)(unsafe.Pointer(p)).Fsharable != 0) { goto __28 } (*Btree)(unsafe.Pointer(p)).Flock.FeLock = U8(READ_LOCK) (*Btree)(unsafe.Pointer(p)).Flock.FpNext = (*BtShared)(unsafe.Pointer(pBt)).FpLock (*BtShared)(unsafe.Pointer(pBt)).FpLock = p + 48 __28: ; __27: ; (*Btree)(unsafe.Pointer(p)).FinTrans = func() uint8 { if wrflag != 0 { return uint8(TRANS_WRITE) } return uint8(TRANS_READ) }() if !(int32((*Btree)(unsafe.Pointer(p)).FinTrans) > int32((*BtShared)(unsafe.Pointer(pBt)).FinTransaction)) { goto __29 } (*BtShared)(unsafe.Pointer(pBt)).FinTransaction = (*Btree)(unsafe.Pointer(p)).FinTrans __29: ; if !(wrflag != 0) { goto __30 } pPage1 = (*BtShared)(unsafe.Pointer(pBt)).FpPage1 (*BtShared)(unsafe.Pointer(pBt)).FpWriter = p *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_EXCLUSIVE)) if !(wrflag > 1) { goto __31 } *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_EXCLUSIVE) __31: ; if !((*BtShared)(unsafe.Pointer(pBt)).FnPage != Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+28)) { goto __32 } rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage1)).FpDbPage) if !(rc == SQLITE_OK) { goto __33 } Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+28, (*BtShared)(unsafe.Pointer(pBt)).FnPage) __33: ; __32: ; __30: ; __26: ; trans_begun: if !(rc == SQLITE_OK) { goto __34 } if !(pSchemaVersion != 0) { goto __35 } *(*int32)(unsafe.Pointer(pSchemaVersion)) = int32(Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+40)) __35: ; if !(wrflag != 0) { goto __36 } rc = Xsqlite3PagerOpenSavepoint(tls, pPager, (*Sqlite3)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).Fdb)).FnSavepoint) __36: ; __34: ; Xsqlite3BtreeLeave(tls, p) return rc } func setChildPtrmaps(tls *libc.TLS, pPage uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var i int32 var nCell int32 var pBt uintptr = (*MemPage)(unsafe.Pointer(pPage)).FpBt var pgno Pgno = (*MemPage)(unsafe.Pointer(pPage)).Fpgno if (*MemPage)(unsafe.Pointer(pPage)).FisInit != 0 { *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK } else { *(*int32)(unsafe.Pointer(bp)) = btreeInitPage(tls, pPage) } if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp)) } nCell = int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) for i = 0; i < nCell; i++ { var pCell uintptr = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*i)))))) ptrmapPutOvflPtr(tls, pPage, pPage, pCell, bp) if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { var childPgno Pgno = Xsqlite3Get4byte(tls, pCell) ptrmapPut(tls, pBt, childPgno, uint8(PTRMAP_BTREE), pgno, bp) } } if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { var childPgno Pgno = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8)) ptrmapPut(tls, pBt, childPgno, uint8(PTRMAP_BTREE), pgno, bp) } return *(*int32)(unsafe.Pointer(bp)) } func modifyPagePointer(tls *libc.TLS, pPage uintptr, iFrom Pgno, iTo Pgno, eType U8) int32 { bp := tls.Alloc(24) defer tls.Free(24) if int32(eType) == PTRMAP_OVERFLOW2 { if Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData) != iFrom { return Xsqlite3CorruptError(tls, 72147) } Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData, iTo) } else { var i int32 var nCell int32 var rc int32 if (*MemPage)(unsafe.Pointer(pPage)).FisInit != 0 { rc = SQLITE_OK } else { rc = btreeInitPage(tls, pPage) } if rc != 0 { return rc } nCell = int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) for i = 0; i < nCell; i++ { var pCell uintptr = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*i)))))) if int32(eType) == PTRMAP_OVERFLOW1 { (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxParseCell})).f(tls, pPage, pCell, bp) if U32((*CellInfo)(unsafe.Pointer(bp)).FnLocal) < (*CellInfo)(unsafe.Pointer(bp)).FnPayload { if pCell+uintptr((*CellInfo)(unsafe.Pointer(bp)).FnSize) > (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize) { return Xsqlite3CorruptError(tls, 72166) } if iFrom == Xsqlite3Get4byte(tls, pCell+uintptr((*CellInfo)(unsafe.Pointer(bp)).FnSize)-uintptr(4)) { Xsqlite3Put4byte(tls, pCell+uintptr((*CellInfo)(unsafe.Pointer(bp)).FnSize)-uintptr(4), iTo) break } } } else { if pCell+uintptr(4) > (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize) { return Xsqlite3CorruptError(tls, 72175) } if Xsqlite3Get4byte(tls, pCell) == iFrom { Xsqlite3Put4byte(tls, pCell, iTo) break } } } if i == nCell { if int32(eType) != PTRMAP_BTREE || Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8)) != iFrom { return Xsqlite3CorruptError(tls, 72187) } Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8), iTo) } } return SQLITE_OK } func relocatePage(tls *libc.TLS, pBt uintptr, pDbPage uintptr, eType U8, iPtrPage Pgno, iFreePage Pgno, isCommit int32) int32 { bp := tls.Alloc(16) defer tls.Free(16) var iDbPage Pgno = (*MemPage)(unsafe.Pointer(pDbPage)).Fpgno var pPager uintptr = (*BtShared)(unsafe.Pointer(pBt)).FpPager if iDbPage < Pgno(3) { return Xsqlite3CorruptError(tls, 72222) } *(*int32)(unsafe.Pointer(bp)) = Xsqlite3PagerMovepage(tls, pPager, (*MemPage)(unsafe.Pointer(pDbPage)).FpDbPage, iFreePage, isCommit) if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp)) } (*MemPage)(unsafe.Pointer(pDbPage)).Fpgno = iFreePage if int32(eType) == PTRMAP_BTREE || int32(eType) == PTRMAP_ROOTPAGE { *(*int32)(unsafe.Pointer(bp)) = setChildPtrmaps(tls, pDbPage) if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp)) } } else { var nextOvfl Pgno = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pDbPage)).FaData) if nextOvfl != Pgno(0) { ptrmapPut(tls, pBt, nextOvfl, uint8(PTRMAP_OVERFLOW2), iFreePage, bp) if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp)) } } } if int32(eType) != PTRMAP_ROOTPAGE { *(*int32)(unsafe.Pointer(bp)) = btreeGetPage(tls, pBt, iPtrPage, bp+8, 0) if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp)) } *(*int32)(unsafe.Pointer(bp)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpDbPage) if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) return *(*int32)(unsafe.Pointer(bp)) } *(*int32)(unsafe.Pointer(bp)) = modifyPagePointer(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), iDbPage, iFreePage, eType) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { ptrmapPut(tls, pBt, iFreePage, eType, iPtrPage, bp) } } return *(*int32)(unsafe.Pointer(bp)) } func incrVacuumStep(tls *libc.TLS, pBt uintptr, nFin Pgno, iLastPg Pgno, bCommit int32) int32 { bp := tls.Alloc(44) defer tls.Free(44) var nFreeList Pgno var rc int32 if !(ptrmapPageno(tls, pBt, iLastPg) == iLastPg) && iLastPg != U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { nFreeList = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+36) if nFreeList == Pgno(0) { return SQLITE_DONE } rc = ptrmapGet(tls, pBt, iLastPg, bp, bp+4) if rc != SQLITE_OK { return rc } if int32(*(*U8)(unsafe.Pointer(bp))) == PTRMAP_ROOTPAGE { return Xsqlite3CorruptError(tls, 72320) } if int32(*(*U8)(unsafe.Pointer(bp))) == PTRMAP_FREEPAGE { if bCommit == 0 { rc = allocateBtreePage(tls, pBt, bp+8, bp+16, iLastPg, uint8(BTALLOC_EXACT)) if rc != SQLITE_OK { return rc } releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } } else { var eMode U8 = U8(BTALLOC_ANY) var iNear Pgno = Pgno(0) rc = btreeGetPage(tls, pBt, iLastPg, bp+24, 0) if rc != SQLITE_OK { return rc } if bCommit == 0 { eMode = U8(BTALLOC_LE) iNear = nFin } for __ccgo := true; __ccgo; __ccgo = bCommit != 0 && *(*Pgno)(unsafe.Pointer(bp + 40)) > nFin { var dbSize Pgno = btreePagecount(tls, pBt) rc = allocateBtreePage(tls, pBt, bp+32, bp+40, iNear, eMode) if rc != SQLITE_OK { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) return rc } releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 32))) if *(*Pgno)(unsafe.Pointer(bp + 40)) > dbSize { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) return Xsqlite3CorruptError(tls, 72372) } } rc = relocatePage(tls, pBt, *(*uintptr)(unsafe.Pointer(bp + 24)), *(*U8)(unsafe.Pointer(bp)), *(*Pgno)(unsafe.Pointer(bp + 4)), *(*Pgno)(unsafe.Pointer(bp + 40)), bCommit) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) if rc != SQLITE_OK { return rc } } } if bCommit == 0 { for __ccgo1 := true; __ccgo1; __ccgo1 = iLastPg == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) || ptrmapPageno(tls, pBt, iLastPg) == iLastPg { iLastPg-- } (*BtShared)(unsafe.Pointer(pBt)).FbDoTruncate = U8(1) (*BtShared)(unsafe.Pointer(pBt)).FnPage = iLastPg } return SQLITE_OK } func finalDbSize(tls *libc.TLS, pBt uintptr, nOrig Pgno, nFree Pgno) Pgno { var nEntry int32 var nPtrmap Pgno var nFin Pgno nEntry = int32((*BtShared)(unsafe.Pointer(pBt)).FusableSize / U32(5)) nPtrmap = (nFree - nOrig + ptrmapPageno(tls, pBt, nOrig) + Pgno(nEntry)) / Pgno(nEntry) nFin = nOrig - nFree - nPtrmap if nOrig > U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) && nFin < U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { nFin-- } for ptrmapPageno(tls, pBt, nFin) == nFin || nFin == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { nFin-- } return nFin } // A write-transaction must be opened before calling this function. // It performs a single unit of work towards an incremental vacuum. // // If the incremental vacuum is finished after this function has run, // SQLITE_DONE is returned. If it is not finished, but no error occurred, // SQLITE_OK is returned. Otherwise an SQLite error code. func Xsqlite3BtreeIncrVacuum(tls *libc.TLS, p uintptr) int32 { var rc int32 var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) if !(int32((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum) != 0) { rc = SQLITE_DONE } else { var nOrig Pgno = btreePagecount(tls, pBt) var nFree Pgno = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+36) var nFin Pgno = finalDbSize(tls, pBt, nOrig, nFree) if nOrig < nFin || nFree >= nOrig { rc = Xsqlite3CorruptError(tls, 72440) } else if nFree > Pgno(0) { rc = saveAllCursors(tls, pBt, uint32(0), uintptr(0)) if rc == SQLITE_OK { invalidateAllOverflowCache(tls, pBt) rc = incrVacuumStep(tls, pBt, nFin, nOrig, 0) } if rc == SQLITE_OK { rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FpDbPage) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+28, (*BtShared)(unsafe.Pointer(pBt)).FnPage) } } else { rc = SQLITE_DONE } } Xsqlite3BtreeLeave(tls, p) return rc } func autoVacuumCommit(tls *libc.TLS, p uintptr) int32 { var rc int32 = SQLITE_OK var pPager uintptr var pBt uintptr var db uintptr pBt = (*Btree)(unsafe.Pointer(p)).FpBt pPager = (*BtShared)(unsafe.Pointer(pBt)).FpPager invalidateAllOverflowCache(tls, pBt) if !(int32((*BtShared)(unsafe.Pointer(pBt)).FincrVacuum) != 0) { var nFin Pgno var nFree Pgno var nVac Pgno var iFree Pgno var nOrig Pgno nOrig = btreePagecount(tls, pBt) if ptrmapPageno(tls, pBt, nOrig) == nOrig || nOrig == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { return Xsqlite3CorruptError(tls, 72491) } nFree = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+36) db = (*Btree)(unsafe.Pointer(p)).Fdb if (*Sqlite3)(unsafe.Pointer(db)).FxAutovacPages != 0 { var iDb int32 for iDb = 0; iDb < (*Sqlite3)(unsafe.Pointer(db)).FnDb; iDb++ { if (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpBt == p { break } } nVac = (*struct { f func(*libc.TLS, uintptr, uintptr, U32, U32, U32) uint32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxAutovacPages})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpAutovacPagesArg, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, nOrig, nFree, (*BtShared)(unsafe.Pointer(pBt)).FpageSize) if nVac > nFree { nVac = nFree } if nVac == Pgno(0) { return SQLITE_OK } } else { nVac = nFree } nFin = finalDbSize(tls, pBt, nOrig, nVac) if nFin > nOrig { return Xsqlite3CorruptError(tls, 72518) } if nFin < nOrig { rc = saveAllCursors(tls, pBt, uint32(0), uintptr(0)) } for iFree = nOrig; iFree > nFin && rc == SQLITE_OK; iFree-- { rc = incrVacuumStep(tls, pBt, nFin, iFree, libc.Bool32(nVac == nFree)) } if (rc == SQLITE_DONE || rc == SQLITE_OK) && nFree > Pgno(0) { rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FpDbPage) if nVac == nFree { Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+32, uint32(0)) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+36, uint32(0)) } Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+28, nFin) (*BtShared)(unsafe.Pointer(pBt)).FbDoTruncate = U8(1) (*BtShared)(unsafe.Pointer(pBt)).FnPage = nFin } if rc != SQLITE_OK { Xsqlite3PagerRollback(tls, pPager) } } return rc } // This routine does the first phase of a two-phase commit. This routine // causes a rollback journal to be created (if it does not already exist) // and populated with enough information so that if a power loss occurs // the database can be restored to its original state by playing back // the journal. Then the contents of the journal are flushed out to // the disk. After the journal is safely on oxide, the changes to the // database are written into the database file and flushed to oxide. // At the end of this call, the rollback journal still exists on the // disk and we are still holding all locks, so the transaction has not // committed. See sqlite3BtreeCommitPhaseTwo() for the second phase of the // commit process. // // This call is a no-op if no write-transaction is currently active on pBt. // // Otherwise, sync the database file for the btree pBt. zSuperJrnl points to // the name of a super-journal file that should be written into the // individual journal file, or is NULL, indicating no super-journal file // (single database transaction). // // When this is called, the super-journal should already have been // created, populated with this journal pointer and synced to disk. // // Once this is routine has returned, the only thing required to commit // the write-transaction for this database file is to delete the journal. func Xsqlite3BtreeCommitPhaseOne(tls *libc.TLS, p uintptr, zSuperJrnl uintptr) int32 { var rc int32 = SQLITE_OK if int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_WRITE { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { rc = autoVacuumCommit(tls, p) if rc != SQLITE_OK { Xsqlite3BtreeLeave(tls, p) return rc } } if (*BtShared)(unsafe.Pointer(pBt)).FbDoTruncate != 0 { Xsqlite3PagerTruncateImage(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, (*BtShared)(unsafe.Pointer(pBt)).FnPage) } rc = Xsqlite3PagerCommitPhaseOne(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, zSuperJrnl, 0) Xsqlite3BtreeLeave(tls, p) } return rc } func btreeEndTransaction(tls *libc.TLS, p uintptr) { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var db uintptr = (*Btree)(unsafe.Pointer(p)).Fdb (*BtShared)(unsafe.Pointer(pBt)).FbDoTruncate = U8(0) if int32((*Btree)(unsafe.Pointer(p)).FinTrans) > TRANS_NONE && (*Sqlite3)(unsafe.Pointer(db)).FnVdbeRead > 1 { downgradeAllSharedCacheTableLocks(tls, p) (*Btree)(unsafe.Pointer(p)).FinTrans = U8(TRANS_READ) } else { if int32((*Btree)(unsafe.Pointer(p)).FinTrans) != TRANS_NONE { clearAllSharedCacheTableLocks(tls, p) (*BtShared)(unsafe.Pointer(pBt)).FnTransaction-- if 0 == (*BtShared)(unsafe.Pointer(pBt)).FnTransaction { (*BtShared)(unsafe.Pointer(pBt)).FinTransaction = U8(TRANS_NONE) } } (*Btree)(unsafe.Pointer(p)).FinTrans = U8(TRANS_NONE) unlockBtreeIfUnused(tls, pBt) } } // Commit the transaction currently in progress. // // This routine implements the second phase of a 2-phase commit. The // sqlite3BtreeCommitPhaseOne() routine does the first phase and should // be invoked prior to calling this routine. The sqlite3BtreeCommitPhaseOne() // routine did all the work of writing information out to disk and flushing the // contents so that they are written onto the disk platter. All this // routine has to do is delete or truncate or zero the header in the // the rollback journal (which causes the transaction to commit) and // drop locks. // // Normally, if an error occurs while the pager layer is attempting to // finalize the underlying journal file, this function returns an error and // the upper layer will attempt a rollback. However, if the second argument // is non-zero then this b-tree transaction is part of a multi-file // transaction. In this case, the transaction has already been committed // (by deleting a super-journal file) and the caller will ignore this // functions return code. So, even if an error occurs in the pager layer, // reset the b-tree objects internal state to indicate that the write // transaction has been closed. This is quite safe, as the pager will have // transitioned to the error state. // // This will release the write lock on the database file. If there // are no active cursors, it also releases the read lock. func Xsqlite3BtreeCommitPhaseTwo(tls *libc.TLS, p uintptr, bCleanup int32) int32 { if int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_NONE { return SQLITE_OK } Xsqlite3BtreeEnter(tls, p) if int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_WRITE { var rc int32 var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt rc = Xsqlite3PagerCommitPhaseTwo(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) if rc != SQLITE_OK && bCleanup == 0 { Xsqlite3BtreeLeave(tls, p) return rc } (*Btree)(unsafe.Pointer(p)).FiBDataVersion-- (*BtShared)(unsafe.Pointer(pBt)).FinTransaction = U8(TRANS_READ) btreeClearHasContent(tls, pBt) } btreeEndTransaction(tls, p) Xsqlite3BtreeLeave(tls, p) return SQLITE_OK } // Do both phases of a commit. func Xsqlite3BtreeCommit(tls *libc.TLS, p uintptr) int32 { var rc int32 Xsqlite3BtreeEnter(tls, p) rc = Xsqlite3BtreeCommitPhaseOne(tls, p, uintptr(0)) if rc == SQLITE_OK { rc = Xsqlite3BtreeCommitPhaseTwo(tls, p, 0) } Xsqlite3BtreeLeave(tls, p) return rc } // This routine sets the state to CURSOR_FAULT and the error // code to errCode for every cursor on any BtShared that pBtree // references. Or if the writeOnly flag is set to 1, then only // trip write cursors and leave read cursors unchanged. // // Every cursor is a candidate to be tripped, including cursors // that belong to other database connections that happen to be // sharing the cache with pBtree. // // This routine gets called when a rollback occurs. If the writeOnly // flag is true, then only write-cursors need be tripped - read-only // cursors save their current positions so that they may continue // following the rollback. Or, if writeOnly is false, all cursors are // tripped. In general, writeOnly is false if the transaction being // rolled back modified the database schema. In this case b-tree root // pages may be moved or deleted from the database altogether, making // it unsafe for read cursors to continue. // // If the writeOnly flag is true and an error is encountered while // saving the current position of a read-only cursor, all cursors, // including all read-cursors are tripped. // // SQLITE_OK is returned if successful, or if an error occurs while // saving a cursor position, an SQLite error code. func Xsqlite3BtreeTripAllCursors(tls *libc.TLS, pBtree uintptr, errCode int32, writeOnly int32) int32 { var p uintptr var rc int32 = SQLITE_OK if pBtree != 0 { Xsqlite3BtreeEnter(tls, pBtree) for p = (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(pBtree)).FpBt)).FpCursor; p != 0; p = (*BtCursor)(unsafe.Pointer(p)).FpNext { if writeOnly != 0 && int32((*BtCursor)(unsafe.Pointer(p)).FcurFlags)&BTCF_WriteFlag == 0 { if int32((*BtCursor)(unsafe.Pointer(p)).FeState) == CURSOR_VALID || int32((*BtCursor)(unsafe.Pointer(p)).FeState) == CURSOR_SKIPNEXT { rc = saveCursorPosition(tls, p) if rc != SQLITE_OK { Xsqlite3BtreeTripAllCursors(tls, pBtree, rc, 0) break } } } else { Xsqlite3BtreeClearCursor(tls, p) (*BtCursor)(unsafe.Pointer(p)).FeState = U8(CURSOR_FAULT) (*BtCursor)(unsafe.Pointer(p)).FskipNext = errCode } btreeReleaseAllCursorPages(tls, p) } Xsqlite3BtreeLeave(tls, pBtree) } return rc } func btreeSetNPage(tls *libc.TLS, pBt uintptr, pPage1 uintptr) { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = int32(Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+28)) if *(*int32)(unsafe.Pointer(bp)) == 0 { Xsqlite3PagerPagecount(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, bp) } (*BtShared)(unsafe.Pointer(pBt)).FnPage = U32(*(*int32)(unsafe.Pointer(bp))) } // Rollback the transaction in progress. // // If tripCode is not SQLITE_OK then cursors will be invalidated (tripped). // Only write cursors are tripped if writeOnly is true but all cursors are // tripped if writeOnly is false. Any attempt to use // a tripped cursor will result in an error. // // This will release the write lock on the database file. If there // are no active cursors, it also releases the read lock. func Xsqlite3BtreeRollback(tls *libc.TLS, p uintptr, tripCode int32, writeOnly int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) if tripCode == SQLITE_OK { rc = libc.AssignInt32(&tripCode, saveAllCursors(tls, pBt, uint32(0), uintptr(0))) if rc != 0 { writeOnly = 0 } } else { rc = SQLITE_OK } if tripCode != 0 { var rc2 int32 = Xsqlite3BtreeTripAllCursors(tls, p, tripCode, writeOnly) if rc2 != SQLITE_OK { rc = rc2 } } if int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_WRITE { var rc2 int32 rc2 = Xsqlite3PagerRollback(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) if rc2 != SQLITE_OK { rc = rc2 } if btreeGetPage(tls, pBt, uint32(1), bp, 0) == SQLITE_OK { btreeSetNPage(tls, pBt, *(*uintptr)(unsafe.Pointer(bp))) releasePageOne(tls, *(*uintptr)(unsafe.Pointer(bp))) } (*BtShared)(unsafe.Pointer(pBt)).FinTransaction = U8(TRANS_READ) btreeClearHasContent(tls, pBt) } btreeEndTransaction(tls, p) Xsqlite3BtreeLeave(tls, p) return rc } // Start a statement subtransaction. The subtransaction can be rolled // back independently of the main transaction. You must start a transaction // before starting a subtransaction. The subtransaction is ended automatically // if the main transaction commits or rolls back. // // Statement subtransactions are used around individual SQL statements // that are contained within a BEGIN...COMMIT block. If a constraint // error occurs within the statement, the effect of that one statement // can be rolled back without having to rollback the entire transaction. // // A statement sub-transaction is implemented as an anonymous savepoint. The // value passed as the second parameter is the total number of savepoints, // including the new anonymous savepoint, open on the B-Tree. i.e. if there // are no active savepoints and no other statement-transactions open, // iStatement is 1. This anonymous savepoint can be released or rolled back // using the sqlite3BtreeSavepoint() function. func Xsqlite3BtreeBeginStmt(tls *libc.TLS, p uintptr, iStatement int32) int32 { var rc int32 var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) rc = Xsqlite3PagerOpenSavepoint(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, iStatement) Xsqlite3BtreeLeave(tls, p) return rc } // The second argument to this function, op, is always SAVEPOINT_ROLLBACK // or SAVEPOINT_RELEASE. This function either releases or rolls back the // savepoint identified by parameter iSavepoint, depending on the value // of op. // // Normally, iSavepoint is greater than or equal to zero. However, if op is // SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the // contents of the entire transaction are rolled back. This is different // from a normal transaction rollback, as no locks are released and the // transaction remains open. func Xsqlite3BtreeSavepoint(tls *libc.TLS, p uintptr, op int32, iSavepoint int32) int32 { var rc int32 = SQLITE_OK if p != 0 && int32((*Btree)(unsafe.Pointer(p)).FinTrans) == TRANS_WRITE { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) if op == SAVEPOINT_ROLLBACK { rc = saveAllCursors(tls, pBt, uint32(0), uintptr(0)) } if rc == SQLITE_OK { rc = Xsqlite3PagerSavepoint(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, op, iSavepoint) } if rc == SQLITE_OK { if iSavepoint < 0 && int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_INITIALLY_EMPTY != 0 { (*BtShared)(unsafe.Pointer(pBt)).FnPage = U32(0) } rc = newDatabase(tls, pBt) btreeSetNPage(tls, pBt, (*BtShared)(unsafe.Pointer(pBt)).FpPage1) } Xsqlite3BtreeLeave(tls, p) } return rc } func btreeCursor(tls *libc.TLS, p uintptr, iTable Pgno, wrFlag int32, pKeyInfo uintptr, pCur uintptr) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var pX uintptr if iTable <= Pgno(1) { if iTable < Pgno(1) { return Xsqlite3CorruptError(tls, 72982) } else if btreePagecount(tls, pBt) == Pgno(0) { iTable = Pgno(0) } } (*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot = iTable (*BtCursor)(unsafe.Pointer(pCur)).FiPage = int8(-1) (*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo = pKeyInfo (*BtCursor)(unsafe.Pointer(pCur)).FpBtree = p (*BtCursor)(unsafe.Pointer(pCur)).FpBt = pBt (*BtCursor)(unsafe.Pointer(pCur)).FcurFlags = U8(0) for pX = (*BtShared)(unsafe.Pointer(pBt)).FpCursor; pX != 0; pX = (*BtCursor)(unsafe.Pointer(pX)).FpNext { if (*BtCursor)(unsafe.Pointer(pX)).FpgnoRoot == iTable { *(*U8)(unsafe.Pointer(pX + 1)) |= U8(BTCF_Multiple) (*BtCursor)(unsafe.Pointer(pCur)).FcurFlags = U8(BTCF_Multiple) } } (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) (*BtCursor)(unsafe.Pointer(pCur)).FpNext = (*BtShared)(unsafe.Pointer(pBt)).FpCursor (*BtShared)(unsafe.Pointer(pBt)).FpCursor = pCur if wrFlag != 0 { *(*U8)(unsafe.Pointer(pCur + 1)) |= U8(BTCF_WriteFlag) (*BtCursor)(unsafe.Pointer(pCur)).FcurPagerFlags = U8(0) if (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace == uintptr(0) { return allocateTempSpace(tls, pBt) } } else { (*BtCursor)(unsafe.Pointer(pCur)).FcurPagerFlags = U8(PAGER_GET_READONLY) } return SQLITE_OK } func btreeCursorWithLock(tls *libc.TLS, p uintptr, iTable Pgno, wrFlag int32, pKeyInfo uintptr, pCur uintptr) int32 { var rc int32 Xsqlite3BtreeEnter(tls, p) rc = btreeCursor(tls, p, iTable, wrFlag, pKeyInfo, pCur) Xsqlite3BtreeLeave(tls, p) return rc } func Xsqlite3BtreeCursor(tls *libc.TLS, p uintptr, iTable Pgno, wrFlag int32, pKeyInfo uintptr, pCur uintptr) int32 { if (*Btree)(unsafe.Pointer(p)).Fsharable != 0 { return btreeCursorWithLock(tls, p, iTable, wrFlag, pKeyInfo, pCur) } else { return btreeCursor(tls, p, iTable, wrFlag, pKeyInfo, pCur) } return int32(0) } // Return the size of a BtCursor object in bytes. // // This interfaces is needed so that users of cursors can preallocate // sufficient storage to hold a cursor. The BtCursor object is opaque // to users so they cannot do the sizeof() themselves - they must call // this routine. func Xsqlite3BtreeCursorSize(tls *libc.TLS) int32 { return int32((uint64(unsafe.Sizeof(BtCursor{})) + uint64(7)) & libc.Uint64FromInt32(libc.CplInt32(7))) } // Initialize memory that will be converted into a BtCursor object. // // The simple approach here would be to memset() the entire object // to zero. But it turns out that the apPage[] and aiIdx[] arrays // do not need to be zeroed and they are large, so we can save a lot // of run-time by skipping the initialization of those elements. func Xsqlite3BtreeCursorZero(tls *libc.TLS, p uintptr) { libc.Xmemset(tls, p, 0, uint64(uintptr(0)+32)) } // Close a cursor. The read lock on the database file is released // when the last cursor is closed. func Xsqlite3BtreeCloseCursor(tls *libc.TLS, pCur uintptr) int32 { var pBtree uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpBtree if pBtree != 0 { var pBt uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpBt Xsqlite3BtreeEnter(tls, pBtree) if (*BtShared)(unsafe.Pointer(pBt)).FpCursor == pCur { (*BtShared)(unsafe.Pointer(pBt)).FpCursor = (*BtCursor)(unsafe.Pointer(pCur)).FpNext } else { var pPrev uintptr = (*BtShared)(unsafe.Pointer(pBt)).FpCursor for __ccgo := true; __ccgo; __ccgo = pPrev != 0 { if (*BtCursor)(unsafe.Pointer(pPrev)).FpNext == pCur { (*BtCursor)(unsafe.Pointer(pPrev)).FpNext = (*BtCursor)(unsafe.Pointer(pCur)).FpNext break } pPrev = (*BtCursor)(unsafe.Pointer(pPrev)).FpNext } } btreeReleaseAllCursorPages(tls, pCur) unlockBtreeIfUnused(tls, pBt) Xsqlite3_free(tls, (*BtCursor)(unsafe.Pointer(pCur)).FaOverflow) Xsqlite3_free(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpKey) if int32((*BtShared)(unsafe.Pointer(pBt)).FopenFlags)&BTREE_SINGLE != 0 && (*BtShared)(unsafe.Pointer(pBt)).FpCursor == uintptr(0) { Xsqlite3BtreeClose(tls, pBtree) } else { Xsqlite3BtreeLeave(tls, pBtree) } (*BtCursor)(unsafe.Pointer(pCur)).FpBtree = uintptr(0) } return SQLITE_OK } func getCellInfo(tls *libc.TLS, pCur uintptr) { if int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize) == 0 { *(*U8)(unsafe.Pointer(pCur + 1)) |= U8(BTCF_ValidNKey) btreeParseCell(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpPage, int32((*BtCursor)(unsafe.Pointer(pCur)).Fix), pCur+48) } else { } } func Xsqlite3BtreeCursorIsValidNN(tls *libc.TLS, pCur uintptr) int32 { return libc.Bool32(int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_VALID) } // Return the value of the integer key or "rowid" for a table btree. // This routine is only valid for a cursor that is pointing into a // ordinary table btree. If the cursor points to an index btree or // is invalid, the result of this routine is undefined. func Xsqlite3BtreeIntegerKey(tls *libc.TLS, pCur uintptr) I64 { getCellInfo(tls, pCur) return (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey } // Pin or unpin a cursor. func Xsqlite3BtreeCursorPin(tls *libc.TLS, pCur uintptr) { *(*U8)(unsafe.Pointer(pCur + 1)) |= U8(BTCF_Pinned) } func Xsqlite3BtreeCursorUnpin(tls *libc.TLS, pCur uintptr) { *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_Pinned)) } // Return the offset into the database file for the start of the // payload to which the cursor is pointing. func Xsqlite3BtreeOffset(tls *libc.TLS, pCur uintptr) I64 { getCellInfo(tls, pCur) return I64((*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FpageSize)*(I64((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).Fpgno)-int64(1)) + (int64((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload)-int64((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FaData))/1 } // Return the number of bytes of payload for the entry that pCur is // currently pointing to. For table btrees, this will be the amount // of data. For index btrees, this will be the size of the key. // // The caller must guarantee that the cursor is pointing to a non-NULL // valid entry. In other words, the calling procedure must guarantee // that the cursor has Cursor.eState==CURSOR_VALID. func Xsqlite3BtreePayloadSize(tls *libc.TLS, pCur uintptr) U32 { getCellInfo(tls, pCur) return (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnPayload } // Return an upper bound on the size of any record for the table // that the cursor is pointing into. // // This is an optimization. Everything will still work if this // routine always returns 2147483647 (which is the largest record // that SQLite can handle) or more. But returning a smaller value might // prevent large memory allocations when trying to interpret a // corrupt datrabase. // // The current implementation merely returns the size of the underlying // database file. func Xsqlite3BtreeMaxRecordSize(tls *libc.TLS, pCur uintptr) Sqlite3_int64 { return Sqlite3_int64((*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FpageSize) * Sqlite3_int64((*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FnPage) } func getOverflowPage(tls *libc.TLS, pBt uintptr, ovfl Pgno, ppPage uintptr, pPgnoNext uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var next Pgno = Pgno(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var rc int32 = SQLITE_OK if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { var iGuess Pgno = ovfl + Pgno(1) for ptrmapPageno(tls, pBt, iGuess) == iGuess || iGuess == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { iGuess++ } if iGuess <= btreePagecount(tls, pBt) { rc = ptrmapGet(tls, pBt, iGuess, bp, bp+4) if rc == SQLITE_OK && int32(*(*U8)(unsafe.Pointer(bp))) == PTRMAP_OVERFLOW2 && *(*Pgno)(unsafe.Pointer(bp + 4)) == ovfl { next = iGuess rc = SQLITE_DONE } } } if rc == SQLITE_OK { rc = btreeGetPage(tls, pBt, ovfl, bp+8, func() int32 { if ppPage == uintptr(0) { return PAGER_GET_READONLY } return 0 }()) if rc == SQLITE_OK { next = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData) } } *(*Pgno)(unsafe.Pointer(pPgnoNext)) = next if ppPage != 0 { *(*uintptr)(unsafe.Pointer(ppPage)) = *(*uintptr)(unsafe.Pointer(bp + 8)) } else { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } return func() int32 { if rc == SQLITE_DONE { return SQLITE_OK } return rc }() } func copyPayload(tls *libc.TLS, pPayload uintptr, pBuf uintptr, nByte int32, eOp int32, pDbPage uintptr) int32 { if eOp != 0 { var rc int32 = Xsqlite3PagerWrite(tls, pDbPage) if rc != SQLITE_OK { return rc } libc.Xmemcpy(tls, pPayload, pBuf, uint64(nByte)) } else { libc.Xmemcpy(tls, pBuf, pPayload, uint64(nByte)) } return SQLITE_OK } func accessPayload(tls *libc.TLS, pCur uintptr, offset U32, amt U32, pBuf uintptr, eOp int32) int32 { bp := tls.Alloc(16) defer tls.Free(16) var aPayload uintptr var rc int32 = SQLITE_OK var iIdx int32 = 0 var pPage uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpPage var pBt uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpBt if int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) { return Xsqlite3CorruptError(tls, 73389) } getCellInfo(tls, pCur) aPayload = (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload if Uptr((int64(aPayload)-int64((*MemPage)(unsafe.Pointer(pPage)).FaData))/1) > Uptr((*BtShared)(unsafe.Pointer(pBt)).FusableSize-U32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal)) { return Xsqlite3CorruptError(tls, 73404) } if offset < U32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) { var a int32 = int32(amt) if U32(a)+offset > U32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) { a = int32(U32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) - offset) } rc = copyPayload(tls, aPayload+uintptr(offset), pBuf, a, eOp, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) offset = U32(0) pBuf += uintptr(a) amt = amt - U32(a) } else { offset = offset - U32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) } if rc == SQLITE_OK && amt > U32(0) { var ovflSize U32 = (*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(4) *(*Pgno)(unsafe.Pointer(bp)) = Xsqlite3Get4byte(tls, aPayload+uintptr((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal)) if int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_ValidOvfl == 0 { var nOvfl int32 = int32(((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnPayload - U32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) + ovflSize - U32(1)) / ovflSize) if (*BtCursor)(unsafe.Pointer(pCur)).FaOverflow == uintptr(0) || nOvfl*int32(unsafe.Sizeof(Pgno(0))) > Xsqlite3MallocSize(tls, (*BtCursor)(unsafe.Pointer(pCur)).FaOverflow) { var aNew uintptr = Xsqlite3Realloc(tls, (*BtCursor)(unsafe.Pointer(pCur)).FaOverflow, uint64(nOvfl*2)*uint64(unsafe.Sizeof(Pgno(0)))) if aNew == uintptr(0) { return SQLITE_NOMEM } else { (*BtCursor)(unsafe.Pointer(pCur)).FaOverflow = aNew } } libc.Xmemset(tls, (*BtCursor)(unsafe.Pointer(pCur)).FaOverflow, 0, uint64(nOvfl)*uint64(unsafe.Sizeof(Pgno(0)))) *(*U8)(unsafe.Pointer(pCur + 1)) |= U8(BTCF_ValidOvfl) } else { if *(*Pgno)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FaOverflow + uintptr(offset/ovflSize)*4)) != 0 { iIdx = int32(offset / ovflSize) *(*Pgno)(unsafe.Pointer(bp)) = *(*Pgno)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FaOverflow + uintptr(iIdx)*4)) offset = offset % ovflSize } } for *(*Pgno)(unsafe.Pointer(bp)) != 0 { if *(*Pgno)(unsafe.Pointer(bp)) > (*BtShared)(unsafe.Pointer(pBt)).FnPage { return Xsqlite3CorruptError(tls, 73466) } *(*Pgno)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FaOverflow + uintptr(iIdx)*4)) = *(*Pgno)(unsafe.Pointer(bp)) if offset >= ovflSize { if *(*Pgno)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FaOverflow + uintptr(iIdx+1)*4)) != 0 { *(*Pgno)(unsafe.Pointer(bp)) = *(*Pgno)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FaOverflow + uintptr(iIdx+1)*4)) } else { rc = getOverflowPage(tls, pBt, *(*Pgno)(unsafe.Pointer(bp)), uintptr(0), bp) } offset = offset - ovflSize } else { var a int32 = int32(amt) if U32(a)+offset > ovflSize { a = int32(ovflSize - offset) } { rc = Xsqlite3PagerGet(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, *(*Pgno)(unsafe.Pointer(bp)), bp+8, func() int32 { if eOp == 0 { return PAGER_GET_READONLY } return 0 }()) if rc == SQLITE_OK { aPayload = Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) *(*Pgno)(unsafe.Pointer(bp)) = Xsqlite3Get4byte(tls, aPayload) rc = copyPayload(tls, aPayload+uintptr(offset+U32(4)), pBuf, a, eOp, *(*uintptr)(unsafe.Pointer(bp + 8))) Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) offset = U32(0) } } amt = amt - U32(a) if amt == U32(0) { return rc } pBuf += uintptr(a) } if rc != 0 { break } iIdx++ } } if rc == SQLITE_OK && amt > U32(0) { return Xsqlite3CorruptError(tls, 73551) } return rc } // Read part of the payload for the row at which that cursor pCur is currently // pointing. "amt" bytes will be transferred into pBuf[]. The transfer // begins at "offset". // // pCur can be pointing to either a table or an index b-tree. // If pointing to a table btree, then the content section is read. If // pCur is pointing to an index b-tree then the key section is read. // // For sqlite3BtreePayload(), the caller must ensure that pCur is pointing // to a valid row in the table. For sqlite3BtreePayloadChecked(), the // cursor might be invalid or might need to be restored before being read. // // Return SQLITE_OK on success or an error code if anything goes // wrong. An error is returned if "offset+amt" is larger than // the available payload. func Xsqlite3BtreePayload(tls *libc.TLS, pCur uintptr, offset U32, amt U32, pBuf uintptr) int32 { return accessPayload(tls, pCur, offset, amt, pBuf, 0) } func accessPayloadChecked(tls *libc.TLS, pCur uintptr, offset U32, amt U32, pBuf uintptr) int32 { var rc int32 if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_INVALID { return SQLITE_ABORT } rc = btreeRestoreCursorPosition(tls, pCur) if rc != 0 { return rc } return accessPayload(tls, pCur, offset, amt, pBuf, 0) } func Xsqlite3BtreePayloadChecked(tls *libc.TLS, pCur uintptr, offset U32, amt U32, pBuf uintptr) int32 { if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_VALID { return accessPayload(tls, pCur, offset, amt, pBuf, 0) } else { return accessPayloadChecked(tls, pCur, offset, amt, pBuf) } return int32(0) } func fetchPayload(tls *libc.TLS, pCur uintptr, pAmt uintptr) uintptr { var amt int32 amt = int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) if amt > int32((int64((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FaDataEnd)-int64((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload))/1) { amt = func() int32 { if 0 > int32((int64((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FaDataEnd)-int64((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload))/1) { return 0 } return int32((int64((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FaDataEnd) - int64((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload)) / 1) }() } *(*U32)(unsafe.Pointer(pAmt)) = U32(amt) return (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload } // For the entry that cursor pCur is point to, return as // many bytes of the key or data as are available on the local // b-tree page. Write the number of available bytes into *pAmt. // // The pointer returned is ephemeral. The key/data may move // or be destroyed on the next call to any Btree routine, // including calls from other threads against the same cache. // Hence, a mutex on the BtShared should be held prior to calling // this routine. // // These routines is used to get quick access to key and data // in the common case where no overflow pages are used. func Xsqlite3BtreePayloadFetch(tls *libc.TLS, pCur uintptr, pAmt uintptr) uintptr { return fetchPayload(tls, pCur, pAmt) } func moveToChild(tls *libc.TLS, pCur uintptr, newPgno U32) int32 { if int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) >= BTCURSOR_MAX_DEPTH-1 { return Xsqlite3CorruptError(tls, 73688) } (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidNKey | BTCF_ValidOvfl)) *(*U16)(unsafe.Pointer(pCur + 88 + uintptr((*BtCursor)(unsafe.Pointer(pCur)).FiPage)*2)) = (*BtCursor)(unsafe.Pointer(pCur)).Fix *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr((*BtCursor)(unsafe.Pointer(pCur)).FiPage)*8)) = (*BtCursor)(unsafe.Pointer(pCur)).FpPage (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(0) (*BtCursor)(unsafe.Pointer(pCur)).FiPage++ return getAndInitPage(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpBt, newPgno, pCur+136, pCur, int32((*BtCursor)(unsafe.Pointer(pCur)).FcurPagerFlags)) } func moveToParent(tls *libc.TLS, pCur uintptr) { var pLeaf uintptr (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidNKey | BTCF_ValidOvfl)) (*BtCursor)(unsafe.Pointer(pCur)).Fix = *(*U16)(unsafe.Pointer(pCur + 88 + uintptr(int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage)-1)*2)) pLeaf = (*BtCursor)(unsafe.Pointer(pCur)).FpPage (*BtCursor)(unsafe.Pointer(pCur)).FpPage = *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr(libc.PreDecInt8(&(*BtCursor)(unsafe.Pointer(pCur)).FiPage, 1))*8)) releasePageNotNull(tls, pLeaf) } func moveToRoot(tls *libc.TLS, pCur uintptr) int32 { var pRoot uintptr var rc int32 var subpage Pgno rc = SQLITE_OK if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) >= 0) { goto __1 } if !((*BtCursor)(unsafe.Pointer(pCur)).FiPage != 0) { goto __3 } releasePageNotNull(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpPage) __4: if !(libc.PreDecInt8(&(*BtCursor)(unsafe.Pointer(pCur)).FiPage, 1) != 0) { goto __5 } releasePageNotNull(tls, *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr((*BtCursor)(unsafe.Pointer(pCur)).FiPage)*8))) goto __4 __5: ; pRoot = libc.AssignPtrUintptr(pCur+136, *(*uintptr)(unsafe.Pointer(pCur + 144))) goto skip_init __3: ; goto __2 __1: if !((*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot == Pgno(0)) { goto __6 } (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) return SQLITE_EMPTY goto __7 __6: ; if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) >= CURSOR_REQUIRESEEK) { goto __8 } if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_FAULT) { goto __9 } return (*BtCursor)(unsafe.Pointer(pCur)).FskipNext __9: ; Xsqlite3BtreeClearCursor(tls, pCur) __8: ; rc = getAndInitPage(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpBt, (*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot, pCur+136, uintptr(0), int32((*BtCursor)(unsafe.Pointer(pCur)).FcurPagerFlags)) if !(rc != SQLITE_OK) { goto __10 } (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) return rc __10: ; (*BtCursor)(unsafe.Pointer(pCur)).FiPage = int8(0) (*BtCursor)(unsafe.Pointer(pCur)).FcurIntKey = (*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FintKey __7: ; __2: ; pRoot = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if !(int32((*MemPage)(unsafe.Pointer(pRoot)).FisInit) == 0 || libc.Bool32((*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo == uintptr(0)) != int32((*MemPage)(unsafe.Pointer(pRoot)).FintKey)) { goto __11 } return Xsqlite3CorruptError(tls, 73827) __11: ; skip_init: (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(0) (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_AtLast | BTCF_ValidNKey | BTCF_ValidOvfl)) if !(int32((*MemPage)(unsafe.Pointer(pRoot)).FnCell) > 0) { goto __12 } (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_VALID) goto __13 __12: if !!(int32((*MemPage)(unsafe.Pointer(pRoot)).Fleaf) != 0) { goto __14 } if !((*MemPage)(unsafe.Pointer(pRoot)).Fpgno != Pgno(1)) { goto __16 } return Xsqlite3CorruptError(tls, 73839) __16: ; subpage = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pRoot)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pRoot)).FhdrOffset)+8)) (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_VALID) rc = moveToChild(tls, pCur, subpage) goto __15 __14: (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) rc = SQLITE_EMPTY __15: ; __13: ; return rc } func moveToLeftmost(tls *libc.TLS, pCur uintptr) int32 { var pgno Pgno var rc int32 = SQLITE_OK var pPage uintptr for rc == SQLITE_OK && !(int32((*MemPage)(unsafe.Pointer(libc.AssignUintptr(&pPage, (*BtCursor)(unsafe.Pointer(pCur)).FpPage))).Fleaf) != 0) { pgno = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*int32((*BtCursor)(unsafe.Pointer(pCur)).Fix)))))))) rc = moveToChild(tls, pCur, pgno) } return rc } func moveToRightmost(tls *libc.TLS, pCur uintptr) int32 { var pgno Pgno var rc int32 = SQLITE_OK var pPage uintptr = uintptr(0) for !(int32((*MemPage)(unsafe.Pointer(libc.AssignUintptr(&pPage, (*BtCursor)(unsafe.Pointer(pCur)).FpPage))).Fleaf) != 0) { pgno = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8)) (*BtCursor)(unsafe.Pointer(pCur)).Fix = (*MemPage)(unsafe.Pointer(pPage)).FnCell rc = moveToChild(tls, pCur, pgno) if rc != 0 { return rc } } (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) - 1) return SQLITE_OK } // Move the cursor to the first entry in the table. Return SQLITE_OK // on success. Set *pRes to 0 if the cursor actually points to something // or set *pRes to 1 if the table is empty. func Xsqlite3BtreeFirst(tls *libc.TLS, pCur uintptr, pRes uintptr) int32 { var rc int32 rc = moveToRoot(tls, pCur) if rc == SQLITE_OK { *(*int32)(unsafe.Pointer(pRes)) = 0 rc = moveToLeftmost(tls, pCur) } else if rc == SQLITE_EMPTY { *(*int32)(unsafe.Pointer(pRes)) = 1 rc = SQLITE_OK } return rc } func btreeLast(tls *libc.TLS, pCur uintptr, pRes uintptr) int32 { var rc int32 = moveToRoot(tls, pCur) if rc == SQLITE_OK { *(*int32)(unsafe.Pointer(pRes)) = 0 rc = moveToRightmost(tls, pCur) if rc == SQLITE_OK { *(*U8)(unsafe.Pointer(pCur + 1)) |= U8(BTCF_AtLast) } else { *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_AtLast)) } } else if rc == SQLITE_EMPTY { *(*int32)(unsafe.Pointer(pRes)) = 1 rc = SQLITE_OK } return rc } func Xsqlite3BtreeLast(tls *libc.TLS, pCur uintptr, pRes uintptr) int32 { if CURSOR_VALID == int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) && int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_AtLast != 0 { *(*int32)(unsafe.Pointer(pRes)) = 0 return SQLITE_OK } return btreeLast(tls, pCur, pRes) } // Move the cursor so that it points to an entry in a table (a.k.a INTKEY) // table near the key intKey. Return a success code. // // If an exact match is not found, then the cursor is always // left pointing at a leaf page which would hold the entry if it // were present. The cursor might point to an entry that comes // before or after the key. // // An integer is written into *pRes which is the result of // comparing the key with the entry to which the cursor is // pointing. The meaning of the integer written into // *pRes is as follows: // // *pRes<0 The cursor is left pointing at an entry that // is smaller than intKey or if the table is empty // and the cursor is therefore left point to nothing. // // *pRes==0 The cursor is left pointing at an entry that // exactly matches intKey. // // *pRes>0 The cursor is left pointing at an entry that // is larger than intKey. func Xsqlite3BtreeTableMoveto(tls *libc.TLS, pCur uintptr, intKey I64, biasRight int32, pRes uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var lwr int32 var upr int32 var idx int32 var c int32 var chldPg Pgno var pPage uintptr var pCell uintptr if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_VALID && int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_ValidNKey != 0) { goto __1 } if !((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey == intKey) { goto __2 } *(*int32)(unsafe.Pointer(pRes)) = 0 return SQLITE_OK __2: ; if !((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey < intKey) { goto __3 } if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_AtLast != 0) { goto __4 } *(*int32)(unsafe.Pointer(pRes)) = -1 return SQLITE_OK __4: ; if !((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey+int64(1) == intKey) { goto __5 } *(*int32)(unsafe.Pointer(pRes)) = 0 rc = Xsqlite3BtreeNext(tls, pCur, 0) if !(rc == SQLITE_OK) { goto __6 } getCellInfo(tls, pCur) if !((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey == intKey) { goto __8 } return SQLITE_OK __8: ; goto __7 __6: if !(rc != SQLITE_DONE) { goto __9 } return rc __9: ; __7: ; __5: ; __3: ; __1: ; rc = moveToRoot(tls, pCur) if !(rc != 0) { goto __10 } if !(rc == SQLITE_EMPTY) { goto __11 } *(*int32)(unsafe.Pointer(pRes)) = -1 return SQLITE_OK __11: ; return rc __10: ; __12: pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage lwr = 0 upr = int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) - 1 idx = upr >> (1 - biasRight) __15: pCell = (*MemPage)(unsafe.Pointer(pPage)).FaDataOfst + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*idx)))))) if !((*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf != 0) { goto __18 } __19: if !(0x80 <= int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pCell, 1))))) { goto __20 } if !(pCell >= (*MemPage)(unsafe.Pointer(pPage)).FaDataEnd) { goto __21 } return Xsqlite3CorruptError(tls, 74081) __21: ; goto __19 __20: ; __18: ; Xsqlite3GetVarint(tls, pCell, bp) if !(*(*I64)(unsafe.Pointer(bp)) < intKey) { goto __22 } lwr = idx + 1 if !(lwr > upr) { goto __24 } c = -1 goto __17 __24: ; goto __23 __22: if !(*(*I64)(unsafe.Pointer(bp)) > intKey) { goto __25 } upr = idx - 1 if !(lwr > upr) { goto __27 } c = +1 goto __17 __27: ; goto __26 __25: ; (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(idx) if !!(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { goto __28 } lwr = idx goto moveto_table_next_layer goto __29 __28: *(*U8)(unsafe.Pointer(pCur + 1)) |= U8(BTCF_ValidNKey) (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey = *(*I64)(unsafe.Pointer(bp)) (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) *(*int32)(unsafe.Pointer(pRes)) = 0 return SQLITE_OK __29: ; __26: ; __23: ; idx = (lwr + upr) >> 1 goto __16 __16: goto __15 goto __17 __17: ; if !((*MemPage)(unsafe.Pointer(pPage)).Fleaf != 0) { goto __30 } (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(idx) *(*int32)(unsafe.Pointer(pRes)) = c rc = SQLITE_OK goto moveto_table_finish __30: ; moveto_table_next_layer: if !(lwr >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell)) { goto __31 } chldPg = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8)) goto __32 __31: chldPg = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*lwr))))))) __32: ; (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(lwr) rc = moveToChild(tls, pCur, chldPg) if !(rc != 0) { goto __33 } goto __14 __33: ; goto __13 __13: goto __12 goto __14 __14: ; moveto_table_finish: (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) return rc } func indexCellCompare(tls *libc.TLS, pCur uintptr, idx int32, pIdxKey uintptr, xRecordCompare RecordCompare) int32 { var pPage uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpPage var c int32 var nCell int32 var pCell uintptr = (*MemPage)(unsafe.Pointer(pPage)).FaDataOfst + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*idx)))))) nCell = int32(*(*U8)(unsafe.Pointer(pCell))) if nCell <= int32((*MemPage)(unsafe.Pointer(pPage)).Fmax1bytePayload) { c = (*struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xRecordCompare})).f(tls, nCell, pCell+1, pIdxKey) } else if !(int32(*(*U8)(unsafe.Pointer(pCell + 1)))&0x80 != 0) && libc.AssignInt32(&nCell, nCell&0x7f<<7+int32(*(*U8)(unsafe.Pointer(pCell + 1)))) <= int32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { c = (*struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xRecordCompare})).f(tls, nCell, pCell+2, pIdxKey) } else { c = 99 } return c } func cursorOnLastPage(tls *libc.TLS, pCur uintptr) int32 { var i int32 for i = 0; i < int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage); i++ { var pPage uintptr = *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr(i)*8)) if int32(*(*U16)(unsafe.Pointer(pCur + 88 + uintptr(i)*2))) < int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) { return 0 } } return 1 } // Move the cursor so that it points to an entry in an index table // near the key pIdxKey. Return a success code. // // If an exact match is not found, then the cursor is always // left pointing at a leaf page which would hold the entry if it // were present. The cursor might point to an entry that comes // before or after the key. // // An integer is written into *pRes which is the result of // comparing the key with the entry to which the cursor is // pointing. The meaning of the integer written into // *pRes is as follows: // // *pRes<0 The cursor is left pointing at an entry that // is smaller than pIdxKey or if the table is empty // and the cursor is therefore left point to nothing. // // *pRes==0 The cursor is left pointing at an entry that // exactly matches pIdxKey. // // *pRes>0 The cursor is left pointing at an entry that // is larger than pIdxKey. // // The pIdxKey->eqSeen field is set to 1 if there // exists an entry in the table that exactly matches pIdxKey. func Xsqlite3BtreeIndexMoveto(tls *libc.TLS, pCur uintptr, pIdxKey uintptr, pRes uintptr) int32 { var rc int32 var xRecordCompare RecordCompare var c int32 var pCellKey uintptr var pCellBody uintptr var nOverrun int32 var nCell int32 var lwr int32 var upr int32 var idx int32 var c1 int32 var chldPg Pgno var pPage uintptr var pCell uintptr xRecordCompare = Xsqlite3VdbeFindCompare(tls, pIdxKey) (*UnpackedRecord)(unsafe.Pointer(pIdxKey)).FerrCode = U8(0) if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_VALID && (*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).Fleaf != 0 && cursorOnLastPage(tls, pCur) != 0) { goto __1 } if !(int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) == int32((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FnCell)-1 && libc.AssignInt32(&c, indexCellCompare(tls, pCur, int32((*BtCursor)(unsafe.Pointer(pCur)).Fix), pIdxKey, xRecordCompare)) <= 0 && int32((*UnpackedRecord)(unsafe.Pointer(pIdxKey)).FerrCode) == SQLITE_OK) { goto __2 } *(*int32)(unsafe.Pointer(pRes)) = c return SQLITE_OK __2: ; if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) > 0 && indexCellCompare(tls, pCur, 0, pIdxKey, xRecordCompare) <= 0 && int32((*UnpackedRecord)(unsafe.Pointer(pIdxKey)).FerrCode) == SQLITE_OK) { goto __3 } *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidOvfl)) if !!(int32((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FisInit) != 0) { goto __4 } return Xsqlite3CorruptError(tls, 74277) __4: ; goto bypass_moveto_root __3: ; (*UnpackedRecord)(unsafe.Pointer(pIdxKey)).FerrCode = U8(SQLITE_OK) __1: ; rc = moveToRoot(tls, pCur) if !(rc != 0) { goto __5 } if !(rc == SQLITE_EMPTY) { goto __6 } *(*int32)(unsafe.Pointer(pRes)) = -1 return SQLITE_OK __6: ; return rc __5: ; bypass_moveto_root: ; __7: pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage lwr = 0 upr = int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) - 1 idx = upr >> 1 __10: pCell = (*MemPage)(unsafe.Pointer(pPage)).FaDataOfst + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*idx)))))) nCell = int32(*(*U8)(unsafe.Pointer(pCell))) if !(nCell <= int32((*MemPage)(unsafe.Pointer(pPage)).Fmax1bytePayload)) { goto __13 } c1 = (*struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xRecordCompare})).f(tls, nCell, pCell+1, pIdxKey) goto __14 __13: if !(!(int32(*(*U8)(unsafe.Pointer(pCell + 1)))&0x80 != 0) && libc.AssignInt32(&nCell, nCell&0x7f<<7+int32(*(*U8)(unsafe.Pointer(pCell + 1)))) <= int32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal)) { goto __15 } c1 = (*struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xRecordCompare})).f(tls, nCell, pCell+2, pIdxKey) goto __16 __15: pCellBody = pCell - uintptr((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) nOverrun = 18 (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxParseCell})).f(tls, pPage, pCellBody, pCur+48) nCell = int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey) if !(nCell < 2 || U32(nCell)/(*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FusableSize > (*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FnPage) { goto __17 } rc = Xsqlite3CorruptError(tls, 74364) goto moveto_index_finish __17: ; pCellKey = Xsqlite3Malloc(tls, uint64(nCell+nOverrun)) if !(pCellKey == uintptr(0)) { goto __18 } rc = SQLITE_NOMEM goto moveto_index_finish __18: ; (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(idx) rc = accessPayload(tls, pCur, uint32(0), uint32(nCell), pCellKey, 0) libc.Xmemset(tls, pCellKey+uintptr(nCell), 0, uint64(nOverrun)) *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidOvfl)) if !(rc != 0) { goto __19 } Xsqlite3_free(tls, pCellKey) goto moveto_index_finish __19: ; c1 = Xsqlite3VdbeRecordCompare(tls, nCell, pCellKey, pIdxKey) Xsqlite3_free(tls, pCellKey) __16: ; __14: ; if !(c1 < 0) { goto __20 } lwr = idx + 1 goto __21 __20: if !(c1 > 0) { goto __22 } upr = idx - 1 goto __23 __22: ; *(*int32)(unsafe.Pointer(pRes)) = 0 rc = SQLITE_OK (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(idx) if !((*UnpackedRecord)(unsafe.Pointer(pIdxKey)).FerrCode != 0) { goto __24 } rc = Xsqlite3CorruptError(tls, 74396) __24: ; goto moveto_index_finish __23: ; __21: ; if !(lwr > upr) { goto __25 } goto __12 __25: ; idx = (lwr + upr) >> 1 goto __11 __11: goto __10 goto __12 __12: ; if !((*MemPage)(unsafe.Pointer(pPage)).Fleaf != 0) { goto __26 } (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(idx) *(*int32)(unsafe.Pointer(pRes)) = c1 rc = SQLITE_OK goto moveto_index_finish __26: ; if !(lwr >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell)) { goto __27 } chldPg = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8)) goto __28 __27: chldPg = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*lwr))))))) __28: ; (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(lwr) rc = moveToChild(tls, pCur, chldPg) if !(rc != 0) { goto __29 } goto __9 __29: ; goto __8 __8: goto __7 goto __9 __9: ; moveto_index_finish: (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) return rc } // Return TRUE if the cursor is not pointing at an entry of the table. // // TRUE will be returned after a call to sqlite3BtreeNext() moves // past the last entry in the table or sqlite3BtreePrev() moves past // the first entry. TRUE is also returned if the table is empty. func Xsqlite3BtreeEof(tls *libc.TLS, pCur uintptr) int32 { return libc.Bool32(CURSOR_VALID != int32((*BtCursor)(unsafe.Pointer(pCur)).FeState)) } // Return an estimate for the number of rows in the table that pCur is // pointing to. Return a negative number if no estimate is currently // available. func Xsqlite3BtreeRowCountEst(tls *libc.TLS, pCur uintptr) I64 { var n I64 var i U8 if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID { return int64(-1) } if int32((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).Fleaf) == 0 { return int64(-1) } n = I64((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FnCell) for i = U8(0); int32(i) < int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage); i++ { n = n * I64((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr(i)*8)))).FnCell) } return n } func btreeNext(tls *libc.TLS, pCur uintptr) int32 { var rc int32 var idx int32 var pPage uintptr if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID { rc = func() int32 { if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) >= CURSOR_REQUIRESEEK { return btreeRestoreCursorPosition(tls, pCur) } return SQLITE_OK }() if rc != SQLITE_OK { return rc } if CURSOR_INVALID == int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) { return SQLITE_DONE } if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) == CURSOR_SKIPNEXT { (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_VALID) if (*BtCursor)(unsafe.Pointer(pCur)).FskipNext > 0 { return SQLITE_OK } } } pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage idx = int32(libc.PreIncUint16(&(*BtCursor)(unsafe.Pointer(pCur)).Fix, 1)) if !(int32((*MemPage)(unsafe.Pointer(pPage)).FisInit) != 0) || Xsqlite3FaultSim(tls, 412) != 0 { return Xsqlite3CorruptError(tls, 74512) } if idx >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) { if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { rc = moveToChild(tls, pCur, Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8))) if rc != 0 { return rc } return moveToLeftmost(tls, pCur) } for __ccgo := true; __ccgo; __ccgo = int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) { if int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) == 0 { (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) return SQLITE_DONE } moveToParent(tls, pCur) pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage } if (*MemPage)(unsafe.Pointer(pPage)).FintKey != 0 { return Xsqlite3BtreeNext(tls, pCur, 0) } else { return SQLITE_OK } } if (*MemPage)(unsafe.Pointer(pPage)).Fleaf != 0 { return SQLITE_OK } else { return moveToLeftmost(tls, pCur) } return int32(0) } func Xsqlite3BtreeNext(tls *libc.TLS, pCur uintptr, flags int32) int32 { var pPage uintptr _ = flags (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidNKey | BTCF_ValidOvfl)) if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID { return btreeNext(tls, pCur) } pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if int32(libc.PreIncUint16(&(*BtCursor)(unsafe.Pointer(pCur)).Fix, 1)) >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) { (*BtCursor)(unsafe.Pointer(pCur)).Fix-- return btreeNext(tls, pCur) } if (*MemPage)(unsafe.Pointer(pPage)).Fleaf != 0 { return SQLITE_OK } else { return moveToLeftmost(tls, pCur) } return int32(0) } func btreePrevious(tls *libc.TLS, pCur uintptr) int32 { var rc int32 var pPage uintptr if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID { rc = func() int32 { if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) >= CURSOR_REQUIRESEEK { return btreeRestoreCursorPosition(tls, pCur) } return SQLITE_OK }() if rc != SQLITE_OK { return rc } if CURSOR_INVALID == int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) { return SQLITE_DONE } if CURSOR_SKIPNEXT == int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) { (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_VALID) if (*BtCursor)(unsafe.Pointer(pCur)).FskipNext < 0 { return SQLITE_OK } } } pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { var idx int32 = int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) rc = moveToChild(tls, pCur, Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*idx)))))))) if rc != 0 { return rc } rc = moveToRightmost(tls, pCur) } else { for int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) == 0 { if int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) == 0 { (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) return SQLITE_DONE } moveToParent(tls, pCur) } (*BtCursor)(unsafe.Pointer(pCur)).Fix-- pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if (*MemPage)(unsafe.Pointer(pPage)).FintKey != 0 && !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { rc = Xsqlite3BtreePrevious(tls, pCur, 0) } else { rc = SQLITE_OK } } return rc } func Xsqlite3BtreePrevious(tls *libc.TLS, pCur uintptr, flags int32) int32 { _ = flags *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_AtLast | BTCF_ValidOvfl | BTCF_ValidNKey)) (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID || int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) == 0 || int32((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).Fleaf) == 0 { return btreePrevious(tls, pCur) } (*BtCursor)(unsafe.Pointer(pCur)).Fix-- return SQLITE_OK } func allocateBtreePage(tls *libc.TLS, pBt uintptr, ppPage uintptr, pPgno uintptr, nearby Pgno, eMode U8) int32 { bp := tls.Alloc(32) defer tls.Free(32) var pPage1 uintptr var rc int32 var n U32 var k U32 var pPrevTrunk uintptr var mxPage Pgno var iNewTrunk Pgno var d2 int32 var dist int32 var i U32 var noContent int32 var closest U32 var iPage Pgno var aData uintptr var iTrunk Pgno var searchList U8 var nSearch U32 var bNoContent int32 *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) pPrevTrunk = uintptr(0) pPage1 = (*BtShared)(unsafe.Pointer(pBt)).FpPage1 mxPage = btreePagecount(tls, pBt) n = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+36) if !(n >= mxPage) { goto __1 } return Xsqlite3CorruptError(tls, 74692) __1: ; if !(n > U32(0)) { goto __2 } searchList = U8(0) nSearch = U32(0) if !(int32(eMode) == BTALLOC_EXACT) { goto __4 } if !(nearby <= mxPage) { goto __6 } rc = ptrmapGet(tls, pBt, nearby, bp, uintptr(0)) if !(rc != 0) { goto __7 } return rc __7: ; if !(int32(*(*U8)(unsafe.Pointer(bp))) == PTRMAP_FREEPAGE) { goto __8 } searchList = U8(1) __8: ; __6: ; goto __5 __4: if !(int32(eMode) == BTALLOC_LE) { goto __9 } searchList = U8(1) __9: ; __5: ; rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage1)).FpDbPage) if !(rc != 0) { goto __10 } return rc __10: ; Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+36, n-U32(1)) __11: pPrevTrunk = *(*uintptr)(unsafe.Pointer(bp + 8)) if !(pPrevTrunk != 0) { goto __14 } iTrunk = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPrevTrunk)).FaData) goto __15 __14: iTrunk = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+32) __15: ; if !(iTrunk > mxPage || libc.PostIncUint32(&nSearch, 1) > n) { goto __16 } rc = Xsqlite3CorruptError(tls, 74748) goto __17 __16: rc = btreeGetUnusedPage(tls, pBt, iTrunk, bp+8, 0) __17: ; if !(rc != 0) { goto __18 } *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) goto end_allocate_page __18: ; k = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData+4) if !(k == U32(0) && !(searchList != 0)) { goto __19 } rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpDbPage) if !(rc != 0) { goto __21 } goto end_allocate_page __21: ; *(*Pgno)(unsafe.Pointer(pPgno)) = iTrunk libc.Xmemcpy(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+32, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData, uint64(4)) *(*uintptr)(unsafe.Pointer(ppPage)) = *(*uintptr)(unsafe.Pointer(bp + 8)) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) goto __20 __19: if !(k > (*BtShared)(unsafe.Pointer(pBt)).FusableSize/U32(4)-U32(2)) { goto __22 } rc = Xsqlite3CorruptError(tls, 74777) goto end_allocate_page goto __23 __22: if !(searchList != 0 && (nearby == iTrunk || iTrunk < nearby && int32(eMode) == BTALLOC_LE)) { goto __24 } *(*Pgno)(unsafe.Pointer(pPgno)) = iTrunk *(*uintptr)(unsafe.Pointer(ppPage)) = *(*uintptr)(unsafe.Pointer(bp + 8)) searchList = U8(0) rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpDbPage) if !(rc != 0) { goto __26 } goto end_allocate_page __26: ; if !(k == U32(0)) { goto __27 } if !!(pPrevTrunk != 0) { goto __29 } libc.Xmemcpy(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+32, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData, uint64(4)) goto __30 __29: rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPrevTrunk)).FpDbPage) if !(rc != SQLITE_OK) { goto __31 } goto end_allocate_page __31: ; libc.Xmemcpy(tls, (*MemPage)(unsafe.Pointer(pPrevTrunk)).FaData, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData, uint64(4)) __30: ; goto __28 __27: iNewTrunk = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData+8) if !(iNewTrunk > mxPage) { goto __32 } rc = Xsqlite3CorruptError(tls, 74811) goto end_allocate_page __32: ; rc = btreeGetUnusedPage(tls, pBt, iNewTrunk, bp+16, 0) if !(rc != SQLITE_OK) { goto __33 } goto end_allocate_page __33: ; rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FpDbPage) if !(rc != SQLITE_OK) { goto __34 } releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) goto end_allocate_page __34: ; libc.Xmemcpy(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaData, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData, uint64(4)) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaData+4, k-U32(1)) libc.Xmemcpy(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaData+8, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData+12, uint64((k-U32(1))*U32(4))) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if !!(pPrevTrunk != 0) { goto __35 } Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+32, iNewTrunk) goto __36 __35: rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPrevTrunk)).FpDbPage) if !(rc != 0) { goto __37 } goto end_allocate_page __37: ; Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPrevTrunk)).FaData, iNewTrunk) __36: ; __28: ; *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) goto __25 __24: if !(k > U32(0)) { goto __38 } aData = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FaData if !(nearby > Pgno(0)) { goto __39 } closest = U32(0) if !(int32(eMode) == BTALLOC_LE) { goto __41 } i = U32(0) __43: if !(i < k) { goto __45 } iPage = Xsqlite3Get4byte(tls, aData+uintptr(U32(8)+i*U32(4))) if !(iPage <= nearby) { goto __46 } closest = i goto __45 __46: ; goto __44 __44: i++ goto __43 goto __45 __45: ; goto __42 __41: dist = Xsqlite3AbsInt32(tls, int32(Xsqlite3Get4byte(tls, aData+8)-nearby)) i = U32(1) __47: if !(i < k) { goto __49 } d2 = Xsqlite3AbsInt32(tls, int32(Xsqlite3Get4byte(tls, aData+uintptr(U32(8)+i*U32(4)))-nearby)) if !(d2 < dist) { goto __50 } closest = i dist = d2 __50: ; goto __48 __48: i++ goto __47 goto __49 __49: ; __42: ; goto __40 __39: closest = U32(0) __40: ; iPage = Xsqlite3Get4byte(tls, aData+uintptr(U32(8)+closest*U32(4))) if !(iPage > mxPage || iPage < Pgno(2)) { goto __51 } rc = Xsqlite3CorruptError(tls, 74876) goto end_allocate_page __51: ; if !(!(searchList != 0) || (iPage == nearby || iPage < nearby && int32(eMode) == BTALLOC_LE)) { goto __52 } *(*Pgno)(unsafe.Pointer(pPgno)) = iPage rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpDbPage) if !(rc != 0) { goto __53 } goto end_allocate_page __53: ; if !(closest < k-U32(1)) { goto __54 } libc.Xmemcpy(tls, aData+uintptr(U32(8)+closest*U32(4)), aData+uintptr(U32(4)+k*U32(4)), uint64(4)) __54: ; Xsqlite3Put4byte(tls, aData+4, k-U32(1)) if !(btreeGetHasContent(tls, pBt, *(*Pgno)(unsafe.Pointer(pPgno))) != 0) { noContent = PAGER_GET_NOCONTENT } else { noContent = 0 } rc = btreeGetUnusedPage(tls, pBt, *(*Pgno)(unsafe.Pointer(pPgno)), ppPage, noContent) if !(rc == SQLITE_OK) { goto __55 } rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppPage)))).FpDbPage) if !(rc != SQLITE_OK) { goto __56 } releasePage(tls, *(*uintptr)(unsafe.Pointer(ppPage))) *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) __56: ; __55: ; searchList = U8(0) __52: ; __38: ; __25: ; __23: ; __20: ; releasePage(tls, pPrevTrunk) pPrevTrunk = uintptr(0) goto __12 __12: if searchList != 0 { goto __11 } goto __13 __13: ; goto __3 __2: if 0 == int32((*BtShared)(unsafe.Pointer(pBt)).FbDoTruncate) { bNoContent = PAGER_GET_NOCONTENT } else { bNoContent = 0 } rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FpDbPage) if !(rc != 0) { goto __57 } return rc __57: ; (*BtShared)(unsafe.Pointer(pBt)).FnPage++ if !((*BtShared)(unsafe.Pointer(pBt)).FnPage == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1)) { goto __58 } (*BtShared)(unsafe.Pointer(pBt)).FnPage++ __58: ; if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 && ptrmapPageno(tls, pBt, (*BtShared)(unsafe.Pointer(pBt)).FnPage) == (*BtShared)(unsafe.Pointer(pBt)).FnPage) { goto __59 } *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) rc = btreeGetUnusedPage(tls, pBt, (*BtShared)(unsafe.Pointer(pBt)).FnPage, bp+24, bNoContent) if !(rc == SQLITE_OK) { goto __60 } rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).FpDbPage) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) __60: ; if !(rc != 0) { goto __61 } return rc __61: ; (*BtShared)(unsafe.Pointer(pBt)).FnPage++ if !((*BtShared)(unsafe.Pointer(pBt)).FnPage == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1)) { goto __62 } (*BtShared)(unsafe.Pointer(pBt)).FnPage++ __62: ; __59: ; Xsqlite3Put4byte(tls, uintptr(28)+(*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData, (*BtShared)(unsafe.Pointer(pBt)).FnPage) *(*Pgno)(unsafe.Pointer(pPgno)) = (*BtShared)(unsafe.Pointer(pBt)).FnPage rc = btreeGetUnusedPage(tls, pBt, *(*Pgno)(unsafe.Pointer(pPgno)), ppPage, bNoContent) if !(rc != 0) { goto __63 } return rc __63: ; rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppPage)))).FpDbPage) if !(rc != SQLITE_OK) { goto __64 } releasePage(tls, *(*uintptr)(unsafe.Pointer(ppPage))) *(*uintptr)(unsafe.Pointer(ppPage)) = uintptr(0) __64: ; __3: ; end_allocate_page: releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) releasePage(tls, pPrevTrunk) return rc } func freePage2(tls *libc.TLS, pBt uintptr, pMemPage uintptr, iPage Pgno) int32 { bp := tls.Alloc(24) defer tls.Free(24) var iTrunk Pgno var pPage1 uintptr var nFree U32 var nLeaf U32 *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) iTrunk = Pgno(0) pPage1 = (*BtShared)(unsafe.Pointer(pBt)).FpPage1 if !(iPage < Pgno(2) || iPage > (*BtShared)(unsafe.Pointer(pBt)).FnPage) { goto __1 } return Xsqlite3CorruptError(tls, 75003) __1: ; if !(pMemPage != 0) { goto __2 } *(*uintptr)(unsafe.Pointer(bp)) = pMemPage Xsqlite3PagerRef(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) goto __3 __2: *(*uintptr)(unsafe.Pointer(bp)) = btreePageLookup(tls, pBt, iPage) __3: ; *(*int32)(unsafe.Pointer(bp + 8)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage1)).FpDbPage) if !(*(*int32)(unsafe.Pointer(bp + 8)) != 0) { goto __4 } goto freepage_out __4: ; nFree = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+36) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+36, nFree+U32(1)) if !(int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_SECURE_DELETE != 0) { goto __5 } if !(!(*(*uintptr)(unsafe.Pointer(bp)) != 0) && libc.AssignPtrInt32(bp+8, btreeGetPage(tls, pBt, iPage, bp, 0)) != 0 || libc.AssignPtrInt32(bp+8, Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage)) != 0) { goto __6 } goto freepage_out __6: ; libc.Xmemset(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData, 0, uint64((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpBt)).FpageSize)) __5: ; if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0) { goto __7 } ptrmapPut(tls, pBt, iPage, uint8(PTRMAP_FREEPAGE), uint32(0), bp+8) if !(*(*int32)(unsafe.Pointer(bp + 8)) != 0) { goto __8 } goto freepage_out __8: ; __7: ; if !(nFree != U32(0)) { goto __9 } iTrunk = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+32) if !(iTrunk > btreePagecount(tls, pBt)) { goto __10 } *(*int32)(unsafe.Pointer(bp + 8)) = Xsqlite3CorruptError(tls, 75050) goto freepage_out __10: ; *(*int32)(unsafe.Pointer(bp + 8)) = btreeGetPage(tls, pBt, iTrunk, bp+16, 0) if !(*(*int32)(unsafe.Pointer(bp + 8)) != SQLITE_OK) { goto __11 } goto freepage_out __11: ; nLeaf = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaData+4) if !(nLeaf > (*BtShared)(unsafe.Pointer(pBt)).FusableSize/U32(4)-U32(2)) { goto __12 } *(*int32)(unsafe.Pointer(bp + 8)) = Xsqlite3CorruptError(tls, 75061) goto freepage_out __12: ; if !(nLeaf < (*BtShared)(unsafe.Pointer(pBt)).FusableSize/U32(4)-U32(8)) { goto __13 } *(*int32)(unsafe.Pointer(bp + 8)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FpDbPage) if !(*(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK) { goto __14 } Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaData+4, nLeaf+U32(1)) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaData+uintptr(U32(8)+nLeaf*U32(4)), iPage) if !(*(*uintptr)(unsafe.Pointer(bp)) != 0 && int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_SECURE_DELETE == 0) { goto __15 } Xsqlite3PagerDontWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) __15: ; *(*int32)(unsafe.Pointer(bp + 8)) = btreeSetHasContent(tls, pBt, iPage) __14: ; goto freepage_out __13: ; __9: ; if !(*(*uintptr)(unsafe.Pointer(bp)) == uintptr(0) && SQLITE_OK != libc.AssignPtrInt32(bp+8, btreeGetPage(tls, pBt, iPage, bp, 0))) { goto __16 } goto freepage_out __16: ; *(*int32)(unsafe.Pointer(bp + 8)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) if !(*(*int32)(unsafe.Pointer(bp + 8)) != SQLITE_OK) { goto __17 } goto freepage_out __17: ; Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData, iTrunk) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData+4, uint32(0)) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pPage1)).FaData+32, iPage) freepage_out: if !(*(*uintptr)(unsafe.Pointer(bp)) != 0) { goto __18 } (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FisInit = U8(0) __18: ; releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) return *(*int32)(unsafe.Pointer(bp + 8)) } func freePage(tls *libc.TLS, pPage uintptr, pRC uintptr) { if *(*int32)(unsafe.Pointer(pRC)) == SQLITE_OK { *(*int32)(unsafe.Pointer(pRC)) = freePage2(tls, (*MemPage)(unsafe.Pointer(pPage)).FpBt, pPage, (*MemPage)(unsafe.Pointer(pPage)).Fpgno) } } func clearCellOverflow(tls *libc.TLS, pPage uintptr, pCell uintptr, pInfo uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var pBt uintptr var ovflPgno Pgno var rc int32 var nOvfl int32 var ovflPageSize U32 if pCell+uintptr((*CellInfo)(unsafe.Pointer(pInfo)).FnSize) > (*MemPage)(unsafe.Pointer(pPage)).FaDataEnd { return Xsqlite3CorruptError(tls, 75150) } ovflPgno = Xsqlite3Get4byte(tls, pCell+uintptr((*CellInfo)(unsafe.Pointer(pInfo)).FnSize)-uintptr(4)) pBt = (*MemPage)(unsafe.Pointer(pPage)).FpBt ovflPageSize = (*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(4) nOvfl = int32(((*CellInfo)(unsafe.Pointer(pInfo)).FnPayload - U32((*CellInfo)(unsafe.Pointer(pInfo)).FnLocal) + ovflPageSize - U32(1)) / ovflPageSize) for libc.PostDecInt32(&nOvfl, 1) != 0 { *(*Pgno)(unsafe.Pointer(bp + 8)) = Pgno(0) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) if ovflPgno < Pgno(2) || ovflPgno > btreePagecount(tls, pBt) { return Xsqlite3CorruptError(tls, 75167) } if nOvfl != 0 { rc = getOverflowPage(tls, pBt, ovflPgno, bp, bp+8) if rc != 0 { return rc } } if (*(*uintptr)(unsafe.Pointer(bp)) != 0 || libc.AssignPtrUintptr(bp, btreePageLookup(tls, pBt, ovflPgno)) != uintptr(0)) && Xsqlite3PagerPageRefcount(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) != 1 { rc = Xsqlite3CorruptError(tls, 75187) } else { rc = freePage2(tls, pBt, *(*uintptr)(unsafe.Pointer(bp)), ovflPgno) } if *(*uintptr)(unsafe.Pointer(bp)) != 0 { Xsqlite3PagerUnref(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) } if rc != 0 { return rc } ovflPgno = *(*Pgno)(unsafe.Pointer(bp + 8)) } return SQLITE_OK } func fillInCell(tls *libc.TLS, pPage uintptr, pCell uintptr, pX uintptr, pnSize uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var nPayload int32 var pSrc uintptr var nSrc int32 var n int32 var mn int32 var spaceLeft int32 var pToRelease uintptr var pPrior uintptr var pPayload uintptr var pBt uintptr var nHeader int32 nHeader = int32((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) if (*MemPage)(unsafe.Pointer(pPage)).FintKey != 0 { nPayload = (*BtreePayload)(unsafe.Pointer(pX)).FnData + (*BtreePayload)(unsafe.Pointer(pX)).FnZero pSrc = (*BtreePayload)(unsafe.Pointer(pX)).FpData nSrc = (*BtreePayload)(unsafe.Pointer(pX)).FnData nHeader = nHeader + int32(func() uint8 { if U32(nPayload) < U32(0x80) { return uint8(func() int32 { *(*uint8)(unsafe.Pointer(pCell + uintptr(nHeader))) = uint8(nPayload); return 1 }()) } return uint8(Xsqlite3PutVarint(tls, pCell+uintptr(nHeader), uint64(nPayload))) }()) nHeader = nHeader + Xsqlite3PutVarint(tls, pCell+uintptr(nHeader), *(*U64)(unsafe.Pointer(pX + 8))) } else { nSrc = libc.AssignInt32(&nPayload, int32((*BtreePayload)(unsafe.Pointer(pX)).FnKey)) pSrc = (*BtreePayload)(unsafe.Pointer(pX)).FpKey nHeader = nHeader + int32(func() uint8 { if U32(nPayload) < U32(0x80) { return uint8(func() int32 { *(*uint8)(unsafe.Pointer(pCell + uintptr(nHeader))) = uint8(nPayload); return 1 }()) } return uint8(Xsqlite3PutVarint(tls, pCell+uintptr(nHeader), uint64(nPayload))) }()) } pPayload = pCell + uintptr(nHeader) if nPayload <= int32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { n = nHeader + nPayload if n < 4 { n = 4 } *(*int32)(unsafe.Pointer(pnSize)) = n libc.Xmemcpy(tls, pPayload, pSrc, uint64(nSrc)) libc.Xmemset(tls, pPayload+uintptr(nSrc), 0, uint64(nPayload-nSrc)) return SQLITE_OK } mn = int32((*MemPage)(unsafe.Pointer(pPage)).FminLocal) n = int32(U32(mn) + U32(nPayload-mn)%((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize-U32(4))) if n > int32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal) { n = mn } spaceLeft = n *(*int32)(unsafe.Pointer(pnSize)) = n + nHeader + 4 pPrior = pCell + uintptr(nHeader+n) pToRelease = uintptr(0) *(*Pgno)(unsafe.Pointer(bp + 8)) = Pgno(0) pBt = (*MemPage)(unsafe.Pointer(pPage)).FpBt for 1 != 0 { n = nPayload if n > spaceLeft { n = spaceLeft } if nSrc >= n { libc.Xmemcpy(tls, pPayload, pSrc, uint64(n)) } else if nSrc > 0 { n = nSrc libc.Xmemcpy(tls, pPayload, pSrc, uint64(n)) } else { libc.Xmemset(tls, pPayload, 0, uint64(n)) } nPayload = nPayload - n if nPayload <= 0 { break } pPayload += uintptr(n) pSrc += uintptr(n) nSrc = nSrc - n spaceLeft = spaceLeft - n if spaceLeft == 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var pgnoPtrmap Pgno = *(*Pgno)(unsafe.Pointer(bp + 8)) if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { for __ccgo := true; __ccgo; __ccgo = ptrmapPageno(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 8))) == *(*Pgno)(unsafe.Pointer(bp + 8)) || *(*Pgno)(unsafe.Pointer(bp + 8)) == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { *(*Pgno)(unsafe.Pointer(bp + 8))++ } } *(*int32)(unsafe.Pointer(bp + 12)) = allocateBtreePage(tls, pBt, bp, bp+8, *(*Pgno)(unsafe.Pointer(bp + 8)), uint8(0)) if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 && *(*int32)(unsafe.Pointer(bp + 12)) == SQLITE_OK { var eType U8 = func() uint8 { if pgnoPtrmap != 0 { return uint8(PTRMAP_OVERFLOW2) } return uint8(PTRMAP_OVERFLOW1) }() ptrmapPut(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 8)), eType, pgnoPtrmap, bp+12) if *(*int32)(unsafe.Pointer(bp + 12)) != 0 { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) } } if *(*int32)(unsafe.Pointer(bp + 12)) != 0 { releasePage(tls, pToRelease) return *(*int32)(unsafe.Pointer(bp + 12)) } Xsqlite3Put4byte(tls, pPrior, *(*Pgno)(unsafe.Pointer(bp + 8))) releasePage(tls, pToRelease) pToRelease = *(*uintptr)(unsafe.Pointer(bp)) pPrior = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData Xsqlite3Put4byte(tls, pPrior, uint32(0)) pPayload = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData + 4 spaceLeft = int32((*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(4)) } } releasePage(tls, pToRelease) return SQLITE_OK } func dropCell(tls *libc.TLS, pPage uintptr, idx int32, sz int32, pRC uintptr) { var pc U32 var data uintptr var ptr uintptr var rc int32 var hdr int32 if *(*int32)(unsafe.Pointer(pRC)) != 0 { return } data = (*MemPage)(unsafe.Pointer(pPage)).FaData ptr = (*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*idx) pc = U32(int32(*(*U8)(unsafe.Pointer(ptr)))<<8 | int32(*(*U8)(unsafe.Pointer(ptr + 1)))) hdr = int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset) if pc+U32(sz) > (*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize { *(*int32)(unsafe.Pointer(pRC)) = Xsqlite3CorruptError(tls, 75440) return } rc = freeSpace(tls, pPage, uint16(pc), uint16(sz)) if rc != 0 { *(*int32)(unsafe.Pointer(pRC)) = rc return } (*MemPage)(unsafe.Pointer(pPage)).FnCell-- if int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) == 0 { libc.Xmemset(tls, data+uintptr(hdr+1), 0, uint64(4)) *(*U8)(unsafe.Pointer(data + uintptr(hdr+7))) = U8(0) *(*U8)(unsafe.Pointer(data + uintptr(hdr+5))) = U8((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize >> 8) *(*U8)(unsafe.Pointer(data + uintptr(hdr+5) + 1)) = U8((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize) (*MemPage)(unsafe.Pointer(pPage)).FnFree = int32((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FusableSize - U32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset) - U32((*MemPage)(unsafe.Pointer(pPage)).FchildPtrSize) - U32(8)) } else { libc.Xmemmove(tls, ptr, ptr+uintptr(2), uint64(2*(int32((*MemPage)(unsafe.Pointer(pPage)).FnCell)-idx))) *(*U8)(unsafe.Pointer(data + uintptr(hdr+3))) = U8(int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) >> 8) *(*U8)(unsafe.Pointer(data + uintptr(hdr+3) + 1)) = U8((*MemPage)(unsafe.Pointer(pPage)).FnCell) *(*int32)(unsafe.Pointer(pPage + 20)) += 2 } } func insertCell(tls *libc.TLS, pPage uintptr, i int32, pCell uintptr, sz int32, pTemp uintptr, iChild Pgno) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*int32)(unsafe.Pointer(bp)) = 0 var j int32 var data uintptr var pIns uintptr if (*MemPage)(unsafe.Pointer(pPage)).FnOverflow != 0 || sz+2 > (*MemPage)(unsafe.Pointer(pPage)).FnFree { if pTemp != 0 { libc.Xmemcpy(tls, pTemp, pCell, uint64(sz)) pCell = pTemp } if iChild != 0 { Xsqlite3Put4byte(tls, pCell, iChild) } j = int32(libc.PostIncUint8(&(*MemPage)(unsafe.Pointer(pPage)).FnOverflow, 1)) *(*uintptr)(unsafe.Pointer(pPage + 40 + uintptr(j)*8)) = pCell *(*U16)(unsafe.Pointer(pPage + 28 + uintptr(j)*2)) = U16(i) } else { var rc int32 = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) if rc != SQLITE_OK { return rc } data = (*MemPage)(unsafe.Pointer(pPage)).FaData rc = allocateSpace(tls, pPage, sz, bp) if rc != 0 { return rc } *(*int32)(unsafe.Pointer(pPage + 20)) -= int32(U16(2 + sz)) if iChild != 0 { libc.Xmemcpy(tls, data+uintptr(*(*int32)(unsafe.Pointer(bp))+4), pCell+uintptr(4), uint64(sz-4)) Xsqlite3Put4byte(tls, data+uintptr(*(*int32)(unsafe.Pointer(bp))), iChild) } else { libc.Xmemcpy(tls, data+uintptr(*(*int32)(unsafe.Pointer(bp))), pCell, uint64(sz)) } pIns = (*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(i*2) libc.Xmemmove(tls, pIns+uintptr(2), pIns, uint64(2*(int32((*MemPage)(unsafe.Pointer(pPage)).FnCell)-i))) *(*U8)(unsafe.Pointer(pIns)) = U8(*(*int32)(unsafe.Pointer(bp)) >> 8) *(*U8)(unsafe.Pointer(pIns + 1)) = U8(*(*int32)(unsafe.Pointer(bp))) (*MemPage)(unsafe.Pointer(pPage)).FnCell++ if int32(libc.PreIncUint8(&*(*U8)(unsafe.Pointer(data + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+4))), 1)) == 0 { *(*U8)(unsafe.Pointer(data + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+3)))++ } if (*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FpBt)).FautoVacuum != 0 { *(*int32)(unsafe.Pointer(bp + 4)) = SQLITE_OK ptrmapPutOvflPtr(tls, pPage, pPage, pCell, bp+4) if *(*int32)(unsafe.Pointer(bp + 4)) != 0 { return *(*int32)(unsafe.Pointer(bp + 4)) } } } return SQLITE_OK } // A CellArray object contains a cache of pointers and sizes for a // consecutive sequence of cells that might be held on multiple pages. // // The cells in this array are the divider cell or cells from the pParent // page plus up to three child pages. There are a total of nCell cells. // // pRef is a pointer to one of the pages that contributes cells. This is // used to access information such as MemPage.intKey and MemPage.pBt->pageSize // which should be common to all pages that contribute cells to this array. // // apCell[] and szCell[] hold, respectively, pointers to the start of each // cell and the size of each cell. Some of the apCell[] pointers might refer // to overflow cells. In other words, some apCel[] pointers might not point // to content area of the pages. // // A szCell[] of zero means the size of that cell has not yet been computed. // // The cells come from as many as four different pages: // // ----------- // | Parent | // ----------- // / | ** / | ** --------- --------- --------- // |Child-1| |Child-2| |Child-3| // --------- --------- --------- // // The order of cells is in the array is for an index btree is: // // 1. All cells from Child-1 in order // 2. The first divider cell from Parent // 3. All cells from Child-2 in order // 4. The second divider cell from Parent // 5. All cells from Child-3 in order // // For a table-btree (with rowids) the items 2 and 4 are empty because // content exists only in leaves and there are no divider cells. // // For an index btree, the apEnd[] array holds pointer to the end of page // for Child-1, the Parent, Child-2, the Parent (again), and Child-3, // respectively. The ixNx[] array holds the number of cells contained in // each of these 5 stages, and all stages to the left. Hence: // // ixNx[0] = Number of cells in Child-1. // ixNx[1] = Number of cells in Child-1 plus 1 for first divider. // ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. // ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells // ixNx[4] = Total number of cells. // // For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] // are used and they point to the leaf pages only, and the ixNx value are: // // ixNx[0] = Number of cells in Child-1. // ixNx[1] = Number of cells in Child-1 and Child-2. // ixNx[2] = Total number of cells. // // Sometimes when deleting, a child page can have zero cells. In those // cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] // entries, shift down. The end result is that each ixNx[] entry should // be larger than the previous type CellArray1 = struct { FnCell int32 F__ccgo_pad1 [4]byte FpRef uintptr FapCell uintptr FszCell uintptr FapEnd [6]uintptr FixNx [6]int32 } // A CellArray object contains a cache of pointers and sizes for a // consecutive sequence of cells that might be held on multiple pages. // // The cells in this array are the divider cell or cells from the pParent // page plus up to three child pages. There are a total of nCell cells. // // pRef is a pointer to one of the pages that contributes cells. This is // used to access information such as MemPage.intKey and MemPage.pBt->pageSize // which should be common to all pages that contribute cells to this array. // // apCell[] and szCell[] hold, respectively, pointers to the start of each // cell and the size of each cell. Some of the apCell[] pointers might refer // to overflow cells. In other words, some apCel[] pointers might not point // to content area of the pages. // // A szCell[] of zero means the size of that cell has not yet been computed. // // The cells come from as many as four different pages: // // ----------- // | Parent | // ----------- // / | ** / | ** --------- --------- --------- // |Child-1| |Child-2| |Child-3| // --------- --------- --------- // // The order of cells is in the array is for an index btree is: // // 1. All cells from Child-1 in order // 2. The first divider cell from Parent // 3. All cells from Child-2 in order // 4. The second divider cell from Parent // 5. All cells from Child-3 in order // // For a table-btree (with rowids) the items 2 and 4 are empty because // content exists only in leaves and there are no divider cells. // // For an index btree, the apEnd[] array holds pointer to the end of page // for Child-1, the Parent, Child-2, the Parent (again), and Child-3, // respectively. The ixNx[] array holds the number of cells contained in // each of these 5 stages, and all stages to the left. Hence: // // ixNx[0] = Number of cells in Child-1. // ixNx[1] = Number of cells in Child-1 plus 1 for first divider. // ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. // ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells // ixNx[4] = Total number of cells. // // For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] // are used and they point to the leaf pages only, and the ixNx value are: // // ixNx[0] = Number of cells in Child-1. // ixNx[1] = Number of cells in Child-1 and Child-2. // ixNx[2] = Total number of cells. // // Sometimes when deleting, a child page can have zero cells. In those // cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] // entries, shift down. The end result is that each ixNx[] entry should // be larger than the previous type CellArray = CellArray1 func populateCellCache(tls *libc.TLS, p uintptr, idx int32, N int32) { var pRef uintptr = (*CellArray)(unsafe.Pointer(p)).FpRef var szCell uintptr = (*CellArray)(unsafe.Pointer(p)).FszCell for N > 0 { if int32(*(*U16)(unsafe.Pointer(szCell + uintptr(idx)*2))) == 0 { *(*U16)(unsafe.Pointer(szCell + uintptr(idx)*2)) = (*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pRef)).FxCellSize})).f(tls, pRef, *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(p)).FapCell + uintptr(idx)*8))) } else { } idx++ N-- } } func computeCellSize(tls *libc.TLS, p uintptr, N int32) U16 { *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(p)).FszCell + uintptr(N)*2)) = (*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer((*CellArray)(unsafe.Pointer(p)).FpRef)).FxCellSize})).f(tls, (*CellArray)(unsafe.Pointer(p)).FpRef, *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(p)).FapCell + uintptr(N)*8))) return *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(p)).FszCell + uintptr(N)*2)) } func cachedCellSize(tls *libc.TLS, p uintptr, N int32) U16 { if *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(p)).FszCell + uintptr(N)*2)) != 0 { return *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(p)).FszCell + uintptr(N)*2)) } return computeCellSize(tls, p, N) } func rebuildPage(tls *libc.TLS, pCArray uintptr, iFirst int32, nCell int32, pPg uintptr) int32 { var hdr int32 = int32((*MemPage)(unsafe.Pointer(pPg)).FhdrOffset) var aData uintptr = (*MemPage)(unsafe.Pointer(pPg)).FaData var usableSize int32 = int32((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPg)).FpBt)).FusableSize) var pEnd uintptr = aData + uintptr(usableSize) var i int32 = iFirst var j U32 var iEnd int32 = i + nCell var pCellptr uintptr = (*MemPage)(unsafe.Pointer(pPg)).FaCellIdx var pTmp uintptr = Xsqlite3PagerTempSpace(tls, (*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPg)).FpBt)).FpPager) var pData uintptr var k int32 var pSrcEnd uintptr j = U32(int32(*(*U8)(unsafe.Pointer(aData + uintptr(hdr+5))))<<8 | int32(*(*U8)(unsafe.Pointer(aData + uintptr(hdr+5) + 1)))) if j > U32(usableSize) { j = U32(0) } libc.Xmemcpy(tls, pTmp+uintptr(j), aData+uintptr(j), uint64(U32(usableSize)-j)) for k = 0; *(*int32)(unsafe.Pointer(pCArray + 80 + uintptr(k)*4)) <= i && k < NB*2; k++ { } pSrcEnd = *(*uintptr)(unsafe.Pointer(pCArray + 32 + uintptr(k)*8)) pData = pEnd for 1 != 0 { var pCell uintptr = *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FapCell + uintptr(i)*8)) var sz U16 = *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FszCell + uintptr(i)*2)) if Uptr(pCell) >= Uptr(aData+uintptr(j)) && Uptr(pCell) < Uptr(pEnd) { if Uptr(pCell+uintptr(sz)) > Uptr(pEnd) { return Xsqlite3CorruptError(tls, 75741) } pCell = pTmp + uintptr((int64(pCell)-int64(aData))/1) } else if Uptr(pCell+uintptr(sz)) > Uptr(pSrcEnd) && Uptr(pCell) < Uptr(pSrcEnd) { return Xsqlite3CorruptError(tls, 75746) } pData -= uintptr(sz) *(*U8)(unsafe.Pointer(pCellptr)) = U8((int64(pData) - int64(aData)) / 1 >> 8) *(*U8)(unsafe.Pointer(pCellptr + 1)) = U8((int64(pData) - int64(aData)) / 1) pCellptr += uintptr(2) if pData < pCellptr { return Xsqlite3CorruptError(tls, 75752) } libc.Xmemmove(tls, pData, pCell, uint64(sz)) i++ if i >= iEnd { break } if *(*int32)(unsafe.Pointer(pCArray + 80 + uintptr(k)*4)) <= i { k++ pSrcEnd = *(*uintptr)(unsafe.Pointer(pCArray + 32 + uintptr(k)*8)) } } (*MemPage)(unsafe.Pointer(pPg)).FnCell = U16(nCell) (*MemPage)(unsafe.Pointer(pPg)).FnOverflow = U8(0) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+1))) = U8(int32(0) >> 8) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+1) + 1)) = U8(0) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+3))) = U8(int32((*MemPage)(unsafe.Pointer(pPg)).FnCell) >> 8) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+3) + 1)) = U8((*MemPage)(unsafe.Pointer(pPg)).FnCell) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+5))) = U8((int64(pData) - int64(aData)) / 1 >> 8) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+5) + 1)) = U8((int64(pData) - int64(aData)) / 1) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+7))) = U8(0x00) return SQLITE_OK } func pageInsertArray(tls *libc.TLS, pPg uintptr, pBegin uintptr, ppData uintptr, pCellptr uintptr, iFirst int32, nCell int32, pCArray uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var i int32 = iFirst var aData uintptr = (*MemPage)(unsafe.Pointer(pPg)).FaData var pData uintptr = *(*uintptr)(unsafe.Pointer(ppData)) var iEnd int32 = iFirst + nCell var k int32 var pEnd uintptr if iEnd <= iFirst { return 0 } for k = 0; *(*int32)(unsafe.Pointer(pCArray + 80 + uintptr(k)*4)) <= i && k < NB*2; k++ { } pEnd = *(*uintptr)(unsafe.Pointer(pCArray + 32 + uintptr(k)*8)) for 1 != 0 { var sz int32 var pSlot uintptr sz = int32(*(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FszCell + uintptr(i)*2))) if int32(*(*U8)(unsafe.Pointer(aData + 1))) == 0 && int32(*(*U8)(unsafe.Pointer(aData + 2))) == 0 || libc.AssignUintptr(&pSlot, pageFindSlot(tls, pPg, sz, bp)) == uintptr(0) { if (int64(pData)-int64(pBegin))/1 < int64(sz) { return 1 } pData -= uintptr(sz) pSlot = pData } if Uptr(*(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FapCell + uintptr(i)*8))+uintptr(sz)) > Uptr(pEnd) && Uptr(*(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FapCell + uintptr(i)*8))) < Uptr(pEnd) { Xsqlite3CorruptError(tls, 75837) return 1 } libc.Xmemmove(tls, pSlot, *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FapCell + uintptr(i)*8)), uint64(sz)) *(*U8)(unsafe.Pointer(pCellptr)) = U8((int64(pSlot) - int64(aData)) / 1 >> 8) *(*U8)(unsafe.Pointer(pCellptr + 1)) = U8((int64(pSlot) - int64(aData)) / 1) pCellptr += uintptr(2) i++ if i >= iEnd { break } if *(*int32)(unsafe.Pointer(pCArray + 80 + uintptr(k)*4)) <= i { k++ pEnd = *(*uintptr)(unsafe.Pointer(pCArray + 32 + uintptr(k)*8)) } } *(*uintptr)(unsafe.Pointer(ppData)) = pData return 0 } func pageFreeArray(tls *libc.TLS, pPg uintptr, iFirst int32, nCell int32, pCArray uintptr) int32 { var aData uintptr = (*MemPage)(unsafe.Pointer(pPg)).FaData var pEnd uintptr = aData + uintptr((*BtShared)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPg)).FpBt)).FusableSize) var pStart uintptr = aData + uintptr(int32((*MemPage)(unsafe.Pointer(pPg)).FhdrOffset)+8+int32((*MemPage)(unsafe.Pointer(pPg)).FchildPtrSize)) var nRet int32 = 0 var i int32 var iEnd int32 = iFirst + nCell var pFree uintptr = uintptr(0) var szFree int32 = 0 for i = iFirst; i < iEnd; i++ { var pCell uintptr = *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FapCell + uintptr(i)*8)) if Uptr(pCell) >= Uptr(pStart) && Uptr(pCell) < Uptr(pEnd) { var sz int32 sz = int32(*(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(pCArray)).FszCell + uintptr(i)*2))) if pFree != pCell+uintptr(sz) { if pFree != 0 { freeSpace(tls, pPg, U16((int64(pFree)-int64(aData))/1), uint16(szFree)) } pFree = pCell szFree = sz if pFree+uintptr(sz) > pEnd { return 0 } } else { pFree = pCell szFree = szFree + sz } nRet++ } } if pFree != 0 { freeSpace(tls, pPg, U16((int64(pFree)-int64(aData))/1), uint16(szFree)) } return nRet } func editPage(tls *libc.TLS, pPg uintptr, iOld int32, iNew int32, nNew int32, pCArray uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var aData uintptr var hdr int32 var pBegin uintptr var nCell int32 var pCellptr uintptr var i int32 var iOldEnd int32 var iNewEnd int32 var nShift int32 var nTail int32 var nAdd int32 var iCell int32 aData = (*MemPage)(unsafe.Pointer(pPg)).FaData hdr = int32((*MemPage)(unsafe.Pointer(pPg)).FhdrOffset) pBegin = (*MemPage)(unsafe.Pointer(pPg)).FaCellIdx + uintptr(nNew*2) nCell = int32((*MemPage)(unsafe.Pointer(pPg)).FnCell) iOldEnd = iOld + int32((*MemPage)(unsafe.Pointer(pPg)).FnCell) + int32((*MemPage)(unsafe.Pointer(pPg)).FnOverflow) iNewEnd = iNew + nNew if !(iOld < iNew) { goto __1 } nShift = pageFreeArray(tls, pPg, iOld, iNew-iOld, pCArray) if !(nShift > nCell) { goto __2 } return Xsqlite3CorruptError(tls, 75951) __2: ; libc.Xmemmove(tls, (*MemPage)(unsafe.Pointer(pPg)).FaCellIdx, (*MemPage)(unsafe.Pointer(pPg)).FaCellIdx+uintptr(nShift*2), uint64(nCell*2)) nCell = nCell - nShift __1: ; if !(iNewEnd < iOldEnd) { goto __3 } nTail = pageFreeArray(tls, pPg, iNewEnd, iOldEnd-iNewEnd, pCArray) nCell = nCell - nTail __3: ; *(*uintptr)(unsafe.Pointer(bp)) = aData + uintptr((int32(*(*U8)(unsafe.Pointer(aData + uintptr(hdr+5))))<<8|int32(*(*U8)(unsafe.Pointer(aData + uintptr(hdr+5) + 1)))-1)&0xffff+1) if !(*(*uintptr)(unsafe.Pointer(bp)) < pBegin) { goto __4 } goto editpage_fail __4: ; if !(*(*uintptr)(unsafe.Pointer(bp)) > (*MemPage)(unsafe.Pointer(pPg)).FaDataEnd) { goto __5 } goto editpage_fail __5: ; if !(iNew < iOld) { goto __6 } nAdd = func() int32 { if nNew < iOld-iNew { return nNew } return iOld - iNew }() pCellptr = (*MemPage)(unsafe.Pointer(pPg)).FaCellIdx libc.Xmemmove(tls, pCellptr+uintptr(nAdd*2), pCellptr, uint64(nCell*2)) if !(pageInsertArray(tls, pPg, pBegin, bp, pCellptr, iNew, nAdd, pCArray) != 0) { goto __7 } goto editpage_fail __7: ; nCell = nCell + nAdd __6: ; i = 0 __8: if !(i < int32((*MemPage)(unsafe.Pointer(pPg)).FnOverflow)) { goto __10 } iCell = iOld + int32(*(*U16)(unsafe.Pointer(pPg + 28 + uintptr(i)*2))) - iNew if !(iCell >= 0 && iCell < nNew) { goto __11 } pCellptr = (*MemPage)(unsafe.Pointer(pPg)).FaCellIdx + uintptr(iCell*2) if !(nCell > iCell) { goto __12 } libc.Xmemmove(tls, pCellptr+2, pCellptr, uint64((nCell-iCell)*2)) __12: ; nCell++ cachedCellSize(tls, pCArray, iCell+iNew) if !(pageInsertArray(tls, pPg, pBegin, bp, pCellptr, iCell+iNew, 1, pCArray) != 0) { goto __13 } goto editpage_fail __13: ; __11: ; goto __9 __9: i++ goto __8 goto __10 __10: ; pCellptr = (*MemPage)(unsafe.Pointer(pPg)).FaCellIdx + uintptr(nCell*2) if !(pageInsertArray(tls, pPg, pBegin, bp, pCellptr, iNew+nCell, nNew-nCell, pCArray) != 0) { goto __14 } goto editpage_fail __14: ; (*MemPage)(unsafe.Pointer(pPg)).FnCell = U16(nNew) (*MemPage)(unsafe.Pointer(pPg)).FnOverflow = U8(0) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+3))) = U8(int32((*MemPage)(unsafe.Pointer(pPg)).FnCell) >> 8) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+3) + 1)) = U8((*MemPage)(unsafe.Pointer(pPg)).FnCell) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+5))) = U8((int64(*(*uintptr)(unsafe.Pointer(bp))) - int64(aData)) / 1 >> 8) *(*U8)(unsafe.Pointer(aData + uintptr(hdr+5) + 1)) = U8((int64(*(*uintptr)(unsafe.Pointer(bp))) - int64(aData)) / 1) return SQLITE_OK editpage_fail: populateCellCache(tls, pCArray, iNew, nNew) return rebuildPage(tls, pCArray, iNew, nNew, pPg) } func balance_quick(tls *libc.TLS, pParent uintptr, pPage uintptr, pSpace uintptr) int32 { bp := tls.Alloc(140) defer tls.Free(140) var pBt uintptr = (*MemPage)(unsafe.Pointer(pPage)).FpBt if int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) == 0 { return Xsqlite3CorruptError(tls, 76064) } *(*int32)(unsafe.Pointer(bp + 136)) = allocateBtreePage(tls, pBt, bp, bp+8, uint32(0), uint8(0)) if *(*int32)(unsafe.Pointer(bp + 136)) == SQLITE_OK { var pOut uintptr = pSpace + 4 *(*uintptr)(unsafe.Pointer(bp + 16)) = *(*uintptr)(unsafe.Pointer(pPage + 40)) *(*U16)(unsafe.Pointer(bp + 24)) = (*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxCellSize})).f(tls, pPage, *(*uintptr)(unsafe.Pointer(bp + 16))) var pStop uintptr zeroPage(tls, *(*uintptr)(unsafe.Pointer(bp)), PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) (*CellArray)(unsafe.Pointer(bp + 32)).FnCell = 1 (*CellArray)(unsafe.Pointer(bp + 32)).FpRef = pPage (*CellArray)(unsafe.Pointer(bp + 32)).FapCell = bp + 16 (*CellArray)(unsafe.Pointer(bp + 32)).FszCell = bp + 24 *(*uintptr)(unsafe.Pointer(bp + 32 + 32)) = (*MemPage)(unsafe.Pointer(pPage)).FaDataEnd *(*int32)(unsafe.Pointer(bp + 32 + 80)) = 2 *(*int32)(unsafe.Pointer(bp + 136)) = rebuildPage(tls, bp+32, 0, 1, *(*uintptr)(unsafe.Pointer(bp))) if *(*int32)(unsafe.Pointer(bp + 136)) != 0 { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) return *(*int32)(unsafe.Pointer(bp + 136)) } (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnFree = int32((*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FcellOffset) - U32(2) - U32(*(*U16)(unsafe.Pointer(bp + 24)))) if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { ptrmapPut(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 8)), uint8(PTRMAP_BTREE), (*MemPage)(unsafe.Pointer(pParent)).Fpgno, bp+136) if int32(*(*U16)(unsafe.Pointer(bp + 24))) > int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FminLocal) { ptrmapPutOvflPtr(tls, *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 16)), bp+136) } } *(*uintptr)(unsafe.Pointer(bp + 16)) = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*(int32((*MemPage)(unsafe.Pointer(pPage)).FnCell)-1))))))) pStop = *(*uintptr)(unsafe.Pointer(bp + 16)) + 9 for int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp + 16)), 1))))&0x80 != 0 && *(*uintptr)(unsafe.Pointer(bp + 16)) < pStop { } pStop = *(*uintptr)(unsafe.Pointer(bp + 16)) + 9 for int32(libc.AssignPtrUint8(libc.PostIncUintptr(&pOut, 1), *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp + 16)), 1)))))&0x80 != 0 && *(*uintptr)(unsafe.Pointer(bp + 16)) < pStop { } if *(*int32)(unsafe.Pointer(bp + 136)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 136)) = insertCell(tls, pParent, int32((*MemPage)(unsafe.Pointer(pParent)).FnCell), pSpace, int32((int64(pOut)-int64(pSpace))/1), uintptr(0), (*MemPage)(unsafe.Pointer(pPage)).Fpgno) } Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pParent)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pParent)).FhdrOffset)+8), *(*Pgno)(unsafe.Pointer(bp + 8))) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) } return *(*int32)(unsafe.Pointer(bp + 136)) } func copyNodeContent(tls *libc.TLS, pFrom uintptr, pTo uintptr, pRC uintptr) { if *(*int32)(unsafe.Pointer(pRC)) == SQLITE_OK { var pBt uintptr = (*MemPage)(unsafe.Pointer(pFrom)).FpBt var aFrom uintptr = (*MemPage)(unsafe.Pointer(pFrom)).FaData var aTo uintptr = (*MemPage)(unsafe.Pointer(pTo)).FaData var iFromHdr int32 = int32((*MemPage)(unsafe.Pointer(pFrom)).FhdrOffset) var iToHdr int32 = func() int32 { if (*MemPage)(unsafe.Pointer(pTo)).Fpgno == Pgno(1) { return 100 } return 0 }() var rc int32 var iData int32 iData = int32(*(*U8)(unsafe.Pointer(aFrom + uintptr(iFromHdr+5))))<<8 | int32(*(*U8)(unsafe.Pointer(aFrom + uintptr(iFromHdr+5) + 1))) libc.Xmemcpy(tls, aTo+uintptr(iData), aFrom+uintptr(iData), uint64((*BtShared)(unsafe.Pointer(pBt)).FusableSize-U32(iData))) libc.Xmemcpy(tls, aTo+uintptr(iToHdr), aFrom+uintptr(iFromHdr), uint64(int32((*MemPage)(unsafe.Pointer(pFrom)).FcellOffset)+2*int32((*MemPage)(unsafe.Pointer(pFrom)).FnCell))) (*MemPage)(unsafe.Pointer(pTo)).FisInit = U8(0) rc = btreeInitPage(tls, pTo) if rc == SQLITE_OK { rc = btreeComputeFreeSpace(tls, pTo) } if rc != SQLITE_OK { *(*int32)(unsafe.Pointer(pRC)) = rc return } if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { *(*int32)(unsafe.Pointer(pRC)) = setChildPtrmaps(tls, pTo) } } } func balance_nonroot(tls *libc.TLS, pParent uintptr, iParentIdx int32, aOvflSpace uintptr, isRoot int32, bBulk int32) int32 { bp := tls.Alloc(312) defer tls.Free(312) var pBt uintptr var nMaxCells int32 var nNew int32 var nOld int32 var i int32 var j int32 var k int32 var nxDiv int32 var leafCorrection U16 var leafData int32 var usableSpace int32 var pageFlags int32 var iSpace1 int32 var iOvflSpace int32 var szScratch int32 var pRight uintptr var aSpace1 uintptr var iOff int32 var sz U16 var pTemp uintptr var pOld uintptr var limit int32 var aData uintptr var maskPage U16 var piCell uintptr var piEnd uintptr var p uintptr var sz1 int32 var szR int32 var szD int32 var szRight int32 var szLeft int32 var r int32 var d int32 var pgnoA Pgno var pgnoB Pgno var pgnoTemp Pgno var fgA U16 var fgB U16 var iB int32 var pOld1 uintptr var pCell uintptr var pOld2 uintptr var pNew1 uintptr var cntOldNext int32 var iNew int32 var iOld int32 var pCell1 uintptr var pTemp1 uintptr var sz2 int32 var pSrcEnd uintptr var pNew2 uintptr var iNew1 int32 var iOld1 int32 var nNewCell int32 var iPg int32 var key U32 nMaxCells = 0 nNew = 0 *(*int32)(unsafe.Pointer(bp + 172)) = SQLITE_OK iSpace1 = 0 iOvflSpace = 0 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([5]U8{}))) libc.Xmemset(tls, bp+8, 0, uint64(unsafe.Sizeof(CellArray{}))) pBt = (*MemPage)(unsafe.Pointer(pParent)).FpBt if !!(aOvflSpace != 0) { goto __1 } return SQLITE_NOMEM __1: ; i = int32((*MemPage)(unsafe.Pointer(pParent)).FnOverflow) + int32((*MemPage)(unsafe.Pointer(pParent)).FnCell) if !(i < 2) { goto __2 } nxDiv = 0 goto __3 __2: ; if !(iParentIdx == 0) { goto __4 } nxDiv = 0 goto __5 __4: if !(iParentIdx == i) { goto __6 } nxDiv = i - 2 + bBulk goto __7 __6: nxDiv = iParentIdx - 1 __7: ; __5: ; i = 2 - bBulk __3: ; nOld = i + 1 if !(i+nxDiv-int32((*MemPage)(unsafe.Pointer(pParent)).FnOverflow) == int32((*MemPage)(unsafe.Pointer(pParent)).FnCell)) { goto __8 } pRight = (*MemPage)(unsafe.Pointer(pParent)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pParent)).FhdrOffset)+8) goto __9 __8: pRight = (*MemPage)(unsafe.Pointer(pParent)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pParent)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pParent)).FaCellIdx + uintptr(2*(i+nxDiv-int32((*MemPage)(unsafe.Pointer(pParent)).FnOverflow)))))))) __9: ; *(*Pgno)(unsafe.Pointer(bp + 264)) = Xsqlite3Get4byte(tls, pRight) __10: if !(1 != 0) { goto __11 } if !(*(*int32)(unsafe.Pointer(bp + 172)) == SQLITE_OK) { goto __12 } *(*int32)(unsafe.Pointer(bp + 172)) = getAndInitPage(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 264)), bp+112+uintptr(i)*8, uintptr(0), 0) __12: ; if !(*(*int32)(unsafe.Pointer(bp + 172)) != 0) { goto __13 } libc.Xmemset(tls, bp+112, 0, uint64(i+1)*uint64(unsafe.Sizeof(uintptr(0)))) goto balance_cleanup __13: ; if !((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8)))).FnFree < 0) { goto __14 } *(*int32)(unsafe.Pointer(bp + 172)) = btreeComputeFreeSpace(tls, *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8))) if !(*(*int32)(unsafe.Pointer(bp + 172)) != 0) { goto __15 } libc.Xmemset(tls, bp+112, 0, uint64(i)*uint64(unsafe.Sizeof(uintptr(0)))) goto balance_cleanup __15: ; __14: ; nMaxCells = nMaxCells + (int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8)))).FnCell) + int32(uint64(unsafe.Sizeof([4]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0))))) if !(libc.PostDecInt32(&i, 1) == 0) { goto __16 } goto __11 __16: ; if !((*MemPage)(unsafe.Pointer(pParent)).FnOverflow != 0 && i+nxDiv == int32(*(*U16)(unsafe.Pointer(pParent + 28)))) { goto __17 } *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer(pParent + 40)) *(*Pgno)(unsafe.Pointer(bp + 264)) = Xsqlite3Get4byte(tls, *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8))) *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) = int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pParent)).FxCellSize})).f(tls, pParent, *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)))) (*MemPage)(unsafe.Pointer(pParent)).FnOverflow = U8(0) goto __18 __17: *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)) = (*MemPage)(unsafe.Pointer(pParent)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pParent)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pParent)).FaCellIdx + uintptr(2*(i+nxDiv-int32((*MemPage)(unsafe.Pointer(pParent)).FnOverflow)))))))) *(*Pgno)(unsafe.Pointer(bp + 264)) = Xsqlite3Get4byte(tls, *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8))) *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) = int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pParent)).FxCellSize})).f(tls, pParent, *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)))) if !(int32((*BtShared)(unsafe.Pointer(pBt)).FbtsFlags)&BTS_FAST_SECURE != 0) { goto __19 } iOff = int32(*(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8))) - int32((*MemPage)(unsafe.Pointer(pParent)).FaData) if !(iOff+*(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) <= int32((*BtShared)(unsafe.Pointer(pBt)).FusableSize)) { goto __20 } libc.Xmemcpy(tls, aOvflSpace+uintptr(iOff), *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)), uint64(*(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)))) *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)) = aOvflSpace + uintptr((int64(*(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)))-int64((*MemPage)(unsafe.Pointer(pParent)).FaData))/1) __20: ; __19: ; dropCell(tls, pParent, i+nxDiv-int32((*MemPage)(unsafe.Pointer(pParent)).FnOverflow), *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)), bp+172) __18: ; goto __10 __11: ; nMaxCells = (nMaxCells + 3) & libc.CplInt32(3) szScratch = int32(uint64(nMaxCells)*uint64(unsafe.Sizeof(uintptr(0))) + uint64(nMaxCells)*uint64(unsafe.Sizeof(U16(0))) + uint64((*BtShared)(unsafe.Pointer(pBt)).FpageSize)) (*CellArray)(unsafe.Pointer(bp + 8)).FapCell = Xsqlite3DbMallocRaw(tls, uintptr(0), uint64(szScratch)) if !((*CellArray)(unsafe.Pointer(bp+8)).FapCell == uintptr(0)) { goto __21 } *(*int32)(unsafe.Pointer(bp + 172)) = SQLITE_NOMEM goto balance_cleanup __21: ; (*CellArray)(unsafe.Pointer(bp + 8)).FszCell = (*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr(nMaxCells)*8 aSpace1 = (*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr(nMaxCells)*2 (*CellArray)(unsafe.Pointer(bp + 8)).FpRef = *(*uintptr)(unsafe.Pointer(bp + 112)) leafCorrection = U16(int32((*MemPage)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FpRef)).Fleaf) * 4) leafData = int32((*MemPage)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp + 8)).FpRef)).FintKeyLeaf) i = 0 __22: if !(i < nOld) { goto __24 } pOld = *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8)) limit = int32((*MemPage)(unsafe.Pointer(pOld)).FnCell) aData = (*MemPage)(unsafe.Pointer(pOld)).FaData maskPage = (*MemPage)(unsafe.Pointer(pOld)).FmaskPage piCell = aData + uintptr((*MemPage)(unsafe.Pointer(pOld)).FcellOffset) if !(int32(*(*U8)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pOld)).FaData))) != int32(*(*U8)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 112)))).FaData)))) { goto __25 } *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3CorruptError(tls, 76485) goto balance_cleanup __25: ; libc.Xmemset(tls, (*CellArray)(unsafe.Pointer(bp+8)).FszCell+uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*2, 0, uint64(unsafe.Sizeof(U16(0)))*uint64(limit+int32((*MemPage)(unsafe.Pointer(pOld)).FnOverflow))) if !(int32((*MemPage)(unsafe.Pointer(pOld)).FnOverflow) > 0) { goto __26 } if !(limit < int32(*(*U16)(unsafe.Pointer(pOld + 28)))) { goto __27 } *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3CorruptError(tls, 76509) goto balance_cleanup __27: ; limit = int32(*(*U16)(unsafe.Pointer(pOld + 28))) j = 0 __28: if !(j < limit) { goto __30 } *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*8)) = aData + uintptr(int32(maskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer(piCell))))) piCell += uintptr(2) (*CellArray)(unsafe.Pointer(bp+8)).FnCell++ goto __29 __29: j++ goto __28 goto __30 __30: ; k = 0 __31: if !(k < int32((*MemPage)(unsafe.Pointer(pOld)).FnOverflow)) { goto __33 } *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*8)) = *(*uintptr)(unsafe.Pointer(pOld + 40 + uintptr(k)*8)) (*CellArray)(unsafe.Pointer(bp+8)).FnCell++ goto __32 __32: k++ goto __31 goto __33 __33: ; __26: ; piEnd = aData + uintptr((*MemPage)(unsafe.Pointer(pOld)).FcellOffset) + uintptr(2*int32((*MemPage)(unsafe.Pointer(pOld)).FnCell)) __34: if !(piCell < piEnd) { goto __35 } *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*8)) = aData + uintptr(int32(maskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer(piCell))))) piCell += uintptr(2) (*CellArray)(unsafe.Pointer(bp+8)).FnCell++ goto __34 __35: ; *(*int32)(unsafe.Pointer(bp + 176 + uintptr(i)*4)) = (*CellArray)(unsafe.Pointer(bp + 8)).FnCell if !(i < nOld-1 && !(leafData != 0)) { goto __36 } sz = U16(*(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4))) *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*2)) = sz pTemp = aSpace1 + uintptr(iSpace1) iSpace1 = iSpace1 + int32(sz) libc.Xmemcpy(tls, pTemp, *(*uintptr)(unsafe.Pointer(bp + 136 + uintptr(i)*8)), uint64(sz)) *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*8)) = pTemp + uintptr(leafCorrection) *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*2)) = U16(int32(*(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*2))) - int32(leafCorrection)) if !!(int32((*MemPage)(unsafe.Pointer(pOld)).Fleaf) != 0) { goto __37 } libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*8)), (*MemPage)(unsafe.Pointer(pOld)).FaData+8, uint64(4)) goto __38 __37: ; __39: if !(int32(*(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*2))) < 4) { goto __40 } *(*U8)(unsafe.Pointer(aSpace1 + uintptr(libc.PostIncInt32(&iSpace1, 1)))) = U8(0x00) *(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr((*CellArray)(unsafe.Pointer(bp+8)).FnCell)*2))++ goto __39 __40: ; __38: ; (*CellArray)(unsafe.Pointer(bp+8)).FnCell++ __36: ; goto __23 __23: i++ goto __22 goto __24 __24: ; usableSpace = int32((*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(12) + U32(leafCorrection)) i = libc.AssignInt32(&k, 0) __41: if !(i < nOld) { goto __43 } p = *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8)) *(*uintptr)(unsafe.Pointer(bp + 8 + 32 + uintptr(k)*8)) = (*MemPage)(unsafe.Pointer(p)).FaDataEnd *(*int32)(unsafe.Pointer(bp + 8 + 80 + uintptr(k)*4)) = *(*int32)(unsafe.Pointer(bp + 176 + uintptr(i)*4)) if !(k != 0 && *(*int32)(unsafe.Pointer(bp + 8 + 80 + uintptr(k)*4)) == *(*int32)(unsafe.Pointer(bp + 8 + 80 + uintptr(k-1)*4))) { goto __44 } k-- __44: ; if !!(leafData != 0) { goto __45 } k++ *(*uintptr)(unsafe.Pointer(bp + 8 + 32 + uintptr(k)*8)) = (*MemPage)(unsafe.Pointer(pParent)).FaDataEnd *(*int32)(unsafe.Pointer(bp + 8 + 80 + uintptr(k)*4)) = *(*int32)(unsafe.Pointer(bp + 176 + uintptr(i)*4)) + 1 __45: ; *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) = usableSpace - (*MemPage)(unsafe.Pointer(p)).FnFree j = 0 __46: if !(j < int32((*MemPage)(unsafe.Pointer(p)).FnOverflow)) { goto __48 } *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) += 2 + int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(p)).FxCellSize})).f(tls, p, *(*uintptr)(unsafe.Pointer(p + 40 + uintptr(j)*8)))) goto __47 __47: j++ goto __46 goto __48 __48: ; *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)) = *(*int32)(unsafe.Pointer(bp + 176 + uintptr(i)*4)) goto __42 __42: i++ k++ goto __41 goto __43 __43: ; k = nOld i = 0 __49: if !(i < k) { goto __51 } __52: if !(*(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) > usableSpace) { goto __53 } if !(i+1 >= k) { goto __54 } k = i + 2 if !(k > NB+2) { goto __55 } *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3CorruptError(tls, 76610) goto balance_cleanup __55: ; *(*int32)(unsafe.Pointer(bp + 152 + uintptr(k-1)*4)) = 0 *(*int32)(unsafe.Pointer(bp + 196 + uintptr(k-1)*4)) = (*CellArray)(unsafe.Pointer(bp + 8)).FnCell __54: ; sz1 = 2 + int32(cachedCellSize(tls, bp+8, *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4))-1)) *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) -= sz1 if !!(leafData != 0) { goto __56 } if !(*(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)) < (*CellArray)(unsafe.Pointer(bp+8)).FnCell) { goto __57 } sz1 = 2 + int32(cachedCellSize(tls, bp+8, *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)))) goto __58 __57: sz1 = 0 __58: ; __56: ; *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i+1)*4)) += sz1 *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4))-- goto __52 __53: ; __59: if !(*(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)) < (*CellArray)(unsafe.Pointer(bp+8)).FnCell) { goto __60 } sz1 = 2 + int32(cachedCellSize(tls, bp+8, *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)))) if !(*(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4))+sz1 > usableSpace) { goto __61 } goto __60 __61: ; *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) += sz1 *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4))++ if !!(leafData != 0) { goto __62 } if !(*(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)) < (*CellArray)(unsafe.Pointer(bp+8)).FnCell) { goto __63 } sz1 = 2 + int32(cachedCellSize(tls, bp+8, *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)))) goto __64 __63: sz1 = 0 __64: ; __62: ; *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i+1)*4)) -= sz1 goto __59 __60: ; if !(*(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)) >= (*CellArray)(unsafe.Pointer(bp+8)).FnCell) { goto __65 } k = i + 1 goto __66 __65: if !(*(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)) <= func() int32 { if i > 0 { return *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i-1)*4)) } return 0 }()) { goto __67 } *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3CorruptError(tls, 76643) goto balance_cleanup __67: ; __66: ; goto __50 __50: i++ goto __49 goto __51 __51: ; i = k - 1 __68: if !(i > 0) { goto __70 } szRight = *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) szLeft = *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i-1)*4)) r = *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i-1)*4)) - 1 d = r + 1 - leafData cachedCellSize(tls, bp+8, d) __71: ; szR = int32(cachedCellSize(tls, bp+8, r)) szD = int32(*(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr(d)*2))) if !(szRight != 0 && (bBulk != 0 || szRight+szD+2 > szLeft-(szR+func() int32 { if i == k-1 { return 0 } return 2 }()))) { goto __74 } goto __73 __74: ; szRight = szRight + (szD + 2) szLeft = szLeft - (szR + 2) *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i-1)*4)) = r r-- d-- goto __72 __72: if r >= 0 { goto __71 } goto __73 __73: ; *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i)*4)) = szRight *(*int32)(unsafe.Pointer(bp + 152 + uintptr(i-1)*4)) = szLeft if !(*(*int32)(unsafe.Pointer(bp + 196 + uintptr(i-1)*4)) <= func() int32 { if i > 1 { return *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i-2)*4)) } return 0 }()) { goto __75 } *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3CorruptError(tls, 76687) goto balance_cleanup __75: ; goto __69 __69: i-- goto __68 goto __70 __70: ; pageFlags = int32(*(*U8)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 112)))).FaData))) i = 0 __76: if !(i < k) { goto __78 } if !(i < nOld) { goto __79 } *(*uintptr)(unsafe.Pointer(bp + 256)) = libc.AssignPtrUintptr(bp+216+uintptr(i)*8, *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 256)))).FpDbPage) nNew++ if !(Xsqlite3PagerPageRefcount(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 256)))).FpDbPage) != 1+libc.Bool32(i == iParentIdx-nxDiv) && *(*int32)(unsafe.Pointer(bp + 172)) == SQLITE_OK) { goto __81 } *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3CorruptError(tls, 76720) __81: ; if !(*(*int32)(unsafe.Pointer(bp + 172)) != 0) { goto __82 } goto balance_cleanup __82: ; goto __80 __79: ; *(*int32)(unsafe.Pointer(bp + 172)) = allocateBtreePage(tls, pBt, bp+256, bp+264, func() uint32 { if bBulk != 0 { return uint32(1) } return *(*Pgno)(unsafe.Pointer(bp + 264)) }(), uint8(0)) if !(*(*int32)(unsafe.Pointer(bp + 172)) != 0) { goto __83 } goto balance_cleanup __83: ; zeroPage(tls, *(*uintptr)(unsafe.Pointer(bp + 256)), pageFlags) *(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer(bp + 256)) nNew++ *(*int32)(unsafe.Pointer(bp + 176 + uintptr(i)*4)) = (*CellArray)(unsafe.Pointer(bp + 8)).FnCell if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0) { goto __84 } ptrmapPut(tls, pBt, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 256)))).Fpgno, uint8(PTRMAP_BTREE), (*MemPage)(unsafe.Pointer(pParent)).Fpgno, bp+172) if !(*(*int32)(unsafe.Pointer(bp + 172)) != SQLITE_OK) { goto __85 } goto balance_cleanup __85: ; __84: ; __80: ; goto __77 __77: i++ goto __76 goto __78 __78: ; i = 0 __86: if !(i < nNew) { goto __88 } *(*Pgno)(unsafe.Pointer(bp + 268 + uintptr(i)*4)) = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).Fpgno goto __87 __87: i++ goto __86 goto __88 __88: ; i = 0 __89: if !(i < nNew-1) { goto __91 } iB = i j = i + 1 __92: if !(j < nNew) { goto __94 } if !((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(j)*8)))).Fpgno < (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iB)*8)))).Fpgno) { goto __95 } iB = j __95: ; goto __93 __93: j++ goto __92 goto __94 __94: ; if !(iB != i) { goto __96 } pgnoA = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).Fpgno pgnoB = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iB)*8)))).Fpgno pgnoTemp = U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize + U32(1) fgA = (*DbPage)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).FpDbPage)).Fflags fgB = (*DbPage)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iB)*8)))).FpDbPage)).Fflags Xsqlite3PagerRekey(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).FpDbPage, pgnoTemp, fgB) Xsqlite3PagerRekey(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iB)*8)))).FpDbPage, pgnoA, fgA) Xsqlite3PagerRekey(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).FpDbPage, pgnoB, fgB) (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).Fpgno = pgnoB (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iB)*8)))).Fpgno = pgnoA __96: ; goto __90 __90: i++ goto __89 goto __91 __91: ; Xsqlite3Put4byte(tls, pRight, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(nNew-1)*8)))).Fpgno) if !(pageFlags&PTF_LEAF == 0 && nOld != nNew) { goto __97 } pOld1 = *(*uintptr)(unsafe.Pointer(func() uintptr { if nNew > nOld { return bp + 216 } return bp + 112 }() + uintptr(nOld-1)*8)) libc.Xmemcpy(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(nNew-1)*8)))).FaData+8, (*MemPage)(unsafe.Pointer(pOld1)).FaData+8, uint64(4)) __97: ; if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0) { goto __98 } pNew1 = libc.AssignUintptr(&pOld2, *(*uintptr)(unsafe.Pointer(bp + 216))) cntOldNext = int32((*MemPage)(unsafe.Pointer(pNew1)).FnCell) + int32((*MemPage)(unsafe.Pointer(pNew1)).FnOverflow) iNew = 0 iOld = 0 i = 0 __99: if !(i < (*CellArray)(unsafe.Pointer(bp+8)).FnCell) { goto __101 } pCell = *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr(i)*8)) __102: if !(i == cntOldNext) { goto __103 } iOld++ if iOld < nNew { pOld2 = *(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iOld)*8)) } else { pOld2 = *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(iOld)*8)) } cntOldNext = cntOldNext + (int32((*MemPage)(unsafe.Pointer(pOld2)).FnCell) + int32((*MemPage)(unsafe.Pointer(pOld2)).FnOverflow) + libc.BoolInt32(!(leafData != 0))) goto __102 __103: ; if !(i == *(*int32)(unsafe.Pointer(bp + 196 + uintptr(iNew)*4))) { goto __104 } pNew1 = *(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(libc.PreIncInt32(&iNew, 1))*8)) if !!(leafData != 0) { goto __105 } goto __100 __105: ; __104: ; if !(iOld >= nNew || (*MemPage)(unsafe.Pointer(pNew1)).Fpgno != *(*Pgno)(unsafe.Pointer(bp + 268 + uintptr(iOld)*4)) || !(Uptr(pCell) >= Uptr((*MemPage)(unsafe.Pointer(pOld2)).FaData) && Uptr(pCell) < Uptr((*MemPage)(unsafe.Pointer(pOld2)).FaDataEnd))) { goto __106 } if !!(leafCorrection != 0) { goto __107 } ptrmapPut(tls, pBt, Xsqlite3Get4byte(tls, pCell), uint8(PTRMAP_BTREE), (*MemPage)(unsafe.Pointer(pNew1)).Fpgno, bp+172) __107: ; if !(int32(cachedCellSize(tls, bp+8, i)) > int32((*MemPage)(unsafe.Pointer(pNew1)).FminLocal)) { goto __108 } ptrmapPutOvflPtr(tls, pNew1, pOld2, pCell, bp+172) __108: ; if !(*(*int32)(unsafe.Pointer(bp + 172)) != 0) { goto __109 } goto balance_cleanup __109: ; __106: ; goto __100 __100: i++ goto __99 goto __101 __101: ; __98: ; i = 0 __110: if !(i < nNew-1) { goto __112 } pNew2 = *(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)) j = *(*int32)(unsafe.Pointer(bp + 196 + uintptr(i)*4)) pCell1 = *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr(j)*8)) sz2 = int32(*(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr(j)*2))) + int32(leafCorrection) pTemp1 = aOvflSpace + uintptr(iOvflSpace) if !!(int32((*MemPage)(unsafe.Pointer(pNew2)).Fleaf) != 0) { goto __113 } libc.Xmemcpy(tls, (*MemPage)(unsafe.Pointer(pNew2)).FaData+8, pCell1, uint64(4)) goto __114 __113: if !(leafData != 0) { goto __115 } j-- (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pNew2)).FxParseCell})).f(tls, pNew2, *(*uintptr)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FapCell + uintptr(j)*8)), bp+288) pCell1 = pTemp1 sz2 = 4 + Xsqlite3PutVarint(tls, pCell1+4, uint64((*CellInfo)(unsafe.Pointer(bp+288)).FnKey)) pTemp1 = uintptr(0) goto __116 __115: pCell1 -= uintptr(4) if !(int32(*(*U16)(unsafe.Pointer((*CellArray)(unsafe.Pointer(bp+8)).FszCell + uintptr(j)*2))) == 4) { goto __117 } sz2 = int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pParent)).FxCellSize})).f(tls, pParent, pCell1)) __117: ; __116: ; __114: ; iOvflSpace = iOvflSpace + sz2 k = 0 __118: if !(*(*int32)(unsafe.Pointer(bp + 8 + 80 + uintptr(k)*4)) <= j && k < NB*2) { goto __120 } goto __119 __119: k++ goto __118 goto __120 __120: ; pSrcEnd = *(*uintptr)(unsafe.Pointer(bp + 8 + 32 + uintptr(k)*8)) if !(Uptr(pSrcEnd) >= Uptr(pCell1) && Uptr(pSrcEnd) < Uptr(pCell1+uintptr(sz2))) { goto __121 } *(*int32)(unsafe.Pointer(bp + 172)) = Xsqlite3CorruptError(tls, 76920) goto balance_cleanup __121: ; *(*int32)(unsafe.Pointer(bp + 172)) = insertCell(tls, pParent, nxDiv+i, pCell1, sz2, pTemp1, (*MemPage)(unsafe.Pointer(pNew2)).Fpgno) if !(*(*int32)(unsafe.Pointer(bp + 172)) != SQLITE_OK) { goto __122 } goto balance_cleanup __122: ; goto __111 __111: i++ goto __110 goto __112 __112: ; i = 1 - nNew __123: if !(i < nNew) { goto __125 } if i < 0 { iPg = -i } else { iPg = i } if !(*(*U8)(unsafe.Pointer(bp + uintptr(iPg))) != 0) { goto __126 } goto __124 __126: ; if !(i >= 0 || *(*int32)(unsafe.Pointer(bp + 176 + uintptr(iPg-1)*4)) >= *(*int32)(unsafe.Pointer(bp + 196 + uintptr(iPg-1)*4))) { goto __127 } if !(iPg == 0) { goto __128 } iNew1 = libc.AssignInt32(&iOld1, 0) nNewCell = *(*int32)(unsafe.Pointer(bp + 196)) goto __129 __128: if iPg < nOld { iOld1 = *(*int32)(unsafe.Pointer(bp + 176 + uintptr(iPg-1)*4)) + libc.BoolInt32(!(leafData != 0)) } else { iOld1 = (*CellArray)(unsafe.Pointer(bp + 8)).FnCell } iNew1 = *(*int32)(unsafe.Pointer(bp + 196 + uintptr(iPg-1)*4)) + libc.BoolInt32(!(leafData != 0)) nNewCell = *(*int32)(unsafe.Pointer(bp + 196 + uintptr(iPg)*4)) - iNew1 __129: ; *(*int32)(unsafe.Pointer(bp + 172)) = editPage(tls, *(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iPg)*8)), iOld1, iNew1, nNewCell, bp+8) if !(*(*int32)(unsafe.Pointer(bp + 172)) != 0) { goto __130 } goto balance_cleanup __130: ; *(*U8)(unsafe.Pointer(bp + uintptr(iPg)))++ (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(iPg)*8)))).FnFree = usableSpace - *(*int32)(unsafe.Pointer(bp + 152 + uintptr(iPg)*4)) __127: ; goto __124 __124: i++ goto __123 goto __125 __125: ; if !(isRoot != 0 && int32((*MemPage)(unsafe.Pointer(pParent)).FnCell) == 0 && int32((*MemPage)(unsafe.Pointer(pParent)).FhdrOffset) <= (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216)))).FnFree) { goto __131 } *(*int32)(unsafe.Pointer(bp + 172)) = defragmentPage(tls, *(*uintptr)(unsafe.Pointer(bp + 216)), -1) copyNodeContent(tls, *(*uintptr)(unsafe.Pointer(bp + 216)), pParent, bp+172) freePage(tls, *(*uintptr)(unsafe.Pointer(bp + 216)), bp+172) goto __132 __131: if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 && !(leafCorrection != 0)) { goto __133 } i = 0 __134: if !(i < nNew) { goto __136 } key = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).FaData+8) ptrmapPut(tls, pBt, key, uint8(PTRMAP_BTREE), (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8)))).Fpgno, bp+172) goto __135 __135: i++ goto __134 goto __136 __136: ; __133: ; __132: ; i = nNew __137: if !(i < nOld) { goto __139 } freePage(tls, *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8)), bp+172) goto __138 __138: i++ goto __137 goto __139 __139: ; balance_cleanup: Xsqlite3DbFree(tls, uintptr(0), (*CellArray)(unsafe.Pointer(bp+8)).FapCell) i = 0 __140: if !(i < nOld) { goto __142 } releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 112 + uintptr(i)*8))) goto __141 __141: i++ goto __140 goto __142 __142: ; i = 0 __143: if !(i < nNew) { goto __145 } releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 216 + uintptr(i)*8))) goto __144 __144: i++ goto __143 goto __145 __145: ; return *(*int32)(unsafe.Pointer(bp + 172)) } func balance_deeper(tls *libc.TLS, pRoot uintptr, ppChild uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*Pgno)(unsafe.Pointer(bp + 8)) = Pgno(0) var pBt uintptr = (*MemPage)(unsafe.Pointer(pRoot)).FpBt *(*int32)(unsafe.Pointer(bp + 12)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pRoot)).FpDbPage) if *(*int32)(unsafe.Pointer(bp + 12)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 12)) = allocateBtreePage(tls, pBt, bp, bp+8, (*MemPage)(unsafe.Pointer(pRoot)).Fpgno, uint8(0)) copyNodeContent(tls, pRoot, *(*uintptr)(unsafe.Pointer(bp)), bp+12) if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { ptrmapPut(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 8)), uint8(PTRMAP_BTREE), (*MemPage)(unsafe.Pointer(pRoot)).Fpgno, bp+12) } } if *(*int32)(unsafe.Pointer(bp + 12)) != 0 { *(*uintptr)(unsafe.Pointer(ppChild)) = uintptr(0) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) return *(*int32)(unsafe.Pointer(bp + 12)) } libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp))+28, pRoot+28, uint64((*MemPage)(unsafe.Pointer(pRoot)).FnOverflow)*uint64(unsafe.Sizeof(U16(0)))) libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp))+40, pRoot+40, uint64((*MemPage)(unsafe.Pointer(pRoot)).FnOverflow)*uint64(unsafe.Sizeof(uintptr(0)))) (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnOverflow = (*MemPage)(unsafe.Pointer(pRoot)).FnOverflow zeroPage(tls, pRoot, int32(*(*U8)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData)))&libc.CplInt32(PTF_LEAF)) Xsqlite3Put4byte(tls, (*MemPage)(unsafe.Pointer(pRoot)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pRoot)).FhdrOffset)+8), *(*Pgno)(unsafe.Pointer(bp + 8))) *(*uintptr)(unsafe.Pointer(ppChild)) = *(*uintptr)(unsafe.Pointer(bp)) return SQLITE_OK } func anotherValidCursor(tls *libc.TLS, pCur uintptr) int32 { var pOther uintptr for pOther = (*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FpCursor; pOther != 0; pOther = (*BtCursor)(unsafe.Pointer(pOther)).FpNext { if pOther != pCur && int32((*BtCursor)(unsafe.Pointer(pOther)).FeState) == CURSOR_VALID && (*BtCursor)(unsafe.Pointer(pOther)).FpPage == (*BtCursor)(unsafe.Pointer(pCur)).FpPage { return Xsqlite3CorruptError(tls, 77150) } } return SQLITE_OK } func balance(tls *libc.TLS, pCur uintptr) int32 { bp := tls.Alloc(13) defer tls.Free(13) var rc int32 = SQLITE_OK var pFree uintptr = uintptr(0) for __ccgo := true; __ccgo; __ccgo = rc == SQLITE_OK { var iPage int32 var pPage uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if (*MemPage)(unsafe.Pointer(pPage)).FnFree < 0 && btreeComputeFreeSpace(tls, pPage) != 0 { break } if int32((*MemPage)(unsafe.Pointer(pPage)).FnOverflow) == 0 && (*MemPage)(unsafe.Pointer(pPage)).FnFree*3 <= int32((*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FusableSize)*2 { break } else if libc.AssignInt32(&iPage, int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage)) == 0 { if (*MemPage)(unsafe.Pointer(pPage)).FnOverflow != 0 && libc.AssignInt32(&rc, anotherValidCursor(tls, pCur)) == SQLITE_OK { rc = balance_deeper(tls, pPage, pCur+144+1*8) if rc == SQLITE_OK { (*BtCursor)(unsafe.Pointer(pCur)).FiPage = int8(1) (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(0) *(*U16)(unsafe.Pointer(pCur + 88)) = U16(0) *(*uintptr)(unsafe.Pointer(pCur + 144)) = pPage (*BtCursor)(unsafe.Pointer(pCur)).FpPage = *(*uintptr)(unsafe.Pointer(pCur + 144 + 1*8)) } } else { break } } else if Xsqlite3PagerPageRefcount(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) > 1 { rc = Xsqlite3CorruptError(tls, 77210) } else { var pParent uintptr = *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr(iPage-1)*8)) var iIdx int32 = int32(*(*U16)(unsafe.Pointer(pCur + 88 + uintptr(iPage-1)*2))) rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pParent)).FpDbPage) if rc == SQLITE_OK && (*MemPage)(unsafe.Pointer(pParent)).FnFree < 0 { rc = btreeComputeFreeSpace(tls, pParent) } if rc == SQLITE_OK { if (*MemPage)(unsafe.Pointer(pPage)).FintKeyLeaf != 0 && int32((*MemPage)(unsafe.Pointer(pPage)).FnOverflow) == 1 && int32(*(*U16)(unsafe.Pointer(pPage + 28))) == int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) && (*MemPage)(unsafe.Pointer(pParent)).Fpgno != Pgno(1) && int32((*MemPage)(unsafe.Pointer(pParent)).FnCell) == iIdx { rc = balance_quick(tls, pParent, pPage, bp) } else { var pSpace uintptr = Xsqlite3PageMalloc(tls, int32((*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FpageSize)) rc = balance_nonroot(tls, pParent, iIdx, pSpace, libc.Bool32(iPage == 1), int32((*BtCursor)(unsafe.Pointer(pCur)).Fhints)&BTREE_BULKLOAD) if pFree != 0 { Xsqlite3PageFree(tls, pFree) } pFree = pSpace } } (*MemPage)(unsafe.Pointer(pPage)).FnOverflow = U8(0) releasePage(tls, pPage) (*BtCursor)(unsafe.Pointer(pCur)).FiPage-- (*BtCursor)(unsafe.Pointer(pCur)).FpPage = *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr((*BtCursor)(unsafe.Pointer(pCur)).FiPage)*8)) } } if pFree != 0 { Xsqlite3PageFree(tls, pFree) } return rc } func btreeOverwriteContent(tls *libc.TLS, pPage uintptr, pDest uintptr, pX uintptr, iOffset int32, iAmt int32) int32 { var nData int32 = (*BtreePayload)(unsafe.Pointer(pX)).FnData - iOffset if nData <= 0 { var i int32 for i = 0; i < iAmt && int32(*(*U8)(unsafe.Pointer(pDest + uintptr(i)))) == 0; i++ { } if i < iAmt { var rc int32 = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) if rc != 0 { return rc } libc.Xmemset(tls, pDest+uintptr(i), 0, uint64(iAmt-i)) } } else { if nData < iAmt { var rc int32 = btreeOverwriteContent(tls, pPage, pDest+uintptr(nData), pX, iOffset+nData, iAmt-nData) if rc != 0 { return rc } iAmt = nData } if libc.Xmemcmp(tls, pDest, (*BtreePayload)(unsafe.Pointer(pX)).FpData+uintptr(iOffset), uint64(iAmt)) != 0 { var rc int32 = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) if rc != 0 { return rc } libc.Xmemmove(tls, pDest, (*BtreePayload)(unsafe.Pointer(pX)).FpData+uintptr(iOffset), uint64(iAmt)) } } return SQLITE_OK } func btreeOverwriteOverflowCell(tls *libc.TLS, pCur uintptr, pX uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var iOffset int32 var nTotal int32 = (*BtreePayload)(unsafe.Pointer(pX)).FnData + (*BtreePayload)(unsafe.Pointer(pX)).FnZero var rc int32 *(*uintptr)(unsafe.Pointer(bp)) = (*BtCursor)(unsafe.Pointer(pCur)).FpPage var pBt uintptr var ovflPgno Pgno var ovflPageSize U32 rc = btreeOverwriteContent(tls, *(*uintptr)(unsafe.Pointer(bp)), (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload, pX, 0, int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal)) if rc != 0 { return rc } iOffset = int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) ovflPgno = Xsqlite3Get4byte(tls, (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload+uintptr(iOffset)) pBt = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpBt ovflPageSize = (*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(4) for __ccgo := true; __ccgo; __ccgo = iOffset < nTotal { rc = btreeGetPage(tls, pBt, ovflPgno, bp, 0) if rc != 0 { return rc } if Xsqlite3PagerPageRefcount(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) != 1 || (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FisInit != 0 { rc = Xsqlite3CorruptError(tls, 77374) } else { if U32(iOffset)+ovflPageSize < U32(nTotal) { ovflPgno = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData) } else { ovflPageSize = U32(nTotal - iOffset) } rc = btreeOverwriteContent(tls, *(*uintptr)(unsafe.Pointer(bp)), (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData+uintptr(4), pX, iOffset, int32(ovflPageSize)) } Xsqlite3PagerUnref(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) if rc != 0 { return rc } iOffset = int32(U32(iOffset) + ovflPageSize) } return SQLITE_OK } func btreeOverwriteCell(tls *libc.TLS, pCur uintptr, pX uintptr) int32 { var nTotal int32 = (*BtreePayload)(unsafe.Pointer(pX)).FnData + (*BtreePayload)(unsafe.Pointer(pX)).FnZero var pPage uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload+uintptr((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) > (*MemPage)(unsafe.Pointer(pPage)).FaDataEnd || (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload < (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr((*MemPage)(unsafe.Pointer(pPage)).FcellOffset) { return Xsqlite3CorruptError(tls, 77402) } if int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal) == nTotal { return btreeOverwriteContent(tls, pPage, (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FpPayload, pX, 0, int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnLocal)) } else { return btreeOverwriteOverflowCell(tls, pCur, pX) } return int32(0) } // Insert a new record into the BTree. The content of the new record // is described by the pX object. The pCur cursor is used only to // define what table the record should be inserted into, and is left // pointing at a random location. // // For a table btree (used for rowid tables), only the pX.nKey value of // the key is used. The pX.pKey value must be NULL. The pX.nKey is the // rowid or INTEGER PRIMARY KEY of the row. The pX.nData,pData,nZero fields // hold the content of the row. // // For an index btree (used for indexes and WITHOUT ROWID tables), the // key is an arbitrary byte sequence stored in pX.pKey,nKey. The // pX.pData,nData,nZero fields must be zero. // // If the seekResult parameter is non-zero, then a successful call to // sqlite3BtreeIndexMoveto() to seek cursor pCur to (pKey,nKey) has already // been performed. In other words, if seekResult!=0 then the cursor // is currently pointing to a cell that will be adjacent to the cell // to be inserted. If seekResult<0 then pCur points to a cell that is // smaller then (pKey,nKey). If seekResult>0 then pCur points to a cell // that is larger than (pKey,nKey). // // If seekResult==0, that means pCur is pointing at some unknown location. // In that case, this routine must seek the cursor to the correct insertion // point for (pKey,nKey) before doing the insertion. For index btrees, // if pX->nMem is non-zero, then pX->aMem contains pointers to the unpacked // key values and pX->aMem can be used instead of pX->pKey to avoid having // to decode the key. func Xsqlite3BtreeInsert(tls *libc.TLS, pCur uintptr, pX uintptr, flags int32, seekResult int32) int32 { bp := tls.Alloc(152) defer tls.Free(152) var idx int32 var pPage uintptr var p uintptr var oldCell uintptr var newCell uintptr var ovfl Pgno *(*int32)(unsafe.Pointer(bp)) = seekResult *(*int32)(unsafe.Pointer(bp + 124)) = 0 p = (*BtCursor)(unsafe.Pointer(pCur)).FpBtree newCell = uintptr(0) if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_Multiple != 0) { goto __1 } *(*int32)(unsafe.Pointer(bp + 120)) = saveAllCursors(tls, (*Btree)(unsafe.Pointer(p)).FpBt, (*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot, pCur) if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __2 } return *(*int32)(unsafe.Pointer(bp + 120)) __2: ; if !(*(*int32)(unsafe.Pointer(bp)) != 0 && int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) < 0) { goto __3 } return Xsqlite3CorruptError(tls, 77483) __3: ; __1: ; if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) >= CURSOR_REQUIRESEEK) { goto __4 } *(*int32)(unsafe.Pointer(bp + 120)) = moveToRoot(tls, pCur) if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0 && *(*int32)(unsafe.Pointer(bp + 120)) != SQLITE_EMPTY) { goto __5 } return *(*int32)(unsafe.Pointer(bp + 120)) __5: ; __4: ; if !((*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo == uintptr(0)) { goto __6 } if !((*Btree)(unsafe.Pointer(p)).FhasIncrblobCur != 0) { goto __8 } invalidateIncrblobCursors(tls, p, (*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot, (*BtreePayload)(unsafe.Pointer(pX)).FnKey, 0) __8: ; if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_ValidNKey != 0 && (*BtreePayload)(unsafe.Pointer(pX)).FnKey == (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey) { goto __9 } if !(int32((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize) != 0 && (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnPayload == U32((*BtreePayload)(unsafe.Pointer(pX)).FnData)+U32((*BtreePayload)(unsafe.Pointer(pX)).FnZero)) { goto __11 } return btreeOverwriteCell(tls, pCur, pX) __11: ; goto __10 __9: if !(*(*int32)(unsafe.Pointer(bp)) == 0) { goto __12 } *(*int32)(unsafe.Pointer(bp + 120)) = Xsqlite3BtreeTableMoveto(tls, pCur, (*BtreePayload)(unsafe.Pointer(pX)).FnKey, libc.Bool32(flags&BTREE_APPEND != 0), bp) if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __13 } return *(*int32)(unsafe.Pointer(bp + 120)) __13: ; __12: ; __10: ; goto __7 __6: ; if !(*(*int32)(unsafe.Pointer(bp)) == 0 && flags&BTREE_SAVEPOSITION == 0) { goto __14 } if !((*BtreePayload)(unsafe.Pointer(pX)).FnMem != 0) { goto __15 } (*UnpackedRecord)(unsafe.Pointer(bp + 8)).FpKeyInfo = (*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo (*UnpackedRecord)(unsafe.Pointer(bp + 8)).FaMem = (*BtreePayload)(unsafe.Pointer(pX)).FaMem (*UnpackedRecord)(unsafe.Pointer(bp + 8)).FnField = (*BtreePayload)(unsafe.Pointer(pX)).FnMem (*UnpackedRecord)(unsafe.Pointer(bp + 8)).Fdefault_rc = int8(0) (*UnpackedRecord)(unsafe.Pointer(bp + 8)).FeqSeen = U8(0) *(*int32)(unsafe.Pointer(bp + 120)) = Xsqlite3BtreeIndexMoveto(tls, pCur, bp+8, bp) goto __16 __15: *(*int32)(unsafe.Pointer(bp + 120)) = btreeMoveto(tls, pCur, (*BtreePayload)(unsafe.Pointer(pX)).FpKey, (*BtreePayload)(unsafe.Pointer(pX)).FnKey, libc.Bool32(flags&BTREE_APPEND != 0), bp) __16: ; if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __17 } return *(*int32)(unsafe.Pointer(bp + 120)) __17: ; __14: ; if !(*(*int32)(unsafe.Pointer(bp)) == 0) { goto __18 } getCellInfo(tls, pCur) if !((*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey == (*BtreePayload)(unsafe.Pointer(pX)).FnKey) { goto __19 } (*BtreePayload)(unsafe.Pointer(bp + 48)).FpData = (*BtreePayload)(unsafe.Pointer(pX)).FpKey (*BtreePayload)(unsafe.Pointer(bp + 48)).FnData = int32((*BtreePayload)(unsafe.Pointer(pX)).FnKey) (*BtreePayload)(unsafe.Pointer(bp + 48)).FnZero = 0 return btreeOverwriteCell(tls, pCur, bp+48) __19: ; __18: ; __7: ; pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if !((*MemPage)(unsafe.Pointer(pPage)).FnFree < 0) { goto __20 } if !(int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) > CURSOR_INVALID) { goto __21 } *(*int32)(unsafe.Pointer(bp + 120)) = Xsqlite3CorruptError(tls, 77606) goto __22 __21: *(*int32)(unsafe.Pointer(bp + 120)) = btreeComputeFreeSpace(tls, pPage) __22: ; if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __23 } return *(*int32)(unsafe.Pointer(bp + 120)) __23: ; __20: ; newCell = (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FpTmpSpace if !(flags&BTREE_PREFORMAT != 0) { goto __24 } *(*int32)(unsafe.Pointer(bp + 120)) = SQLITE_OK *(*int32)(unsafe.Pointer(bp + 124)) = (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FnPreformatSize if !(*(*int32)(unsafe.Pointer(bp + 124)) < 4) { goto __26 } *(*int32)(unsafe.Pointer(bp + 124)) = 4 __26: ; if !((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FautoVacuum != 0 && *(*int32)(unsafe.Pointer(bp + 124)) > int32((*MemPage)(unsafe.Pointer(pPage)).FmaxLocal)) { goto __27 } (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxParseCell})).f(tls, pPage, newCell, bp+96) if !((*CellInfo)(unsafe.Pointer(bp+96)).FnPayload != U32((*CellInfo)(unsafe.Pointer(bp+96)).FnLocal)) { goto __28 } ovfl = Xsqlite3Get4byte(tls, newCell+uintptr(*(*int32)(unsafe.Pointer(bp + 124))-4)) ptrmapPut(tls, (*Btree)(unsafe.Pointer(p)).FpBt, ovfl, uint8(PTRMAP_OVERFLOW1), (*MemPage)(unsafe.Pointer(pPage)).Fpgno, bp+120) if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __29 } goto end_insert __29: ; __28: ; __27: ; goto __25 __24: *(*int32)(unsafe.Pointer(bp + 120)) = fillInCell(tls, pPage, newCell, pX, bp+124) if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __30 } goto end_insert __30: ; __25: ; idx = int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnSize = U16(0) if !(*(*int32)(unsafe.Pointer(bp)) == 0) { goto __31 } if !(idx >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell)) { goto __33 } return Xsqlite3CorruptError(tls, 77645) __33: ; *(*int32)(unsafe.Pointer(bp + 120)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __34 } goto end_insert __34: ; oldCell = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*idx)))))) if !!(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { goto __35 } libc.Xmemcpy(tls, newCell, oldCell, uint64(4)) __35: ; (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxParseCell})).f(tls, pPage, oldCell, bp+128) if !(U32((*CellInfo)(unsafe.Pointer(bp+128)).FnLocal) != (*CellInfo)(unsafe.Pointer(bp+128)).FnPayload) { goto __36 } *(*int32)(unsafe.Pointer(bp + 120)) = clearCellOverflow(tls, pPage, oldCell, bp+128) goto __37 __36: *(*int32)(unsafe.Pointer(bp + 120)) = SQLITE_OK __37: ; *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidOvfl)) if !(int32((*CellInfo)(unsafe.Pointer(bp+128)).FnSize) == *(*int32)(unsafe.Pointer(bp + 124)) && U32((*CellInfo)(unsafe.Pointer(bp+128)).FnLocal) == (*CellInfo)(unsafe.Pointer(bp+128)).FnPayload && (!(int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FautoVacuum) != 0) || *(*int32)(unsafe.Pointer(bp + 124)) < int32((*MemPage)(unsafe.Pointer(pPage)).FminLocal))) { goto __38 } if !(oldCell < (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+uintptr(10)) { goto __39 } return Xsqlite3CorruptError(tls, 77672) __39: ; if !(oldCell+uintptr(*(*int32)(unsafe.Pointer(bp + 124))) > (*MemPage)(unsafe.Pointer(pPage)).FaDataEnd) { goto __40 } return Xsqlite3CorruptError(tls, 77675) __40: ; libc.Xmemcpy(tls, oldCell, newCell, uint64(*(*int32)(unsafe.Pointer(bp + 124)))) return SQLITE_OK __38: ; dropCell(tls, pPage, idx, int32((*CellInfo)(unsafe.Pointer(bp+128)).FnSize), bp+120) if !(*(*int32)(unsafe.Pointer(bp + 120)) != 0) { goto __41 } goto end_insert __41: ; goto __32 __31: if !(*(*int32)(unsafe.Pointer(bp)) < 0 && int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) > 0) { goto __42 } idx = int32(libc.PreIncUint16(&(*BtCursor)(unsafe.Pointer(pCur)).Fix, 1)) *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidNKey)) goto __43 __42: ; __43: ; __32: ; *(*int32)(unsafe.Pointer(bp + 120)) = insertCell(tls, pPage, idx, newCell, *(*int32)(unsafe.Pointer(bp + 124)), uintptr(0), uint32(0)) if !((*MemPage)(unsafe.Pointer(pPage)).FnOverflow != 0) { goto __44 } *(*U8)(unsafe.Pointer(pCur + 1)) &= libc.Uint8FromInt32(libc.CplInt32(BTCF_ValidNKey)) *(*int32)(unsafe.Pointer(bp + 120)) = balance(tls, pCur) (*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FnOverflow = U8(0) (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_INVALID) if !(flags&BTREE_SAVEPOSITION != 0 && *(*int32)(unsafe.Pointer(bp + 120)) == SQLITE_OK) { goto __45 } btreeReleaseAllCursorPages(tls, pCur) if !((*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo != 0) { goto __46 } (*BtCursor)(unsafe.Pointer(pCur)).FpKey = Xsqlite3Malloc(tls, uint64((*BtreePayload)(unsafe.Pointer(pX)).FnKey)) if !((*BtCursor)(unsafe.Pointer(pCur)).FpKey == uintptr(0)) { goto __47 } *(*int32)(unsafe.Pointer(bp + 120)) = SQLITE_NOMEM goto __48 __47: libc.Xmemcpy(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpKey, (*BtreePayload)(unsafe.Pointer(pX)).FpKey, uint64((*BtreePayload)(unsafe.Pointer(pX)).FnKey)) __48: ; __46: ; (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_REQUIRESEEK) (*BtCursor)(unsafe.Pointer(pCur)).FnKey = (*BtreePayload)(unsafe.Pointer(pX)).FnKey __45: ; __44: ; end_insert: return *(*int32)(unsafe.Pointer(bp + 120)) } // This function is used as part of copying the current row from cursor // pSrc into cursor pDest. If the cursors are open on intkey tables, then // parameter iKey is used as the rowid value when the record is copied // into pDest. Otherwise, the record is copied verbatim. // // This function does not actually write the new value to cursor pDest. // Instead, it creates and populates any required overflow pages and // writes the data for the new cell into the BtShared.pTmpSpace buffer // for the destination database. The size of the cell, in bytes, is left // in BtShared.nPreformatSize. The caller completes the insertion by // calling sqlite3BtreeInsert() with the BTREE_PREFORMAT flag specified. // // SQLITE_OK is returned if successful, or an SQLite error code otherwise. func Xsqlite3BtreeTransferRow(tls *libc.TLS, pDest uintptr, pSrc uintptr, iKey I64) int32 { bp := tls.Alloc(24) defer tls.Free(24) var pBt uintptr = (*BtCursor)(unsafe.Pointer(pDest)).FpBt var aOut uintptr = (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace var aIn uintptr var nIn U32 var nRem U32 getCellInfo(tls, pSrc) if (*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FnPayload < U32(0x80) { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&aOut, 1))) = U8((*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FnPayload) } else { aOut += uintptr(Xsqlite3PutVarint(tls, aOut, uint64((*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FnPayload))) } if (*BtCursor)(unsafe.Pointer(pDest)).FpKeyInfo == uintptr(0) { aOut += uintptr(Xsqlite3PutVarint(tls, aOut, uint64(iKey))) } nIn = U32((*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FnLocal) aIn = (*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FpPayload if aIn+uintptr(nIn) > (*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pSrc)).FpPage)).FaDataEnd { return Xsqlite3CorruptError(tls, 77777) } nRem = (*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FnPayload if nIn == nRem && nIn < U32((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pDest)).FpPage)).FmaxLocal) { libc.Xmemcpy(tls, aOut, aIn, uint64(nIn)) (*BtShared)(unsafe.Pointer(pBt)).FnPreformatSize = int32(int64(nIn) + (int64(aOut)-int64((*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace))/1) return SQLITE_OK } else { *(*int32)(unsafe.Pointer(bp + 20)) = SQLITE_OK var pSrcPager uintptr = (*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pSrc)).FpBt)).FpPager var pPgnoOut uintptr = uintptr(0) var ovflIn Pgno = Pgno(0) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var pPageOut uintptr = uintptr(0) var nOut U32 nOut = U32(btreePayloadToLocal(tls, (*BtCursor)(unsafe.Pointer(pDest)).FpPage, int64((*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FnPayload))) (*BtShared)(unsafe.Pointer(pBt)).FnPreformatSize = int32(int64(nOut) + (int64(aOut)-int64((*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace))/1) if nOut < (*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FnPayload { pPgnoOut = aOut + uintptr(nOut) *(*int32)(unsafe.Pointer(pBt + 144)) += 4 } if nRem > nIn { if aIn+uintptr(nIn)+uintptr(4) > (*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pSrc)).FpPage)).FaDataEnd { return Xsqlite3CorruptError(tls, 77802) } ovflIn = Xsqlite3Get4byte(tls, (*BtCursor)(unsafe.Pointer(pSrc)).Finfo.FpPayload+uintptr(nIn)) } for __ccgo := true; __ccgo; __ccgo = nRem > U32(0) && *(*int32)(unsafe.Pointer(bp + 20)) == SQLITE_OK { nRem = nRem - nOut for __ccgo1 := true; __ccgo1; __ccgo1 = *(*int32)(unsafe.Pointer(bp + 20)) == SQLITE_OK && nOut > U32(0) { if nIn > U32(0) { var nCopy int32 = func() int32 { if nOut < nIn { return int32(nOut) } return int32(nIn) }() libc.Xmemcpy(tls, aOut, aIn, uint64(nCopy)) nOut = nOut - U32(nCopy) nIn = nIn - U32(nCopy) aOut += uintptr(nCopy) aIn += uintptr(nCopy) } if nOut > U32(0) { Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 20)) = Xsqlite3PagerGet(tls, pSrcPager, ovflIn, bp, PAGER_GET_READONLY) if *(*int32)(unsafe.Pointer(bp + 20)) == SQLITE_OK { aIn = Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp))) ovflIn = Xsqlite3Get4byte(tls, aIn) aIn += uintptr(4) nIn = (*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pSrc)).FpBt)).FusableSize - U32(4) } } } if *(*int32)(unsafe.Pointer(bp + 20)) == SQLITE_OK && nRem > U32(0) && pPgnoOut != 0 { *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 20)) = allocateBtreePage(tls, pBt, bp+8, bp+16, uint32(0), uint8(0)) Xsqlite3Put4byte(tls, pPgnoOut, *(*Pgno)(unsafe.Pointer(bp + 16))) if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 && pPageOut != 0 { ptrmapPut(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 16)), uint8(PTRMAP_OVERFLOW2), (*MemPage)(unsafe.Pointer(pPageOut)).Fpgno, bp+20) } releasePage(tls, pPageOut) pPageOut = *(*uintptr)(unsafe.Pointer(bp + 8)) if pPageOut != 0 { pPgnoOut = (*MemPage)(unsafe.Pointer(pPageOut)).FaData Xsqlite3Put4byte(tls, pPgnoOut, uint32(0)) aOut = pPgnoOut + 4 nOut = func() uint32 { if (*BtShared)(unsafe.Pointer(pBt)).FusableSize-U32(4) < nRem { return (*BtShared)(unsafe.Pointer(pBt)).FusableSize - U32(4) } return nRem }() } } } releasePage(tls, pPageOut) Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) return *(*int32)(unsafe.Pointer(bp + 20)) } return int32(0) } // Delete the entry that the cursor is pointing to. // // If the BTREE_SAVEPOSITION bit of the flags parameter is zero, then // the cursor is left pointing at an arbitrary location after the delete. // But if that bit is set, then the cursor is left in a state such that // the next call to BtreeNext() or BtreePrev() moves it to the same row // as it would have been on if the call to BtreeDelete() had been omitted. // // The BTREE_AUXDELETE bit of flags indicates that is one of several deletes // associated with a single table entry and its indexes. Only one of those // deletes is considered the "primary" delete. The primary delete occurs // on a cursor that is not a BTREE_FORDELETE cursor. All but one delete // operation on non-FORDELETE cursors is tagged with the AUXDELETE flag. // The BTREE_AUXDELETE bit is a hint that is not used by this implementation, // but which might be used by alternative storage engines. func Xsqlite3BtreeDelete(tls *libc.TLS, pCur uintptr, flags U8) int32 { bp := tls.Alloc(28) defer tls.Free(28) var p uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpBtree var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var pPage uintptr var pCell uintptr var iCellIdx int32 var iCellDepth int32 var bPreserve U8 if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID { if int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) >= CURSOR_REQUIRESEEK { *(*int32)(unsafe.Pointer(bp + 24)) = btreeRestoreCursorPosition(tls, pCur) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 || int32((*BtCursor)(unsafe.Pointer(pCur)).FeState) != CURSOR_VALID { return *(*int32)(unsafe.Pointer(bp + 24)) } } else { return Xsqlite3CorruptError(tls, 77898) } } iCellDepth = int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) iCellIdx = int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) <= iCellIdx { return Xsqlite3CorruptError(tls, 77907) } pCell = (*MemPage)(unsafe.Pointer(pPage)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*iCellIdx)))))) if (*MemPage)(unsafe.Pointer(pPage)).FnFree < 0 && btreeComputeFreeSpace(tls, pPage) != 0 { return Xsqlite3CorruptError(tls, 77911) } bPreserve = U8(libc.Bool32(int32(flags)&BTREE_SAVEPOSITION != 0)) if bPreserve != 0 { if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) || (*MemPage)(unsafe.Pointer(pPage)).FnFree+int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxCellSize})).f(tls, pPage, pCell))+2 > int32((*BtShared)(unsafe.Pointer(pBt)).FusableSize*U32(2)/U32(3)) || int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) == 1 { *(*int32)(unsafe.Pointer(bp + 24)) = saveCursorKey(tls, pCur) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 { return *(*int32)(unsafe.Pointer(bp + 24)) } } else { bPreserve = U8(2) } } if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { *(*int32)(unsafe.Pointer(bp + 24)) = Xsqlite3BtreePrevious(tls, pCur, 0) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 { return *(*int32)(unsafe.Pointer(bp + 24)) } } if int32((*BtCursor)(unsafe.Pointer(pCur)).FcurFlags)&BTCF_Multiple != 0 { *(*int32)(unsafe.Pointer(bp + 24)) = saveAllCursors(tls, pBt, (*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot, pCur) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 { return *(*int32)(unsafe.Pointer(bp + 24)) } } if (*BtCursor)(unsafe.Pointer(pCur)).FpKeyInfo == uintptr(0) && (*Btree)(unsafe.Pointer(p)).FhasIncrblobCur != 0 { invalidateIncrblobCursors(tls, p, (*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot, (*BtCursor)(unsafe.Pointer(pCur)).Finfo.FnKey, 0) } *(*int32)(unsafe.Pointer(bp + 24)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pPage)).FpDbPage) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 { return *(*int32)(unsafe.Pointer(bp + 24)) } (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pPage)).FxParseCell})).f(tls, pPage, pCell, bp) if U32((*CellInfo)(unsafe.Pointer(bp)).FnLocal) != (*CellInfo)(unsafe.Pointer(bp)).FnPayload { *(*int32)(unsafe.Pointer(bp + 24)) = clearCellOverflow(tls, pPage, pCell, bp) } else { *(*int32)(unsafe.Pointer(bp + 24)) = SQLITE_OK } dropCell(tls, pPage, iCellIdx, int32((*CellInfo)(unsafe.Pointer(bp)).FnSize), bp+24) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 { return *(*int32)(unsafe.Pointer(bp + 24)) } if !(int32((*MemPage)(unsafe.Pointer(pPage)).Fleaf) != 0) { var pLeaf uintptr = (*BtCursor)(unsafe.Pointer(pCur)).FpPage var nCell int32 var n Pgno var pTmp uintptr if (*MemPage)(unsafe.Pointer(pLeaf)).FnFree < 0 { *(*int32)(unsafe.Pointer(bp + 24)) = btreeComputeFreeSpace(tls, pLeaf) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 { return *(*int32)(unsafe.Pointer(bp + 24)) } } if iCellDepth < int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage)-1 { n = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr(iCellDepth+1)*8)))).Fpgno } else { n = (*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).Fpgno } pCell = (*MemPage)(unsafe.Pointer(pLeaf)).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(pLeaf)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pLeaf)).FaCellIdx + uintptr(2*(int32((*MemPage)(unsafe.Pointer(pLeaf)).FnCell)-1))))))) if pCell < (*MemPage)(unsafe.Pointer(pLeaf)).FaData+4 { return Xsqlite3CorruptError(tls, 78002) } nCell = int32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(pLeaf)).FxCellSize})).f(tls, pLeaf, pCell)) pTmp = (*BtShared)(unsafe.Pointer(pBt)).FpTmpSpace *(*int32)(unsafe.Pointer(bp + 24)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(pLeaf)).FpDbPage) if *(*int32)(unsafe.Pointer(bp + 24)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 24)) = insertCell(tls, pPage, iCellIdx, pCell-uintptr(4), nCell+4, pTmp, n) } dropCell(tls, pLeaf, int32((*MemPage)(unsafe.Pointer(pLeaf)).FnCell)-1, nCell, bp+24) if *(*int32)(unsafe.Pointer(bp + 24)) != 0 { return *(*int32)(unsafe.Pointer(bp + 24)) } } if (*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FnFree*3 <= int32((*BtShared)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBt)).FusableSize)*2 { *(*int32)(unsafe.Pointer(bp + 24)) = SQLITE_OK } else { *(*int32)(unsafe.Pointer(bp + 24)) = balance(tls, pCur) } if *(*int32)(unsafe.Pointer(bp + 24)) == SQLITE_OK && int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) > iCellDepth { releasePageNotNull(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpPage) (*BtCursor)(unsafe.Pointer(pCur)).FiPage-- for int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) > iCellDepth { releasePage(tls, *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr(libc.PostDecInt8(&(*BtCursor)(unsafe.Pointer(pCur)).FiPage, 1))*8))) } (*BtCursor)(unsafe.Pointer(pCur)).FpPage = *(*uintptr)(unsafe.Pointer(pCur + 144 + uintptr((*BtCursor)(unsafe.Pointer(pCur)).FiPage)*8)) *(*int32)(unsafe.Pointer(bp + 24)) = balance(tls, pCur) } if *(*int32)(unsafe.Pointer(bp + 24)) == SQLITE_OK { if int32(bPreserve) > 1 { (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_SKIPNEXT) if iCellIdx >= int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) { (*BtCursor)(unsafe.Pointer(pCur)).FskipNext = -1 (*BtCursor)(unsafe.Pointer(pCur)).Fix = U16(int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) - 1) } else { (*BtCursor)(unsafe.Pointer(pCur)).FskipNext = 1 } } else { *(*int32)(unsafe.Pointer(bp + 24)) = moveToRoot(tls, pCur) if bPreserve != 0 { btreeReleaseAllCursorPages(tls, pCur) (*BtCursor)(unsafe.Pointer(pCur)).FeState = U8(CURSOR_REQUIRESEEK) } if *(*int32)(unsafe.Pointer(bp + 24)) == SQLITE_EMPTY { *(*int32)(unsafe.Pointer(bp + 24)) = SQLITE_OK } } } return *(*int32)(unsafe.Pointer(bp + 24)) } func btreeCreateTable(tls *libc.TLS, p uintptr, piTable uintptr, createTabFlags int32) int32 { bp := tls.Alloc(44) defer tls.Free(44) var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var ptfFlags int32 if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { invalidateAllOverflowCache(tls, pBt) Xsqlite3BtreeGetMeta(tls, p, BTREE_LARGEST_ROOT_PAGE, bp) if *(*Pgno)(unsafe.Pointer(bp)) > btreePagecount(tls, pBt) { return Xsqlite3CorruptError(tls, 78118) } *(*Pgno)(unsafe.Pointer(bp))++ for *(*Pgno)(unsafe.Pointer(bp)) == ptrmapPageno(tls, pBt, *(*Pgno)(unsafe.Pointer(bp))) || *(*Pgno)(unsafe.Pointer(bp)) == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) { *(*Pgno)(unsafe.Pointer(bp))++ } *(*int32)(unsafe.Pointer(bp + 40)) = allocateBtreePage(tls, pBt, bp+8, bp+16, *(*Pgno)(unsafe.Pointer(bp)), uint8(BTALLOC_EXACT)) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 40)) } if *(*Pgno)(unsafe.Pointer(bp + 16)) != *(*Pgno)(unsafe.Pointer(bp)) { *(*U8)(unsafe.Pointer(bp + 32)) = U8(0) *(*Pgno)(unsafe.Pointer(bp + 36)) = Pgno(0) *(*int32)(unsafe.Pointer(bp + 40)) = saveAllCursors(tls, pBt, uint32(0), uintptr(0)) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 40)) } *(*int32)(unsafe.Pointer(bp + 40)) = btreeGetPage(tls, pBt, *(*Pgno)(unsafe.Pointer(bp)), bp+24, 0) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 40)) } *(*int32)(unsafe.Pointer(bp + 40)) = ptrmapGet(tls, pBt, *(*Pgno)(unsafe.Pointer(bp)), bp+32, bp+36) if int32(*(*U8)(unsafe.Pointer(bp + 32))) == PTRMAP_ROOTPAGE || int32(*(*U8)(unsafe.Pointer(bp + 32))) == PTRMAP_FREEPAGE { *(*int32)(unsafe.Pointer(bp + 40)) = Xsqlite3CorruptError(tls, 78166) } if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) return *(*int32)(unsafe.Pointer(bp + 40)) } *(*int32)(unsafe.Pointer(bp + 40)) = relocatePage(tls, pBt, *(*uintptr)(unsafe.Pointer(bp + 24)), *(*U8)(unsafe.Pointer(bp + 32)), *(*Pgno)(unsafe.Pointer(bp + 36)), *(*Pgno)(unsafe.Pointer(bp + 16)), 0) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 40)) } *(*int32)(unsafe.Pointer(bp + 40)) = btreeGetPage(tls, pBt, *(*Pgno)(unsafe.Pointer(bp)), bp+24, 0) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 40)) } *(*int32)(unsafe.Pointer(bp + 40)) = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).FpDbPage) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) return *(*int32)(unsafe.Pointer(bp + 40)) } } else { *(*uintptr)(unsafe.Pointer(bp + 24)) = *(*uintptr)(unsafe.Pointer(bp + 8)) } ptrmapPut(tls, pBt, *(*Pgno)(unsafe.Pointer(bp)), uint8(PTRMAP_ROOTPAGE), uint32(0), bp+40) if *(*int32)(unsafe.Pointer(bp + 40)) != 0 { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) return *(*int32)(unsafe.Pointer(bp + 40)) } *(*int32)(unsafe.Pointer(bp + 40)) = Xsqlite3BtreeUpdateMeta(tls, p, 4, *(*Pgno)(unsafe.Pointer(bp))) if *(*int32)(unsafe.Pointer(bp + 40)) != 0 { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) return *(*int32)(unsafe.Pointer(bp + 40)) } } else { *(*int32)(unsafe.Pointer(bp + 40)) = allocateBtreePage(tls, pBt, bp+24, bp, uint32(1), uint8(0)) if *(*int32)(unsafe.Pointer(bp + 40)) != 0 { return *(*int32)(unsafe.Pointer(bp + 40)) } } if createTabFlags&BTREE_INTKEY != 0 { ptfFlags = PTF_INTKEY | PTF_LEAFDATA | PTF_LEAF } else { ptfFlags = PTF_ZERODATA | PTF_LEAF } zeroPage(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), ptfFlags) Xsqlite3PagerUnref(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).FpDbPage) *(*Pgno)(unsafe.Pointer(piTable)) = *(*Pgno)(unsafe.Pointer(bp)) return SQLITE_OK } func Xsqlite3BtreeCreateTable(tls *libc.TLS, p uintptr, piTable uintptr, flags int32) int32 { var rc int32 Xsqlite3BtreeEnter(tls, p) rc = btreeCreateTable(tls, p, piTable, flags) Xsqlite3BtreeLeave(tls, p) return rc } func clearDatabasePage(tls *libc.TLS, pBt uintptr, pgno Pgno, freePageFlag int32, pnChange uintptr) int32 { bp := tls.Alloc(36) defer tls.Free(36) var pCell uintptr var i int32 var hdr int32 if !(pgno > btreePagecount(tls, pBt)) { goto __1 } return Xsqlite3CorruptError(tls, 78256) __1: ; *(*int32)(unsafe.Pointer(bp + 32)) = getAndInitPage(tls, pBt, pgno, bp, uintptr(0), 0) if !(*(*int32)(unsafe.Pointer(bp + 32)) != 0) { goto __2 } return *(*int32)(unsafe.Pointer(bp + 32)) __2: ; if !(int32((*BtShared)(unsafe.Pointer(pBt)).FopenFlags)&BTREE_SINGLE == 0 && Xsqlite3PagerPageRefcount(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage) != 1+libc.Bool32(pgno == Pgno(1))) { goto __3 } *(*int32)(unsafe.Pointer(bp + 32)) = Xsqlite3CorruptError(tls, 78263) goto cleardatabasepage_out __3: ; hdr = int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FhdrOffset) i = 0 __4: if !(i < int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnCell)) { goto __6 } pCell = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData + uintptr(int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaCellIdx + uintptr(2*i)))))) if !!(int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fleaf) != 0) { goto __7 } *(*int32)(unsafe.Pointer(bp + 32)) = clearDatabasePage(tls, pBt, Xsqlite3Get4byte(tls, pCell), 1, pnChange) if !(*(*int32)(unsafe.Pointer(bp + 32)) != 0) { goto __8 } goto cleardatabasepage_out __8: ; __7: ; (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FxParseCell})).f(tls, *(*uintptr)(unsafe.Pointer(bp)), pCell, bp+8) if !(U32((*CellInfo)(unsafe.Pointer(bp+8)).FnLocal) != (*CellInfo)(unsafe.Pointer(bp+8)).FnPayload) { goto __9 } *(*int32)(unsafe.Pointer(bp + 32)) = clearCellOverflow(tls, *(*uintptr)(unsafe.Pointer(bp)), pCell, bp+8) goto __10 __9: *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_OK __10: ; if !(*(*int32)(unsafe.Pointer(bp + 32)) != 0) { goto __11 } goto cleardatabasepage_out __11: ; goto __5 __5: i++ goto __4 goto __6 __6: ; if !!(int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fleaf) != 0) { goto __12 } *(*int32)(unsafe.Pointer(bp + 32)) = clearDatabasePage(tls, pBt, Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData+uintptr(hdr+8)), 1, pnChange) if !(*(*int32)(unsafe.Pointer(bp + 32)) != 0) { goto __13 } goto cleardatabasepage_out __13: ; if !((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FintKey != 0) { goto __14 } pnChange = uintptr(0) __14: ; __12: ; if !(pnChange != 0) { goto __15 } *(*I64)(unsafe.Pointer(pnChange)) += I64((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnCell) __15: ; if !(freePageFlag != 0) { goto __16 } freePage(tls, *(*uintptr)(unsafe.Pointer(bp)), bp+32) goto __17 __16: if !(libc.AssignPtrInt32(bp+32, Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FpDbPage)) == 0) { goto __18 } zeroPage(tls, *(*uintptr)(unsafe.Pointer(bp)), int32(*(*U8)(unsafe.Pointer((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaData + uintptr(hdr))))|PTF_LEAF) __18: ; __17: ; cleardatabasepage_out: releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) return *(*int32)(unsafe.Pointer(bp + 32)) } // Delete all information from a single table in the database. iTable is // the page number of the root of the table. After this routine returns, // the root page is empty, but still exists. // // This routine will fail with SQLITE_LOCKED if there are any open // read cursors on the table. Open write cursors are moved to the // root of the table. // // If pnChange is not NULL, then the integer value pointed to by pnChange // is incremented by the number of entries in the table. func Xsqlite3BtreeClearTable(tls *libc.TLS, p uintptr, iTable int32, pnChange uintptr) int32 { var rc int32 var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) rc = saveAllCursors(tls, pBt, Pgno(iTable), uintptr(0)) if SQLITE_OK == rc { if (*Btree)(unsafe.Pointer(p)).FhasIncrblobCur != 0 { invalidateIncrblobCursors(tls, p, Pgno(iTable), int64(0), 1) } rc = clearDatabasePage(tls, pBt, Pgno(iTable), 0, pnChange) } Xsqlite3BtreeLeave(tls, p) return rc } // Delete all information from the single table that pCur is open on. // // This routine only work for pCur on an ephemeral table. func Xsqlite3BtreeClearTableOfCursor(tls *libc.TLS, pCur uintptr) int32 { return Xsqlite3BtreeClearTable(tls, (*BtCursor)(unsafe.Pointer(pCur)).FpBtree, int32((*BtCursor)(unsafe.Pointer(pCur)).FpgnoRoot), uintptr(0)) } func btreeDropTable(tls *libc.TLS, p uintptr, iTable Pgno, piMoved uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt if iTable > btreePagecount(tls, pBt) { return Xsqlite3CorruptError(tls, 78367) } *(*int32)(unsafe.Pointer(bp + 12)) = Xsqlite3BtreeClearTable(tls, p, int32(iTable), uintptr(0)) if *(*int32)(unsafe.Pointer(bp + 12)) != 0 { return *(*int32)(unsafe.Pointer(bp + 12)) } *(*int32)(unsafe.Pointer(bp + 12)) = btreeGetPage(tls, pBt, iTable, bp, 0) if *(*int32)(unsafe.Pointer(bp + 12)) != 0 { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) return *(*int32)(unsafe.Pointer(bp + 12)) } *(*int32)(unsafe.Pointer(piMoved)) = 0 if (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 { Xsqlite3BtreeGetMeta(tls, p, BTREE_LARGEST_ROOT_PAGE, bp+8) if iTable == *(*Pgno)(unsafe.Pointer(bp + 8)) { freePage(tls, *(*uintptr)(unsafe.Pointer(bp)), bp+12) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) if *(*int32)(unsafe.Pointer(bp + 12)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 12)) } } else { releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) *(*int32)(unsafe.Pointer(bp + 12)) = btreeGetPage(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 8)), bp+16, 0) if *(*int32)(unsafe.Pointer(bp + 12)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 12)) } *(*int32)(unsafe.Pointer(bp + 12)) = relocatePage(tls, pBt, *(*uintptr)(unsafe.Pointer(bp + 16)), uint8(PTRMAP_ROOTPAGE), uint32(0), iTable, 0) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if *(*int32)(unsafe.Pointer(bp + 12)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 12)) } *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 12)) = btreeGetPage(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 8)), bp+16, 0) freePage(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), bp+12) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if *(*int32)(unsafe.Pointer(bp + 12)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 12)) } *(*int32)(unsafe.Pointer(piMoved)) = int32(*(*Pgno)(unsafe.Pointer(bp + 8))) } *(*Pgno)(unsafe.Pointer(bp + 8))-- for *(*Pgno)(unsafe.Pointer(bp + 8)) == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize+U32(1) || ptrmapPageno(tls, pBt, *(*Pgno)(unsafe.Pointer(bp + 8))) == *(*Pgno)(unsafe.Pointer(bp + 8)) { *(*Pgno)(unsafe.Pointer(bp + 8))-- } *(*int32)(unsafe.Pointer(bp + 12)) = Xsqlite3BtreeUpdateMeta(tls, p, 4, *(*Pgno)(unsafe.Pointer(bp + 8))) } else { freePage(tls, *(*uintptr)(unsafe.Pointer(bp)), bp+12) releasePage(tls, *(*uintptr)(unsafe.Pointer(bp))) } return *(*int32)(unsafe.Pointer(bp + 12)) } func Xsqlite3BtreeDropTable(tls *libc.TLS, p uintptr, iTable int32, piMoved uintptr) int32 { var rc int32 Xsqlite3BtreeEnter(tls, p) rc = btreeDropTable(tls, p, uint32(iTable), piMoved) Xsqlite3BtreeLeave(tls, p) return rc } // This function may only be called if the b-tree connection already // has a read or write transaction open on the database. // // Read the meta-information out of a database file. Meta[0] // is the number of free pages currently in the database. Meta[1] // through meta[15] are available for use by higher layers. Meta[0] // is read-only, the others are read/write. // // The schema layer numbers meta values differently. At the schema // layer (and the SetCookie and ReadCookie opcodes) the number of // free pages is not visible. So Cookie[0] is the same as Meta[1]. // // This routine treats Meta[BTREE_DATA_VERSION] as a special case. Instead // of reading the value out of the header, it instead loads the "DataVersion" // from the pager. The BTREE_DATA_VERSION value is not actually stored in the // database file. It is a number computed by the pager. But its access // pattern is the same as header meta values, and so it is convenient to // read it from this routine. func Xsqlite3BtreeGetMeta(tls *libc.TLS, p uintptr, idx int32, pMeta uintptr) { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) if idx == BTREE_DATA_VERSION { *(*U32)(unsafe.Pointer(pMeta)) = Xsqlite3PagerDataVersion(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) + (*Btree)(unsafe.Pointer(p)).FiBDataVersion } else { *(*U32)(unsafe.Pointer(pMeta)) = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+uintptr(36+idx*4)) } Xsqlite3BtreeLeave(tls, p) } // Write meta-information back into the database. Meta[0] is // read-only and may not be written. func Xsqlite3BtreeUpdateMeta(tls *libc.TLS, p uintptr, idx int32, iMeta U32) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt var pP1 uintptr var rc int32 Xsqlite3BtreeEnter(tls, p) pP1 = (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FpDbPage) if rc == SQLITE_OK { Xsqlite3Put4byte(tls, pP1+uintptr(36+idx*4), iMeta) if idx == BTREE_INCR_VACUUM { (*BtShared)(unsafe.Pointer(pBt)).FincrVacuum = U8(iMeta) } } Xsqlite3BtreeLeave(tls, p) return rc } // The first argument, pCur, is a cursor opened on some b-tree. Count the // number of entries in the b-tree and write the result to *pnEntry. // // SQLITE_OK is returned if the operation is successfully executed. // Otherwise, if an error is encountered (i.e. an IO error or database // corruption) an SQLite error code is returned. func Xsqlite3BtreeCount(tls *libc.TLS, db uintptr, pCur uintptr, pnEntry uintptr) int32 { var nEntry I64 = int64(0) var rc int32 rc = moveToRoot(tls, pCur) if rc == SQLITE_EMPTY { *(*I64)(unsafe.Pointer(pnEntry)) = int64(0) return SQLITE_OK } for rc == SQLITE_OK && !(libc.AtomicLoadNInt32(db+432, 0) != 0) { var iIdx int32 var pPage uintptr pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage if (*MemPage)(unsafe.Pointer(pPage)).Fleaf != 0 || !(int32((*MemPage)(unsafe.Pointer(pPage)).FintKey) != 0) { nEntry = nEntry + I64((*MemPage)(unsafe.Pointer(pPage)).FnCell) } if (*MemPage)(unsafe.Pointer(pPage)).Fleaf != 0 { for __ccgo := true; __ccgo; __ccgo = int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) >= int32((*MemPage)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpPage)).FnCell) { if int32((*BtCursor)(unsafe.Pointer(pCur)).FiPage) == 0 { *(*I64)(unsafe.Pointer(pnEntry)) = nEntry return moveToRoot(tls, pCur) } moveToParent(tls, pCur) } (*BtCursor)(unsafe.Pointer(pCur)).Fix++ pPage = (*BtCursor)(unsafe.Pointer(pCur)).FpPage } iIdx = int32((*BtCursor)(unsafe.Pointer(pCur)).Fix) if iIdx == int32((*MemPage)(unsafe.Pointer(pPage)).FnCell) { rc = moveToChild(tls, pCur, Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FhdrOffset)+8))) } else { rc = moveToChild(tls, pCur, Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer(pPage)).FaData+uintptr(int32((*MemPage)(unsafe.Pointer(pPage)).FmaskPage)&int32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer((*MemPage)(unsafe.Pointer(pPage)).FaCellIdx + uintptr(2*iIdx)))))))) } } return rc } // Return the pager associated with a BTree. This routine is used for // testing and debugging only. func Xsqlite3BtreePager(tls *libc.TLS, p uintptr) uintptr { return (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FpPager } func checkOom(tls *libc.TLS, pCheck uintptr) { (*IntegrityCk)(unsafe.Pointer(pCheck)).Frc = SQLITE_NOMEM (*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr = 0 if (*IntegrityCk)(unsafe.Pointer(pCheck)).FnErr == 0 { (*IntegrityCk)(unsafe.Pointer(pCheck)).FnErr++ } } func checkProgress(tls *libc.TLS, pCheck uintptr) { var db uintptr = (*IntegrityCk)(unsafe.Pointer(pCheck)).Fdb if libc.AtomicLoadNInt32(db+432, 0) != 0 { (*IntegrityCk)(unsafe.Pointer(pCheck)).Frc = SQLITE_INTERRUPT (*IntegrityCk)(unsafe.Pointer(pCheck)).FnErr++ (*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr = 0 } if (*Sqlite3)(unsafe.Pointer(db)).FxProgress != 0 { (*IntegrityCk)(unsafe.Pointer(pCheck)).FnStep++ if (*IntegrityCk)(unsafe.Pointer(pCheck)).FnStep%(*Sqlite3)(unsafe.Pointer(db)).FnProgressOps == U32(0) && (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxProgress})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpProgressArg) != 0 { (*IntegrityCk)(unsafe.Pointer(pCheck)).Frc = SQLITE_INTERRUPT (*IntegrityCk)(unsafe.Pointer(pCheck)).FnErr++ (*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr = 0 } } } func checkAppendMsg(tls *libc.TLS, pCheck uintptr, zFormat uintptr, va uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var ap Va_list _ = ap checkProgress(tls, pCheck) if !((*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr != 0) { return } (*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr-- (*IntegrityCk)(unsafe.Pointer(pCheck)).FnErr++ ap = va if (*IntegrityCk)(unsafe.Pointer(pCheck)).FerrMsg.FnChar != 0 { Xsqlite3_str_append(tls, pCheck+64, ts+5414, 1) } if (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx != 0 { Xsqlite3_str_appendf(tls, pCheck+64, (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx, libc.VaList(bp, (*IntegrityCk)(unsafe.Pointer(pCheck)).Fv1, (*IntegrityCk)(unsafe.Pointer(pCheck)).Fv2)) } Xsqlite3_str_vappendf(tls, pCheck+64, zFormat, ap) _ = ap if int32((*IntegrityCk)(unsafe.Pointer(pCheck)).FerrMsg.FaccError) == SQLITE_NOMEM { checkOom(tls, pCheck) } } func getPageReferenced(tls *libc.TLS, pCheck uintptr, iPg Pgno) int32 { return int32(*(*U8)(unsafe.Pointer((*IntegrityCk)(unsafe.Pointer(pCheck)).FaPgRef + uintptr(iPg/Pgno(8))))) & (int32(1) << (iPg & Pgno(0x07))) } func setPageReferenced(tls *libc.TLS, pCheck uintptr, iPg Pgno) { *(*U8)(unsafe.Pointer((*IntegrityCk)(unsafe.Pointer(pCheck)).FaPgRef + uintptr(iPg/Pgno(8)))) |= U8(int32(1) << (iPg & Pgno(0x07))) } func checkRef(tls *libc.TLS, pCheck uintptr, iPage Pgno) int32 { bp := tls.Alloc(16) defer tls.Free(16) if iPage > (*IntegrityCk)(unsafe.Pointer(pCheck)).FnPage || iPage == Pgno(0) { checkAppendMsg(tls, pCheck, ts+5416, libc.VaList(bp, iPage)) return 1 } if getPageReferenced(tls, pCheck, iPage) != 0 { checkAppendMsg(tls, pCheck, ts+5439, libc.VaList(bp+8, iPage)) return 1 } setPageReferenced(tls, pCheck, iPage) return 0 } func checkPtrmap(tls *libc.TLS, pCheck uintptr, iChild Pgno, eType U8, iParent Pgno) { bp := tls.Alloc(56) defer tls.Free(56) var rc int32 rc = ptrmapGet(tls, (*IntegrityCk)(unsafe.Pointer(pCheck)).FpBt, iChild, bp+48, bp+52) if rc != SQLITE_OK { if rc == SQLITE_NOMEM || rc == SQLITE_IOERR|int32(12)<<8 { checkOom(tls, pCheck) } checkAppendMsg(tls, pCheck, ts+5464, libc.VaList(bp, iChild)) return } if int32(*(*U8)(unsafe.Pointer(bp + 48))) != int32(eType) || *(*Pgno)(unsafe.Pointer(bp + 52)) != iParent { checkAppendMsg(tls, pCheck, ts+5493, libc.VaList(bp+8, iChild, int32(eType), iParent, int32(*(*U8)(unsafe.Pointer(bp + 48))), *(*Pgno)(unsafe.Pointer(bp + 52)))) } } func checkList(tls *libc.TLS, pCheck uintptr, isFreeList int32, iPage Pgno, N U32) { bp := tls.Alloc(48) defer tls.Free(48) var i int32 var expected U32 = N var nErrAtStart int32 = (*IntegrityCk)(unsafe.Pointer(pCheck)).FnErr for iPage != Pgno(0) && (*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr != 0 { var pOvflData uintptr if checkRef(tls, pCheck, iPage) != 0 { break } N-- if Xsqlite3PagerGet(tls, (*IntegrityCk)(unsafe.Pointer(pCheck)).FpPager, iPage, bp+40, 0) != 0 { checkAppendMsg(tls, pCheck, ts+5547, libc.VaList(bp, iPage)) break } pOvflData = Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp + 40))) if isFreeList != 0 { var n U32 = Xsqlite3Get4byte(tls, pOvflData+4) if (*BtShared)(unsafe.Pointer((*IntegrityCk)(unsafe.Pointer(pCheck)).FpBt)).FautoVacuum != 0 { checkPtrmap(tls, pCheck, iPage, uint8(PTRMAP_FREEPAGE), uint32(0)) } if n > (*BtShared)(unsafe.Pointer((*IntegrityCk)(unsafe.Pointer(pCheck)).FpBt)).FusableSize/U32(4)-U32(2) { checkAppendMsg(tls, pCheck, ts+5569, libc.VaList(bp+8, iPage)) N-- } else { for i = 0; i < int32(n); i++ { var iFreePage Pgno = Xsqlite3Get4byte(tls, pOvflData+uintptr(8+i*4)) if (*BtShared)(unsafe.Pointer((*IntegrityCk)(unsafe.Pointer(pCheck)).FpBt)).FautoVacuum != 0 { checkPtrmap(tls, pCheck, iFreePage, uint8(PTRMAP_FREEPAGE), uint32(0)) } checkRef(tls, pCheck, iFreePage) } N = N - n } } else { if (*BtShared)(unsafe.Pointer((*IntegrityCk)(unsafe.Pointer(pCheck)).FpBt)).FautoVacuum != 0 && N > U32(0) { i = int32(Xsqlite3Get4byte(tls, pOvflData)) checkPtrmap(tls, pCheck, uint32(i), uint8(PTRMAP_OVERFLOW2), iPage) } } iPage = Xsqlite3Get4byte(tls, pOvflData) Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp + 40))) } if N != 0 && nErrAtStart == (*IntegrityCk)(unsafe.Pointer(pCheck)).FnErr { checkAppendMsg(tls, pCheck, ts+5608, libc.VaList(bp+16, func() uintptr { if isFreeList != 0 { return ts + 5634 } return ts + 5639 }(), expected-N, expected)) } } func btreeHeapInsert(tls *libc.TLS, aHeap uintptr, x U32) { var j U32 var i U32 i = libc.PreIncUint32(&*(*U32)(unsafe.Pointer(aHeap)), 1) *(*U32)(unsafe.Pointer(aHeap + uintptr(i)*4)) = x for libc.AssignUint32(&j, i/U32(2)) > U32(0) && *(*U32)(unsafe.Pointer(aHeap + uintptr(j)*4)) > *(*U32)(unsafe.Pointer(aHeap + uintptr(i)*4)) { x = *(*U32)(unsafe.Pointer(aHeap + uintptr(j)*4)) *(*U32)(unsafe.Pointer(aHeap + uintptr(j)*4)) = *(*U32)(unsafe.Pointer(aHeap + uintptr(i)*4)) *(*U32)(unsafe.Pointer(aHeap + uintptr(i)*4)) = x i = j } } func btreeHeapPull(tls *libc.TLS, aHeap uintptr, pOut uintptr) int32 { var j U32 var i U32 var x U32 if libc.AssignUint32(&x, *(*U32)(unsafe.Pointer(aHeap))) == U32(0) { return 0 } *(*U32)(unsafe.Pointer(pOut)) = *(*U32)(unsafe.Pointer(aHeap + 1*4)) *(*U32)(unsafe.Pointer(aHeap + 1*4)) = *(*U32)(unsafe.Pointer(aHeap + uintptr(x)*4)) *(*U32)(unsafe.Pointer(aHeap + uintptr(x)*4)) = 0xffffffff *(*U32)(unsafe.Pointer(aHeap))-- i = U32(1) for libc.AssignUint32(&j, i*U32(2)) <= *(*U32)(unsafe.Pointer(aHeap)) { if *(*U32)(unsafe.Pointer(aHeap + uintptr(j)*4)) > *(*U32)(unsafe.Pointer(aHeap + uintptr(j+U32(1))*4)) { j++ } if *(*U32)(unsafe.Pointer(aHeap + uintptr(i)*4)) < *(*U32)(unsafe.Pointer(aHeap + uintptr(j)*4)) { break } x = *(*U32)(unsafe.Pointer(aHeap + uintptr(i)*4)) *(*U32)(unsafe.Pointer(aHeap + uintptr(i)*4)) = *(*U32)(unsafe.Pointer(aHeap + uintptr(j)*4)) *(*U32)(unsafe.Pointer(aHeap + uintptr(j)*4)) = x i = j } return 1 } func checkTreePage(tls *libc.TLS, pCheck uintptr, iPage Pgno, piMinKey uintptr, maxKey I64) int32 { bp := tls.Alloc(140) defer tls.Free(140) *(*I64)(unsafe.Pointer(bp + 104)) = maxKey var i int32 var rc int32 var depth int32 var d2 int32 var pgno int32 var nFrag int32 var hdr int32 var cellStart int32 var nCell int32 var doCoverageCheck int32 var keyCanBeEqual int32 var data uintptr var pCell uintptr var pCellIdx uintptr var pBt uintptr var pc U32 var usableSize U32 var contentOffset U32 var heap uintptr var prev U32 var saved_zPfx uintptr var saved_v1 int32 var saved_v2 int32 var savedIsInit U8 var nPage U32 var pgnoOvfl Pgno var size U32 var size1 int32 var j int32 *(*uintptr)(unsafe.Pointer(bp + 96)) = uintptr(0) depth = -1 doCoverageCheck = 1 keyCanBeEqual = 1 heap = uintptr(0) prev = U32(0) saved_zPfx = (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx saved_v1 = int32((*IntegrityCk)(unsafe.Pointer(pCheck)).Fv1) saved_v2 = (*IntegrityCk)(unsafe.Pointer(pCheck)).Fv2 savedIsInit = U8(0) checkProgress(tls, pCheck) if !((*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr == 0) { goto __1 } goto end_of_check __1: ; pBt = (*IntegrityCk)(unsafe.Pointer(pCheck)).FpBt usableSize = (*BtShared)(unsafe.Pointer(pBt)).FusableSize if !(iPage == Pgno(0)) { goto __2 } return 0 __2: ; if !(checkRef(tls, pCheck, iPage) != 0) { goto __3 } return 0 __3: ; (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx = ts + 5660 (*IntegrityCk)(unsafe.Pointer(pCheck)).Fv1 = iPage if !(libc.AssignInt32(&rc, btreeGetPage(tls, pBt, iPage, bp+96, 0)) != 0) { goto __4 } checkAppendMsg(tls, pCheck, ts+5670, libc.VaList(bp, rc)) goto end_of_check __4: ; savedIsInit = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FisInit (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FisInit = U8(0) if !(libc.AssignInt32(&rc, btreeInitPage(tls, *(*uintptr)(unsafe.Pointer(bp + 96)))) != 0) { goto __5 } checkAppendMsg(tls, pCheck, ts+5708, libc.VaList(bp+8, rc)) goto end_of_check __5: ; if !(libc.AssignInt32(&rc, btreeComputeFreeSpace(tls, *(*uintptr)(unsafe.Pointer(bp + 96)))) != 0) { goto __6 } checkAppendMsg(tls, pCheck, ts+5746, libc.VaList(bp+16, rc)) goto end_of_check __6: ; data = (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FaData hdr = int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FhdrOffset) (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx = ts + 5768 contentOffset = U32((int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+5))))<<8|int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+5) + 1)))-1)&0xffff + 1) nCell = int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+3))))<<8 | int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+3) + 1))) cellStart = hdr + 12 - 4*int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).Fleaf) pCellIdx = data + uintptr(cellStart+2*(nCell-1)) if !!(int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).Fleaf) != 0) { goto __7 } pgno = int32(Xsqlite3Get4byte(tls, data+uintptr(hdr+8))) if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0) { goto __9 } (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx = ts + 5794 checkPtrmap(tls, pCheck, uint32(pgno), uint8(PTRMAP_BTREE), iPage) __9: ; depth = checkTreePage(tls, pCheck, uint32(pgno), bp+104, *(*I64)(unsafe.Pointer(bp + 104))) keyCanBeEqual = 0 goto __8 __7: heap = (*IntegrityCk)(unsafe.Pointer(pCheck)).Fheap *(*U32)(unsafe.Pointer(heap)) = U32(0) __8: ; i = nCell - 1 __10: if !(i >= 0 && (*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr != 0) { goto __12 } (*IntegrityCk)(unsafe.Pointer(pCheck)).Fv2 = i pc = U32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer(pCellIdx)))) pCellIdx -= uintptr(2) if !(pc < contentOffset || pc > usableSize-U32(4)) { goto __13 } checkAppendMsg(tls, pCheck, ts+5822, libc.VaList(bp+24, pc, contentOffset, usableSize-U32(4))) doCoverageCheck = 0 goto __11 __13: ; pCell = data + uintptr(pc) (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FxParseCell})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 96)), pCell, bp+112) if !(pc+U32((*CellInfo)(unsafe.Pointer(bp+112)).FnSize) > usableSize) { goto __14 } checkAppendMsg(tls, pCheck, ts+5852, 0) doCoverageCheck = 0 goto __11 __14: ; if !((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FintKey != 0) { goto __15 } if !(func() int32 { if keyCanBeEqual != 0 { return libc.Bool32((*CellInfo)(unsafe.Pointer(bp+112)).FnKey > *(*I64)(unsafe.Pointer(bp + 104))) } return libc.Bool32((*CellInfo)(unsafe.Pointer(bp+112)).FnKey >= *(*I64)(unsafe.Pointer(bp + 104))) }() != 0) { goto __16 } checkAppendMsg(tls, pCheck, ts+5876, libc.VaList(bp+48, (*CellInfo)(unsafe.Pointer(bp+112)).FnKey)) __16: ; *(*I64)(unsafe.Pointer(bp + 104)) = (*CellInfo)(unsafe.Pointer(bp + 112)).FnKey keyCanBeEqual = 0 __15: ; if !((*CellInfo)(unsafe.Pointer(bp+112)).FnPayload > U32((*CellInfo)(unsafe.Pointer(bp+112)).FnLocal)) { goto __17 } nPage = ((*CellInfo)(unsafe.Pointer(bp+112)).FnPayload - U32((*CellInfo)(unsafe.Pointer(bp+112)).FnLocal) + usableSize - U32(5)) / (usableSize - U32(4)) pgnoOvfl = Xsqlite3Get4byte(tls, pCell+uintptr(int32((*CellInfo)(unsafe.Pointer(bp+112)).FnSize)-4)) if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0) { goto __18 } checkPtrmap(tls, pCheck, pgnoOvfl, uint8(PTRMAP_OVERFLOW1), iPage) __18: ; checkList(tls, pCheck, 0, pgnoOvfl, nPage) __17: ; if !!(int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).Fleaf) != 0) { goto __19 } pgno = int32(Xsqlite3Get4byte(tls, pCell)) if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0) { goto __21 } checkPtrmap(tls, pCheck, uint32(pgno), uint8(PTRMAP_BTREE), iPage) __21: ; d2 = checkTreePage(tls, pCheck, uint32(pgno), bp+104, *(*I64)(unsafe.Pointer(bp + 104))) keyCanBeEqual = 0 if !(d2 != depth) { goto __22 } checkAppendMsg(tls, pCheck, ts+5900, 0) depth = d2 __22: ; goto __20 __19: btreeHeapInsert(tls, heap, pc<<16|(pc+U32((*CellInfo)(unsafe.Pointer(bp+112)).FnSize)-U32(1))) __20: ; goto __11 __11: i-- goto __10 goto __12 __12: ; *(*I64)(unsafe.Pointer(piMinKey)) = *(*I64)(unsafe.Pointer(bp + 104)) (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx = uintptr(0) if !(doCoverageCheck != 0 && (*IntegrityCk)(unsafe.Pointer(pCheck)).FmxErr > 0) { goto __23 } if !!(int32((*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).Fleaf) != 0) { goto __24 } heap = (*IntegrityCk)(unsafe.Pointer(pCheck)).Fheap *(*U32)(unsafe.Pointer(heap)) = U32(0) i = nCell - 1 __25: if !(i >= 0) { goto __27 } pc = U32(libc.X__builtin_bswap16(tls, *(*U16)(unsafe.Pointer(data + uintptr(cellStart+i*2))))) size = U32((*struct { f func(*libc.TLS, uintptr, uintptr) U16 })(unsafe.Pointer(&struct{ uintptr }{(*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FxCellSize})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 96)), data+uintptr(pc))) btreeHeapInsert(tls, heap, pc<<16|(pc+size-U32(1))) goto __26 __26: i-- goto __25 goto __27 __27: ; __24: ; i = int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+1))))<<8 | int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+1) + 1))) __28: if !(i > 0) { goto __29 } size1 = int32(*(*U8)(unsafe.Pointer(data + uintptr(i+2))))<<8 | int32(*(*U8)(unsafe.Pointer(data + uintptr(i+2) + 1))) btreeHeapInsert(tls, heap, U32(i)<<16|U32(i+size1-1)) j = int32(*(*U8)(unsafe.Pointer(data + uintptr(i))))<<8 | int32(*(*U8)(unsafe.Pointer(data + uintptr(i) + 1))) i = j goto __28 __29: ; nFrag = 0 prev = contentOffset - U32(1) __30: if !(btreeHeapPull(tls, heap, bp+136) != 0) { goto __31 } if !(prev&U32(0xffff) >= *(*U32)(unsafe.Pointer(bp + 136))>>16) { goto __32 } checkAppendMsg(tls, pCheck, ts+5925, libc.VaList(bp+56, *(*U32)(unsafe.Pointer(bp + 136))>>16, iPage)) goto __31 goto __33 __32: nFrag = int32(U32(nFrag) + (*(*U32)(unsafe.Pointer(bp + 136))>>16 - prev&U32(0xffff) - U32(1))) prev = *(*U32)(unsafe.Pointer(bp + 136)) __33: ; goto __30 __31: ; nFrag = int32(U32(nFrag) + (usableSize - prev&U32(0xffff) - U32(1))) if !(*(*U32)(unsafe.Pointer(heap)) == U32(0) && nFrag != int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+7))))) { goto __34 } checkAppendMsg(tls, pCheck, ts+5962, libc.VaList(bp+72, nFrag, int32(*(*U8)(unsafe.Pointer(data + uintptr(hdr+7)))), iPage)) __34: ; __23: ; end_of_check: if !!(doCoverageCheck != 0) { goto __35 } (*MemPage)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FisInit = savedIsInit __35: ; releasePage(tls, *(*uintptr)(unsafe.Pointer(bp + 96))) (*IntegrityCk)(unsafe.Pointer(pCheck)).FzPfx = saved_zPfx (*IntegrityCk)(unsafe.Pointer(pCheck)).Fv1 = Pgno(saved_v1) (*IntegrityCk)(unsafe.Pointer(pCheck)).Fv2 = saved_v2 return depth + 1 } // This routine does a complete check of the given BTree file. aRoot[] is // an array of pages numbers were each page number is the root page of // a table. nRoot is the number of entries in aRoot. // // A read-only or read-write transaction must be opened before calling // this function. // // Write the number of error seen in *pnErr. Except for some memory // allocation errors, an error message held in memory obtained from // malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is // returned. If a memory allocation error occurs, NULL is returned. // // If the first entry in aRoot[] is 0, that indicates that the list of // root pages is incomplete. This is a "partial integrity-check". This // happens when performing an integrity check on a single table. The // zero is skipped, of course. But in addition, the freelist checks // and the checks to make sure every page is referenced are also skipped, // since obviously it is not possible to know which pages are covered by // the unverified btrees. Except, if aRoot[1] is 1, then the freelist // checks are still performed. func Xsqlite3BtreeIntegrityCheck(tls *libc.TLS, db uintptr, p uintptr, aRoot uintptr, nRoot int32, mxErr int32, pnErr uintptr, pzOut uintptr) int32 { bp := tls.Alloc(256) defer tls.Free(256) var i Pgno var pBt uintptr var savedDbFlags U64 var bPartial int32 var bCkFreelist int32 var mx Pgno var mxInHdr Pgno pBt = (*Btree)(unsafe.Pointer(p)).FpBt savedDbFlags = (*Sqlite3)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).Fdb)).Fflags bPartial = 0 bCkFreelist = 1 if !(*(*Pgno)(unsafe.Pointer(aRoot)) == Pgno(0)) { goto __1 } bPartial = 1 if !(*(*Pgno)(unsafe.Pointer(aRoot + 1*4)) != Pgno(1)) { goto __2 } bCkFreelist = 0 __2: ; __1: ; Xsqlite3BtreeEnter(tls, p) libc.Xmemset(tls, bp+32, 0, uint64(unsafe.Sizeof(IntegrityCk{}))) (*IntegrityCk)(unsafe.Pointer(bp + 32)).Fdb = db (*IntegrityCk)(unsafe.Pointer(bp + 32)).FpBt = pBt (*IntegrityCk)(unsafe.Pointer(bp + 32)).FpPager = (*BtShared)(unsafe.Pointer(pBt)).FpPager (*IntegrityCk)(unsafe.Pointer(bp + 32)).FnPage = btreePagecount(tls, (*IntegrityCk)(unsafe.Pointer(bp+32)).FpBt) (*IntegrityCk)(unsafe.Pointer(bp + 32)).FmxErr = mxErr Xsqlite3StrAccumInit(tls, bp+32+64, uintptr(0), bp+144, int32(unsafe.Sizeof([100]int8{})), SQLITE_MAX_LENGTH) (*IntegrityCk)(unsafe.Pointer(bp + 32)).FerrMsg.FprintfFlags = U8(SQLITE_PRINTF_INTERNAL) if !((*IntegrityCk)(unsafe.Pointer(bp+32)).FnPage == Pgno(0)) { goto __3 } goto integrity_ck_cleanup __3: ; (*IntegrityCk)(unsafe.Pointer(bp + 32)).FaPgRef = Xsqlite3MallocZero(tls, uint64((*IntegrityCk)(unsafe.Pointer(bp+32)).FnPage/Pgno(8)+Pgno(1))) if !!(int32((*IntegrityCk)(unsafe.Pointer(bp+32)).FaPgRef) != 0) { goto __4 } checkOom(tls, bp+32) goto integrity_ck_cleanup __4: ; (*IntegrityCk)(unsafe.Pointer(bp + 32)).Fheap = Xsqlite3PageMalloc(tls, int32((*BtShared)(unsafe.Pointer(pBt)).FpageSize)) if !((*IntegrityCk)(unsafe.Pointer(bp+32)).Fheap == uintptr(0)) { goto __5 } checkOom(tls, bp+32) goto integrity_ck_cleanup __5: ; i = U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer(pBt)).FpageSize + U32(1) if !(i <= (*IntegrityCk)(unsafe.Pointer(bp+32)).FnPage) { goto __6 } setPageReferenced(tls, bp+32, i) __6: ; if !(bCkFreelist != 0) { goto __7 } (*IntegrityCk)(unsafe.Pointer(bp + 32)).FzPfx = ts + 6014 checkList(tls, bp+32, 1, Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+32), Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+36)) (*IntegrityCk)(unsafe.Pointer(bp + 32)).FzPfx = uintptr(0) __7: ; if !!(bPartial != 0) { goto __8 } if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0) { goto __9 } mx = Pgno(0) i = Pgno(0) __11: if !(int32(i) < nRoot) { goto __13 } if !(mx < *(*Pgno)(unsafe.Pointer(aRoot + uintptr(i)*4))) { goto __14 } mx = *(*Pgno)(unsafe.Pointer(aRoot + uintptr(i)*4)) __14: ; goto __12 __12: i++ goto __11 goto __13 __13: ; mxInHdr = Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+52) if !(mx != mxInHdr) { goto __15 } checkAppendMsg(tls, bp+32, ts+6030, libc.VaList(bp, mx, mxInHdr)) __15: ; goto __10 __9: if !(Xsqlite3Get4byte(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData+64) != U32(0)) { goto __16 } checkAppendMsg(tls, bp+32, ts+6075, 0) __16: ; __10: ; __8: ; *(*U64)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).Fdb + 48)) &= libc.CplUint64(uint64(SQLITE_CellSizeCk)) i = Pgno(0) __17: if !(int32(i) < nRoot && (*IntegrityCk)(unsafe.Pointer(bp+32)).FmxErr != 0) { goto __19 } if !(*(*Pgno)(unsafe.Pointer(aRoot + uintptr(i)*4)) == Pgno(0)) { goto __20 } goto __18 __20: ; if !((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0 && *(*Pgno)(unsafe.Pointer(aRoot + uintptr(i)*4)) > Pgno(1) && !(bPartial != 0)) { goto __21 } checkPtrmap(tls, bp+32, *(*Pgno)(unsafe.Pointer(aRoot + uintptr(i)*4)), uint8(PTRMAP_ROOTPAGE), uint32(0)) __21: ; checkTreePage(tls, bp+32, *(*Pgno)(unsafe.Pointer(aRoot + uintptr(i)*4)), bp+248, int64(0xffffffff)|int64(0x7fffffff)<<32) goto __18 __18: i++ goto __17 goto __19 __19: ; (*Sqlite3)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).Fdb)).Fflags = savedDbFlags if !!(bPartial != 0) { goto __22 } i = Pgno(1) __23: if !(i <= (*IntegrityCk)(unsafe.Pointer(bp+32)).FnPage && (*IntegrityCk)(unsafe.Pointer(bp+32)).FmxErr != 0) { goto __25 } if !(getPageReferenced(tls, bp+32, i) == 0 && (ptrmapPageno(tls, pBt, i) != i || !(int32((*BtShared)(unsafe.Pointer(pBt)).FautoVacuum) != 0))) { goto __26 } checkAppendMsg(tls, bp+32, ts+6130, libc.VaList(bp+16, i)) __26: ; if !(getPageReferenced(tls, bp+32, i) != 0 && (ptrmapPageno(tls, pBt, i) == i && (*BtShared)(unsafe.Pointer(pBt)).FautoVacuum != 0)) { goto __27 } checkAppendMsg(tls, bp+32, ts+6152, libc.VaList(bp+24, i)) __27: ; goto __24 __24: i++ goto __23 goto __25 __25: ; __22: ; integrity_ck_cleanup: Xsqlite3PageFree(tls, (*IntegrityCk)(unsafe.Pointer(bp+32)).Fheap) Xsqlite3_free(tls, (*IntegrityCk)(unsafe.Pointer(bp+32)).FaPgRef) *(*int32)(unsafe.Pointer(pnErr)) = (*IntegrityCk)(unsafe.Pointer(bp + 32)).FnErr if !((*IntegrityCk)(unsafe.Pointer(bp+32)).FnErr == 0) { goto __28 } Xsqlite3_str_reset(tls, bp+32+64) *(*uintptr)(unsafe.Pointer(pzOut)) = uintptr(0) goto __29 __28: *(*uintptr)(unsafe.Pointer(pzOut)) = Xsqlite3StrAccumFinish(tls, bp+32+64) __29: ; Xsqlite3BtreeLeave(tls, p) return (*IntegrityCk)(unsafe.Pointer(bp + 32)).Frc } // Return the full pathname of the underlying database file. Return // an empty string if the database is in-memory or a TEMP database. // // The pager filename is invariant as long as the pager is // open so it is safe to access without the BtShared mutex. func Xsqlite3BtreeGetFilename(tls *libc.TLS, p uintptr) uintptr { return Xsqlite3PagerFilename(tls, (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FpPager, 1) } // Return the pathname of the journal file for this database. The return // value of this routine is the same regardless of whether the journal file // has been created or not. // // The pager journal filename is invariant as long as the pager is // open so it is safe to access without the BtShared mutex. func Xsqlite3BtreeGetJournalname(tls *libc.TLS, p uintptr) uintptr { return Xsqlite3PagerJournalname(tls, (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FpPager) } // Return one of SQLITE_TXN_NONE, SQLITE_TXN_READ, or SQLITE_TXN_WRITE // to describe the current transaction state of Btree p. func Xsqlite3BtreeTxnState(tls *libc.TLS, p uintptr) int32 { if p != 0 { return int32((*Btree)(unsafe.Pointer(p)).FinTrans) } return 0 } // Run a checkpoint on the Btree passed as the first argument. // // Return SQLITE_LOCKED if this or any other connection has an open // transaction on the shared-cache the argument Btree is connected to. // // Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. func Xsqlite3BtreeCheckpoint(tls *libc.TLS, p uintptr, eMode int32, pnLog uintptr, pnCkpt uintptr) int32 { var rc int32 = SQLITE_OK if p != 0 { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) if int32((*BtShared)(unsafe.Pointer(pBt)).FinTransaction) != TRANS_NONE { rc = SQLITE_LOCKED } else { rc = Xsqlite3PagerCheckpoint(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager, (*Btree)(unsafe.Pointer(p)).Fdb, eMode, pnLog, pnCkpt) } Xsqlite3BtreeLeave(tls, p) } return rc } // Return true if there is currently a backup running on Btree p. func Xsqlite3BtreeIsInBackup(tls *libc.TLS, p uintptr) int32 { return libc.Bool32((*Btree)(unsafe.Pointer(p)).FnBackup != 0) } // This function returns a pointer to a blob of memory associated with // a single shared-btree. The memory is used by client code for its own // purposes (for example, to store a high-level schema associated with // the shared-btree). The btree layer manages reference counting issues. // // The first time this is called on a shared-btree, nBytes bytes of memory // are allocated, zeroed, and returned to the caller. For each subsequent // call the nBytes parameter is ignored and a pointer to the same blob // of memory returned. // // If the nBytes parameter is 0 and the blob of memory has not yet been // allocated, a null pointer is returned. If the blob has already been // allocated, it is returned as normal. // // Just before the shared-btree is closed, the function passed as the // xFree argument when the memory allocation was made is invoked on the // blob of allocated memory. The xFree function should not call sqlite3_free() // on the memory, the btree layer does that. func Xsqlite3BtreeSchema(tls *libc.TLS, p uintptr, nBytes int32, xFree uintptr) uintptr { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt Xsqlite3BtreeEnter(tls, p) if !(int32((*BtShared)(unsafe.Pointer(pBt)).FpSchema) != 0) && nBytes != 0 { (*BtShared)(unsafe.Pointer(pBt)).FpSchema = Xsqlite3DbMallocZero(tls, uintptr(0), uint64(nBytes)) (*BtShared)(unsafe.Pointer(pBt)).FxFreeSchema = xFree } Xsqlite3BtreeLeave(tls, p) return (*BtShared)(unsafe.Pointer(pBt)).FpSchema } // Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared // btree as the argument handle holds an exclusive lock on the // sqlite_schema table. Otherwise SQLITE_OK. func Xsqlite3BtreeSchemaLocked(tls *libc.TLS, p uintptr) int32 { var rc int32 Xsqlite3BtreeEnter(tls, p) rc = querySharedCacheTableLock(tls, p, uint32(SCHEMA_ROOT), uint8(READ_LOCK)) Xsqlite3BtreeLeave(tls, p) return rc } // Obtain a lock on the table whose root page is iTab. The // lock is a write lock if isWritelock is true or a read lock // if it is false. func Xsqlite3BtreeLockTable(tls *libc.TLS, p uintptr, iTab int32, isWriteLock U8) int32 { var rc int32 = SQLITE_OK if (*Btree)(unsafe.Pointer(p)).Fsharable != 0 { var lockType U8 = U8(READ_LOCK + int32(isWriteLock)) Xsqlite3BtreeEnter(tls, p) rc = querySharedCacheTableLock(tls, p, uint32(iTab), lockType) if rc == SQLITE_OK { rc = setSharedCacheTableLock(tls, p, uint32(iTab), lockType) } Xsqlite3BtreeLeave(tls, p) } return rc } // Argument pCsr must be a cursor opened for writing on an // INTKEY table currently pointing at a valid table entry. // This function modifies the data stored as part of that entry. // // Only the data content may only be modified, it is not possible to // change the length of the data stored. If this function is called with // parameters that attempt to write past the end of the existing data, // no modifications are made and SQLITE_CORRUPT is returned. func Xsqlite3BtreePutData(tls *libc.TLS, pCsr uintptr, offset U32, amt U32, z uintptr) int32 { var rc int32 rc = func() int32 { if int32((*BtCursor)(unsafe.Pointer(pCsr)).FeState) >= CURSOR_REQUIRESEEK { return btreeRestoreCursorPosition(tls, pCsr) } return SQLITE_OK }() if rc != SQLITE_OK { return rc } if int32((*BtCursor)(unsafe.Pointer(pCsr)).FeState) != CURSOR_VALID { return SQLITE_ABORT } saveAllCursors(tls, (*BtCursor)(unsafe.Pointer(pCsr)).FpBt, (*BtCursor)(unsafe.Pointer(pCsr)).FpgnoRoot, pCsr) if int32((*BtCursor)(unsafe.Pointer(pCsr)).FcurFlags)&BTCF_WriteFlag == 0 { return SQLITE_READONLY } return accessPayload(tls, pCsr, offset, amt, z, 1) } // Mark this cursor as an incremental blob cursor. func Xsqlite3BtreeIncrblobCursor(tls *libc.TLS, pCur uintptr) { *(*U8)(unsafe.Pointer(pCur + 1)) |= U8(BTCF_Incrblob) (*Btree)(unsafe.Pointer((*BtCursor)(unsafe.Pointer(pCur)).FpBtree)).FhasIncrblobCur = U8(1) } // Set both the "read version" (single byte at byte offset 18) and // "write version" (single byte at byte offset 19) fields in the database // header to iVersion. func Xsqlite3BtreeSetVersion(tls *libc.TLS, pBtree uintptr, iVersion int32) int32 { var pBt uintptr = (*Btree)(unsafe.Pointer(pBtree)).FpBt var rc int32 *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_NO_WAL)) if iVersion == 1 { *(*U16)(unsafe.Pointer(pBt + 40)) |= U16(BTS_NO_WAL) } rc = Xsqlite3BtreeBeginTrans(tls, pBtree, 0, uintptr(0)) if rc == SQLITE_OK { var aData uintptr = (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FaData if int32(*(*U8)(unsafe.Pointer(aData + 18))) != int32(U8(iVersion)) || int32(*(*U8)(unsafe.Pointer(aData + 19))) != int32(U8(iVersion)) { rc = Xsqlite3BtreeBeginTrans(tls, pBtree, 2, uintptr(0)) if rc == SQLITE_OK { rc = Xsqlite3PagerWrite(tls, (*MemPage)(unsafe.Pointer((*BtShared)(unsafe.Pointer(pBt)).FpPage1)).FpDbPage) if rc == SQLITE_OK { *(*U8)(unsafe.Pointer(aData + 18)) = U8(iVersion) *(*U8)(unsafe.Pointer(aData + 19)) = U8(iVersion) } } } } *(*U16)(unsafe.Pointer(pBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_NO_WAL)) return rc } // Return true if the cursor has a hint specified. This routine is // only used from within assert() statements func Xsqlite3BtreeCursorHasHint(tls *libc.TLS, pCsr uintptr, mask uint32) int32 { return libc.Bool32(uint32((*BtCursor)(unsafe.Pointer(pCsr)).Fhints)&mask != uint32(0)) } // Return true if the given Btree is read-only. func Xsqlite3BtreeIsReadonly(tls *libc.TLS, p uintptr) int32 { return libc.Bool32(int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FbtsFlags)&BTS_READ_ONLY != 0) } // Return the size of the header added to each page by this module. func Xsqlite3HeaderSizeBtree(tls *libc.TLS) int32 { return int32((uint64(unsafe.Sizeof(MemPage{})) + uint64(7)) & libc.Uint64FromInt32(libc.CplInt32(7))) } // If no transaction is active and the database is not a temp-db, clear // the in-memory pager cache. func Xsqlite3BtreeClearCache(tls *libc.TLS, p uintptr) { var pBt uintptr = (*Btree)(unsafe.Pointer(p)).FpBt if int32((*BtShared)(unsafe.Pointer(pBt)).FinTransaction) == TRANS_NONE { Xsqlite3PagerClearCache(tls, (*BtShared)(unsafe.Pointer(pBt)).FpPager) } } // Return true if the Btree passed as the only argument is sharable. func Xsqlite3BtreeSharable(tls *libc.TLS, p uintptr) int32 { return int32((*Btree)(unsafe.Pointer(p)).Fsharable) } // Return the number of connections to the BtShared object accessed by // the Btree handle passed as the only argument. For private caches // this is always 1. For shared caches it may be 1 or greater. func Xsqlite3BtreeConnectionCount(tls *libc.TLS, p uintptr) int32 { return (*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer(p)).FpBt)).FnRef } func findBtree(tls *libc.TLS, pErrorDb uintptr, pDb uintptr, zDb uintptr) uintptr { bp := tls.Alloc(440) defer tls.Free(440) var i int32 = Xsqlite3FindDbName(tls, pDb, zDb) if i == 1 { var rc int32 = 0 Xsqlite3ParseObjectInit(tls, bp+16, pDb) if Xsqlite3OpenTempDatabase(tls, bp+16) != 0 { Xsqlite3ErrorWithMsg(tls, pErrorDb, (*Parse)(unsafe.Pointer(bp+16)).Frc, ts+4493, libc.VaList(bp, (*Parse)(unsafe.Pointer(bp+16)).FzErrMsg)) rc = SQLITE_ERROR } Xsqlite3DbFree(tls, pErrorDb, (*Parse)(unsafe.Pointer(bp+16)).FzErrMsg) Xsqlite3ParseObjectReset(tls, bp+16) if rc != 0 { return uintptr(0) } } if i < 0 { Xsqlite3ErrorWithMsg(tls, pErrorDb, SQLITE_ERROR, ts+6186, libc.VaList(bp+8, zDb)) return uintptr(0) } return (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(pDb)).FaDb + uintptr(i)*32)).FpBt } func setDestPgsz(tls *libc.TLS, p uintptr) int32 { var rc int32 rc = Xsqlite3BtreeSetPageSize(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest, Xsqlite3BtreeGetPageSize(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc), 0, 0) return rc } func checkReadTransaction(tls *libc.TLS, db uintptr, p uintptr) int32 { if Xsqlite3BtreeTxnState(tls, p) != SQLITE_TXN_NONE { Xsqlite3ErrorWithMsg(tls, db, SQLITE_ERROR, ts+6206, 0) return SQLITE_ERROR } return SQLITE_OK } // Create an sqlite3_backup process to copy the contents of zSrcDb from // connection handle pSrcDb to zDestDb in pDestDb. If successful, return // a pointer to the new sqlite3_backup object. // // If an error occurs, NULL is returned and an error code and error message // stored in database handle pDestDb. func Xsqlite3_backup_init(tls *libc.TLS, pDestDb uintptr, zDestDb uintptr, pSrcDb uintptr, zSrcDb uintptr) uintptr { var p uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(pSrcDb)).Fmutex) Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(pDestDb)).Fmutex) if pSrcDb == pDestDb { Xsqlite3ErrorWithMsg(tls, pDestDb, SQLITE_ERROR, ts+6237, 0) p = uintptr(0) } else { p = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(Sqlite3_backup{}))) if !(p != 0) { Xsqlite3Error(tls, pDestDb, SQLITE_NOMEM) } } if p != 0 { (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc = findBtree(tls, pDestDb, pSrcDb, zSrcDb) (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest = findBtree(tls, pDestDb, pDestDb, zDestDb) (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb = pDestDb (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrcDb = pSrcDb (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext = Pgno(1) (*Sqlite3_backup)(unsafe.Pointer(p)).FisAttached = 0 if uintptr(0) == (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc || uintptr(0) == (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest || checkReadTransaction(tls, pDestDb, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest) != SQLITE_OK { Xsqlite3_free(tls, p) p = uintptr(0) } } if p != 0 { (*Btree)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)).FnBackup++ } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(pDestDb)).Fmutex) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(pSrcDb)).Fmutex) return p } func isFatalError(tls *libc.TLS, rc int32) int32 { return libc.Bool32(rc != SQLITE_OK && rc != SQLITE_BUSY && rc != SQLITE_LOCKED) } func backupOnePage(tls *libc.TLS, p uintptr, iSrcPg Pgno, zSrcData uintptr, bUpdate int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pDestPager uintptr = Xsqlite3BtreePager(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest) var nSrcPgsz int32 = Xsqlite3BtreeGetPageSize(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) var nDestPgsz int32 = Xsqlite3BtreeGetPageSize(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest) var nCopy int32 = func() int32 { if nSrcPgsz < nDestPgsz { return nSrcPgsz } return nDestPgsz }() var iEnd I64 = I64(iSrcPg) * I64(nSrcPgsz) var rc int32 = SQLITE_OK var iOff I64 if nSrcPgsz != nDestPgsz && Xsqlite3PagerIsMemdb(tls, pDestPager) != 0 { rc = SQLITE_READONLY } for iOff = iEnd - I64(nSrcPgsz); rc == SQLITE_OK && iOff < iEnd; iOff = iOff + I64(nDestPgsz) { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var iDest Pgno = Pgno(iOff/I64(nDestPgsz)) + Pgno(1) if iDest == U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDest)).FpBt)).FpageSize+U32(1) { continue } if SQLITE_OK == libc.AssignInt32(&rc, Xsqlite3PagerGet(tls, pDestPager, iDest, bp, 0)) && SQLITE_OK == libc.AssignInt32(&rc, Xsqlite3PagerWrite(tls, *(*uintptr)(unsafe.Pointer(bp)))) { var zIn uintptr = zSrcData + uintptr(iOff%I64(nSrcPgsz)) var zDestData uintptr = Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp))) var zOut uintptr = zDestData + uintptr(iOff%I64(nDestPgsz)) libc.Xmemcpy(tls, zOut, zIn, uint64(nCopy)) *(*U8)(unsafe.Pointer(Xsqlite3PagerGetExtra(tls, *(*uintptr)(unsafe.Pointer(bp))))) = U8(0) if iOff == int64(0) && bUpdate == 0 { Xsqlite3Put4byte(tls, zOut+28, Xsqlite3BtreeLastPage(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)) } } Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) } return rc } func backupTruncateFile(tls *libc.TLS, pFile uintptr, iSize I64) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = Xsqlite3OsFileSize(tls, pFile, bp) if rc == SQLITE_OK && *(*I64)(unsafe.Pointer(bp)) > iSize { rc = Xsqlite3OsTruncate(tls, pFile, iSize) } return rc } func attachBackupObject(tls *libc.TLS, p uintptr) { var pp uintptr pp = Xsqlite3PagerBackupPtr(tls, Xsqlite3BtreePager(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)) (*Sqlite3_backup)(unsafe.Pointer(p)).FpNext = *(*uintptr)(unsafe.Pointer(pp)) *(*uintptr)(unsafe.Pointer(pp)) = p (*Sqlite3_backup)(unsafe.Pointer(p)).FisAttached = 1 } // Copy nPage pages from the source b-tree to the destination. func Xsqlite3_backup_step(tls *libc.TLS, p uintptr, nPage int32) int32 { bp := tls.Alloc(32) defer tls.Free(32) var rc int32 var destMode int32 var pgszSrc int32 = 0 var pgszDest int32 = 0 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpSrcDb)).Fmutex) Xsqlite3BtreeEnter(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb)).Fmutex) } rc = (*Sqlite3_backup)(unsafe.Pointer(p)).Frc if !(isFatalError(tls, rc) != 0) { var pSrcPager uintptr = Xsqlite3BtreePager(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) var pDestPager uintptr = Xsqlite3BtreePager(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest) var ii int32 var nSrcPage int32 = -1 var bCloseTrans int32 = 0 if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 && int32((*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)).FpBt)).FinTransaction) == TRANS_WRITE { rc = SQLITE_BUSY } else { rc = SQLITE_OK } if rc == SQLITE_OK && SQLITE_TXN_NONE == Xsqlite3BtreeTxnState(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) { rc = Xsqlite3BtreeBeginTrans(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc, 0, uintptr(0)) bCloseTrans = 1 } if (*Sqlite3_backup)(unsafe.Pointer(p)).FbDestLocked == 0 && rc == SQLITE_OK && setDestPgsz(tls, p) == SQLITE_NOMEM { rc = SQLITE_NOMEM } if SQLITE_OK == rc && (*Sqlite3_backup)(unsafe.Pointer(p)).FbDestLocked == 0 && SQLITE_OK == libc.AssignInt32(&rc, Xsqlite3BtreeBeginTrans(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest, 2, p+16)) { (*Sqlite3_backup)(unsafe.Pointer(p)).FbDestLocked = 1 } pgszSrc = Xsqlite3BtreeGetPageSize(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) pgszDest = Xsqlite3BtreeGetPageSize(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest) destMode = Xsqlite3PagerGetJournalMode(tls, Xsqlite3BtreePager(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest)) if SQLITE_OK == rc && destMode == PAGER_JOURNALMODE_WAL && pgszSrc != pgszDest { rc = SQLITE_READONLY } nSrcPage = int32(Xsqlite3BtreeLastPage(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)) for ii = 0; (nPage < 0 || ii < nPage) && (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext <= Pgno(nSrcPage) && !(rc != 0); ii++ { var iSrcPg Pgno = (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext if iSrcPg != U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)).FpBt)).FpageSize+U32(1) { rc = Xsqlite3PagerGet(tls, pSrcPager, iSrcPg, bp, PAGER_GET_READONLY) if rc == SQLITE_OK { rc = backupOnePage(tls, p, iSrcPg, Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp))), 0) Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp))) } } (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext++ } if rc == SQLITE_OK { (*Sqlite3_backup)(unsafe.Pointer(p)).FnPagecount = Pgno(nSrcPage) (*Sqlite3_backup)(unsafe.Pointer(p)).FnRemaining = Pgno(nSrcPage+1) - (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext if (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext > Pgno(nSrcPage) { rc = SQLITE_DONE } else if !((*Sqlite3_backup)(unsafe.Pointer(p)).FisAttached != 0) { attachBackupObject(tls, p) } } if rc == SQLITE_DONE { if nSrcPage == 0 { rc = Xsqlite3BtreeNewDb(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest) nSrcPage = 1 } if rc == SQLITE_OK || rc == SQLITE_DONE { rc = Xsqlite3BtreeUpdateMeta(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest, 1, (*Sqlite3_backup)(unsafe.Pointer(p)).FiDestSchema+U32(1)) } if rc == SQLITE_OK { if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 { Xsqlite3ResetAllSchemasOfConnection(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb) } if destMode == PAGER_JOURNALMODE_WAL { rc = Xsqlite3BtreeSetVersion(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest, 2) } } if rc == SQLITE_OK { var nDestTruncate int32 if pgszSrc < pgszDest { var ratio int32 = pgszDest / pgszSrc nDestTruncate = (nSrcPage + ratio - 1) / ratio if nDestTruncate == int32(U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDest)).FpBt)).FpageSize+U32(1)) { nDestTruncate-- } } else { nDestTruncate = nSrcPage * (pgszSrc / pgszDest) } if pgszSrc < pgszDest { var iSize I64 = I64(pgszSrc) * I64(nSrcPage) var pFile uintptr = Xsqlite3PagerFile(tls, pDestPager) var iPg Pgno var iOff I64 var iEnd I64 Xsqlite3PagerPagecount(tls, pDestPager, bp+8) for iPg = Pgno(nDestTruncate); rc == SQLITE_OK && iPg <= Pgno(*(*int32)(unsafe.Pointer(bp + 8))); iPg++ { if iPg != U32(Xsqlite3PendingByte)/(*BtShared)(unsafe.Pointer((*Btree)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDest)).FpBt)).FpageSize+U32(1) { rc = Xsqlite3PagerGet(tls, pDestPager, iPg, bp+16, 0) if rc == SQLITE_OK { rc = Xsqlite3PagerWrite(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) } } } if rc == SQLITE_OK { rc = Xsqlite3PagerCommitPhaseOne(tls, pDestPager, uintptr(0), 1) } iEnd = func() int64 { if I64(Xsqlite3PendingByte+pgszDest) < iSize { return int64(Xsqlite3PendingByte + pgszDest) } return iSize }() for iOff = I64(Xsqlite3PendingByte + pgszSrc); rc == SQLITE_OK && iOff < iEnd; iOff = iOff + I64(pgszSrc) { *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) var iSrcPg Pgno = Pgno(iOff/I64(pgszSrc) + int64(1)) rc = Xsqlite3PagerGet(tls, pSrcPager, iSrcPg, bp+24, 0) if rc == SQLITE_OK { var zData uintptr = Xsqlite3PagerGetData(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) rc = Xsqlite3OsWrite(tls, pFile, zData, pgszSrc, iOff) } Xsqlite3PagerUnref(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) } if rc == SQLITE_OK { rc = backupTruncateFile(tls, pFile, iSize) } if rc == SQLITE_OK { rc = Xsqlite3PagerSync(tls, pDestPager, uintptr(0)) } } else { Xsqlite3PagerTruncateImage(tls, pDestPager, uint32(nDestTruncate)) rc = Xsqlite3PagerCommitPhaseOne(tls, pDestPager, uintptr(0), 0) } if SQLITE_OK == rc && SQLITE_OK == libc.AssignInt32(&rc, Xsqlite3BtreeCommitPhaseTwo(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest, 0)) { rc = SQLITE_DONE } } } if bCloseTrans != 0 { Xsqlite3BtreeCommitPhaseOne(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc, uintptr(0)) Xsqlite3BtreeCommitPhaseTwo(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc, 0) } if rc == SQLITE_IOERR|int32(12)<<8 { rc = SQLITE_NOMEM } (*Sqlite3_backup)(unsafe.Pointer(p)).Frc = rc } if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 { Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb)).Fmutex) } Xsqlite3BtreeLeave(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpSrcDb)).Fmutex) return rc } // Release all resources associated with an sqlite3_backup* handle. func Xsqlite3_backup_finish(tls *libc.TLS, p uintptr) int32 { var pp uintptr var pSrcDb uintptr var rc int32 if p == uintptr(0) { return SQLITE_OK } pSrcDb = (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrcDb Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(pSrcDb)).Fmutex) Xsqlite3BtreeEnter(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb)).Fmutex) } if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 { (*Btree)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)).FnBackup-- } if (*Sqlite3_backup)(unsafe.Pointer(p)).FisAttached != 0 { pp = Xsqlite3PagerBackupPtr(tls, Xsqlite3BtreePager(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc)) for *(*uintptr)(unsafe.Pointer(pp)) != p { pp = *(*uintptr)(unsafe.Pointer(pp)) + 64 } *(*uintptr)(unsafe.Pointer(pp)) = (*Sqlite3_backup)(unsafe.Pointer(p)).FpNext } Xsqlite3BtreeRollback(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDest, SQLITE_OK, 0) if (*Sqlite3_backup)(unsafe.Pointer(p)).Frc == SQLITE_DONE { rc = SQLITE_OK } else { rc = (*Sqlite3_backup)(unsafe.Pointer(p)).Frc } if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 { Xsqlite3Error(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb, rc) Xsqlite3LeaveMutexAndCloseZombie(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb) } Xsqlite3BtreeLeave(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).FpSrc) if (*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb != 0 { Xsqlite3_free(tls, p) } Xsqlite3LeaveMutexAndCloseZombie(tls, pSrcDb) return rc } // Return the number of pages still to be backed up as of the most recent // call to sqlite3_backup_step(). func Xsqlite3_backup_remaining(tls *libc.TLS, p uintptr) int32 { return int32((*Sqlite3_backup)(unsafe.Pointer(p)).FnRemaining) } // Return the total number of pages in the source database as of the most // recent call to sqlite3_backup_step(). func Xsqlite3_backup_pagecount(tls *libc.TLS, p uintptr) int32 { return int32((*Sqlite3_backup)(unsafe.Pointer(p)).FnPagecount) } func backupUpdate(tls *libc.TLS, p uintptr, iPage Pgno, aData uintptr) { for __ccgo := true; __ccgo; __ccgo = libc.AssignUintptr(&p, (*Sqlite3_backup)(unsafe.Pointer(p)).FpNext) != uintptr(0) { if !(isFatalError(tls, (*Sqlite3_backup)(unsafe.Pointer(p)).Frc) != 0) && iPage < (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext { var rc int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb)).Fmutex) rc = backupOnePage(tls, p, iPage, aData, 1) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Sqlite3_backup)(unsafe.Pointer(p)).FpDestDb)).Fmutex) if rc != SQLITE_OK { (*Sqlite3_backup)(unsafe.Pointer(p)).Frc = rc } } } } func Xsqlite3BackupUpdate(tls *libc.TLS, pBackup uintptr, iPage Pgno, aData uintptr) { if pBackup != 0 { backupUpdate(tls, pBackup, iPage, aData) } } // Restart the backup process. This is called when the pager layer // detects that the database has been modified by an external database // connection. In this case there is no way of knowing which of the // pages that have been copied into the destination database are still // valid and which are not, so the entire process needs to be restarted. // // It is assumed that the mutex associated with the BtShared object // corresponding to the source database is held when this function is // called. func Xsqlite3BackupRestart(tls *libc.TLS, pBackup uintptr) { var p uintptr for p = pBackup; p != 0; p = (*Sqlite3_backup)(unsafe.Pointer(p)).FpNext { (*Sqlite3_backup)(unsafe.Pointer(p)).FiNext = Pgno(1) } } // Copy the complete content of pBtFrom into pBtTo. A transaction // must be active for both files. // // The size of file pTo may be reduced by this operation. If anything // goes wrong, the transaction on pTo is rolled back. If successful, the // transaction is committed before returning. func Xsqlite3BtreeCopyFile(tls *libc.TLS, pTo uintptr, pFrom uintptr) int32 { bp := tls.Alloc(80) defer tls.Free(80) var rc int32 var pFd uintptr Xsqlite3BtreeEnter(tls, pTo) Xsqlite3BtreeEnter(tls, pFrom) pFd = Xsqlite3PagerFile(tls, Xsqlite3BtreePager(tls, pTo)) if !((*Sqlite3_file)(unsafe.Pointer(pFd)).FpMethods != 0) { goto __1 } *(*I64)(unsafe.Pointer(bp)) = I64(Xsqlite3BtreeGetPageSize(tls, pFrom)) * I64(Xsqlite3BtreeLastPage(tls, pFrom)) rc = Xsqlite3OsFileControl(tls, pFd, SQLITE_FCNTL_OVERWRITE, bp) if !(rc == SQLITE_NOTFOUND) { goto __2 } rc = SQLITE_OK __2: ; if !(rc != 0) { goto __3 } goto copy_finished __3: ; __1: ; libc.Xmemset(tls, bp+8, 0, uint64(unsafe.Sizeof(Sqlite3_backup{}))) (*Sqlite3_backup)(unsafe.Pointer(bp + 8)).FpSrcDb = (*Btree)(unsafe.Pointer(pFrom)).Fdb (*Sqlite3_backup)(unsafe.Pointer(bp + 8)).FpSrc = pFrom (*Sqlite3_backup)(unsafe.Pointer(bp + 8)).FpDest = pTo (*Sqlite3_backup)(unsafe.Pointer(bp + 8)).FiNext = Pgno(1) Xsqlite3_backup_step(tls, bp+8, 0x7FFFFFFF) rc = Xsqlite3_backup_finish(tls, bp+8) if !(rc == SQLITE_OK) { goto __4 } *(*U16)(unsafe.Pointer((*Btree)(unsafe.Pointer(pTo)).FpBt + 40)) &= libc.Uint16FromInt32(libc.CplInt32(BTS_PAGESIZE_FIXED)) goto __5 __4: Xsqlite3PagerClearCache(tls, Xsqlite3BtreePager(tls, (*Sqlite3_backup)(unsafe.Pointer(bp+8)).FpDest)) __5: ; copy_finished: Xsqlite3BtreeLeave(tls, pFrom) Xsqlite3BtreeLeave(tls, pTo) return rc } func vdbeMemRenderNum(tls *libc.TLS, sz int32, zBuf uintptr, p uintptr) { bp := tls.Alloc(48) defer tls.Free(48) if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Int != 0 { libc.Xmemcpy(tls, bp+8, p, uint64(int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Int*2)) (*Mem)(unsafe.Pointer(p)).Fn = Xsqlite3Int64ToText(tls, *(*I64)(unsafe.Pointer(bp + 8)), zBuf) } else { Xsqlite3StrAccumInit(tls, bp+16, uintptr(0), zBuf, sz, 0) Xsqlite3_str_appendf(tls, bp+16, ts+6277, libc.VaList(bp, func() float64 { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_IntReal != 0 { return float64(*(*I64)(unsafe.Pointer(p))) } return *(*float64)(unsafe.Pointer(p)) }())) *(*int8)(unsafe.Pointer(zBuf + uintptr((*StrAccum)(unsafe.Pointer(bp+16)).FnChar))) = int8(0) (*Mem)(unsafe.Pointer(p)).Fn = int32((*StrAccum)(unsafe.Pointer(bp + 16)).FnChar) } } // If pMem is an object with a valid string representation, this routine // ensures the internal encoding for the string representation is // 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE. // // If pMem is not a string object, or the encoding of the string // representation is already stored using the requested encoding, then this // routine is a no-op. // // SQLITE_OK is returned if the conversion is successful (or not required). // SQLITE_NOMEM may be returned if a malloc() fails during conversion // between formats. func Xsqlite3VdbeChangeEncoding(tls *libc.TLS, pMem uintptr, desiredEnc int32) int32 { var rc int32 if !(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Str != 0) { (*Mem)(unsafe.Pointer(pMem)).Fenc = U8(desiredEnc) return SQLITE_OK } if int32((*Mem)(unsafe.Pointer(pMem)).Fenc) == desiredEnc { return SQLITE_OK } rc = Xsqlite3VdbeMemTranslate(tls, pMem, U8(desiredEnc)) return rc } // Make sure pMem->z points to a writable allocation of at least n bytes. // // If the bPreserve argument is true, then copy of the content of // pMem->z into the new allocation. pMem must be either a string or // blob if bPreserve is true. If bPreserve is false, any prior content // in pMem->z is discarded. func Xsqlite3VdbeMemGrow(tls *libc.TLS, pMem uintptr, n int32, bPreserve int32) int32 { if (*Mem)(unsafe.Pointer(pMem)).FszMalloc > 0 && bPreserve != 0 && (*Mem)(unsafe.Pointer(pMem)).Fz == (*Mem)(unsafe.Pointer(pMem)).FzMalloc { if (*Mem)(unsafe.Pointer(pMem)).Fdb != 0 { (*Mem)(unsafe.Pointer(pMem)).Fz = libc.AssignPtrUintptr(pMem+40, Xsqlite3DbReallocOrFree(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, (*Mem)(unsafe.Pointer(pMem)).Fz, uint64(n))) } else { (*Mem)(unsafe.Pointer(pMem)).FzMalloc = Xsqlite3Realloc(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, uint64(n)) if (*Mem)(unsafe.Pointer(pMem)).FzMalloc == uintptr(0) { Xsqlite3_free(tls, (*Mem)(unsafe.Pointer(pMem)).Fz) } (*Mem)(unsafe.Pointer(pMem)).Fz = (*Mem)(unsafe.Pointer(pMem)).FzMalloc } bPreserve = 0 } else { if (*Mem)(unsafe.Pointer(pMem)).FszMalloc > 0 { Xsqlite3DbFreeNN(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, (*Mem)(unsafe.Pointer(pMem)).FzMalloc) } (*Mem)(unsafe.Pointer(pMem)).FzMalloc = Xsqlite3DbMallocRaw(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, uint64(n)) } if (*Mem)(unsafe.Pointer(pMem)).FzMalloc == uintptr(0) { Xsqlite3VdbeMemSetNull(tls, pMem) (*Mem)(unsafe.Pointer(pMem)).Fz = uintptr(0) (*Mem)(unsafe.Pointer(pMem)).FszMalloc = 0 return SQLITE_NOMEM } else { (*Mem)(unsafe.Pointer(pMem)).FszMalloc = Xsqlite3DbMallocSize(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, (*Mem)(unsafe.Pointer(pMem)).FzMalloc) } if bPreserve != 0 && (*Mem)(unsafe.Pointer(pMem)).Fz != 0 { libc.Xmemcpy(tls, (*Mem)(unsafe.Pointer(pMem)).FzMalloc, (*Mem)(unsafe.Pointer(pMem)).Fz, uint64((*Mem)(unsafe.Pointer(pMem)).Fn)) } if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Dyn != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Mem)(unsafe.Pointer(pMem)).FxDel})).f(tls, (*Mem)(unsafe.Pointer(pMem)).Fz) } (*Mem)(unsafe.Pointer(pMem)).Fz = (*Mem)(unsafe.Pointer(pMem)).FzMalloc *(*U16)(unsafe.Pointer(pMem + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Dyn | MEM_Ephem | MEM_Static)) return SQLITE_OK } // Change the pMem->zMalloc allocation to be at least szNew bytes. // If pMem->zMalloc already meets or exceeds the requested size, this // routine is a no-op. // // Any prior string or blob content in the pMem object may be discarded. // The pMem->xDel destructor is called, if it exists. Though MEM_Str // and MEM_Blob values may be discarded, MEM_Int, MEM_Real, MEM_IntReal, // and MEM_Null values are preserved. // // Return SQLITE_OK on success or an error code (probably SQLITE_NOMEM) // if unable to complete the resizing. func Xsqlite3VdbeMemClearAndResize(tls *libc.TLS, pMem uintptr, szNew int32) int32 { if (*Mem)(unsafe.Pointer(pMem)).FszMalloc < szNew { return Xsqlite3VdbeMemGrow(tls, pMem, szNew, 0) } (*Mem)(unsafe.Pointer(pMem)).Fz = (*Mem)(unsafe.Pointer(pMem)).FzMalloc *(*U16)(unsafe.Pointer(pMem + 20)) &= U16(MEM_Null | MEM_Int | MEM_Real | MEM_IntReal) return SQLITE_OK } func vdbeMemAddTerminator(tls *libc.TLS, pMem uintptr) int32 { if Xsqlite3VdbeMemGrow(tls, pMem, (*Mem)(unsafe.Pointer(pMem)).Fn+3, 1) != 0 { return SQLITE_NOMEM } *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz + uintptr((*Mem)(unsafe.Pointer(pMem)).Fn))) = int8(0) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz + uintptr((*Mem)(unsafe.Pointer(pMem)).Fn+1))) = int8(0) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz + uintptr((*Mem)(unsafe.Pointer(pMem)).Fn+2))) = int8(0) *(*U16)(unsafe.Pointer(pMem + 20)) |= U16(MEM_Term) return SQLITE_OK } // Change pMem so that its MEM_Str or MEM_Blob value is stored in // MEM.zMalloc, where it can be safely written. // // Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails. func Xsqlite3VdbeMemMakeWriteable(tls *libc.TLS, pMem uintptr) int32 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Str|MEM_Blob) != 0 { if func() int32 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, pMem) } return 0 }() != 0 { return SQLITE_NOMEM } if (*Mem)(unsafe.Pointer(pMem)).FszMalloc == 0 || (*Mem)(unsafe.Pointer(pMem)).Fz != (*Mem)(unsafe.Pointer(pMem)).FzMalloc { var rc int32 = vdbeMemAddTerminator(tls, pMem) if rc != 0 { return rc } } } *(*U16)(unsafe.Pointer(pMem + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Ephem)) return SQLITE_OK } // If the given Mem* has a zero-filled tail, turn it into an ordinary // blob stored in dynamically allocated space. func Xsqlite3VdbeMemExpandBlob(tls *libc.TLS, pMem uintptr) int32 { var nByte int32 nByte = (*Mem)(unsafe.Pointer(pMem)).Fn + *(*int32)(unsafe.Pointer(pMem)) if nByte <= 0 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Blob == 0 { return SQLITE_OK } nByte = 1 } if Xsqlite3VdbeMemGrow(tls, pMem, nByte, 1) != 0 { return SQLITE_NOMEM } libc.Xmemset(tls, (*Mem)(unsafe.Pointer(pMem)).Fz+uintptr((*Mem)(unsafe.Pointer(pMem)).Fn), 0, uint64(*(*int32)(unsafe.Pointer(pMem)))) *(*int32)(unsafe.Pointer(pMem + 16)) += *(*int32)(unsafe.Pointer(pMem)) *(*U16)(unsafe.Pointer(pMem + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Zero | MEM_Term)) return SQLITE_OK } // Make sure the given Mem is \u0000 terminated. func Xsqlite3VdbeMemNulTerminate(tls *libc.TLS, pMem uintptr) int32 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Term|MEM_Str) != MEM_Str { return SQLITE_OK } else { return vdbeMemAddTerminator(tls, pMem) } return int32(0) } // Add MEM_Str to the set of representations for the given Mem. This // routine is only called if pMem is a number of some kind, not a NULL // or a BLOB. // // Existing representations MEM_Int, MEM_Real, or MEM_IntReal are invalidated // if bForce is true but are retained if bForce is false. // // A MEM_Null value will never be passed to this function. This function is // used for converting values to text for returning to the user (i.e. via // sqlite3_value_text()), or for ensuring that values to be used as btree // keys are strings. In the former case a NULL pointer is returned the // user and the latter is an internal programming error. func Xsqlite3VdbeMemStringify(tls *libc.TLS, pMem uintptr, enc U8, bForce U8) int32 { var nByte int32 = 32 if Xsqlite3VdbeMemClearAndResize(tls, pMem, nByte) != 0 { (*Mem)(unsafe.Pointer(pMem)).Fenc = U8(0) return SQLITE_NOMEM } vdbeMemRenderNum(tls, nByte, (*Mem)(unsafe.Pointer(pMem)).Fz, pMem) (*Mem)(unsafe.Pointer(pMem)).Fenc = U8(SQLITE_UTF8) *(*U16)(unsafe.Pointer(pMem + 20)) |= U16(MEM_Str | MEM_Term) if bForce != 0 { *(*U16)(unsafe.Pointer(pMem + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int | MEM_Real | MEM_IntReal)) } Xsqlite3VdbeChangeEncoding(tls, pMem, int32(enc)) return SQLITE_OK } // Memory cell pMem contains the context of an aggregate function. // This routine calls the finalize method for that function. The // result of the aggregate is stored back into pMem. // // Return SQLITE_ERROR if the finalizer reports an error. SQLITE_OK // otherwise. func Xsqlite3VdbeMemFinalize(tls *libc.TLS, pMem uintptr, pFunc uintptr) int32 { bp := tls.Alloc(112) defer tls.Free(112) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Sqlite3_context{}))) libc.Xmemset(tls, bp+56, 0, uint64(unsafe.Sizeof(Mem{}))) (*Mem)(unsafe.Pointer(bp + 56)).Fflags = U16(MEM_Null) (*Mem)(unsafe.Pointer(bp + 56)).Fdb = (*Mem)(unsafe.Pointer(pMem)).Fdb (*Sqlite3_context)(unsafe.Pointer(bp)).FpOut = bp + 56 (*Sqlite3_context)(unsafe.Pointer(bp)).FpMem = pMem (*Sqlite3_context)(unsafe.Pointer(bp)).FpFunc = pFunc (*Sqlite3_context)(unsafe.Pointer(bp)).Fenc = (*Sqlite3)(unsafe.Pointer((*Mem)(unsafe.Pointer(bp + 56)).Fdb)).Fenc (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*FuncDef)(unsafe.Pointer(pFunc)).FxFinalize})).f(tls, bp) if (*Mem)(unsafe.Pointer(pMem)).FszMalloc > 0 { Xsqlite3DbFreeNN(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, (*Mem)(unsafe.Pointer(pMem)).FzMalloc) } libc.Xmemcpy(tls, pMem, bp+56, uint64(unsafe.Sizeof(Mem{}))) return (*Sqlite3_context)(unsafe.Pointer(bp)).FisError } // Memory cell pAccum contains the context of an aggregate function. // This routine calls the xValue method for that function and stores // the results in memory cell pMem. // // SQLITE_ERROR is returned if xValue() reports an error. SQLITE_OK // otherwise. func Xsqlite3VdbeMemAggValue(tls *libc.TLS, pAccum uintptr, pOut uintptr, pFunc uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Sqlite3_context{}))) Xsqlite3VdbeMemSetNull(tls, pOut) (*Sqlite3_context)(unsafe.Pointer(bp)).FpOut = pOut (*Sqlite3_context)(unsafe.Pointer(bp)).FpMem = pAccum (*Sqlite3_context)(unsafe.Pointer(bp)).FpFunc = pFunc (*Sqlite3_context)(unsafe.Pointer(bp)).Fenc = (*Sqlite3)(unsafe.Pointer((*Mem)(unsafe.Pointer(pAccum)).Fdb)).Fenc (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*FuncDef)(unsafe.Pointer(pFunc)).FxValue})).f(tls, bp) return (*Sqlite3_context)(unsafe.Pointer(bp)).FisError } func vdbeMemClearExternAndSetNull(tls *libc.TLS, p uintptr) { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Agg != 0 { Xsqlite3VdbeMemFinalize(tls, p, *(*uintptr)(unsafe.Pointer(p))) } if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Dyn != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Mem)(unsafe.Pointer(p)).FxDel})).f(tls, (*Mem)(unsafe.Pointer(p)).Fz) } (*Mem)(unsafe.Pointer(p)).Fflags = U16(MEM_Null) } func vdbeMemClear(tls *libc.TLS, p uintptr) { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 { vdbeMemClearExternAndSetNull(tls, p) } if (*Mem)(unsafe.Pointer(p)).FszMalloc != 0 { Xsqlite3DbFreeNN(tls, (*Mem)(unsafe.Pointer(p)).Fdb, (*Mem)(unsafe.Pointer(p)).FzMalloc) (*Mem)(unsafe.Pointer(p)).FszMalloc = 0 } (*Mem)(unsafe.Pointer(p)).Fz = uintptr(0) } // Release any memory resources held by the Mem. Both the memory that is // free by Mem.xDel and the Mem.zMalloc allocation are freed. // // Use this routine prior to clean up prior to abandoning a Mem, or to // reset a Mem back to its minimum memory utilization. // // Use sqlite3VdbeMemSetNull() to release just the Mem.xDel space // prior to inserting new content into the Mem. func Xsqlite3VdbeMemRelease(tls *libc.TLS, p uintptr) { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 || (*Mem)(unsafe.Pointer(p)).FszMalloc != 0 { vdbeMemClear(tls, p) } } // Like sqlite3VdbeMemRelease() but faster for cases where we // know in advance that the Mem is not MEM_Dyn or MEM_Agg. func Xsqlite3VdbeMemReleaseMalloc(tls *libc.TLS, p uintptr) { if (*Mem)(unsafe.Pointer(p)).FszMalloc != 0 { vdbeMemClear(tls, p) } } func doubleToInt64(tls *libc.TLS, r float64) I64 { if r <= float64(minInt) { return minInt } else if r >= float64(maxInt) { return maxInt } else { return I64(r) } return I64(0) } var maxInt I64 = int64(0xffffffff) | int64(0x7fffffff)<<32 var minInt I64 = int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32) func memIntValue(tls *libc.TLS, pMem uintptr) I64 { bp := tls.Alloc(8) defer tls.Free(8) *(*I64)(unsafe.Pointer(bp)) = int64(0) Xsqlite3Atoi64(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, bp, (*Mem)(unsafe.Pointer(pMem)).Fn, (*Mem)(unsafe.Pointer(pMem)).Fenc) return *(*I64)(unsafe.Pointer(bp)) } func Xsqlite3VdbeIntValue(tls *libc.TLS, pMem uintptr) I64 { var flags int32 flags = int32((*Mem)(unsafe.Pointer(pMem)).Fflags) if flags&(MEM_Int|MEM_IntReal) != 0 { return *(*I64)(unsafe.Pointer(pMem)) } else if flags&MEM_Real != 0 { return doubleToInt64(tls, *(*float64)(unsafe.Pointer(pMem))) } else if flags&(MEM_Str|MEM_Blob) != 0 && (*Mem)(unsafe.Pointer(pMem)).Fz != uintptr(0) { return memIntValue(tls, pMem) } else { return int64(0) } return I64(0) } func memRealValue(tls *libc.TLS, pMem uintptr) float64 { bp := tls.Alloc(8) defer tls.Free(8) *(*float64)(unsafe.Pointer(bp)) = float64(0) Xsqlite3AtoF(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, bp, (*Mem)(unsafe.Pointer(pMem)).Fn, (*Mem)(unsafe.Pointer(pMem)).Fenc) return *(*float64)(unsafe.Pointer(bp)) } func Xsqlite3VdbeRealValue(tls *libc.TLS, pMem uintptr) float64 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Real != 0 { return *(*float64)(unsafe.Pointer(pMem)) } else if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Int|MEM_IntReal) != 0 { return float64(*(*I64)(unsafe.Pointer(pMem))) } else if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Str|MEM_Blob) != 0 { return memRealValue(tls, pMem) } else { return float64(0) } return float64(0) } // Return 1 if pMem represents true, and return 0 if pMem represents false. // Return the value ifNull if pMem is NULL. func Xsqlite3VdbeBooleanValue(tls *libc.TLS, pMem uintptr, ifNull int32) int32 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Int|MEM_IntReal) != 0 { return libc.Bool32(*(*I64)(unsafe.Pointer(pMem)) != int64(0)) } if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Null != 0 { return ifNull } return libc.Bool32(Xsqlite3VdbeRealValue(tls, pMem) != 0.0) } // The MEM structure is already a MEM_Real or MEM_IntReal. Try to // make it a MEM_Int if we can. func Xsqlite3VdbeIntegerAffinity(tls *libc.TLS, pMem uintptr) { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_IntReal != 0 { (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) } else { var ix I64 = doubleToInt64(tls, *(*float64)(unsafe.Pointer(pMem))) if *(*float64)(unsafe.Pointer(pMem)) == float64(ix) && ix > int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32) && ix < int64(0xffffffff)|int64(0x7fffffff)<<32 { *(*I64)(unsafe.Pointer(pMem)) = ix (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) } } } // Convert pMem to type integer. Invalidate any prior representations. func Xsqlite3VdbeMemIntegerify(tls *libc.TLS, pMem uintptr) int32 { *(*I64)(unsafe.Pointer(pMem)) = Xsqlite3VdbeIntValue(tls, pMem) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) return SQLITE_OK } // Convert pMem so that it is of type MEM_Real. // Invalidate any prior representations. func Xsqlite3VdbeMemRealify(tls *libc.TLS, pMem uintptr) int32 { *(*float64)(unsafe.Pointer(pMem)) = Xsqlite3VdbeRealValue(tls, pMem) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Real) return SQLITE_OK } // Compare a floating point value to an integer. Return true if the two // values are the same within the precision of the floating point value. // // This function assumes that i was obtained by assignment from r1. // // For some versions of GCC on 32-bit machines, if you do the more obvious // comparison of "r1==(double)i" you sometimes get an answer of false even // though the r1 and (double)i values are bit-for-bit the same. func Xsqlite3RealSameAsInt(tls *libc.TLS, r1 float64, i Sqlite3_int64) int32 { bp := tls.Alloc(16) defer tls.Free(16) *(*float64)(unsafe.Pointer(bp)) = r1 *(*float64)(unsafe.Pointer(bp + 8)) = float64(i) return libc.Bool32(*(*float64)(unsafe.Pointer(bp)) == 0.0 || libc.Xmemcmp(tls, bp, bp+8, uint64(unsafe.Sizeof(float64(0)))) == 0 && i >= -2251799813685248 && i < 2251799813685248) } // Convert a floating point value to its closest integer. Do so in // a way that avoids 'outside the range of representable values' warnings // from UBSAN. func Xsqlite3RealToI64(tls *libc.TLS, r float64) I64 { if r <= float64(int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32)) { return int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32) } if r >= float64(int64(0xffffffff)|int64(0x7fffffff)<<32) { return int64(0xffffffff) | int64(0x7fffffff)<<32 } return I64(r) } // Convert pMem so that it has type MEM_Real or MEM_Int. // Invalidate any prior representations. // // Every effort is made to force the conversion, even if the input // is a string that does not look completely like a number. Convert // as much of the string as we can and ignore the rest. func Xsqlite3VdbeMemNumerify(tls *libc.TLS, pMem uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Int|MEM_Real|MEM_IntReal|MEM_Null) == 0 { var rc int32 rc = Xsqlite3AtoF(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, pMem, (*Mem)(unsafe.Pointer(pMem)).Fn, (*Mem)(unsafe.Pointer(pMem)).Fenc) if (rc == 0 || rc == 1) && Xsqlite3Atoi64(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, bp, (*Mem)(unsafe.Pointer(pMem)).Fn, (*Mem)(unsafe.Pointer(pMem)).Fenc) <= 1 || Xsqlite3RealSameAsInt(tls, *(*float64)(unsafe.Pointer(pMem)), libc.AssignPtrInt64(bp, Xsqlite3RealToI64(tls, *(*float64)(unsafe.Pointer(pMem))))) != 0 { *(*I64)(unsafe.Pointer(pMem)) = *(*Sqlite3_int64)(unsafe.Pointer(bp)) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) } else { (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Real) } } *(*U16)(unsafe.Pointer(pMem + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Str | MEM_Blob | MEM_Zero)) return SQLITE_OK } // Cast the datatype of the value in pMem according to the affinity // "aff". Casting is different from applying affinity in that a cast // is forced. In other words, the value is converted into the desired // affinity even if that results in loss of data. This routine is // used (for example) to implement the SQL "cast()" operator. func Xsqlite3VdbeMemCast(tls *libc.TLS, pMem uintptr, aff U8, encoding U8) int32 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Null != 0 { return SQLITE_OK } switch int32(aff) { case SQLITE_AFF_BLOB: { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Blob == 0 { Xsqlite3ValueApplyAffinity(tls, pMem, uint8(SQLITE_AFF_TEXT), encoding) if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Str != 0 { (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Blob) } } else { *(*U16)(unsafe.Pointer(pMem + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_TypeMask & libc.CplInt32(MEM_Blob))) } break } case SQLITE_AFF_NUMERIC: { Xsqlite3VdbeMemNumerify(tls, pMem) break } case SQLITE_AFF_INTEGER: { Xsqlite3VdbeMemIntegerify(tls, pMem) break } case SQLITE_AFF_REAL: { Xsqlite3VdbeMemRealify(tls, pMem) break } default: { *(*U16)(unsafe.Pointer(pMem + 20)) |= U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags) & MEM_Blob >> 3) Xsqlite3ValueApplyAffinity(tls, pMem, uint8(SQLITE_AFF_TEXT), encoding) *(*U16)(unsafe.Pointer(pMem + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int | MEM_Real | MEM_IntReal | MEM_Blob | MEM_Zero)) if int32(encoding) != SQLITE_UTF8 { *(*int32)(unsafe.Pointer(pMem + 16)) &= libc.CplInt32(1) } return Xsqlite3VdbeChangeEncoding(tls, pMem, int32(encoding)) } } return SQLITE_OK } // Initialize bulk memory to be a consistent Mem object. // // The minimum amount of initialization feasible is performed. func Xsqlite3VdbeMemInit(tls *libc.TLS, pMem uintptr, db uintptr, flags U16) { (*Mem)(unsafe.Pointer(pMem)).Fflags = flags (*Mem)(unsafe.Pointer(pMem)).Fdb = db (*Mem)(unsafe.Pointer(pMem)).FszMalloc = 0 } // Delete any previous value and set the value stored in *pMem to NULL. // // This routine calls the Mem.xDel destructor to dispose of values that // require the destructor. But it preserves the Mem.zMalloc memory allocation. // To free all resources, use sqlite3VdbeMemRelease(), which both calls this // routine to invoke the destructor and deallocates Mem.zMalloc. // // Use this routine to reset the Mem prior to insert a new value. // // Use sqlite3VdbeMemRelease() to complete erase the Mem prior to abandoning it. func Xsqlite3VdbeMemSetNull(tls *libc.TLS, pMem uintptr) { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 { vdbeMemClearExternAndSetNull(tls, pMem) } else { (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Null) } } func Xsqlite3ValueSetNull(tls *libc.TLS, p uintptr) { Xsqlite3VdbeMemSetNull(tls, p) } // Delete any previous value and set the value to be a BLOB of length // n containing all zeros. func Xsqlite3VdbeMemSetZeroBlob(tls *libc.TLS, pMem uintptr, n int32) { Xsqlite3VdbeMemRelease(tls, pMem) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Blob | MEM_Zero) (*Mem)(unsafe.Pointer(pMem)).Fn = 0 if n < 0 { n = 0 } *(*int32)(unsafe.Pointer(pMem)) = n (*Mem)(unsafe.Pointer(pMem)).Fenc = U8(SQLITE_UTF8) (*Mem)(unsafe.Pointer(pMem)).Fz = uintptr(0) } func vdbeReleaseAndSetInt64(tls *libc.TLS, pMem uintptr, val I64) { Xsqlite3VdbeMemSetNull(tls, pMem) *(*I64)(unsafe.Pointer(pMem)) = val (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) } // Delete any previous value and set the value stored in *pMem to val, // manifest type INTEGER. func Xsqlite3VdbeMemSetInt64(tls *libc.TLS, pMem uintptr, val I64) { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 { vdbeReleaseAndSetInt64(tls, pMem, val) } else { *(*I64)(unsafe.Pointer(pMem)) = val (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) } } // A no-op destructor func Xsqlite3NoopDestructor(tls *libc.TLS, p uintptr) { _ = p } // Set the value stored in *pMem should already be a NULL. // Also store a pointer to go with it. func Xsqlite3VdbeMemSetPointer(tls *libc.TLS, pMem uintptr, pPtr uintptr, zPType uintptr, xDestructor uintptr) { vdbeMemClear(tls, pMem) *(*uintptr)(unsafe.Pointer(pMem)) = func() uintptr { if zPType != 0 { return zPType } return ts + 1544 }() (*Mem)(unsafe.Pointer(pMem)).Fz = pPtr (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Null | MEM_Dyn | MEM_Subtype | MEM_Term) (*Mem)(unsafe.Pointer(pMem)).FeSubtype = U8('p') (*Mem)(unsafe.Pointer(pMem)).FxDel = func() uintptr { if xDestructor != 0 { return xDestructor } return *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3NoopDestructor})) }() } // Delete any previous value and set the value stored in *pMem to val, // manifest type REAL. func Xsqlite3VdbeMemSetDouble(tls *libc.TLS, pMem uintptr, val float64) { Xsqlite3VdbeMemSetNull(tls, pMem) if !(Xsqlite3IsNaN(tls, val) != 0) { *(*float64)(unsafe.Pointer(pMem)) = val (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Real) } } // Delete any previous value and set the value of pMem to be an // empty boolean index. // // Return SQLITE_OK on success and SQLITE_NOMEM if a memory allocation // error occurs. func Xsqlite3VdbeMemSetRowSet(tls *libc.TLS, pMem uintptr) int32 { var db uintptr = (*Mem)(unsafe.Pointer(pMem)).Fdb var p uintptr Xsqlite3VdbeMemRelease(tls, pMem) p = Xsqlite3RowSetInit(tls, db) if p == uintptr(0) { return SQLITE_NOMEM } (*Mem)(unsafe.Pointer(pMem)).Fz = p (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Blob | MEM_Dyn) (*Mem)(unsafe.Pointer(pMem)).FxDel = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3RowSetDelete})) return SQLITE_OK } // Return true if the Mem object contains a TEXT or BLOB that is // too large - whose size exceeds SQLITE_MAX_LENGTH. func Xsqlite3VdbeMemTooBig(tls *libc.TLS, p uintptr) int32 { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_Str|MEM_Blob) != 0 { var n int32 = (*Mem)(unsafe.Pointer(p)).Fn if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Zero != 0 { n = n + *(*int32)(unsafe.Pointer(p)) } return libc.Bool32(n > *(*int32)(unsafe.Pointer((*Mem)(unsafe.Pointer(p)).Fdb + 136))) } return 0 } func vdbeClrCopy(tls *libc.TLS, pTo uintptr, pFrom uintptr, eType int32) { vdbeMemClearExternAndSetNull(tls, pTo) Xsqlite3VdbeMemShallowCopy(tls, pTo, pFrom, eType) } func Xsqlite3VdbeMemShallowCopy(tls *libc.TLS, pTo uintptr, pFrom uintptr, srcType int32) { if int32((*Mem)(unsafe.Pointer(pTo)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 { vdbeClrCopy(tls, pTo, pFrom, srcType) return } libc.Xmemcpy(tls, pTo, pFrom, uint64(uintptr(0)+24)) if int32((*Mem)(unsafe.Pointer(pFrom)).Fflags)&MEM_Static == 0 { *(*U16)(unsafe.Pointer(pTo + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Dyn | MEM_Static | MEM_Ephem)) *(*U16)(unsafe.Pointer(pTo + 20)) |= U16(srcType) } } // Make a full copy of pFrom into pTo. Prior contents of pTo are // freed before the copy is made. func Xsqlite3VdbeMemCopy(tls *libc.TLS, pTo uintptr, pFrom uintptr) int32 { var rc int32 = SQLITE_OK if int32((*Mem)(unsafe.Pointer(pTo)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 { vdbeMemClearExternAndSetNull(tls, pTo) } libc.Xmemcpy(tls, pTo, pFrom, uint64(uintptr(0)+24)) *(*U16)(unsafe.Pointer(pTo + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Dyn)) if int32((*Mem)(unsafe.Pointer(pTo)).Fflags)&(MEM_Str|MEM_Blob) != 0 { if 0 == int32((*Mem)(unsafe.Pointer(pFrom)).Fflags)&MEM_Static { *(*U16)(unsafe.Pointer(pTo + 20)) |= U16(MEM_Ephem) rc = Xsqlite3VdbeMemMakeWriteable(tls, pTo) } } return rc } // Transfer the contents of pFrom to pTo. Any existing value in pTo is // freed. If pFrom contains ephemeral data, a copy is made. // // pFrom contains an SQL NULL when this routine returns. func Xsqlite3VdbeMemMove(tls *libc.TLS, pTo uintptr, pFrom uintptr) { Xsqlite3VdbeMemRelease(tls, pTo) libc.Xmemcpy(tls, pTo, pFrom, uint64(unsafe.Sizeof(Mem{}))) (*Mem)(unsafe.Pointer(pFrom)).Fflags = U16(MEM_Null) (*Mem)(unsafe.Pointer(pFrom)).FszMalloc = 0 } // Change the value of a Mem to be a string or a BLOB. // // The memory management strategy depends on the value of the xDel // parameter. If the value passed is SQLITE_TRANSIENT, then the // string is copied into a (possibly existing) buffer managed by the // Mem structure. Otherwise, any existing buffer is freed and the // pointer copied. // // If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH // size limit) then no memory allocation occurs. If the string can be // stored without allocating memory, then it is. If a memory allocation // is required to store the string, then value of pMem is unchanged. In // either case, SQLITE_TOOBIG is returned. // // The "enc" parameter is the text encoding for the string, or zero // to store a blob. // // If n is negative, then the string consists of all bytes up to but // excluding the first zero character. The n parameter must be // non-negative for blobs. func Xsqlite3VdbeMemSetStr(tls *libc.TLS, pMem uintptr, z uintptr, n I64, enc U8, xDel uintptr) int32 { var nByte I64 = n var iLimit int32 var flags U16 if !(z != 0) { Xsqlite3VdbeMemSetNull(tls, pMem) return SQLITE_OK } if (*Mem)(unsafe.Pointer(pMem)).Fdb != 0 { iLimit = *(*int32)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fdb + 136)) } else { iLimit = SQLITE_MAX_LENGTH } if nByte < int64(0) { if int32(enc) == SQLITE_UTF8 { nByte = I64(libc.Xstrlen(tls, z)) } else { for nByte = int64(0); nByte <= I64(iLimit) && int32(*(*int8)(unsafe.Pointer(z + uintptr(nByte))))|int32(*(*int8)(unsafe.Pointer(z + uintptr(nByte+int64(1))))) != 0; nByte = nByte + int64(2) { } } flags = U16(MEM_Str | MEM_Term) } else if int32(enc) == 0 { flags = U16(MEM_Blob) enc = U8(SQLITE_UTF8) } else { flags = U16(MEM_Str) } if nByte > I64(iLimit) { if xDel != 0 && xDel != libc.UintptrFromInt32(-1) { if xDel == *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear})) { Xsqlite3DbFree(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, z) } else { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDel})).f(tls, z) } } Xsqlite3VdbeMemSetNull(tls, pMem) return Xsqlite3ErrorToParser(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, SQLITE_TOOBIG) } if xDel == libc.UintptrFromInt32(-1) { var nAlloc I64 = nByte if int32(flags)&MEM_Term != 0 { nAlloc = nAlloc + func() int64 { if int32(enc) == SQLITE_UTF8 { return int64(1) } return int64(2) }() } if Xsqlite3VdbeMemClearAndResize(tls, pMem, func() int32 { if nAlloc > int64(32) { return int32(nAlloc) } return 32 }()) != 0 { return SQLITE_NOMEM } libc.Xmemcpy(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, z, uint64(nAlloc)) } else { Xsqlite3VdbeMemRelease(tls, pMem) (*Mem)(unsafe.Pointer(pMem)).Fz = z if xDel == *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear})) { (*Mem)(unsafe.Pointer(pMem)).FzMalloc = (*Mem)(unsafe.Pointer(pMem)).Fz (*Mem)(unsafe.Pointer(pMem)).FszMalloc = Xsqlite3DbMallocSize(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, (*Mem)(unsafe.Pointer(pMem)).FzMalloc) } else { (*Mem)(unsafe.Pointer(pMem)).FxDel = xDel flags = U16(int32(flags) | func() int32 { if xDel == uintptr(0) { return MEM_Static } return MEM_Dyn }()) } } (*Mem)(unsafe.Pointer(pMem)).Fn = int32(nByte & int64(0x7fffffff)) (*Mem)(unsafe.Pointer(pMem)).Fflags = flags (*Mem)(unsafe.Pointer(pMem)).Fenc = enc if int32(enc) > SQLITE_UTF8 && Xsqlite3VdbeMemHandleBom(tls, pMem) != 0 { return SQLITE_NOMEM } return SQLITE_OK } // 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 Xsqlite3VdbeMemFromBtree(tls *libc.TLS, pCur uintptr, offset U32, amt U32, pMem uintptr) int32 { var rc int32 (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Null) if Xsqlite3BtreeMaxRecordSize(tls, pCur) < Sqlite3_int64(offset+amt) { return Xsqlite3CorruptError(tls, 81634) } if SQLITE_OK == libc.AssignInt32(&rc, Xsqlite3VdbeMemClearAndResize(tls, pMem, int32(amt+U32(1)))) { rc = Xsqlite3BtreePayload(tls, pCur, offset, amt, (*Mem)(unsafe.Pointer(pMem)).Fz) if rc == SQLITE_OK { *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pMem)).Fz + uintptr(amt))) = int8(0) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Blob) (*Mem)(unsafe.Pointer(pMem)).Fn = int32(amt) } else { Xsqlite3VdbeMemRelease(tls, pMem) } } return rc } func Xsqlite3VdbeMemFromBtreeZeroOffset(tls *libc.TLS, pCur uintptr, amt U32, pMem uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*U32)(unsafe.Pointer(bp)) = U32(0) var rc int32 = SQLITE_OK (*Mem)(unsafe.Pointer(pMem)).Fz = Xsqlite3BtreePayloadFetch(tls, pCur, bp) if amt <= *(*U32)(unsafe.Pointer(bp)) { (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Blob | MEM_Ephem) (*Mem)(unsafe.Pointer(pMem)).Fn = int32(amt) } else { rc = Xsqlite3VdbeMemFromBtree(tls, pCur, uint32(0), amt, pMem) } return rc } func valueToText(tls *libc.TLS, pVal uintptr, enc U8) uintptr { if int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&(MEM_Blob|MEM_Str) != 0 { if func() int32 { if int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, pVal) } return 0 }() != 0 { return uintptr(0) } *(*U16)(unsafe.Pointer(pVal + 20)) |= U16(MEM_Str) if int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fenc) != int32(enc)&libc.CplInt32(SQLITE_UTF16_ALIGNED) { Xsqlite3VdbeChangeEncoding(tls, pVal, int32(enc)&libc.CplInt32(SQLITE_UTF16_ALIGNED)) } if int32(enc)&SQLITE_UTF16_ALIGNED != 0 && 1 == 1&int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fz) { if Xsqlite3VdbeMemMakeWriteable(tls, pVal) != SQLITE_OK { return uintptr(0) } } Xsqlite3VdbeMemNulTerminate(tls, pVal) } else { Xsqlite3VdbeMemStringify(tls, pVal, enc, uint8(0)) } if int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fenc) == int32(enc)&libc.CplInt32(SQLITE_UTF16_ALIGNED) { return (*Sqlite3_value)(unsafe.Pointer(pVal)).Fz } else { return uintptr(0) } return uintptr(0) } // This function is only available internally, it is not part of the // external API. It works in a similar way to sqlite3_value_text(), // except the data returned is in the encoding specified by the second // parameter, which must be one of SQLITE_UTF16BE, SQLITE_UTF16LE or // SQLITE_UTF8. // // (2006-02-16:) The enc value can be or-ed with SQLITE_UTF16_ALIGNED. // If that is the case, then the result must be aligned on an even byte // boundary. func Xsqlite3ValueText(tls *libc.TLS, pVal uintptr, enc U8) uintptr { if !(pVal != 0) { return uintptr(0) } if int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&(MEM_Str|MEM_Term) == MEM_Str|MEM_Term && int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fenc) == int32(enc) { return (*Sqlite3_value)(unsafe.Pointer(pVal)).Fz } if int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&MEM_Null != 0 { return uintptr(0) } return valueToText(tls, pVal, enc) } // Create a new sqlite3_value object. func Xsqlite3ValueNew(tls *libc.TLS, db uintptr) uintptr { var p uintptr = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Mem{}))) if p != 0 { (*Mem)(unsafe.Pointer(p)).Fflags = U16(MEM_Null) (*Mem)(unsafe.Pointer(p)).Fdb = db } return p } // Context object passed by sqlite3Stat4ProbeSetValue() through to // valueNew(). See comments above valueNew() for details. type ValueNewStat4Ctx = struct { FpParse uintptr FpIdx uintptr FppRec uintptr FiVal int32 F__ccgo_pad1 [4]byte } func valueNew(tls *libc.TLS, db uintptr, p uintptr) uintptr { if p != 0 { var pRec uintptr = *(*uintptr)(unsafe.Pointer((*ValueNewStat4Ctx)(unsafe.Pointer(p)).FppRec)) if pRec == uintptr(0) { var pIdx uintptr = (*ValueNewStat4Ctx)(unsafe.Pointer(p)).FpIdx var nByte int32 var i int32 var nCol int32 = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) nByte = int32(uint64(unsafe.Sizeof(Mem{}))*uint64(nCol) + (uint64(unsafe.Sizeof(UnpackedRecord{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))) pRec = Xsqlite3DbMallocZero(tls, db, uint64(nByte)) if pRec != 0 { (*UnpackedRecord)(unsafe.Pointer(pRec)).FpKeyInfo = Xsqlite3KeyInfoOfIndex(tls, (*ValueNewStat4Ctx)(unsafe.Pointer(p)).FpParse, pIdx) if (*UnpackedRecord)(unsafe.Pointer(pRec)).FpKeyInfo != 0 { (*UnpackedRecord)(unsafe.Pointer(pRec)).FaMem = pRec + uintptr((uint64(unsafe.Sizeof(UnpackedRecord{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))) for i = 0; i < nCol; i++ { (*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(pRec)).FaMem + uintptr(i)*56)).Fflags = U16(MEM_Null) (*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(pRec)).FaMem + uintptr(i)*56)).Fdb = db } } else { Xsqlite3DbFreeNN(tls, db, pRec) pRec = uintptr(0) } } if pRec == uintptr(0) { return uintptr(0) } *(*uintptr)(unsafe.Pointer((*ValueNewStat4Ctx)(unsafe.Pointer(p)).FppRec)) = pRec } (*UnpackedRecord)(unsafe.Pointer(pRec)).FnField = U16((*ValueNewStat4Ctx)(unsafe.Pointer(p)).FiVal + 1) return (*UnpackedRecord)(unsafe.Pointer(pRec)).FaMem + uintptr((*ValueNewStat4Ctx)(unsafe.Pointer(p)).FiVal)*56 } return Xsqlite3ValueNew(tls, db) } func valueFromFunction(tls *libc.TLS, db uintptr, p uintptr, enc U8, aff U8, ppVal uintptr, pCtx uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var apVal uintptr var nVal int32 var pFunc uintptr var pVal uintptr var rc int32 var pList uintptr var i int32 apVal = uintptr(0) nVal = 0 pFunc = uintptr(0) pVal = uintptr(0) rc = SQLITE_OK pList = uintptr(0) pList = *(*uintptr)(unsafe.Pointer(p + 32)) if !(pList != 0) { goto __1 } nVal = (*ExprList)(unsafe.Pointer(pList)).FnExpr __1: ; pFunc = Xsqlite3FindFunction(tls, db, *(*uintptr)(unsafe.Pointer(p + 8)), nVal, enc, uint8(0)) if !((*FuncDef)(unsafe.Pointer(pFunc)).FfuncFlags&U32(SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) == U32(0) || (*FuncDef)(unsafe.Pointer(pFunc)).FfuncFlags&U32(SQLITE_FUNC_NEEDCOLL) != 0) { goto __2 } return SQLITE_OK __2: ; if !(pList != 0) { goto __3 } apVal = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(uintptr(0)))*uint64(nVal)) if !(apVal == uintptr(0)) { goto __4 } rc = SQLITE_NOMEM goto value_from_function_out __4: ; i = 0 __5: if !(i < nVal) { goto __7 } rc = Xsqlite3ValueFromExpr(tls, db, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr, enc, aff, apVal+uintptr(i)*8) if !(*(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8)) == uintptr(0) || rc != SQLITE_OK) { goto __8 } goto value_from_function_out __8: ; goto __6 __6: i++ goto __5 goto __7 __7: ; __3: ; pVal = valueNew(tls, db, pCtx) if !(pVal == uintptr(0)) { goto __9 } rc = SQLITE_NOMEM goto value_from_function_out __9: ; libc.Xmemset(tls, bp+8, 0, uint64(unsafe.Sizeof(Sqlite3_context{}))) (*Sqlite3_context)(unsafe.Pointer(bp + 8)).FpOut = pVal (*Sqlite3_context)(unsafe.Pointer(bp + 8)).FpFunc = pFunc (*Sqlite3_context)(unsafe.Pointer(bp + 8)).Fenc = (*Sqlite3)(unsafe.Pointer(db)).Fenc (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*FuncDef)(unsafe.Pointer(pFunc)).FxSFunc})).f(tls, bp+8, nVal, apVal) if !((*Sqlite3_context)(unsafe.Pointer(bp+8)).FisError != 0) { goto __10 } rc = (*Sqlite3_context)(unsafe.Pointer(bp + 8)).FisError Xsqlite3ErrorMsg(tls, (*ValueNewStat4Ctx)(unsafe.Pointer(pCtx)).FpParse, ts+4493, libc.VaList(bp, Xsqlite3_value_text(tls, pVal))) goto __11 __10: Xsqlite3ValueApplyAffinity(tls, pVal, aff, uint8(SQLITE_UTF8)) __11: ; value_from_function_out: if !(rc != SQLITE_OK) { goto __12 } pVal = uintptr(0) (*Parse)(unsafe.Pointer((*ValueNewStat4Ctx)(unsafe.Pointer(pCtx)).FpParse)).Frc = rc __12: ; if !(apVal != 0) { goto __13 } i = 0 __14: if !(i < nVal) { goto __16 } Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8))) goto __15 __15: i++ goto __14 goto __16 __16: ; Xsqlite3DbFreeNN(tls, db, apVal) __13: ; *(*uintptr)(unsafe.Pointer(ppVal)) = pVal return rc } func valueFromExpr(tls *libc.TLS, db uintptr, pExpr uintptr, enc U8, affinity U8, ppVal uintptr, pCtx uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var op int32 var zVal uintptr var negInt int32 var zNeg uintptr var rc int32 var aff U8 var nVal int32 zVal = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) negInt = 1 zNeg = ts + 1544 rc = SQLITE_OK __1: if !(libc.AssignInt32(&op, int32((*Expr)(unsafe.Pointer(pExpr)).Fop)) == TK_UPLUS || op == TK_SPAN) { goto __2 } pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft goto __1 __2: ; if !(op == TK_REGISTER) { goto __3 } op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop2) __3: ; if !(op == TK_CAST) { goto __4 } aff = U8(Xsqlite3AffinityType(tls, *(*uintptr)(unsafe.Pointer(pExpr + 8)), uintptr(0))) rc = valueFromExpr(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, enc, aff, ppVal, pCtx) if !(*(*uintptr)(unsafe.Pointer(ppVal)) != 0) { goto __5 } Xsqlite3VdbeMemCast(tls, *(*uintptr)(unsafe.Pointer(ppVal)), aff, enc) Xsqlite3ValueApplyAffinity(tls, *(*uintptr)(unsafe.Pointer(ppVal)), affinity, enc) __5: ; return rc __4: ; if !(op == TK_UMINUS && (int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft)).Fop) == TK_INTEGER || int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft)).Fop) == TK_FLOAT)) { goto __6 } pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) negInt = -1 zNeg = ts + 6284 __6: ; if !(op == TK_STRING || op == TK_FLOAT || op == TK_INTEGER) { goto __7 } *(*uintptr)(unsafe.Pointer(bp + 16)) = valueNew(tls, db, pCtx) if !(*(*uintptr)(unsafe.Pointer(bp + 16)) == uintptr(0)) { goto __9 } goto no_mem __9: ; if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_IntValue) != U32(0)) { goto __10 } Xsqlite3VdbeMemSetInt64(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), I64(*(*int32)(unsafe.Pointer(pExpr + 8)))*I64(negInt)) goto __11 __10: zVal = Xsqlite3MPrintf(tls, db, ts+6286, libc.VaList(bp, zNeg, *(*uintptr)(unsafe.Pointer(pExpr + 8)))) if !(zVal == uintptr(0)) { goto __12 } goto no_mem __12: ; Xsqlite3ValueSetStr(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), -1, zVal, uint8(SQLITE_UTF8), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) __11: ; if !((op == TK_INTEGER || op == TK_FLOAT) && int32(affinity) == SQLITE_AFF_BLOB) { goto __13 } Xsqlite3ValueApplyAffinity(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), uint8(SQLITE_AFF_NUMERIC), uint8(SQLITE_UTF8)) goto __14 __13: Xsqlite3ValueApplyAffinity(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), affinity, uint8(SQLITE_UTF8)) __14: ; if !(int32((*Sqlite3_value)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fflags)&(MEM_Int|MEM_IntReal|MEM_Real) != 0) { goto __15 } *(*U16)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)) + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Str)) __15: ; if !(int32(enc) != SQLITE_UTF8) { goto __16 } rc = Xsqlite3VdbeChangeEncoding(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), int32(enc)) __16: ; goto __8 __7: if !(op == TK_UMINUS) { goto __17 } if !(SQLITE_OK == valueFromExpr(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, enc, affinity, bp+16, pCtx) && *(*uintptr)(unsafe.Pointer(bp + 16)) != uintptr(0)) { goto __19 } Xsqlite3VdbeMemNumerify(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if !(int32((*Sqlite3_value)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fflags)&MEM_Real != 0) { goto __20 } *(*float64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) = -*(*float64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) goto __21 __20: if !(*(*I64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) == int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32)) { goto __22 } *(*float64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) = -float64(int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32)) (*Sqlite3_value)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fflags = U16(int32((*Sqlite3_value)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Real) goto __23 __22: *(*I64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) = -*(*I64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) __23: ; __21: ; Xsqlite3ValueApplyAffinity(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), affinity, enc) __19: ; goto __18 __17: if !(op == TK_NULL) { goto __24 } *(*uintptr)(unsafe.Pointer(bp + 16)) = valueNew(tls, db, pCtx) if !(*(*uintptr)(unsafe.Pointer(bp + 16)) == uintptr(0)) { goto __26 } goto no_mem __26: ; Xsqlite3VdbeMemSetNull(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) goto __25 __24: if !(op == TK_BLOB) { goto __27 } *(*uintptr)(unsafe.Pointer(bp + 16)) = valueNew(tls, db, pCtx) if !!(*(*uintptr)(unsafe.Pointer(bp + 16)) != 0) { goto __29 } goto no_mem __29: ; zVal = *(*uintptr)(unsafe.Pointer(pExpr + 8)) + 2 nVal = Xsqlite3Strlen30(tls, zVal) - 1 Xsqlite3VdbeMemSetStr(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), Xsqlite3HexToBlob(tls, db, zVal, nVal), int64(nVal/2), uint8(0), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) goto __28 __27: if !(op == TK_FUNCTION && pCtx != uintptr(0)) { goto __30 } rc = valueFromFunction(tls, db, pExpr, enc, affinity, bp+16, pCtx) goto __31 __30: if !(op == TK_TRUEFALSE) { goto __32 } *(*uintptr)(unsafe.Pointer(bp + 16)) = valueNew(tls, db, pCtx) if !(*(*uintptr)(unsafe.Pointer(bp + 16)) != 0) { goto __33 } (*Sqlite3_value)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fflags = U16(MEM_Int) *(*I64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) = I64(libc.Bool32(int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 8)) + 4))) == 0)) __33: ; __32: ; __31: ; __28: ; __25: ; __18: ; __8: ; *(*uintptr)(unsafe.Pointer(ppVal)) = *(*uintptr)(unsafe.Pointer(bp + 16)) return rc no_mem: if !(pCtx == uintptr(0) || (*Parse)(unsafe.Pointer((*ValueNewStat4Ctx)(unsafe.Pointer(pCtx)).FpParse)).FnErr == 0) { goto __34 } Xsqlite3OomFault(tls, db) __34: ; Xsqlite3DbFree(tls, db, zVal) if !(pCtx == uintptr(0)) { goto __35 } Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) __35: ; return SQLITE_NOMEM } // Create a new sqlite3_value object, containing the value of pExpr. // // This only works for very simple expressions that consist of one constant // token (i.e. "5", "5.1", "'a string'"). If the expression can // be converted directly into a value, then the value is allocated and // a pointer written to *ppVal. The caller is responsible for deallocating // the value by passing it to sqlite3ValueFree() later on. If the expression // cannot be converted to a value, then *ppVal is set to NULL. func Xsqlite3ValueFromExpr(tls *libc.TLS, db uintptr, pExpr uintptr, enc U8, affinity U8, ppVal uintptr) int32 { if pExpr != 0 { return valueFromExpr(tls, db, pExpr, enc, affinity, ppVal, uintptr(0)) } return 0 } func stat4ValueFromExpr(tls *libc.TLS, pParse uintptr, pExpr uintptr, affinity U8, pAlloc uintptr, ppVal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb pExpr = Xsqlite3ExprSkipCollate(tls, pExpr) if !(pExpr != 0) { *(*uintptr)(unsafe.Pointer(bp)) = valueNew(tls, db, pAlloc) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { Xsqlite3VdbeMemSetNull(tls, *(*uintptr)(unsafe.Pointer(bp))) } } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_VARIABLE && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_EnableQPSG) == uint64(0) { var v uintptr var iBindVar int32 = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) Xsqlite3VdbeSetVarmask(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, iBindVar) if libc.AssignUintptr(&v, (*Parse)(unsafe.Pointer(pParse)).FpReprepare) != uintptr(0) { *(*uintptr)(unsafe.Pointer(bp)) = valueNew(tls, db, pAlloc) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { rc = Xsqlite3VdbeMemCopy(tls, *(*uintptr)(unsafe.Pointer(bp)), (*Vdbe)(unsafe.Pointer(v)).FaVar+uintptr(iBindVar-1)*56) Xsqlite3ValueApplyAffinity(tls, *(*uintptr)(unsafe.Pointer(bp)), affinity, (*Sqlite3)(unsafe.Pointer(db)).Fenc) (*Sqlite3_value)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fdb = (*Parse)(unsafe.Pointer(pParse)).Fdb } } } else { rc = valueFromExpr(tls, db, pExpr, (*Sqlite3)(unsafe.Pointer(db)).Fenc, affinity, bp, pAlloc) } *(*uintptr)(unsafe.Pointer(ppVal)) = *(*uintptr)(unsafe.Pointer(bp)) return rc } // This function is used to allocate and populate UnpackedRecord // structures intended to be compared against sample index keys stored // in the sqlite_stat4 table. // // A single call to this function populates zero or more fields of the // record starting with field iVal (fields are numbered from left to // right starting with 0). A single field is populated if: // // - (pExpr==0). In this case the value is assumed to be an SQL NULL, // // - The expression is a bound variable, and this is a reprepare, or // // - The sqlite3ValueFromExpr() function is able to extract a value // from the expression (i.e. the expression is a literal value). // // Or, if pExpr is a TK_VECTOR, one field is populated for each of the // vector components that match either of the two latter criteria listed // above. // // Before any value is appended to the record, the affinity of the // corresponding column within index pIdx is applied to it. Before // this function returns, output parameter *pnExtract is set to the // number of values appended to the record. // // When this function is called, *ppRec must either point to an object // allocated by an earlier call to this function, or must be NULL. If it // is NULL and a value can be successfully extracted, a new UnpackedRecord // is allocated (and *ppRec set to point to it) before returning. // // Unless an error is encountered, SQLITE_OK is returned. It is not an // error if a value cannot be extracted from pExpr. If an error does // occur, an SQLite error code is returned. func Xsqlite3Stat4ProbeSetValue(tls *libc.TLS, pParse uintptr, pIdx uintptr, ppRec uintptr, pExpr uintptr, nElem int32, iVal int32, pnExtract uintptr) int32 { bp := tls.Alloc(40) defer tls.Free(40) var rc int32 = SQLITE_OK var nExtract int32 = 0 if pExpr == uintptr(0) || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_SELECT { var i int32 (*ValueNewStat4Ctx)(unsafe.Pointer(bp)).FpParse = pParse (*ValueNewStat4Ctx)(unsafe.Pointer(bp)).FpIdx = pIdx (*ValueNewStat4Ctx)(unsafe.Pointer(bp)).FppRec = ppRec for i = 0; i < nElem; i++ { *(*uintptr)(unsafe.Pointer(bp + 32)) = uintptr(0) var pElem uintptr = func() uintptr { if pExpr != 0 { return Xsqlite3VectorFieldSubexpr(tls, pExpr, i) } return uintptr(0) }() var aff U8 = U8(Xsqlite3IndexColumnAffinity(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pIdx, iVal+i)) (*ValueNewStat4Ctx)(unsafe.Pointer(bp)).FiVal = iVal + i rc = stat4ValueFromExpr(tls, pParse, pElem, aff, bp, bp+32) if !(*(*uintptr)(unsafe.Pointer(bp + 32)) != 0) { break } nExtract++ } } *(*int32)(unsafe.Pointer(pnExtract)) = nExtract return rc } // Attempt to extract a value from expression pExpr using the methods // as described for sqlite3Stat4ProbeSetValue() above. // // If successful, set *ppVal to point to a new value object and return // SQLITE_OK. If no value can be extracted, but no other error occurs // (e.g. OOM), return SQLITE_OK and set *ppVal to NULL. Or, if an error // does occur, return an SQLite error code. The final value of *ppVal // is undefined in this case. func Xsqlite3Stat4ValueFromExpr(tls *libc.TLS, pParse uintptr, pExpr uintptr, affinity U8, ppVal uintptr) int32 { return stat4ValueFromExpr(tls, pParse, pExpr, affinity, uintptr(0), ppVal) } // Extract the iCol-th column from the nRec-byte record in pRec. Write // the column value into *ppVal. If *ppVal is initially NULL then a new // sqlite3_value object is allocated. // // If *ppVal is initially NULL then the caller is responsible for // ensuring that the value written into *ppVal is eventually freed. func Xsqlite3Stat4Column(tls *libc.TLS, db uintptr, pRec uintptr, nRec int32, iCol int32, ppVal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*U32)(unsafe.Pointer(bp + 4)) = U32(0) var iHdr int32 var iField int32 var szField int32 = 0 var i int32 var a uintptr = pRec var pMem uintptr = *(*uintptr)(unsafe.Pointer(ppVal)) iHdr = int32(func() uint8 { if int32(*(*U8)(unsafe.Pointer(a))) < int32(U8(0x80)) { return uint8(func() int32 { *(*int32)(unsafe.Pointer(bp)) = int32(U32(*(*U8)(unsafe.Pointer(a)))); return 1 }()) } return Xsqlite3GetVarint32(tls, a, bp) }()) if *(*int32)(unsafe.Pointer(bp)) > nRec || iHdr >= *(*int32)(unsafe.Pointer(bp)) { return Xsqlite3CorruptError(tls, 82274) } iField = *(*int32)(unsafe.Pointer(bp)) for i = 0; i <= iCol; i++ { iHdr = iHdr + int32(func() uint8 { if int32(*(*U8)(unsafe.Pointer(a + uintptr(iHdr)))) < int32(U8(0x80)) { return uint8(func() int32 { *(*U32)(unsafe.Pointer(bp + 4)) = U32(*(*U8)(unsafe.Pointer(a + uintptr(iHdr)))) return 1 }()) } return Xsqlite3GetVarint32(tls, a+uintptr(iHdr), bp+4) }()) if iHdr > *(*int32)(unsafe.Pointer(bp)) { return Xsqlite3CorruptError(tls, 82280) } szField = int32(Xsqlite3VdbeSerialTypeLen(tls, *(*U32)(unsafe.Pointer(bp + 4)))) iField = iField + szField } if iField > nRec { return Xsqlite3CorruptError(tls, 82286) } if pMem == uintptr(0) { pMem = libc.AssignPtrUintptr(ppVal, Xsqlite3ValueNew(tls, db)) if pMem == uintptr(0) { return SQLITE_NOMEM } } Xsqlite3VdbeSerialGet(tls, a+uintptr(iField-szField), *(*U32)(unsafe.Pointer(bp + 4)), pMem) (*Mem)(unsafe.Pointer(pMem)).Fenc = (*Sqlite3)(unsafe.Pointer(db)).Fenc return SQLITE_OK } // Unless it is NULL, the argument must be an UnpackedRecord object returned // by an earlier call to sqlite3Stat4ProbeSetValue(). This call deletes // the object. func Xsqlite3Stat4ProbeFree(tls *libc.TLS, pRec uintptr) { if pRec != 0 { var i int32 var nCol int32 = int32((*KeyInfo)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(pRec)).FpKeyInfo)).FnAllField) var aMem uintptr = (*UnpackedRecord)(unsafe.Pointer(pRec)).FaMem var db uintptr = (*Mem)(unsafe.Pointer(aMem)).Fdb for i = 0; i < nCol; i++ { Xsqlite3VdbeMemRelease(tls, aMem+uintptr(i)*56) } Xsqlite3KeyInfoUnref(tls, (*UnpackedRecord)(unsafe.Pointer(pRec)).FpKeyInfo) Xsqlite3DbFreeNN(tls, db, pRec) } } // Change the string value of an sqlite3_value object func Xsqlite3ValueSetStr(tls *libc.TLS, v uintptr, n int32, z uintptr, enc U8, xDel uintptr) { if v != 0 { Xsqlite3VdbeMemSetStr(tls, v, z, int64(n), enc, xDel) } } // Free an sqlite3_value object func Xsqlite3ValueFree(tls *libc.TLS, v uintptr) { if !(v != 0) { return } Xsqlite3VdbeMemRelease(tls, v) Xsqlite3DbFreeNN(tls, (*Mem)(unsafe.Pointer(v)).Fdb, v) } func valueBytes(tls *libc.TLS, pVal uintptr, enc U8) int32 { if valueToText(tls, pVal, enc) != uintptr(0) { return (*Sqlite3_value)(unsafe.Pointer(pVal)).Fn } return 0 } func Xsqlite3ValueBytes(tls *libc.TLS, pVal uintptr, enc U8) int32 { var p uintptr = pVal if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Str != 0 && int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fenc) == int32(enc) { return (*Mem)(unsafe.Pointer(p)).Fn } if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Str != 0 && int32(enc) != SQLITE_UTF8 && int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fenc) != SQLITE_UTF8 { return (*Mem)(unsafe.Pointer(p)).Fn } if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Blob != 0 { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Zero != 0 { return (*Mem)(unsafe.Pointer(p)).Fn + *(*int32)(unsafe.Pointer(p)) } else { return (*Mem)(unsafe.Pointer(p)).Fn } } if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Null != 0 { return 0 } return valueBytes(tls, pVal, enc) } // Create a new virtual database engine. func Xsqlite3VdbeCreate(tls *libc.TLS, pParse uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var p uintptr p = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(Vdbe{}))) if p == uintptr(0) { return uintptr(0) } libc.Xmemset(tls, p+136, 0, uint64(unsafe.Sizeof(Vdbe{}))-uint64(uintptr(0)+136)) (*Vdbe)(unsafe.Pointer(p)).Fdb = db if (*Sqlite3)(unsafe.Pointer(db)).FpVdbe != 0 { (*Vdbe1)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FpVdbe)).FppVPrev = p + 16 } (*Vdbe)(unsafe.Pointer(p)).FpVNext = (*Sqlite3)(unsafe.Pointer(db)).FpVdbe (*Vdbe)(unsafe.Pointer(p)).FppVPrev = db + 8 (*Sqlite3)(unsafe.Pointer(db)).FpVdbe = p (*Vdbe)(unsafe.Pointer(p)).FpParse = pParse (*Parse)(unsafe.Pointer(pParse)).FpVdbe = p Xsqlite3VdbeAddOp2(tls, p, OP_Init, 0, 1) return p } // Return the Parse object that owns a Vdbe object. func Xsqlite3VdbeParser(tls *libc.TLS, p uintptr) uintptr { return (*Vdbe)(unsafe.Pointer(p)).FpParse } // Change the error string stored in Vdbe.zErrMsg func Xsqlite3VdbeError(tls *libc.TLS, p uintptr, zFormat uintptr, va uintptr) { var ap Va_list _ = ap Xsqlite3DbFree(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg) ap = va (*Vdbe)(unsafe.Pointer(p)).FzErrMsg = Xsqlite3VMPrintf(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, zFormat, ap) _ = ap } // Remember the SQL string for a prepared statement. func Xsqlite3VdbeSetSql(tls *libc.TLS, p uintptr, z uintptr, n int32, prepFlags U8) { if p == uintptr(0) { return } (*Vdbe)(unsafe.Pointer(p)).FprepFlags = prepFlags if int32(prepFlags)&SQLITE_PREPARE_SAVESQL == 0 { (*Vdbe)(unsafe.Pointer(p)).Fexpmask = U32(0) } (*Vdbe)(unsafe.Pointer(p)).FzSql = Xsqlite3DbStrNDup(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, z, uint64(n)) } // Swap byte-code between two VDBE structures. // // This happens after pB was previously run and returned // SQLITE_SCHEMA. The statement was then reprepared in pA. // This routine transfers the new bytecode in pA over to pB // so that pB can be run again. The old pB byte code is // moved back to pA so that it will be cleaned up when pA is // finalized. func Xsqlite3VdbeSwap(tls *libc.TLS, pA uintptr, pB uintptr) { var tmp Vdbe var pTmp uintptr var ppTmp uintptr var zTmp uintptr tmp = *(*Vdbe)(unsafe.Pointer(pA)) *(*Vdbe)(unsafe.Pointer(pA)) = *(*Vdbe)(unsafe.Pointer(pB)) *(*Vdbe)(unsafe.Pointer(pB)) = tmp pTmp = (*Vdbe)(unsafe.Pointer(pA)).FpVNext (*Vdbe)(unsafe.Pointer(pA)).FpVNext = (*Vdbe)(unsafe.Pointer(pB)).FpVNext (*Vdbe)(unsafe.Pointer(pB)).FpVNext = pTmp ppTmp = (*Vdbe)(unsafe.Pointer(pA)).FppVPrev (*Vdbe)(unsafe.Pointer(pA)).FppVPrev = (*Vdbe)(unsafe.Pointer(pB)).FppVPrev (*Vdbe)(unsafe.Pointer(pB)).FppVPrev = ppTmp zTmp = (*Vdbe)(unsafe.Pointer(pA)).FzSql (*Vdbe)(unsafe.Pointer(pA)).FzSql = (*Vdbe)(unsafe.Pointer(pB)).FzSql (*Vdbe)(unsafe.Pointer(pB)).FzSql = zTmp (*Vdbe)(unsafe.Pointer(pB)).Fexpmask = (*Vdbe)(unsafe.Pointer(pA)).Fexpmask (*Vdbe)(unsafe.Pointer(pB)).FprepFlags = (*Vdbe)(unsafe.Pointer(pA)).FprepFlags libc.Xmemcpy(tls, pB+212, pA+212, uint64(unsafe.Sizeof([9]U32{}))) *(*U32)(unsafe.Pointer(pB + 212 + 5*4))++ } func growOpArray(tls *libc.TLS, v uintptr, nOp int32) int32 { var pNew uintptr var p uintptr = (*Vdbe)(unsafe.Pointer(v)).FpParse var nNew Sqlite3_int64 = func() int64 { if (*Vdbe)(unsafe.Pointer(v)).FnOpAlloc != 0 { return int64(2) * Sqlite3_int64((*Vdbe)(unsafe.Pointer(v)).FnOpAlloc) } return int64(uint64(1024) / uint64(unsafe.Sizeof(Op{}))) }() _ = nOp if nNew > Sqlite3_int64(*(*int32)(unsafe.Pointer((*Parse)(unsafe.Pointer(p)).Fdb + 136 + 5*4))) { Xsqlite3OomFault(tls, (*Parse)(unsafe.Pointer(p)).Fdb) return SQLITE_NOMEM } pNew = Xsqlite3DbRealloc(tls, (*Parse)(unsafe.Pointer(p)).Fdb, (*Vdbe)(unsafe.Pointer(v)).FaOp, uint64(nNew)*uint64(unsafe.Sizeof(Op{}))) if pNew != 0 { (*Parse)(unsafe.Pointer(p)).FszOpAlloc = Xsqlite3DbMallocSize(tls, (*Parse)(unsafe.Pointer(p)).Fdb, pNew) (*Vdbe)(unsafe.Pointer(v)).FnOpAlloc = int32(uint64((*Parse)(unsafe.Pointer(p)).FszOpAlloc) / uint64(unsafe.Sizeof(Op{}))) (*Vdbe)(unsafe.Pointer(v)).FaOp = pNew } return func() int32 { if pNew != 0 { return SQLITE_OK } return SQLITE_NOMEM }() } func growOp3(tls *libc.TLS, p uintptr, op int32, p1 int32, p2 int32, p3 int32) int32 { if growOpArray(tls, p, 1) != 0 { return 1 } return Xsqlite3VdbeAddOp3(tls, p, op, p1, p2, p3) } func Xsqlite3VdbeAddOp3(tls *libc.TLS, p uintptr, op int32, p1 int32, p2 int32, p3 int32) int32 { var i int32 var pOp uintptr i = (*Vdbe)(unsafe.Pointer(p)).FnOp if (*Vdbe)(unsafe.Pointer(p)).FnOpAlloc <= i { return growOp3(tls, p, op, p1, p2, p3) } (*Vdbe)(unsafe.Pointer(p)).FnOp++ pOp = (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr(i)*24 (*VdbeOp)(unsafe.Pointer(pOp)).Fopcode = U8(op) (*VdbeOp)(unsafe.Pointer(pOp)).Fp5 = U16(0) (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = p1 (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 = p2 (*VdbeOp)(unsafe.Pointer(pOp)).Fp3 = p3 *(*uintptr)(unsafe.Pointer(pOp + 16)) = uintptr(0) (*VdbeOp)(unsafe.Pointer(pOp)).Fp4type = int8(P4_NOTUSED) return i } func Xsqlite3VdbeAddOp0(tls *libc.TLS, p uintptr, op int32) int32 { return Xsqlite3VdbeAddOp3(tls, p, op, 0, 0, 0) } func Xsqlite3VdbeAddOp1(tls *libc.TLS, p uintptr, op int32, p1 int32) int32 { return Xsqlite3VdbeAddOp3(tls, p, op, p1, 0, 0) } func Xsqlite3VdbeAddOp2(tls *libc.TLS, p uintptr, op int32, p1 int32, p2 int32) int32 { return Xsqlite3VdbeAddOp3(tls, p, op, p1, p2, 0) } // Generate code for an unconditional jump to instruction iDest func Xsqlite3VdbeGoto(tls *libc.TLS, p uintptr, iDest int32) int32 { return Xsqlite3VdbeAddOp3(tls, p, OP_Goto, 0, iDest, 0) } // Generate code to cause the string zStr to be loaded into // register iDest func Xsqlite3VdbeLoadString(tls *libc.TLS, p uintptr, iDest int32, zStr uintptr) int32 { return Xsqlite3VdbeAddOp4(tls, p, OP_String8, 0, iDest, 0, zStr, 0) } // 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 Xsqlite3VdbeMultiLoad(tls *libc.TLS, p uintptr, iDest int32, zTypes uintptr, va uintptr) { var ap Va_list _ = ap var i int32 var c int8 var z uintptr ap = va i = 0 __1: if !(int32(libc.AssignInt8(&c, *(*int8)(unsafe.Pointer(zTypes + uintptr(i))))) != 0) { goto __3 } if !(int32(c) == 's') { goto __4 } z = libc.VaUintptr(&ap) Xsqlite3VdbeAddOp4(tls, p, func() int32 { if z == uintptr(0) { return OP_Null } return OP_String8 }(), 0, iDest+i, 0, z, 0) goto __5 __4: if !(int32(c) == 'i') { goto __6 } Xsqlite3VdbeAddOp2(tls, p, OP_Integer, libc.VaInt32(&ap), iDest+i) goto __7 __6: goto skip_op_resultrow __7: ; __5: ; goto __2 __2: i++ goto __1 goto __3 __3: ; Xsqlite3VdbeAddOp2(tls, p, OP_ResultRow, iDest, i) skip_op_resultrow: _ = ap } // Add an opcode that includes the p4 value as a pointer. func Xsqlite3VdbeAddOp4(tls *libc.TLS, p uintptr, op int32, p1 int32, p2 int32, p3 int32, zP4 uintptr, p4type int32) int32 { var addr int32 = Xsqlite3VdbeAddOp3(tls, p, op, p1, p2, p3) Xsqlite3VdbeChangeP4(tls, p, addr, zP4, p4type) return addr } // Add an OP_Function or OP_PureFunc opcode. // // The eCallCtx argument is information (typically taken from Expr.op2) // that describes the calling context of the function. 0 means a general // function call. NC_IsCheck means called by a check constraint, // NC_IdxExpr means called as part of an index expression. NC_PartIdx // means in the WHERE clause of a partial index. NC_GenCol means called // while computing a generated column value. 0 is the usual case. func Xsqlite3VdbeAddFunctionCall(tls *libc.TLS, pParse uintptr, p1 int32, p2 int32, p3 int32, nArg int32, pFunc uintptr, eCallCtx int32) int32 { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var nByte int32 var addr int32 var pCtx uintptr nByte = int32(uint64(unsafe.Sizeof(Sqlite3_context{})) + uint64(nArg-1)*uint64(unsafe.Sizeof(uintptr(0)))) pCtx = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(nByte)) if pCtx == uintptr(0) { freeEphemeralFunction(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pFunc) return 0 } (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut = uintptr(0) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpFunc = pFunc (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpVdbe = uintptr(0) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = 0 (*Sqlite3_context)(unsafe.Pointer(pCtx)).Fargc = U8(nArg) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FiOp = Xsqlite3VdbeCurrentAddr(tls, v) addr = Xsqlite3VdbeAddOp4(tls, v, func() int32 { if eCallCtx != 0 { return OP_PureFunc } return OP_Function }(), p1, p2, p3, pCtx, -15) Xsqlite3VdbeChangeP5(tls, v, uint16(eCallCtx&NC_SelfRef)) Xsqlite3MayAbort(tls, pParse) return addr } // Add an opcode that includes the p4 value with a P4_INT64 or // P4_REAL type. func Xsqlite3VdbeAddOp4Dup8(tls *libc.TLS, p uintptr, op int32, p1 int32, p2 int32, p3 int32, zP4 uintptr, p4type int32) int32 { var p4copy uintptr = Xsqlite3DbMallocRawNN(tls, Xsqlite3VdbeDb(tls, p), uint64(8)) if p4copy != 0 { libc.Xmemcpy(tls, p4copy, zP4, uint64(8)) } return Xsqlite3VdbeAddOp4(tls, p, op, p1, p2, p3, p4copy, p4type) } // Return the address of the current EXPLAIN QUERY PLAN baseline. // 0 means "none". func Xsqlite3VdbeExplainParent(tls *libc.TLS, pParse uintptr) int32 { var pOp uintptr if (*Parse)(unsafe.Pointer(pParse)).FaddrExplain == 0 { return 0 } pOp = Xsqlite3VdbeGetOp(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, (*Parse)(unsafe.Pointer(pParse)).FaddrExplain) return (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 } // Add a new OP_Explain opcode. // // If the bPush flag is true, then make this opcode the parent for // subsequent Explains until sqlite3VdbeExplainPop() is called. func Xsqlite3VdbeExplain(tls *libc.TLS, pParse uintptr, bPush U8, zFmt uintptr, va uintptr) int32 { var addr int32 = 0 if int32((*Parse)(unsafe.Pointer(pParse)).Fexplain) == 2 { var zMsg uintptr var v uintptr var ap Va_list _ = ap var iThis int32 ap = va zMsg = Xsqlite3VMPrintf(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, zFmt, ap) _ = ap v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe iThis = (*Vdbe)(unsafe.Pointer(v)).FnOp addr = Xsqlite3VdbeAddOp4(tls, v, OP_Explain, iThis, (*Parse)(unsafe.Pointer(pParse)).FaddrExplain, 0, zMsg, -6) if bPush != 0 { (*Parse)(unsafe.Pointer(pParse)).FaddrExplain = iThis } } return addr } // Pop the EXPLAIN QUERY PLAN stack one level. func Xsqlite3VdbeExplainPop(tls *libc.TLS, pParse uintptr) { (*Parse)(unsafe.Pointer(pParse)).FaddrExplain = Xsqlite3VdbeExplainParent(tls, pParse) } // Add an OP_ParseSchema opcode. This routine is broken out from // sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees // as having been used. // // The zWhere string must have been obtained from sqlite3_malloc(). // This routine will take ownership of the allocated memory. func Xsqlite3VdbeAddParseSchemaOp(tls *libc.TLS, p uintptr, iDb int32, zWhere uintptr, p5 U16) { var j int32 Xsqlite3VdbeAddOp4(tls, p, OP_ParseSchema, iDb, 0, 0, zWhere, -6) Xsqlite3VdbeChangeP5(tls, p, p5) for j = 0; j < (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FnDb; j++ { Xsqlite3VdbeUsesBtree(tls, p, j) } Xsqlite3MayAbort(tls, (*Vdbe)(unsafe.Pointer(p)).FpParse) } // Add an opcode that includes the p4 value as an integer. func Xsqlite3VdbeAddOp4Int(tls *libc.TLS, p uintptr, op int32, p1 int32, p2 int32, p3 int32, p4 int32) int32 { var addr int32 = Xsqlite3VdbeAddOp3(tls, p, op, p1, p2, p3) if int32((*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FmallocFailed) == 0 { var pOp uintptr = (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr(addr)*24 (*VdbeOp)(unsafe.Pointer(pOp)).Fp4type = int8(-3) *(*int32)(unsafe.Pointer(pOp + 16)) = p4 } return addr } // Insert the end of a co-routine func Xsqlite3VdbeEndCoroutine(tls *libc.TLS, v uintptr, regYield int32) { Xsqlite3VdbeAddOp1(tls, v, OP_EndCoroutine, regYield) (*Parse)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).FpParse)).FnTempReg = U8(0) (*Parse)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).FpParse)).FnRangeReg = 0 } // Create a new symbolic label for an instruction that has yet to be // coded. The symbolic label is really just a negative number. The // label can be used as the P2 value of an operation. Later, when // the label is resolved to a specific address, the VDBE will scan // through its operation list and change all values of P2 which match // the label into the resolved address. // // The VDBE knows that a P2 value is a label because labels are // always negative and P2 values are suppose to be non-negative. // Hence, a negative P2 value is a label that has yet to be resolved. // (Later:) This is only true for opcodes that have the OPFLG_JUMP // property. // // Variable usage notes: // // Parse.aLabel[x] Stores the address that the x-th label resolves // into. For testing (SQLITE_DEBUG), unresolved // labels stores -1, but that is not required. // Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[] // Parse.nLabel The *negative* of the number of labels that have // been issued. The negative is stored because // that gives a performance improvement over storing // the equivalent positive value. func Xsqlite3VdbeMakeLabel(tls *libc.TLS, pParse uintptr) int32 { return libc.PreDecInt32(&(*Parse)(unsafe.Pointer(pParse)).FnLabel, 1) } func resizeResolveLabel(tls *libc.TLS, p uintptr, v uintptr, j int32) { var nNewSize int32 = 10 - (*Parse)(unsafe.Pointer(p)).FnLabel (*Parse)(unsafe.Pointer(p)).FaLabel = Xsqlite3DbReallocOrFree(tls, (*Parse)(unsafe.Pointer(p)).Fdb, (*Parse)(unsafe.Pointer(p)).FaLabel, uint64(nNewSize)*uint64(unsafe.Sizeof(int32(0)))) if (*Parse)(unsafe.Pointer(p)).FaLabel == uintptr(0) { (*Parse)(unsafe.Pointer(p)).FnLabelAlloc = 0 } else { if nNewSize >= 100 && nNewSize/100 > (*Parse)(unsafe.Pointer(p)).FnLabelAlloc/100 { Xsqlite3ProgressCheck(tls, p) } (*Parse)(unsafe.Pointer(p)).FnLabelAlloc = nNewSize *(*int32)(unsafe.Pointer((*Parse)(unsafe.Pointer(p)).FaLabel + uintptr(j)*4)) = (*Vdbe)(unsafe.Pointer(v)).FnOp } } func Xsqlite3VdbeResolveLabel(tls *libc.TLS, v uintptr, x int32) { var p uintptr = (*Vdbe)(unsafe.Pointer(v)).FpParse var j int32 = ^x if (*Parse)(unsafe.Pointer(p)).FnLabelAlloc+(*Parse)(unsafe.Pointer(p)).FnLabel < 0 { resizeResolveLabel(tls, p, v, j) } else { *(*int32)(unsafe.Pointer((*Parse)(unsafe.Pointer(p)).FaLabel + uintptr(j)*4)) = (*Vdbe)(unsafe.Pointer(v)).FnOp } } // Mark the VDBE as one that can only be run one time. func Xsqlite3VdbeRunOnlyOnce(tls *libc.TLS, p uintptr) { Xsqlite3VdbeAddOp2(tls, p, OP_Expire, 1, 1) } // Mark the VDBE as one that can be run multiple times. func Xsqlite3VdbeReusable(tls *libc.TLS, p uintptr) { var i int32 for i = 1; i < (*Vdbe)(unsafe.Pointer(p)).FnOp; i++ { if int32((*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp+uintptr(i)*24)).Fopcode) == OP_Expire { (*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp + 1*24)).Fopcode = U8(OP_Noop) break } } } func resolveP2Values(tls *libc.TLS, p uintptr, pMaxFuncArgs uintptr) { var nMaxArgs int32 var pOp uintptr var pParse uintptr var aLabel uintptr var n int32 nMaxArgs = *(*int32)(unsafe.Pointer(pMaxFuncArgs)) pParse = (*Vdbe)(unsafe.Pointer(p)).FpParse aLabel = (*Parse)(unsafe.Pointer(pParse)).FaLabel libc.SetBitFieldPtr8Uint32(p+200, Bft(1), 6, 0x40) libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 7, 0x80) pOp = (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr((*Vdbe)(unsafe.Pointer(p)).FnOp-1)*24 __1: if !(1 != 0) { goto __2 } if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) <= SQLITE_MX_JUMP_OPCODE) { goto __3 } switch int32((*Op)(unsafe.Pointer(pOp)).Fopcode) { case OP_Transaction: goto __5 case OP_AutoCommit: goto __6 case OP_Savepoint: goto __7 case OP_Checkpoint: goto __8 case OP_Vacuum: goto __9 case OP_JournalMode: goto __10 case OP_Init: goto __11 case OP_VUpdate: goto __12 case OP_VFilter: goto __13 default: goto __14 } goto __4 __5: if !((*Op)(unsafe.Pointer(pOp)).Fp2 != 0) { goto __15 } libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 6, 0x40) __15: ; __6: __7: libc.SetBitFieldPtr8Uint32(p+200, Bft(1), 7, 0x80) goto __4 __8: __9: __10: libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 6, 0x40) libc.SetBitFieldPtr8Uint32(p+200, Bft(1), 7, 0x80) goto __4 __11: ; goto resolve_p2_values_loop_exit __12: if !((*Op)(unsafe.Pointer(pOp)).Fp2 > nMaxArgs) { goto __16 } nMaxArgs = (*Op)(unsafe.Pointer(pOp)).Fp2 __16: ; goto __4 __13: ; n = (*Op)(unsafe.Pointer(pOp + libc.UintptrFromInt32(-1)*24)).Fp1 if !(n > nMaxArgs) { goto __17 } nMaxArgs = n __17: ; __14: if !((*Op)(unsafe.Pointer(pOp)).Fp2 < 0) { goto __18 } (*Op)(unsafe.Pointer(pOp)).Fp2 = *(*int32)(unsafe.Pointer(aLabel + uintptr(^(*Op)(unsafe.Pointer(pOp)).Fp2)*4)) __18: ; goto __4 __4: ; __3: ; pOp -= 24 goto __1 __2: ; resolve_p2_values_loop_exit: if !(aLabel != 0) { goto __19 } Xsqlite3DbNNFreeNN(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, (*Parse)(unsafe.Pointer(pParse)).FaLabel) (*Parse)(unsafe.Pointer(pParse)).FaLabel = uintptr(0) __19: ; (*Parse)(unsafe.Pointer(pParse)).FnLabel = 0 *(*int32)(unsafe.Pointer(pMaxFuncArgs)) = nMaxArgs } // Return the address of the next instruction to be inserted. func Xsqlite3VdbeCurrentAddr(tls *libc.TLS, p uintptr) int32 { return (*Vdbe)(unsafe.Pointer(p)).FnOp } // This function returns a pointer to the array of opcodes associated with // the Vdbe passed as the first argument. It is the callers responsibility // to arrange for the returned array to be eventually freed using the // vdbeFreeOpArray() function. // // Before returning, *pnOp is set to the number of entries in the returned // array. Also, *pnMaxArg is set to the larger of its current value and // the number of entries in the Vdbe.apArg[] array required to execute the // returned program. func Xsqlite3VdbeTakeOpArray(tls *libc.TLS, p uintptr, pnOp uintptr, pnMaxArg uintptr) uintptr { var aOp uintptr = (*Vdbe)(unsafe.Pointer(p)).FaOp resolveP2Values(tls, p, pnMaxArg) *(*int32)(unsafe.Pointer(pnOp)) = (*Vdbe)(unsafe.Pointer(p)).FnOp (*Vdbe)(unsafe.Pointer(p)).FaOp = uintptr(0) return aOp } // Add a whole list of operations to the operation stack. Return a // pointer to the first operation inserted. // // Non-zero P2 arguments to jump instructions are automatically adjusted // so that the jump target is relative to the first operation inserted. func Xsqlite3VdbeAddOpList(tls *libc.TLS, p uintptr, nOp int32, aOp uintptr, iLineno int32) uintptr { var i int32 var pOut uintptr var pFirst uintptr if (*Vdbe)(unsafe.Pointer(p)).FnOp+nOp > (*Vdbe)(unsafe.Pointer(p)).FnOpAlloc && growOpArray(tls, p, nOp) != 0 { return uintptr(0) } pFirst = libc.AssignUintptr(&pOut, (*Vdbe)(unsafe.Pointer(p)).FaOp+uintptr((*Vdbe)(unsafe.Pointer(p)).FnOp)*24) i = 0 __1: if !(i < nOp) { goto __3 } { (*VdbeOp)(unsafe.Pointer(pOut)).Fopcode = (*VdbeOpList)(unsafe.Pointer(aOp)).Fopcode (*VdbeOp)(unsafe.Pointer(pOut)).Fp1 = int32((*VdbeOpList)(unsafe.Pointer(aOp)).Fp1) (*VdbeOp)(unsafe.Pointer(pOut)).Fp2 = int32((*VdbeOpList)(unsafe.Pointer(aOp)).Fp2) if int32(Xsqlite3OpcodeProperty[(*VdbeOpList)(unsafe.Pointer(aOp)).Fopcode])&OPFLG_JUMP != 0 && int32((*VdbeOpList)(unsafe.Pointer(aOp)).Fp2) > 0 { *(*int32)(unsafe.Pointer(pOut + 8)) += (*Vdbe)(unsafe.Pointer(p)).FnOp } (*VdbeOp)(unsafe.Pointer(pOut)).Fp3 = int32((*VdbeOpList)(unsafe.Pointer(aOp)).Fp3) (*VdbeOp)(unsafe.Pointer(pOut)).Fp4type = int8(P4_NOTUSED) *(*uintptr)(unsafe.Pointer(pOut + 16)) = uintptr(0) (*VdbeOp)(unsafe.Pointer(pOut)).Fp5 = U16(0) _ = iLineno } goto __2 __2: i++ aOp += 4 pOut += 24 goto __1 goto __3 __3: ; *(*int32)(unsafe.Pointer(p + 144)) += nOp return pFirst } // Change the value of the opcode, or P1, P2, P3, or P5 operands // for a specific instruction. func Xsqlite3VdbeChangeOpcode(tls *libc.TLS, p uintptr, addr int32, iNewOpcode U8) { (*VdbeOp)(unsafe.Pointer(Xsqlite3VdbeGetOp(tls, p, addr))).Fopcode = iNewOpcode } func Xsqlite3VdbeChangeP1(tls *libc.TLS, p uintptr, addr int32, val int32) { (*VdbeOp)(unsafe.Pointer(Xsqlite3VdbeGetOp(tls, p, addr))).Fp1 = val } func Xsqlite3VdbeChangeP2(tls *libc.TLS, p uintptr, addr int32, val int32) { (*VdbeOp)(unsafe.Pointer(Xsqlite3VdbeGetOp(tls, p, addr))).Fp2 = val } func Xsqlite3VdbeChangeP3(tls *libc.TLS, p uintptr, addr int32, val int32) { (*VdbeOp)(unsafe.Pointer(Xsqlite3VdbeGetOp(tls, p, addr))).Fp3 = val } func Xsqlite3VdbeChangeP5(tls *libc.TLS, p uintptr, p5 U16) { if (*Vdbe)(unsafe.Pointer(p)).FnOp > 0 { (*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr((*Vdbe)(unsafe.Pointer(p)).FnOp-1)*24)).Fp5 = p5 } } // If the previous opcode is an OP_Column that delivers results // into register iDest, then add the OPFLAG_TYPEOFARG flag to that // opcode. func Xsqlite3VdbeTypeofColumn(tls *libc.TLS, p uintptr, iDest int32) { var pOp uintptr = Xsqlite3VdbeGetLastOp(tls, p) if (*VdbeOp)(unsafe.Pointer(pOp)).Fp3 == iDest && int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Column { *(*U16)(unsafe.Pointer(pOp + 2)) |= U16(OPFLAG_TYPEOFARG) } } // Change the P2 operand of instruction addr so that it points to // the address of the next instruction to be coded. func Xsqlite3VdbeJumpHere(tls *libc.TLS, p uintptr, addr int32) { Xsqlite3VdbeChangeP2(tls, p, addr, (*Vdbe)(unsafe.Pointer(p)).FnOp) } // Change the P2 operand of the jump instruction at addr so that // the jump lands on the next opcode. Or if the jump instruction was // the previous opcode (and is thus a no-op) then simply back up // the next instruction counter by one slot so that the jump is // overwritten by the next inserted opcode. // // This routine is an optimization of sqlite3VdbeJumpHere() that // strives to omit useless byte-code like this: // // 7 Once 0 8 0 // 8 ... func Xsqlite3VdbeJumpHereOrPopInst(tls *libc.TLS, p uintptr, addr int32) { if addr == (*Vdbe)(unsafe.Pointer(p)).FnOp-1 { (*Vdbe)(unsafe.Pointer(p)).FnOp-- } else { Xsqlite3VdbeChangeP2(tls, p, addr, (*Vdbe)(unsafe.Pointer(p)).FnOp) } } func freeEphemeralFunction(tls *libc.TLS, db uintptr, pDef uintptr) { if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_EPHEM) != U32(0) { Xsqlite3DbNNFreeNN(tls, db, pDef) } } func freeP4Mem(tls *libc.TLS, db uintptr, p uintptr) { if (*Mem)(unsafe.Pointer(p)).FszMalloc != 0 { Xsqlite3DbFree(tls, db, (*Mem)(unsafe.Pointer(p)).FzMalloc) } Xsqlite3DbNNFreeNN(tls, db, p) } func freeP4FuncCtx(tls *libc.TLS, db uintptr, p uintptr) { freeEphemeralFunction(tls, db, (*Sqlite3_context)(unsafe.Pointer(p)).FpFunc) Xsqlite3DbNNFreeNN(tls, db, p) } func freeP4(tls *libc.TLS, db uintptr, p4type int32, p4 uintptr) { switch p4type { case -15: { freeP4FuncCtx(tls, db, p4) break } case -12: fallthrough case -13: fallthrough case -6: fallthrough case -14: { if p4 != 0 { Xsqlite3DbNNFreeNN(tls, db, p4) } break } case -8: { if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { Xsqlite3KeyInfoUnref(tls, p4) } break } case -7: { freeEphemeralFunction(tls, db, p4) break } case -10: { if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { Xsqlite3ValueFree(tls, p4) } else { freeP4Mem(tls, db, p4) } break } case -11: { if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { Xsqlite3VtabUnlock(tls, p4) } break } } } func vdbeFreeOpArray(tls *libc.TLS, db uintptr, aOp uintptr, nOp int32) { if aOp != 0 { var pOp uintptr = aOp + uintptr(nOp-1)*24 for 1 != 0 { if int32((*Op)(unsafe.Pointer(pOp)).Fp4type) <= -6 { freeP4(tls, db, int32((*Op)(unsafe.Pointer(pOp)).Fp4type), *(*uintptr)(unsafe.Pointer(pOp + 16))) } if pOp == aOp { break } pOp -= 24 } Xsqlite3DbNNFreeNN(tls, db, aOp) } } // Link the SubProgram object passed as the second argument into the linked // list at Vdbe.pSubProgram. This list is used to delete all sub-program // objects when the VM is no longer required. func Xsqlite3VdbeLinkSubProgram(tls *libc.TLS, pVdbe uintptr, p uintptr) { (*SubProgram)(unsafe.Pointer(p)).FpNext = (*Vdbe)(unsafe.Pointer(pVdbe)).FpProgram (*Vdbe)(unsafe.Pointer(pVdbe)).FpProgram = p } // Return true if the given Vdbe has any SubPrograms. func Xsqlite3VdbeHasSubProgram(tls *libc.TLS, pVdbe uintptr) int32 { return libc.Bool32((*Vdbe)(unsafe.Pointer(pVdbe)).FpProgram != uintptr(0)) } // Change the opcode at addr into OP_Noop func Xsqlite3VdbeChangeToNoop(tls *libc.TLS, p uintptr, addr int32) int32 { var pOp uintptr if (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FmallocFailed != 0 { return 0 } pOp = (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr(addr)*24 freeP4(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, int32((*VdbeOp)(unsafe.Pointer(pOp)).Fp4type), *(*uintptr)(unsafe.Pointer(pOp + 16))) (*VdbeOp)(unsafe.Pointer(pOp)).Fp4type = int8(P4_NOTUSED) *(*uintptr)(unsafe.Pointer(pOp + 16)) = uintptr(0) (*VdbeOp)(unsafe.Pointer(pOp)).Fopcode = U8(OP_Noop) return 1 } // If the last opcode is "op" and it is not a jump destination, // then remove it. Return true if and only if an opcode was removed. func Xsqlite3VdbeDeletePriorOpcode(tls *libc.TLS, p uintptr, op U8) int32 { if (*Vdbe)(unsafe.Pointer(p)).FnOp > 0 && int32((*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp+uintptr((*Vdbe)(unsafe.Pointer(p)).FnOp-1)*24)).Fopcode) == int32(op) { return Xsqlite3VdbeChangeToNoop(tls, p, (*Vdbe)(unsafe.Pointer(p)).FnOp-1) } else { return 0 } return int32(0) } func vdbeChangeP4Full(tls *libc.TLS, p uintptr, pOp uintptr, zP4 uintptr, n int32) { if (*Op)(unsafe.Pointer(pOp)).Fp4type != 0 { freeP4(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, int32((*Op)(unsafe.Pointer(pOp)).Fp4type), *(*uintptr)(unsafe.Pointer(pOp + 16))) (*Op)(unsafe.Pointer(pOp)).Fp4type = int8(0) *(*uintptr)(unsafe.Pointer(pOp + 16)) = uintptr(0) } if n < 0 { Xsqlite3VdbeChangeP4(tls, p, int32((int64(pOp)-int64((*Vdbe)(unsafe.Pointer(p)).FaOp))/24), zP4, n) } else { if n == 0 { n = Xsqlite3Strlen30(tls, zP4) } *(*uintptr)(unsafe.Pointer(pOp + 16)) = Xsqlite3DbStrNDup(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, zP4, uint64(n)) (*Op)(unsafe.Pointer(pOp)).Fp4type = int8(-6) } } func Xsqlite3VdbeChangeP4(tls *libc.TLS, p uintptr, addr int32, zP4 uintptr, n int32) { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = zP4 var pOp uintptr var db uintptr db = (*Vdbe)(unsafe.Pointer(p)).Fdb if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { if n != -11 { freeP4(tls, db, n, *(*uintptr)(unsafe.Pointer(bp))) } return } if addr < 0 { addr = (*Vdbe)(unsafe.Pointer(p)).FnOp - 1 } pOp = (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr(addr)*24 if n >= 0 || (*Op)(unsafe.Pointer(pOp)).Fp4type != 0 { vdbeChangeP4Full(tls, p, pOp, *(*uintptr)(unsafe.Pointer(bp)), n) return } if n == -3 { *(*int32)(unsafe.Pointer(pOp + 16)) = int32(*(*uintptr)(unsafe.Pointer(bp))) (*Op)(unsafe.Pointer(pOp)).Fp4type = int8(-3) } else if *(*uintptr)(unsafe.Pointer(bp)) != uintptr(0) { *(*uintptr)(unsafe.Pointer(pOp + 16)) = *(*uintptr)(unsafe.Pointer(bp)) (*Op)(unsafe.Pointer(pOp)).Fp4type = int8(n) if n == -11 { Xsqlite3VtabLock(tls, *(*uintptr)(unsafe.Pointer(bp))) } } } // Change the P4 operand of the most recently coded instruction // to the value defined by the arguments. This is a high-speed // version of sqlite3VdbeChangeP4(). // // The P4 operand must not have been previously defined. And the new // P4 must not be P4_INT32. Use sqlite3VdbeChangeP4() in either of // those cases. func Xsqlite3VdbeAppendP4(tls *libc.TLS, p uintptr, pP4 uintptr, n int32) { var pOp uintptr if (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FmallocFailed != 0 { freeP4(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, n, pP4) } else { pOp = (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr((*Vdbe)(unsafe.Pointer(p)).FnOp-1)*24 (*VdbeOp)(unsafe.Pointer(pOp)).Fp4type = int8(n) *(*uintptr)(unsafe.Pointer(pOp + 16)) = pP4 } } // Set the P4 on the most recently added opcode to the KeyInfo for the // index given. func Xsqlite3VdbeSetP4KeyInfo(tls *libc.TLS, pParse uintptr, pIdx uintptr) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var pKeyInfo uintptr pKeyInfo = Xsqlite3KeyInfoOfIndex(tls, pParse, pIdx) if pKeyInfo != 0 { Xsqlite3VdbeAppendP4(tls, v, pKeyInfo, -8) } } // Return the opcode for a given address. The address must be non-negative. // See sqlite3VdbeGetLastOp() to get the most recently added opcode. // // If a memory allocation error has occurred prior to the calling of this // routine, then a pointer to a dummy VdbeOp will be returned. That opcode // is readable but not writable, though it is cast to a writable value. // The return of a dummy opcode allows the call to continue functioning // after an OOM fault without having to check to see if the return from // this routine is a valid pointer. But because the dummy.opcode is 0, // dummy will never be written to. This is verified by code inspection and // by running with Valgrind. func Xsqlite3VdbeGetOp(tls *libc.TLS, p uintptr, addr int32) uintptr { if (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FmallocFailed != 0 { return uintptr(unsafe.Pointer(&dummy)) } else { return (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr(addr)*24 } return uintptr(0) } var dummy VdbeOp // Return the most recently added opcode func Xsqlite3VdbeGetLastOp(tls *libc.TLS, p uintptr) uintptr { return Xsqlite3VdbeGetOp(tls, p, (*Vdbe)(unsafe.Pointer(p)).FnOp-1) } // Compute a string that describes the P4 parameter for an opcode. // Use zTemp for any required temporary buffer space. func Xsqlite3VdbeDisplayP4(tls *libc.TLS, db uintptr, pOp uintptr) uintptr { bp := tls.Alloc(176) defer tls.Free(176) var zP4 uintptr = uintptr(0) Xsqlite3StrAccumInit(tls, bp+144, uintptr(0), uintptr(0), 0, SQLITE_MAX_LENGTH) switch int32((*Op)(unsafe.Pointer(pOp)).Fp4type) { case -8: { var j int32 var pKeyInfo uintptr = *(*uintptr)(unsafe.Pointer(pOp + 16)) Xsqlite3_str_appendf(tls, bp+144, ts+6291, libc.VaList(bp, int32((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnKeyField))) for j = 0; j < int32((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnKeyField); j++ { var pColl uintptr = *(*uintptr)(unsafe.Pointer(pKeyInfo + 32 + uintptr(j)*8)) var zColl uintptr if pColl != 0 { zColl = (*CollSeq)(unsafe.Pointer(pColl)).FzName } else { zColl = ts + 1544 } if libc.Xstrcmp(tls, zColl, ts+1089) == 0 { zColl = ts + 6296 } Xsqlite3_str_appendf(tls, bp+144, ts+6298, libc.VaList(bp+8, func() uintptr { if int32(*(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FaSortFlags + uintptr(j))))&KEYINFO_ORDER_DESC != 0 { return ts + 6284 } return ts + 1544 }(), func() uintptr { if int32(*(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FaSortFlags + uintptr(j))))&KEYINFO_ORDER_BIGNULL != 0 { return ts + 6306 } return ts + 1544 }(), zColl)) } Xsqlite3_str_append(tls, bp+144, ts+6309, 1) break } case -2: { var pColl uintptr = *(*uintptr)(unsafe.Pointer(pOp + 16)) Xsqlite3_str_appendf(tls, bp+144, ts+6311, libc.VaList(bp+32, (*CollSeq)(unsafe.Pointer(pColl)).FzName, encnames[(*CollSeq)(unsafe.Pointer(pColl)).Fenc])) break } case -7: { var pDef uintptr = *(*uintptr)(unsafe.Pointer(pOp + 16)) Xsqlite3_str_appendf(tls, bp+144, ts+6320, libc.VaList(bp+48, (*FuncDef)(unsafe.Pointer(pDef)).FzName, int32((*FuncDef)(unsafe.Pointer(pDef)).FnArg))) break } case -15: { var pDef uintptr = (*Sqlite3_context)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))).FpFunc Xsqlite3_str_appendf(tls, bp+144, ts+6320, libc.VaList(bp+64, (*FuncDef)(unsafe.Pointer(pDef)).FzName, int32((*FuncDef)(unsafe.Pointer(pDef)).FnArg))) break } case -13: { Xsqlite3_str_appendf(tls, bp+144, ts+1324, libc.VaList(bp+80, *(*I64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))))) break } case -3: { Xsqlite3_str_appendf(tls, bp+144, ts+6327, libc.VaList(bp+88, *(*int32)(unsafe.Pointer(pOp + 16)))) break } case -12: { Xsqlite3_str_appendf(tls, bp+144, ts+1318, libc.VaList(bp+96, *(*float64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))))) break } case -10: { var pMem uintptr = *(*uintptr)(unsafe.Pointer(pOp + 16)) if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Str != 0 { zP4 = (*Mem)(unsafe.Pointer(pMem)).Fz } else if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Int|MEM_IntReal) != 0 { Xsqlite3_str_appendf(tls, bp+144, ts+1324, libc.VaList(bp+104, *(*I64)(unsafe.Pointer(pMem)))) } else if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Real != 0 { Xsqlite3_str_appendf(tls, bp+144, ts+1318, libc.VaList(bp+112, *(*float64)(unsafe.Pointer(pMem)))) } else if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Null != 0 { zP4 = ts + 1545 } else { zP4 = ts + 6330 } break } case -11: { var pVtab uintptr = (*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))).FpVtab Xsqlite3_str_appendf(tls, bp+144, ts+6337, libc.VaList(bp+120, pVtab)) break } case -14: { var i U32 var ai uintptr = *(*uintptr)(unsafe.Pointer(pOp + 16)) var n U32 = *(*U32)(unsafe.Pointer(ai)) for i = U32(1); i <= n; i++ { Xsqlite3_str_appendf(tls, bp+144, ts+6345, libc.VaList(bp+128, func() int32 { if i == U32(1) { return '[' } return ',' }(), *(*U32)(unsafe.Pointer(ai + uintptr(i)*4)))) } Xsqlite3_str_append(tls, bp+144, ts+6350, 1) break } case -4: { zP4 = ts + 6352 break } case -5: { zP4 = (*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))).FzName break } default: { zP4 = *(*uintptr)(unsafe.Pointer(pOp + 16)) } } if zP4 != 0 { Xsqlite3_str_appendall(tls, bp+144, zP4) } if int32((*StrAccum)(unsafe.Pointer(bp+144)).FaccError)&SQLITE_NOMEM != 0 { Xsqlite3OomFault(tls, db) } return Xsqlite3StrAccumFinish(tls, bp+144) } var encnames = [4]uintptr{ts + 6360, ts + 6362, ts + 6364, ts + 6369} // Declare to the Vdbe that the BTree object at db->aDb[i] is used. // // The prepared statements need to know in advance the complete set of // attached databases that will be use. A mask of these databases // is maintained in p->btreeMask. The p->lockMask value is the subset of // p->btreeMask of databases that will require a lock. func Xsqlite3VdbeUsesBtree(tls *libc.TLS, p uintptr, i int32) { *(*YDbMask)(unsafe.Pointer(p + 204)) |= YDbMask(1) << i if i != 1 && Xsqlite3BtreeSharable(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FaDb+uintptr(i)*32)).FpBt) != 0 { *(*YDbMask)(unsafe.Pointer(p + 208)) |= YDbMask(1) << i } } // If SQLite is compiled to support shared-cache mode and to be threadsafe, // this routine obtains the mutex associated with each BtShared structure // that may be accessed by the VM passed as an argument. In doing so it also // sets the BtShared.db member of each of the BtShared structures, ensuring // that the correct busy-handler callback is invoked if required. // // If SQLite is not threadsafe but does support shared-cache mode, then // sqlite3BtreeEnter() is invoked to set the BtShared.db variables // of all of BtShared structures accessible via the database handle // associated with the VM. // // If SQLite is not threadsafe and does not support shared-cache mode, this // function is a no-op. // // The p->btreeMask field is a bitmask of all btrees that the prepared // statement p will ever use. Let N be the number of bits in p->btreeMask // corresponding to btrees that use shared cache. Then the runtime of // this routine is N*N. But as N is rarely more than 1, this should not // be a problem. func Xsqlite3VdbeEnter(tls *libc.TLS, p uintptr) { var i int32 var db uintptr var aDb uintptr var nDb int32 if (*Vdbe)(unsafe.Pointer(p)).FlockMask == YDbMask(0) { return } db = (*Vdbe)(unsafe.Pointer(p)).Fdb aDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb nDb = (*Sqlite3)(unsafe.Pointer(db)).FnDb for i = 0; i < nDb; i++ { if i != 1 && (*Vdbe)(unsafe.Pointer(p)).FlockMask&(YDbMask(1)< 0 { for __ccgo := true; __ccgo; __ccgo = libc.PreDecInt32(&N, 1) > 0 { (*Mem)(unsafe.Pointer(p)).Fflags = flags (*Mem)(unsafe.Pointer(p)).Fdb = db (*Mem)(unsafe.Pointer(p)).FszMalloc = 0 p += 56 } } } func releaseMemArray(tls *libc.TLS, p uintptr, N int32) { if p != 0 && N != 0 { var pEnd uintptr = p + uintptr(N)*56 var db uintptr = (*Mem)(unsafe.Pointer(p)).Fdb if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed != 0 { for __ccgo := true; __ccgo; __ccgo = libc.PreIncUintptr(&p, 56) < pEnd { if (*Mem)(unsafe.Pointer(p)).FszMalloc != 0 { Xsqlite3DbFree(tls, db, (*Mem)(unsafe.Pointer(p)).FzMalloc) } } return } for __ccgo1 := true; __ccgo1; __ccgo1 = libc.PreIncUintptr(&p, 56) < pEnd { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 { Xsqlite3VdbeMemRelease(tls, p) (*Mem)(unsafe.Pointer(p)).Fflags = U16(MEM_Undefined) } else if (*Mem)(unsafe.Pointer(p)).FszMalloc != 0 { Xsqlite3DbNNFreeNN(tls, db, (*Mem)(unsafe.Pointer(p)).FzMalloc) (*Mem)(unsafe.Pointer(p)).FszMalloc = 0 (*Mem)(unsafe.Pointer(p)).Fflags = U16(MEM_Undefined) } } } } // This is a destructor on a Mem object (which is really an sqlite3_value) // that deletes the Frame object that is attached to it as a blob. // // This routine does not delete the Frame right away. It merely adds the // frame to a list of frames to be deleted when the Vdbe halts. func Xsqlite3VdbeFrameMemDel(tls *libc.TLS, pArg uintptr) { var pFrame uintptr = pArg (*VdbeFrame)(unsafe.Pointer(pFrame)).FpParent = (*Vdbe)(unsafe.Pointer((*VdbeFrame)(unsafe.Pointer(pFrame)).Fv)).FpDelFrame (*Vdbe)(unsafe.Pointer((*VdbeFrame)(unsafe.Pointer(pFrame)).Fv)).FpDelFrame = pFrame } // Locate the next opcode to be displayed in EXPLAIN or EXPLAIN // QUERY PLAN output. // // Return SQLITE_ROW on success. Return SQLITE_DONE if there are no // more opcodes to be displayed. func Xsqlite3VdbeNextOpcode(tls *libc.TLS, p uintptr, pSub uintptr, eMode int32, piPc uintptr, piAddr uintptr, paOp uintptr) int32 { var nRow int32 var nSub int32 = 0 var apSub uintptr = uintptr(0) var i int32 var rc int32 = SQLITE_OK var aOp uintptr = uintptr(0) var iPc int32 nRow = (*Vdbe)(unsafe.Pointer(p)).FnOp if pSub != uintptr(0) { if int32((*Mem)(unsafe.Pointer(pSub)).Fflags)&MEM_Blob != 0 { nSub = int32(uint64((*Mem)(unsafe.Pointer(pSub)).Fn) / uint64(unsafe.Sizeof(uintptr(0)))) apSub = (*Mem)(unsafe.Pointer(pSub)).Fz } for i = 0; i < nSub; i++ { nRow = nRow + (*SubProgram)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(apSub + uintptr(i)*8)))).FnOp } } iPc = *(*int32)(unsafe.Pointer(piPc)) for 1 != 0 { i = libc.PostIncInt32(&iPc, 1) if i >= nRow { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_OK rc = SQLITE_DONE break } if i < (*Vdbe)(unsafe.Pointer(p)).FnOp { aOp = (*Vdbe)(unsafe.Pointer(p)).FaOp } else { var j int32 i = i - (*Vdbe)(unsafe.Pointer(p)).FnOp for j = 0; i >= (*SubProgram)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(apSub + uintptr(j)*8)))).FnOp; j++ { i = i - (*SubProgram)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(apSub + uintptr(j)*8)))).FnOp } aOp = (*SubProgram)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(apSub + uintptr(j)*8)))).FaOp } if pSub != uintptr(0) && int32((*Op)(unsafe.Pointer(aOp+uintptr(i)*24)).Fp4type) == -4 { var nByte int32 = int32(uint64(nSub+1) * uint64(unsafe.Sizeof(uintptr(0)))) var j int32 for j = 0; j < nSub; j++ { if *(*uintptr)(unsafe.Pointer(apSub + uintptr(j)*8)) == *(*uintptr)(unsafe.Pointer(aOp + uintptr(i)*24 + 16)) { break } } if j == nSub { (*Vdbe)(unsafe.Pointer(p)).Frc = Xsqlite3VdbeMemGrow(tls, pSub, nByte, libc.Bool32(nSub != 0)) if (*Vdbe)(unsafe.Pointer(p)).Frc != SQLITE_OK { rc = SQLITE_ERROR break } apSub = (*Mem)(unsafe.Pointer(pSub)).Fz *(*uintptr)(unsafe.Pointer(apSub + uintptr(libc.PostIncInt32(&nSub, 1))*8)) = *(*uintptr)(unsafe.Pointer(aOp + uintptr(i)*24 + 16)) (*Mem)(unsafe.Pointer(pSub)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pSub)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Blob) (*Mem)(unsafe.Pointer(pSub)).Fn = int32(uint64(nSub) * uint64(unsafe.Sizeof(uintptr(0)))) nRow = nRow + (*SubProgram)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aOp + uintptr(i)*24 + 16)))).FnOp } } if eMode == 0 { break } { if int32((*Op)(unsafe.Pointer(aOp+uintptr(i)*24)).Fopcode) == OP_Explain { break } if int32((*Op)(unsafe.Pointer(aOp+uintptr(i)*24)).Fopcode) == OP_Init && iPc > 1 { break } } } *(*int32)(unsafe.Pointer(piPc)) = iPc *(*int32)(unsafe.Pointer(piAddr)) = i *(*uintptr)(unsafe.Pointer(paOp)) = aOp return rc } // Delete a VdbeFrame object and its contents. VdbeFrame objects are // allocated by the OP_Program opcode in sqlite3VdbeExec(). func Xsqlite3VdbeFrameDelete(tls *libc.TLS, p uintptr) { var i int32 var aMem uintptr = p + 112 var apCsr uintptr = aMem + uintptr((*VdbeFrame)(unsafe.Pointer(p)).FnChildMem)*56 for i = 0; i < (*VdbeFrame)(unsafe.Pointer(p)).FnChildCsr; i++ { if *(*uintptr)(unsafe.Pointer(apCsr + uintptr(i)*8)) != 0 { Xsqlite3VdbeFreeCursorNN(tls, (*VdbeFrame)(unsafe.Pointer(p)).Fv, *(*uintptr)(unsafe.Pointer(apCsr + uintptr(i)*8))) } } releaseMemArray(tls, aMem, (*VdbeFrame)(unsafe.Pointer(p)).FnChildMem) Xsqlite3VdbeDeleteAuxData(tls, (*Vdbe)(unsafe.Pointer((*VdbeFrame)(unsafe.Pointer(p)).Fv)).Fdb, p+64, -1, 0) Xsqlite3DbFree(tls, (*Vdbe)(unsafe.Pointer((*VdbeFrame)(unsafe.Pointer(p)).Fv)).Fdb, p) } // Give a listing of the program in the virtual machine. // // The interface is the same as sqlite3VdbeExec(). But instead of // running the code, it invokes the callback once for each instruction. // This feature is used to implement "EXPLAIN". // // When p->explain==1, each instruction is listed. When // p->explain==2, only OP_Explain instructions are listed and these // are shown in a different format. p->explain==2 is used to implement // EXPLAIN QUERY PLAN. // 2018-04-24: In p->explain==2 mode, the OP_Init opcodes of triggers // are also shown, so that the boundaries between the main program and // each trigger are clear. // // When p->explain==1, first the main program is listed, then each of // the trigger subprograms are listed one by one. func Xsqlite3VdbeList(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pSub uintptr = uintptr(0) var db uintptr = (*Vdbe)(unsafe.Pointer(p)).Fdb var rc int32 = SQLITE_OK var pMem uintptr = (*Vdbe)(unsafe.Pointer(p)).FaMem + 1*56 var bListSubprogs int32 = libc.Bool32(int32(*(*uint8)(unsafe.Pointer(p + 200))&0xc>>2) == 1 || (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_TriggerEQP) != uint64(0)) var pOp uintptr releaseMemArray(tls, pMem, 8) if (*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_NOMEM { Xsqlite3OomFault(tls, db) return SQLITE_ERROR } if bListSubprogs != 0 { pSub = (*Vdbe)(unsafe.Pointer(p)).FaMem + 9*56 } else { pSub = uintptr(0) } rc = Xsqlite3VdbeNextOpcode(tls, p, pSub, libc.Bool32(int32(*(*uint8)(unsafe.Pointer(p + 200))&0xc>>2) == 2), p+48, bp, bp+8) if rc == SQLITE_OK { pOp = *(*uintptr)(unsafe.Pointer(bp + 8)) + uintptr(*(*int32)(unsafe.Pointer(bp)))*24 if libc.AtomicLoadNInt32(db+432, 0) != 0 { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_INTERRUPT rc = SQLITE_ERROR Xsqlite3VdbeError(tls, p, Xsqlite3ErrStr(tls, (*Vdbe)(unsafe.Pointer(p)).Frc), 0) } else { var zP4 uintptr = Xsqlite3VdbeDisplayP4(tls, db, pOp) if int32(*(*uint8)(unsafe.Pointer(p + 200))&0xc>>2) == 2 { Xsqlite3VdbeMemSetInt64(tls, pMem, int64((*Op)(unsafe.Pointer(pOp)).Fp1)) Xsqlite3VdbeMemSetInt64(tls, pMem+uintptr(1)*56, int64((*Op)(unsafe.Pointer(pOp)).Fp2)) Xsqlite3VdbeMemSetInt64(tls, pMem+uintptr(2)*56, int64((*Op)(unsafe.Pointer(pOp)).Fp3)) Xsqlite3VdbeMemSetStr(tls, pMem+uintptr(3)*56, zP4, int64(-1), uint8(SQLITE_UTF8), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) (*Vdbe)(unsafe.Pointer(p)).FnResColumn = U16(4) } else { Xsqlite3VdbeMemSetInt64(tls, pMem+uintptr(0)*56, int64(*(*int32)(unsafe.Pointer(bp)))) Xsqlite3VdbeMemSetStr(tls, pMem+uintptr(1)*56, Xsqlite3OpcodeName(tls, int32((*Op)(unsafe.Pointer(pOp)).Fopcode)), int64(-1), uint8(SQLITE_UTF8), uintptr(0)) Xsqlite3VdbeMemSetInt64(tls, pMem+uintptr(2)*56, int64((*Op)(unsafe.Pointer(pOp)).Fp1)) Xsqlite3VdbeMemSetInt64(tls, pMem+uintptr(3)*56, int64((*Op)(unsafe.Pointer(pOp)).Fp2)) Xsqlite3VdbeMemSetInt64(tls, pMem+uintptr(4)*56, int64((*Op)(unsafe.Pointer(pOp)).Fp3)) Xsqlite3VdbeMemSetInt64(tls, pMem+uintptr(6)*56, int64((*Op)(unsafe.Pointer(pOp)).Fp5)) Xsqlite3VdbeMemSetNull(tls, pMem+uintptr(7)*56) Xsqlite3VdbeMemSetStr(tls, pMem+uintptr(5)*56, zP4, int64(-1), uint8(SQLITE_UTF8), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) (*Vdbe)(unsafe.Pointer(p)).FnResColumn = U16(8) } (*Vdbe)(unsafe.Pointer(p)).FpResultRow = pMem if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM rc = SQLITE_ERROR } else { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_OK rc = SQLITE_ROW } } } return rc } // An instance of this object describes bulk memory available for use // by subcomponents of a prepared statement. Space is allocated out // of a ReusableSpace object by the allocSpace() routine below. type ReusableSpace = struct { FpSpace uintptr FnFree Sqlite3_int64 FnNeeded Sqlite3_int64 } func allocSpace(tls *libc.TLS, p uintptr, pBuf uintptr, nByte Sqlite3_int64) uintptr { if pBuf == uintptr(0) { nByte = nByte if nByte <= (*ReusableSpace)(unsafe.Pointer(p)).FnFree { *(*Sqlite3_int64)(unsafe.Pointer(p + 8)) -= nByte pBuf = (*ReusableSpace)(unsafe.Pointer(p)).FpSpace + uintptr((*ReusableSpace)(unsafe.Pointer(p)).FnFree) } else { *(*Sqlite3_int64)(unsafe.Pointer(p + 16)) += nByte } } return pBuf } // Rewind the VDBE back to the beginning in preparation for // running it. func Xsqlite3VdbeRewind(tls *libc.TLS, p uintptr) { (*Vdbe)(unsafe.Pointer(p)).FeVdbeState = U8(VDBE_READY_STATE) (*Vdbe)(unsafe.Pointer(p)).Fpc = -1 (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_OK (*Vdbe)(unsafe.Pointer(p)).FerrorAction = U8(OE_Abort) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) (*Vdbe)(unsafe.Pointer(p)).FcacheCtr = U32(1) (*Vdbe)(unsafe.Pointer(p)).FminWriteFileFormat = U8(255) (*Vdbe)(unsafe.Pointer(p)).FiStatement = 0 (*Vdbe)(unsafe.Pointer(p)).FnFkConstraint = int64(0) } // Prepare a virtual machine for execution for the first time after // creating the virtual machine. This involves things such // as allocating registers and initializing the program counter. // After the VDBE has be prepped, it can be executed by one or more // calls to sqlite3VdbeExec(). // // This function may be called exactly once on each virtual machine. // After this routine is called the VM has been "packaged" and is ready // to run. After this routine is called, further calls to // sqlite3VdbeAddOp() functions are prohibited. This routine disconnects // the Vdbe from the Parse object that helped generate it so that the // the Vdbe becomes an independent entity and the Parse object can be // destroyed. // // Use the sqlite3VdbeRewind() procedure to restore a virtual machine back // to its initial state after it has been run. func Xsqlite3VdbeMakeReady(tls *libc.TLS, p uintptr, pParse uintptr) { bp := tls.Alloc(32) defer tls.Free(32) var db uintptr var nVar int32 var nMem int32 var nCursor int32 var n int32 (*Vdbe)(unsafe.Pointer(p)).FpVList = (*Parse)(unsafe.Pointer(pParse)).FpVList (*Parse)(unsafe.Pointer(pParse)).FpVList = uintptr(0) db = (*Vdbe)(unsafe.Pointer(p)).Fdb nVar = int32((*Parse)(unsafe.Pointer(pParse)).FnVar) nMem = (*Parse)(unsafe.Pointer(pParse)).FnMem nCursor = (*Parse)(unsafe.Pointer(pParse)).FnTab *(*int32)(unsafe.Pointer(bp)) = (*Parse)(unsafe.Pointer(pParse)).FnMaxArg nMem = nMem + nCursor if nCursor == 0 && nMem > 0 { nMem++ } n = int32(uint64(unsafe.Sizeof(Op{})) * uint64((*Vdbe)(unsafe.Pointer(p)).FnOp)) (*ReusableSpace)(unsafe.Pointer(bp + 8)).FpSpace = (*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr(n) (*ReusableSpace)(unsafe.Pointer(bp + 8)).FnFree = Sqlite3_int64(((*Parse)(unsafe.Pointer(pParse)).FszOpAlloc - n) & libc.CplInt32(7)) resolveP2Values(tls, p, bp) libc.SetBitFieldPtr8Uint32(p+200, Bft(U8(libc.Bool32((*Parse)(unsafe.Pointer(pParse)).FisMultiWrite != 0 && (*Parse)(unsafe.Pointer(pParse)).FmayAbort != 0))), 5, 0x20) if (*Parse)(unsafe.Pointer(pParse)).Fexplain != 0 { var iFirst int32 var mx int32 var i int32 if nMem < 10 { nMem = 10 } libc.SetBitFieldPtr8Uint32(p+200, Bft((*Parse)(unsafe.Pointer(pParse)).Fexplain), 2, 0xc) if int32((*Parse)(unsafe.Pointer(pParse)).Fexplain) == 2 { Xsqlite3VdbeSetNumCols(tls, p, 4) iFirst = 8 mx = 12 } else { Xsqlite3VdbeSetNumCols(tls, p, 8) iFirst = 0 mx = 8 } for i = iFirst; i < mx; i++ { Xsqlite3VdbeSetColName(tls, p, i-iFirst, COLNAME_NAME, azColName[i], uintptr(0)) } } libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 0, 0x3) (*ReusableSpace)(unsafe.Pointer(bp + 8)).FnNeeded = int64(0) (*Vdbe)(unsafe.Pointer(p)).FaMem = allocSpace(tls, bp+8, uintptr(0), int64(uint64(nMem)*uint64(unsafe.Sizeof(Mem{})))) (*Vdbe)(unsafe.Pointer(p)).FaVar = allocSpace(tls, bp+8, uintptr(0), int64(uint64(nVar)*uint64(unsafe.Sizeof(Mem{})))) (*Vdbe)(unsafe.Pointer(p)).FapArg = allocSpace(tls, bp+8, uintptr(0), int64(uint64(*(*int32)(unsafe.Pointer(bp)))*uint64(unsafe.Sizeof(uintptr(0))))) (*Vdbe)(unsafe.Pointer(p)).FapCsr = allocSpace(tls, bp+8, uintptr(0), int64(uint64(nCursor)*uint64(unsafe.Sizeof(uintptr(0))))) if (*ReusableSpace)(unsafe.Pointer(bp+8)).FnNeeded != 0 { (*ReusableSpace)(unsafe.Pointer(bp + 8)).FpSpace = libc.AssignPtrUintptr(p+256, Xsqlite3DbMallocRawNN(tls, db, uint64((*ReusableSpace)(unsafe.Pointer(bp+8)).FnNeeded))) (*ReusableSpace)(unsafe.Pointer(bp + 8)).FnFree = (*ReusableSpace)(unsafe.Pointer(bp + 8)).FnNeeded if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { (*Vdbe)(unsafe.Pointer(p)).FaMem = allocSpace(tls, bp+8, (*Vdbe)(unsafe.Pointer(p)).FaMem, int64(uint64(nMem)*uint64(unsafe.Sizeof(Mem{})))) (*Vdbe)(unsafe.Pointer(p)).FaVar = allocSpace(tls, bp+8, (*Vdbe)(unsafe.Pointer(p)).FaVar, int64(uint64(nVar)*uint64(unsafe.Sizeof(Mem{})))) (*Vdbe)(unsafe.Pointer(p)).FapArg = allocSpace(tls, bp+8, (*Vdbe)(unsafe.Pointer(p)).FapArg, int64(uint64(*(*int32)(unsafe.Pointer(bp)))*uint64(unsafe.Sizeof(uintptr(0))))) (*Vdbe)(unsafe.Pointer(p)).FapCsr = allocSpace(tls, bp+8, (*Vdbe)(unsafe.Pointer(p)).FapCsr, int64(uint64(nCursor)*uint64(unsafe.Sizeof(uintptr(0))))) } } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Vdbe)(unsafe.Pointer(p)).FnVar = int16(0) (*Vdbe)(unsafe.Pointer(p)).FnCursor = 0 (*Vdbe)(unsafe.Pointer(p)).FnMem = 0 } else { (*Vdbe)(unsafe.Pointer(p)).FnCursor = nCursor (*Vdbe)(unsafe.Pointer(p)).FnVar = YnVar(nVar) initMemArray(tls, (*Vdbe)(unsafe.Pointer(p)).FaVar, nVar, db, uint16(MEM_Null)) (*Vdbe)(unsafe.Pointer(p)).FnMem = nMem initMemArray(tls, (*Vdbe)(unsafe.Pointer(p)).FaMem, nMem, db, uint16(MEM_Undefined)) libc.Xmemset(tls, (*Vdbe)(unsafe.Pointer(p)).FapCsr, 0, uint64(nCursor)*uint64(unsafe.Sizeof(uintptr(0)))) } Xsqlite3VdbeRewind(tls, p) } var azColName = [12]uintptr{ ts + 6374, ts + 6379, ts + 6386, ts + 6389, ts + 6392, ts + 6395, ts + 6398, ts + 6401, ts + 6409, ts + 6412, ts + 6419, ts + 6427, } // Close a VDBE cursor and release all the resources that cursor // happens to hold. func Xsqlite3VdbeFreeCursor(tls *libc.TLS, p uintptr, pCx uintptr) { if pCx != 0 { Xsqlite3VdbeFreeCursorNN(tls, p, pCx) } } func Xsqlite3VdbeFreeCursorNN(tls *libc.TLS, p uintptr, pCx uintptr) { switch int32((*VdbeCursor)(unsafe.Pointer(pCx)).FeCurType) { case CURTYPE_SORTER: { Xsqlite3VdbeSorterClose(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, pCx) break } case CURTYPE_BTREE: { Xsqlite3BtreeCloseCursor(tls, *(*uintptr)(unsafe.Pointer(pCx + 48))) break } case CURTYPE_VTAB: { var pVCur uintptr = *(*uintptr)(unsafe.Pointer(pCx + 48)) var pModule uintptr = (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(pVCur)).FpVtab)).FpModule (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(pVCur)).FpVtab)).FnRef-- (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule)).FxClose})).f(tls, pVCur) break } } } func closeCursorsInFrame(tls *libc.TLS, p uintptr) { var i int32 for i = 0; i < (*Vdbe)(unsafe.Pointer(p)).FnCursor; i++ { var pC uintptr = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr(i)*8)) if pC != 0 { Xsqlite3VdbeFreeCursorNN(tls, p, pC) *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr(i)*8)) = uintptr(0) } } } // Copy the values stored in the VdbeFrame structure to its Vdbe. This // is used, for example, when a trigger sub-program is halted to restore // control to the main program. func Xsqlite3VdbeFrameRestore(tls *libc.TLS, pFrame uintptr) int32 { var v uintptr = (*VdbeFrame)(unsafe.Pointer(pFrame)).Fv closeCursorsInFrame(tls, v) (*Vdbe)(unsafe.Pointer(v)).FaOp = (*VdbeFrame)(unsafe.Pointer(pFrame)).FaOp (*Vdbe)(unsafe.Pointer(v)).FnOp = (*VdbeFrame)(unsafe.Pointer(pFrame)).FnOp (*Vdbe)(unsafe.Pointer(v)).FaMem = (*VdbeFrame)(unsafe.Pointer(pFrame)).FaMem (*Vdbe)(unsafe.Pointer(v)).FnMem = (*VdbeFrame)(unsafe.Pointer(pFrame)).FnMem (*Vdbe)(unsafe.Pointer(v)).FapCsr = (*VdbeFrame)(unsafe.Pointer(pFrame)).FapCsr (*Vdbe)(unsafe.Pointer(v)).FnCursor = (*VdbeFrame)(unsafe.Pointer(pFrame)).FnCursor (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).Fdb)).FlastRowid = (*VdbeFrame)(unsafe.Pointer(pFrame)).FlastRowid (*Vdbe)(unsafe.Pointer(v)).FnChange = (*VdbeFrame)(unsafe.Pointer(pFrame)).FnChange (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).Fdb)).FnChange = (*VdbeFrame)(unsafe.Pointer(pFrame)).FnDbChange Xsqlite3VdbeDeleteAuxData(tls, (*Vdbe)(unsafe.Pointer(v)).Fdb, v+296, -1, 0) (*Vdbe)(unsafe.Pointer(v)).FpAuxData = (*VdbeFrame)(unsafe.Pointer(pFrame)).FpAuxData (*VdbeFrame)(unsafe.Pointer(pFrame)).FpAuxData = uintptr(0) return (*VdbeFrame)(unsafe.Pointer(pFrame)).Fpc } func closeAllCursors(tls *libc.TLS, p uintptr) { if (*Vdbe)(unsafe.Pointer(p)).FpFrame != 0 { var pFrame uintptr for pFrame = (*Vdbe)(unsafe.Pointer(p)).FpFrame; (*VdbeFrame)(unsafe.Pointer(pFrame)).FpParent != 0; pFrame = (*VdbeFrame)(unsafe.Pointer(pFrame)).FpParent { } Xsqlite3VdbeFrameRestore(tls, pFrame) (*Vdbe)(unsafe.Pointer(p)).FpFrame = uintptr(0) (*Vdbe)(unsafe.Pointer(p)).FnFrame = 0 } closeCursorsInFrame(tls, p) releaseMemArray(tls, (*Vdbe)(unsafe.Pointer(p)).FaMem, (*Vdbe)(unsafe.Pointer(p)).FnMem) for (*Vdbe)(unsafe.Pointer(p)).FpDelFrame != 0 { var pDel uintptr = (*Vdbe)(unsafe.Pointer(p)).FpDelFrame (*Vdbe)(unsafe.Pointer(p)).FpDelFrame = (*VdbeFrame)(unsafe.Pointer(pDel)).FpParent Xsqlite3VdbeFrameDelete(tls, pDel) } if (*Vdbe)(unsafe.Pointer(p)).FpAuxData != 0 { Xsqlite3VdbeDeleteAuxData(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, p+296, -1, 0) } } // Set the number of result columns that will be returned by this SQL // statement. This is now set at compile time, rather than during // execution of the vdbe program so that sqlite3_column_count() can // be called on an SQL statement before sqlite3_step(). func Xsqlite3VdbeSetNumCols(tls *libc.TLS, p uintptr, nResColumn int32) { var n int32 var db uintptr = (*Vdbe)(unsafe.Pointer(p)).Fdb if (*Vdbe)(unsafe.Pointer(p)).FnResColumn != 0 { releaseMemArray(tls, (*Vdbe)(unsafe.Pointer(p)).FaColName, int32((*Vdbe)(unsafe.Pointer(p)).FnResColumn)*COLNAME_N) Xsqlite3DbFree(tls, db, (*Vdbe)(unsafe.Pointer(p)).FaColName) } n = nResColumn * COLNAME_N (*Vdbe)(unsafe.Pointer(p)).FnResColumn = U16(nResColumn) (*Vdbe)(unsafe.Pointer(p)).FaColName = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(Mem{}))*uint64(n)) if (*Vdbe)(unsafe.Pointer(p)).FaColName == uintptr(0) { return } initMemArray(tls, (*Vdbe)(unsafe.Pointer(p)).FaColName, n, db, uint16(MEM_Null)) } // Set the name of the idx'th column to be returned by the SQL statement. // zName must be a pointer to a nul terminated string. // // This call must be made after a call to sqlite3VdbeSetNumCols(). // // The final parameter, xDel, must be one of SQLITE_DYNAMIC, SQLITE_STATIC // or SQLITE_TRANSIENT. If it is SQLITE_DYNAMIC, then the buffer pointed // to by zName will be freed by sqlite3DbFree() when the vdbe is destroyed. func Xsqlite3VdbeSetColName(tls *libc.TLS, p uintptr, idx int32, var1 int32, zName uintptr, xDel uintptr) int32 { var rc int32 var pColName uintptr if (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FmallocFailed != 0 { return SQLITE_NOMEM } pColName = (*Vdbe)(unsafe.Pointer(p)).FaColName + uintptr(idx+var1*int32((*Vdbe)(unsafe.Pointer(p)).FnResColumn))*56 rc = Xsqlite3VdbeMemSetStr(tls, pColName, zName, int64(-1), uint8(SQLITE_UTF8), xDel) return rc } func vdbeCommit(tls *libc.TLS, db uintptr, p uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) var i int32 var nTrans int32 = 0 var rc int32 = SQLITE_OK var needXcommit int32 = 0 rc = Xsqlite3VtabSync(tls, db, p) for i = 0; rc == SQLITE_OK && i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if Xsqlite3BtreeTxnState(tls, pBt) == SQLITE_TXN_WRITE { var pPager uintptr needXcommit = 1 Xsqlite3BtreeEnter(tls, pBt) pPager = Xsqlite3BtreePager(tls, pBt) if int32((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).Fsafety_level) != PAGER_SYNCHRONOUS_OFF && aMJNeeded[Xsqlite3PagerGetJournalMode(tls, pPager)] != 0 && Xsqlite3PagerIsMemdb(tls, pPager) == 0 { nTrans++ } rc = Xsqlite3PagerExclusiveLock(tls, pPager) Xsqlite3BtreeLeave(tls, pBt) } } if rc != SQLITE_OK { return rc } if needXcommit != 0 && (*Sqlite3)(unsafe.Pointer(db)).FxCommitCallback != 0 { rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxCommitCallback})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpCommitArg) if rc != 0 { return SQLITE_CONSTRAINT | int32(2)<<8 } } if 0 == Xsqlite3Strlen30(tls, Xsqlite3BtreeGetFilename(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpBt)) || nTrans <= 1 { for i = 0; rc == SQLITE_OK && i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { rc = Xsqlite3BtreeCommitPhaseOne(tls, pBt, uintptr(0)) } } for i = 0; rc == SQLITE_OK && i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { rc = Xsqlite3BtreeCommitPhaseTwo(tls, pBt, 0) } } if rc == SQLITE_OK { Xsqlite3VtabCommit(tls, db) } } else { var pVfs uintptr = (*Sqlite3)(unsafe.Pointer(db)).FpVfs var zSuper uintptr = uintptr(0) var zMainFile uintptr = Xsqlite3BtreeGetFilename(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpBt) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) var offset I64 = int64(0) var retryCount int32 = 0 var nMainFile int32 nMainFile = Xsqlite3Strlen30(tls, zMainFile) zSuper = Xsqlite3MPrintf(tls, db, ts+6434, libc.VaList(bp, 0, zMainFile, 0)) if zSuper == uintptr(0) { return SQLITE_NOMEM } zSuper += uintptr(4) for __ccgo := true; __ccgo; __ccgo = rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 60)) != 0 { if retryCount != 0 { if retryCount > 100 { Xsqlite3_log(tls, SQLITE_FULL, ts+6446, libc.VaList(bp+24, zSuper)) Xsqlite3OsDelete(tls, pVfs, zSuper, 0) break } else if retryCount == 1 { Xsqlite3_log(tls, SQLITE_FULL, ts+6460, libc.VaList(bp+32, zSuper)) } } retryCount++ Xsqlite3_randomness(tls, int32(unsafe.Sizeof(U32(0))), bp+56) Xsqlite3_snprintf(tls, 13, zSuper+uintptr(nMainFile), ts+6475, libc.VaList(bp+40, *(*U32)(unsafe.Pointer(bp + 56))>>8&U32(0xffffff), *(*U32)(unsafe.Pointer(bp + 56))&U32(0xff))) rc = Xsqlite3OsAccess(tls, pVfs, zSuper, SQLITE_ACCESS_EXISTS, bp+60) } if rc == SQLITE_OK { rc = Xsqlite3OsOpenMalloc(tls, pVfs, zSuper, bp+64, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_SUPER_JOURNAL, uintptr(0)) } if rc != SQLITE_OK { Xsqlite3DbFree(tls, db, zSuper-uintptr(4)) return rc } for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if Xsqlite3BtreeTxnState(tls, pBt) == SQLITE_TXN_WRITE { var zFile uintptr = Xsqlite3BtreeGetJournalname(tls, pBt) if zFile == uintptr(0) { continue } rc = Xsqlite3OsWrite(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), zFile, Xsqlite3Strlen30(tls, zFile)+1, offset) offset = offset + I64(Xsqlite3Strlen30(tls, zFile)+1) if rc != SQLITE_OK { Xsqlite3OsCloseFree(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) Xsqlite3OsDelete(tls, pVfs, zSuper, 0) Xsqlite3DbFree(tls, db, zSuper-uintptr(4)) return rc } } } if 0 == Xsqlite3OsDeviceCharacteristics(tls, *(*uintptr)(unsafe.Pointer(bp + 64)))&SQLITE_IOCAP_SEQUENTIAL && SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3OsSync(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), SQLITE_SYNC_NORMAL)) { Xsqlite3OsCloseFree(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) Xsqlite3OsDelete(tls, pVfs, zSuper, 0) Xsqlite3DbFree(tls, db, zSuper-uintptr(4)) return rc } for i = 0; rc == SQLITE_OK && i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { rc = Xsqlite3BtreeCommitPhaseOne(tls, pBt, zSuper) } } Xsqlite3OsCloseFree(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) if rc != SQLITE_OK { Xsqlite3DbFree(tls, db, zSuper-uintptr(4)) return rc } rc = Xsqlite3OsDelete(tls, pVfs, zSuper, 1) Xsqlite3DbFree(tls, db, zSuper-uintptr(4)) zSuper = uintptr(0) if rc != 0 { return rc } Xsqlite3BeginBenignMalloc(tls) for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { Xsqlite3BtreeCommitPhaseTwo(tls, pBt, 1) } } Xsqlite3EndBenignMalloc(tls) Xsqlite3VtabCommit(tls, db) } return rc } var aMJNeeded = [6]U8{ U8(1), U8(1), U8(0), U8(1), U8(0), U8(0), } func vdbeCloseStatement(tls *libc.TLS, p uintptr, eOp int32) int32 { var db uintptr = (*Vdbe)(unsafe.Pointer(p)).Fdb var rc int32 = SQLITE_OK var i int32 var iSavepoint int32 = (*Vdbe)(unsafe.Pointer(p)).FiStatement - 1 for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var rc2 int32 = SQLITE_OK var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { if eOp == SAVEPOINT_ROLLBACK { rc2 = Xsqlite3BtreeSavepoint(tls, pBt, SAVEPOINT_ROLLBACK, iSavepoint) } if rc2 == SQLITE_OK { rc2 = Xsqlite3BtreeSavepoint(tls, pBt, SAVEPOINT_RELEASE, iSavepoint) } if rc == SQLITE_OK { rc = rc2 } } } (*Sqlite3)(unsafe.Pointer(db)).FnStatement-- (*Vdbe)(unsafe.Pointer(p)).FiStatement = 0 if rc == SQLITE_OK { if eOp == SAVEPOINT_ROLLBACK { rc = Xsqlite3VtabSavepoint(tls, db, SAVEPOINT_ROLLBACK, iSavepoint) } if rc == SQLITE_OK { rc = Xsqlite3VtabSavepoint(tls, db, SAVEPOINT_RELEASE, iSavepoint) } } if eOp == SAVEPOINT_ROLLBACK { (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons = (*Vdbe)(unsafe.Pointer(p)).FnStmtDefCons (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons = (*Vdbe)(unsafe.Pointer(p)).FnStmtDefImmCons } return rc } func Xsqlite3VdbeCloseStatement(tls *libc.TLS, p uintptr, eOp int32) int32 { if (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FnStatement != 0 && (*Vdbe)(unsafe.Pointer(p)).FiStatement != 0 { return vdbeCloseStatement(tls, p, eOp) } return SQLITE_OK } // This function is called when a transaction opened by the database // handle associated with the VM passed as an argument is about to be // committed. If there are outstanding deferred foreign key constraint // violations, return SQLITE_ERROR. Otherwise, SQLITE_OK. // // If there are outstanding FK violations and this function returns // SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY // and write an error message to it. Then return SQLITE_ERROR. func Xsqlite3VdbeCheckFk(tls *libc.TLS, p uintptr, deferred int32) int32 { var db uintptr = (*Vdbe)(unsafe.Pointer(p)).Fdb if deferred != 0 && (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons+(*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons > int64(0) || !(deferred != 0) && (*Vdbe)(unsafe.Pointer(p)).FnFkConstraint > int64(0) { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_CONSTRAINT | int32(3)<<8 (*Vdbe)(unsafe.Pointer(p)).FerrorAction = U8(OE_Abort) Xsqlite3VdbeError(tls, p, ts+6488, 0) if int32((*Vdbe)(unsafe.Pointer(p)).FprepFlags)&SQLITE_PREPARE_SAVESQL == 0 { return SQLITE_ERROR } return SQLITE_CONSTRAINT | int32(3)<<8 } return SQLITE_OK } // This routine is called the when a VDBE tries to halt. If the VDBE // has made changes and is in autocommit mode, then commit those // changes. If a rollback is needed, then do the rollback. // // This routine is the only way to move the sqlite3eOpenState of a VM from // SQLITE_STATE_RUN to SQLITE_STATE_HALT. It is harmless to // call this on a VM that is in the SQLITE_STATE_HALT state. // // Return an error code. If the commit could not complete because of // lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it // means the close did not happen and needs to be repeated. func Xsqlite3VdbeHalt(tls *libc.TLS, p uintptr) int32 { var rc int32 var db uintptr = (*Vdbe)(unsafe.Pointer(p)).Fdb if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } closeAllCursors(tls, p) if Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x80>>7)) != 0 { var mrc int32 var eStatementOp int32 = 0 var isSpecialError int32 Xsqlite3VdbeEnter(tls, p) if (*Vdbe)(unsafe.Pointer(p)).Frc != 0 { mrc = (*Vdbe)(unsafe.Pointer(p)).Frc & 0xff isSpecialError = libc.Bool32(mrc == SQLITE_NOMEM || mrc == SQLITE_IOERR || mrc == SQLITE_INTERRUPT || mrc == SQLITE_FULL) } else { mrc = libc.AssignInt32(&isSpecialError, 0) } if isSpecialError != 0 { if !(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x40>>6) != 0) || mrc != SQLITE_INTERRUPT { if (mrc == SQLITE_NOMEM || mrc == SQLITE_FULL) && Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x20>>5)) != 0 { eStatementOp = SAVEPOINT_ROLLBACK } else { Xsqlite3RollbackAll(tls, db, SQLITE_ABORT|int32(2)<<8) Xsqlite3CloseSavepoints(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) } } } if (*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_OK || int32((*Vdbe)(unsafe.Pointer(p)).FerrorAction) == OE_Fail && !(isSpecialError != 0) { Xsqlite3VdbeCheckFk(tls, p, 0) } if !((*Sqlite3)(unsafe.Pointer(db)).FnVTrans > 0 && (*Sqlite3)(unsafe.Pointer(db)).FaVTrans == uintptr(0)) && (*Sqlite3)(unsafe.Pointer(db)).FautoCommit != 0 && (*Sqlite3)(unsafe.Pointer(db)).FnVdbeWrite == libc.Bool32(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x40>>6) == 0) { if (*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_OK || int32((*Vdbe)(unsafe.Pointer(p)).FerrorAction) == OE_Fail && !(isSpecialError != 0) { rc = Xsqlite3VdbeCheckFk(tls, p, 1) if rc != SQLITE_OK { if Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x40>>6)) != 0 { Xsqlite3VdbeLeave(tls, p) return SQLITE_ERROR } rc = SQLITE_CONSTRAINT | int32(3)<<8 } else if (*Sqlite3)(unsafe.Pointer(db)).Fflags&(uint64(0x00002)<<32) != 0 { rc = SQLITE_CORRUPT *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(0x00002) << 32) } else { rc = vdbeCommit(tls, db, p) } if rc == SQLITE_BUSY && Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x40>>6)) != 0 { Xsqlite3VdbeLeave(tls, p) return SQLITE_BUSY } else if rc != SQLITE_OK { (*Vdbe)(unsafe.Pointer(p)).Frc = rc Xsqlite3RollbackAll(tls, db, SQLITE_OK) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) } else { (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons = int64(0) (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons = int64(0) *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_DeferFKs)) Xsqlite3CommitInternalChanges(tls, db) } } else { Xsqlite3RollbackAll(tls, db, SQLITE_OK) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) } (*Sqlite3)(unsafe.Pointer(db)).FnStatement = 0 } else if eStatementOp == 0 { if (*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_OK || int32((*Vdbe)(unsafe.Pointer(p)).FerrorAction) == OE_Fail { eStatementOp = SAVEPOINT_RELEASE } else if int32((*Vdbe)(unsafe.Pointer(p)).FerrorAction) == OE_Abort { eStatementOp = SAVEPOINT_ROLLBACK } else { Xsqlite3RollbackAll(tls, db, SQLITE_ABORT|int32(2)<<8) Xsqlite3CloseSavepoints(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) } } if eStatementOp != 0 { rc = Xsqlite3VdbeCloseStatement(tls, p, eStatementOp) if rc != 0 { if (*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_OK || (*Vdbe)(unsafe.Pointer(p)).Frc&0xff == SQLITE_CONSTRAINT { (*Vdbe)(unsafe.Pointer(p)).Frc = rc Xsqlite3DbFree(tls, db, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg) (*Vdbe)(unsafe.Pointer(p)).FzErrMsg = uintptr(0) } Xsqlite3RollbackAll(tls, db, SQLITE_ABORT|int32(2)<<8) Xsqlite3CloseSavepoints(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) } } if Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x10>>4)) != 0 { if eStatementOp != SAVEPOINT_ROLLBACK { Xsqlite3VdbeSetChanges(tls, db, (*Vdbe)(unsafe.Pointer(p)).FnChange) } else { Xsqlite3VdbeSetChanges(tls, db, int64(0)) } (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) } Xsqlite3VdbeLeave(tls, p) } (*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive-- if !(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x40>>6) != 0) { (*Sqlite3)(unsafe.Pointer(db)).FnVdbeWrite-- } if Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x80>>7)) != 0 { (*Sqlite3)(unsafe.Pointer(db)).FnVdbeRead-- } (*Vdbe)(unsafe.Pointer(p)).FeVdbeState = U8(VDBE_HALT_STATE) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } if (*Sqlite3)(unsafe.Pointer(db)).FautoCommit != 0 { Xsqlite3ConnectionUnlocked(tls, db) } return func() int32 { if (*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_BUSY { return SQLITE_BUSY } return SQLITE_OK }() } // Each VDBE holds the result of the most recent sqlite3_step() call // in p->rc. This routine sets that result back to SQLITE_OK. func Xsqlite3VdbeResetStepResult(tls *libc.TLS, p uintptr) { (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_OK } // Copy the error code and error message belonging to the VDBE passed // as the first argument to its database handle (so that they will be // returned by calls to sqlite3_errcode() and sqlite3_errmsg()). // // This function does not clear the VDBE error code or message, just // copies them to the database handle. func Xsqlite3VdbeTransferError(tls *libc.TLS, p uintptr) int32 { var db uintptr = (*Vdbe)(unsafe.Pointer(p)).Fdb var rc int32 = (*Vdbe)(unsafe.Pointer(p)).Frc if (*Vdbe)(unsafe.Pointer(p)).FzErrMsg != 0 { (*Sqlite3)(unsafe.Pointer(db)).FbBenignMalloc++ Xsqlite3BeginBenignMalloc(tls) if (*Sqlite3)(unsafe.Pointer(db)).FpErr == uintptr(0) { (*Sqlite3)(unsafe.Pointer(db)).FpErr = Xsqlite3ValueNew(tls, db) } Xsqlite3ValueSetStr(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr, -1, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg, uint8(SQLITE_UTF8), libc.UintptrFromInt32(-1)) Xsqlite3EndBenignMalloc(tls) (*Sqlite3)(unsafe.Pointer(db)).FbBenignMalloc-- } else if (*Sqlite3)(unsafe.Pointer(db)).FpErr != 0 { Xsqlite3ValueSetNull(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) } (*Sqlite3)(unsafe.Pointer(db)).FerrCode = rc (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset = -1 return rc } // Clean up a VDBE after execution but do not delete the VDBE just yet. // Write any error messages into *pzErrMsg. Return the result code. // // After this routine is run, the VDBE should be ready to be executed // again. // // To look at it another way, this routine resets the state of the // virtual machine from VDBE_RUN_STATE or VDBE_HALT_STATE back to // VDBE_READY_STATE. func Xsqlite3VdbeReset(tls *libc.TLS, p uintptr) int32 { var db uintptr db = (*Vdbe)(unsafe.Pointer(p)).Fdb if int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) == VDBE_RUN_STATE { Xsqlite3VdbeHalt(tls, p) } if (*Vdbe)(unsafe.Pointer(p)).Fpc >= 0 { if (*Sqlite3)(unsafe.Pointer(db)).FpErr != 0 || (*Vdbe)(unsafe.Pointer(p)).FzErrMsg != 0 { Xsqlite3VdbeTransferError(tls, p) } else { (*Sqlite3)(unsafe.Pointer(db)).FerrCode = (*Vdbe)(unsafe.Pointer(p)).Frc } } if (*Vdbe)(unsafe.Pointer(p)).FzErrMsg != 0 { Xsqlite3DbFree(tls, db, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg) (*Vdbe)(unsafe.Pointer(p)).FzErrMsg = uintptr(0) } (*Vdbe)(unsafe.Pointer(p)).FpResultRow = uintptr(0) return (*Vdbe)(unsafe.Pointer(p)).Frc & (*Sqlite3)(unsafe.Pointer(db)).FerrMask } // Clean up and delete a VDBE after execution. Return an integer which is // the result code. Write any error message text into *pzErrMsg. func Xsqlite3VdbeFinalize(tls *libc.TLS, p uintptr) int32 { var rc int32 = SQLITE_OK if int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) >= VDBE_READY_STATE { rc = Xsqlite3VdbeReset(tls, p) } Xsqlite3VdbeDelete(tls, p) return rc } // If parameter iOp is less than zero, then invoke the destructor for // all auxiliary data pointers currently cached by the VM passed as // the first argument. // // Or, if iOp is greater than or equal to zero, then the destructor is // only invoked for those auxiliary data pointers created by the user // function invoked by the OP_Function opcode at instruction iOp of // VM pVdbe, and only then if: // // - the associated function parameter is the 32nd or later (counting // from left to right), or // // - the corresponding bit in argument mask is clear (where the first // function parameter corresponds to bit 0 etc.). func Xsqlite3VdbeDeleteAuxData(tls *libc.TLS, db uintptr, pp uintptr, iOp int32, mask int32) { for *(*uintptr)(unsafe.Pointer(pp)) != 0 { var pAux uintptr = *(*uintptr)(unsafe.Pointer(pp)) if iOp < 0 || (*AuxData)(unsafe.Pointer(pAux)).FiAuxOp == iOp && (*AuxData)(unsafe.Pointer(pAux)).FiAuxArg >= 0 && ((*AuxData)(unsafe.Pointer(pAux)).FiAuxArg > 31 || !(uint32(mask)&(uint32(1)<<(*AuxData)(unsafe.Pointer(pAux)).FiAuxArg) != 0)) { if (*AuxData)(unsafe.Pointer(pAux)).FxDeleteAux != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*AuxData)(unsafe.Pointer(pAux)).FxDeleteAux})).f(tls, (*AuxData)(unsafe.Pointer(pAux)).FpAux) } *(*uintptr)(unsafe.Pointer(pp)) = (*AuxData)(unsafe.Pointer(pAux)).FpNextAux Xsqlite3DbFree(tls, db, pAux) } else { pp = pAux + 24 } } } func sqlite3VdbeClearObject(tls *libc.TLS, db uintptr, p uintptr) { var pSub uintptr var pNext uintptr if (*Vdbe)(unsafe.Pointer(p)).FaColName != 0 { releaseMemArray(tls, (*Vdbe)(unsafe.Pointer(p)).FaColName, int32((*Vdbe)(unsafe.Pointer(p)).FnResColumn)*COLNAME_N) Xsqlite3DbNNFreeNN(tls, db, (*Vdbe)(unsafe.Pointer(p)).FaColName) } for pSub = (*Vdbe)(unsafe.Pointer(p)).FpProgram; pSub != 0; pSub = pNext { pNext = (*SubProgram)(unsafe.Pointer(pSub)).FpNext vdbeFreeOpArray(tls, db, (*SubProgram)(unsafe.Pointer(pSub)).FaOp, (*SubProgram)(unsafe.Pointer(pSub)).FnOp) Xsqlite3DbFree(tls, db, pSub) } if int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) != VDBE_INIT_STATE { releaseMemArray(tls, (*Vdbe)(unsafe.Pointer(p)).FaVar, int32((*Vdbe)(unsafe.Pointer(p)).FnVar)) if (*Vdbe)(unsafe.Pointer(p)).FpVList != 0 { Xsqlite3DbNNFreeNN(tls, db, (*Vdbe)(unsafe.Pointer(p)).FpVList) } if (*Vdbe)(unsafe.Pointer(p)).FpFree != 0 { Xsqlite3DbNNFreeNN(tls, db, (*Vdbe)(unsafe.Pointer(p)).FpFree) } } vdbeFreeOpArray(tls, db, (*Vdbe)(unsafe.Pointer(p)).FaOp, (*Vdbe)(unsafe.Pointer(p)).FnOp) if (*Vdbe)(unsafe.Pointer(p)).FzSql != 0 { Xsqlite3DbNNFreeNN(tls, db, (*Vdbe)(unsafe.Pointer(p)).FzSql) } } // Delete an entire VDBE. func Xsqlite3VdbeDelete(tls *libc.TLS, p uintptr) { var db uintptr db = (*Vdbe)(unsafe.Pointer(p)).Fdb sqlite3VdbeClearObject(tls, db, p) if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FppVPrev)) = (*Vdbe)(unsafe.Pointer(p)).FpVNext if (*Vdbe)(unsafe.Pointer(p)).FpVNext != 0 { (*Vdbe)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FpVNext)).FppVPrev = (*Vdbe)(unsafe.Pointer(p)).FppVPrev } } Xsqlite3DbNNFreeNN(tls, db, p) } // The cursor "p" has a pending seek operation that has not yet been // carried out. Seek the cursor now. If an error occurs, return // the appropriate error code. func Xsqlite3VdbeFinishMoveto(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 rc = Xsqlite3BtreeTableMoveto(tls, *(*uintptr)(unsafe.Pointer(p + 48)), (*VdbeCursor)(unsafe.Pointer(p)).FmovetoTarget, 0, bp) if rc != 0 { return rc } if *(*int32)(unsafe.Pointer(bp)) != 0 { return Xsqlite3CorruptError(tls, 86062) } (*VdbeCursor)(unsafe.Pointer(p)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(p)).FcacheStatus = U32(CACHE_STALE) return SQLITE_OK } // Something has moved cursor "p" out of place. Maybe the row it was // pointed to was deleted out from under it. Or maybe the btree was // rebalanced. Whatever the cause, try to restore "p" to the place it // is supposed to be pointing. If the row was deleted out from under the // cursor, set the cursor to point to a NULL row. func Xsqlite3VdbeHandleMovedCursor(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 rc = Xsqlite3BtreeCursorRestore(tls, *(*uintptr)(unsafe.Pointer(p + 48)), bp) (*VdbeCursor)(unsafe.Pointer(p)).FcacheStatus = U32(CACHE_STALE) if *(*int32)(unsafe.Pointer(bp)) != 0 { (*VdbeCursor)(unsafe.Pointer(p)).FnullRow = U8(1) } return rc } // Check to ensure that the cursor is valid. Restore the cursor // if need be. Return any I/O error from the restore operation. func Xsqlite3VdbeCursorRestore(tls *libc.TLS, p uintptr) int32 { if Xsqlite3BtreeCursorHasMoved(tls, *(*uintptr)(unsafe.Pointer(p + 48))) != 0 { return Xsqlite3VdbeHandleMovedCursor(tls, p) } return SQLITE_OK } // The sizes for serial types less than 128 var Xsqlite3SmallTypeSizes = [128]U8{ U8(0), U8(1), U8(2), U8(3), U8(4), U8(6), U8(8), U8(8), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(1), U8(1), U8(2), U8(2), U8(3), U8(3), U8(4), U8(4), U8(5), U8(5), U8(6), U8(6), U8(7), U8(7), U8(8), U8(8), U8(9), U8(9), U8(10), U8(10), U8(11), U8(11), U8(12), U8(12), U8(13), U8(13), U8(14), U8(14), U8(15), U8(15), U8(16), U8(16), U8(17), U8(17), U8(18), U8(18), U8(19), U8(19), U8(20), U8(20), U8(21), U8(21), U8(22), U8(22), U8(23), U8(23), U8(24), U8(24), U8(25), U8(25), U8(26), U8(26), U8(27), U8(27), U8(28), U8(28), U8(29), U8(29), U8(30), U8(30), U8(31), U8(31), U8(32), U8(32), U8(33), U8(33), U8(34), U8(34), U8(35), U8(35), U8(36), U8(36), U8(37), U8(37), U8(38), U8(38), U8(39), U8(39), U8(40), U8(40), U8(41), U8(41), U8(42), U8(42), U8(43), U8(43), U8(44), U8(44), U8(45), U8(45), U8(46), U8(46), U8(47), U8(47), U8(48), U8(48), U8(49), U8(49), U8(50), U8(50), U8(51), U8(51), U8(52), U8(52), U8(53), U8(53), U8(54), U8(54), U8(55), U8(55), U8(56), U8(56), U8(57), U8(57), } // Return the length of the data corresponding to the supplied serial-type. func Xsqlite3VdbeSerialTypeLen(tls *libc.TLS, serial_type U32) U32 { if serial_type >= U32(128) { return (serial_type - U32(12)) / U32(2) } else { return U32(Xsqlite3SmallTypeSizes[serial_type]) } return U32(0) } func Xsqlite3VdbeOneByteSerialTypeLen(tls *libc.TLS, serial_type U8) U8 { return Xsqlite3SmallTypeSizes[serial_type] } func serialGet(tls *libc.TLS, buf uintptr, serial_type U32, pMem uintptr) { bp := tls.Alloc(8) defer tls.Free(8) *(*U64)(unsafe.Pointer(bp)) = U64(U32(*(*uint8)(unsafe.Pointer(buf)))<<24 | U32(int32(*(*uint8)(unsafe.Pointer(buf + 1)))<<16) | U32(int32(*(*uint8)(unsafe.Pointer(buf + 2)))<<8) | U32(*(*uint8)(unsafe.Pointer(buf + 3)))) var y U32 = U32(*(*uint8)(unsafe.Pointer(buf + uintptr(4))))<<24 | U32(int32(*(*uint8)(unsafe.Pointer(buf + uintptr(4) + 1)))<<16) | U32(int32(*(*uint8)(unsafe.Pointer(buf + uintptr(4) + 2)))<<8) | U32(*(*uint8)(unsafe.Pointer(buf + uintptr(4) + 3))) *(*U64)(unsafe.Pointer(bp)) = *(*U64)(unsafe.Pointer(bp))<<32 + U64(y) if serial_type == U32(6) { *(*I64)(unsafe.Pointer(pMem)) = *(*I64)(unsafe.Pointer(bp)) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) } else { libc.Xmemcpy(tls, pMem, bp, uint64(unsafe.Sizeof(U64(0)))) (*Mem)(unsafe.Pointer(pMem)).Fflags = func() uint16 { if *(*U64)(unsafe.Pointer(bp))&(uint64(0x7ff)<<52) == uint64(0x7ff)<<52 && *(*U64)(unsafe.Pointer(bp))&(uint64(1)<<52-uint64(1)) != uint64(0) { return uint16(MEM_Null) } return uint16(MEM_Real) }() } } func Xsqlite3VdbeSerialGet(tls *libc.TLS, buf uintptr, serial_type U32, pMem uintptr) { switch serial_type { case U32(10): { (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Null | MEM_Zero) (*Mem)(unsafe.Pointer(pMem)).Fn = 0 *(*int32)(unsafe.Pointer(pMem)) = 0 return } case U32(11): fallthrough case U32(0): { (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Null) return } case U32(1): { *(*I64)(unsafe.Pointer(pMem)) = I64(I8(*(*uint8)(unsafe.Pointer(buf)))) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) return } case U32(2): { *(*I64)(unsafe.Pointer(pMem)) = I64(256*int32(I8(*(*uint8)(unsafe.Pointer(buf)))) | int32(*(*uint8)(unsafe.Pointer(buf + 1)))) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) return } case U32(3): { *(*I64)(unsafe.Pointer(pMem)) = I64(65536*int32(I8(*(*uint8)(unsafe.Pointer(buf)))) | int32(*(*uint8)(unsafe.Pointer(buf + 1)))<<8 | int32(*(*uint8)(unsafe.Pointer(buf + 2)))) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) return } case U32(4): { *(*I64)(unsafe.Pointer(pMem)) = I64(16777216*int32(I8(*(*uint8)(unsafe.Pointer(buf)))) | int32(*(*uint8)(unsafe.Pointer(buf + 1)))<<16 | int32(*(*uint8)(unsafe.Pointer(buf + 2)))<<8 | int32(*(*uint8)(unsafe.Pointer(buf + 3)))) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) return } case U32(5): { *(*I64)(unsafe.Pointer(pMem)) = I64(U32(*(*uint8)(unsafe.Pointer(buf + uintptr(2))))<<24|U32(int32(*(*uint8)(unsafe.Pointer(buf + uintptr(2) + 1)))<<16)|U32(int32(*(*uint8)(unsafe.Pointer(buf + uintptr(2) + 2)))<<8)|U32(*(*uint8)(unsafe.Pointer(buf + uintptr(2) + 3)))) + int64(1)<<32*I64(256*int32(I8(*(*uint8)(unsafe.Pointer(buf))))|int32(*(*uint8)(unsafe.Pointer(buf + 1)))) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) return } case U32(6): fallthrough case U32(7): { serialGet(tls, buf, serial_type, pMem) return } case U32(8): fallthrough case U32(9): { *(*I64)(unsafe.Pointer(pMem)) = I64(serial_type - U32(8)) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Int) return } default: { (*Mem)(unsafe.Pointer(pMem)).Fz = buf (*Mem)(unsafe.Pointer(pMem)).Fn = int32((serial_type - U32(12)) / U32(2)) (*Mem)(unsafe.Pointer(pMem)).Fflags = aFlag[serial_type&U32(1)] return } } return } var aFlag = [2]U16{U16(MEM_Blob | MEM_Ephem), U16(MEM_Str | MEM_Ephem)} // This routine is used to allocate sufficient space for an UnpackedRecord // structure large enough to be used with sqlite3VdbeRecordUnpack() if // the first argument is a pointer to KeyInfo structure pKeyInfo. // // The space is either allocated using sqlite3DbMallocRaw() or from within // the unaligned buffer passed via the second and third arguments (presumably // stack space). If the former, then *ppFree is set to a pointer that should // be eventually freed by the caller using sqlite3DbFree(). Or, if the // allocation comes from the pSpace/szSpace buffer, *ppFree is set to NULL // before returning. // // If an OOM error occurs, NULL is returned. func Xsqlite3VdbeAllocUnpackedRecord(tls *libc.TLS, pKeyInfo uintptr) uintptr { var p uintptr var nByte int32 nByte = int32(uint64(unsafe.Sizeof(UnpackedRecord{})) + uint64(unsafe.Sizeof(Mem{}))*uint64(int32((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnKeyField)+1)) p = Xsqlite3DbMallocRaw(tls, (*KeyInfo)(unsafe.Pointer(pKeyInfo)).Fdb, uint64(nByte)) if !(p != 0) { return uintptr(0) } (*UnpackedRecord)(unsafe.Pointer(p)).FaMem = p + 40 (*UnpackedRecord)(unsafe.Pointer(p)).FpKeyInfo = pKeyInfo (*UnpackedRecord)(unsafe.Pointer(p)).FnField = U16(int32((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnKeyField) + 1) return p } // Given the nKey-byte encoding of a record in pKey[], populate the // UnpackedRecord structure indicated by the fourth argument with the // contents of the decoded record. func Xsqlite3VdbeRecordUnpack(tls *libc.TLS, pKeyInfo uintptr, nKey int32, pKey uintptr, p uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var aKey uintptr = pKey var d U32 var idx U32 var u U16 var pMem uintptr = (*UnpackedRecord)(unsafe.Pointer(p)).FaMem (*UnpackedRecord)(unsafe.Pointer(p)).Fdefault_rc = int8(0) idx = U32(func() uint8 { if int32(*(*uint8)(unsafe.Pointer(aKey))) < int32(U8(0x80)) { return uint8(func() int32 { *(*U32)(unsafe.Pointer(bp)) = U32(*(*uint8)(unsafe.Pointer(aKey))); return 1 }()) } return Xsqlite3GetVarint32(tls, aKey, bp) }()) d = *(*U32)(unsafe.Pointer(bp)) u = U16(0) for idx < *(*U32)(unsafe.Pointer(bp)) && d <= U32(nKey) { idx = idx + U32(func() uint8 { if int32(*(*uint8)(unsafe.Pointer(aKey + uintptr(idx)))) < int32(U8(0x80)) { return uint8(func() int32 { *(*U32)(unsafe.Pointer(bp + 4)) = U32(*(*uint8)(unsafe.Pointer(aKey + uintptr(idx)))) return 1 }()) } return Xsqlite3GetVarint32(tls, aKey+uintptr(idx), bp+4) }()) (*Mem)(unsafe.Pointer(pMem)).Fenc = (*KeyInfo)(unsafe.Pointer(pKeyInfo)).Fenc (*Mem)(unsafe.Pointer(pMem)).Fdb = (*KeyInfo)(unsafe.Pointer(pKeyInfo)).Fdb (*Mem)(unsafe.Pointer(pMem)).FszMalloc = 0 (*Mem)(unsafe.Pointer(pMem)).Fz = uintptr(0) Xsqlite3VdbeSerialGet(tls, aKey+uintptr(d), *(*U32)(unsafe.Pointer(bp + 4)), pMem) d = d + Xsqlite3VdbeSerialTypeLen(tls, *(*U32)(unsafe.Pointer(bp + 4))) pMem += 56 if int32(libc.PreIncUint16(&u, 1)) >= int32((*UnpackedRecord)(unsafe.Pointer(p)).FnField) { break } } if d > U32(nKey) && u != 0 { Xsqlite3VdbeMemSetNull(tls, pMem-uintptr(1)*56) } (*UnpackedRecord)(unsafe.Pointer(p)).FnField = u } func vdbeCompareMemString(tls *libc.TLS, pMem1 uintptr, pMem2 uintptr, pColl uintptr, prcErr uintptr) int32 { bp := tls.Alloc(112) defer tls.Free(112) if int32((*Mem)(unsafe.Pointer(pMem1)).Fenc) == int32((*CollSeq)(unsafe.Pointer(pColl)).Fenc) { return (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*CollSeq)(unsafe.Pointer(pColl)).FxCmp})).f(tls, (*CollSeq)(unsafe.Pointer(pColl)).FpUser, (*Mem)(unsafe.Pointer(pMem1)).Fn, (*Mem)(unsafe.Pointer(pMem1)).Fz, (*Mem)(unsafe.Pointer(pMem2)).Fn, (*Mem)(unsafe.Pointer(pMem2)).Fz) } else { var rc int32 var v1 uintptr var v2 uintptr Xsqlite3VdbeMemInit(tls, bp, (*Mem)(unsafe.Pointer(pMem1)).Fdb, uint16(MEM_Null)) Xsqlite3VdbeMemInit(tls, bp+56, (*Mem)(unsafe.Pointer(pMem1)).Fdb, uint16(MEM_Null)) Xsqlite3VdbeMemShallowCopy(tls, bp, pMem1, MEM_Ephem) Xsqlite3VdbeMemShallowCopy(tls, bp+56, pMem2, MEM_Ephem) v1 = Xsqlite3ValueText(tls, bp, (*CollSeq)(unsafe.Pointer(pColl)).Fenc) v2 = Xsqlite3ValueText(tls, bp+56, (*CollSeq)(unsafe.Pointer(pColl)).Fenc) if v1 == uintptr(0) || v2 == uintptr(0) { if prcErr != 0 { *(*U8)(unsafe.Pointer(prcErr)) = U8(SQLITE_NOMEM) } rc = 0 } else { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*CollSeq)(unsafe.Pointer(pColl)).FxCmp})).f(tls, (*CollSeq)(unsafe.Pointer(pColl)).FpUser, (*Mem)(unsafe.Pointer(bp)).Fn, v1, (*Mem)(unsafe.Pointer(bp+56)).Fn, v2) } Xsqlite3VdbeMemReleaseMalloc(tls, bp) Xsqlite3VdbeMemReleaseMalloc(tls, bp+56) return rc } return int32(0) } func isAllZero(tls *libc.TLS, z uintptr, n int32) int32 { var i int32 for i = 0; i < n; i++ { if *(*int8)(unsafe.Pointer(z + uintptr(i))) != 0 { return 0 } } return 1 } // Compare two blobs. Return negative, zero, or positive if the first // is less than, equal to, or greater than the second, respectively. // If one blob is a prefix of the other, then the shorter is the lessor. func Xsqlite3BlobCompare(tls *libc.TLS, pB1 uintptr, pB2 uintptr) int32 { var c int32 var n1 int32 = (*Mem)(unsafe.Pointer(pB1)).Fn var n2 int32 = (*Mem)(unsafe.Pointer(pB2)).Fn if (int32((*Mem)(unsafe.Pointer(pB1)).Fflags)|int32((*Mem)(unsafe.Pointer(pB2)).Fflags))&MEM_Zero != 0 { if int32((*Mem)(unsafe.Pointer(pB1)).Fflags)&int32((*Mem)(unsafe.Pointer(pB2)).Fflags)&MEM_Zero != 0 { return *(*int32)(unsafe.Pointer(pB1)) - *(*int32)(unsafe.Pointer(pB2)) } else if int32((*Mem)(unsafe.Pointer(pB1)).Fflags)&MEM_Zero != 0 { if !(isAllZero(tls, (*Mem)(unsafe.Pointer(pB2)).Fz, (*Mem)(unsafe.Pointer(pB2)).Fn) != 0) { return -1 } return *(*int32)(unsafe.Pointer(pB1)) - n2 } else { if !(isAllZero(tls, (*Mem)(unsafe.Pointer(pB1)).Fz, (*Mem)(unsafe.Pointer(pB1)).Fn) != 0) { return +1 } return n1 - *(*int32)(unsafe.Pointer(pB2)) } } c = libc.Xmemcmp(tls, (*Mem)(unsafe.Pointer(pB1)).Fz, (*Mem)(unsafe.Pointer(pB2)).Fz, func() uint64 { if n1 > n2 { return uint64(n2) } return uint64(n1) }()) if c != 0 { return c } return n1 - n2 } // Do a comparison between a 64-bit signed integer and a 64-bit floating-point // number. Return negative, zero, or positive if the first (i64) is less than, // equal to, or greater than the second (double). func Xsqlite3IntFloatCompare(tls *libc.TLS, i I64, r float64) int32 { if uint64(unsafe.Sizeof(float64(0))) > uint64(8) { var x float64 = float64(i) if x < r { return -1 } if x > r { return +1 } return 0 } else { var y I64 var s float64 if r < -9223372036854775808.0 { return +1 } if r >= 9223372036854775808.0 { return -1 } y = I64(r) if i < y { return -1 } if i > y { return +1 } s = float64(i) if s < r { return -1 } if s > r { return +1 } return 0 } return int32(0) } // Compare the values contained by the two memory cells, returning // negative, zero or positive if pMem1 is less than, equal to, or greater // than pMem2. Sorting order is NULL's first, followed by numbers (integers // and reals) sorted numerically, followed by text ordered by the collating // sequence pColl and finally blob's ordered by memcmp(). // // Two NULL values are considered equal by this function. func Xsqlite3MemCompare(tls *libc.TLS, pMem1 uintptr, pMem2 uintptr, pColl uintptr) int32 { var f1 int32 var f2 int32 var combined_flags int32 f1 = int32((*Mem)(unsafe.Pointer(pMem1)).Fflags) f2 = int32((*Mem)(unsafe.Pointer(pMem2)).Fflags) combined_flags = f1 | f2 if combined_flags&MEM_Null != 0 { return f2&MEM_Null - f1&MEM_Null } if combined_flags&(MEM_Int|MEM_Real|MEM_IntReal) != 0 { if f1&f2&(MEM_Int|MEM_IntReal) != 0 { if *(*I64)(unsafe.Pointer(pMem1)) < *(*I64)(unsafe.Pointer(pMem2)) { return -1 } if *(*I64)(unsafe.Pointer(pMem1)) > *(*I64)(unsafe.Pointer(pMem2)) { return +1 } return 0 } if f1&f2&MEM_Real != 0 { if *(*float64)(unsafe.Pointer(pMem1)) < *(*float64)(unsafe.Pointer(pMem2)) { return -1 } if *(*float64)(unsafe.Pointer(pMem1)) > *(*float64)(unsafe.Pointer(pMem2)) { return +1 } return 0 } if f1&(MEM_Int|MEM_IntReal) != 0 { if f2&MEM_Real != 0 { return Xsqlite3IntFloatCompare(tls, *(*I64)(unsafe.Pointer(pMem1)), *(*float64)(unsafe.Pointer(pMem2))) } else if f2&(MEM_Int|MEM_IntReal) != 0 { if *(*I64)(unsafe.Pointer(pMem1)) < *(*I64)(unsafe.Pointer(pMem2)) { return -1 } if *(*I64)(unsafe.Pointer(pMem1)) > *(*I64)(unsafe.Pointer(pMem2)) { return +1 } return 0 } else { return -1 } } if f1&MEM_Real != 0 { if f2&(MEM_Int|MEM_IntReal) != 0 { return -Xsqlite3IntFloatCompare(tls, *(*I64)(unsafe.Pointer(pMem2)), *(*float64)(unsafe.Pointer(pMem1))) } else { return -1 } } return +1 } if combined_flags&MEM_Str != 0 { if f1&MEM_Str == 0 { return 1 } if f2&MEM_Str == 0 { return -1 } if pColl != 0 { return vdbeCompareMemString(tls, pMem1, pMem2, pColl, uintptr(0)) } } return Xsqlite3BlobCompare(tls, pMem1, pMem2) } func vdbeRecordDecodeInt(tls *libc.TLS, serial_type U32, aKey uintptr) I64 { bp := tls.Alloc(16) defer tls.Free(16) switch serial_type { case U32(0): fallthrough case U32(1): return I64(I8(*(*U8)(unsafe.Pointer(aKey)))) case U32(2): return I64(256*int32(I8(*(*U8)(unsafe.Pointer(aKey)))) | int32(*(*U8)(unsafe.Pointer(aKey + 1)))) case U32(3): return I64(65536*int32(I8(*(*U8)(unsafe.Pointer(aKey)))) | int32(*(*U8)(unsafe.Pointer(aKey + 1)))<<8 | int32(*(*U8)(unsafe.Pointer(aKey + 2)))) case U32(4): { *(*U32)(unsafe.Pointer(bp)) = U32(*(*U8)(unsafe.Pointer(aKey)))<<24 | U32(int32(*(*U8)(unsafe.Pointer(aKey + 1)))<<16) | U32(int32(*(*U8)(unsafe.Pointer(aKey + 2)))<<8) | U32(*(*U8)(unsafe.Pointer(aKey + 3))) return I64(*(*int32)(unsafe.Pointer(bp))) } case U32(5): { return I64(U32(*(*U8)(unsafe.Pointer(aKey + uintptr(2))))<<24|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(2) + 1)))<<16)|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(2) + 2)))<<8)|U32(*(*U8)(unsafe.Pointer(aKey + uintptr(2) + 3)))) + int64(1)<<32*I64(256*int32(I8(*(*U8)(unsafe.Pointer(aKey))))|int32(*(*U8)(unsafe.Pointer(aKey + 1)))) } case U32(6): { *(*U64)(unsafe.Pointer(bp + 8)) = U64(U32(*(*U8)(unsafe.Pointer(aKey)))<<24 | U32(int32(*(*U8)(unsafe.Pointer(aKey + 1)))<<16) | U32(int32(*(*U8)(unsafe.Pointer(aKey + 2)))<<8) | U32(*(*U8)(unsafe.Pointer(aKey + 3)))) *(*U64)(unsafe.Pointer(bp + 8)) = *(*U64)(unsafe.Pointer(bp + 8))<<32 | U64(U32(*(*U8)(unsafe.Pointer(aKey + uintptr(4))))<<24|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(4) + 1)))<<16)|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(4) + 2)))<<8)|U32(*(*U8)(unsafe.Pointer(aKey + uintptr(4) + 3)))) return *(*I64)(unsafe.Pointer(bp + 8)) } } return I64(serial_type - U32(8)) } // This function compares the two table rows or index records // specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero // or positive integer if key1 is less than, equal to or // greater than key2. The {nKey1, pKey1} key must be a blob // created by the OP_MakeRecord opcode of the VDBE. The pPKey2 // key must be a parsed key such as obtained from // sqlite3VdbeParseRecord. // // If argument bSkip is non-zero, it is assumed that the caller has already // determined that the first fields of the keys are equal. // // Key1 and Key2 do not have to contain the same number of fields. If all // fields that appear in both keys are equal, then pPKey2->default_rc is // returned. // // If database corruption is discovered, set pPKey2->errCode to // SQLITE_CORRUPT and return 0. If an OOM error is encountered, // pPKey2->errCode is set to SQLITE_NOMEM and, if it is not NULL, the // malloc-failed flag set on database handle (pPKey2->pKeyInfo->db). func Xsqlite3VdbeRecordCompareWithSkip(tls *libc.TLS, nKey1 int32, pKey1 uintptr, pPKey2 uintptr, bSkip int32) int32 { bp := tls.Alloc(68) defer tls.Free(68) var d1 U32 var i int32 var idx1 U32 var rc int32 = 0 var pRhs uintptr = (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FaMem var pKeyInfo uintptr var aKey1 uintptr = pKey1 if bSkip != 0 { *(*U32)(unsafe.Pointer(bp)) = U32(*(*uint8)(unsafe.Pointer(aKey1 + 1))) if *(*U32)(unsafe.Pointer(bp)) < U32(0x80) { idx1 = U32(2) } else { idx1 = U32(1 + int32(Xsqlite3GetVarint32(tls, aKey1+1, bp))) } *(*U32)(unsafe.Pointer(bp + 4)) = U32(*(*uint8)(unsafe.Pointer(aKey1))) d1 = *(*U32)(unsafe.Pointer(bp + 4)) + Xsqlite3VdbeSerialTypeLen(tls, *(*U32)(unsafe.Pointer(bp))) i = 1 pRhs += 56 } else { if libc.AssignPtrUint32(bp+4, U32(*(*uint8)(unsafe.Pointer(aKey1)))) < U32(0x80) { idx1 = U32(1) } else { idx1 = U32(Xsqlite3GetVarint32(tls, aKey1, bp+4)) } d1 = *(*U32)(unsafe.Pointer(bp + 4)) i = 0 } if d1 > uint32(nKey1) { (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FerrCode = U8(Xsqlite3CorruptError(tls, 86989)) return 0 } for 1 != 0 { if int32((*Mem)(unsafe.Pointer(pRhs)).Fflags)&(MEM_Int|MEM_IntReal) != 0 { *(*U32)(unsafe.Pointer(bp + 64)) = U32(*(*uint8)(unsafe.Pointer(aKey1 + uintptr(idx1)))) if *(*U32)(unsafe.Pointer(bp + 64)) >= U32(10) { if *(*U32)(unsafe.Pointer(bp + 64)) == U32(10) { rc = -1 } else { rc = +1 } } else if *(*U32)(unsafe.Pointer(bp + 64)) == U32(0) { rc = -1 } else if *(*U32)(unsafe.Pointer(bp + 64)) == U32(7) { Xsqlite3VdbeSerialGet(tls, aKey1+uintptr(d1), *(*U32)(unsafe.Pointer(bp + 64)), bp+8) rc = -Xsqlite3IntFloatCompare(tls, *(*I64)(unsafe.Pointer(pRhs)), *(*float64)(unsafe.Pointer(bp + 8))) } else { var lhs I64 = vdbeRecordDecodeInt(tls, *(*U32)(unsafe.Pointer(bp + 64)), aKey1+uintptr(d1)) var rhs I64 = *(*I64)(unsafe.Pointer(pRhs)) if lhs < rhs { rc = -1 } else if lhs > rhs { rc = +1 } } } else if int32((*Mem)(unsafe.Pointer(pRhs)).Fflags)&MEM_Real != 0 { *(*U32)(unsafe.Pointer(bp + 64)) = U32(*(*uint8)(unsafe.Pointer(aKey1 + uintptr(idx1)))) if *(*U32)(unsafe.Pointer(bp + 64)) >= U32(10) { if *(*U32)(unsafe.Pointer(bp + 64)) == U32(10) { rc = -1 } else { rc = +1 } } else if *(*U32)(unsafe.Pointer(bp + 64)) == U32(0) { rc = -1 } else { Xsqlite3VdbeSerialGet(tls, aKey1+uintptr(d1), *(*U32)(unsafe.Pointer(bp + 64)), bp+8) if *(*U32)(unsafe.Pointer(bp + 64)) == U32(7) { if *(*float64)(unsafe.Pointer(bp + 8)) < *(*float64)(unsafe.Pointer(pRhs)) { rc = -1 } else if *(*float64)(unsafe.Pointer(bp + 8)) > *(*float64)(unsafe.Pointer(pRhs)) { rc = +1 } } else { rc = Xsqlite3IntFloatCompare(tls, *(*I64)(unsafe.Pointer(bp + 8)), *(*float64)(unsafe.Pointer(pRhs))) } } } else if int32((*Mem)(unsafe.Pointer(pRhs)).Fflags)&MEM_Str != 0 { *(*U32)(unsafe.Pointer(bp + 64)) = U32(*(*uint8)(unsafe.Pointer(aKey1 + uintptr(idx1)))) if *(*U32)(unsafe.Pointer(bp + 64)) >= U32(0x80) { Xsqlite3GetVarint32(tls, aKey1+uintptr(idx1), bp+64) } if *(*U32)(unsafe.Pointer(bp + 64)) < U32(12) { rc = -1 } else if !(*(*U32)(unsafe.Pointer(bp + 64))&U32(0x01) != 0) { rc = +1 } else { (*Mem)(unsafe.Pointer(bp + 8)).Fn = int32((*(*U32)(unsafe.Pointer(bp + 64)) - U32(12)) / U32(2)) if d1+U32((*Mem)(unsafe.Pointer(bp+8)).Fn) > uint32(nKey1) || int32((*KeyInfo)(unsafe.Pointer(libc.AssignUintptr(&pKeyInfo, (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FpKeyInfo))).FnAllField) <= i { (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FerrCode = U8(Xsqlite3CorruptError(tls, 87066)) return 0 } else if *(*uintptr)(unsafe.Pointer(pKeyInfo + 32 + uintptr(i)*8)) != 0 { (*Mem)(unsafe.Pointer(bp + 8)).Fenc = (*KeyInfo)(unsafe.Pointer(pKeyInfo)).Fenc (*Mem)(unsafe.Pointer(bp + 8)).Fdb = (*KeyInfo)(unsafe.Pointer(pKeyInfo)).Fdb (*Mem)(unsafe.Pointer(bp + 8)).Fflags = U16(MEM_Str) (*Mem)(unsafe.Pointer(bp + 8)).Fz = aKey1 + uintptr(d1) rc = vdbeCompareMemString(tls, bp+8, pRhs, *(*uintptr)(unsafe.Pointer(pKeyInfo + 32 + uintptr(i)*8)), pPKey2+31) } else { var nCmp int32 = func() int32 { if (*Mem)(unsafe.Pointer(bp+8)).Fn < (*Mem)(unsafe.Pointer(pRhs)).Fn { return (*Mem)(unsafe.Pointer(bp + 8)).Fn } return (*Mem)(unsafe.Pointer(pRhs)).Fn }() rc = libc.Xmemcmp(tls, aKey1+uintptr(d1), (*Mem)(unsafe.Pointer(pRhs)).Fz, uint64(nCmp)) if rc == 0 { rc = (*Mem)(unsafe.Pointer(bp+8)).Fn - (*Mem)(unsafe.Pointer(pRhs)).Fn } } } } else if int32((*Mem)(unsafe.Pointer(pRhs)).Fflags)&MEM_Blob != 0 { *(*U32)(unsafe.Pointer(bp + 64)) = U32(*(*uint8)(unsafe.Pointer(aKey1 + uintptr(idx1)))) if *(*U32)(unsafe.Pointer(bp + 64)) >= U32(0x80) { Xsqlite3GetVarint32(tls, aKey1+uintptr(idx1), bp+64) } if *(*U32)(unsafe.Pointer(bp + 64)) < U32(12) || *(*U32)(unsafe.Pointer(bp + 64))&U32(0x01) != 0 { rc = -1 } else { var nStr int32 = int32((*(*U32)(unsafe.Pointer(bp + 64)) - U32(12)) / U32(2)) if d1+U32(nStr) > uint32(nKey1) { (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FerrCode = U8(Xsqlite3CorruptError(tls, 87096)) return 0 } else if int32((*Mem)(unsafe.Pointer(pRhs)).Fflags)&MEM_Zero != 0 { if !(isAllZero(tls, aKey1+uintptr(d1), nStr) != 0) { rc = 1 } else { rc = nStr - *(*int32)(unsafe.Pointer(pRhs)) } } else { var nCmp int32 = func() int32 { if nStr < (*Mem)(unsafe.Pointer(pRhs)).Fn { return nStr } return (*Mem)(unsafe.Pointer(pRhs)).Fn }() rc = libc.Xmemcmp(tls, aKey1+uintptr(d1), (*Mem)(unsafe.Pointer(pRhs)).Fz, uint64(nCmp)) if rc == 0 { rc = nStr - (*Mem)(unsafe.Pointer(pRhs)).Fn } } } } else { *(*U32)(unsafe.Pointer(bp + 64)) = U32(*(*uint8)(unsafe.Pointer(aKey1 + uintptr(idx1)))) rc = libc.Bool32(*(*U32)(unsafe.Pointer(bp + 64)) != U32(0) && *(*U32)(unsafe.Pointer(bp + 64)) != U32(10)) } if rc != 0 { var sortFlags int32 = int32(*(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(pPKey2)).FpKeyInfo)).FaSortFlags + uintptr(i)))) if sortFlags != 0 { if sortFlags&KEYINFO_ORDER_BIGNULL == 0 || sortFlags&KEYINFO_ORDER_DESC != libc.Bool32(*(*U32)(unsafe.Pointer(bp + 64)) == U32(0) || int32((*Mem)(unsafe.Pointer(pRhs)).Fflags)&MEM_Null != 0) { rc = -rc } } return rc } i++ if i == int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).FnField) { break } pRhs += 56 d1 = d1 + Xsqlite3VdbeSerialTypeLen(tls, *(*U32)(unsafe.Pointer(bp + 64))) if d1 > uint32(nKey1) { break } idx1 = idx1 + U32(Xsqlite3VarintLen(tls, uint64(*(*U32)(unsafe.Pointer(bp + 64))))) if idx1 >= *(*U32)(unsafe.Pointer(bp + 4)) { (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FerrCode = U8(Xsqlite3CorruptError(tls, 87140)) return 0 } } (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FeqSeen = U8(1) return int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fdefault_rc) } func Xsqlite3VdbeRecordCompare(tls *libc.TLS, nKey1 int32, pKey1 uintptr, pPKey2 uintptr) int32 { return Xsqlite3VdbeRecordCompareWithSkip(tls, nKey1, pKey1, pPKey2, 0) } func vdbeRecordCompareInt(tls *libc.TLS, nKey1 int32, pKey1 uintptr, pPKey2 uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var aKey uintptr = pKey1 + uintptr(int32(*(*U8)(unsafe.Pointer(pKey1)))&0x3F) var serial_type int32 = int32(*(*U8)(unsafe.Pointer(pKey1 + 1))) var res int32 var v I64 var lhs I64 switch serial_type { case 1: { lhs = I64(I8(*(*U8)(unsafe.Pointer(aKey)))) break } case 2: { lhs = I64(256*int32(I8(*(*U8)(unsafe.Pointer(aKey)))) | int32(*(*U8)(unsafe.Pointer(aKey + 1)))) break } case 3: { lhs = I64(65536*int32(I8(*(*U8)(unsafe.Pointer(aKey)))) | int32(*(*U8)(unsafe.Pointer(aKey + 1)))<<8 | int32(*(*U8)(unsafe.Pointer(aKey + 2)))) break } case 4: { *(*U32)(unsafe.Pointer(bp)) = U32(*(*U8)(unsafe.Pointer(aKey)))<<24 | U32(int32(*(*U8)(unsafe.Pointer(aKey + 1)))<<16) | U32(int32(*(*U8)(unsafe.Pointer(aKey + 2)))<<8) | U32(*(*U8)(unsafe.Pointer(aKey + 3))) lhs = I64(*(*int32)(unsafe.Pointer(bp))) break } case 5: { lhs = I64(U32(*(*U8)(unsafe.Pointer(aKey + uintptr(2))))<<24|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(2) + 1)))<<16)|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(2) + 2)))<<8)|U32(*(*U8)(unsafe.Pointer(aKey + uintptr(2) + 3)))) + int64(1)<<32*I64(256*int32(I8(*(*U8)(unsafe.Pointer(aKey))))|int32(*(*U8)(unsafe.Pointer(aKey + 1)))) break } case 6: { *(*U64)(unsafe.Pointer(bp + 8)) = U64(U32(*(*U8)(unsafe.Pointer(aKey)))<<24 | U32(int32(*(*U8)(unsafe.Pointer(aKey + 1)))<<16) | U32(int32(*(*U8)(unsafe.Pointer(aKey + 2)))<<8) | U32(*(*U8)(unsafe.Pointer(aKey + 3)))) *(*U64)(unsafe.Pointer(bp + 8)) = *(*U64)(unsafe.Pointer(bp + 8))<<32 | U64(U32(*(*U8)(unsafe.Pointer(aKey + uintptr(4))))<<24|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(4) + 1)))<<16)|U32(int32(*(*U8)(unsafe.Pointer(aKey + uintptr(4) + 2)))<<8)|U32(*(*U8)(unsafe.Pointer(aKey + uintptr(4) + 3)))) lhs = *(*I64)(unsafe.Pointer(bp + 8)) break } case 8: lhs = int64(0) break case 9: lhs = int64(1) break case 0: fallthrough case 7: return Xsqlite3VdbeRecordCompare(tls, nKey1, pKey1, pPKey2) default: return Xsqlite3VdbeRecordCompare(tls, nKey1, pKey1, pPKey2) } v = *(*I64)(unsafe.Pointer(pPKey2 + 16)) if v > lhs { res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr1) } else if v < lhs { res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr2) } else if int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).FnField) > 1 { res = Xsqlite3VdbeRecordCompareWithSkip(tls, nKey1, pKey1, pPKey2, 1) } else { res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fdefault_rc) (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FeqSeen = U8(1) } return res } func vdbeRecordCompareString(tls *libc.TLS, nKey1 int32, pKey1 uintptr, pPKey2 uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var aKey1 uintptr var res int32 var nCmp int32 var nStr int32 var szHdr int32 aKey1 = pKey1 *(*int32)(unsafe.Pointer(bp)) = int32(int8(*(*U8)(unsafe.Pointer(aKey1 + 1)))) vrcs_restart: if !(*(*int32)(unsafe.Pointer(bp)) < 12) { goto __1 } if !(*(*int32)(unsafe.Pointer(bp)) < 0) { goto __3 } Xsqlite3GetVarint32(tls, aKey1+1, bp) if !(*(*int32)(unsafe.Pointer(bp)) >= 12) { goto __4 } goto vrcs_restart __4: ; __3: ; res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr1) goto __2 __1: if !!(*(*int32)(unsafe.Pointer(bp))&0x01 != 0) { goto __5 } res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr2) goto __6 __5: szHdr = int32(*(*U8)(unsafe.Pointer(aKey1))) nStr = (*(*int32)(unsafe.Pointer(bp)) - 12) / 2 if !(szHdr+nStr > nKey1) { goto __7 } (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FerrCode = U8(Xsqlite3CorruptError(tls, 87303)) return 0 __7: ; nCmp = func() int32 { if (*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fn < nStr { return (*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fn } return nStr }() res = libc.Xmemcmp(tls, aKey1+uintptr(szHdr), *(*uintptr)(unsafe.Pointer(pPKey2 + 16)), uint64(nCmp)) if !(res > 0) { goto __8 } res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr2) goto __9 __8: if !(res < 0) { goto __10 } res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr1) goto __11 __10: res = nStr - (*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fn if !(res == 0) { goto __12 } if !(int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).FnField) > 1) { goto __14 } res = Xsqlite3VdbeRecordCompareWithSkip(tls, nKey1, pKey1, pPKey2, 1) goto __15 __14: res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fdefault_rc) (*UnpackedRecord)(unsafe.Pointer(pPKey2)).FeqSeen = U8(1) __15: ; goto __13 __12: if !(res > 0) { goto __16 } res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr2) goto __17 __16: res = int32((*UnpackedRecord)(unsafe.Pointer(pPKey2)).Fr1) __17: ; __13: ; __11: ; __9: ; __6: ; __2: ; return res } // Return a pointer to an sqlite3VdbeRecordCompare() compatible function // suitable for comparing serialized records to the unpacked record passed // as the only argument. func Xsqlite3VdbeFindCompare(tls *libc.TLS, p uintptr) RecordCompare { if int32((*KeyInfo)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FpKeyInfo)).FnAllField) <= 13 { var flags int32 = int32((*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FaMem)).Fflags) if *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FpKeyInfo)).FaSortFlags)) != 0 { if int32(*(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FpKeyInfo)).FaSortFlags)))&KEYINFO_ORDER_BIGNULL != 0 { return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 }{Xsqlite3VdbeRecordCompare})) } (*UnpackedRecord)(unsafe.Pointer(p)).Fr1 = int8(1) (*UnpackedRecord)(unsafe.Pointer(p)).Fr2 = int8(-1) } else { (*UnpackedRecord)(unsafe.Pointer(p)).Fr1 = int8(-1) (*UnpackedRecord)(unsafe.Pointer(p)).Fr2 = int8(1) } if flags&MEM_Int != 0 { *(*I64)(unsafe.Pointer(p + 16)) = *(*I64)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FaMem)) return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 }{vdbeRecordCompareInt})) } if flags&(MEM_Real|MEM_IntReal|MEM_Null|MEM_Blob) == 0 && *(*uintptr)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FpKeyInfo + 32)) == uintptr(0) { *(*uintptr)(unsafe.Pointer(p + 16)) = (*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FaMem)).Fz (*UnpackedRecord)(unsafe.Pointer(p)).Fn = (*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(p)).FaMem)).Fn return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 }{vdbeRecordCompareString})) } } return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, int32, uintptr, uintptr) int32 }{Xsqlite3VdbeRecordCompare})) } // pCur points at an index entry created using the OP_MakeRecord opcode. // Read the rowid (the last field in the record) and store it in *rowid. // Return SQLITE_OK if everything works, or an error code otherwise. // // pCur might be pointing to text obtained from a corrupt database file. // So the content cannot be trusted. Do appropriate checks on the content. func Xsqlite3VdbeIdxRowid(tls *libc.TLS, db uintptr, pCur uintptr, rowid uintptr) int32 { bp := tls.Alloc(120) defer tls.Free(120) var nCellKey I64 var rc int32 var lenRowid U32 nCellKey = int64(0) nCellKey = I64(Xsqlite3BtreePayloadSize(tls, pCur)) Xsqlite3VdbeMemInit(tls, bp, db, uint16(0)) rc = Xsqlite3VdbeMemFromBtreeZeroOffset(tls, pCur, U32(nCellKey), bp) if !(rc != 0) { goto __1 } return rc __1: ; *(*U32)(unsafe.Pointer(bp + 56)) = U32(*(*U8)(unsafe.Pointer((*Mem)(unsafe.Pointer(bp)).Fz))) if !(*(*U32)(unsafe.Pointer(bp + 56)) >= U32(0x80)) { goto __2 } Xsqlite3GetVarint32(tls, (*Mem)(unsafe.Pointer(bp)).Fz, bp+56) __2: ; if !(*(*U32)(unsafe.Pointer(bp + 56)) < U32(3) || *(*U32)(unsafe.Pointer(bp + 56)) > uint32((*Mem)(unsafe.Pointer(bp)).Fn)) { goto __3 } goto idx_rowid_corruption __3: ; *(*U32)(unsafe.Pointer(bp + 60)) = U32(*(*U8)(unsafe.Pointer((*Mem)(unsafe.Pointer(bp)).Fz + uintptr(*(*U32)(unsafe.Pointer(bp + 56))-U32(1))))) if !(*(*U32)(unsafe.Pointer(bp + 60)) >= U32(0x80)) { goto __4 } Xsqlite3GetVarint32(tls, (*Mem)(unsafe.Pointer(bp)).Fz+uintptr(*(*U32)(unsafe.Pointer(bp + 56))-U32(1)), bp+60) __4: ; if !(*(*U32)(unsafe.Pointer(bp + 60)) < U32(1) || *(*U32)(unsafe.Pointer(bp + 60)) > U32(9) || *(*U32)(unsafe.Pointer(bp + 60)) == U32(7)) { goto __5 } goto idx_rowid_corruption __5: ; lenRowid = U32(Xsqlite3SmallTypeSizes[*(*U32)(unsafe.Pointer(bp + 60))]) if !(U32((*Mem)(unsafe.Pointer(bp)).Fn) < *(*U32)(unsafe.Pointer(bp + 56))+lenRowid) { goto __6 } goto idx_rowid_corruption __6: ; Xsqlite3VdbeSerialGet(tls, (*Mem)(unsafe.Pointer(bp)).Fz+uintptr(U32((*Mem)(unsafe.Pointer(bp)).Fn)-lenRowid), *(*U32)(unsafe.Pointer(bp + 60)), bp+64) *(*I64)(unsafe.Pointer(rowid)) = *(*I64)(unsafe.Pointer(bp + 64)) Xsqlite3VdbeMemReleaseMalloc(tls, bp) return SQLITE_OK idx_rowid_corruption: ; Xsqlite3VdbeMemReleaseMalloc(tls, bp) return Xsqlite3CorruptError(tls, 87461) } // Compare the key of the index entry that cursor pC is pointing to against // the key string in pUnpacked. Write into *pRes a number // that is negative, zero, or positive if pC is less than, equal to, // or greater than pUnpacked. Return SQLITE_OK on success. // // pUnpacked is either created without a rowid or is truncated so that it // omits the rowid at the end. The rowid at the end of the index entry // is ignored as well. Hence, this routine only compares the prefixes // of the keys prior to the final rowid, not the entire key. func Xsqlite3VdbeIdxKeyCompare(tls *libc.TLS, db uintptr, pC uintptr, pUnpacked uintptr, res uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var nCellKey I64 = int64(0) var rc int32 var pCur uintptr pCur = *(*uintptr)(unsafe.Pointer(pC + 48)) nCellKey = I64(Xsqlite3BtreePayloadSize(tls, pCur)) if nCellKey <= int64(0) || nCellKey > int64(0x7fffffff) { *(*int32)(unsafe.Pointer(res)) = 0 return Xsqlite3CorruptError(tls, 87494) } Xsqlite3VdbeMemInit(tls, bp, db, uint16(0)) rc = Xsqlite3VdbeMemFromBtreeZeroOffset(tls, pCur, U32(nCellKey), bp) if rc != 0 { return rc } *(*int32)(unsafe.Pointer(res)) = Xsqlite3VdbeRecordCompareWithSkip(tls, (*Mem)(unsafe.Pointer(bp)).Fn, (*Mem)(unsafe.Pointer(bp)).Fz, pUnpacked, 0) Xsqlite3VdbeMemReleaseMalloc(tls, bp) return SQLITE_OK } // This routine sets the value to be returned by subsequent calls to // sqlite3_changes() on the database handle 'db'. func Xsqlite3VdbeSetChanges(tls *libc.TLS, db uintptr, nChange I64) { (*Sqlite3)(unsafe.Pointer(db)).FnChange = nChange *(*I64)(unsafe.Pointer(db + 128)) += nChange } // Set a flag in the vdbe to update the change counter when it is finalised // or reset. func Xsqlite3VdbeCountChanges(tls *libc.TLS, v uintptr) { libc.SetBitFieldPtr8Uint32(v+200, Bft(1), 4, 0x10) } // Mark every prepared statement associated with a database connection // as expired. // // An expired statement means that recompilation of the statement is // recommend. Statements expire when things happen that make their // programs obsolete. Removing user-defined functions or collating // sequences, or changing an authorization function are the types of // things that make prepared statements obsolete. // // If iCode is 1, then expiration is advisory. The statement should // be reprepared before being restarted, but if it is already running // it is allowed to run to completion. // // Internally, this function just sets the Vdbe.expired flag on all // prepared statements. The flag is set to 1 for an immediate expiration // and set to 2 for an advisory expiration. func Xsqlite3ExpirePreparedStatements(tls *libc.TLS, db uintptr, iCode int32) { var p uintptr for p = (*Sqlite3)(unsafe.Pointer(db)).FpVdbe; p != 0; p = (*Vdbe)(unsafe.Pointer(p)).FpVNext { libc.SetBitFieldPtr8Uint32(p+200, Bft(iCode+1), 0, 0x3) } } // Return the database associated with the Vdbe. func Xsqlite3VdbeDb(tls *libc.TLS, v uintptr) uintptr { return (*Vdbe)(unsafe.Pointer(v)).Fdb } // Return the SQLITE_PREPARE flags for a Vdbe. func Xsqlite3VdbePrepareFlags(tls *libc.TLS, v uintptr) U8 { return (*Vdbe)(unsafe.Pointer(v)).FprepFlags } // Return a pointer to an sqlite3_value structure containing the value bound // parameter iVar of VM v. Except, if the value is an SQL NULL, return // 0 instead. Unless it is NULL, apply affinity aff (one of the SQLITE_AFF_* // constants) to the value before returning it. // // The returned value must be freed by the caller using sqlite3ValueFree(). func Xsqlite3VdbeGetBoundValue(tls *libc.TLS, v uintptr, iVar int32, aff U8) uintptr { if v != 0 { var pMem uintptr = (*Vdbe)(unsafe.Pointer(v)).FaVar + uintptr(iVar-1)*56 if 0 == int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Null { var pRet uintptr = Xsqlite3ValueNew(tls, (*Vdbe)(unsafe.Pointer(v)).Fdb) if pRet != 0 { Xsqlite3VdbeMemCopy(tls, pRet, pMem) Xsqlite3ValueApplyAffinity(tls, pRet, aff, uint8(SQLITE_UTF8)) } return pRet } } return uintptr(0) } // Configure SQL variable iVar so that binding a new value to it signals // to sqlite3_reoptimize() that re-preparing the statement may result // in a better query plan. func Xsqlite3VdbeSetVarmask(tls *libc.TLS, v uintptr, iVar int32) { if iVar >= 32 { *(*U32)(unsafe.Pointer(v + 284)) |= 0x80000000 } else { *(*U32)(unsafe.Pointer(v + 284)) |= U32(1) << (iVar - 1) } } // Cause a function to throw an error if it was call from OP_PureFunc // rather than OP_Function. // // OP_PureFunc means that the function must be deterministic, and should // throw an error if it is given inputs that would make it non-deterministic. // This routine is invoked by date/time functions that use non-deterministic // features such as 'now'. func Xsqlite3NotPureFunc(tls *libc.TLS, pCtx uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pOp uintptr if (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpVdbe == uintptr(0) { return 1 } pOp = (*Vdbe)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpVdbe)).FaOp + uintptr((*Sqlite3_context)(unsafe.Pointer(pCtx)).FiOp)*24 if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_PureFunc { var zContext uintptr var zMsg uintptr if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fp5)&NC_IsCheck != 0 { zContext = ts + 6518 } else if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fp5)&NC_GenCol != 0 { zContext = ts + 6537 } else { zContext = ts + 6556 } zMsg = Xsqlite3_mprintf(tls, ts+6565, libc.VaList(bp, (*FuncDef)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpFunc)).FzName, zContext)) Xsqlite3_result_error(tls, pCtx, zMsg, -1) Xsqlite3_free(tls, zMsg) return 0 } return 1 } // Transfer error message text from an sqlite3_vtab.zErrMsg (text stored // in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored // in memory obtained from sqlite3DbMalloc). func Xsqlite3VtabImportErrmsg(tls *libc.TLS, p uintptr, pVtab uintptr) { if (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FzErrMsg != 0 { var db uintptr = (*Vdbe)(unsafe.Pointer(p)).Fdb Xsqlite3DbFree(tls, db, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg) (*Vdbe)(unsafe.Pointer(p)).FzErrMsg = Xsqlite3DbStrDup(tls, db, (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FzErrMsg) Xsqlite3_free(tls, (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FzErrMsg) (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FzErrMsg = uintptr(0) } } func vdbeFreeUnpacked(tls *libc.TLS, db uintptr, nField int32, p uintptr) { if p != 0 { var i int32 for i = 0; i < nField; i++ { var pMem uintptr = (*UnpackedRecord)(unsafe.Pointer(p)).FaMem + uintptr(i)*56 if (*Mem)(unsafe.Pointer(pMem)).FzMalloc != 0 { Xsqlite3VdbeMemReleaseMalloc(tls, pMem) } } Xsqlite3DbNNFreeNN(tls, db, p) } } // Invoke the pre-update hook. If this is an UPDATE or DELETE pre-update call, // then cursor passed as the second argument should point to the row about // to be update or deleted. If the application calls sqlite3_preupdate_old(), // the required value will be read from the row the cursor points to. func Xsqlite3VdbePreUpdateHook(tls *libc.TLS, v uintptr, pCsr uintptr, op int32, zDb uintptr, pTab uintptr, iKey1 I64, iReg int32, iBlobWrite int32) { bp := tls.Alloc(136) defer tls.Free(136) var db uintptr = (*Vdbe)(unsafe.Pointer(v)).Fdb var iKey2 I64 var zTbl uintptr = (*Table)(unsafe.Pointer(pTab)).FzName libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(PreUpdate{}))) if libc.Bool32((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) == 0 { iKey1 = libc.AssignInt64(&iKey2, int64(0)) (*PreUpdate)(unsafe.Pointer(bp)).FpPk = Xsqlite3PrimaryKeyIndex(tls, pTab) } else { if op == SQLITE_UPDATE { iKey2 = *(*I64)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).FaMem + uintptr(iReg)*56)) } else { iKey2 = iKey1 } } (*PreUpdate)(unsafe.Pointer(bp)).Fv = v (*PreUpdate)(unsafe.Pointer(bp)).FpCsr = pCsr (*PreUpdate)(unsafe.Pointer(bp)).Fop = op (*PreUpdate)(unsafe.Pointer(bp)).FiNewReg = iReg (*PreUpdate)(unsafe.Pointer(bp)).Fkeyinfo.Fdb = db (*PreUpdate)(unsafe.Pointer(bp)).Fkeyinfo.Fenc = (*Sqlite3)(unsafe.Pointer(db)).Fenc (*PreUpdate)(unsafe.Pointer(bp)).Fkeyinfo.FnKeyField = U16((*Table)(unsafe.Pointer(pTab)).FnCol) (*PreUpdate)(unsafe.Pointer(bp)).Fkeyinfo.FaSortFlags = uintptr(unsafe.Pointer(&fakeSortOrder)) (*PreUpdate)(unsafe.Pointer(bp)).FiKey1 = iKey1 (*PreUpdate)(unsafe.Pointer(bp)).FiKey2 = iKey2 (*PreUpdate)(unsafe.Pointer(bp)).FpTab = pTab (*PreUpdate)(unsafe.Pointer(bp)).FiBlobWrite = iBlobWrite (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdate = bp (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, Sqlite3_int64, Sqlite3_int64) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2) (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdate = uintptr(0) Xsqlite3DbFree(tls, db, (*PreUpdate)(unsafe.Pointer(bp)).FaRecord) vdbeFreeUnpacked(tls, db, int32((*PreUpdate)(unsafe.Pointer(bp)).Fkeyinfo.FnKeyField)+1, (*PreUpdate)(unsafe.Pointer(bp)).FpUnpacked) vdbeFreeUnpacked(tls, db, int32((*PreUpdate)(unsafe.Pointer(bp)).Fkeyinfo.FnKeyField)+1, (*PreUpdate)(unsafe.Pointer(bp)).FpNewUnpacked) if (*PreUpdate)(unsafe.Pointer(bp)).FaNew != 0 { var i int32 for i = 0; i < int32((*VdbeCursor)(unsafe.Pointer(pCsr)).FnField); i++ { Xsqlite3VdbeMemRelease(tls, (*PreUpdate)(unsafe.Pointer(bp)).FaNew+uintptr(i)*56) } Xsqlite3DbNNFreeNN(tls, db, (*PreUpdate)(unsafe.Pointer(bp)).FaNew) } } var fakeSortOrder U8 = U8(0) // Return TRUE (non-zero) of the statement supplied as an argument needs // to be recompiled. A statement needs to be recompiled whenever the // execution environment changes in a way that would alter the program // that sqlite3_prepare() generates. For example, if new functions or // collating sequences are registered or if an authorizer function is // added or changed. func Xsqlite3_expired(tls *libc.TLS, pStmt uintptr) int32 { var p uintptr = pStmt return libc.Bool32(p == uintptr(0) || Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x3>>0)) != 0) } func vdbeSafety(tls *libc.TLS, p uintptr) int32 { if (*Vdbe)(unsafe.Pointer(p)).Fdb == uintptr(0) { Xsqlite3_log(tls, SQLITE_MISUSE, ts+6601, 0) return 1 } else { return 0 } return int32(0) } func vdbeSafetyNotNull(tls *libc.TLS, p uintptr) int32 { if p == uintptr(0) { Xsqlite3_log(tls, SQLITE_MISUSE, ts+6646, 0) return 1 } else { return vdbeSafety(tls, p) } return int32(0) } func invokeProfileCallback(tls *libc.TLS, db uintptr, p uintptr) { bp := tls.Alloc(16) defer tls.Free(16) Xsqlite3OsCurrentTimeInt64(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, bp) *(*Sqlite3_int64)(unsafe.Pointer(bp + 8)) = (*(*Sqlite3_int64)(unsafe.Pointer(bp)) - (*Vdbe)(unsafe.Pointer(p)).FstartTime) * int64(1000000) if (*Sqlite3)(unsafe.Pointer(db)).FxProfile != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr, U64) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxProfile})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpProfileArg, (*Vdbe)(unsafe.Pointer(p)).FzSql, uint64(*(*Sqlite3_int64)(unsafe.Pointer(bp + 8)))) } if int32((*Sqlite3)(unsafe.Pointer(db)).FmTrace)&SQLITE_TRACE_PROFILE != 0 { (*struct { f func(*libc.TLS, U32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(db + 248))})).f(tls, uint32(SQLITE_TRACE_PROFILE), (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg, p, bp+8) } (*Vdbe)(unsafe.Pointer(p)).FstartTime = int64(0) } // The following routine destroys a virtual machine that is created by // the sqlite3_compile() routine. The integer returned is an SQLITE_ // success/failure code that describes the result of executing the virtual // machine. // // This routine sets the error code and string returned by // sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). func Xsqlite3_finalize(tls *libc.TLS, pStmt uintptr) int32 { var rc int32 if pStmt == uintptr(0) { rc = SQLITE_OK } else { var v uintptr = pStmt var db uintptr = (*Vdbe)(unsafe.Pointer(v)).Fdb if vdbeSafety(tls, v) != 0 { return Xsqlite3MisuseError(tls, 87858) } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if (*Vdbe)(unsafe.Pointer(v)).FstartTime > int64(0) { invokeProfileCallback(tls, db, v) } rc = Xsqlite3VdbeReset(tls, v) Xsqlite3VdbeDelete(tls, v) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3LeaveMutexAndCloseZombie(tls, db) } return rc } // Terminate the current execution of an SQL statement and reset it // back to its starting state so that it can be reused. A success code from // the prior execution is returned. // // This routine sets the error code and string returned by // sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). func Xsqlite3_reset(tls *libc.TLS, pStmt uintptr) int32 { var rc int32 if pStmt == uintptr(0) { rc = SQLITE_OK } else { var v uintptr = pStmt var db uintptr = (*Vdbe)(unsafe.Pointer(v)).Fdb Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if (*Vdbe)(unsafe.Pointer(v)).FstartTime > int64(0) { invokeProfileCallback(tls, db, v) } rc = Xsqlite3VdbeReset(tls, v) Xsqlite3VdbeRewind(tls, v) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) } return rc } // Set all the parameters in the compiled SQL statement to NULL. func Xsqlite3_clear_bindings(tls *libc.TLS, pStmt uintptr) int32 { var i int32 var rc int32 = SQLITE_OK var p uintptr = pStmt var mutex uintptr = (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(pStmt)).Fdb)).Fmutex Xsqlite3_mutex_enter(tls, mutex) for i = 0; i < int32((*Vdbe)(unsafe.Pointer(p)).FnVar); i++ { Xsqlite3VdbeMemRelease(tls, (*Vdbe)(unsafe.Pointer(p)).FaVar+uintptr(i)*56) (*Mem)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaVar + uintptr(i)*56)).Fflags = U16(MEM_Null) } if (*Vdbe)(unsafe.Pointer(p)).Fexpmask != 0 { libc.SetBitFieldPtr8Uint32(p+200, Bft(1), 0, 0x3) } Xsqlite3_mutex_leave(tls, mutex) return rc } // *************************** sqlite3_value_ ******************************* // // The following routines extract information from a Mem or sqlite3_value // structure. func Xsqlite3_value_blob(tls *libc.TLS, pVal uintptr) uintptr { var p uintptr = pVal if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_Blob|MEM_Str) != 0 { if func() int32 { if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, p) } return 0 }() != SQLITE_OK { return uintptr(0) } *(*U16)(unsafe.Pointer(p + 20)) |= U16(MEM_Blob) if (*Mem)(unsafe.Pointer(p)).Fn != 0 { return (*Mem)(unsafe.Pointer(p)).Fz } return uintptr(0) } else { return Xsqlite3_value_text(tls, pVal) } return uintptr(0) } func Xsqlite3_value_bytes(tls *libc.TLS, pVal uintptr) int32 { return Xsqlite3ValueBytes(tls, pVal, uint8(SQLITE_UTF8)) } func Xsqlite3_value_bytes16(tls *libc.TLS, pVal uintptr) int32 { return Xsqlite3ValueBytes(tls, pVal, uint8(SQLITE_UTF16LE)) } func Xsqlite3_value_double(tls *libc.TLS, pVal uintptr) float64 { return Xsqlite3VdbeRealValue(tls, pVal) } func Xsqlite3_value_int(tls *libc.TLS, pVal uintptr) int32 { return int32(Xsqlite3VdbeIntValue(tls, pVal)) } func Xsqlite3_value_int64(tls *libc.TLS, pVal uintptr) Sqlite_int64 { return Xsqlite3VdbeIntValue(tls, pVal) } func Xsqlite3_value_subtype(tls *libc.TLS, pVal uintptr) uint32 { var pMem uintptr = pVal return func() uint32 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Subtype != 0 { return uint32((*Mem)(unsafe.Pointer(pMem)).FeSubtype) } return uint32(0) }() } func Xsqlite3_value_pointer(tls *libc.TLS, pVal uintptr, zPType uintptr) uintptr { var p uintptr = pVal if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_TypeMask|MEM_Term|MEM_Subtype) == MEM_Null|MEM_Term|MEM_Subtype && zPType != uintptr(0) && int32((*Mem)(unsafe.Pointer(p)).FeSubtype) == 'p' && libc.Xstrcmp(tls, *(*uintptr)(unsafe.Pointer(p)), zPType) == 0 { return (*Mem)(unsafe.Pointer(p)).Fz } else { return uintptr(0) } return uintptr(0) } func Xsqlite3_value_text(tls *libc.TLS, pVal uintptr) uintptr { return Xsqlite3ValueText(tls, pVal, uint8(SQLITE_UTF8)) } func Xsqlite3_value_text16(tls *libc.TLS, pVal uintptr) uintptr { return Xsqlite3ValueText(tls, pVal, uint8(SQLITE_UTF16LE)) } func Xsqlite3_value_text16be(tls *libc.TLS, pVal uintptr) uintptr { return Xsqlite3ValueText(tls, pVal, uint8(SQLITE_UTF16BE)) } func Xsqlite3_value_text16le(tls *libc.TLS, pVal uintptr) uintptr { return Xsqlite3ValueText(tls, pVal, uint8(SQLITE_UTF16LE)) } // EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five // fundamental datatypes: 64-bit signed integer 64-bit IEEE floating // point number string BLOB NULL func Xsqlite3_value_type(tls *libc.TLS, pVal uintptr) int32 { return int32(aType[int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&MEM_AffMask]) } var aType = [64]U8{ U8(SQLITE_BLOB), U8(SQLITE_NULL), U8(SQLITE_TEXT), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_BLOB), U8(SQLITE_NULL), U8(SQLITE_TEXT), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_INTEGER), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_TEXT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_BLOB), U8(SQLITE_NULL), U8(SQLITE_TEXT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), U8(SQLITE_FLOAT), U8(SQLITE_NULL), } func Xsqlite3_value_encoding(tls *libc.TLS, pVal uintptr) int32 { return int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fenc) } // Return true if a parameter to xUpdate represents an unchanged column func Xsqlite3_value_nochange(tls *libc.TLS, pVal uintptr) int32 { return libc.Bool32(int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&(MEM_Null|MEM_Zero) == MEM_Null|MEM_Zero) } // Return true if a parameter value originated from an sqlite3_bind() func Xsqlite3_value_frombind(tls *libc.TLS, pVal uintptr) int32 { return libc.Bool32(int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&MEM_FromBind != 0) } // Make a copy of an sqlite3_value object func Xsqlite3_value_dup(tls *libc.TLS, pOrig uintptr) uintptr { var pNew uintptr if pOrig == uintptr(0) { return uintptr(0) } pNew = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Sqlite3_value{}))) if pNew == uintptr(0) { return uintptr(0) } libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Sqlite3_value{}))) libc.Xmemcpy(tls, pNew, pOrig, uint64(uintptr(0)+24)) *(*U16)(unsafe.Pointer(pNew + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Dyn)) (*Sqlite3_value)(unsafe.Pointer(pNew)).Fdb = uintptr(0) if int32((*Sqlite3_value)(unsafe.Pointer(pNew)).Fflags)&(MEM_Str|MEM_Blob) != 0 { *(*U16)(unsafe.Pointer(pNew + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Static | MEM_Dyn)) *(*U16)(unsafe.Pointer(pNew + 20)) |= U16(MEM_Ephem) if Xsqlite3VdbeMemMakeWriteable(tls, pNew) != SQLITE_OK { Xsqlite3ValueFree(tls, pNew) pNew = uintptr(0) } } else if int32((*Sqlite3_value)(unsafe.Pointer(pNew)).Fflags)&MEM_Null != 0 { *(*U16)(unsafe.Pointer(pNew + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Term | MEM_Subtype)) } return pNew } // Destroy an sqlite3_value object previously obtained from // sqlite3_value_dup(). func Xsqlite3_value_free(tls *libc.TLS, pOld uintptr) { Xsqlite3ValueFree(tls, pOld) } func setResultStrOrError(tls *libc.TLS, pCtx uintptr, z uintptr, n int32, enc U8, xDel uintptr) { var pOut uintptr = (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut var rc int32 = Xsqlite3VdbeMemSetStr(tls, pOut, z, int64(n), enc, xDel) if rc != 0 { if rc == SQLITE_TOOBIG { Xsqlite3_result_error_toobig(tls, pCtx) } else { Xsqlite3_result_error_nomem(tls, pCtx) } return } Xsqlite3VdbeChangeEncoding(tls, pOut, int32((*Sqlite3_context)(unsafe.Pointer(pCtx)).Fenc)) if Xsqlite3VdbeMemTooBig(tls, pOut) != 0 { Xsqlite3_result_error_toobig(tls, pCtx) } } func invokeValueDestructor(tls *libc.TLS, p uintptr, xDel uintptr, pCtx uintptr) int32 { if xDel == uintptr(0) { } else if xDel == libc.UintptrFromInt32(-1) { } else { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDel})).f(tls, p) } Xsqlite3_result_error_toobig(tls, pCtx) return SQLITE_TOOBIG } func Xsqlite3_result_blob(tls *libc.TLS, pCtx uintptr, z uintptr, n int32, xDel uintptr) { setResultStrOrError(tls, pCtx, z, n, uint8(0), xDel) } func Xsqlite3_result_blob64(tls *libc.TLS, pCtx uintptr, z uintptr, n Sqlite3_uint64, xDel uintptr) { if n > uint64(0x7fffffff) { invokeValueDestructor(tls, z, xDel, pCtx) } else { setResultStrOrError(tls, pCtx, z, int32(n), uint8(0), xDel) } } func Xsqlite3_result_double(tls *libc.TLS, pCtx uintptr, rVal float64) { Xsqlite3VdbeMemSetDouble(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, rVal) } func Xsqlite3_result_error(tls *libc.TLS, pCtx uintptr, z uintptr, n int32) { (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = SQLITE_ERROR Xsqlite3VdbeMemSetStr(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, z, int64(n), uint8(SQLITE_UTF8), libc.UintptrFromInt32(-1)) } func Xsqlite3_result_error16(tls *libc.TLS, pCtx uintptr, z uintptr, n int32) { (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = SQLITE_ERROR Xsqlite3VdbeMemSetStr(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, z, int64(n), uint8(SQLITE_UTF16LE), libc.UintptrFromInt32(-1)) } func Xsqlite3_result_int(tls *libc.TLS, pCtx uintptr, iVal int32) { Xsqlite3VdbeMemSetInt64(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, I64(iVal)) } func Xsqlite3_result_int64(tls *libc.TLS, pCtx uintptr, iVal I64) { Xsqlite3VdbeMemSetInt64(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, iVal) } func Xsqlite3_result_null(tls *libc.TLS, pCtx uintptr) { Xsqlite3VdbeMemSetNull(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut) } func Xsqlite3_result_pointer(tls *libc.TLS, pCtx uintptr, pPtr uintptr, zPType uintptr, xDestructor uintptr) { var pOut uintptr = (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut Xsqlite3VdbeMemRelease(tls, pOut) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Null) Xsqlite3VdbeMemSetPointer(tls, pOut, pPtr, zPType, xDestructor) } func Xsqlite3_result_subtype(tls *libc.TLS, pCtx uintptr, eSubtype uint32) { var pOut uintptr = (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut (*Mem)(unsafe.Pointer(pOut)).FeSubtype = U8(eSubtype & uint32(0xff)) *(*U16)(unsafe.Pointer(pOut + 20)) |= U16(MEM_Subtype) } func Xsqlite3_result_text(tls *libc.TLS, pCtx uintptr, z uintptr, n int32, xDel uintptr) { setResultStrOrError(tls, pCtx, z, n, uint8(SQLITE_UTF8), xDel) } func Xsqlite3_result_text64(tls *libc.TLS, pCtx uintptr, z uintptr, n Sqlite3_uint64, xDel uintptr, enc uint8) { if int32(enc) != SQLITE_UTF8 { if int32(enc) == SQLITE_UTF16 { enc = uint8(SQLITE_UTF16LE) } n = n & libc.CplUint64(uint64(1)) } if n > uint64(0x7fffffff) { invokeValueDestructor(tls, z, xDel, pCtx) } else { setResultStrOrError(tls, pCtx, z, int32(n), enc, xDel) } } func Xsqlite3_result_text16(tls *libc.TLS, pCtx uintptr, z uintptr, n int32, xDel uintptr) { setResultStrOrError(tls, pCtx, z, int32(U64(n)&libc.CplUint64(uint64(1))), uint8(SQLITE_UTF16LE), xDel) } func Xsqlite3_result_text16be(tls *libc.TLS, pCtx uintptr, z uintptr, n int32, xDel uintptr) { setResultStrOrError(tls, pCtx, z, int32(U64(n)&libc.CplUint64(uint64(1))), uint8(SQLITE_UTF16BE), xDel) } func Xsqlite3_result_text16le(tls *libc.TLS, pCtx uintptr, z uintptr, n int32, xDel uintptr) { setResultStrOrError(tls, pCtx, z, int32(U64(n)&libc.CplUint64(uint64(1))), uint8(SQLITE_UTF16LE), xDel) } func Xsqlite3_result_value(tls *libc.TLS, pCtx uintptr, pValue uintptr) { var pOut uintptr = (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut Xsqlite3VdbeMemCopy(tls, pOut, pValue) Xsqlite3VdbeChangeEncoding(tls, pOut, int32((*Sqlite3_context)(unsafe.Pointer(pCtx)).Fenc)) if Xsqlite3VdbeMemTooBig(tls, pOut) != 0 { Xsqlite3_result_error_toobig(tls, pCtx) } } func Xsqlite3_result_zeroblob(tls *libc.TLS, pCtx uintptr, n int32) { Xsqlite3_result_zeroblob64(tls, pCtx, func() uint64 { if n > 0 { return uint64(n) } return uint64(0) }()) } func Xsqlite3_result_zeroblob64(tls *libc.TLS, pCtx uintptr, n U64) int32 { var pOut uintptr = (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut if n > U64(*(*int32)(unsafe.Pointer((*Mem)(unsafe.Pointer(pOut)).Fdb + 136))) { Xsqlite3_result_error_toobig(tls, pCtx) return SQLITE_TOOBIG } Xsqlite3VdbeMemSetZeroBlob(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, int32(n)) return SQLITE_OK } func Xsqlite3_result_error_code(tls *libc.TLS, pCtx uintptr, errCode int32) { (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = func() int32 { if errCode != 0 { return errCode } return -1 }() if int32((*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut)).Fflags)&MEM_Null != 0 { setResultStrOrError(tls, pCtx, Xsqlite3ErrStr(tls, errCode), -1, uint8(SQLITE_UTF8), uintptr(0)) } } // Force an SQLITE_TOOBIG error. func Xsqlite3_result_error_toobig(tls *libc.TLS, pCtx uintptr) { (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = SQLITE_TOOBIG Xsqlite3VdbeMemSetStr(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, ts+6686, int64(-1), uint8(SQLITE_UTF8), uintptr(0)) } // An SQLITE_NOMEM error. func Xsqlite3_result_error_nomem(tls *libc.TLS, pCtx uintptr) { Xsqlite3VdbeMemSetNull(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = SQLITE_NOMEM Xsqlite3OomFault(tls, (*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut)).Fdb) } // Force the INT64 value currently stored as the result to be // a MEM_IntReal value. See the SQLITE_TESTCTRL_RESULT_INTREAL // test-control. func Xsqlite3ResultIntReal(tls *libc.TLS, pCtx uintptr) { if int32((*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut)).Fflags)&MEM_Int != 0 { *(*U16)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int)) *(*U16)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut + 20)) |= U16(MEM_IntReal) } } func doWalCallbacks(tls *libc.TLS, db uintptr) int32 { var rc int32 = SQLITE_OK var i int32 for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { var nEntry int32 Xsqlite3BtreeEnter(tls, pBt) nEntry = Xsqlite3PagerWalCallback(tls, Xsqlite3BtreePager(tls, pBt)) Xsqlite3BtreeLeave(tls, pBt) if nEntry > 0 && (*Sqlite3)(unsafe.Pointer(db)).FxWalCallback != 0 && rc == SQLITE_OK { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxWalCallback})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpWalArg, db, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FzDbSName, nEntry) } } } return rc } func sqlite3Step(tls *libc.TLS, p uintptr) int32 { var db uintptr var rc int32 db = (*Vdbe)(unsafe.Pointer(p)).Fdb if !(int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) != VDBE_RUN_STATE) { goto __1 } restart_step: if !(int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) == VDBE_READY_STATE) { goto __2 } if !(Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x3>>0)) != 0) { goto __4 } (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_SCHEMA rc = SQLITE_ERROR if !(int32((*Vdbe)(unsafe.Pointer(p)).FprepFlags)&SQLITE_PREPARE_SAVESQL != 0) { goto __5 } rc = Xsqlite3VdbeTransferError(tls, p) __5: ; goto end_of_step __4: ; if !((*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive == 0) { goto __6 } libc.AtomicStoreNInt32(db+432, int32(0), 0) __6: ; if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmTrace)&(SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE) != 0 && !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) && (*Vdbe)(unsafe.Pointer(p)).FzSql != 0) { goto __7 } Xsqlite3OsCurrentTimeInt64(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, p+184) goto __8 __7: ; __8: ; (*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive++ if !(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x40>>6) == 0) { goto __9 } (*Sqlite3)(unsafe.Pointer(db)).FnVdbeWrite++ __9: ; if !(Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x80>>7)) != 0) { goto __10 } (*Sqlite3)(unsafe.Pointer(db)).FnVdbeRead++ __10: ; (*Vdbe)(unsafe.Pointer(p)).Fpc = 0 (*Vdbe)(unsafe.Pointer(p)).FeVdbeState = U8(VDBE_RUN_STATE) goto __3 __2: if !(int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) == VDBE_HALT_STATE) { goto __11 } Xsqlite3_reset(tls, p) goto restart_step __11: ; __3: ; __1: ; if !(Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0xc>>2)) != 0) { goto __12 } rc = Xsqlite3VdbeList(tls, p) goto __13 __12: (*Sqlite3)(unsafe.Pointer(db)).FnVdbeExec++ rc = Xsqlite3VdbeExec(tls, p) (*Sqlite3)(unsafe.Pointer(db)).FnVdbeExec-- __13: ; if !(rc == SQLITE_ROW) { goto __14 } (*Sqlite3)(unsafe.Pointer(db)).FerrCode = SQLITE_ROW return SQLITE_ROW goto __15 __14: if !((*Vdbe)(unsafe.Pointer(p)).FstartTime > int64(0)) { goto __16 } invokeProfileCallback(tls, db, p) __16: ; (*Vdbe)(unsafe.Pointer(p)).FpResultRow = uintptr(0) if !(rc == SQLITE_DONE && (*Sqlite3)(unsafe.Pointer(db)).FautoCommit != 0) { goto __17 } (*Vdbe)(unsafe.Pointer(p)).Frc = doWalCallbacks(tls, db) if !((*Vdbe)(unsafe.Pointer(p)).Frc != SQLITE_OK) { goto __19 } rc = SQLITE_ERROR __19: ; goto __18 __17: if !(rc != SQLITE_DONE && int32((*Vdbe)(unsafe.Pointer(p)).FprepFlags)&SQLITE_PREPARE_SAVESQL != 0) { goto __20 } rc = Xsqlite3VdbeTransferError(tls, p) __20: ; __18: ; __15: ; (*Sqlite3)(unsafe.Pointer(db)).FerrCode = rc if !(SQLITE_NOMEM == Xsqlite3ApiExit(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, (*Vdbe)(unsafe.Pointer(p)).Frc)) { goto __21 } (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM if !(int32((*Vdbe)(unsafe.Pointer(p)).FprepFlags)&SQLITE_PREPARE_SAVESQL != 0) { goto __22 } rc = (*Vdbe)(unsafe.Pointer(p)).Frc __22: ; __21: ; end_of_step: ; return rc & (*Sqlite3)(unsafe.Pointer(db)).FerrMask } // This is the top-level implementation of sqlite3_step(). Call // sqlite3Step() to do most of the work. If a schema error occurs, // call sqlite3Reprepare() and try again. func Xsqlite3_step(tls *libc.TLS, pStmt uintptr) int32 { var rc int32 = SQLITE_OK var v uintptr = pStmt var cnt int32 = 0 var db uintptr if vdbeSafetyNotNull(tls, v) != 0 { return Xsqlite3MisuseError(tls, 88548) } db = (*Vdbe)(unsafe.Pointer(v)).Fdb Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) for libc.AssignInt32(&rc, sqlite3Step(tls, v)) == SQLITE_SCHEMA && libc.PostIncInt32(&cnt, 1) < SQLITE_MAX_SCHEMA_RETRY { var savedPc int32 = (*Vdbe)(unsafe.Pointer(v)).Fpc rc = Xsqlite3Reprepare(tls, v) if rc != SQLITE_OK { var zErr uintptr = Xsqlite3_value_text(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) Xsqlite3DbFree(tls, db, (*Vdbe)(unsafe.Pointer(v)).FzErrMsg) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { (*Vdbe)(unsafe.Pointer(v)).FzErrMsg = Xsqlite3DbStrDup(tls, db, zErr) (*Vdbe)(unsafe.Pointer(v)).Frc = libc.AssignInt32(&rc, Xsqlite3ApiExit(tls, db, rc)) } else { (*Vdbe)(unsafe.Pointer(v)).FzErrMsg = uintptr(0) (*Vdbe)(unsafe.Pointer(v)).Frc = libc.AssignInt32(&rc, SQLITE_NOMEM) } break } Xsqlite3_reset(tls, pStmt) if savedPc >= 0 { (*Vdbe)(unsafe.Pointer(v)).FminWriteFileFormat = U8(254) } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Extract the user data from a sqlite3_context structure and return a // pointer to it. func Xsqlite3_user_data(tls *libc.TLS, p uintptr) uintptr { return (*FuncDef)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(p)).FpFunc)).FpUserData } // Extract the user data from a sqlite3_context structure and return a // pointer to it. // // IMPLEMENTATION-OF: R-46798-50301 The sqlite3_context_db_handle() interface // returns a copy of the pointer to the database connection (the 1st // parameter) of the sqlite3_create_function() and // sqlite3_create_function16() routines that originally registered the // application defined function. func Xsqlite3_context_db_handle(tls *libc.TLS, p uintptr) uintptr { return (*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(p)).FpOut)).Fdb } // If this routine is invoked from within an xColumn method of a virtual // table, then it returns true if and only if the the call is during an // UPDATE operation and the value of the column will not be modified // by the UPDATE. // // If this routine is called from any context other than within the // xColumn method of a virtual table, then the return value is meaningless // and arbitrary. // // Virtual table implements might use this routine to optimize their // performance by substituting a NULL result, or some other light-weight // value, as a signal to the xUpdate routine that the column is unchanged. func Xsqlite3_vtab_nochange(tls *libc.TLS, p uintptr) int32 { return Xsqlite3_value_nochange(tls, (*Sqlite3_context)(unsafe.Pointer(p)).FpOut) } // The destructor function for a ValueList object. This needs to be // a separate function, unknowable to the application, to ensure that // calls to sqlite3_vtab_in_first()/sqlite3_vtab_in_next() that are not // preceeded by activation of IN processing via sqlite3_vtab_int() do not // try to access a fake ValueList object inserted by a hostile extension. func Xsqlite3VdbeValueListFree(tls *libc.TLS, pToDelete uintptr) { Xsqlite3_free(tls, pToDelete) } func valueFromValueList(tls *libc.TLS, pVal uintptr, ppOut uintptr, bNext int32) int32 { bp := tls.Alloc(68) defer tls.Free(68) var rc int32 var pRhs uintptr *(*uintptr)(unsafe.Pointer(ppOut)) = uintptr(0) if pVal == uintptr(0) { return SQLITE_MISUSE } if int32((*Sqlite3_value)(unsafe.Pointer(pVal)).Fflags)&MEM_Dyn == 0 || (*Sqlite3_value)(unsafe.Pointer(pVal)).FxDel != *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3VdbeValueListFree})) { return SQLITE_ERROR } else { pRhs = (*Sqlite3_value)(unsafe.Pointer(pVal)).Fz } if bNext != 0 { rc = Xsqlite3BtreeNext(tls, (*ValueList)(unsafe.Pointer(pRhs)).FpCsr, 0) } else { *(*int32)(unsafe.Pointer(bp)) = 0 rc = Xsqlite3BtreeFirst(tls, (*ValueList)(unsafe.Pointer(pRhs)).FpCsr, bp) if Xsqlite3BtreeEof(tls, (*ValueList)(unsafe.Pointer(pRhs)).FpCsr) != 0 { rc = SQLITE_DONE } } if rc == SQLITE_OK { var sz U32 libc.Xmemset(tls, bp+8, 0, uint64(unsafe.Sizeof(Mem{}))) sz = Xsqlite3BtreePayloadSize(tls, (*ValueList)(unsafe.Pointer(pRhs)).FpCsr) rc = Xsqlite3VdbeMemFromBtreeZeroOffset(tls, (*ValueList)(unsafe.Pointer(pRhs)).FpCsr, uint32(int32(sz)), bp+8) if rc == SQLITE_OK { var zBuf uintptr = (*Mem)(unsafe.Pointer(bp + 8)).Fz var pOut uintptr = (*ValueList)(unsafe.Pointer(pRhs)).FpOut var iOff int32 = 1 + int32(func() uint8 { if int32(*(*U8)(unsafe.Pointer(zBuf + 1))) < int32(U8(0x80)) { return uint8(func() int32 { *(*U32)(unsafe.Pointer(bp + 64)) = U32(*(*U8)(unsafe.Pointer(zBuf + 1))); return 1 }()) } return Xsqlite3GetVarint32(tls, zBuf+1, bp+64) }()) Xsqlite3VdbeSerialGet(tls, zBuf+uintptr(iOff), *(*U32)(unsafe.Pointer(bp + 64)), pOut) (*Sqlite3_value)(unsafe.Pointer(pOut)).Fenc = (*Sqlite3)(unsafe.Pointer((*Sqlite3_value)(unsafe.Pointer(pOut)).Fdb)).Fenc if int32((*Sqlite3_value)(unsafe.Pointer(pOut)).Fflags)&MEM_Ephem != 0 && Xsqlite3VdbeMemMakeWriteable(tls, pOut) != 0 { rc = SQLITE_NOMEM } else { *(*uintptr)(unsafe.Pointer(ppOut)) = pOut } } Xsqlite3VdbeMemRelease(tls, bp+8) } return rc } // Set the iterator value pVal to point to the first value in the set. // Set (*ppOut) to point to this value before returning. func Xsqlite3_vtab_in_first(tls *libc.TLS, pVal uintptr, ppOut uintptr) int32 { return valueFromValueList(tls, pVal, ppOut, 0) } // Set the iterator value pVal to point to the next value in the set. // Set (*ppOut) to point to this value before returning. func Xsqlite3_vtab_in_next(tls *libc.TLS, pVal uintptr, ppOut uintptr) int32 { return valueFromValueList(tls, pVal, ppOut, 1) } // Return the current time for a statement. If the current time // is requested more than once within the same run of a single prepared // statement, the exact same time is returned for each invocation regardless // of the amount of time that elapses between invocations. In other words, // the time returned is always the time of the first call. func Xsqlite3StmtCurrentTime(tls *libc.TLS, p uintptr) Sqlite3_int64 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 *(*Sqlite3_int64)(unsafe.Pointer(bp)) = int64(0) var piTime uintptr if (*Sqlite3_context)(unsafe.Pointer(p)).FpVdbe != uintptr(0) { piTime = (*Sqlite3_context)(unsafe.Pointer(p)).FpVdbe + 72 } else { piTime = bp } if *(*Sqlite3_int64)(unsafe.Pointer(piTime)) == int64(0) { rc = Xsqlite3OsCurrentTimeInt64(tls, (*Sqlite3)(unsafe.Pointer((*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(p)).FpOut)).Fdb)).FpVfs, piTime) if rc != 0 { *(*Sqlite3_int64)(unsafe.Pointer(piTime)) = int64(0) } } return *(*Sqlite3_int64)(unsafe.Pointer(piTime)) } func createAggContext(tls *libc.TLS, p uintptr, nByte int32) uintptr { var pMem uintptr = (*Sqlite3_context)(unsafe.Pointer(p)).FpMem if nByte <= 0 { Xsqlite3VdbeMemSetNull(tls, pMem) (*Mem)(unsafe.Pointer(pMem)).Fz = uintptr(0) } else { Xsqlite3VdbeMemClearAndResize(tls, pMem, nByte) (*Mem)(unsafe.Pointer(pMem)).Fflags = U16(MEM_Agg) *(*uintptr)(unsafe.Pointer(pMem)) = (*Sqlite3_context)(unsafe.Pointer(p)).FpFunc if (*Mem)(unsafe.Pointer(pMem)).Fz != 0 { libc.Xmemset(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, 0, uint64(nByte)) } } return (*Mem)(unsafe.Pointer(pMem)).Fz } // Allocate or return the aggregate context for a user function. A new // context is allocated on the first call. Subsequent calls return the // same context that was returned on prior calls. func Xsqlite3_aggregate_context(tls *libc.TLS, p uintptr, nByte int32) uintptr { if int32((*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(p)).FpMem)).Fflags)&MEM_Agg == 0 { return createAggContext(tls, p, nByte) } else { return (*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(p)).FpMem)).Fz } return uintptr(0) } // Return the auxiliary data pointer, if any, for the iArg'th argument to // the user-function defined by pCtx. // // The left-most argument is 0. // // Undocumented behavior: If iArg is negative then access a cache of // auxiliary data pointers that is available to all functions within a // single prepared statement. The iArg values must match. func Xsqlite3_get_auxdata(tls *libc.TLS, pCtx uintptr, iArg int32) uintptr { var pAuxData uintptr if (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpVdbe == uintptr(0) { return uintptr(0) } for pAuxData = (*Vdbe)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx)).FpVdbe)).FpAuxData; pAuxData != 0; pAuxData = (*AuxData)(unsafe.Pointer(pAuxData)).FpNextAux { if (*AuxData)(unsafe.Pointer(pAuxData)).FiAuxArg == iArg && ((*AuxData)(unsafe.Pointer(pAuxData)).FiAuxOp == (*Sqlite3_context)(unsafe.Pointer(pCtx)).FiOp || iArg < 0) { return (*AuxData)(unsafe.Pointer(pAuxData)).FpAux } } return uintptr(0) } // Set the auxiliary data pointer and delete function, for the iArg'th // argument to the user-function defined by pCtx. Any previous value is // deleted by calling the delete function specified when it was set. // // The left-most argument is 0. // // Undocumented behavior: If iArg is negative then make the data available // to all functions within the current prepared statement using iArg as an // access code. func Xsqlite3_set_auxdata(tls *libc.TLS, pCtx uintptr, iArg int32, pAux uintptr, xDelete uintptr) { var pAuxData uintptr var pVdbe uintptr pVdbe = (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpVdbe if !(pVdbe == uintptr(0)) { goto __1 } goto failed __1: ; pAuxData = (*Vdbe)(unsafe.Pointer(pVdbe)).FpAuxData __2: if !(pAuxData != 0) { goto __4 } if !((*AuxData)(unsafe.Pointer(pAuxData)).FiAuxArg == iArg && ((*AuxData)(unsafe.Pointer(pAuxData)).FiAuxOp == (*Sqlite3_context)(unsafe.Pointer(pCtx)).FiOp || iArg < 0)) { goto __5 } goto __4 __5: ; goto __3 __3: pAuxData = (*AuxData)(unsafe.Pointer(pAuxData)).FpNextAux goto __2 goto __4 __4: ; if !(pAuxData == uintptr(0)) { goto __6 } pAuxData = Xsqlite3DbMallocZero(tls, (*Vdbe)(unsafe.Pointer(pVdbe)).Fdb, uint64(unsafe.Sizeof(AuxData{}))) if !!(pAuxData != 0) { goto __8 } goto failed __8: ; (*AuxData)(unsafe.Pointer(pAuxData)).FiAuxOp = (*Sqlite3_context)(unsafe.Pointer(pCtx)).FiOp (*AuxData)(unsafe.Pointer(pAuxData)).FiAuxArg = iArg (*AuxData)(unsafe.Pointer(pAuxData)).FpNextAux = (*Vdbe)(unsafe.Pointer(pVdbe)).FpAuxData (*Vdbe)(unsafe.Pointer(pVdbe)).FpAuxData = pAuxData if !((*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError == 0) { goto __9 } (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = -1 __9: ; goto __7 __6: if !((*AuxData)(unsafe.Pointer(pAuxData)).FxDeleteAux != 0) { goto __10 } (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*AuxData)(unsafe.Pointer(pAuxData)).FxDeleteAux})).f(tls, (*AuxData)(unsafe.Pointer(pAuxData)).FpAux) __10: ; __7: ; (*AuxData)(unsafe.Pointer(pAuxData)).FpAux = pAux (*AuxData)(unsafe.Pointer(pAuxData)).FxDeleteAux = xDelete return failed: if !(xDelete != 0) { goto __11 } (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDelete})).f(tls, pAux) __11: } // Return the number of times the Step function of an aggregate has been // called. // // This function is deprecated. Do not use it for new code. It is // provide only to avoid breaking legacy code. New aggregate function // implementations should keep their own counts within their aggregate // context. func Xsqlite3_aggregate_count(tls *libc.TLS, p uintptr) int32 { return (*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(p)).FpMem)).Fn } // Return the number of columns in the result set for the statement pStmt. func Xsqlite3_column_count(tls *libc.TLS, pStmt uintptr) int32 { var pVm uintptr = pStmt if pVm != 0 { return int32((*Vdbe)(unsafe.Pointer(pVm)).FnResColumn) } return 0 } // Return the number of values available from the current row of the // currently executing statement pStmt. func Xsqlite3_data_count(tls *libc.TLS, pStmt uintptr) int32 { var pVm uintptr = pStmt if pVm == uintptr(0) || (*Vdbe)(unsafe.Pointer(pVm)).FpResultRow == uintptr(0) { return 0 } return int32((*Vdbe)(unsafe.Pointer(pVm)).FnResColumn) } func columnNullValue(tls *libc.TLS) uintptr { return uintptr(unsafe.Pointer(&nullMem)) } var nullMem = Mem{ Fflags: U16(MEM_Null), } func columnMem(tls *libc.TLS, pStmt uintptr, i int32) uintptr { var pVm uintptr var pOut uintptr pVm = pStmt if pVm == uintptr(0) { return columnNullValue(tls) } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(pVm)).Fdb)).Fmutex) if (*Vdbe)(unsafe.Pointer(pVm)).FpResultRow != uintptr(0) && i < int32((*Vdbe)(unsafe.Pointer(pVm)).FnResColumn) && i >= 0 { pOut = (*Vdbe)(unsafe.Pointer(pVm)).FpResultRow + uintptr(i)*56 } else { Xsqlite3Error(tls, (*Vdbe)(unsafe.Pointer(pVm)).Fdb, SQLITE_RANGE) pOut = columnNullValue(tls) } return pOut } func columnMallocFailure(tls *libc.TLS, pStmt uintptr) { var p uintptr = pStmt if p != 0 { (*Vdbe)(unsafe.Pointer(p)).Frc = Xsqlite3ApiExit(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, (*Vdbe)(unsafe.Pointer(p)).Frc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } } // *************************** sqlite3_column_ ******************************* // // The following routines are used to access elements of the current row // in the result set. func Xsqlite3_column_blob(tls *libc.TLS, pStmt uintptr, i int32) uintptr { var val uintptr val = Xsqlite3_value_blob(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_bytes(tls *libc.TLS, pStmt uintptr, i int32) int32 { var val int32 = Xsqlite3_value_bytes(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_bytes16(tls *libc.TLS, pStmt uintptr, i int32) int32 { var val int32 = Xsqlite3_value_bytes16(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_double(tls *libc.TLS, pStmt uintptr, i int32) float64 { var val float64 = Xsqlite3_value_double(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_int(tls *libc.TLS, pStmt uintptr, i int32) int32 { var val int32 = Xsqlite3_value_int(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_int64(tls *libc.TLS, pStmt uintptr, i int32) Sqlite_int64 { var val Sqlite_int64 = Xsqlite3_value_int64(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_text(tls *libc.TLS, pStmt uintptr, i int32) uintptr { var val uintptr = Xsqlite3_value_text(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_value(tls *libc.TLS, pStmt uintptr, i int32) uintptr { var pOut uintptr = columnMem(tls, pStmt, i) if int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&MEM_Static != 0 { *(*U16)(unsafe.Pointer(pOut + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Static)) *(*U16)(unsafe.Pointer(pOut + 20)) |= U16(MEM_Ephem) } columnMallocFailure(tls, pStmt) return pOut } func Xsqlite3_column_text16(tls *libc.TLS, pStmt uintptr, i int32) uintptr { var val uintptr = Xsqlite3_value_text16(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return val } func Xsqlite3_column_type(tls *libc.TLS, pStmt uintptr, i int32) int32 { var iType int32 = Xsqlite3_value_type(tls, columnMem(tls, pStmt, i)) columnMallocFailure(tls, pStmt) return iType } func columnName(tls *libc.TLS, pStmt uintptr, N int32, useUtf16 int32, useType int32) uintptr { var ret uintptr var p uintptr var n int32 var db uintptr ret = uintptr(0) p = pStmt db = (*Vdbe)(unsafe.Pointer(p)).Fdb n = Xsqlite3_column_count(tls, pStmt) if N < n && N >= 0 { N = N + useType*n Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if useUtf16 != 0 { ret = Xsqlite3_value_text16(tls, (*Vdbe)(unsafe.Pointer(p)).FaColName+uintptr(N)*56) } else { ret = Xsqlite3_value_text(tls, (*Vdbe)(unsafe.Pointer(p)).FaColName+uintptr(N)*56) } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3OomClear(tls, db) ret = uintptr(0) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) } return ret } // Return the name of the Nth column of the result set returned by SQL // statement pStmt. func Xsqlite3_column_name(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 0, COLNAME_NAME) } func Xsqlite3_column_name16(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 1, COLNAME_NAME) } // Return the column declaration type (if applicable) of the 'i'th column // of the result set of SQL statement pStmt. func Xsqlite3_column_decltype(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 0, COLNAME_DECLTYPE) } func Xsqlite3_column_decltype16(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 1, COLNAME_DECLTYPE) } // Return the name of the database from which a result column derives. // NULL is returned if the result column is an expression or constant or // anything else which is not an unambiguous reference to a database column. func Xsqlite3_column_database_name(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 0, COLNAME_DATABASE) } func Xsqlite3_column_database_name16(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 1, COLNAME_DATABASE) } // Return the name of the table from which a result column derives. // NULL is returned if the result column is an expression or constant or // anything else which is not an unambiguous reference to a database column. func Xsqlite3_column_table_name(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 0, COLNAME_TABLE) } func Xsqlite3_column_table_name16(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 1, COLNAME_TABLE) } // Return the name of the table column from which a result column derives. // NULL is returned if the result column is an expression or constant or // anything else which is not an unambiguous reference to a database column. func Xsqlite3_column_origin_name(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 0, COLNAME_COLUMN) } func Xsqlite3_column_origin_name16(tls *libc.TLS, pStmt uintptr, N int32) uintptr { return columnName(tls, pStmt, N, 1, COLNAME_COLUMN) } func vdbeUnbind(tls *libc.TLS, p uintptr, i uint32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pVar uintptr if vdbeSafetyNotNull(tls, p) != 0 { return Xsqlite3MisuseError(tls, 89212) } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) if int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) != VDBE_READY_STATE { Xsqlite3Error(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, SQLITE_MISUSE) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) Xsqlite3_log(tls, SQLITE_MISUSE, ts+6709, libc.VaList(bp, (*Vdbe)(unsafe.Pointer(p)).FzSql)) return Xsqlite3MisuseError(tls, 89220) } if i >= uint32((*Vdbe)(unsafe.Pointer(p)).FnVar) { Xsqlite3Error(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, SQLITE_RANGE) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) return SQLITE_RANGE } pVar = (*Vdbe)(unsafe.Pointer(p)).FaVar + uintptr(i)*56 Xsqlite3VdbeMemRelease(tls, pVar) (*Mem)(unsafe.Pointer(pVar)).Fflags = U16(MEM_Null) (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FerrCode = SQLITE_OK if (*Vdbe)(unsafe.Pointer(p)).Fexpmask != U32(0) && (*Vdbe)(unsafe.Pointer(p)).Fexpmask&func() uint32 { if i >= uint32(31) { return 0x80000000 } return U32(1) << i }() != U32(0) { libc.SetBitFieldPtr8Uint32(p+200, Bft(1), 0, 0x3) } return SQLITE_OK } func bindText(tls *libc.TLS, pStmt uintptr, i int32, zData uintptr, nData I64, xDel uintptr, encoding U8) int32 { var p uintptr = pStmt var pVar uintptr var rc int32 rc = vdbeUnbind(tls, p, U32(i-1)) if rc == SQLITE_OK { if zData != uintptr(0) { pVar = (*Vdbe)(unsafe.Pointer(p)).FaVar + uintptr(i-1)*56 rc = Xsqlite3VdbeMemSetStr(tls, pVar, zData, nData, encoding, xDel) if rc == SQLITE_OK && int32(encoding) != 0 { rc = Xsqlite3VdbeChangeEncoding(tls, pVar, int32((*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fenc)) } if rc != 0 { Xsqlite3Error(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, rc) rc = Xsqlite3ApiExit(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, rc) } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } else if xDel != uintptr(0) && xDel != libc.UintptrFromInt32(-1) { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDel})).f(tls, zData) } return rc } // Bind a blob value to an SQL statement variable. func Xsqlite3_bind_blob(tls *libc.TLS, pStmt uintptr, i int32, zData uintptr, nData int32, xDel uintptr) int32 { return bindText(tls, pStmt, i, zData, int64(nData), xDel, uint8(0)) } func Xsqlite3_bind_blob64(tls *libc.TLS, pStmt uintptr, i int32, zData uintptr, nData Sqlite3_uint64, xDel uintptr) int32 { return bindText(tls, pStmt, i, zData, int64(nData), xDel, uint8(0)) } func Xsqlite3_bind_double(tls *libc.TLS, pStmt uintptr, i int32, rValue float64) int32 { var rc int32 var p uintptr = pStmt rc = vdbeUnbind(tls, p, U32(i-1)) if rc == SQLITE_OK { Xsqlite3VdbeMemSetDouble(tls, (*Vdbe)(unsafe.Pointer(p)).FaVar+uintptr(i-1)*56, rValue) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } return rc } func Xsqlite3_bind_int(tls *libc.TLS, p uintptr, i int32, iValue int32) int32 { return Xsqlite3_bind_int64(tls, p, i, I64(iValue)) } func Xsqlite3_bind_int64(tls *libc.TLS, pStmt uintptr, i int32, iValue Sqlite_int64) int32 { var rc int32 var p uintptr = pStmt rc = vdbeUnbind(tls, p, U32(i-1)) if rc == SQLITE_OK { Xsqlite3VdbeMemSetInt64(tls, (*Vdbe)(unsafe.Pointer(p)).FaVar+uintptr(i-1)*56, iValue) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } return rc } func Xsqlite3_bind_null(tls *libc.TLS, pStmt uintptr, i int32) int32 { var rc int32 var p uintptr = pStmt rc = vdbeUnbind(tls, p, U32(i-1)) if rc == SQLITE_OK { Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } return rc } func Xsqlite3_bind_pointer(tls *libc.TLS, pStmt uintptr, i int32, pPtr uintptr, zPTtype uintptr, xDestructor uintptr) int32 { var rc int32 var p uintptr = pStmt rc = vdbeUnbind(tls, p, U32(i-1)) if rc == SQLITE_OK { Xsqlite3VdbeMemSetPointer(tls, (*Vdbe)(unsafe.Pointer(p)).FaVar+uintptr(i-1)*56, pPtr, zPTtype, xDestructor) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } else if xDestructor != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDestructor})).f(tls, pPtr) } return rc } func Xsqlite3_bind_text(tls *libc.TLS, pStmt uintptr, i int32, zData uintptr, nData int32, xDel uintptr) int32 { return bindText(tls, pStmt, i, zData, int64(nData), xDel, uint8(SQLITE_UTF8)) } func Xsqlite3_bind_text64(tls *libc.TLS, pStmt uintptr, i int32, zData uintptr, nData Sqlite3_uint64, xDel uintptr, enc uint8) int32 { if int32(enc) != SQLITE_UTF8 { if int32(enc) == SQLITE_UTF16 { enc = uint8(SQLITE_UTF16LE) } nData = nData & libc.Uint64FromInt32(libc.CplInt32(int32(U16(1)))) } return bindText(tls, pStmt, i, zData, int64(nData), xDel, enc) } func Xsqlite3_bind_text16(tls *libc.TLS, pStmt uintptr, i int32, zData uintptr, n int32, xDel uintptr) int32 { return bindText(tls, pStmt, i, zData, int64(U64(n)&libc.CplUint64(uint64(1))), xDel, uint8(SQLITE_UTF16LE)) } func Xsqlite3_bind_value(tls *libc.TLS, pStmt uintptr, i int32, pValue uintptr) int32 { var rc int32 switch Xsqlite3_value_type(tls, pValue) { case SQLITE_INTEGER: { rc = Xsqlite3_bind_int64(tls, pStmt, i, *(*I64)(unsafe.Pointer(pValue))) break } case SQLITE_FLOAT: { rc = Xsqlite3_bind_double(tls, pStmt, i, func() float64 { if int32((*Sqlite3_value)(unsafe.Pointer(pValue)).Fflags)&MEM_Real != 0 { return *(*float64)(unsafe.Pointer(pValue)) } return float64(*(*I64)(unsafe.Pointer(pValue))) }()) break } case SQLITE_BLOB: { if int32((*Sqlite3_value)(unsafe.Pointer(pValue)).Fflags)&MEM_Zero != 0 { rc = Xsqlite3_bind_zeroblob(tls, pStmt, i, *(*int32)(unsafe.Pointer(pValue))) } else { rc = Xsqlite3_bind_blob(tls, pStmt, i, (*Sqlite3_value)(unsafe.Pointer(pValue)).Fz, (*Sqlite3_value)(unsafe.Pointer(pValue)).Fn, libc.UintptrFromInt32(-1)) } break } case SQLITE_TEXT: { rc = bindText(tls, pStmt, i, (*Sqlite3_value)(unsafe.Pointer(pValue)).Fz, int64((*Sqlite3_value)(unsafe.Pointer(pValue)).Fn), libc.UintptrFromInt32(-1), (*Sqlite3_value)(unsafe.Pointer(pValue)).Fenc) break } default: { rc = Xsqlite3_bind_null(tls, pStmt, i) break } } return rc } func Xsqlite3_bind_zeroblob(tls *libc.TLS, pStmt uintptr, i int32, n int32) int32 { var rc int32 var p uintptr = pStmt rc = vdbeUnbind(tls, p, U32(i-1)) if rc == SQLITE_OK { Xsqlite3VdbeMemSetZeroBlob(tls, (*Vdbe)(unsafe.Pointer(p)).FaVar+uintptr(i-1)*56, n) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } return rc } func Xsqlite3_bind_zeroblob64(tls *libc.TLS, pStmt uintptr, i int32, n Sqlite3_uint64) int32 { var rc int32 var p uintptr = pStmt Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) if n > U64(*(*int32)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb + 136))) { rc = SQLITE_TOOBIG } else { rc = Xsqlite3_bind_zeroblob(tls, pStmt, i, int32(n)) } rc = Xsqlite3ApiExit(tls, (*Vdbe)(unsafe.Pointer(p)).Fdb, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) return rc } // Return the number of wildcards that can be potentially bound to. // This routine is added to support DBD::SQLite. func Xsqlite3_bind_parameter_count(tls *libc.TLS, pStmt uintptr) int32 { var p uintptr = pStmt if p != 0 { return int32((*Vdbe)(unsafe.Pointer(p)).FnVar) } return 0 } // Return the name of a wildcard parameter. Return NULL if the index // is out of range or if the wildcard is unnamed. // // The result is always UTF-8. func Xsqlite3_bind_parameter_name(tls *libc.TLS, pStmt uintptr, i int32) uintptr { var p uintptr = pStmt if p == uintptr(0) { return uintptr(0) } return Xsqlite3VListNumToName(tls, (*Vdbe)(unsafe.Pointer(p)).FpVList, i) } // Given a wildcard parameter name, return the index of the variable // with that name. If there is no variable with the given name, // return 0. func Xsqlite3VdbeParameterIndex(tls *libc.TLS, p uintptr, zName uintptr, nName int32) int32 { if p == uintptr(0) || zName == uintptr(0) { return 0 } return Xsqlite3VListNameToNum(tls, (*Vdbe)(unsafe.Pointer(p)).FpVList, zName, nName) } func Xsqlite3_bind_parameter_index(tls *libc.TLS, pStmt uintptr, zName uintptr) int32 { return Xsqlite3VdbeParameterIndex(tls, pStmt, zName, Xsqlite3Strlen30(tls, zName)) } // Transfer all bindings from the first statement over to the second. func Xsqlite3TransferBindings(tls *libc.TLS, pFromStmt uintptr, pToStmt uintptr) int32 { var pFrom uintptr = pFromStmt var pTo uintptr = pToStmt var i int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(pTo)).Fdb)).Fmutex) for i = 0; i < int32((*Vdbe)(unsafe.Pointer(pFrom)).FnVar); i++ { Xsqlite3VdbeMemMove(tls, (*Vdbe)(unsafe.Pointer(pTo)).FaVar+uintptr(i)*56, (*Vdbe)(unsafe.Pointer(pFrom)).FaVar+uintptr(i)*56) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(pTo)).Fdb)).Fmutex) return SQLITE_OK } // Deprecated external interface. Internal/core SQLite code // should call sqlite3TransferBindings. // // It is misuse to call this routine with statements from different // database connections. But as this is a deprecated interface, we // will not bother to check for that condition. // // If the two statements contain a different number of bindings, then // an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise // SQLITE_OK is returned. func Xsqlite3_transfer_bindings(tls *libc.TLS, pFromStmt uintptr, pToStmt uintptr) int32 { var pFrom uintptr = pFromStmt var pTo uintptr = pToStmt if int32((*Vdbe)(unsafe.Pointer(pFrom)).FnVar) != int32((*Vdbe)(unsafe.Pointer(pTo)).FnVar) { return SQLITE_ERROR } if (*Vdbe)(unsafe.Pointer(pTo)).Fexpmask != 0 { libc.SetBitFieldPtr8Uint32(pTo+200, Bft(1), 0, 0x3) } if (*Vdbe)(unsafe.Pointer(pFrom)).Fexpmask != 0 { libc.SetBitFieldPtr8Uint32(pFrom+200, Bft(1), 0, 0x3) } return Xsqlite3TransferBindings(tls, pFromStmt, pToStmt) } // Return the sqlite3* database handle to which the prepared statement given // in the argument belongs. This is the same database handle that was // the first argument to the sqlite3_prepare() that was used to create // the statement in the first place. func Xsqlite3_db_handle(tls *libc.TLS, pStmt uintptr) uintptr { if pStmt != 0 { return (*Vdbe)(unsafe.Pointer(pStmt)).Fdb } return uintptr(0) } // Return true if the prepared statement is guaranteed to not modify the // database. func Xsqlite3_stmt_readonly(tls *libc.TLS, pStmt uintptr) int32 { if pStmt != 0 { return int32(*(*uint8)(unsafe.Pointer(pStmt + 200)) & 0x40 >> 6) } return 1 } // Return 1 if the statement is an EXPLAIN and return 2 if the // statement is an EXPLAIN QUERY PLAN func Xsqlite3_stmt_isexplain(tls *libc.TLS, pStmt uintptr) int32 { if pStmt != 0 { return int32(*(*uint8)(unsafe.Pointer(pStmt + 200)) & 0xc >> 2) } return 0 } // Return true if the prepared statement is in need of being reset. func Xsqlite3_stmt_busy(tls *libc.TLS, pStmt uintptr) int32 { var v uintptr = pStmt return libc.Bool32(v != uintptr(0) && int32((*Vdbe)(unsafe.Pointer(v)).FeVdbeState) == VDBE_RUN_STATE) } // Return a pointer to the next prepared statement after pStmt associated // with database connection pDb. If pStmt is NULL, return the first // prepared statement for the database connection. Return NULL if there // are no more. func Xsqlite3_next_stmt(tls *libc.TLS, pDb uintptr, pStmt uintptr) uintptr { var pNext uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(pDb)).Fmutex) if pStmt == uintptr(0) { pNext = (*Sqlite3)(unsafe.Pointer(pDb)).FpVdbe } else { pNext = (*Vdbe)(unsafe.Pointer(pStmt)).FpVNext } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(pDb)).Fmutex) return pNext } // Return the value of a status counter for a prepared statement func Xsqlite3_stmt_status(tls *libc.TLS, pStmt uintptr, op int32, resetFlag int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pVdbe uintptr = pStmt if op == SQLITE_STMTSTATUS_MEMUSED { var db uintptr = (*Vdbe)(unsafe.Pointer(pVdbe)).Fdb Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) *(*U32)(unsafe.Pointer(bp)) = U32(0) (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed = bp (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart Xsqlite3VdbeDelete(tls, pVdbe) (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpTrueEnd Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) } else { *(*U32)(unsafe.Pointer(bp)) = *(*U32)(unsafe.Pointer(pVdbe + 212 + uintptr(op)*4)) if resetFlag != 0 { *(*U32)(unsafe.Pointer(pVdbe + 212 + uintptr(op)*4)) = U32(0) } } return int32(*(*U32)(unsafe.Pointer(bp))) } // Return the SQL associated with a prepared statement func Xsqlite3_sql(tls *libc.TLS, pStmt uintptr) uintptr { var p uintptr = pStmt if p != 0 { return (*Vdbe)(unsafe.Pointer(p)).FzSql } return uintptr(0) } // Return the SQL associated with a prepared statement with // bound parameters expanded. Space to hold the returned string is // obtained from sqlite3_malloc(). The caller is responsible for // freeing the returned string by passing it to sqlite3_free(). // // The SQLITE_TRACE_SIZE_LIMIT puts an upper bound on the size of // expanded bound parameters. func Xsqlite3_expanded_sql(tls *libc.TLS, pStmt uintptr) uintptr { var z uintptr = uintptr(0) var zSql uintptr = Xsqlite3_sql(tls, pStmt) if zSql != 0 { var p uintptr = pStmt Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) z = Xsqlite3VdbeExpandSql(tls, p, zSql) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).Fmutex) } return z } func vdbeUnpackRecord(tls *libc.TLS, pKeyInfo uintptr, nKey int32, pKey uintptr) uintptr { var pRet uintptr pRet = Xsqlite3VdbeAllocUnpackedRecord(tls, pKeyInfo) if pRet != 0 { libc.Xmemset(tls, (*UnpackedRecord)(unsafe.Pointer(pRet)).FaMem, 0, uint64(unsafe.Sizeof(Mem{}))*uint64(int32((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnKeyField)+1)) Xsqlite3VdbeRecordUnpack(tls, pKeyInfo, nKey, pKey, pRet) } return pRet } // This function is called from within a pre-update callback to retrieve // a field of the row currently being updated or deleted. func Xsqlite3_preupdate_old(tls *libc.TLS, db uintptr, iIdx int32, ppValue uintptr) int32 { var p uintptr var pMem uintptr var rc int32 var nRec U32 var aRec uintptr p = (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdate rc = SQLITE_OK if !(!(p != 0) || (*PreUpdate)(unsafe.Pointer(p)).Fop == SQLITE_INSERT) { goto __1 } rc = Xsqlite3MisuseError(tls, 89711) goto preupdate_old_out __1: ; if !((*PreUpdate)(unsafe.Pointer(p)).FpPk != 0) { goto __2 } iIdx = int32(Xsqlite3TableColumnToIndex(tls, (*PreUpdate)(unsafe.Pointer(p)).FpPk, int16(iIdx))) __2: ; if !(iIdx >= int32((*VdbeCursor)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpCsr)).FnField) || iIdx < 0) { goto __3 } rc = SQLITE_RANGE goto preupdate_old_out __3: ; if !((*PreUpdate)(unsafe.Pointer(p)).FpUnpacked == uintptr(0)) { goto __4 } nRec = Xsqlite3BtreePayloadSize(tls, *(*uintptr)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpCsr + 48))) aRec = Xsqlite3DbMallocRaw(tls, db, uint64(nRec)) if !!(aRec != 0) { goto __5 } goto preupdate_old_out __5: ; rc = Xsqlite3BtreePayload(tls, *(*uintptr)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpCsr + 48)), uint32(0), nRec, aRec) if !(rc == SQLITE_OK) { goto __6 } (*PreUpdate)(unsafe.Pointer(p)).FpUnpacked = vdbeUnpackRecord(tls, p+32, int32(nRec), aRec) if !!(int32((*PreUpdate)(unsafe.Pointer(p)).FpUnpacked) != 0) { goto __7 } rc = SQLITE_NOMEM __7: ; __6: ; if !(rc != SQLITE_OK) { goto __8 } Xsqlite3DbFree(tls, db, aRec) goto preupdate_old_out __8: ; (*PreUpdate)(unsafe.Pointer(p)).FaRecord = aRec __4: ; pMem = libc.AssignPtrUintptr(ppValue, (*UnpackedRecord)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpUnpacked)).FaMem+uintptr(iIdx)*56) if !(iIdx == int32((*Table)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpTab)).FiPKey)) { goto __9 } Xsqlite3VdbeMemSetInt64(tls, pMem, (*PreUpdate)(unsafe.Pointer(p)).FiKey1) goto __10 __9: if !(iIdx >= int32((*UnpackedRecord)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpUnpacked)).FnField)) { goto __11 } *(*uintptr)(unsafe.Pointer(ppValue)) = columnNullValue(tls) goto __12 __11: if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpTab)).FaCol+uintptr(iIdx)*24)).Faffinity) == SQLITE_AFF_REAL) { goto __13 } if !(int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Int|MEM_IntReal) != 0) { goto __14 } Xsqlite3VdbeMemRealify(tls, pMem) __14: ; __13: ; __12: ; __10: ; preupdate_old_out: Xsqlite3Error(tls, db, rc) return Xsqlite3ApiExit(tls, db, rc) } // This function is called from within a pre-update callback to retrieve // the number of columns in the row being updated, deleted or inserted. func Xsqlite3_preupdate_count(tls *libc.TLS, db uintptr) int32 { var p uintptr = (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdate return func() int32 { if p != 0 { return int32((*PreUpdate)(unsafe.Pointer(p)).Fkeyinfo.FnKeyField) } return 0 }() } // This function is designed to be called from within a pre-update callback // only. It returns zero if the change that caused the callback was made // immediately by a user SQL statement. Or, if the change was made by a // trigger program, it returns the number of trigger programs currently // on the stack (1 for a top-level trigger, 2 for a trigger fired by a // top-level trigger etc.). // // For the purposes of the previous paragraph, a foreign key CASCADE, SET NULL // or SET DEFAULT action is considered a trigger. func Xsqlite3_preupdate_depth(tls *libc.TLS, db uintptr) int32 { var p uintptr = (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdate return func() int32 { if p != 0 { return (*Vdbe)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).Fv)).FnFrame } return 0 }() } // This function is designed to be called from within a pre-update callback // only. func Xsqlite3_preupdate_blobwrite(tls *libc.TLS, db uintptr) int32 { var p uintptr = (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdate return func() int32 { if p != 0 { return (*PreUpdate)(unsafe.Pointer(p)).FiBlobWrite } return -1 }() } // This function is called from within a pre-update callback to retrieve // a field of the row currently being updated or inserted. func Xsqlite3_preupdate_new(tls *libc.TLS, db uintptr, iIdx int32, ppValue uintptr) int32 { var p uintptr var rc int32 var pMem uintptr var pData uintptr var pUnpack uintptr p = (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdate rc = SQLITE_OK if !(!(p != 0) || (*PreUpdate)(unsafe.Pointer(p)).Fop == SQLITE_DELETE) { goto __1 } rc = Xsqlite3MisuseError(tls, 89813) goto preupdate_new_out __1: ; if !((*PreUpdate)(unsafe.Pointer(p)).FpPk != 0 && (*PreUpdate)(unsafe.Pointer(p)).Fop != SQLITE_UPDATE) { goto __2 } iIdx = int32(Xsqlite3TableColumnToIndex(tls, (*PreUpdate)(unsafe.Pointer(p)).FpPk, int16(iIdx))) __2: ; if !(iIdx >= int32((*VdbeCursor)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpCsr)).FnField) || iIdx < 0) { goto __3 } rc = SQLITE_RANGE goto preupdate_new_out __3: ; if !((*PreUpdate)(unsafe.Pointer(p)).Fop == SQLITE_INSERT) { goto __4 } pUnpack = (*PreUpdate)(unsafe.Pointer(p)).FpNewUnpacked if !!(pUnpack != 0) { goto __6 } pData = (*Vdbe)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).Fv)).FaMem + uintptr((*PreUpdate)(unsafe.Pointer(p)).FiNewReg)*56 rc = func() int32 { if int32((*Mem)(unsafe.Pointer(pData)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, pData) } return 0 }() if !(rc != SQLITE_OK) { goto __7 } goto preupdate_new_out __7: ; pUnpack = vdbeUnpackRecord(tls, p+32, (*Mem)(unsafe.Pointer(pData)).Fn, (*Mem)(unsafe.Pointer(pData)).Fz) if !!(pUnpack != 0) { goto __8 } rc = SQLITE_NOMEM goto preupdate_new_out __8: ; (*PreUpdate)(unsafe.Pointer(p)).FpNewUnpacked = pUnpack __6: ; pMem = (*UnpackedRecord)(unsafe.Pointer(pUnpack)).FaMem + uintptr(iIdx)*56 if !(iIdx == int32((*Table)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpTab)).FiPKey)) { goto __9 } Xsqlite3VdbeMemSetInt64(tls, pMem, (*PreUpdate)(unsafe.Pointer(p)).FiKey2) goto __10 __9: if !(iIdx >= int32((*UnpackedRecord)(unsafe.Pointer(pUnpack)).FnField)) { goto __11 } pMem = columnNullValue(tls) __11: ; __10: ; goto __5 __4: ; if !!(int32((*PreUpdate)(unsafe.Pointer(p)).FaNew) != 0) { goto __12 } (*PreUpdate)(unsafe.Pointer(p)).FaNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Mem{}))*uint64((*VdbeCursor)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpCsr)).FnField)) if !!(int32((*PreUpdate)(unsafe.Pointer(p)).FaNew) != 0) { goto __13 } rc = SQLITE_NOMEM goto preupdate_new_out __13: ; __12: ; pMem = (*PreUpdate)(unsafe.Pointer(p)).FaNew + uintptr(iIdx)*56 if !(int32((*Mem)(unsafe.Pointer(pMem)).Fflags) == 0) { goto __14 } if !(iIdx == int32((*Table)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).FpTab)).FiPKey)) { goto __15 } Xsqlite3VdbeMemSetInt64(tls, pMem, (*PreUpdate)(unsafe.Pointer(p)).FiKey2) goto __16 __15: rc = Xsqlite3VdbeMemCopy(tls, pMem, (*Vdbe)(unsafe.Pointer((*PreUpdate)(unsafe.Pointer(p)).Fv)).FaMem+uintptr((*PreUpdate)(unsafe.Pointer(p)).FiNewReg+1+iIdx)*56) if !(rc != SQLITE_OK) { goto __17 } goto preupdate_new_out __17: ; __16: ; __14: ; __5: ; *(*uintptr)(unsafe.Pointer(ppValue)) = pMem preupdate_new_out: Xsqlite3Error(tls, db, rc) return Xsqlite3ApiExit(tls, db, rc) } func findNextHostParameter(tls *libc.TLS, zSql uintptr, pnToken uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var nTotal int32 = 0 var n int32 *(*int32)(unsafe.Pointer(pnToken)) = 0 for *(*int8)(unsafe.Pointer(zSql)) != 0 { n = Xsqlite3GetToken(tls, zSql, bp) if *(*int32)(unsafe.Pointer(bp)) == TK_VARIABLE { *(*int32)(unsafe.Pointer(pnToken)) = n break } nTotal = nTotal + n zSql += uintptr(n) } return nTotal } // This function returns a pointer to a nul-terminated string in memory // obtained from sqlite3DbMalloc(). If sqlite3.nVdbeExec is 1, then the // string contains a copy of zRawSql but with host parameters expanded to // their current bindings. Or, if sqlite3.nVdbeExec is greater than 1, // then the returned string holds a copy of zRawSql with "-- " prepended // to each line of text. // // If the SQLITE_TRACE_SIZE_LIMIT macro is defined to an integer, then // then long strings and blobs are truncated to that many bytes. This // can be used to prevent unreasonably large trace strings when dealing // with large (multi-megabyte) strings and blobs. // // The calling function is responsible for making sure the memory returned // is eventually freed. // // ALGORITHM: Scan the input string looking for host parameters in any of // these forms: ?, ?N, $A, @A, :A. Take care to avoid text within // string literals, quoted identifier names, and comments. For text forms, // the host parameter index is found by scanning the prepared // statement for the corresponding OP_Variable opcode. Once the host // parameter index is known, locate the value in p->aVar[]. Then render // the value as a literal in place of the host parameter name. func Xsqlite3VdbeExpandSql(tls *libc.TLS, p uintptr, zRawSql uintptr) uintptr { bp := tls.Alloc(144) defer tls.Free(144) var db uintptr *(*int32)(unsafe.Pointer(bp + 84)) = 0 var nextIndex int32 = 1 var n int32 var i int32 var pVar uintptr db = (*Vdbe)(unsafe.Pointer(p)).Fdb Xsqlite3StrAccumInit(tls, bp+48, uintptr(0), uintptr(0), 0, *(*int32)(unsafe.Pointer(db + 136))) if (*Sqlite3)(unsafe.Pointer(db)).FnVdbeExec > 1 { for *(*int8)(unsafe.Pointer(zRawSql)) != 0 { var zStart uintptr = zRawSql for int32(*(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zRawSql, 1)))) != '\n' && *(*int8)(unsafe.Pointer(zRawSql)) != 0 { } Xsqlite3_str_append(tls, bp+48, ts+6749, 3) Xsqlite3_str_append(tls, bp+48, zStart, int32((int64(zRawSql)-int64(zStart))/1)) } } else if int32((*Vdbe)(unsafe.Pointer(p)).FnVar) == 0 { Xsqlite3_str_append(tls, bp+48, zRawSql, Xsqlite3Strlen30(tls, zRawSql)) } else { for *(*int8)(unsafe.Pointer(zRawSql)) != 0 { n = findNextHostParameter(tls, zRawSql, bp+80) Xsqlite3_str_append(tls, bp+48, zRawSql, n) zRawSql += uintptr(n) if *(*int32)(unsafe.Pointer(bp + 80)) == 0 { break } if int32(*(*int8)(unsafe.Pointer(zRawSql))) == '?' { if *(*int32)(unsafe.Pointer(bp + 80)) > 1 { Xsqlite3GetInt32(tls, zRawSql+1, bp+84) } else { *(*int32)(unsafe.Pointer(bp + 84)) = nextIndex } } else { *(*int32)(unsafe.Pointer(bp + 84)) = Xsqlite3VdbeParameterIndex(tls, p, zRawSql, *(*int32)(unsafe.Pointer(bp + 80))) } zRawSql += uintptr(*(*int32)(unsafe.Pointer(bp + 80))) nextIndex = func() int32 { if *(*int32)(unsafe.Pointer(bp + 84))+1 > nextIndex { return *(*int32)(unsafe.Pointer(bp + 84)) + 1 } return nextIndex }() pVar = (*Vdbe)(unsafe.Pointer(p)).FaVar + uintptr(*(*int32)(unsafe.Pointer(bp + 84))-1)*56 if int32((*Mem)(unsafe.Pointer(pVar)).Fflags)&MEM_Null != 0 { Xsqlite3_str_append(tls, bp+48, ts+1545, 4) } else if int32((*Mem)(unsafe.Pointer(pVar)).Fflags)&(MEM_Int|MEM_IntReal) != 0 { Xsqlite3_str_appendf(tls, bp+48, ts+1324, libc.VaList(bp, *(*I64)(unsafe.Pointer(pVar)))) } else if int32((*Mem)(unsafe.Pointer(pVar)).Fflags)&MEM_Real != 0 { Xsqlite3_str_appendf(tls, bp+48, ts+6277, libc.VaList(bp+8, *(*float64)(unsafe.Pointer(pVar)))) } else if int32((*Mem)(unsafe.Pointer(pVar)).Fflags)&MEM_Str != 0 { var nOut int32 var enc U8 = (*Sqlite3)(unsafe.Pointer(db)).Fenc if int32(enc) != SQLITE_UTF8 { libc.Xmemset(tls, bp+88, 0, uint64(unsafe.Sizeof(Mem{}))) (*Mem)(unsafe.Pointer(bp + 88)).Fdb = db Xsqlite3VdbeMemSetStr(tls, bp+88, (*Mem)(unsafe.Pointer(pVar)).Fz, int64((*Mem)(unsafe.Pointer(pVar)).Fn), enc, uintptr(0)) if SQLITE_NOMEM == Xsqlite3VdbeChangeEncoding(tls, bp+88, SQLITE_UTF8) { (*StrAccum)(unsafe.Pointer(bp + 48)).FaccError = U8(SQLITE_NOMEM) (*StrAccum)(unsafe.Pointer(bp + 48)).FnAlloc = U32(0) } pVar = bp + 88 } nOut = (*Mem)(unsafe.Pointer(pVar)).Fn Xsqlite3_str_appendf(tls, bp+48, ts+6753, libc.VaList(bp+16, nOut, (*Mem)(unsafe.Pointer(pVar)).Fz)) if int32(enc) != SQLITE_UTF8 { Xsqlite3VdbeMemRelease(tls, bp+88) } } else if int32((*Mem)(unsafe.Pointer(pVar)).Fflags)&MEM_Zero != 0 { Xsqlite3_str_appendf(tls, bp+48, ts+6760, libc.VaList(bp+32, *(*int32)(unsafe.Pointer(pVar)))) } else { var nOut int32 Xsqlite3_str_append(tls, bp+48, ts+6773, 2) nOut = (*Mem)(unsafe.Pointer(pVar)).Fn for i = 0; i < nOut; i++ { Xsqlite3_str_appendf(tls, bp+48, ts+6776, libc.VaList(bp+40, int32(*(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pVar)).Fz + uintptr(i))))&0xff)) } Xsqlite3_str_append(tls, bp+48, ts+6781, 1) } } } if (*StrAccum)(unsafe.Pointer(bp+48)).FaccError != 0 { Xsqlite3_str_reset(tls, bp+48) } return Xsqlite3StrAccumFinish(tls, bp+48) } func allocateCursor(tls *libc.TLS, p uintptr, iCur int32, nField int32, eCurType U8) uintptr { var pMem uintptr if iCur > 0 { pMem = (*Vdbe)(unsafe.Pointer(p)).FaMem + uintptr((*Vdbe)(unsafe.Pointer(p)).FnMem-iCur)*56 } else { pMem = (*Vdbe)(unsafe.Pointer(p)).FaMem } var nByte int32 var pCx uintptr = uintptr(0) nByte = int32(uint64(unsafe.Sizeof(VdbeCursor{})) + uint64(2)*uint64(unsafe.Sizeof(U32(0)))*uint64(nField) + func() uint64 { if int32(eCurType) == CURTYPE_BTREE { return uint64(Xsqlite3BtreeCursorSize(tls)) } return uint64(0) }()) if *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr(iCur)*8)) != 0 { Xsqlite3VdbeFreeCursorNN(tls, p, *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr(iCur)*8))) *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr(iCur)*8)) = uintptr(0) } if (*Mem)(unsafe.Pointer(pMem)).FszMalloc < nByte { if (*Mem)(unsafe.Pointer(pMem)).FszMalloc > 0 { Xsqlite3DbFreeNN(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, (*Mem)(unsafe.Pointer(pMem)).FzMalloc) } (*Mem)(unsafe.Pointer(pMem)).Fz = libc.AssignPtrUintptr(pMem+40, Xsqlite3DbMallocRaw(tls, (*Mem)(unsafe.Pointer(pMem)).Fdb, uint64(nByte))) if (*Mem)(unsafe.Pointer(pMem)).FzMalloc == uintptr(0) { (*Mem)(unsafe.Pointer(pMem)).FszMalloc = 0 return uintptr(0) } (*Mem)(unsafe.Pointer(pMem)).FszMalloc = nByte } *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr(iCur)*8)) = libc.AssignUintptr(&pCx, (*Mem)(unsafe.Pointer(pMem)).FzMalloc) libc.Xmemset(tls, pCx, 0, uint64(uintptr(0)+40)) (*VdbeCursor)(unsafe.Pointer(pCx)).FeCurType = eCurType (*VdbeCursor)(unsafe.Pointer(pCx)).FnField = I16(nField) (*VdbeCursor)(unsafe.Pointer(pCx)).FaOffset = pCx + 112 + uintptr(nField)*4 if int32(eCurType) == CURTYPE_BTREE { *(*uintptr)(unsafe.Pointer(pCx + 48)) = (*Mem)(unsafe.Pointer(pMem)).Fz + uintptr(uint64(unsafe.Sizeof(VdbeCursor{}))+uint64(2)*uint64(unsafe.Sizeof(U32(0)))*uint64(nField)) Xsqlite3BtreeCursorZero(tls, *(*uintptr)(unsafe.Pointer(pCx + 48))) } return pCx } func alsoAnInt(tls *libc.TLS, pRec uintptr, rValue float64, piValue uintptr) int32 { var iValue I64 iValue = Xsqlite3RealToI64(tls, rValue) if Xsqlite3RealSameAsInt(tls, rValue, iValue) != 0 { *(*I64)(unsafe.Pointer(piValue)) = iValue return 1 } return libc.Bool32(0 == Xsqlite3Atoi64(tls, (*Mem)(unsafe.Pointer(pRec)).Fz, piValue, (*Mem)(unsafe.Pointer(pRec)).Fn, (*Mem)(unsafe.Pointer(pRec)).Fenc)) } func applyNumericAffinity(tls *libc.TLS, pRec uintptr, bTryForInt int32) { bp := tls.Alloc(8) defer tls.Free(8) var enc U8 = (*Mem)(unsafe.Pointer(pRec)).Fenc var rc int32 rc = Xsqlite3AtoF(tls, (*Mem)(unsafe.Pointer(pRec)).Fz, bp, (*Mem)(unsafe.Pointer(pRec)).Fn, enc) if rc <= 0 { return } if rc == 1 && alsoAnInt(tls, pRec, *(*float64)(unsafe.Pointer(bp)), pRec) != 0 { *(*U16)(unsafe.Pointer(pRec + 20)) |= U16(MEM_Int) } else { *(*float64)(unsafe.Pointer(pRec)) = *(*float64)(unsafe.Pointer(bp)) *(*U16)(unsafe.Pointer(pRec + 20)) |= U16(MEM_Real) if bTryForInt != 0 { Xsqlite3VdbeIntegerAffinity(tls, pRec) } } *(*U16)(unsafe.Pointer(pRec + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Str)) } func applyAffinity(tls *libc.TLS, pRec uintptr, affinity int8, enc U8) { if int32(affinity) >= SQLITE_AFF_NUMERIC { if int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Int == 0 { if int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&(MEM_Real|MEM_IntReal) == 0 { if int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Str != 0 { applyNumericAffinity(tls, pRec, 1) } } else if int32(affinity) <= SQLITE_AFF_REAL { Xsqlite3VdbeIntegerAffinity(tls, pRec) } } } else if int32(affinity) == SQLITE_AFF_TEXT { if 0 == int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Str { if int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&(MEM_Real|MEM_Int|MEM_IntReal) != 0 { Xsqlite3VdbeMemStringify(tls, pRec, enc, uint8(1)) } } *(*U16)(unsafe.Pointer(pRec + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Real | MEM_Int | MEM_IntReal)) } } // Try to convert the type of a function argument or a result column // into a numeric representation. Use either INTEGER or REAL whichever // is appropriate. But only do the conversion if it is possible without // loss of information and return the revised type of the argument. func Xsqlite3_value_numeric_type(tls *libc.TLS, pVal uintptr) int32 { var eType int32 = Xsqlite3_value_type(tls, pVal) if eType == SQLITE_TEXT { var pMem uintptr = pVal applyNumericAffinity(tls, pMem, 0) eType = Xsqlite3_value_type(tls, pVal) } return eType } // Exported version of applyAffinity(). This one works on sqlite3_value*, // not the internal Mem* type. func Xsqlite3ValueApplyAffinity(tls *libc.TLS, pVal uintptr, affinity U8, enc U8) { applyAffinity(tls, pVal, int8(affinity), enc) } func computeNumericType(tls *libc.TLS, pMem uintptr) U16 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 if func() int32 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, pMem) } return 0 }() != 0 { *(*I64)(unsafe.Pointer(pMem)) = int64(0) return U16(MEM_Int) } rc = Xsqlite3AtoF(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, pMem, (*Mem)(unsafe.Pointer(pMem)).Fn, (*Mem)(unsafe.Pointer(pMem)).Fenc) if rc <= 0 { if rc == 0 && Xsqlite3Atoi64(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, bp, (*Mem)(unsafe.Pointer(pMem)).Fn, (*Mem)(unsafe.Pointer(pMem)).Fenc) <= 1 { *(*I64)(unsafe.Pointer(pMem)) = *(*Sqlite3_int64)(unsafe.Pointer(bp)) return U16(MEM_Int) } else { return U16(MEM_Real) } } else if rc == 1 && Xsqlite3Atoi64(tls, (*Mem)(unsafe.Pointer(pMem)).Fz, bp, (*Mem)(unsafe.Pointer(pMem)).Fn, (*Mem)(unsafe.Pointer(pMem)).Fenc) == 0 { *(*I64)(unsafe.Pointer(pMem)) = *(*Sqlite3_int64)(unsafe.Pointer(bp)) return U16(MEM_Int) } return U16(MEM_Real) } func numericType(tls *libc.TLS, pMem uintptr) U16 { if int32((*Mem)(unsafe.Pointer(pMem)).Fflags)&(MEM_Int|MEM_Real|MEM_IntReal|MEM_Null) != 0 { return U16(int32((*Mem)(unsafe.Pointer(pMem)).Fflags) & (MEM_Int | MEM_Real | MEM_IntReal | MEM_Null)) } return computeNumericType(tls, pMem) return U16(0) } func out2PrereleaseWithClear(tls *libc.TLS, pOut uintptr) uintptr { Xsqlite3VdbeMemSetNull(tls, pOut) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Int) return pOut } func out2Prerelease(tls *libc.TLS, p uintptr, pOp uintptr) uintptr { var pOut uintptr pOut = (*Vdbe)(unsafe.Pointer(p)).FaMem + uintptr((*VdbeOp)(unsafe.Pointer(pOp)).Fp2)*56 if int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&(MEM_Agg|MEM_Dyn) != 0 { return out2PrereleaseWithClear(tls, pOut) } else { (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Int) return pOut } return uintptr(0) } func filterHash(tls *libc.TLS, aMem uintptr, pOp uintptr) U64 { var i int32 var mx int32 var h U64 = uint64(0) i = (*Op)(unsafe.Pointer(pOp)).Fp3 mx = i + *(*int32)(unsafe.Pointer(pOp + 16)) for ; i < mx; i++ { var p uintptr = aMem + uintptr(i)*56 if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_Int|MEM_IntReal) != 0 { h = h + U64(*(*I64)(unsafe.Pointer(p))) } else if int32((*Mem)(unsafe.Pointer(p)).Fflags)&MEM_Real != 0 { h = h + U64(Xsqlite3VdbeIntValue(tls, p)) } else if int32((*Mem)(unsafe.Pointer(p)).Fflags)&(MEM_Str|MEM_Blob) != 0 { } } return h } func vdbeMemTypeName(tls *libc.TLS, pMem uintptr) uintptr { return azTypes[Xsqlite3_value_type(tls, pMem)-1] } var azTypes = [5]uintptr{ ts + 1105, ts + 1117, ts + 1122, ts + 1100, ts + 1545, } // Execute as much of a VDBE program as we can. // This is the core of sqlite3_step(). func Xsqlite3VdbeExec(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(1048) defer tls.Free(1048) var aOp uintptr var pOp uintptr var rc int32 var db uintptr var resetSchemaOnFault U8 var encoding U8 var iCompare int32 var nVmStep U64 var nProgressLimit U64 var aMem uintptr var pIn1 uintptr var pIn2 uintptr var pIn3 uintptr var pOut uintptr var iPrior U32 var pCaller uintptr var pcDest int32 var pFrame uintptr var pcx int32 var cnt int32 var nullFlag U16 var pVar uintptr var n int32 var p1 int32 var p2 int32 var n1 int32 var nByte I64 var flags1 U16 var flags2 U16 var type1 U16 var type2 U16 var iA I64 var rA float64 var rB float64 var iB1 I64 var op U8 var res int32 var res2 int32 var affinity int8 var flags11 U16 var flags3 U16 var n2 int32 var i int32 var p11 int32 var p21 int32 var pKeyInfo uintptr var idx U32 var pColl uintptr var bRev int32 var aPermute uintptr var v1 int32 var v2 int32 var iAddr U32 var c int32 var c1 int32 var pC uintptr var typeMask U16 var serialType U32 var pC1 uintptr var pC2 uintptr var iMap U32 var p22 U32 var pC3 uintptr var pCrsr uintptr var aOffset uintptr var len int32 var i1 int32 var pDest uintptr var zData uintptr var zHdr uintptr var zEndHdr uintptr var offset64 U64 var pReg uintptr var pTab uintptr var aCol uintptr var i2 int32 var zAffinity uintptr var i3 I64 var uu U64 var i4 U32 var pRec uintptr var nData U64 var nHdr int32 var nByte1 I64 var nZero I64 var nVarint int32 var serial_type U32 var pData0 uintptr var pLast uintptr var nField int32 var zAffinity1 uintptr var len1 U32 var zHdr1 uintptr var zPayload uintptr var pCrsr1 uintptr var isSchemaChange int32 var isTransaction int32 var p12 int32 var zName uintptr var nName int32 var pNew uintptr var pSavepoint uintptr var pTmp uintptr var iSavepoint int32 var ii int32 var desiredAutoCommit int32 var iRollback int32 var pBt uintptr var pDb uintptr var iDb int32 var iCookie int32 var pDb1 uintptr var nField1 int32 var pKeyInfo1 uintptr var p23 U32 var iDb1 int32 var wrFlag int32 var pX uintptr var pCur uintptr var pDb2 uintptr var pOrig uintptr var pCx uintptr var pCx1 uintptr var pKeyInfo2 uintptr var pCx2 uintptr var pC4 uintptr var pCx3 uintptr var c2 int32 var flags31 U16 var newType U16 var oc int32 var pC5 uintptr var nField2 int32 var iKey I64 var eqOnly int32 var pC6 uintptr var nStep int32 var pC7 uintptr var pCur1 uintptr var pC8 uintptr var alreadyExists int32 var ii1 int32 var pC9 uintptr var pIdxKey uintptr var pC10 uintptr var pCrsr2 uintptr var iKey1 U64 var pC11 uintptr var cnt1 int32 var pMem uintptr var pFrame1 uintptr var pData uintptr var pKey uintptr var pC12 uintptr var seekResult int32 var zDb uintptr var pTab1 uintptr var pDest1 uintptr var pSrc uintptr var iKey2 I64 var pC13 uintptr var zDb1 uintptr var pTab2 uintptr var opflags int32 var pC14 uintptr var nKeyCol int32 var pC15 uintptr var pC16 uintptr var pCrsr3 uintptr var n3 U32 var pC17 uintptr var pVtab uintptr var pModule uintptr var pC18 uintptr var pC19 uintptr var pCrsr4 uintptr var pC20 uintptr var pCrsr5 uintptr var sz I64 var pC21 uintptr var pCrsr6 uintptr var pC22 uintptr var pC23 uintptr var pC24 uintptr var pC25 uintptr var pCrsr7 uintptr var pC26 uintptr var pTabCur uintptr var pC27 uintptr var nCellKey I64 var pCur2 uintptr var pC28 uintptr var res11 int32 var iDb2 int32 var pC29 uintptr var pDb3 uintptr var iDb3 int32 var zSchema uintptr var zSql uintptr var nRoot int32 var aRoot uintptr var pnErr uintptr var iSet int32 var exists int32 var nMem int32 var nByte2 int32 var pRt uintptr var pMem1 uintptr var pEnd uintptr var pFrame2 uintptr var pProgram uintptr var t1 uintptr var pFrame3 uintptr var pIn uintptr var pFrame4 uintptr var n4 int32 var pCtx uintptr var i5 int32 var pCtx1 uintptr var pMem2 uintptr var pMem3 uintptr var i6 int32 var pMem4 uintptr var pBt1 uintptr var pPager uintptr var eNew int32 var eOld int32 var zFilename uintptr var pBt2 uintptr var pC30 uintptr var pC31 uintptr var z1 uintptr var p13 int32 var isWriteLock U8 var pVTab uintptr var zTab uintptr var pCur3 uintptr var pVtab1 uintptr var pModule1 uintptr var pC32 uintptr var pRhs uintptr var nArg int32 var iQuery int32 var pModule2 uintptr var pQuery uintptr var pArgc uintptr var pVCur1 uintptr var pVtab2 uintptr var pCur4 uintptr var res12 int32 var i7 int32 var apArg uintptr var pVtab3 uintptr var pModule3 uintptr var pDest2 uintptr var pCur5 uintptr var pVtab4 uintptr var pModule4 uintptr var res13 int32 var pCur6 uintptr var pVtab5 uintptr var pName uintptr var isLegacy int32 var vtabOnConflict U8 var pVtab6 uintptr var pModule5 uintptr var nArg1 int32 var i8 int32 var apArg1 uintptr var pX1 uintptr var newMax uint32 var pBt3 uintptr var i9 int32 var pCtx2 uintptr var h U64 var h1 U64 var z2 uintptr var z3 uintptr var i10 int32 var zTrace uintptr aOp = (*Vdbe)(unsafe.Pointer(p)).FaOp pOp = aOp rc = SQLITE_OK db = (*Vdbe)(unsafe.Pointer(p)).Fdb resetSchemaOnFault = U8(0) encoding = (*Sqlite3)(unsafe.Pointer(db)).Fenc iCompare = 0 nVmStep = uint64(0) aMem = (*Vdbe)(unsafe.Pointer(p)).FaMem pIn1 = uintptr(0) pIn2 = uintptr(0) pIn3 = uintptr(0) pOut = uintptr(0) if !((*Vdbe)(unsafe.Pointer(p)).FlockMask != YDbMask(0)) { goto __1 } Xsqlite3VdbeEnter(tls, p) __1: ; if !((*Sqlite3)(unsafe.Pointer(db)).FxProgress != 0) { goto __2 } iPrior = *(*U32)(unsafe.Pointer(p + 212 + 4*4)) nProgressLimit = U64((*Sqlite3)(unsafe.Pointer(db)).FnProgressOps - iPrior%(*Sqlite3)(unsafe.Pointer(db)).FnProgressOps) goto __3 __2: nProgressLimit = uint64(0xffffffff) | uint64(0xffffffff)<<32 __3: ; if !((*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_NOMEM) { goto __4 } goto no_mem __4: ; (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_OK (*Vdbe)(unsafe.Pointer(p)).FiCurrentTime = int64(0) (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FnBusy = 0 if !(libc.AtomicLoadNInt32(db+432, 0) != 0) { goto __5 } goto abort_due_to_interrupt __5: ; pOp = aOp + uintptr((*Vdbe)(unsafe.Pointer(p)).Fpc)*24 __6: if !(1 != 0) { goto __8 } nVmStep++ switch int32((*Op)(unsafe.Pointer(pOp)).Fopcode) { case OP_Goto: goto __10 case OP_Gosub: goto __11 case OP_Return: goto __12 case OP_InitCoroutine: goto __13 case OP_EndCoroutine: goto __14 case OP_Yield: goto __15 case OP_HaltIfNull: goto __16 case OP_Halt: goto __17 case OP_Integer: goto __18 case OP_Int64: goto __19 case OP_Real: goto __20 case OP_String8: goto __21 case OP_String: goto __22 case OP_BeginSubrtn: goto __23 case OP_Null: goto __24 case OP_SoftNull: goto __25 case OP_Blob: goto __26 case OP_Variable: goto __27 case OP_Move: goto __28 case OP_Copy: goto __29 case OP_SCopy: goto __30 case OP_IntCopy: goto __31 case OP_FkCheck: goto __32 case OP_ResultRow: goto __33 case OP_Concat: goto __34 case OP_Add: goto __35 case OP_Subtract: goto __36 case OP_Multiply: goto __37 case OP_Divide: goto __38 case OP_Remainder: goto __39 case OP_CollSeq: goto __40 case OP_BitAnd: goto __41 case OP_BitOr: goto __42 case OP_ShiftLeft: goto __43 case OP_ShiftRight: goto __44 case OP_AddImm: goto __45 case OP_MustBeInt: goto __46 case OP_RealAffinity: goto __47 case OP_Cast: goto __48 case OP_Eq: goto __49 case OP_Ne: goto __50 case OP_Lt: goto __51 case OP_Le: goto __52 case OP_Gt: goto __53 case OP_Ge: goto __54 case OP_ElseEq: goto __55 case OP_Permutation: goto __56 case OP_Compare: goto __57 case OP_Jump: goto __58 case OP_And: goto __59 case OP_Or: goto __60 case OP_IsTrue: goto __61 case OP_Not: goto __62 case OP_BitNot: goto __63 case OP_Once: goto __64 case OP_If: goto __65 case OP_IfNot: goto __66 case OP_IsNull: goto __67 case OP_IsType: goto __68 case OP_ZeroOrNull: goto __69 case OP_NotNull: goto __70 case OP_IfNullRow: goto __71 case OP_Offset: goto __72 case OP_Column: goto __73 case OP_TypeCheck: goto __74 case OP_Affinity: goto __75 case OP_MakeRecord: goto __76 case OP_Count: goto __77 case OP_Savepoint: goto __78 case OP_AutoCommit: goto __79 case OP_Transaction: goto __80 case OP_ReadCookie: goto __81 case OP_SetCookie: goto __82 case OP_ReopenIdx: goto __83 case OP_OpenRead: goto __84 case OP_OpenWrite: goto __85 case OP_OpenDup: goto __86 case OP_OpenAutoindex: goto __87 case OP_OpenEphemeral: goto __88 case OP_SorterOpen: goto __89 case OP_SequenceTest: goto __90 case OP_OpenPseudo: goto __91 case OP_Close: goto __92 case OP_SeekLT: goto __93 case OP_SeekLE: goto __94 case OP_SeekGE: goto __95 case OP_SeekGT: goto __96 case OP_SeekScan: goto __97 case OP_SeekHit: goto __98 case OP_IfNotOpen: goto __99 case OP_IfNoHope: goto __100 case OP_NoConflict: goto __101 case OP_NotFound: goto __102 case OP_Found: goto __103 case OP_SeekRowid: goto __104 case OP_NotExists: goto __105 case OP_Sequence: goto __106 case OP_NewRowid: goto __107 case OP_Insert: goto __108 case OP_RowCell: goto __109 case OP_Delete: goto __110 case OP_ResetCount: goto __111 case OP_SorterCompare: goto __112 case OP_SorterData: goto __113 case OP_RowData: goto __114 case OP_Rowid: goto __115 case OP_NullRow: goto __116 case OP_SeekEnd: goto __117 case OP_Last: goto __118 case OP_IfSmaller: goto __119 case OP_SorterSort: goto __120 case OP_Sort: goto __121 case OP_Rewind: goto __122 case OP_SorterNext: goto __123 case OP_Prev: goto __124 case OP_Next: goto __125 case OP_IdxInsert: goto __126 case OP_SorterInsert: goto __127 case OP_IdxDelete: goto __128 case OP_DeferredSeek: goto __129 case OP_IdxRowid: goto __130 case OP_FinishSeek: goto __131 case OP_IdxLE: goto __132 case OP_IdxGT: goto __133 case OP_IdxLT: goto __134 case OP_IdxGE: goto __135 case OP_Destroy: goto __136 case OP_Clear: goto __137 case OP_ResetSorter: goto __138 case OP_CreateBtree: goto __139 case OP_SqlExec: goto __140 case OP_ParseSchema: goto __141 case OP_LoadAnalysis: goto __142 case OP_DropTable: goto __143 case OP_DropIndex: goto __144 case OP_DropTrigger: goto __145 case OP_IntegrityCk: goto __146 case OP_RowSetAdd: goto __147 case OP_RowSetRead: goto __148 case OP_RowSetTest: goto __149 case OP_Program: goto __150 case OP_Param: goto __151 case OP_FkCounter: goto __152 case OP_FkIfZero: goto __153 case OP_MemMax: goto __154 case OP_IfPos: goto __155 case OP_OffsetLimit: goto __156 case OP_IfNotZero: goto __157 case OP_DecrJumpZero: goto __158 case OP_AggInverse: goto __159 case OP_AggStep: goto __160 case OP_AggStep1: goto __161 case OP_AggValue: goto __162 case OP_AggFinal: goto __163 case OP_Checkpoint: goto __164 case OP_JournalMode: goto __165 case OP_Vacuum: goto __166 case OP_IncrVacuum: goto __167 case OP_Expire: goto __168 case OP_CursorLock: goto __169 case OP_CursorUnlock: goto __170 case OP_TableLock: goto __171 case OP_VBegin: goto __172 case OP_VCreate: goto __173 case OP_VDestroy: goto __174 case OP_VOpen: goto __175 case OP_VInitIn: goto __176 case OP_VFilter: goto __177 case OP_VColumn: goto __178 case OP_VNext: goto __179 case OP_VRename: goto __180 case OP_VUpdate: goto __181 case OP_Pagecount: goto __182 case OP_MaxPgcnt: goto __183 case OP_PureFunc: goto __184 case OP_Function: goto __185 case OP_ClrSubtype: goto __186 case OP_FilterAdd: goto __187 case OP_Filter: goto __188 case OP_Trace: goto __189 case OP_Init: goto __190 default: goto __191 } goto __9 __10: jump_to_p2_and_check_for_interrupt: pOp = aOp + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2-1)*24 check_for_interrupt: if !(libc.AtomicLoadNInt32(db+432, 0) != 0) { goto __192 } goto abort_due_to_interrupt __192: ; __193: if !(nVmStep >= nProgressLimit && (*Sqlite3)(unsafe.Pointer(db)).FxProgress != uintptr(0)) { goto __194 } nProgressLimit = nProgressLimit + U64((*Sqlite3)(unsafe.Pointer(db)).FnProgressOps) if !((*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxProgress})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpProgressArg) != 0) { goto __195 } nProgressLimit = uint64(0xffffffff) | uint64(0xffffffff)<<32 rc = SQLITE_INTERRUPT goto abort_due_to_error __195: ; goto __193 __194: ; goto __9 __11: ; pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 (*Mem)(unsafe.Pointer(pIn1)).Fflags = U16(MEM_Int) *(*I64)(unsafe.Pointer(pIn1)) = I64(int32((int64(pOp) - int64(aOp)) / 24)) goto jump_to_p2_and_check_for_interrupt __12: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Int != 0) { goto __196 } if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __198 } __198: ; pOp = aOp + uintptr(*(*I64)(unsafe.Pointer(pIn1)))*24 goto __197 __196: if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __199 } __199: ; __197: ; goto __9 __13: ; pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 *(*I64)(unsafe.Pointer(pOut)) = I64((*Op)(unsafe.Pointer(pOp)).Fp3 - 1) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Int) if !((*Op)(unsafe.Pointer(pOp)).Fp2 == 0) { goto __200 } goto __9 __200: ; jump_to_p2: ; pOp = aOp + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2-1)*24 goto __9 __14: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pCaller = aOp + uintptr(*(*I64)(unsafe.Pointer(pIn1)))*24 pOp = aOp + uintptr((*VdbeOp)(unsafe.Pointer(pCaller)).Fp2-1)*24 (*Mem)(unsafe.Pointer(pIn1)).Fflags = U16(MEM_Undefined) goto __9 __15: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 (*Mem)(unsafe.Pointer(pIn1)).Fflags = U16(MEM_Int) pcDest = int32(*(*I64)(unsafe.Pointer(pIn1))) *(*I64)(unsafe.Pointer(pIn1)) = I64(int32((int64(pOp) - int64(aOp)) / 24)) pOp = aOp + uintptr(pcDest)*24 goto __9 __16: pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(int32((*Mem)(unsafe.Pointer(pIn3)).Fflags)&MEM_Null == 0) { goto __201 } goto __9 __201: ; __17: ; if !((*Vdbe)(unsafe.Pointer(p)).FpFrame != 0 && (*Op)(unsafe.Pointer(pOp)).Fp1 == SQLITE_OK) { goto __202 } pFrame = (*Vdbe)(unsafe.Pointer(p)).FpFrame (*Vdbe)(unsafe.Pointer(p)).FpFrame = (*VdbeFrame)(unsafe.Pointer(pFrame)).FpParent (*Vdbe)(unsafe.Pointer(p)).FnFrame-- Xsqlite3VdbeSetChanges(tls, db, (*Vdbe)(unsafe.Pointer(p)).FnChange) pcx = Xsqlite3VdbeFrameRestore(tls, pFrame) if !((*Op)(unsafe.Pointer(pOp)).Fp2 == OE_Ignore) { goto __203 } pcx = (*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp+uintptr(pcx)*24)).Fp2 - 1 __203: ; aOp = (*Vdbe)(unsafe.Pointer(p)).FaOp aMem = (*Vdbe)(unsafe.Pointer(p)).FaMem pOp = aOp + uintptr(pcx)*24 goto __9 __202: ; (*Vdbe)(unsafe.Pointer(p)).Frc = (*Op)(unsafe.Pointer(pOp)).Fp1 (*Vdbe)(unsafe.Pointer(p)).FerrorAction = U8((*Op)(unsafe.Pointer(pOp)).Fp2) if !((*Vdbe)(unsafe.Pointer(p)).Frc != 0) { goto __204 } if !((*Op)(unsafe.Pointer(pOp)).Fp5 != 0) { goto __205 } Xsqlite3VdbeError(tls, p, ts+6783, libc.VaList(bp, azType[int32((*Op)(unsafe.Pointer(pOp)).Fp5)-1])) if !(*(*uintptr)(unsafe.Pointer(pOp + 16)) != 0) { goto __207 } (*Vdbe)(unsafe.Pointer(p)).FzErrMsg = Xsqlite3MPrintf(tls, db, ts+6804, libc.VaList(bp+8, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg, *(*uintptr)(unsafe.Pointer(pOp + 16)))) __207: ; goto __206 __205: Xsqlite3VdbeError(tls, p, ts+4493, libc.VaList(bp+24, *(*uintptr)(unsafe.Pointer(pOp + 16)))) __206: ; pcx = int32((int64(pOp) - int64(aOp)) / 24) Xsqlite3_log(tls, (*Op)(unsafe.Pointer(pOp)).Fp1, ts+6811, libc.VaList(bp+32, pcx, (*Vdbe)(unsafe.Pointer(p)).FzSql, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg)) __204: ; rc = Xsqlite3VdbeHalt(tls, p) if !(rc == SQLITE_BUSY) { goto __208 } (*Vdbe)(unsafe.Pointer(p)).Frc = SQLITE_BUSY goto __209 __208: ; if (*Vdbe)(unsafe.Pointer(p)).Frc != 0 { rc = SQLITE_ERROR } else { rc = SQLITE_DONE } __209: ; goto vdbe_return __18: pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(pOut)) = I64((*Op)(unsafe.Pointer(pOp)).Fp1) goto __9 __19: pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))) goto __9 __20: pOut = out2Prerelease(tls, p, pOp) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Real) *(*float64)(unsafe.Pointer(pOut)) = *(*float64)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))) goto __9 __21: ; pOut = out2Prerelease(tls, p, pOp) (*Op)(unsafe.Pointer(pOp)).Fp1 = Xsqlite3Strlen30(tls, *(*uintptr)(unsafe.Pointer(pOp + 16))) if !(int32(encoding) != SQLITE_UTF8) { goto __210 } rc = Xsqlite3VdbeMemSetStr(tls, pOut, *(*uintptr)(unsafe.Pointer(pOp + 16)), int64(-1), uint8(SQLITE_UTF8), uintptr(0)) if !(rc != 0) { goto __211 } goto too_big __211: ; if !(SQLITE_OK != Xsqlite3VdbeChangeEncoding(tls, pOut, int32(encoding))) { goto __212 } goto no_mem __212: ; (*Mem)(unsafe.Pointer(pOut)).FszMalloc = 0 *(*U16)(unsafe.Pointer(pOut + 20)) |= U16(MEM_Static) if !(int32((*Op)(unsafe.Pointer(pOp)).Fp4type) == -6) { goto __213 } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(pOp + 16))) __213: ; (*Op)(unsafe.Pointer(pOp)).Fp4type = int8(-6) *(*uintptr)(unsafe.Pointer(pOp + 16)) = (*Mem)(unsafe.Pointer(pOut)).Fz (*Op)(unsafe.Pointer(pOp)).Fp1 = (*Mem)(unsafe.Pointer(pOut)).Fn __210: ; if !((*Op)(unsafe.Pointer(pOp)).Fp1 > *(*int32)(unsafe.Pointer(db + 136))) { goto __214 } goto too_big __214: ; (*Op)(unsafe.Pointer(pOp)).Fopcode = U8(OP_String) __22: ; pOut = out2Prerelease(tls, p, pOp) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Str | MEM_Static | MEM_Term) (*Mem)(unsafe.Pointer(pOut)).Fz = *(*uintptr)(unsafe.Pointer(pOp + 16)) (*Mem)(unsafe.Pointer(pOut)).Fn = (*Op)(unsafe.Pointer(pOp)).Fp1 (*Mem)(unsafe.Pointer(pOut)).Fenc = encoding goto __9 __23: __24: pOut = out2Prerelease(tls, p, pOp) cnt = (*Op)(unsafe.Pointer(pOp)).Fp3 - (*Op)(unsafe.Pointer(pOp)).Fp2 (*Mem)(unsafe.Pointer(pOut)).Fflags = libc.AssignUint16(&nullFlag, func() uint16 { if (*Op)(unsafe.Pointer(pOp)).Fp1 != 0 { return uint16(MEM_Null | MEM_Cleared) } return uint16(MEM_Null) }()) (*Mem)(unsafe.Pointer(pOut)).Fn = 0 __215: if !(cnt > 0) { goto __216 } pOut += 56 Xsqlite3VdbeMemSetNull(tls, pOut) (*Mem)(unsafe.Pointer(pOut)).Fflags = nullFlag (*Mem)(unsafe.Pointer(pOut)).Fn = 0 cnt-- goto __215 __216: ; goto __9 __25: ; pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_Undefined|MEM_AffMask) | MEM_Null) goto __9 __26: ; pOut = out2Prerelease(tls, p, pOp) if !(*(*uintptr)(unsafe.Pointer(pOp + 16)) == uintptr(0)) { goto __217 } Xsqlite3VdbeMemSetZeroBlob(tls, pOut, (*Op)(unsafe.Pointer(pOp)).Fp1) if !(Xsqlite3VdbeMemExpandBlob(tls, pOut) != 0) { goto __219 } goto no_mem __219: ; goto __218 __217: Xsqlite3VdbeMemSetStr(tls, pOut, *(*uintptr)(unsafe.Pointer(pOp + 16)), int64((*Op)(unsafe.Pointer(pOp)).Fp1), uint8(0), uintptr(0)) __218: ; (*Mem)(unsafe.Pointer(pOut)).Fenc = encoding goto __9 __27: ; pVar = (*Vdbe)(unsafe.Pointer(p)).FaVar + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1-1)*56 if !(Xsqlite3VdbeMemTooBig(tls, pVar) != 0) { goto __220 } goto too_big __220: ; pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 if !(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&(MEM_Agg|MEM_Dyn) != 0) { goto __221 } Xsqlite3VdbeMemSetNull(tls, pOut) __221: ; libc.Xmemcpy(tls, pOut, pVar, uint64(uintptr(0)+24)) *(*U16)(unsafe.Pointer(pOut + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Dyn | MEM_Ephem)) *(*U16)(unsafe.Pointer(pOut + 20)) |= U16(MEM_Static | MEM_FromBind) goto __9 __28: n = (*Op)(unsafe.Pointer(pOp)).Fp3 p1 = (*Op)(unsafe.Pointer(pOp)).Fp1 p2 = (*Op)(unsafe.Pointer(pOp)).Fp2 pIn1 = aMem + uintptr(p1)*56 pOut = aMem + uintptr(p2)*56 __222: ; Xsqlite3VdbeMemMove(tls, pOut, pIn1) if !(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&MEM_Ephem != 0 && Xsqlite3VdbeMemMakeWriteable(tls, pOut) != 0) { goto __225 } goto no_mem __225: ; pIn1 += 56 pOut += 56 goto __223 __223: if libc.PreDecInt32(&n, 1) != 0 { goto __222 } goto __224 __224: ; goto __9 __29: n1 = (*Op)(unsafe.Pointer(pOp)).Fp3 pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 __226: if !(1 != 0) { goto __227 } Xsqlite3VdbeMemShallowCopy(tls, pOut, pIn1, MEM_Ephem) if !(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&MEM_Ephem != 0 && Xsqlite3VdbeMemMakeWriteable(tls, pOut) != 0) { goto __228 } goto no_mem __228: ; if !(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&MEM_Subtype != 0 && int32((*Op)(unsafe.Pointer(pOp)).Fp5)&0x0002 != 0) { goto __229 } *(*U16)(unsafe.Pointer(pOut + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Subtype)) __229: ; if !(libc.PostDecInt32(&n1, 1) == 0) { goto __230 } goto __227 __230: ; pOut += 56 pIn1 += 56 goto __226 __227: ; goto __9 __30: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 Xsqlite3VdbeMemShallowCopy(tls, pOut, pIn1, MEM_Ephem) goto __9 __31: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 Xsqlite3VdbeMemSetInt64(tls, pOut, *(*I64)(unsafe.Pointer(pIn1))) goto __9 __32: if !(libc.AssignInt32(&rc, Xsqlite3VdbeCheckFk(tls, p, 0)) != SQLITE_OK) { goto __231 } goto abort_due_to_error __231: ; goto __9 __33: ; (*Vdbe)(unsafe.Pointer(p)).FcacheCtr = (*Vdbe)(unsafe.Pointer(p)).FcacheCtr + U32(2) | U32(1) (*Vdbe)(unsafe.Pointer(p)).FpResultRow = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __232 } goto no_mem __232: ; if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmTrace)&SQLITE_TRACE_ROW != 0) { goto __233 } (*struct { f func(*libc.TLS, U32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(db + 248))})).f(tls, uint32(SQLITE_TRACE_ROW), (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg, p, uintptr(0)) __233: ; (*Vdbe)(unsafe.Pointer(p)).Fpc = int32((int64(pOp)-int64(aOp))/24) + 1 rc = SQLITE_ROW goto vdbe_return __34: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pIn2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 flags1 = (*Mem)(unsafe.Pointer(pIn1)).Fflags if !((int32(flags1)|int32((*Mem)(unsafe.Pointer(pIn2)).Fflags))&MEM_Null != 0) { goto __234 } Xsqlite3VdbeMemSetNull(tls, pOut) goto __9 __234: ; if !(int32(flags1)&(MEM_Str|MEM_Blob) == 0) { goto __235 } if !(Xsqlite3VdbeMemStringify(tls, pIn1, encoding, uint8(0)) != 0) { goto __237 } goto no_mem __237: ; flags1 = U16(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags) & libc.CplInt32(MEM_Str)) goto __236 __235: if !(int32(flags1)&MEM_Zero != 0) { goto __238 } if !(Xsqlite3VdbeMemExpandBlob(tls, pIn1) != 0) { goto __239 } goto no_mem __239: ; flags1 = U16(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags) & libc.CplInt32(MEM_Str)) __238: ; __236: ; flags2 = (*Mem)(unsafe.Pointer(pIn2)).Fflags if !(int32(flags2)&(MEM_Str|MEM_Blob) == 0) { goto __240 } if !(Xsqlite3VdbeMemStringify(tls, pIn2, encoding, uint8(0)) != 0) { goto __242 } goto no_mem __242: ; flags2 = U16(int32((*Mem)(unsafe.Pointer(pIn2)).Fflags) & libc.CplInt32(MEM_Str)) goto __241 __240: if !(int32(flags2)&MEM_Zero != 0) { goto __243 } if !(Xsqlite3VdbeMemExpandBlob(tls, pIn2) != 0) { goto __244 } goto no_mem __244: ; flags2 = U16(int32((*Mem)(unsafe.Pointer(pIn2)).Fflags) & libc.CplInt32(MEM_Str)) __243: ; __241: ; nByte = I64((*Mem)(unsafe.Pointer(pIn1)).Fn + (*Mem)(unsafe.Pointer(pIn2)).Fn) if !(nByte > I64(*(*int32)(unsafe.Pointer(db + 136)))) { goto __245 } goto too_big __245: ; if !(Xsqlite3VdbeMemGrow(tls, pOut, int32(nByte)+2, libc.Bool32(pOut == pIn2)) != 0) { goto __246 } goto no_mem __246: ; (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Str) if !(pOut != pIn2) { goto __247 } libc.Xmemcpy(tls, (*Mem)(unsafe.Pointer(pOut)).Fz, (*Mem)(unsafe.Pointer(pIn2)).Fz, uint64((*Mem)(unsafe.Pointer(pIn2)).Fn)) (*Mem)(unsafe.Pointer(pIn2)).Fflags = flags2 __247: ; libc.Xmemcpy(tls, (*Mem)(unsafe.Pointer(pOut)).Fz+uintptr((*Mem)(unsafe.Pointer(pIn2)).Fn), (*Mem)(unsafe.Pointer(pIn1)).Fz, uint64((*Mem)(unsafe.Pointer(pIn1)).Fn)) (*Mem)(unsafe.Pointer(pIn1)).Fflags = flags1 if !(int32(encoding) > SQLITE_UTF8) { goto __248 } nByte = nByte & int64(libc.CplInt32(1)) __248: ; *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pOut)).Fz + uintptr(nByte))) = int8(0) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pOut)).Fz + uintptr(nByte+int64(1)))) = int8(0) *(*U16)(unsafe.Pointer(pOut + 20)) |= U16(MEM_Term) (*Mem)(unsafe.Pointer(pOut)).Fn = int32(nByte) (*Mem)(unsafe.Pointer(pOut)).Fenc = encoding goto __9 __35: __36: __37: __38: __39: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 type1 = (*Mem)(unsafe.Pointer(pIn1)).Fflags pIn2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 type2 = (*Mem)(unsafe.Pointer(pIn2)).Fflags pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(int32(type1)&int32(type2)&MEM_Int != 0) { goto __249 } int_math: iA = *(*I64)(unsafe.Pointer(pIn1)) *(*I64)(unsafe.Pointer(bp + 208)) = *(*I64)(unsafe.Pointer(pIn2)) switch int32((*Op)(unsafe.Pointer(pOp)).Fopcode) { case OP_Add: goto __252 case OP_Subtract: goto __253 case OP_Multiply: goto __254 case OP_Divide: goto __255 default: goto __256 } goto __251 __252: if !(Xsqlite3AddInt64(tls, bp+208, iA) != 0) { goto __257 } goto fp_math __257: ; goto __251 __253: if !(Xsqlite3SubInt64(tls, bp+208, iA) != 0) { goto __258 } goto fp_math __258: ; goto __251 __254: if !(Xsqlite3MulInt64(tls, bp+208, iA) != 0) { goto __259 } goto fp_math __259: ; goto __251 __255: if !(iA == int64(0)) { goto __260 } goto arithmetic_result_is_null __260: ; if !(iA == int64(-1) && *(*I64)(unsafe.Pointer(bp + 208)) == int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32)) { goto __261 } goto fp_math __261: ; *(*I64)(unsafe.Pointer(bp + 208)) /= iA goto __251 __256: if !(iA == int64(0)) { goto __262 } goto arithmetic_result_is_null __262: ; if !(iA == int64(-1)) { goto __263 } iA = int64(1) __263: ; *(*I64)(unsafe.Pointer(bp + 208)) %= iA goto __251 __251: ; *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(bp + 208)) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) goto __250 __249: if !((int32(type1)|int32(type2))&MEM_Null != 0) { goto __264 } goto arithmetic_result_is_null goto __265 __264: type1 = numericType(tls, pIn1) type2 = numericType(tls, pIn2) if !(int32(type1)&int32(type2)&MEM_Int != 0) { goto __266 } goto int_math __266: ; fp_math: rA = Xsqlite3VdbeRealValue(tls, pIn1) rB = Xsqlite3VdbeRealValue(tls, pIn2) switch int32((*Op)(unsafe.Pointer(pOp)).Fopcode) { case OP_Add: goto __268 case OP_Subtract: goto __269 case OP_Multiply: goto __270 case OP_Divide: goto __271 default: goto __272 } goto __267 __268: rB = rB + rA goto __267 __269: rB = rB - rA goto __267 __270: rB = rB * rA goto __267 __271: if !(rA == float64(0)) { goto __273 } goto arithmetic_result_is_null __273: ; rB = rB / rA goto __267 __272: iA = Xsqlite3VdbeIntValue(tls, pIn1) *(*I64)(unsafe.Pointer(bp + 208)) = Xsqlite3VdbeIntValue(tls, pIn2) if !(iA == int64(0)) { goto __274 } goto arithmetic_result_is_null __274: ; if !(iA == int64(-1)) { goto __275 } iA = int64(1) __275: ; rB = float64(*(*I64)(unsafe.Pointer(bp + 208)) % iA) goto __267 __267: ; if !(Xsqlite3IsNaN(tls, rB) != 0) { goto __276 } goto arithmetic_result_is_null __276: ; *(*float64)(unsafe.Pointer(pOut)) = rB (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Real) __265: ; __250: ; goto __9 arithmetic_result_is_null: Xsqlite3VdbeMemSetNull(tls, pOut) goto __9 __40: ; if !((*Op)(unsafe.Pointer(pOp)).Fp1 != 0) { goto __277 } Xsqlite3VdbeMemSetInt64(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56, int64(0)) __277: ; goto __9 __41: __42: __43: __44: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pIn2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !((int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)|int32((*Mem)(unsafe.Pointer(pIn2)).Fflags))&MEM_Null != 0) { goto __278 } Xsqlite3VdbeMemSetNull(tls, pOut) goto __9 __278: ; *(*I64)(unsafe.Pointer(bp + 224)) = Xsqlite3VdbeIntValue(tls, pIn2) iB1 = Xsqlite3VdbeIntValue(tls, pIn1) op = (*Op)(unsafe.Pointer(pOp)).Fopcode if !(int32(op) == OP_BitAnd) { goto __279 } *(*I64)(unsafe.Pointer(bp + 224)) &= iB1 goto __280 __279: if !(int32(op) == OP_BitOr) { goto __281 } *(*I64)(unsafe.Pointer(bp + 224)) |= iB1 goto __282 __281: if !(iB1 != int64(0)) { goto __283 } if !(iB1 < int64(0)) { goto __284 } op = U8(2*OP_ShiftLeft + 1 - int32(op)) if iB1 > int64(-64) { iB1 = -iB1 } else { iB1 = int64(64) } __284: ; if !(iB1 >= int64(64)) { goto __285 } if *(*I64)(unsafe.Pointer(bp + 224)) >= int64(0) || int32(op) == OP_ShiftLeft { *(*I64)(unsafe.Pointer(bp + 224)) = int64(0) } else { *(*I64)(unsafe.Pointer(bp + 224)) = int64(-1) } goto __286 __285: libc.Xmemcpy(tls, bp+216, bp+224, uint64(unsafe.Sizeof(U64(0)))) if !(int32(op) == OP_ShiftLeft) { goto __287 } *(*U64)(unsafe.Pointer(bp + 216)) <<= iB1 goto __288 __287: *(*U64)(unsafe.Pointer(bp + 216)) >>= iB1 if !(*(*I64)(unsafe.Pointer(bp + 224)) < int64(0)) { goto __289 } *(*U64)(unsafe.Pointer(bp + 216)) |= (uint64(0xffffffff)<<32 | uint64(0xffffffff)) << (int64(64) - iB1) __289: ; __288: ; libc.Xmemcpy(tls, bp+224, bp+216, uint64(unsafe.Sizeof(I64(0)))) __286: ; __283: ; __282: ; __280: ; *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(bp + 224)) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) goto __9 __45: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 Xsqlite3VdbeMemIntegerify(tls, pIn1) *(*I64)(unsafe.Pointer(pIn1)) += I64((*Op)(unsafe.Pointer(pOp)).Fp2) goto __9 __46: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Int == 0) { goto __290 } applyAffinity(tls, pIn1, int8(SQLITE_AFF_NUMERIC), encoding) if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Int == 0) { goto __291 } if !((*Op)(unsafe.Pointer(pOp)).Fp2 == 0) { goto __292 } rc = SQLITE_MISMATCH goto abort_due_to_error goto __293 __292: goto jump_to_p2 __293: ; __291: ; __290: ; (*Mem)(unsafe.Pointer(pIn1)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) goto __9 __47: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&(MEM_Int|MEM_IntReal) != 0) { goto __294 } Xsqlite3VdbeMemRealify(tls, pIn1) __294: ; goto __9 __48: ; pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 rc = func() int32 { if int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, pIn1) } return 0 }() if !(rc != 0) { goto __295 } goto abort_due_to_error __295: ; rc = Xsqlite3VdbeMemCast(tls, pIn1, uint8((*Op)(unsafe.Pointer(pOp)).Fp2), encoding) if !(rc != 0) { goto __296 } goto abort_due_to_error __296: ; goto __9 __49: __50: __51: __52: __53: __54: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 flags11 = (*Mem)(unsafe.Pointer(pIn1)).Fflags flags3 = (*Mem)(unsafe.Pointer(pIn3)).Fflags if !(int32(flags11)&int32(flags3)&MEM_Int != 0) { goto __297 } if !(*(*I64)(unsafe.Pointer(pIn3)) > *(*I64)(unsafe.Pointer(pIn1))) { goto __298 } if !(*(*uint8)(unsafe.Pointer(Xsqlite3aGTb + uintptr((*Op)(unsafe.Pointer(pOp)).Fopcode))) != 0) { goto __300 } goto jump_to_p2 __300: ; iCompare = +1 goto __299 __298: if !(*(*I64)(unsafe.Pointer(pIn3)) < *(*I64)(unsafe.Pointer(pIn1))) { goto __301 } if !(*(*uint8)(unsafe.Pointer(Xsqlite3aLTb + uintptr((*Op)(unsafe.Pointer(pOp)).Fopcode))) != 0) { goto __303 } goto jump_to_p2 __303: ; iCompare = -1 goto __302 __301: if !(*(*uint8)(unsafe.Pointer(Xsqlite3aEQb + uintptr((*Op)(unsafe.Pointer(pOp)).Fopcode))) != 0) { goto __304 } goto jump_to_p2 __304: ; iCompare = 0 __302: ; __299: ; goto __9 __297: ; if !((int32(flags11)|int32(flags3))&MEM_Null != 0) { goto __305 } if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&SQLITE_NULLEQ != 0) { goto __307 } if !(int32(flags11)&int32(flags3)&MEM_Null != 0 && int32(flags3)&MEM_Cleared == 0) { goto __309 } res = 0 goto __310 __309: res = func() int32 { if int32(flags3)&MEM_Null != 0 { return -1 } return +1 }() __310: ; goto __308 __307: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&SQLITE_JUMPIFNULL != 0) { goto __311 } goto jump_to_p2 __311: ; iCompare = 1 goto __9 __308: ; goto __306 __305: affinity = int8(int32((*Op)(unsafe.Pointer(pOp)).Fp5) & SQLITE_AFF_MASK) if !(int32(affinity) >= SQLITE_AFF_NUMERIC) { goto __312 } if !((int32(flags11)|int32(flags3))&MEM_Str != 0) { goto __314 } if !(int32(flags11)&(MEM_Int|MEM_IntReal|MEM_Real|MEM_Str) == MEM_Str) { goto __315 } applyNumericAffinity(tls, pIn1, 0) flags3 = (*Mem)(unsafe.Pointer(pIn3)).Fflags __315: ; if !(int32(flags3)&(MEM_Int|MEM_IntReal|MEM_Real|MEM_Str) == MEM_Str) { goto __316 } applyNumericAffinity(tls, pIn3, 0) __316: ; __314: ; goto __313 __312: if !(int32(affinity) == SQLITE_AFF_TEXT && (int32(flags11)|int32(flags3))&MEM_Str != 0) { goto __317 } if !(int32(flags11)&MEM_Str == 0 && int32(flags11)&(MEM_Int|MEM_Real|MEM_IntReal) != 0) { goto __318 } Xsqlite3VdbeMemStringify(tls, pIn1, encoding, uint8(1)) flags11 = U16(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&libc.CplInt32(MEM_TypeMask) | int32(flags11)&MEM_TypeMask) if !(pIn1 == pIn3) { goto __319 } flags3 = U16(int32(flags11) | MEM_Str) __319: ; __318: ; if !(int32(flags3)&MEM_Str == 0 && int32(flags3)&(MEM_Int|MEM_Real|MEM_IntReal) != 0) { goto __320 } Xsqlite3VdbeMemStringify(tls, pIn3, encoding, uint8(1)) flags3 = U16(int32((*Mem)(unsafe.Pointer(pIn3)).Fflags)&libc.CplInt32(MEM_TypeMask) | int32(flags3)&MEM_TypeMask) __320: ; __317: ; __313: ; res = Xsqlite3MemCompare(tls, pIn3, pIn1, *(*uintptr)(unsafe.Pointer(pOp + 16))) __306: ; if !(res < 0) { goto __321 } res2 = int32(*(*uint8)(unsafe.Pointer(Xsqlite3aLTb + uintptr((*Op)(unsafe.Pointer(pOp)).Fopcode)))) goto __322 __321: if !(res == 0) { goto __323 } res2 = int32(*(*uint8)(unsafe.Pointer(Xsqlite3aEQb + uintptr((*Op)(unsafe.Pointer(pOp)).Fopcode)))) goto __324 __323: res2 = int32(*(*uint8)(unsafe.Pointer(Xsqlite3aGTb + uintptr((*Op)(unsafe.Pointer(pOp)).Fopcode)))) __324: ; __322: ; iCompare = res (*Mem)(unsafe.Pointer(pIn3)).Fflags = flags3 (*Mem)(unsafe.Pointer(pIn1)).Fflags = flags11 if !(res2 != 0) { goto __325 } goto jump_to_p2 __325: ; goto __9 __55: ; if !(iCompare == 0) { goto __326 } goto jump_to_p2 __326: ; goto __9 __56: ; goto __9 __57: if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_PERMUTE == 0) { goto __327 } aPermute = uintptr(0) goto __328 __327: ; aPermute = *(*uintptr)(unsafe.Pointer(pOp + libc.UintptrFromInt32(-1)*24 + 16)) + uintptr(1)*4 __328: ; n2 = (*Op)(unsafe.Pointer(pOp)).Fp3 pKeyInfo = *(*uintptr)(unsafe.Pointer(pOp + 16)) p11 = (*Op)(unsafe.Pointer(pOp)).Fp1 p21 = (*Op)(unsafe.Pointer(pOp)).Fp2 i = 0 __329: if !(i < n2) { goto __331 } if aPermute != 0 { idx = *(*U32)(unsafe.Pointer(aPermute + uintptr(i)*4)) } else { idx = U32(i) } pColl = *(*uintptr)(unsafe.Pointer(pKeyInfo + 32 + uintptr(i)*8)) bRev = int32(*(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FaSortFlags + uintptr(i)))) & KEYINFO_ORDER_DESC iCompare = Xsqlite3MemCompare(tls, aMem+uintptr(U32(p11)+idx)*56, aMem+uintptr(U32(p21)+idx)*56, pColl) if !(iCompare != 0) { goto __332 } if !(int32(*(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FaSortFlags + uintptr(i))))&KEYINFO_ORDER_BIGNULL != 0 && (int32((*Mem)(unsafe.Pointer(aMem+uintptr(U32(p11)+idx)*56)).Fflags)&MEM_Null != 0 || int32((*Mem)(unsafe.Pointer(aMem+uintptr(U32(p21)+idx)*56)).Fflags)&MEM_Null != 0)) { goto __333 } iCompare = -iCompare __333: ; if !(bRev != 0) { goto __334 } iCompare = -iCompare __334: ; goto __331 __332: ; goto __330 __330: i++ goto __329 goto __331 __331: ; goto __9 __58: ; if !(iCompare < 0) { goto __335 } pOp = aOp + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1-1)*24 goto __336 __335: if !(iCompare == 0) { goto __337 } pOp = aOp + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2-1)*24 goto __338 __337: ; pOp = aOp + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3-1)*24 __338: ; __336: ; goto __9 __59: __60: v1 = Xsqlite3VdbeBooleanValue(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56, 2) v2 = Xsqlite3VdbeBooleanValue(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56, 2) if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_And) { goto __339 } v1 = int32(and_logic[v1*3+v2]) goto __340 __339: v1 = int32(or_logic[v1*3+v2]) __340: ; pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(v1 == 2) { goto __341 } (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Null) goto __342 __341: *(*I64)(unsafe.Pointer(pOut)) = I64(v1) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Int) __342: ; goto __9 __61: ; Xsqlite3VdbeMemSetInt64(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56, int64(Xsqlite3VdbeBooleanValue(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56, (*Op)(unsafe.Pointer(pOp)).Fp3)^*(*int32)(unsafe.Pointer(pOp + 16)))) goto __9 __62: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Null == 0) { goto __343 } Xsqlite3VdbeMemSetInt64(tls, pOut, libc.BoolInt64(!(Xsqlite3VdbeBooleanValue(tls, pIn1, 0) != 0))) goto __344 __343: Xsqlite3VdbeMemSetNull(tls, pOut) __344: ; goto __9 __63: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 Xsqlite3VdbeMemSetNull(tls, pOut) if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Null == 0) { goto __345 } (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Int) *(*I64)(unsafe.Pointer(pOut)) = ^Xsqlite3VdbeIntValue(tls, pIn1) __345: ; goto __9 __64: ; if !((*Vdbe)(unsafe.Pointer(p)).FpFrame != 0) { goto __346 } iAddr = U32(int32((int64(pOp) - int64((*Vdbe)(unsafe.Pointer(p)).FaOp)) / 24)) if !(int32(*(*U8)(unsafe.Pointer((*VdbeFrame)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FpFrame)).FaOnce + uintptr(iAddr/U32(8)))))&(int32(1)<<(iAddr&U32(7))) != 0) { goto __348 } goto jump_to_p2 __348: ; *(*U8)(unsafe.Pointer((*VdbeFrame)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FpFrame)).FaOnce + uintptr(iAddr/U32(8)))) |= U8(int32(1) << (iAddr & U32(7))) goto __347 __346: if !((*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp)).Fp1 == (*Op)(unsafe.Pointer(pOp)).Fp1) { goto __349 } goto jump_to_p2 __349: ; __347: ; (*Op)(unsafe.Pointer(pOp)).Fp1 = (*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp)).Fp1 goto __9 __65: c = Xsqlite3VdbeBooleanValue(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56, (*Op)(unsafe.Pointer(pOp)).Fp3) if !(c != 0) { goto __350 } goto jump_to_p2 __350: ; goto __9 __66: c1 = libc.BoolInt32(!(Xsqlite3VdbeBooleanValue(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56, libc.BoolInt32(!((*Op)(unsafe.Pointer(pOp)).Fp3 != 0))) != 0)) if !(c1 != 0) { goto __351 } goto jump_to_p2 __351: ; goto __9 __67: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Null != 0) { goto __352 } goto jump_to_p2 __352: ; goto __9 __68: ; if !((*Op)(unsafe.Pointer(pOp)).Fp1 >= 0) { goto __353 } pC = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !((*Op)(unsafe.Pointer(pOp)).Fp3 < int32((*VdbeCursor)(unsafe.Pointer(pC)).FnHdrParsed)) { goto __355 } serialType = *(*U32)(unsafe.Pointer(pC + 112 + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*4)) if !(serialType >= U32(12)) { goto __357 } if !(serialType&U32(1) != 0) { goto __359 } typeMask = U16(0x04) goto __360 __359: typeMask = U16(0x08) __360: ; goto __358 __357: ; typeMask = U16(aMask[serialType]) __358: ; goto __356 __355: typeMask = U16(int32(1) << (*(*int32)(unsafe.Pointer(pOp + 16)) - 1)) __356: ; goto __354 __353: ; typeMask = U16(int32(1) << (Xsqlite3_value_type(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56) - 1)) __354: ; if !(int32(typeMask)&int32((*Op)(unsafe.Pointer(pOp)).Fp5) != 0) { goto __361 } goto jump_to_p2 __361: ; goto __9 __69: if !(int32((*Mem)(unsafe.Pointer(aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56)).Fflags)&MEM_Null != 0 || int32((*Mem)(unsafe.Pointer(aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56)).Fflags)&MEM_Null != 0) { goto __362 } Xsqlite3VdbeMemSetNull(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56) goto __363 __362: Xsqlite3VdbeMemSetInt64(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56, int64(0)) __363: ; goto __9 __70: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Null == 0) { goto __364 } goto jump_to_p2 __364: ; goto __9 __71: ; pC1 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(pC1 != 0 && (*VdbeCursor)(unsafe.Pointer(pC1)).FnullRow != 0) { goto __365 } Xsqlite3VdbeMemSetNull(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56) goto jump_to_p2 __365: ; goto __9 __72: ; pC2 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pOut = (*Vdbe)(unsafe.Pointer(p)).FaMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(pC2 == uintptr(0) || int32((*VdbeCursor)(unsafe.Pointer(pC2)).FeCurType) != CURTYPE_BTREE) { goto __366 } Xsqlite3VdbeMemSetNull(tls, pOut) goto __367 __366: if !((*VdbeCursor)(unsafe.Pointer(pC2)).FdeferredMoveto != 0) { goto __368 } rc = Xsqlite3VdbeFinishMoveto(tls, pC2) if !(rc != 0) { goto __369 } goto abort_due_to_error __369: ; __368: ; if !(Xsqlite3BtreeEof(tls, *(*uintptr)(unsafe.Pointer(pC2 + 48))) != 0) { goto __370 } Xsqlite3VdbeMemSetNull(tls, pOut) goto __371 __370: Xsqlite3VdbeMemSetInt64(tls, pOut, Xsqlite3BtreeOffset(tls, *(*uintptr)(unsafe.Pointer(pC2 + 48)))) __371: ; __367: ; goto __9 __73: ; pC3 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) p22 = U32((*Op)(unsafe.Pointer(pOp)).Fp2) op_column_restart: ; aOffset = (*VdbeCursor)(unsafe.Pointer(pC3)).FaOffset if !((*VdbeCursor)(unsafe.Pointer(pC3)).FcacheStatus != (*Vdbe)(unsafe.Pointer(p)).FcacheCtr) { goto __372 } if !((*VdbeCursor)(unsafe.Pointer(pC3)).FnullRow != 0) { goto __374 } if !(int32((*VdbeCursor)(unsafe.Pointer(pC3)).FeCurType) == CURTYPE_PSEUDO && (*VdbeCursor)(unsafe.Pointer(pC3)).FseekResult > 0) { goto __376 } pReg = aMem + uintptr((*VdbeCursor)(unsafe.Pointer(pC3)).FseekResult)*56 (*VdbeCursor)(unsafe.Pointer(pC3)).FpayloadSize = libc.AssignPtrUint32(pC3+108, U32((*Mem)(unsafe.Pointer(pReg)).Fn)) (*VdbeCursor)(unsafe.Pointer(pC3)).FaRow = (*Mem)(unsafe.Pointer(pReg)).Fz goto __377 __376: pDest = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 Xsqlite3VdbeMemSetNull(tls, pDest) goto op_column_out __377: ; goto __375 __374: pCrsr = *(*uintptr)(unsafe.Pointer(pC3 + 48)) if !((*VdbeCursor)(unsafe.Pointer(pC3)).FdeferredMoveto != 0) { goto __378 } if !(*(*uintptr)(unsafe.Pointer(pC3 + 16)) != 0 && libc.AssignUint32(&iMap, *(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pC3 + 16)) + uintptr(U32(1)+p22)*4))) > U32(0)) { goto __380 } pC3 = (*VdbeCursor)(unsafe.Pointer(pC3)).FpAltCursor p22 = iMap - U32(1) goto op_column_restart __380: ; rc = Xsqlite3VdbeFinishMoveto(tls, pC3) if !(rc != 0) { goto __381 } goto abort_due_to_error __381: ; goto __379 __378: if !(Xsqlite3BtreeCursorHasMoved(tls, pCrsr) != 0) { goto __382 } rc = Xsqlite3VdbeHandleMovedCursor(tls, pC3) if !(rc != 0) { goto __383 } goto abort_due_to_error __383: ; goto op_column_restart __382: ; __379: ; (*VdbeCursor)(unsafe.Pointer(pC3)).FpayloadSize = Xsqlite3BtreePayloadSize(tls, pCrsr) (*VdbeCursor)(unsafe.Pointer(pC3)).FaRow = Xsqlite3BtreePayloadFetch(tls, pCrsr, pC3+108) __375: ; (*VdbeCursor)(unsafe.Pointer(pC3)).FcacheStatus = (*Vdbe)(unsafe.Pointer(p)).FcacheCtr if !(libc.AssignPtrUint32(aOffset, U32(*(*U8)(unsafe.Pointer((*VdbeCursor)(unsafe.Pointer(pC3)).FaRow)))) < U32(0x80)) { goto __384 } (*VdbeCursor)(unsafe.Pointer(pC3)).FiHdrOffset = U32(1) goto __385 __384: (*VdbeCursor)(unsafe.Pointer(pC3)).FiHdrOffset = U32(Xsqlite3GetVarint32(tls, (*VdbeCursor)(unsafe.Pointer(pC3)).FaRow, aOffset)) __385: ; (*VdbeCursor)(unsafe.Pointer(pC3)).FnHdrParsed = U16(0) if !((*VdbeCursor)(unsafe.Pointer(pC3)).FszRow < *(*U32)(unsafe.Pointer(aOffset))) { goto __386 } (*VdbeCursor)(unsafe.Pointer(pC3)).FaRow = uintptr(0) (*VdbeCursor)(unsafe.Pointer(pC3)).FszRow = U32(0) if !(*(*U32)(unsafe.Pointer(aOffset)) > U32(98307) || *(*U32)(unsafe.Pointer(aOffset)) > (*VdbeCursor)(unsafe.Pointer(pC3)).FpayloadSize) { goto __388 } goto op_column_corrupt __388: ; goto __387 __386: zData = (*VdbeCursor)(unsafe.Pointer(pC3)).FaRow goto op_column_read_header __387: ; goto __373 __372: if !(Xsqlite3BtreeCursorHasMoved(tls, *(*uintptr)(unsafe.Pointer(pC3 + 48))) != 0) { goto __389 } rc = Xsqlite3VdbeHandleMovedCursor(tls, pC3) if !(rc != 0) { goto __390 } goto abort_due_to_error __390: ; goto op_column_restart __389: ; __373: ; if !(U32((*VdbeCursor)(unsafe.Pointer(pC3)).FnHdrParsed) <= p22) { goto __391 } if !((*VdbeCursor)(unsafe.Pointer(pC3)).FiHdrOffset < *(*U32)(unsafe.Pointer(aOffset))) { goto __393 } if !((*VdbeCursor)(unsafe.Pointer(pC3)).FaRow == uintptr(0)) { goto __395 } libc.Xmemset(tls, bp+232, 0, uint64(unsafe.Sizeof(Mem{}))) rc = Xsqlite3VdbeMemFromBtreeZeroOffset(tls, *(*uintptr)(unsafe.Pointer(pC3 + 48)), *(*U32)(unsafe.Pointer(aOffset)), bp+232) if !(rc != SQLITE_OK) { goto __397 } goto abort_due_to_error __397: ; zData = (*Mem)(unsafe.Pointer(bp + 232)).Fz goto __396 __395: zData = (*VdbeCursor)(unsafe.Pointer(pC3)).FaRow __396: ; op_column_read_header: i1 = int32((*VdbeCursor)(unsafe.Pointer(pC3)).FnHdrParsed) offset64 = U64(*(*U32)(unsafe.Pointer(aOffset + uintptr(i1)*4))) zHdr = zData + uintptr((*VdbeCursor)(unsafe.Pointer(pC3)).FiHdrOffset) zEndHdr = zData + uintptr(*(*U32)(unsafe.Pointer(aOffset))) __398: if !(libc.AssignPtrUint32(pC3+112+uintptr(i1)*4, libc.AssignPtrUint32(bp+288, U32(*(*U8)(unsafe.Pointer(zHdr))))) < U32(0x80)) { goto __401 } zHdr++ offset64 = offset64 + U64(Xsqlite3VdbeOneByteSerialTypeLen(tls, uint8(*(*U32)(unsafe.Pointer(bp + 288))))) goto __402 __401: zHdr += uintptr(Xsqlite3GetVarint32(tls, zHdr, bp+288)) *(*U32)(unsafe.Pointer(pC3 + 112 + uintptr(i1)*4)) = *(*U32)(unsafe.Pointer(bp + 288)) offset64 = offset64 + U64(Xsqlite3VdbeSerialTypeLen(tls, *(*U32)(unsafe.Pointer(bp + 288)))) __402: ; *(*U32)(unsafe.Pointer(aOffset + uintptr(libc.PreIncInt32(&i1, 1))*4)) = U32(offset64 & uint64(0xffffffff)) goto __399 __399: if U32(i1) <= p22 && zHdr < zEndHdr { goto __398 } goto __400 __400: ; if !(zHdr >= zEndHdr && (zHdr > zEndHdr || offset64 != U64((*VdbeCursor)(unsafe.Pointer(pC3)).FpayloadSize)) || offset64 > U64((*VdbeCursor)(unsafe.Pointer(pC3)).FpayloadSize)) { goto __403 } if !(*(*U32)(unsafe.Pointer(aOffset)) == U32(0)) { goto __404 } i1 = 0 zHdr = zEndHdr goto __405 __404: if !((*VdbeCursor)(unsafe.Pointer(pC3)).FaRow == uintptr(0)) { goto __406 } Xsqlite3VdbeMemRelease(tls, bp+232) __406: ; goto op_column_corrupt __405: ; __403: ; (*VdbeCursor)(unsafe.Pointer(pC3)).FnHdrParsed = U16(i1) (*VdbeCursor)(unsafe.Pointer(pC3)).FiHdrOffset = U32((int64(zHdr) - int64(zData)) / 1) if !((*VdbeCursor)(unsafe.Pointer(pC3)).FaRow == uintptr(0)) { goto __407 } Xsqlite3VdbeMemRelease(tls, bp+232) __407: ; goto __394 __393: *(*U32)(unsafe.Pointer(bp + 288)) = U32(0) __394: ; if !(U32((*VdbeCursor)(unsafe.Pointer(pC3)).FnHdrParsed) <= p22) { goto __408 } pDest = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(int32((*Op)(unsafe.Pointer(pOp)).Fp4type) == -10) { goto __409 } Xsqlite3VdbeMemShallowCopy(tls, pDest, *(*uintptr)(unsafe.Pointer(pOp + 16)), MEM_Static) goto __410 __409: Xsqlite3VdbeMemSetNull(tls, pDest) __410: ; goto op_column_out __408: ; goto __392 __391: *(*U32)(unsafe.Pointer(bp + 288)) = *(*U32)(unsafe.Pointer(pC3 + 112 + uintptr(p22)*4)) __392: ; pDest = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(int32((*Mem)(unsafe.Pointer(pDest)).Fflags)&(MEM_Agg|MEM_Dyn) != 0) { goto __411 } Xsqlite3VdbeMemSetNull(tls, pDest) __411: ; if !((*VdbeCursor)(unsafe.Pointer(pC3)).FszRow >= *(*U32)(unsafe.Pointer(aOffset + uintptr(p22+U32(1))*4))) { goto __412 } zData = (*VdbeCursor)(unsafe.Pointer(pC3)).FaRow + uintptr(*(*U32)(unsafe.Pointer(aOffset + uintptr(p22)*4))) if !(*(*U32)(unsafe.Pointer(bp + 288)) < U32(12)) { goto __414 } Xsqlite3VdbeSerialGet(tls, zData, *(*U32)(unsafe.Pointer(bp + 288)), pDest) goto __415 __414: (*Mem)(unsafe.Pointer(pDest)).Fn = libc.AssignInt32(&len, int32((*(*U32)(unsafe.Pointer(bp + 288))-U32(12))/U32(2))) (*Mem)(unsafe.Pointer(pDest)).Fenc = encoding if !((*Mem)(unsafe.Pointer(pDest)).FszMalloc < len+2) { goto __416 } if !(len > *(*int32)(unsafe.Pointer(db + 136))) { goto __418 } goto too_big __418: ; (*Mem)(unsafe.Pointer(pDest)).Fflags = U16(MEM_Null) if !(Xsqlite3VdbeMemGrow(tls, pDest, len+2, 0) != 0) { goto __419 } goto no_mem __419: ; goto __417 __416: (*Mem)(unsafe.Pointer(pDest)).Fz = (*Mem)(unsafe.Pointer(pDest)).FzMalloc __417: ; libc.Xmemcpy(tls, (*Mem)(unsafe.Pointer(pDest)).Fz, zData, uint64(len)) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pDest)).Fz + uintptr(len))) = int8(0) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pDest)).Fz + uintptr(len+1))) = int8(0) (*Mem)(unsafe.Pointer(pDest)).Fflags = aFlag1[*(*U32)(unsafe.Pointer(bp + 288))&U32(1)] __415: ; goto __413 __412: (*Mem)(unsafe.Pointer(pDest)).Fenc = encoding if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&(OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG) != 0 && (*(*U32)(unsafe.Pointer(bp + 288)) >= U32(12) && *(*U32)(unsafe.Pointer(bp + 288))&U32(1) == U32(0) || int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_TYPEOFARG != 0) || libc.AssignInt32(&len, int32(Xsqlite3VdbeSerialTypeLen(tls, *(*U32)(unsafe.Pointer(bp + 288))))) == 0) { goto __420 } Xsqlite3VdbeSerialGet(tls, uintptr(unsafe.Pointer(&Xsqlite3CtypeMap)), *(*U32)(unsafe.Pointer(bp + 288)), pDest) goto __421 __420: if !(len > *(*int32)(unsafe.Pointer(db + 136))) { goto __422 } goto too_big __422: ; rc = Xsqlite3VdbeMemFromBtree(tls, *(*uintptr)(unsafe.Pointer(pC3 + 48)), *(*U32)(unsafe.Pointer(aOffset + uintptr(p22)*4)), uint32(len), pDest) if !(rc != SQLITE_OK) { goto __423 } goto abort_due_to_error __423: ; Xsqlite3VdbeSerialGet(tls, (*Mem)(unsafe.Pointer(pDest)).Fz, *(*U32)(unsafe.Pointer(bp + 288)), pDest) *(*U16)(unsafe.Pointer(pDest + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Ephem)) __421: ; __413: ; op_column_out: ; goto __9 op_column_corrupt: if !((*Op)(unsafe.Pointer(aOp)).Fp3 > 0) { goto __424 } pOp = aOp + uintptr((*Op)(unsafe.Pointer(aOp)).Fp3-1)*24 goto __9 goto __425 __424: rc = Xsqlite3CorruptError(tls, 93320) goto abort_due_to_error __425: ; __74: ; pTab = *(*uintptr)(unsafe.Pointer(pOp + 16)) aCol = (*Table)(unsafe.Pointer(pTab)).FaCol pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 i2 = 0 __426: if !(i2 < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __428 } if !(int32((*Column)(unsafe.Pointer(aCol+uintptr(i2)*24)).FcolFlags)&COLFLAG_GENERATED != 0) { goto __429 } if !(int32((*Column)(unsafe.Pointer(aCol+uintptr(i2)*24)).FcolFlags)&COLFLAG_VIRTUAL != 0) { goto __430 } goto __427 __430: ; if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __431 } pIn1 += 56 goto __427 __431: ; __429: ; applyAffinity(tls, pIn1, (*Column)(unsafe.Pointer(aCol+uintptr(i2)*24)).Faffinity, encoding) if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Null == 0) { goto __432 } switch int32(*(*uint8)(unsafe.Pointer(aCol + uintptr(i2)*24 + 8)) & 0xf0 >> 4) { case COLTYPE_BLOB: goto __434 case COLTYPE_INTEGER: goto __435 case COLTYPE_INT: goto __436 case COLTYPE_TEXT: goto __437 case COLTYPE_REAL: goto __438 default: goto __439 } goto __433 __434: if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Blob == 0) { goto __440 } goto vdbe_type_error __440: ; goto __433 __435: __436: if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Int == 0) { goto __441 } goto vdbe_type_error __441: ; goto __433 __437: if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Str == 0) { goto __442 } goto vdbe_type_error __442: ; goto __433 __438: ; if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Int != 0) { goto __443 } if !(*(*I64)(unsafe.Pointer(pIn1)) <= 140737488355327 && *(*I64)(unsafe.Pointer(pIn1)) >= -140737488355328) { goto __445 } *(*U16)(unsafe.Pointer(pIn1 + 20)) |= U16(MEM_IntReal) *(*U16)(unsafe.Pointer(pIn1 + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int)) goto __446 __445: *(*float64)(unsafe.Pointer(pIn1)) = float64(*(*I64)(unsafe.Pointer(pIn1))) *(*U16)(unsafe.Pointer(pIn1 + 20)) |= U16(MEM_Real) *(*U16)(unsafe.Pointer(pIn1 + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int)) __446: ; goto __444 __443: if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&(MEM_Real|MEM_IntReal) == 0) { goto __447 } goto vdbe_type_error __447: ; __444: ; goto __433 __439: goto __433 __433: ; __432: ; pIn1 += 56 goto __427 __427: i2++ goto __426 goto __428 __428: ; goto __9 vdbe_type_error: Xsqlite3VdbeError(tls, p, ts+6835, libc.VaList(bp+56, vdbeMemTypeName(tls, pIn1), Xsqlite3StdType[(int32(*(*uint8)(unsafe.Pointer(aCol + uintptr(i2)*24 + 8))&0xf0>>4)-1)&0xf<<28>>28], (*Table)(unsafe.Pointer(pTab)).FzName, (*Column)(unsafe.Pointer(aCol+uintptr(i2)*24)).FzCnName)) rc = SQLITE_CONSTRAINT | int32(12)<<8 goto abort_due_to_error __75: zAffinity = *(*uintptr)(unsafe.Pointer(pOp + 16)) pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 __448: if !(1 != 0) { goto __449 } applyAffinity(tls, pIn1, *(*int8)(unsafe.Pointer(zAffinity)), encoding) if !(int32(*(*int8)(unsafe.Pointer(zAffinity))) == SQLITE_AFF_REAL && int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Int != 0) { goto __450 } if !(*(*I64)(unsafe.Pointer(pIn1)) <= 140737488355327 && *(*I64)(unsafe.Pointer(pIn1)) >= -140737488355328) { goto __451 } *(*U16)(unsafe.Pointer(pIn1 + 20)) |= U16(MEM_IntReal) *(*U16)(unsafe.Pointer(pIn1 + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int)) goto __452 __451: *(*float64)(unsafe.Pointer(pIn1)) = float64(*(*I64)(unsafe.Pointer(pIn1))) *(*U16)(unsafe.Pointer(pIn1 + 20)) |= U16(MEM_Real) *(*U16)(unsafe.Pointer(pIn1 + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int)) __452: ; __450: ; zAffinity++ if !(int32(*(*int8)(unsafe.Pointer(zAffinity))) == 0) { goto __453 } goto __449 __453: ; pIn1 += 56 goto __448 __449: ; goto __9 __76: nData = uint64(0) nHdr = 0 nZero = int64(0) nField = (*Op)(unsafe.Pointer(pOp)).Fp1 zAffinity1 = *(*uintptr)(unsafe.Pointer(pOp + 16)) pData0 = aMem + uintptr(nField)*56 nField = (*Op)(unsafe.Pointer(pOp)).Fp2 pLast = pData0 + uintptr(nField-1)*56 pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(zAffinity1 != 0) { goto __454 } pRec = pData0 __455: applyAffinity(tls, pRec, *(*int8)(unsafe.Pointer(zAffinity1)), encoding) if !(int32(*(*int8)(unsafe.Pointer(zAffinity1))) == SQLITE_AFF_REAL && int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Int != 0) { goto __458 } *(*U16)(unsafe.Pointer(pRec + 20)) |= U16(MEM_IntReal) *(*U16)(unsafe.Pointer(pRec + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Int)) __458: ; zAffinity1++ pRec += 56 goto __456 __456: if *(*int8)(unsafe.Pointer(zAffinity1)) != 0 { goto __455 } goto __457 __457: ; __454: ; pRec = pLast __459: ; if !(int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Null != 0) { goto __462 } if !(int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Zero != 0) { goto __464 } (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(10) goto __465 __464: (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(0) __465: ; nHdr++ goto __463 __462: if !(int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&(MEM_Int|MEM_IntReal) != 0) { goto __466 } i3 = *(*I64)(unsafe.Pointer(pRec)) if !(i3 < int64(0)) { goto __468 } uu = U64(^i3) goto __469 __468: uu = U64(i3) __469: ; nHdr++ if !(uu <= uint64(127)) { goto __470 } if !(i3&int64(1) == i3 && int32((*Vdbe)(unsafe.Pointer(p)).FminWriteFileFormat) >= 4) { goto __472 } (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(8) + U32(uu) goto __473 __472: nData++ (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(1) __473: ; goto __471 __470: if !(uu <= uint64(32767)) { goto __474 } nData = nData + uint64(2) (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(2) goto __475 __474: if !(uu <= uint64(8388607)) { goto __476 } nData = nData + uint64(3) (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(3) goto __477 __476: if !(uu <= uint64(2147483647)) { goto __478 } nData = nData + uint64(4) (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(4) goto __479 __478: if !(uu <= uint64(140737488355327)) { goto __480 } nData = nData + uint64(6) (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(5) goto __481 __480: nData = nData + uint64(8) if !(int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_IntReal != 0) { goto __482 } *(*float64)(unsafe.Pointer(pRec)) = float64(*(*I64)(unsafe.Pointer(pRec))) *(*U16)(unsafe.Pointer(pRec + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_IntReal)) *(*U16)(unsafe.Pointer(pRec + 20)) |= U16(MEM_Real) (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(7) goto __483 __482: (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(6) __483: ; __481: ; __479: ; __477: ; __475: ; __471: ; goto __467 __466: if !(int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Real != 0) { goto __484 } nHdr++ nData = nData + uint64(8) (*Mem)(unsafe.Pointer(pRec)).FuTemp = U32(7) goto __485 __484: ; len1 = U32((*Mem)(unsafe.Pointer(pRec)).Fn) serial_type = len1*U32(2) + U32(12) + U32(libc.Bool32(int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Str != 0)) if !(int32((*Mem)(unsafe.Pointer(pRec)).Fflags)&MEM_Zero != 0) { goto __486 } serial_type = serial_type + U32(*(*int32)(unsafe.Pointer(pRec))*2) if !(nData != 0) { goto __487 } if !(Xsqlite3VdbeMemExpandBlob(tls, pRec) != 0) { goto __489 } goto no_mem __489: ; len1 = len1 + U32(*(*int32)(unsafe.Pointer(pRec))) goto __488 __487: nZero = nZero + I64(*(*int32)(unsafe.Pointer(pRec))) __488: ; __486: ; nData = nData + U64(len1) nHdr = nHdr + Xsqlite3VarintLen(tls, uint64(serial_type)) (*Mem)(unsafe.Pointer(pRec)).FuTemp = serial_type __485: ; __467: ; __463: ; if !(pRec == pData0) { goto __490 } goto __461 __490: ; pRec -= 56 goto __460 __460: if 1 != 0 { goto __459 } goto __461 __461: ; if !(nHdr <= 126) { goto __491 } nHdr = nHdr + 1 goto __492 __491: nVarint = Xsqlite3VarintLen(tls, uint64(nHdr)) nHdr = nHdr + nVarint if !(nVarint < Xsqlite3VarintLen(tls, uint64(nHdr))) { goto __493 } nHdr++ __493: ; __492: ; nByte1 = I64(U64(nHdr) + nData) if !(nByte1+nZero <= I64((*Mem)(unsafe.Pointer(pOut)).FszMalloc)) { goto __494 } (*Mem)(unsafe.Pointer(pOut)).Fz = (*Mem)(unsafe.Pointer(pOut)).FzMalloc goto __495 __494: if !(nByte1+nZero > I64(*(*int32)(unsafe.Pointer(db + 136)))) { goto __496 } goto too_big __496: ; if !(Xsqlite3VdbeMemClearAndResize(tls, pOut, int32(nByte1)) != 0) { goto __497 } goto no_mem __497: ; __495: ; (*Mem)(unsafe.Pointer(pOut)).Fn = int32(nByte1) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Blob) if !(nZero != 0) { goto __498 } *(*int32)(unsafe.Pointer(pOut)) = int32(nZero) *(*U16)(unsafe.Pointer(pOut + 20)) |= U16(MEM_Zero) __498: ; zHdr1 = (*Mem)(unsafe.Pointer(pOut)).Fz zPayload = zHdr1 + uintptr(nHdr) if !(nHdr < 0x80) { goto __499 } *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&zHdr1, 1))) = U8(nHdr) goto __500 __499: zHdr1 += uintptr(Xsqlite3PutVarint(tls, zHdr1, uint64(nHdr))) __500: ; pRec = pData0 __501: if !(1 != 0) { goto __502 } serial_type = (*Mem)(unsafe.Pointer(pRec)).FuTemp if !(serial_type <= U32(7)) { goto __503 } *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&zHdr1, 1))) = U8(serial_type) if !(serial_type == U32(0)) { goto __505 } goto __506 __505: if !(serial_type == U32(7)) { goto __507 } libc.Xmemcpy(tls, bp+296, pRec, uint64(unsafe.Sizeof(U64(0)))) goto __508 __507: *(*U64)(unsafe.Pointer(bp + 296)) = U64(*(*I64)(unsafe.Pointer(pRec))) __508: ; len1 = libc.AssignUint32(&i4, U32(Xsqlite3SmallTypeSizes[serial_type])) __509: if !(1 != 0) { goto __510 } *(*U8)(unsafe.Pointer(zPayload + uintptr(libc.PreDecUint32(&i4, 1)))) = U8(*(*U64)(unsafe.Pointer(bp + 296)) & uint64(0xFF)) if !(i4 == U32(0)) { goto __511 } goto __510 __511: ; *(*U64)(unsafe.Pointer(bp + 296)) >>= 8 goto __509 __510: ; zPayload += uintptr(len1) __506: ; goto __504 __503: if !(serial_type < U32(0x80)) { goto __512 } *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&zHdr1, 1))) = U8(serial_type) if !(serial_type >= U32(14) && (*Mem)(unsafe.Pointer(pRec)).Fn > 0) { goto __514 } libc.Xmemcpy(tls, zPayload, (*Mem)(unsafe.Pointer(pRec)).Fz, uint64((*Mem)(unsafe.Pointer(pRec)).Fn)) zPayload += uintptr((*Mem)(unsafe.Pointer(pRec)).Fn) __514: ; goto __513 __512: zHdr1 += uintptr(Xsqlite3PutVarint(tls, zHdr1, uint64(serial_type))) if !((*Mem)(unsafe.Pointer(pRec)).Fn != 0) { goto __515 } libc.Xmemcpy(tls, zPayload, (*Mem)(unsafe.Pointer(pRec)).Fz, uint64((*Mem)(unsafe.Pointer(pRec)).Fn)) zPayload += uintptr((*Mem)(unsafe.Pointer(pRec)).Fn) __515: ; __513: ; __504: ; if !(pRec == pLast) { goto __516 } goto __502 __516: ; pRec += 56 goto __501 __502: ; goto __9 __77: ; pCrsr1 = *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) + 48)) if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __517 } *(*I64)(unsafe.Pointer(bp + 304)) = Xsqlite3BtreeRowCountEst(tls, pCrsr1) goto __518 __517: *(*I64)(unsafe.Pointer(bp + 304)) = int64(0) rc = Xsqlite3BtreeCount(tls, db, pCrsr1, bp+304) if !(rc != 0) { goto __519 } goto abort_due_to_error __519: ; __518: ; pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(bp + 304)) goto check_for_interrupt __78: p12 = (*Op)(unsafe.Pointer(pOp)).Fp1 zName = *(*uintptr)(unsafe.Pointer(pOp + 16)) if !(p12 == SAVEPOINT_BEGIN) { goto __520 } if !((*Sqlite3)(unsafe.Pointer(db)).FnVdbeWrite > 0) { goto __522 } Xsqlite3VdbeError(tls, p, ts+6876, 0) rc = SQLITE_BUSY goto __523 __522: nName = Xsqlite3Strlen30(tls, zName) rc = Xsqlite3VtabSavepoint(tls, db, SAVEPOINT_BEGIN, (*Sqlite3)(unsafe.Pointer(db)).FnStatement+(*Sqlite3)(unsafe.Pointer(db)).FnSavepoint) if !(rc != SQLITE_OK) { goto __524 } goto abort_due_to_error __524: ; pNew = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(Savepoint{}))+uint64(nName)+uint64(1)) if !(pNew != 0) { goto __525 } (*Savepoint)(unsafe.Pointer(pNew)).FzName = pNew + 1*32 libc.Xmemcpy(tls, (*Savepoint)(unsafe.Pointer(pNew)).FzName, zName, uint64(nName+1)) if !((*Sqlite3)(unsafe.Pointer(db)).FautoCommit != 0) { goto __526 } (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(0) (*Sqlite3)(unsafe.Pointer(db)).FisTransactionSavepoint = U8(1) goto __527 __526: (*Sqlite3)(unsafe.Pointer(db)).FnSavepoint++ __527: ; (*Savepoint)(unsafe.Pointer(pNew)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint = pNew (*Savepoint)(unsafe.Pointer(pNew)).FnDeferredCons = (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons (*Savepoint)(unsafe.Pointer(pNew)).FnDeferredImmCons = (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons __525: ; __523: ; goto __521 __520: ; iSavepoint = 0 pSavepoint = (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint __528: if !(pSavepoint != 0 && Xsqlite3StrICmp(tls, (*Savepoint)(unsafe.Pointer(pSavepoint)).FzName, zName) != 0) { goto __530 } iSavepoint++ goto __529 __529: pSavepoint = (*Savepoint)(unsafe.Pointer(pSavepoint)).FpNext goto __528 goto __530 __530: ; if !!(pSavepoint != 0) { goto __531 } Xsqlite3VdbeError(tls, p, ts+6927, libc.VaList(bp+88, zName)) rc = SQLITE_ERROR goto __532 __531: if !((*Sqlite3)(unsafe.Pointer(db)).FnVdbeWrite > 0 && p12 == SAVEPOINT_RELEASE) { goto __533 } Xsqlite3VdbeError(tls, p, ts+6949, 0) rc = SQLITE_BUSY goto __534 __533: isTransaction = libc.Bool32((*Savepoint)(unsafe.Pointer(pSavepoint)).FpNext == uintptr(0) && (*Sqlite3)(unsafe.Pointer(db)).FisTransactionSavepoint != 0) if !(isTransaction != 0 && p12 == SAVEPOINT_RELEASE) { goto __535 } if !(libc.AssignInt32(&rc, Xsqlite3VdbeCheckFk(tls, p, 1)) != SQLITE_OK) { goto __537 } goto vdbe_return __537: ; (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1) if !(Xsqlite3VdbeHalt(tls, p) == SQLITE_BUSY) { goto __538 } (*Vdbe)(unsafe.Pointer(p)).Fpc = int32((int64(pOp) - int64(aOp)) / 24) (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(0) (*Vdbe)(unsafe.Pointer(p)).Frc = libc.AssignInt32(&rc, SQLITE_BUSY) goto vdbe_return __538: ; rc = (*Vdbe)(unsafe.Pointer(p)).Frc if !(rc != 0) { goto __539 } (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(0) goto __540 __539: (*Sqlite3)(unsafe.Pointer(db)).FisTransactionSavepoint = U8(0) __540: ; goto __536 __535: iSavepoint = (*Sqlite3)(unsafe.Pointer(db)).FnSavepoint - iSavepoint - 1 if !(p12 == SAVEPOINT_ROLLBACK) { goto __541 } isSchemaChange = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_SchemaChange) != U32(0)) ii = 0 __543: if !(ii < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __545 } rc = Xsqlite3BtreeTripAllCursors(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii)*32)).FpBt, SQLITE_ABORT|int32(2)<<8, libc.Bool32(isSchemaChange == 0)) if !(rc != SQLITE_OK) { goto __546 } goto abort_due_to_error __546: ; goto __544 __544: ii++ goto __543 goto __545 __545: ; goto __542 __541: ; isSchemaChange = 0 __542: ; ii = 0 __547: if !(ii < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __549 } rc = Xsqlite3BtreeSavepoint(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii)*32)).FpBt, p12, iSavepoint) if !(rc != SQLITE_OK) { goto __550 } goto abort_due_to_error __550: ; goto __548 __548: ii++ goto __547 goto __549 __549: ; if !(isSchemaChange != 0) { goto __551 } Xsqlite3ExpirePreparedStatements(tls, db, 0) Xsqlite3ResetAllSchemasOfConnection(tls, db) *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) __551: ; __536: ; if !(rc != 0) { goto __552 } goto abort_due_to_error __552: ; __553: if !((*Sqlite3)(unsafe.Pointer(db)).FpSavepoint != pSavepoint) { goto __554 } pTmp = (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint = (*Savepoint)(unsafe.Pointer(pTmp)).FpNext Xsqlite3DbFree(tls, db, pTmp) (*Sqlite3)(unsafe.Pointer(db)).FnSavepoint-- goto __553 __554: ; if !(p12 == SAVEPOINT_RELEASE) { goto __555 } (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint = (*Savepoint)(unsafe.Pointer(pSavepoint)).FpNext Xsqlite3DbFree(tls, db, pSavepoint) if !!(isTransaction != 0) { goto __557 } (*Sqlite3)(unsafe.Pointer(db)).FnSavepoint-- __557: ; goto __556 __555: ; (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons = (*Savepoint)(unsafe.Pointer(pSavepoint)).FnDeferredCons (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons = (*Savepoint)(unsafe.Pointer(pSavepoint)).FnDeferredImmCons __556: ; if !(!(isTransaction != 0) || p12 == SAVEPOINT_ROLLBACK) { goto __558 } rc = Xsqlite3VtabSavepoint(tls, db, p12, iSavepoint) if !(rc != SQLITE_OK) { goto __559 } goto abort_due_to_error __559: ; __558: ; __534: ; __532: ; __521: ; if !(rc != 0) { goto __560 } goto abort_due_to_error __560: ; if !(int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) == VDBE_HALT_STATE) { goto __561 } rc = SQLITE_DONE goto vdbe_return __561: ; goto __9 __79: desiredAutoCommit = (*Op)(unsafe.Pointer(pOp)).Fp1 iRollback = (*Op)(unsafe.Pointer(pOp)).Fp2 if !(desiredAutoCommit != int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit)) { goto __562 } if !(iRollback != 0) { goto __564 } Xsqlite3RollbackAll(tls, db, SQLITE_ABORT|int32(2)<<8) (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1) goto __565 __564: if !(desiredAutoCommit != 0 && (*Sqlite3)(unsafe.Pointer(db)).FnVdbeWrite > 0) { goto __566 } Xsqlite3VdbeError(tls, p, ts+7003, 0) rc = SQLITE_BUSY goto abort_due_to_error goto __567 __566: if !(libc.AssignInt32(&rc, Xsqlite3VdbeCheckFk(tls, p, 1)) != SQLITE_OK) { goto __568 } goto vdbe_return goto __569 __568: (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(desiredAutoCommit) __569: ; __567: ; __565: ; if !(Xsqlite3VdbeHalt(tls, p) == SQLITE_BUSY) { goto __570 } (*Vdbe)(unsafe.Pointer(p)).Fpc = int32((int64(pOp) - int64(aOp)) / 24) (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1 - desiredAutoCommit) (*Vdbe)(unsafe.Pointer(p)).Frc = libc.AssignInt32(&rc, SQLITE_BUSY) goto vdbe_return __570: ; Xsqlite3CloseSavepoints(tls, db) if !((*Vdbe)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __571 } rc = SQLITE_DONE goto __572 __571: rc = SQLITE_ERROR __572: ; goto vdbe_return goto __563 __562: Xsqlite3VdbeError(tls, p, func() uintptr { if !(desiredAutoCommit != 0) { return ts + 7058 } return func() uintptr { if iRollback != 0 { return ts + 7106 } return ts + 7149 }() }(), 0) rc = SQLITE_ERROR goto abort_due_to_error __563: ; __80: *(*int32)(unsafe.Pointer(bp + 312)) = 0 if !((*Op)(unsafe.Pointer(pOp)).Fp2 != 0 && (*Sqlite3)(unsafe.Pointer(db)).Fflags&(uint64(SQLITE_QueryOnly)|uint64(0x00002)<<32) != uint64(0)) { goto __573 } if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_QueryOnly) != 0) { goto __574 } rc = SQLITE_READONLY goto __575 __574: rc = SQLITE_CORRUPT __575: ; goto abort_due_to_error __573: ; pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32 pBt = (*Db)(unsafe.Pointer(pDb)).FpBt if !(pBt != 0) { goto __576 } rc = Xsqlite3BtreeBeginTrans(tls, pBt, (*Op)(unsafe.Pointer(pOp)).Fp2, bp+312) if !(rc != SQLITE_OK) { goto __577 } if !(rc&0xff == SQLITE_BUSY) { goto __578 } (*Vdbe)(unsafe.Pointer(p)).Fpc = int32((int64(pOp) - int64(aOp)) / 24) (*Vdbe)(unsafe.Pointer(p)).Frc = rc goto vdbe_return __578: ; goto abort_due_to_error __577: ; if !(Bft(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x20>>5)) != 0 && (*Op)(unsafe.Pointer(pOp)).Fp2 != 0 && (int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) == 0 || (*Sqlite3)(unsafe.Pointer(db)).FnVdbeRead > 1)) { goto __579 } if !((*Vdbe)(unsafe.Pointer(p)).FiStatement == 0) { goto __580 } (*Sqlite3)(unsafe.Pointer(db)).FnStatement++ (*Vdbe)(unsafe.Pointer(p)).FiStatement = (*Sqlite3)(unsafe.Pointer(db)).FnSavepoint + (*Sqlite3)(unsafe.Pointer(db)).FnStatement __580: ; rc = Xsqlite3VtabSavepoint(tls, db, SAVEPOINT_BEGIN, (*Vdbe)(unsafe.Pointer(p)).FiStatement-1) if !(rc == SQLITE_OK) { goto __581 } rc = Xsqlite3BtreeBeginStmt(tls, pBt, (*Vdbe)(unsafe.Pointer(p)).FiStatement) __581: ; (*Vdbe)(unsafe.Pointer(p)).FnStmtDefCons = (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons (*Vdbe)(unsafe.Pointer(p)).FnStmtDefImmCons = (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons __579: ; __576: ; if !(rc == SQLITE_OK && (*Op)(unsafe.Pointer(pOp)).Fp5 != 0 && (*(*int32)(unsafe.Pointer(bp + 312)) != (*Op)(unsafe.Pointer(pOp)).Fp3 || (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).FiGeneration != *(*int32)(unsafe.Pointer(pOp + 16)))) { goto __582 } Xsqlite3DbFree(tls, db, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg) (*Vdbe)(unsafe.Pointer(p)).FzErrMsg = Xsqlite3DbStrDup(tls, db, ts+7190) if !((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32)).FpSchema)).Fschema_cookie != *(*int32)(unsafe.Pointer(bp + 312))) { goto __583 } Xsqlite3ResetOneSchema(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1) __583: ; libc.SetBitFieldPtr8Uint32(p+200, Bft(1), 0, 0x3) rc = SQLITE_SCHEMA libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 4, 0x10) __582: ; if !(rc != 0) { goto __584 } goto abort_due_to_error __584: ; goto __9 __81: ; iDb = (*Op)(unsafe.Pointer(pOp)).Fp1 iCookie = (*Op)(unsafe.Pointer(pOp)).Fp3 Xsqlite3BtreeGetMeta(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpBt, iCookie, bp+316) pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(pOut)) = I64(*(*int32)(unsafe.Pointer(bp + 316))) goto __9 __82: ; pDb1 = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32 rc = Xsqlite3BtreeUpdateMeta(tls, (*Db)(unsafe.Pointer(pDb1)).FpBt, (*Op)(unsafe.Pointer(pOp)).Fp2, uint32((*Op)(unsafe.Pointer(pOp)).Fp3)) if !((*Op)(unsafe.Pointer(pOp)).Fp2 == BTREE_SCHEMA_VERSION) { goto __585 } *(*U32)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb1)).FpSchema)) = *(*U32)(unsafe.Pointer(pOp + 12)) - U32((*Op)(unsafe.Pointer(pOp)).Fp5) *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) Xsqlite3FkClearTriggerCache(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1) goto __586 __585: if !((*Op)(unsafe.Pointer(pOp)).Fp2 == BTREE_FILE_FORMAT) { goto __587 } (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb1)).FpSchema)).Ffile_format = U8((*Op)(unsafe.Pointer(pOp)).Fp3) __587: ; __586: ; if !((*Op)(unsafe.Pointer(pOp)).Fp1 == 1) { goto __588 } Xsqlite3ExpirePreparedStatements(tls, db, 0) libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 0, 0x3) __588: ; if !(rc != 0) { goto __589 } goto abort_due_to_error __589: ; goto __9 __83: ; pCur = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(pCur != 0 && (*VdbeCursor)(unsafe.Pointer(pCur)).FpgnoRoot == U32((*Op)(unsafe.Pointer(pOp)).Fp2)) { goto __590 } Xsqlite3BtreeClearCursor(tls, *(*uintptr)(unsafe.Pointer(pCur + 48))) goto open_cursor_set_hints __590: ; __84: __85: ; if !(int32(*(*uint8)(unsafe.Pointer(p + 200))&0x3>>0) == 1) { goto __591 } rc = SQLITE_ABORT | int32(2)<<8 goto abort_due_to_error __591: ; nField1 = 0 pKeyInfo1 = uintptr(0) p23 = U32((*Op)(unsafe.Pointer(pOp)).Fp2) iDb1 = (*Op)(unsafe.Pointer(pOp)).Fp3 pDb2 = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb1)*32 pX = (*Db)(unsafe.Pointer(pDb2)).FpBt if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_OpenWrite) { goto __592 } wrFlag = BTREE_WRCSR | int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_FORDELETE if !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb2)).FpSchema)).Ffile_format) < int32((*Vdbe)(unsafe.Pointer(p)).FminWriteFileFormat)) { goto __594 } (*Vdbe)(unsafe.Pointer(p)).FminWriteFileFormat = (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb2)).FpSchema)).Ffile_format __594: ; goto __593 __592: wrFlag = 0 __593: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_P2ISREG != 0) { goto __595 } pIn2 = aMem + uintptr(p23)*56 Xsqlite3VdbeMemIntegerify(tls, pIn2) p23 = U32(int32(*(*I64)(unsafe.Pointer(pIn2)))) __595: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fp4type) == -8) { goto __596 } pKeyInfo1 = *(*uintptr)(unsafe.Pointer(pOp + 16)) nField1 = int32((*KeyInfo)(unsafe.Pointer(pKeyInfo1)).FnAllField) goto __597 __596: if !(int32((*Op)(unsafe.Pointer(pOp)).Fp4type) == -3) { goto __598 } nField1 = *(*int32)(unsafe.Pointer(pOp + 16)) __598: ; __597: ; pCur = allocateCursor(tls, p, (*Op)(unsafe.Pointer(pOp)).Fp1, nField1, uint8(CURTYPE_BTREE)) if !(pCur == uintptr(0)) { goto __599 } goto no_mem __599: ; (*VdbeCursor)(unsafe.Pointer(pCur)).FiDb = I8(iDb1) (*VdbeCursor)(unsafe.Pointer(pCur)).FnullRow = U8(1) libc.SetBitFieldPtr8Uint32(pCur+8, Bool(1), 2, 0x4) (*VdbeCursor)(unsafe.Pointer(pCur)).FpgnoRoot = p23 rc = Xsqlite3BtreeCursor(tls, pX, p23, wrFlag, pKeyInfo1, *(*uintptr)(unsafe.Pointer(pCur + 48))) (*VdbeCursor)(unsafe.Pointer(pCur)).FpKeyInfo = pKeyInfo1 (*VdbeCursor)(unsafe.Pointer(pCur)).FisTable = U8(libc.Bool32(int32((*Op)(unsafe.Pointer(pOp)).Fp4type) != -8)) open_cursor_set_hints: ; Xsqlite3BtreeCursorHintFlags(tls, *(*uintptr)(unsafe.Pointer(pCur + 48)), uint32(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&(OPFLAG_BULKCSR|OPFLAG_SEEKEQ))) if !(rc != 0) { goto __600 } goto abort_due_to_error __600: ; goto __9 __86: pOrig = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*8)) pCx = allocateCursor(tls, p, (*Op)(unsafe.Pointer(pOp)).Fp1, int32((*VdbeCursor)(unsafe.Pointer(pOrig)).FnField), uint8(CURTYPE_BTREE)) if !(pCx == uintptr(0)) { goto __601 } goto no_mem __601: ; (*VdbeCursor)(unsafe.Pointer(pCx)).FnullRow = U8(1) libc.SetBitFieldPtr8Uint32(pCx+8, Bool(1), 0, 0x1) (*VdbeCursor)(unsafe.Pointer(pCx)).FpKeyInfo = (*VdbeCursor)(unsafe.Pointer(pOrig)).FpKeyInfo (*VdbeCursor)(unsafe.Pointer(pCx)).FisTable = (*VdbeCursor)(unsafe.Pointer(pOrig)).FisTable (*VdbeCursor)(unsafe.Pointer(pCx)).FpgnoRoot = (*VdbeCursor)(unsafe.Pointer(pOrig)).FpgnoRoot libc.SetBitFieldPtr8Uint32(pCx+8, Bool(int32(*(*uint8)(unsafe.Pointer(pOrig + 8))&0x4>>2)), 2, 0x4) *(*uintptr)(unsafe.Pointer(pCx + 16)) = *(*uintptr)(unsafe.Pointer(pOrig + 16)) libc.SetBitFieldPtr8Uint32(pCx+8, Bool(1), 3, 0x8) libc.SetBitFieldPtr8Uint32(pOrig+8, Bool(1), 3, 0x8) rc = Xsqlite3BtreeCursor(tls, *(*uintptr)(unsafe.Pointer(pCx + 16)), (*VdbeCursor)(unsafe.Pointer(pCx)).FpgnoRoot, BTREE_WRCSR, (*VdbeCursor)(unsafe.Pointer(pCx)).FpKeyInfo, *(*uintptr)(unsafe.Pointer(pCx + 48))) goto __9 __87: __88: ; if !((*Op)(unsafe.Pointer(pOp)).Fp3 > 0) { goto __602 } (*Mem)(unsafe.Pointer(aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56)).Fn = 0 (*Mem)(unsafe.Pointer(aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56)).Fz = ts + 1544 __602: ; pCx1 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(pCx1 != 0 && !(int32(*(*uint8)(unsafe.Pointer(pCx1 + 8))&0x8>>3) != 0) && (*Op)(unsafe.Pointer(pOp)).Fp2 <= int32((*VdbeCursor)(unsafe.Pointer(pCx1)).FnField)) { goto __603 } (*VdbeCursor)(unsafe.Pointer(pCx1)).FseqCount = int64(0) (*VdbeCursor)(unsafe.Pointer(pCx1)).FcacheStatus = U32(CACHE_STALE) rc = Xsqlite3BtreeClearTable(tls, *(*uintptr)(unsafe.Pointer(pCx1 + 16)), int32((*VdbeCursor)(unsafe.Pointer(pCx1)).FpgnoRoot), uintptr(0)) goto __604 __603: pCx1 = allocateCursor(tls, p, (*Op)(unsafe.Pointer(pOp)).Fp1, (*Op)(unsafe.Pointer(pOp)).Fp2, uint8(CURTYPE_BTREE)) if !(pCx1 == uintptr(0)) { goto __605 } goto no_mem __605: ; libc.SetBitFieldPtr8Uint32(pCx1+8, Bool(1), 0, 0x1) rc = Xsqlite3BtreeOpen(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, uintptr(0), db, pCx1+16, BTREE_OMIT_JOURNAL|BTREE_SINGLE|int32((*Op)(unsafe.Pointer(pOp)).Fp5), vfsFlags) if !(rc == SQLITE_OK) { goto __606 } rc = Xsqlite3BtreeBeginTrans(tls, *(*uintptr)(unsafe.Pointer(pCx1 + 16)), 1, uintptr(0)) if !(rc == SQLITE_OK) { goto __607 } if !(libc.AssignPtrUintptr(pCx1+56, libc.AssignUintptr(&pKeyInfo2, *(*uintptr)(unsafe.Pointer(pOp + 16)))) != uintptr(0)) { goto __608 } rc = Xsqlite3BtreeCreateTable(tls, *(*uintptr)(unsafe.Pointer(pCx1 + 16)), pCx1+68, BTREE_BLOBKEY|int32((*Op)(unsafe.Pointer(pOp)).Fp5)) if !(rc == SQLITE_OK) { goto __610 } rc = Xsqlite3BtreeCursor(tls, *(*uintptr)(unsafe.Pointer(pCx1 + 16)), (*VdbeCursor)(unsafe.Pointer(pCx1)).FpgnoRoot, BTREE_WRCSR, pKeyInfo2, *(*uintptr)(unsafe.Pointer(pCx1 + 48))) __610: ; (*VdbeCursor)(unsafe.Pointer(pCx1)).FisTable = U8(0) goto __609 __608: (*VdbeCursor)(unsafe.Pointer(pCx1)).FpgnoRoot = Pgno(SCHEMA_ROOT) rc = Xsqlite3BtreeCursor(tls, *(*uintptr)(unsafe.Pointer(pCx1 + 16)), uint32(SCHEMA_ROOT), BTREE_WRCSR, uintptr(0), *(*uintptr)(unsafe.Pointer(pCx1 + 48))) (*VdbeCursor)(unsafe.Pointer(pCx1)).FisTable = U8(1) __609: ; __607: ; libc.SetBitFieldPtr8Uint32(pCx1+8, Bool(libc.Bool32(int32((*Op)(unsafe.Pointer(pOp)).Fp5) != BTREE_UNORDERED)), 2, 0x4) if !(rc != 0) { goto __611 } Xsqlite3BtreeClose(tls, *(*uintptr)(unsafe.Pointer(pCx1 + 16))) __611: ; __606: ; __604: ; if !(rc != 0) { goto __612 } goto abort_due_to_error __612: ; (*VdbeCursor)(unsafe.Pointer(pCx1)).FnullRow = U8(1) goto __9 __89: ; pCx2 = allocateCursor(tls, p, (*Op)(unsafe.Pointer(pOp)).Fp1, (*Op)(unsafe.Pointer(pOp)).Fp2, uint8(CURTYPE_SORTER)) if !(pCx2 == uintptr(0)) { goto __613 } goto no_mem __613: ; (*VdbeCursor)(unsafe.Pointer(pCx2)).FpKeyInfo = *(*uintptr)(unsafe.Pointer(pOp + 16)) rc = Xsqlite3VdbeSorterInit(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp3, pCx2) if !(rc != 0) { goto __614 } goto abort_due_to_error __614: ; goto __9 __90: ; pC4 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(libc.PostIncInt64(&(*VdbeCursor)(unsafe.Pointer(pC4)).FseqCount, 1) == int64(0)) { goto __615 } goto jump_to_p2 __615: ; goto __9 __91: ; pCx3 = allocateCursor(tls, p, (*Op)(unsafe.Pointer(pOp)).Fp1, (*Op)(unsafe.Pointer(pOp)).Fp3, uint8(CURTYPE_PSEUDO)) if !(pCx3 == uintptr(0)) { goto __616 } goto no_mem __616: ; (*VdbeCursor)(unsafe.Pointer(pCx3)).FnullRow = U8(1) (*VdbeCursor)(unsafe.Pointer(pCx3)).FseekResult = (*Op)(unsafe.Pointer(pOp)).Fp2 (*VdbeCursor)(unsafe.Pointer(pCx3)).FisTable = U8(1) *(*uintptr)(unsafe.Pointer(pCx3 + 48)) = Xsqlite3BtreeFakeValidCursor(tls) goto __9 __92: ; Xsqlite3VdbeFreeCursor(tls, p, *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8))) *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) = uintptr(0) goto __9 __93: __94: __95: __96: ; pC5 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) oc = int32((*Op)(unsafe.Pointer(pOp)).Fopcode) eqOnly = 0 (*VdbeCursor)(unsafe.Pointer(pC5)).FnullRow = U8(0) (*VdbeCursor)(unsafe.Pointer(pC5)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(pC5)).FcacheStatus = U32(CACHE_STALE) if !((*VdbeCursor)(unsafe.Pointer(pC5)).FisTable != 0) { goto __617 } pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 flags31 = (*Mem)(unsafe.Pointer(pIn3)).Fflags if !(int32(flags31)&(MEM_Int|MEM_Real|MEM_IntReal|MEM_Str) == MEM_Str) { goto __619 } applyNumericAffinity(tls, pIn3, 0) __619: ; iKey = Xsqlite3VdbeIntValue(tls, pIn3) newType = (*Mem)(unsafe.Pointer(pIn3)).Fflags (*Mem)(unsafe.Pointer(pIn3)).Fflags = flags31 if !(int32(newType)&(MEM_Int|MEM_IntReal) == 0) { goto __620 } if !(int32(newType)&MEM_Real == 0) { goto __621 } if !(int32(newType)&MEM_Null != 0 || oc >= OP_SeekGE) { goto __622 } goto jump_to_p2 goto __623 __622: rc = Xsqlite3BtreeLast(tls, *(*uintptr)(unsafe.Pointer(pC5 + 48)), bp+320) if !(rc != SQLITE_OK) { goto __624 } goto abort_due_to_error __624: ; goto seek_not_found __623: ; __621: ; c2 = Xsqlite3IntFloatCompare(tls, iKey, *(*float64)(unsafe.Pointer(pIn3))) if !(c2 > 0) { goto __625 } if !(oc&0x0001 == OP_SeekGT&0x0001) { goto __627 } oc-- __627: ; goto __626 __625: if !(c2 < 0) { goto __628 } if !(oc&0x0001 == OP_SeekLT&0x0001) { goto __629 } oc++ __629: ; __628: ; __626: ; __620: ; rc = Xsqlite3BtreeTableMoveto(tls, *(*uintptr)(unsafe.Pointer(pC5 + 48)), int64(U64(iKey)), 0, bp+320) (*VdbeCursor)(unsafe.Pointer(pC5)).FmovetoTarget = iKey if !(rc != SQLITE_OK) { goto __630 } goto abort_due_to_error __630: ; goto __618 __617: if !(Xsqlite3BtreeCursorHasHint(tls, *(*uintptr)(unsafe.Pointer(pC5 + 48)), uint32(BTREE_SEEK_EQ)) != 0) { goto __631 } eqOnly = 1 __631: ; nField2 = *(*int32)(unsafe.Pointer(pOp + 16)) (*UnpackedRecord)(unsafe.Pointer(bp + 328)).FpKeyInfo = (*VdbeCursor)(unsafe.Pointer(pC5)).FpKeyInfo (*UnpackedRecord)(unsafe.Pointer(bp + 328)).FnField = U16(nField2) (*UnpackedRecord)(unsafe.Pointer(bp + 328)).Fdefault_rc = func() int8 { if 1&(oc-OP_SeekLT) != 0 { return int8(-1) } return +int8(1) }() (*UnpackedRecord)(unsafe.Pointer(bp + 328)).FaMem = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 (*UnpackedRecord)(unsafe.Pointer(bp + 328)).FeqSeen = U8(0) rc = Xsqlite3BtreeIndexMoveto(tls, *(*uintptr)(unsafe.Pointer(pC5 + 48)), bp+328, bp+320) if !(rc != SQLITE_OK) { goto __632 } goto abort_due_to_error __632: ; if !(eqOnly != 0 && int32((*UnpackedRecord)(unsafe.Pointer(bp+328)).FeqSeen) == 0) { goto __633 } goto seek_not_found __633: ; __618: ; if !(oc >= OP_SeekGE) { goto __634 } if !(*(*int32)(unsafe.Pointer(bp + 320)) < 0 || *(*int32)(unsafe.Pointer(bp + 320)) == 0 && oc == OP_SeekGT) { goto __636 } *(*int32)(unsafe.Pointer(bp + 320)) = 0 rc = Xsqlite3BtreeNext(tls, *(*uintptr)(unsafe.Pointer(pC5 + 48)), 0) if !(rc != SQLITE_OK) { goto __638 } if !(rc == SQLITE_DONE) { goto __639 } rc = SQLITE_OK *(*int32)(unsafe.Pointer(bp + 320)) = 1 goto __640 __639: goto abort_due_to_error __640: ; __638: ; goto __637 __636: *(*int32)(unsafe.Pointer(bp + 320)) = 0 __637: ; goto __635 __634: ; if !(*(*int32)(unsafe.Pointer(bp + 320)) > 0 || *(*int32)(unsafe.Pointer(bp + 320)) == 0 && oc == OP_SeekLT) { goto __641 } *(*int32)(unsafe.Pointer(bp + 320)) = 0 rc = Xsqlite3BtreePrevious(tls, *(*uintptr)(unsafe.Pointer(pC5 + 48)), 0) if !(rc != SQLITE_OK) { goto __643 } if !(rc == SQLITE_DONE) { goto __644 } rc = SQLITE_OK *(*int32)(unsafe.Pointer(bp + 320)) = 1 goto __645 __644: goto abort_due_to_error __645: ; __643: ; goto __642 __641: *(*int32)(unsafe.Pointer(bp + 320)) = Xsqlite3BtreeEof(tls, *(*uintptr)(unsafe.Pointer(pC5 + 48))) __642: ; __635: ; seek_not_found: ; if !(*(*int32)(unsafe.Pointer(bp + 320)) != 0) { goto __646 } goto jump_to_p2 goto __647 __646: if !(eqOnly != 0) { goto __648 } pOp += 24 __648: ; __647: ; goto __9 __97: ; pC6 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp+1*24)).Fp1)*8)) if !!(Xsqlite3BtreeCursorIsValidNN(tls, *(*uintptr)(unsafe.Pointer(pC6 + 48))) != 0) { goto __649 } goto __9 __649: ; nStep = (*Op)(unsafe.Pointer(pOp)).Fp1 (*UnpackedRecord)(unsafe.Pointer(bp + 368)).FpKeyInfo = (*VdbeCursor)(unsafe.Pointer(pC6)).FpKeyInfo (*UnpackedRecord)(unsafe.Pointer(bp + 368)).FnField = U16(*(*int32)(unsafe.Pointer(pOp + 1*24 + 16))) (*UnpackedRecord)(unsafe.Pointer(bp + 368)).Fdefault_rc = int8(0) (*UnpackedRecord)(unsafe.Pointer(bp + 368)).FaMem = aMem + uintptr((*Op)(unsafe.Pointer(pOp+1*24)).Fp3)*56 *(*int32)(unsafe.Pointer(bp + 408)) = 0 __650: if !(1 != 0) { goto __651 } rc = Xsqlite3VdbeIdxKeyCompare(tls, db, pC6, bp+368, bp+408) if !(rc != 0) { goto __652 } goto abort_due_to_error __652: ; if !(*(*int32)(unsafe.Pointer(bp + 408)) > 0 && int32((*Op)(unsafe.Pointer(pOp)).Fp5) == 0) { goto __653 } seekscan_search_fail: ; pOp += 24 goto jump_to_p2 __653: ; if !(*(*int32)(unsafe.Pointer(bp + 408)) >= 0) { goto __654 } goto jump_to_p2 goto __651 __654: ; if !(nStep <= 0) { goto __655 } goto __651 __655: ; nStep-- rc = Xsqlite3BtreeNext(tls, *(*uintptr)(unsafe.Pointer(pC6 + 48)), 0) if !(rc != 0) { goto __656 } if !(rc == SQLITE_DONE) { goto __657 } rc = SQLITE_OK goto seekscan_search_fail goto __658 __657: goto abort_due_to_error __658: ; __656: ; goto __650 __651: ; goto __9 __98: ; pC7 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(int32((*VdbeCursor)(unsafe.Pointer(pC7)).FseekHit) < (*Op)(unsafe.Pointer(pOp)).Fp2) { goto __659 } (*VdbeCursor)(unsafe.Pointer(pC7)).FseekHit = U16((*Op)(unsafe.Pointer(pOp)).Fp2) goto __660 __659: if !(int32((*VdbeCursor)(unsafe.Pointer(pC7)).FseekHit) > (*Op)(unsafe.Pointer(pOp)).Fp3) { goto __661 } (*VdbeCursor)(unsafe.Pointer(pC7)).FseekHit = U16((*Op)(unsafe.Pointer(pOp)).Fp3) __661: ; __660: ; goto __9 __99: ; pCur1 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(pCur1 == uintptr(0) || (*VdbeCursor)(unsafe.Pointer(pCur1)).FnullRow != 0) { goto __662 } goto jump_to_p2_and_check_for_interrupt __662: ; goto __9 __100: ; pC8 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(int32((*VdbeCursor)(unsafe.Pointer(pC8)).FseekHit) >= *(*int32)(unsafe.Pointer(pOp + 16))) { goto __663 } goto __9 __663: ; __101: __102: __103: ; pC9 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) (*UnpackedRecord)(unsafe.Pointer(bp + 416)).FaMem = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 (*UnpackedRecord)(unsafe.Pointer(bp + 416)).FnField = U16(*(*int32)(unsafe.Pointer(pOp + 16))) if !(int32((*UnpackedRecord)(unsafe.Pointer(bp+416)).FnField) > 0) { goto __664 } (*UnpackedRecord)(unsafe.Pointer(bp + 416)).FpKeyInfo = (*VdbeCursor)(unsafe.Pointer(pC9)).FpKeyInfo (*UnpackedRecord)(unsafe.Pointer(bp + 416)).Fdefault_rc = int8(0) rc = Xsqlite3BtreeIndexMoveto(tls, *(*uintptr)(unsafe.Pointer(pC9 + 48)), bp+416, pC9+36) goto __665 __664: ; rc = func() int32 { if int32((*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(bp+416)).FaMem)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, (*UnpackedRecord)(unsafe.Pointer(bp+416)).FaMem) } return 0 }() if !(rc != 0) { goto __666 } goto no_mem __666: ; pIdxKey = Xsqlite3VdbeAllocUnpackedRecord(tls, (*VdbeCursor)(unsafe.Pointer(pC9)).FpKeyInfo) if !(pIdxKey == uintptr(0)) { goto __667 } goto no_mem __667: ; Xsqlite3VdbeRecordUnpack(tls, (*VdbeCursor)(unsafe.Pointer(pC9)).FpKeyInfo, (*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(bp+416)).FaMem)).Fn, (*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(bp+416)).FaMem)).Fz, pIdxKey) (*UnpackedRecord)(unsafe.Pointer(pIdxKey)).Fdefault_rc = int8(0) rc = Xsqlite3BtreeIndexMoveto(tls, *(*uintptr)(unsafe.Pointer(pC9 + 48)), pIdxKey, pC9+36) Xsqlite3DbFreeNN(tls, db, pIdxKey) __665: ; if !(rc != SQLITE_OK) { goto __668 } goto abort_due_to_error __668: ; alreadyExists = libc.Bool32((*VdbeCursor)(unsafe.Pointer(pC9)).FseekResult == 0) (*VdbeCursor)(unsafe.Pointer(pC9)).FnullRow = U8(1 - alreadyExists) (*VdbeCursor)(unsafe.Pointer(pC9)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(pC9)).FcacheStatus = U32(CACHE_STALE) if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_Found) { goto __669 } if !(alreadyExists != 0) { goto __671 } goto jump_to_p2 __671: ; goto __670 __669: if !!(alreadyExists != 0) { goto __672 } goto jump_to_p2 __672: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_NoConflict) { goto __673 } ii1 = 0 __674: if !(ii1 < int32((*UnpackedRecord)(unsafe.Pointer(bp+416)).FnField)) { goto __676 } if !(int32((*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(bp+416)).FaMem+uintptr(ii1)*56)).Fflags)&MEM_Null != 0) { goto __677 } goto jump_to_p2 __677: ; goto __675 __675: ii1++ goto __674 goto __676 __676: ; __673: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_IfNoHope) { goto __678 } (*VdbeCursor)(unsafe.Pointer(pC9)).FseekHit = U16(*(*int32)(unsafe.Pointer(pOp + 16))) __678: ; __670: ; goto __9 __104: pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !(int32((*Mem)(unsafe.Pointer(pIn3)).Fflags)&(MEM_Int|MEM_IntReal) == 0) { goto __679 } *(*Mem)(unsafe.Pointer(bp + 456)) = *(*Mem)(unsafe.Pointer(pIn3)) applyAffinity(tls, bp+456, int8(SQLITE_AFF_NUMERIC), encoding) if !(int32((*Mem)(unsafe.Pointer(bp+456)).Fflags)&MEM_Int == 0) { goto __680 } goto jump_to_p2 __680: ; iKey1 = U64(*(*I64)(unsafe.Pointer(bp + 456))) goto notExistsWithKey __679: ; __105: pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 iKey1 = U64(*(*I64)(unsafe.Pointer(pIn3))) notExistsWithKey: pC10 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pCrsr2 = *(*uintptr)(unsafe.Pointer(pC10 + 48)) *(*int32)(unsafe.Pointer(bp + 512)) = 0 rc = Xsqlite3BtreeTableMoveto(tls, pCrsr2, int64(iKey1), 0, bp+512) (*VdbeCursor)(unsafe.Pointer(pC10)).FmovetoTarget = I64(iKey1) (*VdbeCursor)(unsafe.Pointer(pC10)).FnullRow = U8(0) (*VdbeCursor)(unsafe.Pointer(pC10)).FcacheStatus = U32(CACHE_STALE) (*VdbeCursor)(unsafe.Pointer(pC10)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(pC10)).FseekResult = *(*int32)(unsafe.Pointer(bp + 512)) if !(*(*int32)(unsafe.Pointer(bp + 512)) != 0) { goto __681 } if !((*Op)(unsafe.Pointer(pOp)).Fp2 == 0) { goto __682 } rc = Xsqlite3CorruptError(tls, 95563) goto __683 __682: goto jump_to_p2 __683: ; __681: ; if !(rc != 0) { goto __684 } goto abort_due_to_error __684: ; goto __9 __106: ; pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(pOut)) = libc.PostIncInt64(&(*VdbeCursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)))).FseqCount, 1) goto __9 __107: *(*I64)(unsafe.Pointer(bp + 520)) = int64(0) *(*int32)(unsafe.Pointer(bp + 516)) = 0 pOut = out2Prerelease(tls, p, pOp) pC11 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !!(int32(*(*uint8)(unsafe.Pointer(pC11 + 8))&0x2>>1) != 0) { goto __685 } rc = Xsqlite3BtreeLast(tls, *(*uintptr)(unsafe.Pointer(pC11 + 48)), bp+516) if !(rc != SQLITE_OK) { goto __686 } goto abort_due_to_error __686: ; if !(*(*int32)(unsafe.Pointer(bp + 516)) != 0) { goto __687 } *(*I64)(unsafe.Pointer(bp + 520)) = int64(1) goto __688 __687: ; *(*I64)(unsafe.Pointer(bp + 520)) = Xsqlite3BtreeIntegerKey(tls, *(*uintptr)(unsafe.Pointer(pC11 + 48))) if !(*(*I64)(unsafe.Pointer(bp + 520)) >= int64(uint64(0x7fffffff)<<32|uint64(0xffffffff))) { goto __689 } libc.SetBitFieldPtr8Uint32(pC11+8, Bool(1), 1, 0x2) goto __690 __689: *(*I64)(unsafe.Pointer(bp + 520))++ __690: ; __688: ; __685: ; if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __691 } if !((*Vdbe)(unsafe.Pointer(p)).FpFrame != 0) { goto __692 } pFrame1 = (*Vdbe)(unsafe.Pointer(p)).FpFrame __694: if !((*VdbeFrame)(unsafe.Pointer(pFrame1)).FpParent != 0) { goto __696 } goto __695 __695: pFrame1 = (*VdbeFrame)(unsafe.Pointer(pFrame1)).FpParent goto __694 goto __696 __696: ; pMem = (*VdbeFrame)(unsafe.Pointer(pFrame1)).FaMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 goto __693 __692: ; pMem = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 __693: ; Xsqlite3VdbeMemIntegerify(tls, pMem) if !(*(*I64)(unsafe.Pointer(pMem)) == int64(uint64(0x7fffffff)<<32|uint64(0xffffffff)) || Bool(int32(*(*uint8)(unsafe.Pointer(pC11 + 8))&0x2>>1)) != 0) { goto __697 } rc = SQLITE_FULL goto abort_due_to_error __697: ; if !(*(*I64)(unsafe.Pointer(bp + 520)) < *(*I64)(unsafe.Pointer(pMem))+int64(1)) { goto __698 } *(*I64)(unsafe.Pointer(bp + 520)) = *(*I64)(unsafe.Pointer(pMem)) + int64(1) __698: ; *(*I64)(unsafe.Pointer(pMem)) = *(*I64)(unsafe.Pointer(bp + 520)) __691: ; if !(Bool(int32(*(*uint8)(unsafe.Pointer(pC11 + 8))&0x2>>1)) != 0) { goto __699 } cnt1 = 0 __700: Xsqlite3_randomness(tls, int32(unsafe.Sizeof(I64(0))), bp+520) *(*I64)(unsafe.Pointer(bp + 520)) &= int64(uint64(0x7fffffff)<<32|uint64(0xffffffff)) >> 1 *(*I64)(unsafe.Pointer(bp + 520))++ goto __701 __701: if libc.AssignInt32(&rc, Xsqlite3BtreeTableMoveto(tls, *(*uintptr)(unsafe.Pointer(pC11 + 48)), int64(U64(*(*I64)(unsafe.Pointer(bp + 520)))), 0, bp+516)) == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 516)) == 0 && libc.PreIncInt32(&cnt1, 1) < 100 { goto __700 } goto __702 __702: ; if !(rc != 0) { goto __703 } goto abort_due_to_error __703: ; if !(*(*int32)(unsafe.Pointer(bp + 516)) == 0) { goto __704 } rc = SQLITE_FULL goto abort_due_to_error __704: ; __699: ; (*VdbeCursor)(unsafe.Pointer(pC11)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(pC11)).FcacheStatus = U32(CACHE_STALE) *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(bp + 520)) goto __9 __108: pData = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 pC12 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pKey = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 (*BtreePayload)(unsafe.Pointer(bp + 528)).FnKey = *(*I64)(unsafe.Pointer(pKey)) if !(int32((*Op)(unsafe.Pointer(pOp)).Fp4type) == -5 && ((*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback != 0 || (*Sqlite3)(unsafe.Pointer(db)).FxUpdateCallback != 0)) { goto __705 } zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*VdbeCursor)(unsafe.Pointer(pC12)).FiDb)*32)).FzDbSName pTab1 = *(*uintptr)(unsafe.Pointer(pOp + 16)) goto __706 __705: pTab1 = uintptr(0) zDb = uintptr(0) __706: ; if !(pTab1 != 0) { goto __707 } if !((*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback != 0 && !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_ISUPDATE != 0)) { goto __708 } Xsqlite3VdbePreUpdateHook(tls, p, pC12, SQLITE_INSERT, zDb, pTab1, (*BtreePayload)(unsafe.Pointer(bp+528)).FnKey, (*Op)(unsafe.Pointer(pOp)).Fp2, -1) __708: ; if !((*Sqlite3)(unsafe.Pointer(db)).FxUpdateCallback == uintptr(0) || (*Table)(unsafe.Pointer(pTab1)).FaCol == uintptr(0)) { goto __709 } pTab1 = uintptr(0) __709: ; __707: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_ISNOOP != 0) { goto __710 } goto __9 __710: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_NCHANGE != 0) { goto __711 } (*Vdbe)(unsafe.Pointer(p)).FnChange++ if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_LASTROWID != 0) { goto __712 } (*Sqlite3)(unsafe.Pointer(db)).FlastRowid = (*BtreePayload)(unsafe.Pointer(bp + 528)).FnKey __712: ; __711: ; (*BtreePayload)(unsafe.Pointer(bp + 528)).FpData = (*Mem)(unsafe.Pointer(pData)).Fz (*BtreePayload)(unsafe.Pointer(bp + 528)).FnData = (*Mem)(unsafe.Pointer(pData)).Fn seekResult = func() int32 { if int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_USESEEKRESULT != 0 { return (*VdbeCursor)(unsafe.Pointer(pC12)).FseekResult } return 0 }() if !(int32((*Mem)(unsafe.Pointer(pData)).Fflags)&MEM_Zero != 0) { goto __713 } (*BtreePayload)(unsafe.Pointer(bp + 528)).FnZero = *(*int32)(unsafe.Pointer(pData)) goto __714 __713: (*BtreePayload)(unsafe.Pointer(bp + 528)).FnZero = 0 __714: ; (*BtreePayload)(unsafe.Pointer(bp + 528)).FpKey = uintptr(0) rc = Xsqlite3BtreeInsert(tls, *(*uintptr)(unsafe.Pointer(pC12 + 48)), bp+528, int32((*Op)(unsafe.Pointer(pOp)).Fp5)&(OPFLAG_APPEND|OPFLAG_SAVEPOSITION|OPFLAG_PREFORMAT), seekResult) (*VdbeCursor)(unsafe.Pointer(pC12)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(pC12)).FcacheStatus = U32(CACHE_STALE) if !(rc != 0) { goto __715 } goto abort_due_to_error __715: ; if !(pTab1 != 0) { goto __716 } (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, Sqlite_int64) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxUpdateCallback})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpUpdateArg, func() int32 { if int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_ISUPDATE != 0 { return SQLITE_UPDATE } return SQLITE_INSERT }(), zDb, (*Table)(unsafe.Pointer(pTab1)).FzName, (*BtreePayload)(unsafe.Pointer(bp+528)).FnKey) __716: ; goto __9 __109: ; pDest1 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pSrc = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*8)) if (*Op)(unsafe.Pointer(pOp)).Fp3 != 0 { iKey2 = *(*I64)(unsafe.Pointer(aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56)) } else { iKey2 = int64(0) } rc = Xsqlite3BtreeTransferRow(tls, *(*uintptr)(unsafe.Pointer(pDest1 + 48)), *(*uintptr)(unsafe.Pointer(pSrc + 48)), iKey2) if !(rc != SQLITE_OK) { goto __717 } goto abort_due_to_error __717: ; goto __9 __110: opflags = (*Op)(unsafe.Pointer(pOp)).Fp2 pC13 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(int32((*Op)(unsafe.Pointer(pOp)).Fp4type) == -5 && ((*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback != 0 || (*Sqlite3)(unsafe.Pointer(db)).FxUpdateCallback != 0)) { goto __718 } zDb1 = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*VdbeCursor)(unsafe.Pointer(pC13)).FiDb)*32)).FzDbSName pTab2 = *(*uintptr)(unsafe.Pointer(pOp + 16)) if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_SAVEPOSITION != 0 && (*VdbeCursor)(unsafe.Pointer(pC13)).FisTable != 0) { goto __720 } (*VdbeCursor)(unsafe.Pointer(pC13)).FmovetoTarget = Xsqlite3BtreeIntegerKey(tls, *(*uintptr)(unsafe.Pointer(pC13 + 48))) __720: ; goto __719 __718: zDb1 = uintptr(0) pTab2 = uintptr(0) __719: ; if !((*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback != 0 && pTab2 != 0) { goto __721 } Xsqlite3VdbePreUpdateHook(tls, p, pC13, func() int32 { if opflags&OPFLAG_ISUPDATE != 0 { return SQLITE_UPDATE } return SQLITE_DELETE }(), zDb1, pTab2, (*VdbeCursor)(unsafe.Pointer(pC13)).FmovetoTarget, (*Op)(unsafe.Pointer(pOp)).Fp3, -1) __721: ; if !(opflags&OPFLAG_ISNOOP != 0) { goto __722 } goto __9 __722: ; rc = Xsqlite3BtreeDelete(tls, *(*uintptr)(unsafe.Pointer(pC13 + 48)), uint8((*Op)(unsafe.Pointer(pOp)).Fp5)) (*VdbeCursor)(unsafe.Pointer(pC13)).FcacheStatus = U32(CACHE_STALE) (*VdbeCursor)(unsafe.Pointer(pC13)).FseekResult = 0 if !(rc != 0) { goto __723 } goto abort_due_to_error __723: ; if !(opflags&OPFLAG_NCHANGE != 0) { goto __724 } (*Vdbe)(unsafe.Pointer(p)).FnChange++ if !((*Sqlite3)(unsafe.Pointer(db)).FxUpdateCallback != 0 && pTab2 != uintptr(0) && (*Table)(unsafe.Pointer(pTab2)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __725 } (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, Sqlite_int64) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxUpdateCallback})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpUpdateArg, SQLITE_DELETE, zDb1, (*Table)(unsafe.Pointer(pTab2)).FzName, (*VdbeCursor)(unsafe.Pointer(pC13)).FmovetoTarget) __725: ; __724: ; goto __9 __111: Xsqlite3VdbeSetChanges(tls, db, (*Vdbe)(unsafe.Pointer(p)).FnChange) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) goto __9 __112: pC14 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 nKeyCol = *(*int32)(unsafe.Pointer(pOp + 16)) *(*int32)(unsafe.Pointer(bp + 576)) = 0 rc = Xsqlite3VdbeSorterCompare(tls, pC14, pIn3, nKeyCol, bp+576) if !(rc != 0) { goto __726 } goto abort_due_to_error __726: ; if !(*(*int32)(unsafe.Pointer(bp + 576)) != 0) { goto __727 } goto jump_to_p2 __727: ; goto __9 __113: pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 pC15 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) rc = Xsqlite3VdbeSorterRowkey(tls, pC15, pOut) if !(rc != 0) { goto __728 } goto abort_due_to_error __728: ; (*VdbeCursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*8)))).FcacheStatus = U32(CACHE_STALE) goto __9 __114: pOut = out2Prerelease(tls, p, pOp) pC16 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pCrsr3 = *(*uintptr)(unsafe.Pointer(pC16 + 48)) n3 = Xsqlite3BtreePayloadSize(tls, pCrsr3) if !(n3 > U32(*(*int32)(unsafe.Pointer(db + 136)))) { goto __729 } goto too_big __729: ; rc = Xsqlite3VdbeMemFromBtreeZeroOffset(tls, pCrsr3, n3, pOut) if !(rc != 0) { goto __730 } goto abort_due_to_error __730: ; if !!((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __731 } if !(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&MEM_Ephem != 0 && Xsqlite3VdbeMemMakeWriteable(tls, pOut) != 0) { goto __732 } goto no_mem __732: ; __731: ; goto __9 __115: pOut = out2Prerelease(tls, p, pOp) pC17 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !((*VdbeCursor)(unsafe.Pointer(pC17)).FnullRow != 0) { goto __733 } (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Null) goto __9 goto __734 __733: if !((*VdbeCursor)(unsafe.Pointer(pC17)).FdeferredMoveto != 0) { goto __735 } *(*I64)(unsafe.Pointer(bp + 584)) = (*VdbeCursor)(unsafe.Pointer(pC17)).FmovetoTarget goto __736 __735: if !(int32((*VdbeCursor)(unsafe.Pointer(pC17)).FeCurType) == CURTYPE_VTAB) { goto __737 } pVtab = (*Sqlite3_vtab_cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pC17 + 48)))).FpVtab pModule = (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FpModule rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule)).FxRowid})).f(tls, *(*uintptr)(unsafe.Pointer(pC17 + 48)), bp+584) Xsqlite3VtabImportErrmsg(tls, p, pVtab) if !(rc != 0) { goto __739 } goto abort_due_to_error __739: ; goto __738 __737: ; rc = Xsqlite3VdbeCursorRestore(tls, pC17) if !(rc != 0) { goto __740 } goto abort_due_to_error __740: ; if !((*VdbeCursor)(unsafe.Pointer(pC17)).FnullRow != 0) { goto __741 } (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Null) goto __9 __741: ; *(*I64)(unsafe.Pointer(bp + 584)) = Xsqlite3BtreeIntegerKey(tls, *(*uintptr)(unsafe.Pointer(pC17 + 48))) __738: ; __736: ; __734: ; *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(bp + 584)) goto __9 __116: ; pC18 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(pC18 == uintptr(0)) { goto __742 } pC18 = allocateCursor(tls, p, (*Op)(unsafe.Pointer(pOp)).Fp1, 1, uint8(CURTYPE_PSEUDO)) if !(pC18 == uintptr(0)) { goto __743 } goto no_mem __743: ; (*VdbeCursor)(unsafe.Pointer(pC18)).FseekResult = 0 (*VdbeCursor)(unsafe.Pointer(pC18)).FisTable = U8(1) libc.SetBitFieldPtr8Uint32(pC18+8, Bool(1), 3, 0x8) *(*uintptr)(unsafe.Pointer(pC18 + 48)) = Xsqlite3BtreeFakeValidCursor(tls) __742: ; (*VdbeCursor)(unsafe.Pointer(pC18)).FnullRow = U8(1) (*VdbeCursor)(unsafe.Pointer(pC18)).FcacheStatus = U32(CACHE_STALE) if !(int32((*VdbeCursor)(unsafe.Pointer(pC18)).FeCurType) == CURTYPE_BTREE) { goto __744 } Xsqlite3BtreeClearCursor(tls, *(*uintptr)(unsafe.Pointer(pC18 + 48))) __744: ; goto __9 __117: __118: ; pC19 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pCrsr4 = *(*uintptr)(unsafe.Pointer(pC19 + 48)) *(*int32)(unsafe.Pointer(bp + 592)) = 0 if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_SeekEnd) { goto __745 } (*VdbeCursor)(unsafe.Pointer(pC19)).FseekResult = -1 if !(Xsqlite3BtreeCursorIsValidNN(tls, pCrsr4) != 0) { goto __746 } goto __9 __746: ; __745: ; rc = Xsqlite3BtreeLast(tls, pCrsr4, bp+592) (*VdbeCursor)(unsafe.Pointer(pC19)).FnullRow = U8(*(*int32)(unsafe.Pointer(bp + 592))) (*VdbeCursor)(unsafe.Pointer(pC19)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(pC19)).FcacheStatus = U32(CACHE_STALE) if !(rc != 0) { goto __747 } goto abort_due_to_error __747: ; if !((*Op)(unsafe.Pointer(pOp)).Fp2 > 0) { goto __748 } if !(*(*int32)(unsafe.Pointer(bp + 592)) != 0) { goto __749 } goto jump_to_p2 __749: ; __748: ; goto __9 __119: ; pC20 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pCrsr5 = *(*uintptr)(unsafe.Pointer(pC20 + 48)) rc = Xsqlite3BtreeFirst(tls, pCrsr5, bp+596) if !(rc != 0) { goto __750 } goto abort_due_to_error __750: ; if !(*(*int32)(unsafe.Pointer(bp + 596)) == 0) { goto __751 } sz = Xsqlite3BtreeRowCountEst(tls, pCrsr5) if !(sz >= int64(0) && int32(Xsqlite3LogEst(tls, U64(sz))) < (*Op)(unsafe.Pointer(pOp)).Fp3) { goto __752 } *(*int32)(unsafe.Pointer(bp + 596)) = 1 __752: ; __751: ; if !(*(*int32)(unsafe.Pointer(bp + 596)) != 0) { goto __753 } goto jump_to_p2 __753: ; goto __9 __120: __121: *(*U32)(unsafe.Pointer(p + 212 + 2*4))++ __122: ; pC21 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) *(*int32)(unsafe.Pointer(bp + 600)) = 1 if !(int32((*VdbeCursor)(unsafe.Pointer(pC21)).FeCurType) == CURTYPE_SORTER) { goto __754 } rc = Xsqlite3VdbeSorterRewind(tls, pC21, bp+600) goto __755 __754: ; pCrsr6 = *(*uintptr)(unsafe.Pointer(pC21 + 48)) rc = Xsqlite3BtreeFirst(tls, pCrsr6, bp+600) (*VdbeCursor)(unsafe.Pointer(pC21)).FdeferredMoveto = U8(0) (*VdbeCursor)(unsafe.Pointer(pC21)).FcacheStatus = U32(CACHE_STALE) __755: ; if !(rc != 0) { goto __756 } goto abort_due_to_error __756: ; (*VdbeCursor)(unsafe.Pointer(pC21)).FnullRow = U8(*(*int32)(unsafe.Pointer(bp + 600))) if !((*Op)(unsafe.Pointer(pOp)).Fp2 > 0) { goto __757 } if !(*(*int32)(unsafe.Pointer(bp + 600)) != 0) { goto __758 } goto jump_to_p2 __758: ; __757: ; goto __9 __123: pC22 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) rc = Xsqlite3VdbeSorterNext(tls, db, pC22) goto next_tail __124: ; pC22 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) rc = Xsqlite3BtreePrevious(tls, *(*uintptr)(unsafe.Pointer(pC22 + 48)), (*Op)(unsafe.Pointer(pOp)).Fp3) goto next_tail __125: ; pC22 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) rc = Xsqlite3BtreeNext(tls, *(*uintptr)(unsafe.Pointer(pC22 + 48)), (*Op)(unsafe.Pointer(pOp)).Fp3) next_tail: (*VdbeCursor)(unsafe.Pointer(pC22)).FcacheStatus = U32(CACHE_STALE) if !(rc == SQLITE_OK) { goto __759 } (*VdbeCursor)(unsafe.Pointer(pC22)).FnullRow = U8(0) *(*U32)(unsafe.Pointer(p + 212 + uintptr((*Op)(unsafe.Pointer(pOp)).Fp5)*4))++ goto jump_to_p2_and_check_for_interrupt __759: ; if !(rc != SQLITE_DONE) { goto __760 } goto abort_due_to_error __760: ; rc = SQLITE_OK (*VdbeCursor)(unsafe.Pointer(pC22)).FnullRow = U8(1) goto check_for_interrupt __126: ; pC23 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pIn2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_NCHANGE != 0) { goto __761 } (*Vdbe)(unsafe.Pointer(p)).FnChange++ __761: ; rc = func() int32 { if int32((*Mem)(unsafe.Pointer(pIn2)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, pIn2) } return 0 }() if !(rc != 0) { goto __762 } goto abort_due_to_error __762: ; (*BtreePayload)(unsafe.Pointer(bp + 608)).FnKey = Sqlite3_int64((*Mem)(unsafe.Pointer(pIn2)).Fn) (*BtreePayload)(unsafe.Pointer(bp + 608)).FpKey = (*Mem)(unsafe.Pointer(pIn2)).Fz (*BtreePayload)(unsafe.Pointer(bp + 608)).FaMem = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 (*BtreePayload)(unsafe.Pointer(bp + 608)).FnMem = U16(*(*int32)(unsafe.Pointer(pOp + 16))) rc = Xsqlite3BtreeInsert(tls, *(*uintptr)(unsafe.Pointer(pC23 + 48)), bp+608, int32((*Op)(unsafe.Pointer(pOp)).Fp5)&(OPFLAG_APPEND|OPFLAG_SAVEPOSITION|OPFLAG_PREFORMAT), func() int32 { if int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_USESEEKRESULT != 0 { return (*VdbeCursor)(unsafe.Pointer(pC23)).FseekResult } return 0 }()) (*VdbeCursor)(unsafe.Pointer(pC23)).FcacheStatus = U32(CACHE_STALE) if !(rc != 0) { goto __763 } goto abort_due_to_error __763: ; goto __9 __127: ; pC24 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pIn2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 rc = func() int32 { if int32((*Mem)(unsafe.Pointer(pIn2)).Fflags)&MEM_Zero != 0 { return Xsqlite3VdbeMemExpandBlob(tls, pIn2) } return 0 }() if !(rc != 0) { goto __764 } goto abort_due_to_error __764: ; rc = Xsqlite3VdbeSorterWrite(tls, pC24, pIn2) if !(rc != 0) { goto __765 } goto abort_due_to_error __765: ; goto __9 __128: ; pC25 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pCrsr7 = *(*uintptr)(unsafe.Pointer(pC25 + 48)) (*UnpackedRecord)(unsafe.Pointer(bp + 656)).FpKeyInfo = (*VdbeCursor)(unsafe.Pointer(pC25)).FpKeyInfo (*UnpackedRecord)(unsafe.Pointer(bp + 656)).FnField = U16((*Op)(unsafe.Pointer(pOp)).Fp3) (*UnpackedRecord)(unsafe.Pointer(bp + 656)).Fdefault_rc = int8(0) (*UnpackedRecord)(unsafe.Pointer(bp + 656)).FaMem = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 rc = Xsqlite3BtreeIndexMoveto(tls, pCrsr7, bp+656, bp+696) if !(rc != 0) { goto __766 } goto abort_due_to_error __766: ; if !(*(*int32)(unsafe.Pointer(bp + 696)) == 0) { goto __767 } rc = Xsqlite3BtreeDelete(tls, pCrsr7, uint8(BTREE_AUXDELETE)) if !(rc != 0) { goto __769 } goto abort_due_to_error __769: ; goto __768 __767: if !((*Op)(unsafe.Pointer(pOp)).Fp5 != 0 && !(Xsqlite3WritableSchema(tls, db) != 0)) { goto __770 } rc = Xsqlite3ReportError(tls, SQLITE_CORRUPT|int32(3)<<8, 96638, ts+7218) goto abort_due_to_error __770: ; __768: ; (*VdbeCursor)(unsafe.Pointer(pC25)).FcacheStatus = U32(CACHE_STALE) (*VdbeCursor)(unsafe.Pointer(pC25)).FseekResult = 0 goto __9 __129: __130: ; pC26 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) rc = Xsqlite3VdbeCursorRestore(tls, pC26) if !(rc != SQLITE_OK) { goto __771 } goto abort_due_to_error __771: ; if !!(int32((*VdbeCursor)(unsafe.Pointer(pC26)).FnullRow) != 0) { goto __772 } *(*I64)(unsafe.Pointer(bp + 704)) = int64(0) rc = Xsqlite3VdbeIdxRowid(tls, db, *(*uintptr)(unsafe.Pointer(pC26 + 48)), bp+704) if !(rc != SQLITE_OK) { goto __774 } goto abort_due_to_error __774: ; if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_DeferredSeek) { goto __775 } pTabCur = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*8)) (*VdbeCursor)(unsafe.Pointer(pTabCur)).FnullRow = U8(0) (*VdbeCursor)(unsafe.Pointer(pTabCur)).FmovetoTarget = *(*I64)(unsafe.Pointer(bp + 704)) (*VdbeCursor)(unsafe.Pointer(pTabCur)).FdeferredMoveto = U8(1) (*VdbeCursor)(unsafe.Pointer(pTabCur)).FcacheStatus = U32(CACHE_STALE) *(*uintptr)(unsafe.Pointer(pTabCur + 16)) = *(*uintptr)(unsafe.Pointer(pOp + 16)) (*VdbeCursor)(unsafe.Pointer(pTabCur)).FpAltCursor = pC26 goto __776 __775: pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(bp + 704)) __776: ; goto __773 __772: ; Xsqlite3VdbeMemSetNull(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56) __773: ; goto __9 __131: ; pC27 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !((*VdbeCursor)(unsafe.Pointer(pC27)).FdeferredMoveto != 0) { goto __777 } rc = Xsqlite3VdbeFinishMoveto(tls, pC27) if !(rc != 0) { goto __778 } goto abort_due_to_error __778: ; __777: ; goto __9 __132: __133: __134: __135: ; pC28 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) (*UnpackedRecord)(unsafe.Pointer(bp + 768)).FpKeyInfo = (*VdbeCursor)(unsafe.Pointer(pC28)).FpKeyInfo (*UnpackedRecord)(unsafe.Pointer(bp + 768)).FnField = U16(*(*int32)(unsafe.Pointer(pOp + 16))) if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) < OP_IdxLT) { goto __779 } (*UnpackedRecord)(unsafe.Pointer(bp + 768)).Fdefault_rc = int8(-1) goto __780 __779: ; (*UnpackedRecord)(unsafe.Pointer(bp + 768)).Fdefault_rc = int8(0) __780: ; (*UnpackedRecord)(unsafe.Pointer(bp + 768)).FaMem = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 nCellKey = int64(0) pCur2 = *(*uintptr)(unsafe.Pointer(pC28 + 48)) nCellKey = I64(Xsqlite3BtreePayloadSize(tls, pCur2)) if !(nCellKey <= int64(0) || nCellKey > int64(0x7fffffff)) { goto __781 } rc = Xsqlite3CorruptError(tls, 96843) goto abort_due_to_error __781: ; Xsqlite3VdbeMemInit(tls, bp+712, db, uint16(0)) rc = Xsqlite3VdbeMemFromBtreeZeroOffset(tls, pCur2, U32(nCellKey), bp+712) if !(rc != 0) { goto __782 } goto abort_due_to_error __782: ; res11 = Xsqlite3VdbeRecordCompareWithSkip(tls, (*Mem)(unsafe.Pointer(bp+712)).Fn, (*Mem)(unsafe.Pointer(bp+712)).Fz, bp+768, 0) Xsqlite3VdbeMemReleaseMalloc(tls, bp+712) if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode)&1 == OP_IdxLT&1) { goto __783 } res11 = -res11 goto __784 __783: ; res11++ __784: ; if !(res11 > 0) { goto __785 } goto jump_to_p2 __785: ; goto __9 __136: ; pOut = out2Prerelease(tls, p, pOp) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Null) if !((*Sqlite3)(unsafe.Pointer(db)).FnVdbeRead > (*Sqlite3)(unsafe.Pointer(db)).FnVDestroy+1) { goto __786 } rc = SQLITE_LOCKED (*Vdbe)(unsafe.Pointer(p)).FerrorAction = U8(OE_Abort) goto abort_due_to_error goto __787 __786: iDb2 = (*Op)(unsafe.Pointer(pOp)).Fp3 *(*int32)(unsafe.Pointer(bp + 808)) = 0 rc = Xsqlite3BtreeDropTable(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb2)*32)).FpBt, (*Op)(unsafe.Pointer(pOp)).Fp1, bp+808) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Int) *(*I64)(unsafe.Pointer(pOut)) = I64(*(*int32)(unsafe.Pointer(bp + 808))) if !(rc != 0) { goto __788 } goto abort_due_to_error __788: ; if !(*(*int32)(unsafe.Pointer(bp + 808)) != 0) { goto __789 } Xsqlite3RootPageMoved(tls, db, iDb2, uint32(*(*int32)(unsafe.Pointer(bp + 808))), uint32((*Op)(unsafe.Pointer(pOp)).Fp1)) resetSchemaOnFault = U8(iDb2 + 1) __789: ; __787: ; goto __9 __137: ; *(*I64)(unsafe.Pointer(bp + 816)) = int64(0) rc = Xsqlite3BtreeClearTable(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*32)).FpBt, int32(U32((*Op)(unsafe.Pointer(pOp)).Fp1)), bp+816) if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __790 } *(*I64)(unsafe.Pointer(p + 56)) += *(*I64)(unsafe.Pointer(bp + 816)) if !((*Op)(unsafe.Pointer(pOp)).Fp3 > 0) { goto __791 } *(*I64)(unsafe.Pointer(aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56)) += *(*I64)(unsafe.Pointer(bp + 816)) __791: ; __790: ; if !(rc != 0) { goto __792 } goto abort_due_to_error __792: ; goto __9 __138: ; pC29 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !(int32((*VdbeCursor)(unsafe.Pointer(pC29)).FeCurType) == CURTYPE_SORTER) { goto __793 } Xsqlite3VdbeSorterReset(tls, db, *(*uintptr)(unsafe.Pointer(pC29 + 48))) goto __794 __793: ; rc = Xsqlite3BtreeClearTableOfCursor(tls, *(*uintptr)(unsafe.Pointer(pC29 + 48))) if !(rc != 0) { goto __795 } goto abort_due_to_error __795: ; __794: ; goto __9 __139: ; pOut = out2Prerelease(tls, p, pOp) *(*Pgno)(unsafe.Pointer(bp + 824)) = Pgno(0) pDb3 = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32 rc = Xsqlite3BtreeCreateTable(tls, (*Db)(unsafe.Pointer(pDb3)).FpBt, bp+824, (*Op)(unsafe.Pointer(pOp)).Fp3) if !(rc != 0) { goto __796 } goto abort_due_to_error __796: ; *(*I64)(unsafe.Pointer(pOut)) = I64(*(*Pgno)(unsafe.Pointer(bp + 824))) goto __9 __140: ; (*Sqlite3)(unsafe.Pointer(db)).FnSqlExec++ rc = Xsqlite3_exec(tls, db, *(*uintptr)(unsafe.Pointer(pOp + 16)), uintptr(0), uintptr(0), uintptr(0)) (*Sqlite3)(unsafe.Pointer(db)).FnSqlExec-- if !(rc != 0) { goto __797 } goto abort_due_to_error __797: ; goto __9 __141: iDb3 = (*Op)(unsafe.Pointer(pOp)).Fp1 if !(*(*uintptr)(unsafe.Pointer(pOp + 16)) == uintptr(0)) { goto __798 } Xsqlite3SchemaClear(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb3)*32)).FpSchema) *(*U32)(unsafe.Pointer(db + 44)) &= libc.Uint32FromInt32(libc.CplInt32(DBFLAG_SchemaKnownOk)) rc = Xsqlite3InitOne(tls, db, iDb3, p+168, uint32((*Op)(unsafe.Pointer(pOp)).Fp5)) *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 0, 0x3) goto __799 __798: zSchema = ts + 7235 (*InitData)(unsafe.Pointer(bp + 832)).Fdb = db (*InitData)(unsafe.Pointer(bp + 832)).FiDb = iDb3 (*InitData)(unsafe.Pointer(bp + 832)).FpzErrMsg = p + 168 (*InitData)(unsafe.Pointer(bp + 832)).FmInitFlags = U32(0) (*InitData)(unsafe.Pointer(bp + 832)).FmxPage = Xsqlite3BtreeLastPage(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb3)*32)).FpBt) zSql = Xsqlite3MPrintf(tls, db, ts+7249, libc.VaList(bp+96, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb3)*32)).FzDbSName, zSchema, *(*uintptr)(unsafe.Pointer(pOp + 16)))) if !(zSql == uintptr(0)) { goto __800 } rc = SQLITE_NOMEM goto __801 __800: ; (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy = U8(1) (*InitData)(unsafe.Pointer(bp + 832)).Frc = SQLITE_OK (*InitData)(unsafe.Pointer(bp + 832)).FnInitRow = U32(0) rc = Xsqlite3_exec(tls, db, zSql, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 }{Xsqlite3InitCallback})), bp+832, uintptr(0)) if !(rc == SQLITE_OK) { goto __802 } rc = (*InitData)(unsafe.Pointer(bp + 832)).Frc __802: ; if !(rc == SQLITE_OK && (*InitData)(unsafe.Pointer(bp+832)).FnInitRow == U32(0)) { goto __803 } rc = Xsqlite3CorruptError(tls, 97095) __803: ; Xsqlite3DbFreeNN(tls, db, zSql) (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy = U8(0) __801: ; __799: ; if !(rc != 0) { goto __804 } Xsqlite3ResetAllSchemasOfConnection(tls, db) if !(rc == SQLITE_NOMEM) { goto __805 } goto no_mem __805: ; goto abort_due_to_error __804: ; goto __9 __142: ; rc = Xsqlite3AnalysisLoad(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1) if !(rc != 0) { goto __806 } goto abort_due_to_error __806: ; goto __9 __143: ; Xsqlite3UnlinkAndDeleteTable(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1, *(*uintptr)(unsafe.Pointer(pOp + 16))) goto __9 __144: ; Xsqlite3UnlinkAndDeleteIndex(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1, *(*uintptr)(unsafe.Pointer(pOp + 16))) goto __9 __145: ; Xsqlite3UnlinkAndDeleteTrigger(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1, *(*uintptr)(unsafe.Pointer(pOp + 16))) goto __9 __146: ; nRoot = (*Op)(unsafe.Pointer(pOp)).Fp2 aRoot = *(*uintptr)(unsafe.Pointer(pOp + 16)) pnErr = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 rc = Xsqlite3BtreeIntegrityCheck(tls, db, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr((*Op)(unsafe.Pointer(pOp)).Fp5)*32)).FpBt, aRoot+1*4, nRoot, int32(*(*I64)(unsafe.Pointer(pnErr)))+1, bp+872, bp+880) Xsqlite3VdbeMemSetNull(tls, pIn1) if !(*(*int32)(unsafe.Pointer(bp + 872)) == 0) { goto __807 } goto __808 __807: if !(rc != 0) { goto __809 } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 880))) goto abort_due_to_error goto __810 __809: *(*I64)(unsafe.Pointer(pnErr)) -= I64(*(*int32)(unsafe.Pointer(bp + 872)) - 1) Xsqlite3VdbeMemSetStr(tls, pIn1, *(*uintptr)(unsafe.Pointer(bp + 880)), int64(-1), uint8(SQLITE_UTF8), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) __810: ; __808: ; Xsqlite3VdbeChangeEncoding(tls, pIn1, int32(encoding)) goto check_for_interrupt __147: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pIn2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Blob == 0) { goto __811 } if !(Xsqlite3VdbeMemSetRowSet(tls, pIn1) != 0) { goto __812 } goto no_mem __812: ; __811: ; Xsqlite3RowSetInsert(tls, (*Mem)(unsafe.Pointer(pIn1)).Fz, *(*I64)(unsafe.Pointer(pIn2))) goto __9 __148: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Blob == 0 || Xsqlite3RowSetNext(tls, (*Mem)(unsafe.Pointer(pIn1)).Fz, bp+888) == 0) { goto __813 } Xsqlite3VdbeMemSetNull(tls, pIn1) goto jump_to_p2_and_check_for_interrupt goto __814 __813: ; Xsqlite3VdbeMemSetInt64(tls, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56, *(*I64)(unsafe.Pointer(bp + 888))) __814: ; goto check_for_interrupt __149: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 iSet = *(*int32)(unsafe.Pointer(pOp + 16)) if !(int32((*Mem)(unsafe.Pointer(pIn1)).Fflags)&MEM_Blob == 0) { goto __815 } if !(Xsqlite3VdbeMemSetRowSet(tls, pIn1) != 0) { goto __816 } goto no_mem __816: ; __815: ; if !(iSet != 0) { goto __817 } exists = Xsqlite3RowSetTest(tls, (*Mem)(unsafe.Pointer(pIn1)).Fz, iSet, *(*I64)(unsafe.Pointer(pIn3))) if !(exists != 0) { goto __818 } goto jump_to_p2 __818: ; __817: ; if !(iSet >= 0) { goto __819 } Xsqlite3RowSetInsert(tls, (*Mem)(unsafe.Pointer(pIn1)).Fz, *(*I64)(unsafe.Pointer(pIn3))) __819: ; goto __9 __150: pProgram = *(*uintptr)(unsafe.Pointer(pOp + 16)) pRt = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !((*Op)(unsafe.Pointer(pOp)).Fp5 != 0) { goto __820 } t1 = (*SubProgram)(unsafe.Pointer(pProgram)).Ftoken pFrame2 = (*Vdbe)(unsafe.Pointer(p)).FpFrame __821: if !(pFrame2 != 0 && (*VdbeFrame)(unsafe.Pointer(pFrame2)).Ftoken != t1) { goto __823 } goto __822 __822: pFrame2 = (*VdbeFrame)(unsafe.Pointer(pFrame2)).FpParent goto __821 goto __823 __823: ; if !(pFrame2 != 0) { goto __824 } goto __9 __824: ; __820: ; if !((*Vdbe)(unsafe.Pointer(p)).FnFrame >= *(*int32)(unsafe.Pointer(db + 136 + 10*4))) { goto __825 } rc = SQLITE_ERROR Xsqlite3VdbeError(tls, p, ts+7292, 0) goto abort_due_to_error __825: ; if !(int32((*Mem)(unsafe.Pointer(pRt)).Fflags)&MEM_Blob == 0) { goto __826 } nMem = (*SubProgram)(unsafe.Pointer(pProgram)).FnMem + (*SubProgram)(unsafe.Pointer(pProgram)).FnCsr if !((*SubProgram)(unsafe.Pointer(pProgram)).FnCsr == 0) { goto __828 } nMem++ __828: ; nByte2 = int32((uint64(unsafe.Sizeof(VdbeFrame{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7)) + uint64(nMem)*uint64(unsafe.Sizeof(Mem{})) + uint64((*SubProgram)(unsafe.Pointer(pProgram)).FnCsr)*uint64(unsafe.Sizeof(uintptr(0))) + uint64(((*SubProgram)(unsafe.Pointer(pProgram)).FnOp+7)/8)) pFrame2 = Xsqlite3DbMallocZero(tls, db, uint64(nByte2)) if !!(pFrame2 != 0) { goto __829 } goto no_mem __829: ; Xsqlite3VdbeMemRelease(tls, pRt) (*Mem)(unsafe.Pointer(pRt)).Fflags = U16(MEM_Blob | MEM_Dyn) (*Mem)(unsafe.Pointer(pRt)).Fz = pFrame2 (*Mem)(unsafe.Pointer(pRt)).Fn = nByte2 (*Mem)(unsafe.Pointer(pRt)).FxDel = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3VdbeFrameMemDel})) (*VdbeFrame)(unsafe.Pointer(pFrame2)).Fv = p (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnChildMem = nMem (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnChildCsr = (*SubProgram)(unsafe.Pointer(pProgram)).FnCsr (*VdbeFrame)(unsafe.Pointer(pFrame2)).Fpc = int32((int64(pOp) - int64(aOp)) / 24) (*VdbeFrame)(unsafe.Pointer(pFrame2)).FaMem = (*Vdbe)(unsafe.Pointer(p)).FaMem (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnMem = (*Vdbe)(unsafe.Pointer(p)).FnMem (*VdbeFrame)(unsafe.Pointer(pFrame2)).FapCsr = (*Vdbe)(unsafe.Pointer(p)).FapCsr (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnCursor = (*Vdbe)(unsafe.Pointer(p)).FnCursor (*VdbeFrame)(unsafe.Pointer(pFrame2)).FaOp = (*Vdbe)(unsafe.Pointer(p)).FaOp (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnOp = (*Vdbe)(unsafe.Pointer(p)).FnOp (*VdbeFrame)(unsafe.Pointer(pFrame2)).Ftoken = (*SubProgram)(unsafe.Pointer(pProgram)).Ftoken pEnd = pFrame2 + 112 + uintptr((*VdbeFrame)(unsafe.Pointer(pFrame2)).FnChildMem)*56 pMem1 = pFrame2 + 112 __830: if !(pMem1 != pEnd) { goto __832 } (*Mem)(unsafe.Pointer(pMem1)).Fflags = U16(MEM_Undefined) (*Mem)(unsafe.Pointer(pMem1)).Fdb = db goto __831 __831: pMem1 += 56 goto __830 goto __832 __832: ; goto __827 __826: pFrame2 = (*Mem)(unsafe.Pointer(pRt)).Fz __827: ; (*Vdbe)(unsafe.Pointer(p)).FnFrame++ (*VdbeFrame)(unsafe.Pointer(pFrame2)).FpParent = (*Vdbe)(unsafe.Pointer(p)).FpFrame (*VdbeFrame)(unsafe.Pointer(pFrame2)).FlastRowid = (*Sqlite3)(unsafe.Pointer(db)).FlastRowid (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnChange = (*Vdbe)(unsafe.Pointer(p)).FnChange (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnDbChange = (*Sqlite3)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).Fdb)).FnChange (*VdbeFrame)(unsafe.Pointer(pFrame2)).FpAuxData = (*Vdbe)(unsafe.Pointer(p)).FpAuxData (*Vdbe)(unsafe.Pointer(p)).FpAuxData = uintptr(0) (*Vdbe)(unsafe.Pointer(p)).FnChange = int64(0) (*Vdbe)(unsafe.Pointer(p)).FpFrame = pFrame2 (*Vdbe)(unsafe.Pointer(p)).FaMem = libc.AssignUintptr(&aMem, pFrame2+112) (*Vdbe)(unsafe.Pointer(p)).FnMem = (*VdbeFrame)(unsafe.Pointer(pFrame2)).FnChildMem (*Vdbe)(unsafe.Pointer(p)).FnCursor = int32(U16((*VdbeFrame)(unsafe.Pointer(pFrame2)).FnChildCsr)) (*Vdbe)(unsafe.Pointer(p)).FapCsr = aMem + uintptr((*Vdbe)(unsafe.Pointer(p)).FnMem)*56 (*VdbeFrame)(unsafe.Pointer(pFrame2)).FaOnce = (*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*SubProgram)(unsafe.Pointer(pProgram)).FnCsr)*8 libc.Xmemset(tls, (*VdbeFrame)(unsafe.Pointer(pFrame2)).FaOnce, 0, uint64(((*SubProgram)(unsafe.Pointer(pProgram)).FnOp+7)/8)) (*Vdbe)(unsafe.Pointer(p)).FaOp = libc.AssignUintptr(&aOp, (*SubProgram)(unsafe.Pointer(pProgram)).FaOp) (*Vdbe)(unsafe.Pointer(p)).FnOp = (*SubProgram)(unsafe.Pointer(pProgram)).FnOp pOp = aOp + libc.UintptrFromInt32(-1)*24 goto check_for_interrupt __151: pOut = out2Prerelease(tls, p, pOp) pFrame3 = (*Vdbe)(unsafe.Pointer(p)).FpFrame pIn = (*VdbeFrame)(unsafe.Pointer(pFrame3)).FaMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1+(*Op)(unsafe.Pointer((*VdbeFrame)(unsafe.Pointer(pFrame3)).FaOp+uintptr((*VdbeFrame)(unsafe.Pointer(pFrame3)).Fpc)*24)).Fp1)*56 Xsqlite3VdbeMemShallowCopy(tls, pOut, pIn, MEM_Ephem) goto __9 __152: if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DeferFKs) != 0) { goto __833 } *(*I64)(unsafe.Pointer(db + 792)) += I64((*Op)(unsafe.Pointer(pOp)).Fp2) goto __834 __833: if !((*Op)(unsafe.Pointer(pOp)).Fp1 != 0) { goto __835 } *(*I64)(unsafe.Pointer(db + 784)) += I64((*Op)(unsafe.Pointer(pOp)).Fp2) goto __836 __835: *(*I64)(unsafe.Pointer(p + 80)) += I64((*Op)(unsafe.Pointer(pOp)).Fp2) __836: ; __834: ; goto __9 __153: if !((*Op)(unsafe.Pointer(pOp)).Fp1 != 0) { goto __837 } if !((*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons == int64(0) && (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons == int64(0)) { goto __839 } goto jump_to_p2 __839: ; goto __838 __837: ; if !((*Vdbe)(unsafe.Pointer(p)).FnFkConstraint == int64(0) && (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons == int64(0)) { goto __840 } goto jump_to_p2 __840: ; __838: ; goto __9 __154: if !((*Vdbe)(unsafe.Pointer(p)).FpFrame != 0) { goto __841 } pFrame4 = (*Vdbe)(unsafe.Pointer(p)).FpFrame __843: if !((*VdbeFrame)(unsafe.Pointer(pFrame4)).FpParent != 0) { goto __845 } goto __844 __844: pFrame4 = (*VdbeFrame)(unsafe.Pointer(pFrame4)).FpParent goto __843 goto __845 __845: ; pIn1 = (*VdbeFrame)(unsafe.Pointer(pFrame4)).FaMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 goto __842 __841: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 __842: ; Xsqlite3VdbeMemIntegerify(tls, pIn1) pIn2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 Xsqlite3VdbeMemIntegerify(tls, pIn2) if !(*(*I64)(unsafe.Pointer(pIn1)) < *(*I64)(unsafe.Pointer(pIn2))) { goto __846 } *(*I64)(unsafe.Pointer(pIn1)) = *(*I64)(unsafe.Pointer(pIn2)) __846: ; goto __9 __155: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(*(*I64)(unsafe.Pointer(pIn1)) > int64(0)) { goto __847 } *(*I64)(unsafe.Pointer(pIn1)) -= I64((*Op)(unsafe.Pointer(pOp)).Fp3) goto jump_to_p2 __847: ; goto __9 __156: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 pIn3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(bp + 896)) = *(*I64)(unsafe.Pointer(pIn1)) if !(*(*I64)(unsafe.Pointer(bp + 896)) <= int64(0) || Xsqlite3AddInt64(tls, bp+896, func() int64 { if *(*I64)(unsafe.Pointer(pIn3)) > int64(0) { return *(*I64)(unsafe.Pointer(pIn3)) } return int64(0) }()) != 0) { goto __848 } *(*I64)(unsafe.Pointer(pOut)) = int64(-1) goto __849 __848: *(*I64)(unsafe.Pointer(pOut)) = *(*I64)(unsafe.Pointer(bp + 896)) __849: ; goto __9 __157: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(*(*I64)(unsafe.Pointer(pIn1)) != 0) { goto __850 } if !(*(*I64)(unsafe.Pointer(pIn1)) > int64(0)) { goto __851 } *(*I64)(unsafe.Pointer(pIn1))-- __851: ; goto jump_to_p2 __850: ; goto __9 __158: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !(*(*I64)(unsafe.Pointer(pIn1)) > int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32)) { goto __852 } *(*I64)(unsafe.Pointer(pIn1))-- __852: ; if !(*(*I64)(unsafe.Pointer(pIn1)) == int64(0)) { goto __853 } goto jump_to_p2 __853: ; goto __9 __159: __160: ; n4 = int32((*Op)(unsafe.Pointer(pOp)).Fp5) pCtx = Xsqlite3DbMallocRawNN(tls, db, uint64(n4)*uint64(unsafe.Sizeof(uintptr(0)))+(uint64(unsafe.Sizeof(Sqlite3_context{}))+uint64(unsafe.Sizeof(Mem{}))-uint64(unsafe.Sizeof(uintptr(0))))) if !(pCtx == uintptr(0)) { goto __854 } goto no_mem __854: ; (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpMem = uintptr(0) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut = pCtx + 48 + uintptr(n4)*8 Xsqlite3VdbeMemInit(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpOut, db, uint16(MEM_Null)) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpFunc = *(*uintptr)(unsafe.Pointer(pOp + 16)) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FiOp = int32((int64(pOp) - int64(aOp)) / 24) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FpVdbe = p (*Sqlite3_context)(unsafe.Pointer(pCtx)).FskipFlag = U8(0) (*Sqlite3_context)(unsafe.Pointer(pCtx)).FisError = 0 (*Sqlite3_context)(unsafe.Pointer(pCtx)).Fenc = encoding (*Sqlite3_context)(unsafe.Pointer(pCtx)).Fargc = U8(n4) (*Op)(unsafe.Pointer(pOp)).Fp4type = int8(-15) *(*uintptr)(unsafe.Pointer(pOp + 16)) = pCtx (*Op)(unsafe.Pointer(pOp)).Fopcode = U8(OP_AggStep1) __161: ; pCtx1 = *(*uintptr)(unsafe.Pointer(pOp + 16)) pMem2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !((*Sqlite3_context)(unsafe.Pointer(pCtx1)).FpMem != pMem2) { goto __855 } (*Sqlite3_context)(unsafe.Pointer(pCtx1)).FpMem = pMem2 i5 = int32((*Sqlite3_context)(unsafe.Pointer(pCtx1)).Fargc) - 1 __856: if !(i5 >= 0) { goto __858 } *(*uintptr)(unsafe.Pointer(pCtx1 + 48 + uintptr(i5)*8)) = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2+i5)*56 goto __857 __857: i5-- goto __856 goto __858 __858: ; __855: ; (*Mem)(unsafe.Pointer(pMem2)).Fn++ if !((*Op)(unsafe.Pointer(pOp)).Fp1 != 0) { goto __859 } (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*FuncDef)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx1)).FpFunc)).FxInverse})).f(tls, pCtx1, int32((*Sqlite3_context)(unsafe.Pointer(pCtx1)).Fargc), pCtx1+48) goto __860 __859: (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*FuncDef)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx1)).FpFunc)).FxSFunc})).f(tls, pCtx1, int32((*Sqlite3_context)(unsafe.Pointer(pCtx1)).Fargc), pCtx1+48) __860: ; if !((*Sqlite3_context)(unsafe.Pointer(pCtx1)).FisError != 0) { goto __861 } if !((*Sqlite3_context)(unsafe.Pointer(pCtx1)).FisError > 0) { goto __862 } Xsqlite3VdbeError(tls, p, ts+4493, libc.VaList(bp+120, Xsqlite3_value_text(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx1)).FpOut))) rc = (*Sqlite3_context)(unsafe.Pointer(pCtx1)).FisError __862: ; if !((*Sqlite3_context)(unsafe.Pointer(pCtx1)).FskipFlag != 0) { goto __863 } i5 = (*Op)(unsafe.Pointer(pOp + libc.UintptrFromInt32(-1)*24)).Fp1 if !(i5 != 0) { goto __864 } Xsqlite3VdbeMemSetInt64(tls, aMem+uintptr(i5)*56, int64(1)) __864: ; (*Sqlite3_context)(unsafe.Pointer(pCtx1)).FskipFlag = U8(0) __863: ; Xsqlite3VdbeMemRelease(tls, (*Sqlite3_context)(unsafe.Pointer(pCtx1)).FpOut) (*Mem)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx1)).FpOut)).Fflags = U16(MEM_Null) (*Sqlite3_context)(unsafe.Pointer(pCtx1)).FisError = 0 if !(rc != 0) { goto __865 } goto abort_due_to_error __865: ; __861: ; goto __9 __162: __163: ; pMem3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __866 } rc = Xsqlite3VdbeMemAggValue(tls, pMem3, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56, *(*uintptr)(unsafe.Pointer(pOp + 16))) pMem3 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 goto __867 __866: rc = Xsqlite3VdbeMemFinalize(tls, pMem3, *(*uintptr)(unsafe.Pointer(pOp + 16))) __867: ; if !(rc != 0) { goto __868 } Xsqlite3VdbeError(tls, p, ts+4493, libc.VaList(bp+128, Xsqlite3_value_text(tls, pMem3))) goto abort_due_to_error __868: ; Xsqlite3VdbeChangeEncoding(tls, pMem3, int32(encoding)) goto __9 __164: ; *(*int32)(unsafe.Pointer(bp + 904)) = 0 *(*int32)(unsafe.Pointer(bp + 904 + 1*4)) = libc.AssignPtrInt32(bp+904+2*4, -1) rc = Xsqlite3Checkpoint(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1, (*Op)(unsafe.Pointer(pOp)).Fp2, bp+904+1*4, bp+904+2*4) if !(rc != 0) { goto __869 } if !(rc != SQLITE_BUSY) { goto __870 } goto abort_due_to_error __870: ; rc = SQLITE_OK *(*int32)(unsafe.Pointer(bp + 904)) = 1 __869: ; i6 = 0 pMem4 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 __871: if !(i6 < 3) { goto __873 } Xsqlite3VdbeMemSetInt64(tls, pMem4, I64(*(*int32)(unsafe.Pointer(bp + 904 + uintptr(i6)*4)))) goto __872 __872: i6++ pMem4 += 56 goto __871 goto __873 __873: ; goto __9 __165: pOut = out2Prerelease(tls, p, pOp) eNew = (*Op)(unsafe.Pointer(pOp)).Fp3 pBt1 = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32)).FpBt pPager = Xsqlite3BtreePager(tls, pBt1) eOld = Xsqlite3PagerGetJournalMode(tls, pPager) if !(eNew == -1) { goto __874 } eNew = eOld __874: ; if !!(Xsqlite3PagerOkToChangeJournalMode(tls, pPager) != 0) { goto __875 } eNew = eOld __875: ; zFilename = Xsqlite3PagerFilename(tls, pPager, 1) if !(eNew == PAGER_JOURNALMODE_WAL && (Xsqlite3Strlen30(tls, zFilename) == 0 || !(Xsqlite3PagerWalSupported(tls, pPager) != 0))) { goto __876 } eNew = eOld __876: ; if !(eNew != eOld && (eOld == PAGER_JOURNALMODE_WAL || eNew == PAGER_JOURNALMODE_WAL)) { goto __877 } if !(!(int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) != 0) || (*Sqlite3)(unsafe.Pointer(db)).FnVdbeRead > 1) { goto __878 } rc = SQLITE_ERROR Xsqlite3VdbeError(tls, p, ts+7329, libc.VaList(bp+136, func() uintptr { if eNew == PAGER_JOURNALMODE_WAL { return ts + 7381 } return ts + 7386 }())) goto abort_due_to_error goto __879 __878: if !(eOld == PAGER_JOURNALMODE_WAL) { goto __880 } rc = Xsqlite3PagerCloseWal(tls, pPager, db) if !(rc == SQLITE_OK) { goto __882 } Xsqlite3PagerSetJournalMode(tls, pPager, eNew) __882: ; goto __881 __880: if !(eOld == PAGER_JOURNALMODE_MEMORY) { goto __883 } Xsqlite3PagerSetJournalMode(tls, pPager, PAGER_JOURNALMODE_OFF) __883: ; __881: ; if !(rc == SQLITE_OK) { goto __884 } rc = Xsqlite3BtreeSetVersion(tls, pBt1, func() int32 { if eNew == PAGER_JOURNALMODE_WAL { return 2 } return 1 }()) __884: ; __879: ; __877: ; if !(rc != 0) { goto __885 } eNew = eOld __885: ; eNew = Xsqlite3PagerSetJournalMode(tls, pPager, eNew) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Str | MEM_Static | MEM_Term) (*Mem)(unsafe.Pointer(pOut)).Fz = Xsqlite3JournalModename(tls, eNew) (*Mem)(unsafe.Pointer(pOut)).Fn = Xsqlite3Strlen30(tls, (*Mem)(unsafe.Pointer(pOut)).Fz) (*Mem)(unsafe.Pointer(pOut)).Fenc = U8(SQLITE_UTF8) Xsqlite3VdbeChangeEncoding(tls, pOut, int32(encoding)) if !(rc != 0) { goto __886 } goto abort_due_to_error __886: ; goto __9 __166: ; rc = Xsqlite3RunVacuum(tls, p+168, db, (*Op)(unsafe.Pointer(pOp)).Fp1, func() uintptr { if (*Op)(unsafe.Pointer(pOp)).Fp2 != 0 { return aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56 } return uintptr(0) }()) if !(rc != 0) { goto __887 } goto abort_due_to_error __887: ; goto __9 __167: ; pBt2 = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32)).FpBt rc = Xsqlite3BtreeIncrVacuum(tls, pBt2) if !(rc != 0) { goto __888 } if !(rc != SQLITE_DONE) { goto __889 } goto abort_due_to_error __889: ; rc = SQLITE_OK goto jump_to_p2 __888: ; goto __9 __168: ; if !!((*Op)(unsafe.Pointer(pOp)).Fp1 != 0) { goto __890 } Xsqlite3ExpirePreparedStatements(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp2) goto __891 __890: libc.SetBitFieldPtr8Uint32(p+200, Bft((*Op)(unsafe.Pointer(pOp)).Fp2+1), 0, 0x3) __891: ; goto __9 __169: ; pC30 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) Xsqlite3BtreeCursorPin(tls, *(*uintptr)(unsafe.Pointer(pC30 + 48))) goto __9 __170: ; pC31 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) Xsqlite3BtreeCursorUnpin(tls, *(*uintptr)(unsafe.Pointer(pC31 + 48))) goto __9 __171: isWriteLock = U8((*Op)(unsafe.Pointer(pOp)).Fp3) if !(isWriteLock != 0 || uint64(0) == (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ReadUncommit)) { goto __892 } p13 = (*Op)(unsafe.Pointer(pOp)).Fp1 rc = Xsqlite3BtreeLockTable(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(p13)*32)).FpBt, (*Op)(unsafe.Pointer(pOp)).Fp2, isWriteLock) if !(rc != 0) { goto __893 } if !(rc&0xFF == SQLITE_LOCKED) { goto __894 } z1 = *(*uintptr)(unsafe.Pointer(pOp + 16)) Xsqlite3VdbeError(tls, p, ts+7393, libc.VaList(bp+144, z1)) __894: ; goto abort_due_to_error __893: ; __892: ; goto __9 __172: pVTab = *(*uintptr)(unsafe.Pointer(pOp + 16)) rc = Xsqlite3VtabBegin(tls, db, pVTab) if !(pVTab != 0) { goto __895 } Xsqlite3VtabImportErrmsg(tls, p, (*VTable)(unsafe.Pointer(pVTab)).FpVtab) __895: ; if !(rc != 0) { goto __896 } goto abort_due_to_error __896: ; goto __9 __173: libc.Xmemset(tls, bp+920, 0, uint64(unsafe.Sizeof(Mem{}))) (*Mem)(unsafe.Pointer(bp + 920)).Fdb = db rc = Xsqlite3VdbeMemCopy(tls, bp+920, aMem+uintptr((*Op)(unsafe.Pointer(pOp)).Fp2)*56) zTab = Xsqlite3_value_text(tls, bp+920) if !(zTab != 0) { goto __897 } rc = Xsqlite3VtabCallCreate(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1, zTab, p+168) __897: ; Xsqlite3VdbeMemRelease(tls, bp+920) if !(rc != 0) { goto __898 } goto abort_due_to_error __898: ; goto __9 __174: (*Sqlite3)(unsafe.Pointer(db)).FnVDestroy++ rc = Xsqlite3VtabCallDestroy(tls, db, (*Op)(unsafe.Pointer(pOp)).Fp1, *(*uintptr)(unsafe.Pointer(pOp + 16))) (*Sqlite3)(unsafe.Pointer(db)).FnVDestroy-- if !(rc != 0) { goto __899 } goto abort_due_to_error __899: ; goto __9 __175: ; pCur3 = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 976)) = uintptr(0) pVtab1 = (*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))).FpVtab if !(pVtab1 == uintptr(0) || (*Sqlite3_vtab)(unsafe.Pointer(pVtab1)).FpModule == uintptr(0)) { goto __900 } rc = SQLITE_LOCKED goto abort_due_to_error __900: ; pModule1 = (*Sqlite3_vtab)(unsafe.Pointer(pVtab1)).FpModule rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule1)).FxOpen})).f(tls, pVtab1, bp+976) Xsqlite3VtabImportErrmsg(tls, p, pVtab1) if !(rc != 0) { goto __901 } goto abort_due_to_error __901: ; (*Sqlite3_vtab_cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 976)))).FpVtab = pVtab1 pCur3 = allocateCursor(tls, p, (*Op)(unsafe.Pointer(pOp)).Fp1, 0, uint8(CURTYPE_VTAB)) if !(pCur3 != 0) { goto __902 } *(*uintptr)(unsafe.Pointer(pCur3 + 48)) = *(*uintptr)(unsafe.Pointer(bp + 976)) (*Sqlite3_vtab)(unsafe.Pointer(pVtab1)).FnRef++ goto __903 __902: ; (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule1)).FxClose})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 976))) goto no_mem __903: ; goto __9 __176: pC32 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pRhs = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(ValueList{}))) if !(pRhs == uintptr(0)) { goto __904 } goto no_mem __904: ; (*ValueList)(unsafe.Pointer(pRhs)).FpCsr = *(*uintptr)(unsafe.Pointer(pC32 + 48)) (*ValueList)(unsafe.Pointer(pRhs)).FpOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 pOut = out2Prerelease(tls, p, pOp) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(MEM_Null) Xsqlite3VdbeMemSetPointer(tls, pOut, pRhs, ts+7422, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3VdbeValueListFree}))) goto __9 __177: pQuery = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 pArgc = pQuery + 1*56 pCur4 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pVCur1 = *(*uintptr)(unsafe.Pointer(pCur4 + 48)) pVtab2 = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pVCur1)).FpVtab pModule2 = (*Sqlite3_vtab)(unsafe.Pointer(pVtab2)).FpModule nArg = int32(*(*I64)(unsafe.Pointer(pArgc))) iQuery = int32(*(*I64)(unsafe.Pointer(pQuery))) apArg = (*Vdbe)(unsafe.Pointer(p)).FapArg i7 = 0 __905: if !(i7 < nArg) { goto __907 } *(*uintptr)(unsafe.Pointer(apArg + uintptr(i7)*8)) = pArgc + uintptr(i7+1)*56 goto __906 __906: i7++ goto __905 goto __907 __907: ; rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule2)).FxFilter})).f(tls, pVCur1, iQuery, *(*uintptr)(unsafe.Pointer(pOp + 16)), nArg, apArg) Xsqlite3VtabImportErrmsg(tls, p, pVtab2) if !(rc != 0) { goto __908 } goto abort_due_to_error __908: ; res12 = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule2)).FxEof})).f(tls, pVCur1) (*VdbeCursor)(unsafe.Pointer(pCur4)).FnullRow = U8(0) if !(res12 != 0) { goto __909 } goto jump_to_p2 __909: ; goto __9 __178: pCur5 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) pDest2 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !((*VdbeCursor)(unsafe.Pointer(pCur5)).FnullRow != 0) { goto __910 } Xsqlite3VdbeMemSetNull(tls, pDest2) goto __9 __910: ; pVtab3 = (*Sqlite3_vtab_cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pCur5 + 48)))).FpVtab pModule3 = (*Sqlite3_vtab)(unsafe.Pointer(pVtab3)).FpModule libc.Xmemset(tls, bp+984, 0, uint64(unsafe.Sizeof(Sqlite3_context{}))) (*Sqlite3_context)(unsafe.Pointer(bp + 984)).FpOut = pDest2 (*Sqlite3_context)(unsafe.Pointer(bp + 984)).Fenc = encoding if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5)&OPFLAG_NOCHNG != 0) { goto __911 } Xsqlite3VdbeMemSetNull(tls, pDest2) (*Mem)(unsafe.Pointer(pDest2)).Fflags = U16(MEM_Null | MEM_Zero) *(*int32)(unsafe.Pointer(pDest2)) = 0 goto __912 __911: (*Mem)(unsafe.Pointer(pDest2)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pDest2)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Null) __912: ; rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule3)).FxColumn})).f(tls, *(*uintptr)(unsafe.Pointer(pCur5 + 48)), bp+984, (*Op)(unsafe.Pointer(pOp)).Fp2) Xsqlite3VtabImportErrmsg(tls, p, pVtab3) if !((*Sqlite3_context)(unsafe.Pointer(bp+984)).FisError > 0) { goto __913 } Xsqlite3VdbeError(tls, p, ts+4493, libc.VaList(bp+152, Xsqlite3_value_text(tls, pDest2))) rc = (*Sqlite3_context)(unsafe.Pointer(bp + 984)).FisError __913: ; Xsqlite3VdbeChangeEncoding(tls, pDest2, int32(encoding)) if !(rc != 0) { goto __914 } goto abort_due_to_error __914: ; goto __9 __179: pCur6 = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FapCsr + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*8)) if !((*VdbeCursor)(unsafe.Pointer(pCur6)).FnullRow != 0) { goto __915 } goto __9 __915: ; pVtab4 = (*Sqlite3_vtab_cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pCur6 + 48)))).FpVtab pModule4 = (*Sqlite3_vtab)(unsafe.Pointer(pVtab4)).FpModule rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule4)).FxNext})).f(tls, *(*uintptr)(unsafe.Pointer(pCur6 + 48))) Xsqlite3VtabImportErrmsg(tls, p, pVtab4) if !(rc != 0) { goto __916 } goto abort_due_to_error __916: ; res13 = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule4)).FxEof})).f(tls, *(*uintptr)(unsafe.Pointer(pCur6 + 48))) if !!(res13 != 0) { goto __917 } goto jump_to_p2_and_check_for_interrupt __917: ; goto check_for_interrupt __180: isLegacy = int32((*Sqlite3)(unsafe.Pointer(db)).Fflags & uint64(SQLITE_LegacyAlter)) *(*U64)(unsafe.Pointer(db + 48)) |= uint64(SQLITE_LegacyAlter) pVtab5 = (*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))).FpVtab pName = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 rc = Xsqlite3VdbeChangeEncoding(tls, pName, SQLITE_UTF8) if !(rc != 0) { goto __918 } goto abort_due_to_error __918: ; rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer((*Sqlite3_vtab)(unsafe.Pointer(pVtab5)).FpModule)).FxRename})).f(tls, pVtab5, (*Mem)(unsafe.Pointer(pName)).Fz) if !(isLegacy == 0) { goto __919 } *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_LegacyAlter)) __919: ; Xsqlite3VtabImportErrmsg(tls, p, pVtab5) libc.SetBitFieldPtr8Uint32(p+200, Bft(0), 0, 0x3) if !(rc != 0) { goto __920 } goto abort_due_to_error __920: ; goto __9 __181: *(*Sqlite_int64)(unsafe.Pointer(bp + 1040)) = int64(0) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __921 } goto no_mem __921: ; pVtab6 = (*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))).FpVtab if !(pVtab6 == uintptr(0) || (*Sqlite3_vtab)(unsafe.Pointer(pVtab6)).FpModule == uintptr(0)) { goto __922 } rc = SQLITE_LOCKED goto abort_due_to_error __922: ; pModule5 = (*Sqlite3_vtab)(unsafe.Pointer(pVtab6)).FpModule nArg1 = (*Op)(unsafe.Pointer(pOp)).Fp2 if !((*Sqlite3_module)(unsafe.Pointer(pModule5)).FxUpdate != 0) { goto __923 } vtabOnConflict = (*Sqlite3)(unsafe.Pointer(db)).FvtabOnConflict apArg1 = (*Vdbe)(unsafe.Pointer(p)).FapArg pX1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 i8 = 0 __924: if !(i8 < nArg1) { goto __926 } *(*uintptr)(unsafe.Pointer(apArg1 + uintptr(i8)*8)) = pX1 pX1 += 56 goto __925 __925: i8++ goto __924 goto __926 __926: ; (*Sqlite3)(unsafe.Pointer(db)).FvtabOnConflict = U8((*Op)(unsafe.Pointer(pOp)).Fp5) rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule5)).FxUpdate})).f(tls, pVtab6, nArg1, apArg1, bp+1040) (*Sqlite3)(unsafe.Pointer(db)).FvtabOnConflict = vtabOnConflict Xsqlite3VtabImportErrmsg(tls, p, pVtab6) if !(rc == SQLITE_OK && (*Op)(unsafe.Pointer(pOp)).Fp1 != 0) { goto __927 } (*Sqlite3)(unsafe.Pointer(db)).FlastRowid = *(*Sqlite_int64)(unsafe.Pointer(bp + 1040)) __927: ; if !(rc&0xff == SQLITE_CONSTRAINT && (*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pOp + 16)))).FbConstraint != 0) { goto __928 } if !(int32((*Op)(unsafe.Pointer(pOp)).Fp5) == OE_Ignore) { goto __930 } rc = SQLITE_OK goto __931 __930: (*Vdbe)(unsafe.Pointer(p)).FerrorAction = func() uint8 { if int32((*Op)(unsafe.Pointer(pOp)).Fp5) == OE_Replace { return uint8(OE_Abort) } return uint8((*Op)(unsafe.Pointer(pOp)).Fp5) }() __931: ; goto __929 __928: (*Vdbe)(unsafe.Pointer(p)).FnChange++ __929: ; if !(rc != 0) { goto __932 } goto abort_due_to_error __932: ; __923: ; goto __9 __182: pOut = out2Prerelease(tls, p, pOp) *(*I64)(unsafe.Pointer(pOut)) = I64(Xsqlite3BtreeLastPage(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32)).FpBt)) goto __9 __183: pOut = out2Prerelease(tls, p, pOp) pBt3 = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*32)).FpBt newMax = uint32(0) if !((*Op)(unsafe.Pointer(pOp)).Fp3 != 0) { goto __933 } newMax = Xsqlite3BtreeLastPage(tls, pBt3) if !(newMax < uint32((*Op)(unsafe.Pointer(pOp)).Fp3)) { goto __934 } newMax = uint32((*Op)(unsafe.Pointer(pOp)).Fp3) __934: ; __933: ; *(*I64)(unsafe.Pointer(pOut)) = I64(Xsqlite3BtreeMaxPageCount(tls, pBt3, newMax)) goto __9 __184: __185: ; pCtx2 = *(*uintptr)(unsafe.Pointer(pOp + 16)) pOut = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp3)*56 if !((*Sqlite3_context)(unsafe.Pointer(pCtx2)).FpOut != pOut) { goto __935 } (*Sqlite3_context)(unsafe.Pointer(pCtx2)).FpVdbe = p (*Sqlite3_context)(unsafe.Pointer(pCtx2)).FpOut = pOut (*Sqlite3_context)(unsafe.Pointer(pCtx2)).Fenc = encoding i9 = int32((*Sqlite3_context)(unsafe.Pointer(pCtx2)).Fargc) - 1 __936: if !(i9 >= 0) { goto __938 } *(*uintptr)(unsafe.Pointer(pCtx2 + 48 + uintptr(i9)*8)) = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp2+i9)*56 goto __937 __937: i9-- goto __936 goto __938 __938: ; __935: ; (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Null) (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*FuncDef)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(pCtx2)).FpFunc)).FxSFunc})).f(tls, pCtx2, int32((*Sqlite3_context)(unsafe.Pointer(pCtx2)).Fargc), pCtx2+48) if !((*Sqlite3_context)(unsafe.Pointer(pCtx2)).FisError != 0) { goto __939 } if !((*Sqlite3_context)(unsafe.Pointer(pCtx2)).FisError > 0) { goto __940 } Xsqlite3VdbeError(tls, p, ts+4493, libc.VaList(bp+160, Xsqlite3_value_text(tls, pOut))) rc = (*Sqlite3_context)(unsafe.Pointer(pCtx2)).FisError __940: ; Xsqlite3VdbeDeleteAuxData(tls, db, p+296, (*Sqlite3_context)(unsafe.Pointer(pCtx2)).FiOp, (*Op)(unsafe.Pointer(pOp)).Fp1) (*Sqlite3_context)(unsafe.Pointer(pCtx2)).FisError = 0 if !(rc != 0) { goto __941 } goto abort_due_to_error __941: ; __939: ; goto __9 __186: pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 *(*U16)(unsafe.Pointer(pIn1 + 20)) &= libc.Uint16FromInt32(libc.CplInt32(MEM_Subtype)) goto __9 __187: ; pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 h = filterHash(tls, aMem, pOp) h = h % U64((*Mem)(unsafe.Pointer(pIn1)).Fn) *(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pIn1)).Fz + uintptr(h/uint64(8)))) |= int8(int32(1) << (h & uint64(7))) goto __9 __188: ; pIn1 = aMem + uintptr((*Op)(unsafe.Pointer(pOp)).Fp1)*56 h1 = filterHash(tls, aMem, pOp) h1 = h1 % U64((*Mem)(unsafe.Pointer(pIn1)).Fn) if !(int32(*(*int8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pIn1)).Fz + uintptr(h1/uint64(8)))))&(int32(1)<<(h1&uint64(7))) == 0) { goto __942 } *(*U32)(unsafe.Pointer(p + 212 + 8*4))++ goto jump_to_p2 goto __943 __942: *(*U32)(unsafe.Pointer(p + 212 + 7*4))++ __943: ; goto __9 __189: __190: ; if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmTrace)&(SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY) != 0 && int32((*Vdbe)(unsafe.Pointer(p)).FminWriteFileFormat) != 254 && libc.AssignUintptr(&zTrace, func() uintptr { if *(*uintptr)(unsafe.Pointer(pOp + 16)) != 0 { return *(*uintptr)(unsafe.Pointer(pOp + 16)) } return (*Vdbe)(unsafe.Pointer(p)).FzSql }()) != uintptr(0)) { goto __944 } if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmTrace)&SQLITE_TRACE_LEGACY != 0) { goto __945 } z2 = Xsqlite3VdbeExpandSql(tls, p, zTrace) (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(db + 248))})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg, z2) Xsqlite3_free(tls, z2) goto __946 __945: if !((*Sqlite3)(unsafe.Pointer(db)).FnVdbeExec > 1) { goto __947 } z3 = Xsqlite3MPrintf(tls, db, ts+7432, libc.VaList(bp+168, zTrace)) (*struct { f func(*libc.TLS, U32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(db + 248))})).f(tls, uint32(SQLITE_TRACE_STMT), (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg, p, z3) Xsqlite3DbFree(tls, db, z3) goto __948 __947: (*struct { f func(*libc.TLS, U32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(db + 248))})).f(tls, uint32(SQLITE_TRACE_STMT), (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg, p, zTrace) __948: ; __946: ; __944: ; if !((*Op)(unsafe.Pointer(pOp)).Fp1 >= Xsqlite3Config.FiOnceResetThreshold) { goto __949 } if !(int32((*Op)(unsafe.Pointer(pOp)).Fopcode) == OP_Trace) { goto __950 } goto __9 __950: ; i10 = 1 __951: if !(i10 < (*Vdbe)(unsafe.Pointer(p)).FnOp) { goto __953 } if !(int32((*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp+uintptr(i10)*24)).Fopcode) == OP_Once) { goto __954 } (*Op)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(p)).FaOp + uintptr(i10)*24)).Fp1 = 0 __954: ; goto __952 __952: i10++ goto __951 goto __953 __953: ; (*Op)(unsafe.Pointer(pOp)).Fp1 = 0 __949: ; (*Op)(unsafe.Pointer(pOp)).Fp1++ *(*U32)(unsafe.Pointer(p + 212 + 6*4))++ goto jump_to_p2 __191: ; goto __9 __9: ; goto __7 __7: pOp += 24 goto __6 goto __8 __8: ; abort_due_to_error: if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __955 } rc = SQLITE_NOMEM goto __956 __955: if !(rc == SQLITE_IOERR|int32(33)<<8) { goto __957 } rc = Xsqlite3CorruptError(tls, 99034) __957: ; __956: ; if !((*Vdbe)(unsafe.Pointer(p)).FzErrMsg == uintptr(0) && rc != SQLITE_IOERR|int32(12)<<8) { goto __958 } Xsqlite3VdbeError(tls, p, ts+4493, libc.VaList(bp+176, Xsqlite3ErrStr(tls, rc))) __958: ; (*Vdbe)(unsafe.Pointer(p)).Frc = rc Xsqlite3SystemError(tls, db, rc) Xsqlite3_log(tls, rc, ts+7438, libc.VaList(bp+184, int32((int64(pOp)-int64(aOp))/24), (*Vdbe)(unsafe.Pointer(p)).FzSql, (*Vdbe)(unsafe.Pointer(p)).FzErrMsg)) if !(int32((*Vdbe)(unsafe.Pointer(p)).FeVdbeState) == VDBE_RUN_STATE) { goto __959 } Xsqlite3VdbeHalt(tls, p) __959: ; if !(rc == SQLITE_IOERR|int32(12)<<8) { goto __960 } Xsqlite3OomFault(tls, db) __960: ; if !(rc == SQLITE_CORRUPT && int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) == 0) { goto __961 } *(*U64)(unsafe.Pointer(db + 48)) |= uint64(0x00002) << 32 __961: ; rc = SQLITE_ERROR if !(int32(resetSchemaOnFault) > 0) { goto __962 } Xsqlite3ResetOneSchema(tls, db, int32(resetSchemaOnFault)-1) __962: ; vdbe_return: __963: if !(nVmStep >= nProgressLimit && (*Sqlite3)(unsafe.Pointer(db)).FxProgress != uintptr(0)) { goto __964 } nProgressLimit = nProgressLimit + U64((*Sqlite3)(unsafe.Pointer(db)).FnProgressOps) if !((*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxProgress})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpProgressArg) != 0) { goto __965 } nProgressLimit = uint64(0xffffffff) | uint64(0xffffffff)<<32 rc = SQLITE_INTERRUPT goto abort_due_to_error __965: ; goto __963 __964: ; *(*U32)(unsafe.Pointer(p + 212 + 4*4)) += U32(int32(nVmStep)) if !((*Vdbe)(unsafe.Pointer(p)).FlockMask != YDbMask(0)) { goto __966 } Xsqlite3VdbeLeave(tls, p) __966: ; return rc too_big: Xsqlite3VdbeError(tls, p, ts+6686, 0) rc = SQLITE_TOOBIG goto abort_due_to_error no_mem: Xsqlite3OomFault(tls, db) Xsqlite3VdbeError(tls, p, ts+1480, 0) rc = SQLITE_NOMEM goto abort_due_to_error abort_due_to_interrupt: ; rc = SQLITE_INTERRUPT goto abort_due_to_error return int32(0) } var azType = [4]uintptr{ts + 7470, ts + 7479, ts + 7486, ts + 7492} var and_logic = [9]uint8{uint8(0), uint8(0), uint8(0), uint8(0), uint8(1), uint8(2), uint8(0), uint8(2), uint8(2)} var or_logic = [9]uint8{uint8(0), uint8(1), uint8(2), uint8(1), uint8(1), uint8(1), uint8(2), uint8(1), uint8(2)} var aMask = [12]uint8{ uint8(0x10), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x01), uint8(0x2), uint8(0x01), uint8(0x01), uint8(0x10), uint8(0x10), } var aFlag1 = [2]U16{U16(MEM_Blob), U16(MEM_Str | MEM_Term)} var vfsFlags int32 = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE | SQLITE_OPEN_TRANSIENT_DB // Valid sqlite3_blob* handles point to Incrblob structures. type Incrblob1 = struct { FnByte int32 FiOffset int32 FiCol U16 F__ccgo_pad1 [6]byte FpCsr uintptr FpStmt uintptr Fdb uintptr FzDb uintptr FpTab uintptr } // Valid sqlite3_blob* handles point to Incrblob structures. type Incrblob = Incrblob1 func blobSeekToRow(tls *libc.TLS, p uintptr, iRow Sqlite3_int64, pzErr uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 var zErr uintptr = uintptr(0) var v uintptr = (*Incrblob)(unsafe.Pointer(p)).FpStmt (*Mem)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).FaMem + 1*56)).Fflags = U16(MEM_Int) *(*I64)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).FaMem + 1*56)) = iRow if (*Vdbe)(unsafe.Pointer(v)).Fpc > 4 { (*Vdbe)(unsafe.Pointer(v)).Fpc = 4 rc = Xsqlite3VdbeExec(tls, v) } else { rc = Xsqlite3_step(tls, (*Incrblob)(unsafe.Pointer(p)).FpStmt) } if rc == SQLITE_ROW { var pC uintptr = *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).FapCsr)) var type1 U32 if int32((*VdbeCursor)(unsafe.Pointer(pC)).FnHdrParsed) > int32((*Incrblob)(unsafe.Pointer(p)).FiCol) { type1 = *(*U32)(unsafe.Pointer(pC + 112 + uintptr((*Incrblob)(unsafe.Pointer(p)).FiCol)*4)) } else { type1 = uint32(0) } if type1 < U32(12) { zErr = Xsqlite3MPrintf(tls, (*Incrblob)(unsafe.Pointer(p)).Fdb, ts+7504, libc.VaList(bp, func() uintptr { if type1 == U32(0) { return ts + 7533 } return func() uintptr { if type1 == U32(7) { return ts + 7538 } return ts + 7543 }() }())) rc = SQLITE_ERROR Xsqlite3_finalize(tls, (*Incrblob)(unsafe.Pointer(p)).FpStmt) (*Incrblob)(unsafe.Pointer(p)).FpStmt = uintptr(0) } else { (*Incrblob)(unsafe.Pointer(p)).FiOffset = int32(*(*U32)(unsafe.Pointer(pC + 112 + uintptr(int32((*Incrblob)(unsafe.Pointer(p)).FiCol)+int32((*VdbeCursor)(unsafe.Pointer(pC)).FnField))*4))) (*Incrblob)(unsafe.Pointer(p)).FnByte = int32(Xsqlite3VdbeSerialTypeLen(tls, type1)) (*Incrblob)(unsafe.Pointer(p)).FpCsr = *(*uintptr)(unsafe.Pointer(pC + 48)) Xsqlite3BtreeIncrblobCursor(tls, (*Incrblob)(unsafe.Pointer(p)).FpCsr) } } if rc == SQLITE_ROW { rc = SQLITE_OK } else if (*Incrblob)(unsafe.Pointer(p)).FpStmt != 0 { rc = Xsqlite3_finalize(tls, (*Incrblob)(unsafe.Pointer(p)).FpStmt) (*Incrblob)(unsafe.Pointer(p)).FpStmt = uintptr(0) if rc == SQLITE_OK { zErr = Xsqlite3MPrintf(tls, (*Incrblob)(unsafe.Pointer(p)).Fdb, ts+7551, libc.VaList(bp+8, iRow)) rc = SQLITE_ERROR } else { zErr = Xsqlite3MPrintf(tls, (*Incrblob)(unsafe.Pointer(p)).Fdb, ts+4493, libc.VaList(bp+16, Xsqlite3_errmsg(tls, (*Incrblob)(unsafe.Pointer(p)).Fdb))) } } *(*uintptr)(unsafe.Pointer(pzErr)) = zErr return rc } // Open a blob handle. func Xsqlite3_blob_open(tls *libc.TLS, db uintptr, zDb uintptr, zTable uintptr, zColumn uintptr, iRow Sqlite_int64, wrFlag int32, ppBlob uintptr) int32 { bp := tls.Alloc(480) defer tls.Free(480) var nAttempt int32 var iCol int32 var rc int32 var pTab uintptr var pBlob uintptr var j int32 var pFKey uintptr var j1 int32 var zFault uintptr var pIdx uintptr var v uintptr var iDb int32 var aOp uintptr nAttempt = 0 rc = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp + 472)) = uintptr(0) pBlob = uintptr(0) *(*uintptr)(unsafe.Pointer(ppBlob)) = uintptr(0) wrFlag = libc.BoolInt32(!!(wrFlag != 0)) Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pBlob = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Incrblob{}))) __1: if !(1 != 0) { goto __2 } Xsqlite3ParseObjectInit(tls, bp+48, db) if !!(pBlob != 0) { goto __3 } goto blob_open_out __3: ; Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 472))) *(*uintptr)(unsafe.Pointer(bp + 472)) = uintptr(0) Xsqlite3BtreeEnterAll(tls, db) pTab = Xsqlite3LocateTable(tls, bp+48, uint32(0), zTable, zDb) if !(pTab != 0 && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __4 } pTab = uintptr(0) Xsqlite3ErrorMsg(tls, bp+48, ts+7571, libc.VaList(bp, zTable)) __4: ; if !(pTab != 0 && !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0))) { goto __5 } pTab = uintptr(0) Xsqlite3ErrorMsg(tls, bp+48, ts+7601, libc.VaList(bp+8, zTable)) __5: ; if !(pTab != 0 && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __6 } pTab = uintptr(0) Xsqlite3ErrorMsg(tls, bp+48, ts+7637, libc.VaList(bp+16, zTable)) __6: ; if !!(pTab != 0) { goto __7 } if !((*Parse)(unsafe.Pointer(bp+48)).FzErrMsg != 0) { goto __8 } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 472))) *(*uintptr)(unsafe.Pointer(bp + 472)) = (*Parse)(unsafe.Pointer(bp + 48)).FzErrMsg (*Parse)(unsafe.Pointer(bp + 48)).FzErrMsg = uintptr(0) __8: ; rc = SQLITE_ERROR Xsqlite3BtreeLeaveAll(tls, db) goto blob_open_out __7: ; (*Incrblob)(unsafe.Pointer(pBlob)).FpTab = pTab (*Incrblob)(unsafe.Pointer(pBlob)).FzDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema))*32)).FzDbSName iCol = 0 __9: if !(iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __11 } if !(Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FzCnName, zColumn) == 0) { goto __12 } goto __11 __12: ; goto __10 __10: iCol++ goto __9 goto __11 __11: ; if !(iCol == int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __13 } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 472))) *(*uintptr)(unsafe.Pointer(bp + 472)) = Xsqlite3MPrintf(tls, db, ts+7658, libc.VaList(bp+24, zColumn)) rc = SQLITE_ERROR Xsqlite3BtreeLeaveAll(tls, db) goto blob_open_out __13: ; if !(wrFlag != 0) { goto __14 } zFault = uintptr(0) if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ForeignKeys) != 0) { goto __15 } pFKey = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)) __16: if !(pFKey != 0) { goto __18 } j = 0 __19: if !(j < (*FKey)(unsafe.Pointer(pFKey)).FnCol) { goto __21 } if !((*sColMap)(unsafe.Pointer(pFKey+64+uintptr(j)*16)).FiFrom == iCol) { goto __22 } zFault = ts + 7679 __22: ; goto __20 __20: j++ goto __19 goto __21 __21: ; goto __17 __17: pFKey = (*FKey)(unsafe.Pointer(pFKey)).FpNextFrom goto __16 goto __18 __18: ; __15: ; pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __23: if !(pIdx != 0) { goto __25 } j1 = 0 __26: if !(j1 < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)) { goto __28 } if !(int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j1)*2))) == iCol || int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j1)*2))) == -2) { goto __29 } zFault = ts + 7691 __29: ; goto __27 __27: j1++ goto __26 goto __28 __28: ; goto __24 __24: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext goto __23 goto __25 __25: ; if !(zFault != 0) { goto __30 } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 472))) *(*uintptr)(unsafe.Pointer(bp + 472)) = Xsqlite3MPrintf(tls, db, ts+7699, libc.VaList(bp+32, zFault)) rc = SQLITE_ERROR Xsqlite3BtreeLeaveAll(tls, db) goto blob_open_out __30: ; __14: ; (*Incrblob)(unsafe.Pointer(pBlob)).FpStmt = Xsqlite3VdbeCreate(tls, bp+48) if !((*Incrblob)(unsafe.Pointer(pBlob)).FpStmt != 0) { goto __31 } v = (*Incrblob)(unsafe.Pointer(pBlob)).FpStmt iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) Xsqlite3VdbeAddOp4Int(tls, v, OP_Transaction, iDb, wrFlag, (*Schema)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FpSchema)).Fschema_cookie, (*Schema)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FpSchema)).FiGeneration) Xsqlite3VdbeChangeP5(tls, v, uint16(1)) aOp = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(openBlob))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&openBlob)), iLn) Xsqlite3VdbeUsesBtree(tls, v, iDb) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0) { goto __32 } (*VdbeOp)(unsafe.Pointer(aOp)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp)).Fp2 = int32((*Table)(unsafe.Pointer(pTab)).Ftnum) (*VdbeOp)(unsafe.Pointer(aOp)).Fp3 = wrFlag Xsqlite3VdbeChangeP4(tls, v, 2, (*Table)(unsafe.Pointer(pTab)).FzName, P4_TRANSIENT) __32: ; if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0) { goto __33 } if !(wrFlag != 0) { goto __34 } (*VdbeOp)(unsafe.Pointer(aOp + 1*24)).Fopcode = U8(OP_OpenWrite) __34: ; (*VdbeOp)(unsafe.Pointer(aOp + 1*24)).Fp2 = int32((*Table)(unsafe.Pointer(pTab)).Ftnum) (*VdbeOp)(unsafe.Pointer(aOp + 1*24)).Fp3 = iDb (*VdbeOp)(unsafe.Pointer(aOp + 1*24)).Fp4type = int8(-3) *(*int32)(unsafe.Pointer(aOp + 1*24 + 16)) = int32((*Table)(unsafe.Pointer(pTab)).FnCol) + 1 (*VdbeOp)(unsafe.Pointer(aOp + 3*24)).Fp2 = int32((*Table)(unsafe.Pointer(pTab)).FnCol) (*Parse)(unsafe.Pointer(bp + 48)).FnVar = int16(0) (*Parse)(unsafe.Pointer(bp + 48)).FnMem = 1 (*Parse)(unsafe.Pointer(bp + 48)).FnTab = 1 Xsqlite3VdbeMakeReady(tls, v, bp+48) __33: ; __31: ; (*Incrblob)(unsafe.Pointer(pBlob)).FiCol = U16(iCol) (*Incrblob)(unsafe.Pointer(pBlob)).Fdb = db Xsqlite3BtreeLeaveAll(tls, db) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __35 } goto blob_open_out __35: ; rc = blobSeekToRow(tls, pBlob, iRow, bp+472) if !(libc.PreIncInt32(&nAttempt, 1) >= SQLITE_MAX_SCHEMA_RETRY || rc != SQLITE_SCHEMA) { goto __36 } goto __2 __36: ; Xsqlite3ParseObjectReset(tls, bp+48) goto __1 __2: ; blob_open_out: if !(rc == SQLITE_OK && int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0) { goto __37 } *(*uintptr)(unsafe.Pointer(ppBlob)) = pBlob goto __38 __37: if !(pBlob != 0 && (*Incrblob)(unsafe.Pointer(pBlob)).FpStmt != 0) { goto __39 } Xsqlite3VdbeFinalize(tls, (*Incrblob)(unsafe.Pointer(pBlob)).FpStmt) __39: ; Xsqlite3DbFree(tls, db, pBlob) __38: ; Xsqlite3ErrorWithMsg(tls, db, rc, func() uintptr { if *(*uintptr)(unsafe.Pointer(bp + 472)) != 0 { return ts + 4493 } return uintptr(0) }(), libc.VaList(bp+40, *(*uintptr)(unsafe.Pointer(bp + 472)))) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 472))) Xsqlite3ParseObjectReset(tls, bp+48) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } var iLn int32 = 0 var openBlob = [6]VdbeOpList{ {Fopcode: U8(OP_TableLock)}, {Fopcode: U8(OP_OpenRead)}, {Fopcode: U8(OP_NotExists), Fp2: int8(5), Fp3: int8(1)}, {Fopcode: U8(OP_Column), Fp3: int8(1)}, {Fopcode: U8(OP_ResultRow), Fp1: int8(1)}, {Fopcode: U8(OP_Halt)}, } // Close a blob handle that was previously created using // sqlite3_blob_open(). func Xsqlite3_blob_close(tls *libc.TLS, pBlob uintptr) int32 { var p uintptr = pBlob var rc int32 var db uintptr if p != 0 { var pStmt uintptr = (*Incrblob)(unsafe.Pointer(p)).FpStmt db = (*Incrblob)(unsafe.Pointer(p)).Fdb Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) Xsqlite3DbFree(tls, db, p) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) rc = Xsqlite3_finalize(tls, pStmt) } else { rc = SQLITE_OK } return rc } func blobReadWrite(tls *libc.TLS, pBlob uintptr, z uintptr, n int32, iOffset int32, xCall uintptr) int32 { var rc int32 var p uintptr = pBlob var v uintptr var db uintptr if p == uintptr(0) { return Xsqlite3MisuseError(tls, 99519) } db = (*Incrblob)(unsafe.Pointer(p)).Fdb Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) v = (*Incrblob)(unsafe.Pointer(p)).FpStmt if n < 0 || iOffset < 0 || Sqlite3_int64(iOffset)+Sqlite3_int64(n) > Sqlite3_int64((*Incrblob)(unsafe.Pointer(p)).FnByte) { rc = SQLITE_ERROR } else if v == uintptr(0) { rc = SQLITE_ABORT } else { Xsqlite3BtreeEnterCursor(tls, (*Incrblob)(unsafe.Pointer(p)).FpCsr) if xCall == *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, U32, U32, uintptr) int32 }{Xsqlite3BtreePutData})) && (*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback != 0 { var iKey Sqlite3_int64 iKey = Xsqlite3BtreeIntegerKey(tls, (*Incrblob)(unsafe.Pointer(p)).FpCsr) Xsqlite3VdbePreUpdateHook(tls, v, *(*uintptr)(unsafe.Pointer((*Vdbe)(unsafe.Pointer(v)).FapCsr)), SQLITE_DELETE, (*Incrblob)(unsafe.Pointer(p)).FzDb, (*Incrblob)(unsafe.Pointer(p)).FpTab, iKey, -1, int32((*Incrblob)(unsafe.Pointer(p)).FiCol)) } rc = (*struct { f func(*libc.TLS, uintptr, U32, U32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xCall})).f(tls, (*Incrblob)(unsafe.Pointer(p)).FpCsr, uint32(iOffset+(*Incrblob)(unsafe.Pointer(p)).FiOffset), uint32(n), z) Xsqlite3BtreeLeaveCursor(tls, (*Incrblob)(unsafe.Pointer(p)).FpCsr) if rc == SQLITE_ABORT { Xsqlite3VdbeFinalize(tls, v) (*Incrblob)(unsafe.Pointer(p)).FpStmt = uintptr(0) } else { (*Vdbe)(unsafe.Pointer(v)).Frc = rc } } Xsqlite3Error(tls, db, rc) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Read data from a blob handle. func Xsqlite3_blob_read(tls *libc.TLS, pBlob uintptr, z uintptr, n int32, iOffset int32) int32 { return blobReadWrite(tls, pBlob, z, n, iOffset, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, U32, U32, uintptr) int32 }{Xsqlite3BtreePayloadChecked}))) } // Write data to a blob handle. func Xsqlite3_blob_write(tls *libc.TLS, pBlob uintptr, z uintptr, n int32, iOffset int32) int32 { return blobReadWrite(tls, pBlob, z, n, iOffset, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, U32, U32, uintptr) int32 }{Xsqlite3BtreePutData}))) } // Query a blob handle for the size of the data. // // The Incrblob.nByte field is fixed for the lifetime of the Incrblob // so no mutex is required for access. func Xsqlite3_blob_bytes(tls *libc.TLS, pBlob uintptr) int32 { var p uintptr = pBlob if p != 0 && (*Incrblob)(unsafe.Pointer(p)).FpStmt != 0 { return (*Incrblob)(unsafe.Pointer(p)).FnByte } return 0 } // Move an existing blob handle to point to a different row of the same // database table. // // If an error occurs, or if the specified row does not exist or does not // contain a blob or text value, then an error code is returned and the // database handle error code and message set. If this happens, then all // subsequent calls to sqlite3_blob_xxx() functions (except blob_close()) // immediately return SQLITE_ABORT. func Xsqlite3_blob_reopen(tls *libc.TLS, pBlob uintptr, iRow Sqlite3_int64) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 var p uintptr = pBlob var db uintptr if p == uintptr(0) { return Xsqlite3MisuseError(tls, 99619) } db = (*Incrblob)(unsafe.Pointer(p)).Fdb Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if (*Incrblob)(unsafe.Pointer(p)).FpStmt == uintptr(0) { rc = SQLITE_ABORT } else { (*Vdbe)(unsafe.Pointer((*Incrblob)(unsafe.Pointer(p)).FpStmt)).Frc = SQLITE_OK rc = blobSeekToRow(tls, p, iRow, bp+8) if rc != SQLITE_OK { Xsqlite3ErrorWithMsg(tls, db, rc, func() uintptr { if *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { return ts + 4493 } return uintptr(0) }(), libc.VaList(bp, *(*uintptr)(unsafe.Pointer(bp + 8)))) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 8))) } } rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Private objects used by the sorter type MergeEngine1 = struct { FnTree int32 F__ccgo_pad1 [4]byte FpTask uintptr FaTree uintptr FaReadr uintptr } // Private objects used by the sorter type MergeEngine = MergeEngine1 type PmaReader1 = struct { FiReadOff I64 FiEof I64 FnAlloc int32 FnKey int32 FpFd uintptr FaAlloc uintptr FaKey uintptr FaBuffer uintptr FnBuffer int32 F__ccgo_pad1 [4]byte FaMap uintptr FpIncr uintptr } // Merge PMAs together type PmaReader = PmaReader1 type PmaWriter1 = struct { FeFWErr int32 F__ccgo_pad1 [4]byte FaBuffer uintptr FnBuffer int32 FiBufStart int32 FiBufEnd int32 F__ccgo_pad2 [4]byte FiWriteOff I64 FpFd uintptr } // Incrementally read one PMA type PmaWriter = PmaWriter1 type SorterRecord1 = struct { FnVal int32 F__ccgo_pad1 [4]byte Fu struct{ FpNext uintptr } } // Incrementally write one PMA type SorterRecord = SorterRecord1 type SortSubtask1 = struct { FpThread uintptr FbDone int32 F__ccgo_pad1 [4]byte FpSorter uintptr FpUnpacked uintptr Flist SorterList FnPMA int32 F__ccgo_pad2 [4]byte FxCompare SorterCompare Ffile SorterFile Ffile2 SorterFile } // A record being sorted type SortSubtask = SortSubtask1 type SorterFile1 = struct { FpFd uintptr FiEof I64 } // A sub-task in the sort process type SorterFile = SorterFile1 type SorterList1 = struct { FpList uintptr FaMemory uintptr FszPMA int32 F__ccgo_pad1 [4]byte } // Temporary file object wrapper type SorterList = SorterList1 type IncrMerger1 = struct { FpTask uintptr FpMerger uintptr FiStartOff I64 FmxSz int32 FbEof int32 FbUseThread int32 F__ccgo_pad1 [4]byte FaFile [2]SorterFile } // In-memory list of records type IncrMerger = IncrMerger1 // This object represents a single thread of control in a sort operation. // Exactly VdbeSorter.nTask instances of this object are allocated // as part of each VdbeSorter object. Instances are never allocated any // other way. VdbeSorter.nTask is set to the number of worker threads allowed // (see SQLITE_CONFIG_WORKER_THREADS) plus one (the main thread). Thus for // single-threaded operation, there is exactly one instance of this object // and for multi-threaded operation there are two or more instances. // // Essentially, this structure contains all those fields of the VdbeSorter // structure for which each thread requires a separate instance. For example, // each thread requries its own UnpackedRecord object to unpack records in // as part of comparison operations. // // Before a background thread is launched, variable bDone is set to 0. Then, // right before it exits, the thread itself sets bDone to 1. This is used for // two purposes: // // 1. When flushing the contents of memory to a level-0 PMA on disk, to // attempt to select a SortSubtask for which there is not already an // active background thread (since doing so causes the main thread // to block until it finishes). // // 2. If SQLITE_DEBUG_SORTER_THREADS is defined, to determine if a call // to sqlite3ThreadJoin() is likely to block. Cases that are likely to // block provoke debugging output. // // In both cases, the effects of the main thread seeing (bDone==0) even // after the thread has finished are not dire. So we don't worry about // memory barriers and such here. type SorterCompare = uintptr func vdbePmaReaderClear(tls *libc.TLS, pReadr uintptr) { Xsqlite3_free(tls, (*PmaReader)(unsafe.Pointer(pReadr)).FaAlloc) Xsqlite3_free(tls, (*PmaReader)(unsafe.Pointer(pReadr)).FaBuffer) if (*PmaReader)(unsafe.Pointer(pReadr)).FaMap != 0 { Xsqlite3OsUnfetch(tls, (*PmaReader)(unsafe.Pointer(pReadr)).FpFd, int64(0), (*PmaReader)(unsafe.Pointer(pReadr)).FaMap) } vdbeIncrFree(tls, (*PmaReader)(unsafe.Pointer(pReadr)).FpIncr) libc.Xmemset(tls, pReadr, 0, uint64(unsafe.Sizeof(PmaReader{}))) } func vdbePmaReadBlob(tls *libc.TLS, p uintptr, nByte int32, ppOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var iBuf int32 var nAvail int32 if (*PmaReader)(unsafe.Pointer(p)).FaMap != 0 { *(*uintptr)(unsafe.Pointer(ppOut)) = (*PmaReader)(unsafe.Pointer(p)).FaMap + uintptr((*PmaReader)(unsafe.Pointer(p)).FiReadOff) *(*I64)(unsafe.Pointer(p)) += I64(nByte) return SQLITE_OK } iBuf = int32((*PmaReader)(unsafe.Pointer(p)).FiReadOff % I64((*PmaReader)(unsafe.Pointer(p)).FnBuffer)) if iBuf == 0 { var nRead int32 var rc int32 if (*PmaReader)(unsafe.Pointer(p)).FiEof-(*PmaReader)(unsafe.Pointer(p)).FiReadOff > I64((*PmaReader)(unsafe.Pointer(p)).FnBuffer) { nRead = (*PmaReader)(unsafe.Pointer(p)).FnBuffer } else { nRead = int32((*PmaReader)(unsafe.Pointer(p)).FiEof - (*PmaReader)(unsafe.Pointer(p)).FiReadOff) } rc = Xsqlite3OsRead(tls, (*PmaReader)(unsafe.Pointer(p)).FpFd, (*PmaReader)(unsafe.Pointer(p)).FaBuffer, nRead, (*PmaReader)(unsafe.Pointer(p)).FiReadOff) if rc != SQLITE_OK { return rc } } nAvail = (*PmaReader)(unsafe.Pointer(p)).FnBuffer - iBuf if nByte <= nAvail { *(*uintptr)(unsafe.Pointer(ppOut)) = (*PmaReader)(unsafe.Pointer(p)).FaBuffer + uintptr(iBuf) *(*I64)(unsafe.Pointer(p)) += I64(nByte) } else { var nRem int32 if (*PmaReader)(unsafe.Pointer(p)).FnAlloc < nByte { var aNew uintptr var nNew Sqlite3_int64 = func() int64 { if int64(128) > int64(2)*Sqlite3_int64((*PmaReader)(unsafe.Pointer(p)).FnAlloc) { return int64(128) } return int64(2) * Sqlite3_int64((*PmaReader)(unsafe.Pointer(p)).FnAlloc) }() for Sqlite3_int64(nByte) > nNew { nNew = nNew * int64(2) } aNew = Xsqlite3Realloc(tls, (*PmaReader)(unsafe.Pointer(p)).FaAlloc, uint64(nNew)) if !(aNew != 0) { return SQLITE_NOMEM } (*PmaReader)(unsafe.Pointer(p)).FnAlloc = int32(nNew) (*PmaReader)(unsafe.Pointer(p)).FaAlloc = aNew } libc.Xmemcpy(tls, (*PmaReader)(unsafe.Pointer(p)).FaAlloc, (*PmaReader)(unsafe.Pointer(p)).FaBuffer+uintptr(iBuf), uint64(nAvail)) *(*I64)(unsafe.Pointer(p)) += I64(nAvail) nRem = nByte - nAvail for nRem > 0 { var rc int32 var nCopy int32 nCopy = nRem if nRem > (*PmaReader)(unsafe.Pointer(p)).FnBuffer { nCopy = (*PmaReader)(unsafe.Pointer(p)).FnBuffer } rc = vdbePmaReadBlob(tls, p, nCopy, bp) if rc != SQLITE_OK { return rc } libc.Xmemcpy(tls, (*PmaReader)(unsafe.Pointer(p)).FaAlloc+uintptr(nByte-nRem), *(*uintptr)(unsafe.Pointer(bp)), uint64(nCopy)) nRem = nRem - nCopy } *(*uintptr)(unsafe.Pointer(ppOut)) = (*PmaReader)(unsafe.Pointer(p)).FaAlloc } return SQLITE_OK } func vdbePmaReadVarint(tls *libc.TLS, p uintptr, pnOut uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var iBuf int32 if (*PmaReader)(unsafe.Pointer(p)).FaMap != 0 { *(*I64)(unsafe.Pointer(p)) += I64(Xsqlite3GetVarint(tls, (*PmaReader)(unsafe.Pointer(p)).FaMap+uintptr((*PmaReader)(unsafe.Pointer(p)).FiReadOff), pnOut)) } else { iBuf = int32((*PmaReader)(unsafe.Pointer(p)).FiReadOff % I64((*PmaReader)(unsafe.Pointer(p)).FnBuffer)) if iBuf != 0 && (*PmaReader)(unsafe.Pointer(p)).FnBuffer-iBuf >= 9 { *(*I64)(unsafe.Pointer(p)) += I64(Xsqlite3GetVarint(tls, (*PmaReader)(unsafe.Pointer(p)).FaBuffer+uintptr(iBuf), pnOut)) } else { var i int32 = 0 var rc int32 for __ccgo := true; __ccgo; __ccgo = int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))))&0x80 != 0 { rc = vdbePmaReadBlob(tls, p, 1, bp) if rc != 0 { return rc } *(*U8)(unsafe.Pointer(bp + 8 + uintptr(libc.PostIncInt32(&i, 1)&0xf))) = *(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))) } Xsqlite3GetVarint(tls, bp+8, pnOut) } } return SQLITE_OK } func vdbeSorterMapFile(tls *libc.TLS, pTask uintptr, pFile uintptr, pp uintptr) int32 { var rc int32 = SQLITE_OK if (*SorterFile)(unsafe.Pointer(pFile)).FiEof <= I64((*Sqlite3)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).Fdb)).FnMaxSorterMmap) { var pFd uintptr = (*SorterFile)(unsafe.Pointer(pFile)).FpFd if (*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pFd)).FpMethods)).FiVersion >= 3 { rc = Xsqlite3OsFetch(tls, pFd, int64(0), int32((*SorterFile)(unsafe.Pointer(pFile)).FiEof), pp) } } return rc } func vdbePmaReaderSeek(tls *libc.TLS, pTask uintptr, pReadr uintptr, pFile uintptr, iOff I64) int32 { var rc int32 = SQLITE_OK if Xsqlite3FaultSim(tls, 201) != 0 { return SQLITE_IOERR | int32(1)<<8 } if (*PmaReader)(unsafe.Pointer(pReadr)).FaMap != 0 { Xsqlite3OsUnfetch(tls, (*PmaReader)(unsafe.Pointer(pReadr)).FpFd, int64(0), (*PmaReader)(unsafe.Pointer(pReadr)).FaMap) (*PmaReader)(unsafe.Pointer(pReadr)).FaMap = uintptr(0) } (*PmaReader)(unsafe.Pointer(pReadr)).FiReadOff = iOff (*PmaReader)(unsafe.Pointer(pReadr)).FiEof = (*SorterFile)(unsafe.Pointer(pFile)).FiEof (*PmaReader)(unsafe.Pointer(pReadr)).FpFd = (*SorterFile)(unsafe.Pointer(pFile)).FpFd rc = vdbeSorterMapFile(tls, pTask, pFile, pReadr+64) if rc == SQLITE_OK && (*PmaReader)(unsafe.Pointer(pReadr)).FaMap == uintptr(0) { var pgsz int32 = (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).Fpgsz var iBuf int32 = int32((*PmaReader)(unsafe.Pointer(pReadr)).FiReadOff % I64(pgsz)) if (*PmaReader)(unsafe.Pointer(pReadr)).FaBuffer == uintptr(0) { (*PmaReader)(unsafe.Pointer(pReadr)).FaBuffer = Xsqlite3Malloc(tls, uint64(pgsz)) if (*PmaReader)(unsafe.Pointer(pReadr)).FaBuffer == uintptr(0) { rc = SQLITE_NOMEM } (*PmaReader)(unsafe.Pointer(pReadr)).FnBuffer = pgsz } if rc == SQLITE_OK && iBuf != 0 { var nRead int32 = pgsz - iBuf if (*PmaReader)(unsafe.Pointer(pReadr)).FiReadOff+I64(nRead) > (*PmaReader)(unsafe.Pointer(pReadr)).FiEof { nRead = int32((*PmaReader)(unsafe.Pointer(pReadr)).FiEof - (*PmaReader)(unsafe.Pointer(pReadr)).FiReadOff) } rc = Xsqlite3OsRead(tls, (*PmaReader)(unsafe.Pointer(pReadr)).FpFd, (*PmaReader)(unsafe.Pointer(pReadr)).FaBuffer+uintptr(iBuf), nRead, (*PmaReader)(unsafe.Pointer(pReadr)).FiReadOff) } } return rc } func vdbePmaReaderNext(tls *libc.TLS, pReadr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK *(*U64)(unsafe.Pointer(bp)) = uint64(0) if (*PmaReader)(unsafe.Pointer(pReadr)).FiReadOff >= (*PmaReader)(unsafe.Pointer(pReadr)).FiEof { var pIncr uintptr = (*PmaReader)(unsafe.Pointer(pReadr)).FpIncr var bEof int32 = 1 if pIncr != 0 { rc = vdbeIncrSwap(tls, pIncr) if rc == SQLITE_OK && (*IncrMerger)(unsafe.Pointer(pIncr)).FbEof == 0 { rc = vdbePmaReaderSeek(tls, (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask, pReadr, pIncr+40, (*IncrMerger)(unsafe.Pointer(pIncr)).FiStartOff) bEof = 0 } } if bEof != 0 { vdbePmaReaderClear(tls, pReadr) return rc } } if rc == SQLITE_OK { rc = vdbePmaReadVarint(tls, pReadr, bp) } if rc == SQLITE_OK { (*PmaReader)(unsafe.Pointer(pReadr)).FnKey = int32(*(*U64)(unsafe.Pointer(bp))) rc = vdbePmaReadBlob(tls, pReadr, int32(*(*U64)(unsafe.Pointer(bp))), pReadr+40) } return rc } func vdbePmaReaderInit(tls *libc.TLS, pTask uintptr, pFile uintptr, iStart I64, pReadr uintptr, pnByte uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = vdbePmaReaderSeek(tls, pTask, pReadr, pFile, iStart) if rc == SQLITE_OK { *(*U64)(unsafe.Pointer(bp)) = uint64(0) rc = vdbePmaReadVarint(tls, pReadr, bp) (*PmaReader)(unsafe.Pointer(pReadr)).FiEof = I64(U64((*PmaReader)(unsafe.Pointer(pReadr)).FiReadOff) + *(*U64)(unsafe.Pointer(bp))) *(*I64)(unsafe.Pointer(pnByte)) += I64(*(*U64)(unsafe.Pointer(bp))) } if rc == SQLITE_OK { rc = vdbePmaReaderNext(tls, pReadr) } return rc } func vdbeSorterCompareTail(tls *libc.TLS, pTask uintptr, pbKey2Cached uintptr, pKey1 uintptr, nKey1 int32, pKey2 uintptr, nKey2 int32) int32 { var r2 uintptr = (*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked if *(*int32)(unsafe.Pointer(pbKey2Cached)) == 0 { Xsqlite3VdbeRecordUnpack(tls, (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo, nKey2, pKey2, r2) *(*int32)(unsafe.Pointer(pbKey2Cached)) = 1 } return Xsqlite3VdbeRecordCompareWithSkip(tls, nKey1, pKey1, r2, 1) } func vdbeSorterCompare(tls *libc.TLS, pTask uintptr, pbKey2Cached uintptr, pKey1 uintptr, nKey1 int32, pKey2 uintptr, nKey2 int32) int32 { var r2 uintptr = (*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked if !(*(*int32)(unsafe.Pointer(pbKey2Cached)) != 0) { Xsqlite3VdbeRecordUnpack(tls, (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo, nKey2, pKey2, r2) *(*int32)(unsafe.Pointer(pbKey2Cached)) = 1 } return Xsqlite3VdbeRecordCompare(tls, nKey1, pKey1, r2) } func vdbeSorterCompareText(tls *libc.TLS, pTask uintptr, pbKey2Cached uintptr, pKey1 uintptr, nKey1 int32, pKey2 uintptr, nKey2 int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var p1 uintptr = pKey1 var p2 uintptr = pKey2 var v1 uintptr = p1 + uintptr(*(*U8)(unsafe.Pointer(p1))) var v2 uintptr = p2 + uintptr(*(*U8)(unsafe.Pointer(p2))) var res int32 *(*int32)(unsafe.Pointer(bp)) = int32(U32(*(*U8)(unsafe.Pointer(p1 + 1)))) if *(*int32)(unsafe.Pointer(bp)) >= 0x80 { Xsqlite3GetVarint32(tls, p1+1, bp) } *(*int32)(unsafe.Pointer(bp + 4)) = int32(U32(*(*U8)(unsafe.Pointer(p2 + 1)))) if *(*int32)(unsafe.Pointer(bp + 4)) >= 0x80 { Xsqlite3GetVarint32(tls, p2+1, bp+4) } res = libc.Xmemcmp(tls, v1, v2, uint64((func() int32 { if *(*int32)(unsafe.Pointer(bp)) < *(*int32)(unsafe.Pointer(bp + 4)) { return *(*int32)(unsafe.Pointer(bp)) } return *(*int32)(unsafe.Pointer(bp + 4)) }()-13)/2)) if res == 0 { res = *(*int32)(unsafe.Pointer(bp)) - *(*int32)(unsafe.Pointer(bp + 4)) } if res == 0 { if int32((*KeyInfo)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo)).FnKeyField) > 1 { res = vdbeSorterCompareTail(tls, pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2) } } else { if *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo)).FaSortFlags)) != 0 { res = res * -1 } } return res } func vdbeSorterCompareInt(tls *libc.TLS, pTask uintptr, pbKey2Cached uintptr, pKey1 uintptr, nKey1 int32, pKey2 uintptr, nKey2 int32) int32 { var p1 uintptr = pKey1 var p2 uintptr = pKey2 var s1 int32 = int32(*(*U8)(unsafe.Pointer(p1 + 1))) var s2 int32 = int32(*(*U8)(unsafe.Pointer(p2 + 1))) var v1 uintptr = p1 + uintptr(*(*U8)(unsafe.Pointer(p1))) var v2 uintptr = p2 + uintptr(*(*U8)(unsafe.Pointer(p2))) var res int32 if s1 == s2 { var n U8 = aLen[s1] var i int32 res = 0 for i = 0; i < int32(n); i++ { if libc.AssignInt32(&res, int32(*(*U8)(unsafe.Pointer(v1 + uintptr(i))))-int32(*(*U8)(unsafe.Pointer(v2 + uintptr(i))))) != 0 { if (int32(*(*U8)(unsafe.Pointer(v1)))^int32(*(*U8)(unsafe.Pointer(v2))))&0x80 != 0 { if int32(*(*U8)(unsafe.Pointer(v1)))&0x80 != 0 { res = -1 } else { res = +1 } } break } } } else if s1 > 7 && s2 > 7 { res = s1 - s2 } else { if s2 > 7 { res = +1 } else if s1 > 7 { res = -1 } else { res = s1 - s2 } if res > 0 { if int32(*(*U8)(unsafe.Pointer(v1)))&0x80 != 0 { res = -1 } } else { if int32(*(*U8)(unsafe.Pointer(v2)))&0x80 != 0 { res = +1 } } } if res == 0 { if int32((*KeyInfo)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo)).FnKeyField) > 1 { res = vdbeSorterCompareTail(tls, pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2) } } else if *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo)).FaSortFlags)) != 0 { res = res * -1 } return res } var aLen = [10]U8{U8(0), U8(1), U8(2), U8(3), U8(4), U8(6), U8(8), U8(0), U8(0), U8(0)} // Initialize the temporary index cursor just opened as a sorter cursor. // // Usually, the sorter module uses the value of (pCsr->pKeyInfo->nKeyField) // to determine the number of fields that should be compared from the // records being sorted. However, if the value passed as argument nField // is non-zero and the sorter is able to guarantee a stable sort, nField // is used instead. This is used when sorting records for a CREATE INDEX // statement. In this case, keys are always delivered to the sorter in // order of the primary key, which happens to be make up the final part // of the records being sorted. So if the sort is stable, there is never // any reason to compare PK fields and they can be ignored for a small // performance boost. // // The sorter can guarantee a stable sort when running in single-threaded // mode, but not in multi-threaded mode. // // SQLITE_OK is returned if successful, or an SQLite error code otherwise. func Xsqlite3VdbeSorterInit(tls *libc.TLS, db uintptr, nField int32, pCsr uintptr) int32 { var pgsz int32 var i int32 var pSorter uintptr var pKeyInfo uintptr var szKeyInfo int32 var sz int32 var rc int32 = SQLITE_OK var nWorker int32 if Xsqlite3TempInMemory(tls, db) != 0 || int32(Xsqlite3Config.FbCoreMutex) == 0 { nWorker = 0 } else { nWorker = *(*int32)(unsafe.Pointer(db + 136 + 11*4)) } szKeyInfo = int32(uint64(unsafe.Sizeof(KeyInfo{})) + uint64(int32((*KeyInfo)(unsafe.Pointer((*VdbeCursor)(unsafe.Pointer(pCsr)).FpKeyInfo)).FnKeyField)-1)*uint64(unsafe.Sizeof(uintptr(0)))) sz = int32(uint64(unsafe.Sizeof(VdbeSorter{})) + uint64(nWorker)*uint64(unsafe.Sizeof(SortSubtask{}))) pSorter = Xsqlite3DbMallocZero(tls, db, uint64(sz+szKeyInfo)) *(*uintptr)(unsafe.Pointer(pCsr + 48)) = pSorter if pSorter == uintptr(0) { rc = SQLITE_NOMEM } else { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpBt (*VdbeSorter)(unsafe.Pointer(pSorter)).FpKeyInfo = libc.AssignUintptr(&pKeyInfo, pSorter+uintptr(sz)) libc.Xmemcpy(tls, pKeyInfo, (*VdbeCursor)(unsafe.Pointer(pCsr)).FpKeyInfo, uint64(szKeyInfo)) (*KeyInfo)(unsafe.Pointer(pKeyInfo)).Fdb = uintptr(0) if nField != 0 && nWorker == 0 { (*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnKeyField = U16(nField) } Xsqlite3BtreeEnter(tls, pBt) (*VdbeSorter)(unsafe.Pointer(pSorter)).Fpgsz = libc.AssignInt32(&pgsz, Xsqlite3BtreeGetPageSize(tls, pBt)) Xsqlite3BtreeLeave(tls, pBt) (*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask = U8(nWorker + 1) (*VdbeSorter)(unsafe.Pointer(pSorter)).FiPrev = U8(nWorker - 1) (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUseThreads = U8(libc.Bool32(int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask) > 1)) (*VdbeSorter)(unsafe.Pointer(pSorter)).Fdb = db for i = 0; i < int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask); i++ { var pTask uintptr = pSorter + 96 + uintptr(i)*104 (*SortSubtask)(unsafe.Pointer(pTask)).FpSorter = pSorter } if !(Xsqlite3TempInMemory(tls, db) != 0) { var mxCache I64 var szPma U32 = Xsqlite3Config.FszPma (*VdbeSorter)(unsafe.Pointer(pSorter)).FmnPmaSize = int32(szPma * U32(pgsz)) mxCache = I64((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema)).Fcache_size) if mxCache < int64(0) { mxCache = mxCache * int64(-1024) } else { mxCache = mxCache * I64(pgsz) } mxCache = func() int64 { if mxCache < int64(int32(1)<<29) { return mxCache } return int64(int32(1) << 29) }() (*VdbeSorter)(unsafe.Pointer(pSorter)).FmxPmaSize = func() int32 { if (*VdbeSorter)(unsafe.Pointer(pSorter)).FmnPmaSize > int32(mxCache) { return (*VdbeSorter)(unsafe.Pointer(pSorter)).FmnPmaSize } return int32(mxCache) }() if int32(Xsqlite3Config.FbSmallMalloc) == 0 { (*VdbeSorter)(unsafe.Pointer(pSorter)).FnMemory = pgsz (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory = Xsqlite3Malloc(tls, uint64(pgsz)) if !(int32((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory) != 0) { rc = SQLITE_NOMEM } } } if int32((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnAllField) < 13 && (*(*uintptr)(unsafe.Pointer(pKeyInfo + 32)) == uintptr(0) || *(*uintptr)(unsafe.Pointer(pKeyInfo + 32)) == (*Sqlite3)(unsafe.Pointer(db)).FpDfltColl) && int32(*(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FaSortFlags)))&KEYINFO_ORDER_BIGNULL == 0 { (*VdbeSorter)(unsafe.Pointer(pSorter)).FtypeMask = U8(SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT) } } return rc } func vdbeSorterRecordFree(tls *libc.TLS, db uintptr, pRecord uintptr) { var p uintptr var pNext uintptr for p = pRecord; p != 0; p = pNext { pNext = *(*uintptr)(unsafe.Pointer(p + 8)) Xsqlite3DbFree(tls, db, p) } } func vdbeSortSubtaskCleanup(tls *libc.TLS, db uintptr, pTask uintptr) { Xsqlite3DbFree(tls, db, (*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked) if (*SortSubtask)(unsafe.Pointer(pTask)).Flist.FaMemory != 0 { Xsqlite3_free(tls, (*SortSubtask)(unsafe.Pointer(pTask)).Flist.FaMemory) } else { vdbeSorterRecordFree(tls, uintptr(0), (*SortSubtask)(unsafe.Pointer(pTask)).Flist.FpList) } if (*SortSubtask)(unsafe.Pointer(pTask)).Ffile.FpFd != 0 { Xsqlite3OsCloseFree(tls, (*SortSubtask)(unsafe.Pointer(pTask)).Ffile.FpFd) } if (*SortSubtask)(unsafe.Pointer(pTask)).Ffile2.FpFd != 0 { Xsqlite3OsCloseFree(tls, (*SortSubtask)(unsafe.Pointer(pTask)).Ffile2.FpFd) } libc.Xmemset(tls, pTask, 0, uint64(unsafe.Sizeof(SortSubtask{}))) } func vdbeSorterJoinThread(tls *libc.TLS, pTask uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK if (*SortSubtask)(unsafe.Pointer(pTask)).FpThread != 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(int64(SQLITE_ERROR)) Xsqlite3ThreadJoin(tls, (*SortSubtask)(unsafe.Pointer(pTask)).FpThread, bp) rc = int32(*(*uintptr)(unsafe.Pointer(bp))) (*SortSubtask)(unsafe.Pointer(pTask)).FbDone = 0 (*SortSubtask)(unsafe.Pointer(pTask)).FpThread = uintptr(0) } return rc } func vdbeSorterCreateThread(tls *libc.TLS, pTask uintptr, xTask uintptr, pIn uintptr) int32 { return Xsqlite3ThreadCreate(tls, pTask, xTask, pIn) } func vdbeSorterJoinAll(tls *libc.TLS, pSorter uintptr, rcin int32) int32 { var rc int32 = rcin var i int32 for i = int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask) - 1; i >= 0; i-- { var pTask uintptr = pSorter + 96 + uintptr(i)*104 var rc2 int32 = vdbeSorterJoinThread(tls, pTask) if rc == SQLITE_OK { rc = rc2 } } return rc } func vdbeMergeEngineNew(tls *libc.TLS, nReader int32) uintptr { var N int32 = 2 var nByte int32 var pNew uintptr for N < nReader { N = N + N } nByte = int32(uint64(unsafe.Sizeof(MergeEngine{})) + uint64(N)*(uint64(unsafe.Sizeof(int32(0)))+uint64(unsafe.Sizeof(PmaReader{})))) if Xsqlite3FaultSim(tls, 100) != 0 { pNew = uintptr(0) } else { pNew = Xsqlite3MallocZero(tls, uint64(nByte)) } if pNew != 0 { (*MergeEngine)(unsafe.Pointer(pNew)).FnTree = N (*MergeEngine)(unsafe.Pointer(pNew)).FpTask = uintptr(0) (*MergeEngine)(unsafe.Pointer(pNew)).FaReadr = pNew + 1*32 (*MergeEngine)(unsafe.Pointer(pNew)).FaTree = (*MergeEngine)(unsafe.Pointer(pNew)).FaReadr + uintptr(N)*80 } return pNew } func vdbeMergeEngineFree(tls *libc.TLS, pMerger uintptr) { var i int32 if pMerger != 0 { for i = 0; i < (*MergeEngine)(unsafe.Pointer(pMerger)).FnTree; i++ { vdbePmaReaderClear(tls, (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr+uintptr(i)*80) } } Xsqlite3_free(tls, pMerger) } func vdbeIncrFree(tls *libc.TLS, pIncr uintptr) { if pIncr != 0 { if (*IncrMerger)(unsafe.Pointer(pIncr)).FbUseThread != 0 { vdbeSorterJoinThread(tls, (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask) if (*SorterFile)(unsafe.Pointer(pIncr+40)).FpFd != 0 { Xsqlite3OsCloseFree(tls, (*SorterFile)(unsafe.Pointer(pIncr+40)).FpFd) } if (*SorterFile)(unsafe.Pointer(pIncr+40+1*16)).FpFd != 0 { Xsqlite3OsCloseFree(tls, (*SorterFile)(unsafe.Pointer(pIncr+40+1*16)).FpFd) } } vdbeMergeEngineFree(tls, (*IncrMerger)(unsafe.Pointer(pIncr)).FpMerger) Xsqlite3_free(tls, pIncr) } } // Reset a sorting cursor back to its original empty state. func Xsqlite3VdbeSorterReset(tls *libc.TLS, db uintptr, pSorter uintptr) { var i int32 vdbeSorterJoinAll(tls, pSorter, SQLITE_OK) if (*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader != 0 { vdbePmaReaderClear(tls, (*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader) Xsqlite3DbFree(tls, db, (*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader) (*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader = uintptr(0) } vdbeMergeEngineFree(tls, (*VdbeSorter)(unsafe.Pointer(pSorter)).FpMerger) (*VdbeSorter)(unsafe.Pointer(pSorter)).FpMerger = uintptr(0) for i = 0; i < int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask); i++ { var pTask uintptr = pSorter + 96 + uintptr(i)*104 vdbeSortSubtaskCleanup(tls, db, pTask) (*SortSubtask)(unsafe.Pointer(pTask)).FpSorter = pSorter } if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory == uintptr(0) { vdbeSorterRecordFree(tls, uintptr(0), (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList) } (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList = uintptr(0) (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FszPMA = 0 (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUsePMA = U8(0) (*VdbeSorter)(unsafe.Pointer(pSorter)).FiMemory = 0 (*VdbeSorter)(unsafe.Pointer(pSorter)).FmxKeysize = 0 Xsqlite3DbFree(tls, db, (*VdbeSorter)(unsafe.Pointer(pSorter)).FpUnpacked) (*VdbeSorter)(unsafe.Pointer(pSorter)).FpUnpacked = uintptr(0) } // Free any cursor components allocated by sqlite3VdbeSorterXXX routines. func Xsqlite3VdbeSorterClose(tls *libc.TLS, db uintptr, pCsr uintptr) { var pSorter uintptr pSorter = *(*uintptr)(unsafe.Pointer(pCsr + 48)) if pSorter != 0 { Xsqlite3VdbeSorterReset(tls, db, pSorter) Xsqlite3_free(tls, (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory) Xsqlite3DbFree(tls, db, pSorter) *(*uintptr)(unsafe.Pointer(pCsr + 48)) = uintptr(0) } } func vdbeSorterExtendFile(tls *libc.TLS, db uintptr, pFd uintptr, nByte I64) { bp := tls.Alloc(24) defer tls.Free(24) *(*I64)(unsafe.Pointer(bp + 8)) = nByte if *(*I64)(unsafe.Pointer(bp + 8)) <= I64((*Sqlite3)(unsafe.Pointer(db)).FnMaxSorterMmap) && (*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pFd)).FpMethods)).FiVersion >= 3 { *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) *(*int32)(unsafe.Pointer(bp)) = 4 * 1024 Xsqlite3OsFileControlHint(tls, pFd, SQLITE_FCNTL_CHUNK_SIZE, bp) Xsqlite3OsFileControlHint(tls, pFd, SQLITE_FCNTL_SIZE_HINT, bp+8) Xsqlite3OsFetch(tls, pFd, int64(0), int32(*(*I64)(unsafe.Pointer(bp + 8))), bp+16) if *(*uintptr)(unsafe.Pointer(bp + 16)) != 0 { Xsqlite3OsUnfetch(tls, pFd, int64(0), *(*uintptr)(unsafe.Pointer(bp + 16))) } } } func vdbeSorterOpenTempFile(tls *libc.TLS, db uintptr, nExtend I64, ppFd uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) if Xsqlite3FaultSim(tls, 202) != 0 { return SQLITE_IOERR | int32(13)<<8 } *(*int32)(unsafe.Pointer(bp)) = Xsqlite3OsOpenMalloc(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, uintptr(0), ppFd, SQLITE_OPEN_TEMP_JOURNAL|SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_DELETEONCLOSE, bp) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { *(*I64)(unsafe.Pointer(bp + 8)) = int64(SQLITE_MAX_MMAP_SIZE) Xsqlite3OsFileControlHint(tls, *(*uintptr)(unsafe.Pointer(ppFd)), SQLITE_FCNTL_MMAP_SIZE, bp+8) if nExtend > int64(0) { vdbeSorterExtendFile(tls, db, *(*uintptr)(unsafe.Pointer(ppFd)), nExtend) } } return *(*int32)(unsafe.Pointer(bp)) } func vdbeSortAllocUnpacked(tls *libc.TLS, pTask uintptr) int32 { if (*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked == uintptr(0) { (*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked = Xsqlite3VdbeAllocUnpackedRecord(tls, (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo) if (*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked == uintptr(0) { return SQLITE_NOMEM } (*UnpackedRecord)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked)).FnField = (*KeyInfo)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FpKeyInfo)).FnKeyField (*UnpackedRecord)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked)).FerrCode = U8(0) } return SQLITE_OK } func vdbeSorterMerge(tls *libc.TLS, pTask uintptr, p1 uintptr, p2 uintptr) uintptr { bp := tls.Alloc(12) defer tls.Free(12) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var pp uintptr = bp *(*int32)(unsafe.Pointer(bp + 8)) = 0 for { var res int32 res = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SortSubtask)(unsafe.Pointer(pTask)).FxCompare})).f(tls, pTask, bp+8, p1+uintptr(1)*16, (*SorterRecord)(unsafe.Pointer(p1)).FnVal, p2+uintptr(1)*16, (*SorterRecord)(unsafe.Pointer(p2)).FnVal) if res <= 0 { *(*uintptr)(unsafe.Pointer(pp)) = p1 pp = p1 + 8 p1 = *(*uintptr)(unsafe.Pointer(p1 + 8)) if p1 == uintptr(0) { *(*uintptr)(unsafe.Pointer(pp)) = p2 break } } else { *(*uintptr)(unsafe.Pointer(pp)) = p2 pp = p2 + 8 p2 = *(*uintptr)(unsafe.Pointer(p2 + 8)) *(*int32)(unsafe.Pointer(bp + 8)) = 0 if p2 == uintptr(0) { *(*uintptr)(unsafe.Pointer(pp)) = p1 break } } } return *(*uintptr)(unsafe.Pointer(bp)) } func vdbeSorterGetCompare(tls *libc.TLS, p uintptr) SorterCompare { if int32((*VdbeSorter)(unsafe.Pointer(p)).FtypeMask) == SORTER_TYPE_INTEGER { return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr, int32) int32 }{vdbeSorterCompareInt})) } else if int32((*VdbeSorter)(unsafe.Pointer(p)).FtypeMask) == SORTER_TYPE_TEXT { return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr, int32) int32 }{vdbeSorterCompareText})) } return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr, int32) int32 }{vdbeSorterCompare})) } func vdbeSorterSort(tls *libc.TLS, pTask uintptr, pList uintptr) int32 { bp := tls.Alloc(512) defer tls.Free(512) var i int32 var p uintptr var rc int32 rc = vdbeSortAllocUnpacked(tls, pTask) if rc != SQLITE_OK { return rc } p = (*SorterList)(unsafe.Pointer(pList)).FpList (*SortSubtask)(unsafe.Pointer(pTask)).FxCompare = vdbeSorterGetCompare(tls, (*SortSubtask)(unsafe.Pointer(pTask)).FpSorter) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([64]uintptr{}))) for p != 0 { var pNext uintptr if (*SorterList)(unsafe.Pointer(pList)).FaMemory != 0 { if p == (*SorterList)(unsafe.Pointer(pList)).FaMemory { pNext = uintptr(0) } else { pNext = (*SorterList)(unsafe.Pointer(pList)).FaMemory + uintptr(*(*int32)(unsafe.Pointer(p + 8))) } } else { pNext = *(*uintptr)(unsafe.Pointer(p + 8)) } *(*uintptr)(unsafe.Pointer(p + 8)) = uintptr(0) for i = 0; *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) != 0; i++ { p = vdbeSorterMerge(tls, pTask, p, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = uintptr(0) } *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = p p = pNext } p = uintptr(0) for i = 0; i < int32(uint64(unsafe.Sizeof([64]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0)))); i++ { if *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) == uintptr(0) { continue } if p != 0 { p = vdbeSorterMerge(tls, pTask, p, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8))) } else { p = *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) } } (*SorterList)(unsafe.Pointer(pList)).FpList = p return int32((*UnpackedRecord)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked)).FerrCode) } func vdbePmaWriterInit(tls *libc.TLS, pFd uintptr, p uintptr, nBuf int32, iStart I64) { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(PmaWriter{}))) (*PmaWriter)(unsafe.Pointer(p)).FaBuffer = Xsqlite3Malloc(tls, uint64(nBuf)) if !(int32((*PmaWriter)(unsafe.Pointer(p)).FaBuffer) != 0) { (*PmaWriter)(unsafe.Pointer(p)).FeFWErr = SQLITE_NOMEM } else { (*PmaWriter)(unsafe.Pointer(p)).FiBufEnd = libc.AssignPtrInt32(p+20, int32(iStart%I64(nBuf))) (*PmaWriter)(unsafe.Pointer(p)).FiWriteOff = iStart - I64((*PmaWriter)(unsafe.Pointer(p)).FiBufStart) (*PmaWriter)(unsafe.Pointer(p)).FnBuffer = nBuf (*PmaWriter)(unsafe.Pointer(p)).FpFd = pFd } } func vdbePmaWriteBlob(tls *libc.TLS, p uintptr, pData uintptr, nData int32) { var nRem int32 = nData for nRem > 0 && (*PmaWriter)(unsafe.Pointer(p)).FeFWErr == 0 { var nCopy int32 = nRem if nCopy > (*PmaWriter)(unsafe.Pointer(p)).FnBuffer-(*PmaWriter)(unsafe.Pointer(p)).FiBufEnd { nCopy = (*PmaWriter)(unsafe.Pointer(p)).FnBuffer - (*PmaWriter)(unsafe.Pointer(p)).FiBufEnd } libc.Xmemcpy(tls, (*PmaWriter)(unsafe.Pointer(p)).FaBuffer+uintptr((*PmaWriter)(unsafe.Pointer(p)).FiBufEnd), pData+uintptr(nData-nRem), uint64(nCopy)) *(*int32)(unsafe.Pointer(p + 24)) += nCopy if (*PmaWriter)(unsafe.Pointer(p)).FiBufEnd == (*PmaWriter)(unsafe.Pointer(p)).FnBuffer { (*PmaWriter)(unsafe.Pointer(p)).FeFWErr = Xsqlite3OsWrite(tls, (*PmaWriter)(unsafe.Pointer(p)).FpFd, (*PmaWriter)(unsafe.Pointer(p)).FaBuffer+uintptr((*PmaWriter)(unsafe.Pointer(p)).FiBufStart), (*PmaWriter)(unsafe.Pointer(p)).FiBufEnd-(*PmaWriter)(unsafe.Pointer(p)).FiBufStart, (*PmaWriter)(unsafe.Pointer(p)).FiWriteOff+I64((*PmaWriter)(unsafe.Pointer(p)).FiBufStart)) (*PmaWriter)(unsafe.Pointer(p)).FiBufStart = libc.AssignPtrInt32(p+24, 0) *(*I64)(unsafe.Pointer(p + 32)) += I64((*PmaWriter)(unsafe.Pointer(p)).FnBuffer) } nRem = nRem - nCopy } } func vdbePmaWriterFinish(tls *libc.TLS, p uintptr, piEof uintptr) int32 { var rc int32 if (*PmaWriter)(unsafe.Pointer(p)).FeFWErr == 0 && (*PmaWriter)(unsafe.Pointer(p)).FaBuffer != 0 && (*PmaWriter)(unsafe.Pointer(p)).FiBufEnd > (*PmaWriter)(unsafe.Pointer(p)).FiBufStart { (*PmaWriter)(unsafe.Pointer(p)).FeFWErr = Xsqlite3OsWrite(tls, (*PmaWriter)(unsafe.Pointer(p)).FpFd, (*PmaWriter)(unsafe.Pointer(p)).FaBuffer+uintptr((*PmaWriter)(unsafe.Pointer(p)).FiBufStart), (*PmaWriter)(unsafe.Pointer(p)).FiBufEnd-(*PmaWriter)(unsafe.Pointer(p)).FiBufStart, (*PmaWriter)(unsafe.Pointer(p)).FiWriteOff+I64((*PmaWriter)(unsafe.Pointer(p)).FiBufStart)) } *(*I64)(unsafe.Pointer(piEof)) = (*PmaWriter)(unsafe.Pointer(p)).FiWriteOff + I64((*PmaWriter)(unsafe.Pointer(p)).FiBufEnd) Xsqlite3_free(tls, (*PmaWriter)(unsafe.Pointer(p)).FaBuffer) rc = (*PmaWriter)(unsafe.Pointer(p)).FeFWErr libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(PmaWriter{}))) return rc } func vdbePmaWriteVarint(tls *libc.TLS, p uintptr, iVal U64) { bp := tls.Alloc(10) defer tls.Free(10) var nByte int32 nByte = Xsqlite3PutVarint(tls, bp, iVal) vdbePmaWriteBlob(tls, p, bp, nByte) } func vdbeSorterListToPMA(tls *libc.TLS, pTask uintptr, pList uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var db uintptr = (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).Fdb var rc int32 = SQLITE_OK libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(PmaWriter{}))) if (*SortSubtask)(unsafe.Pointer(pTask)).Ffile.FpFd == uintptr(0) { rc = vdbeSorterOpenTempFile(tls, db, int64(0), pTask+72) } if rc == SQLITE_OK { vdbeSorterExtendFile(tls, db, (*SortSubtask)(unsafe.Pointer(pTask)).Ffile.FpFd, (*SortSubtask)(unsafe.Pointer(pTask)).Ffile.FiEof+I64((*SorterList)(unsafe.Pointer(pList)).FszPMA)+int64(9)) } if rc == SQLITE_OK { rc = vdbeSorterSort(tls, pTask, pList) } if rc == SQLITE_OK { var p uintptr var pNext uintptr = uintptr(0) vdbePmaWriterInit(tls, (*SortSubtask)(unsafe.Pointer(pTask)).Ffile.FpFd, bp, (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).Fpgsz, (*SortSubtask)(unsafe.Pointer(pTask)).Ffile.FiEof) (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA++ vdbePmaWriteVarint(tls, bp, uint64((*SorterList)(unsafe.Pointer(pList)).FszPMA)) for p = (*SorterList)(unsafe.Pointer(pList)).FpList; p != 0; p = pNext { pNext = *(*uintptr)(unsafe.Pointer(p + 8)) vdbePmaWriteVarint(tls, bp, uint64((*SorterRecord)(unsafe.Pointer(p)).FnVal)) vdbePmaWriteBlob(tls, bp, p+uintptr(1)*16, (*SorterRecord)(unsafe.Pointer(p)).FnVal) if (*SorterList)(unsafe.Pointer(pList)).FaMemory == uintptr(0) { Xsqlite3_free(tls, p) } } (*SorterList)(unsafe.Pointer(pList)).FpList = p rc = vdbePmaWriterFinish(tls, bp, pTask+72+8) } return rc } func vdbeMergeEngineStep(tls *libc.TLS, pMerger uintptr, pbEof uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 var iPrev int32 = *(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + 1*4)) var pTask uintptr = (*MergeEngine)(unsafe.Pointer(pMerger)).FpTask rc = vdbePmaReaderNext(tls, (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr+uintptr(iPrev)*80) if rc == SQLITE_OK { var i int32 var pReadr1 uintptr var pReadr2 uintptr *(*int32)(unsafe.Pointer(bp)) = 0 pReadr1 = (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr + uintptr(iPrev&0xFFFE)*80 pReadr2 = (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr + uintptr(iPrev|0x0001)*80 for i = ((*MergeEngine)(unsafe.Pointer(pMerger)).FnTree + iPrev) / 2; i > 0; i = i / 2 { var iRes int32 if (*PmaReader)(unsafe.Pointer(pReadr1)).FpFd == uintptr(0) { iRes = +1 } else if (*PmaReader)(unsafe.Pointer(pReadr2)).FpFd == uintptr(0) { iRes = -1 } else { iRes = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SortSubtask)(unsafe.Pointer(pTask)).FxCompare})).f(tls, pTask, bp, (*PmaReader)(unsafe.Pointer(pReadr1)).FaKey, (*PmaReader)(unsafe.Pointer(pReadr1)).FnKey, (*PmaReader)(unsafe.Pointer(pReadr2)).FaKey, (*PmaReader)(unsafe.Pointer(pReadr2)).FnKey) } if iRes < 0 || iRes == 0 && pReadr1 < pReadr2 { *(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + uintptr(i)*4)) = int32((int64(pReadr1) - int64((*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr)) / 80) pReadr2 = (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr + uintptr(*(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + uintptr(i^0x0001)*4)))*80 *(*int32)(unsafe.Pointer(bp)) = 0 } else { if (*PmaReader)(unsafe.Pointer(pReadr1)).FpFd != 0 { *(*int32)(unsafe.Pointer(bp)) = 0 } *(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + uintptr(i)*4)) = int32((int64(pReadr2) - int64((*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr)) / 80) pReadr1 = (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr + uintptr(*(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + uintptr(i^0x0001)*4)))*80 } } *(*int32)(unsafe.Pointer(pbEof)) = libc.Bool32((*PmaReader)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr+uintptr(*(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + 1*4)))*80)).FpFd == uintptr(0)) } return func() int32 { if rc == SQLITE_OK { return int32((*UnpackedRecord)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked)).FerrCode) } return rc }() } func vdbeSorterFlushThread(tls *libc.TLS, pCtx uintptr) uintptr { var pTask uintptr = pCtx var rc int32 rc = vdbeSorterListToPMA(tls, pTask, pTask+32) (*SortSubtask)(unsafe.Pointer(pTask)).FbDone = 1 return uintptr(int64(rc)) } func vdbeSorterFlushPMA(tls *libc.TLS, pSorter uintptr) int32 { var rc int32 = SQLITE_OK var i int32 var pTask uintptr = uintptr(0) var nWorker int32 = int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask) - 1 (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUsePMA = U8(1) for i = 0; i < nWorker; i++ { var iTest int32 = (int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FiPrev) + i + 1) % nWorker pTask = pSorter + 96 + uintptr(iTest)*104 if (*SortSubtask)(unsafe.Pointer(pTask)).FbDone != 0 { rc = vdbeSorterJoinThread(tls, pTask) } if rc != SQLITE_OK || (*SortSubtask)(unsafe.Pointer(pTask)).FpThread == uintptr(0) { break } } if rc == SQLITE_OK { if i == nWorker { rc = vdbeSorterListToPMA(tls, pSorter+96+uintptr(nWorker)*104, pSorter+56) } else { var aMem uintptr var pCtx uintptr aMem = (*SortSubtask)(unsafe.Pointer(pTask)).Flist.FaMemory pCtx = pTask (*VdbeSorter)(unsafe.Pointer(pSorter)).FiPrev = U8(int64((pTask - (pSorter + 96)) / 104)) (*SortSubtask)(unsafe.Pointer(pTask)).Flist = (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList = uintptr(0) (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FszPMA = 0 if aMem != 0 { (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory = aMem (*VdbeSorter)(unsafe.Pointer(pSorter)).FnMemory = Xsqlite3MallocSize(tls, aMem) } else if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory != 0 { (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory = Xsqlite3Malloc(tls, uint64((*VdbeSorter)(unsafe.Pointer(pSorter)).FnMemory)) if !(int32((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory) != 0) { return SQLITE_NOMEM } } rc = vdbeSorterCreateThread(tls, pTask, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) uintptr }{vdbeSorterFlushThread})), pCtx) } } return rc } // Add a record to the sorter. func Xsqlite3VdbeSorterWrite(tls *libc.TLS, pCsr uintptr, pVal uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pSorter uintptr var rc int32 = SQLITE_OK var pNew uintptr var bFlush int32 var nReq int32 var nPMA int32 pSorter = *(*uintptr)(unsafe.Pointer(pCsr + 48)) *(*int32)(unsafe.Pointer(bp)) = int32(U32(*(*U8)(unsafe.Pointer((*Mem)(unsafe.Pointer(pVal)).Fz + 1)))) if *(*int32)(unsafe.Pointer(bp)) >= 0x80 { Xsqlite3GetVarint32(tls, (*Mem)(unsafe.Pointer(pVal)).Fz+1, bp) } if *(*int32)(unsafe.Pointer(bp)) > 0 && *(*int32)(unsafe.Pointer(bp)) < 10 && *(*int32)(unsafe.Pointer(bp)) != 7 { *(*U8)(unsafe.Pointer(pSorter + 92)) &= U8(SORTER_TYPE_INTEGER) } else if *(*int32)(unsafe.Pointer(bp)) > 10 && *(*int32)(unsafe.Pointer(bp))&0x01 != 0 { *(*U8)(unsafe.Pointer(pSorter + 92)) &= U8(SORTER_TYPE_TEXT) } else { (*VdbeSorter)(unsafe.Pointer(pSorter)).FtypeMask = U8(0) } nReq = int32(uint64((*Mem)(unsafe.Pointer(pVal)).Fn) + uint64(unsafe.Sizeof(SorterRecord{}))) nPMA = (*Mem)(unsafe.Pointer(pVal)).Fn + Xsqlite3VarintLen(tls, uint64((*Mem)(unsafe.Pointer(pVal)).Fn)) if (*VdbeSorter)(unsafe.Pointer(pSorter)).FmxPmaSize != 0 { if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory != 0 { bFlush = libc.Bool32((*VdbeSorter)(unsafe.Pointer(pSorter)).FiMemory != 0 && (*VdbeSorter)(unsafe.Pointer(pSorter)).FiMemory+nReq > (*VdbeSorter)(unsafe.Pointer(pSorter)).FmxPmaSize) } else { bFlush = libc.Bool32((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FszPMA > (*VdbeSorter)(unsafe.Pointer(pSorter)).FmxPmaSize || (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FszPMA > (*VdbeSorter)(unsafe.Pointer(pSorter)).FmnPmaSize && Xsqlite3HeapNearlyFull(tls) != 0) } if bFlush != 0 { rc = vdbeSorterFlushPMA(tls, pSorter) (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FszPMA = 0 (*VdbeSorter)(unsafe.Pointer(pSorter)).FiMemory = 0 } } *(*int32)(unsafe.Pointer(pSorter + 56 + 16)) += nPMA if nPMA > (*VdbeSorter)(unsafe.Pointer(pSorter)).FmxKeysize { (*VdbeSorter)(unsafe.Pointer(pSorter)).FmxKeysize = nPMA } if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory != 0 { var nMin int32 = (*VdbeSorter)(unsafe.Pointer(pSorter)).FiMemory + nReq if nMin > (*VdbeSorter)(unsafe.Pointer(pSorter)).FnMemory { var aNew uintptr var nNew Sqlite3_int64 = int64(2) * Sqlite3_int64((*VdbeSorter)(unsafe.Pointer(pSorter)).FnMemory) var iListOff int32 = -1 if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList != 0 { iListOff = int32((int64((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList) - int64((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory)) / 1) } for nNew < Sqlite3_int64(nMin) { nNew = nNew * int64(2) } if nNew > Sqlite3_int64((*VdbeSorter)(unsafe.Pointer(pSorter)).FmxPmaSize) { nNew = Sqlite3_int64((*VdbeSorter)(unsafe.Pointer(pSorter)).FmxPmaSize) } if nNew < Sqlite3_int64(nMin) { nNew = Sqlite3_int64(nMin) } aNew = Xsqlite3Realloc(tls, (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory, uint64(nNew)) if !(aNew != 0) { return SQLITE_NOMEM } if iListOff >= 0 { (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList = aNew + uintptr(iListOff) } (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory = aNew (*VdbeSorter)(unsafe.Pointer(pSorter)).FnMemory = int32(nNew) } pNew = (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory + uintptr((*VdbeSorter)(unsafe.Pointer(pSorter)).FiMemory) *(*int32)(unsafe.Pointer(pSorter + 80)) += (nReq + 7) & libc.CplInt32(7) if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList != 0 { *(*int32)(unsafe.Pointer(pNew + 8)) = int32((int64((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList) - int64((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory)) / 1) } } else { pNew = Xsqlite3Malloc(tls, uint64(nReq)) if pNew == uintptr(0) { return SQLITE_NOMEM } *(*uintptr)(unsafe.Pointer(pNew + 8)) = (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList } libc.Xmemcpy(tls, pNew+uintptr(1)*16, (*Mem)(unsafe.Pointer(pVal)).Fz, uint64((*Mem)(unsafe.Pointer(pVal)).Fn)) (*SorterRecord)(unsafe.Pointer(pNew)).FnVal = (*Mem)(unsafe.Pointer(pVal)).Fn (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList = pNew return rc } func vdbeIncrPopulate(tls *libc.TLS, pIncr uintptr) int32 { bp := tls.Alloc(52) defer tls.Free(52) var rc int32 = SQLITE_OK var rc2 int32 var iStart I64 = (*IncrMerger)(unsafe.Pointer(pIncr)).FiStartOff var pOut uintptr = pIncr + 40 + 1*16 var pTask uintptr = (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask var pMerger uintptr = (*IncrMerger)(unsafe.Pointer(pIncr)).FpMerger vdbePmaWriterInit(tls, (*SorterFile)(unsafe.Pointer(pOut)).FpFd, bp, (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).Fpgsz, iStart) for rc == SQLITE_OK { var pReader uintptr = (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr + uintptr(*(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + 1*4)))*80 var nKey int32 = (*PmaReader)(unsafe.Pointer(pReader)).FnKey var iEof I64 = (*PmaWriter)(unsafe.Pointer(bp)).FiWriteOff + I64((*PmaWriter)(unsafe.Pointer(bp)).FiBufEnd) if (*PmaReader)(unsafe.Pointer(pReader)).FpFd == uintptr(0) { break } if iEof+I64(nKey)+I64(Xsqlite3VarintLen(tls, uint64(nKey))) > iStart+I64((*IncrMerger)(unsafe.Pointer(pIncr)).FmxSz) { break } vdbePmaWriteVarint(tls, bp, uint64(nKey)) vdbePmaWriteBlob(tls, bp, (*PmaReader)(unsafe.Pointer(pReader)).FaKey, nKey) rc = vdbeMergeEngineStep(tls, (*IncrMerger)(unsafe.Pointer(pIncr)).FpMerger, bp+48) } rc2 = vdbePmaWriterFinish(tls, bp, pOut+8) if rc == SQLITE_OK { rc = rc2 } return rc } func vdbeIncrPopulateThread(tls *libc.TLS, pCtx uintptr) uintptr { var pIncr uintptr = pCtx var pRet uintptr = uintptr(int64(vdbeIncrPopulate(tls, pIncr))) (*SortSubtask)(unsafe.Pointer((*IncrMerger)(unsafe.Pointer(pIncr)).FpTask)).FbDone = 1 return pRet } func vdbeIncrBgPopulate(tls *libc.TLS, pIncr uintptr) int32 { var p uintptr = pIncr return vdbeSorterCreateThread(tls, (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) uintptr }{vdbeIncrPopulateThread})), p) } func vdbeIncrSwap(tls *libc.TLS, pIncr uintptr) int32 { var rc int32 = SQLITE_OK if (*IncrMerger)(unsafe.Pointer(pIncr)).FbUseThread != 0 { rc = vdbeSorterJoinThread(tls, (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask) if rc == SQLITE_OK { var f0 = *(*SorterFile)(unsafe.Pointer(pIncr + 40)) *(*SorterFile)(unsafe.Pointer(pIncr + 40)) = *(*SorterFile)(unsafe.Pointer(pIncr + 40 + 1*16)) *(*SorterFile)(unsafe.Pointer(pIncr + 40 + 1*16)) = f0 } if rc == SQLITE_OK { if (*SorterFile)(unsafe.Pointer(pIncr+40)).FiEof == (*IncrMerger)(unsafe.Pointer(pIncr)).FiStartOff { (*IncrMerger)(unsafe.Pointer(pIncr)).FbEof = 1 } else { rc = vdbeIncrBgPopulate(tls, pIncr) } } } else { rc = vdbeIncrPopulate(tls, pIncr) *(*SorterFile)(unsafe.Pointer(pIncr + 40)) = *(*SorterFile)(unsafe.Pointer(pIncr + 40 + 1*16)) if (*SorterFile)(unsafe.Pointer(pIncr+40)).FiEof == (*IncrMerger)(unsafe.Pointer(pIncr)).FiStartOff { (*IncrMerger)(unsafe.Pointer(pIncr)).FbEof = 1 } } return rc } func vdbeIncrMergerNew(tls *libc.TLS, pTask uintptr, pMerger uintptr, ppOut uintptr) int32 { var rc int32 = SQLITE_OK var pIncr uintptr = libc.AssignPtrUintptr(ppOut, func() uintptr { if Xsqlite3FaultSim(tls, 100) != 0 { return uintptr(0) } return Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(IncrMerger{}))) }()) if pIncr != 0 { (*IncrMerger)(unsafe.Pointer(pIncr)).FpMerger = pMerger (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask = pTask (*IncrMerger)(unsafe.Pointer(pIncr)).FmxSz = func() int32 { if (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FmxKeysize+9 > (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FmxPmaSize/2 { return (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FmxKeysize + 9 } return (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).FmxPmaSize / 2 }() *(*I64)(unsafe.Pointer(pTask + 88 + 8)) += I64((*IncrMerger)(unsafe.Pointer(pIncr)).FmxSz) } else { vdbeMergeEngineFree(tls, pMerger) rc = SQLITE_NOMEM } return rc } func vdbeIncrMergerSetThreads(tls *libc.TLS, pIncr uintptr) { (*IncrMerger)(unsafe.Pointer(pIncr)).FbUseThread = 1 *(*I64)(unsafe.Pointer((*IncrMerger)(unsafe.Pointer(pIncr)).FpTask + 88 + 8)) -= I64((*IncrMerger)(unsafe.Pointer(pIncr)).FmxSz) } func vdbeMergeEngineCompare(tls *libc.TLS, pMerger uintptr, iOut int32) { bp := tls.Alloc(4) defer tls.Free(4) var i1 int32 var i2 int32 var iRes int32 var p1 uintptr var p2 uintptr if iOut >= (*MergeEngine)(unsafe.Pointer(pMerger)).FnTree/2 { i1 = (iOut - (*MergeEngine)(unsafe.Pointer(pMerger)).FnTree/2) * 2 i2 = i1 + 1 } else { i1 = *(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + uintptr(iOut*2)*4)) i2 = *(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + uintptr(iOut*2+1)*4)) } p1 = (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr + uintptr(i1)*80 p2 = (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr + uintptr(i2)*80 if (*PmaReader)(unsafe.Pointer(p1)).FpFd == uintptr(0) { iRes = i2 } else if (*PmaReader)(unsafe.Pointer(p2)).FpFd == uintptr(0) { iRes = i1 } else { var pTask uintptr = (*MergeEngine)(unsafe.Pointer(pMerger)).FpTask *(*int32)(unsafe.Pointer(bp)) = 0 var res int32 res = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SortSubtask)(unsafe.Pointer(pTask)).FxCompare})).f(tls, pTask, bp, (*PmaReader)(unsafe.Pointer(p1)).FaKey, (*PmaReader)(unsafe.Pointer(p1)).FnKey, (*PmaReader)(unsafe.Pointer(p2)).FaKey, (*PmaReader)(unsafe.Pointer(p2)).FnKey) if res <= 0 { iRes = i1 } else { iRes = i2 } } *(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(pMerger)).FaTree + uintptr(iOut)*4)) = iRes } func vdbeMergeEngineInit(tls *libc.TLS, pTask uintptr, pMerger uintptr, eMode int32) int32 { var rc int32 = SQLITE_OK var i int32 var nTree int32 (*MergeEngine)(unsafe.Pointer(pMerger)).FpTask = pTask nTree = (*MergeEngine)(unsafe.Pointer(pMerger)).FnTree for i = 0; i < nTree; i++ { if SQLITE_MAX_WORKER_THREADS > 0 && eMode == INCRINIT_ROOT { rc = vdbePmaReaderNext(tls, (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr+uintptr(nTree-i-1)*80) } else { rc = vdbePmaReaderIncrInit(tls, (*MergeEngine)(unsafe.Pointer(pMerger)).FaReadr+uintptr(i)*80, INCRINIT_NORMAL) } if rc != SQLITE_OK { return rc } } for i = (*MergeEngine)(unsafe.Pointer(pMerger)).FnTree - 1; i > 0; i-- { vdbeMergeEngineCompare(tls, pMerger, i) } return int32((*UnpackedRecord)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpUnpacked)).FerrCode) } func vdbePmaReaderIncrMergeInit(tls *libc.TLS, pReadr uintptr, eMode int32) int32 { var rc int32 = SQLITE_OK var pIncr uintptr = (*PmaReader)(unsafe.Pointer(pReadr)).FpIncr var pTask uintptr = (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask var db uintptr = (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask)).FpSorter)).Fdb rc = vdbeMergeEngineInit(tls, pTask, (*IncrMerger)(unsafe.Pointer(pIncr)).FpMerger, eMode) if rc == SQLITE_OK { var mxSz int32 = (*IncrMerger)(unsafe.Pointer(pIncr)).FmxSz if (*IncrMerger)(unsafe.Pointer(pIncr)).FbUseThread != 0 { rc = vdbeSorterOpenTempFile(tls, db, int64(mxSz), pIncr+40) if rc == SQLITE_OK { rc = vdbeSorterOpenTempFile(tls, db, int64(mxSz), pIncr+40+1*16) } } else { if (*SortSubtask)(unsafe.Pointer(pTask)).Ffile2.FpFd == uintptr(0) { rc = vdbeSorterOpenTempFile(tls, db, (*SortSubtask)(unsafe.Pointer(pTask)).Ffile2.FiEof, pTask+88) (*SortSubtask)(unsafe.Pointer(pTask)).Ffile2.FiEof = int64(0) } if rc == SQLITE_OK { (*SorterFile)(unsafe.Pointer(pIncr + 40 + 1*16)).FpFd = (*SortSubtask)(unsafe.Pointer(pTask)).Ffile2.FpFd (*IncrMerger)(unsafe.Pointer(pIncr)).FiStartOff = (*SortSubtask)(unsafe.Pointer(pTask)).Ffile2.FiEof *(*I64)(unsafe.Pointer(pTask + 88 + 8)) += I64(mxSz) } } } if rc == SQLITE_OK && (*IncrMerger)(unsafe.Pointer(pIncr)).FbUseThread != 0 { rc = vdbeIncrPopulate(tls, pIncr) } if rc == SQLITE_OK && (SQLITE_MAX_WORKER_THREADS == 0 || eMode != INCRINIT_TASK) { rc = vdbePmaReaderNext(tls, pReadr) } return rc } func vdbePmaReaderBgIncrInit(tls *libc.TLS, pCtx uintptr) uintptr { var pReader uintptr = pCtx var pRet uintptr = uintptr(int64(vdbePmaReaderIncrMergeInit(tls, pReader, INCRINIT_TASK))) (*SortSubtask)(unsafe.Pointer((*IncrMerger)(unsafe.Pointer((*PmaReader)(unsafe.Pointer(pReader)).FpIncr)).FpTask)).FbDone = 1 return pRet } func vdbePmaReaderIncrInit(tls *libc.TLS, pReadr uintptr, eMode int32) int32 { var pIncr uintptr = (*PmaReader)(unsafe.Pointer(pReadr)).FpIncr var rc int32 = SQLITE_OK if pIncr != 0 { if (*IncrMerger)(unsafe.Pointer(pIncr)).FbUseThread != 0 { var pCtx uintptr = pReadr rc = vdbeSorterCreateThread(tls, (*IncrMerger)(unsafe.Pointer(pIncr)).FpTask, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) uintptr }{vdbePmaReaderBgIncrInit})), pCtx) } else { rc = vdbePmaReaderIncrMergeInit(tls, pReadr, eMode) } } return rc } func vdbeMergeEngineLevel0(tls *libc.TLS, pTask uintptr, nPMA int32, piOffset uintptr, ppOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pNew uintptr var iOff I64 = *(*I64)(unsafe.Pointer(piOffset)) var i int32 var rc int32 = SQLITE_OK *(*uintptr)(unsafe.Pointer(ppOut)) = libc.AssignUintptr(&pNew, vdbeMergeEngineNew(tls, nPMA)) if pNew == uintptr(0) { rc = SQLITE_NOMEM } for i = 0; i < nPMA && rc == SQLITE_OK; i++ { *(*I64)(unsafe.Pointer(bp)) = int64(0) var pReadr uintptr = (*MergeEngine)(unsafe.Pointer(pNew)).FaReadr + uintptr(i)*80 rc = vdbePmaReaderInit(tls, pTask, pTask+72, iOff, pReadr, bp) iOff = (*PmaReader)(unsafe.Pointer(pReadr)).FiEof } if rc != SQLITE_OK { vdbeMergeEngineFree(tls, pNew) *(*uintptr)(unsafe.Pointer(ppOut)) = uintptr(0) } *(*I64)(unsafe.Pointer(piOffset)) = iOff return rc } func vdbeSorterTreeDepth(tls *libc.TLS, nPMA int32) int32 { var nDepth int32 = 0 var nDiv I64 = int64(SORTER_MAX_MERGE_COUNT) for nDiv < I64(nPMA) { nDiv = nDiv * int64(SORTER_MAX_MERGE_COUNT) nDepth++ } return nDepth } func vdbeSorterAddToTree(tls *libc.TLS, pTask uintptr, nDepth int32, iSeq int32, pRoot uintptr, pLeaf uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var nDiv int32 = 1 var i int32 var p uintptr = pRoot rc = vdbeIncrMergerNew(tls, pTask, pLeaf, bp) for i = 1; i < nDepth; i++ { nDiv = nDiv * SORTER_MAX_MERGE_COUNT } for i = 1; i < nDepth && rc == SQLITE_OK; i++ { var iIter int32 = iSeq / nDiv % SORTER_MAX_MERGE_COUNT var pReadr uintptr = (*MergeEngine)(unsafe.Pointer(p)).FaReadr + uintptr(iIter)*80 if (*PmaReader)(unsafe.Pointer(pReadr)).FpIncr == uintptr(0) { var pNew uintptr = vdbeMergeEngineNew(tls, SORTER_MAX_MERGE_COUNT) if pNew == uintptr(0) { rc = SQLITE_NOMEM } else { rc = vdbeIncrMergerNew(tls, pTask, pNew, pReadr+72) } } if rc == SQLITE_OK { p = (*IncrMerger)(unsafe.Pointer((*PmaReader)(unsafe.Pointer(pReadr)).FpIncr)).FpMerger nDiv = nDiv / SORTER_MAX_MERGE_COUNT } } if rc == SQLITE_OK { (*PmaReader)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(p)).FaReadr + uintptr(iSeq%SORTER_MAX_MERGE_COUNT)*80)).FpIncr = *(*uintptr)(unsafe.Pointer(bp)) } else { vdbeIncrFree(tls, *(*uintptr)(unsafe.Pointer(bp))) } return rc } func vdbeSorterMergeTreeBuild(tls *libc.TLS, pSorter uintptr, ppOut uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var pMain uintptr = uintptr(0) var rc int32 = SQLITE_OK var iTask int32 if int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask) > 1 { pMain = vdbeMergeEngineNew(tls, int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask)) if pMain == uintptr(0) { rc = SQLITE_NOMEM } } for iTask = 0; rc == SQLITE_OK && iTask < int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask); iTask++ { var pTask uintptr = pSorter + 96 + uintptr(iTask)*104 if SQLITE_MAX_WORKER_THREADS == 0 || (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA != 0 { *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var nDepth int32 = vdbeSorterTreeDepth(tls, (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA) *(*I64)(unsafe.Pointer(bp)) = int64(0) if (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA <= SORTER_MAX_MERGE_COUNT { rc = vdbeMergeEngineLevel0(tls, pTask, (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA, bp, bp+8) } else { var i int32 var iSeq int32 = 0 *(*uintptr)(unsafe.Pointer(bp + 8)) = vdbeMergeEngineNew(tls, SORTER_MAX_MERGE_COUNT) if *(*uintptr)(unsafe.Pointer(bp + 8)) == uintptr(0) { rc = SQLITE_NOMEM } for i = 0; i < (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA && rc == SQLITE_OK; i = i + SORTER_MAX_MERGE_COUNT { *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var nReader int32 nReader = func() int32 { if (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA-i < SORTER_MAX_MERGE_COUNT { return (*SortSubtask)(unsafe.Pointer(pTask)).FnPMA - i } return SORTER_MAX_MERGE_COUNT }() rc = vdbeMergeEngineLevel0(tls, pTask, nReader, bp, bp+16) if rc == SQLITE_OK { rc = vdbeSorterAddToTree(tls, pTask, nDepth, libc.PostIncInt32(&iSeq, 1), *(*uintptr)(unsafe.Pointer(bp + 8)), *(*uintptr)(unsafe.Pointer(bp + 16))) } } } if rc == SQLITE_OK { if pMain != uintptr(0) { rc = vdbeIncrMergerNew(tls, pTask, *(*uintptr)(unsafe.Pointer(bp + 8)), (*MergeEngine)(unsafe.Pointer(pMain)).FaReadr+uintptr(iTask)*80+72) } else { pMain = *(*uintptr)(unsafe.Pointer(bp + 8)) } } else { vdbeMergeEngineFree(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } } } if rc != SQLITE_OK { vdbeMergeEngineFree(tls, pMain) pMain = uintptr(0) } *(*uintptr)(unsafe.Pointer(ppOut)) = pMain return rc } func vdbeSorterSetupMerge(tls *libc.TLS, pSorter uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var pTask0 uintptr = pSorter + 96 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var db uintptr = (*VdbeSorter)(unsafe.Pointer((*SortSubtask)(unsafe.Pointer(pTask0)).FpSorter)).Fdb var i int32 var xCompare SorterCompare = vdbeSorterGetCompare(tls, pSorter) for i = 0; i < int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask); i++ { (*SortSubtask)(unsafe.Pointer(pSorter + 96 + uintptr(i)*104)).FxCompare = xCompare } rc = vdbeSorterMergeTreeBuild(tls, pSorter, bp) if rc == SQLITE_OK { if (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUseThreads != 0 { var iTask int32 var pReadr uintptr = uintptr(0) var pLast uintptr = pSorter + 96 + uintptr(int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask)-1)*104 rc = vdbeSortAllocUnpacked(tls, pLast) if rc == SQLITE_OK { pReadr = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(PmaReader{}))) (*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader = pReadr if pReadr == uintptr(0) { rc = SQLITE_NOMEM } } if rc == SQLITE_OK { rc = vdbeIncrMergerNew(tls, pLast, *(*uintptr)(unsafe.Pointer(bp)), pReadr+72) if rc == SQLITE_OK { vdbeIncrMergerSetThreads(tls, (*PmaReader)(unsafe.Pointer(pReadr)).FpIncr) for iTask = 0; iTask < int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask)-1; iTask++ { var pIncr uintptr if libc.AssignUintptr(&pIncr, (*PmaReader)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaReadr+uintptr(iTask)*80)).FpIncr) != 0 { vdbeIncrMergerSetThreads(tls, pIncr) } } for iTask = 0; rc == SQLITE_OK && iTask < int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FnTask); iTask++ { var p uintptr = (*MergeEngine)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaReadr + uintptr(iTask)*80 rc = vdbePmaReaderIncrInit(tls, p, INCRINIT_TASK) } } *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) } if rc == SQLITE_OK { rc = vdbePmaReaderIncrMergeInit(tls, pReadr, INCRINIT_ROOT) } } else { rc = vdbeMergeEngineInit(tls, pTask0, *(*uintptr)(unsafe.Pointer(bp)), INCRINIT_NORMAL) (*VdbeSorter)(unsafe.Pointer(pSorter)).FpMerger = *(*uintptr)(unsafe.Pointer(bp)) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) } } if rc != SQLITE_OK { vdbeMergeEngineFree(tls, *(*uintptr)(unsafe.Pointer(bp))) } return rc } // Once the sorter has been populated by calls to sqlite3VdbeSorterWrite, // this function is called to prepare for iterating through the records // in sorted order. func Xsqlite3VdbeSorterRewind(tls *libc.TLS, pCsr uintptr, pbEof uintptr) int32 { var pSorter uintptr var rc int32 = SQLITE_OK pSorter = *(*uintptr)(unsafe.Pointer(pCsr + 48)) if int32((*VdbeSorter)(unsafe.Pointer(pSorter)).FbUsePMA) == 0 { if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList != 0 { *(*int32)(unsafe.Pointer(pbEof)) = 0 rc = vdbeSorterSort(tls, pSorter+96, pSorter+56) } else { *(*int32)(unsafe.Pointer(pbEof)) = 1 } return rc } rc = vdbeSorterFlushPMA(tls, pSorter) rc = vdbeSorterJoinAll(tls, pSorter, rc) if rc == SQLITE_OK { rc = vdbeSorterSetupMerge(tls, pSorter) *(*int32)(unsafe.Pointer(pbEof)) = 0 } return rc } // Advance to the next element in the sorter. Return value: // // SQLITE_OK success // SQLITE_DONE end of data // otherwise some kind of error. func Xsqlite3VdbeSorterNext(tls *libc.TLS, db uintptr, pCsr uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pSorter uintptr var rc int32 pSorter = *(*uintptr)(unsafe.Pointer(pCsr + 48)) if (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUsePMA != 0 { if (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUseThreads != 0 { rc = vdbePmaReaderNext(tls, (*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader) if rc == SQLITE_OK && (*PmaReader)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader)).FpFd == uintptr(0) { rc = SQLITE_DONE } } else { *(*int32)(unsafe.Pointer(bp)) = 0 rc = vdbeMergeEngineStep(tls, (*VdbeSorter)(unsafe.Pointer(pSorter)).FpMerger, bp) if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp)) != 0 { rc = SQLITE_DONE } } } else { var pFree uintptr = (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList = *(*uintptr)(unsafe.Pointer(pFree + 8)) *(*uintptr)(unsafe.Pointer(pFree + 8)) = uintptr(0) if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FaMemory == uintptr(0) { vdbeSorterRecordFree(tls, db, pFree) } if (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList != 0 { rc = SQLITE_OK } else { rc = SQLITE_DONE } } return rc } func vdbeSorterRowkey(tls *libc.TLS, pSorter uintptr, pnKey uintptr) uintptr { var pKey uintptr if (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUsePMA != 0 { var pReader uintptr if (*VdbeSorter)(unsafe.Pointer(pSorter)).FbUseThreads != 0 { pReader = (*VdbeSorter)(unsafe.Pointer(pSorter)).FpReader } else { pReader = (*MergeEngine)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer(pSorter)).FpMerger)).FaReadr + uintptr(*(*int32)(unsafe.Pointer((*MergeEngine)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer(pSorter)).FpMerger)).FaTree + 1*4)))*80 } *(*int32)(unsafe.Pointer(pnKey)) = (*PmaReader)(unsafe.Pointer(pReader)).FnKey pKey = (*PmaReader)(unsafe.Pointer(pReader)).FaKey } else { *(*int32)(unsafe.Pointer(pnKey)) = (*SorterRecord)(unsafe.Pointer((*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList)).FnVal pKey = (*VdbeSorter)(unsafe.Pointer(pSorter)).Flist.FpList + uintptr(1)*16 } return pKey } // Copy the current sorter key into the memory cell pOut. func Xsqlite3VdbeSorterRowkey(tls *libc.TLS, pCsr uintptr, pOut uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pSorter uintptr var pKey uintptr pSorter = *(*uintptr)(unsafe.Pointer(pCsr + 48)) pKey = vdbeSorterRowkey(tls, pSorter, bp) if Xsqlite3VdbeMemClearAndResize(tls, pOut, *(*int32)(unsafe.Pointer(bp))) != 0 { return SQLITE_NOMEM } (*Mem)(unsafe.Pointer(pOut)).Fn = *(*int32)(unsafe.Pointer(bp)) (*Mem)(unsafe.Pointer(pOut)).Fflags = U16(int32((*Mem)(unsafe.Pointer(pOut)).Fflags)&libc.CplInt32(MEM_TypeMask|MEM_Zero) | MEM_Blob) libc.Xmemcpy(tls, (*Mem)(unsafe.Pointer(pOut)).Fz, pKey, uint64(*(*int32)(unsafe.Pointer(bp)))) return SQLITE_OK } // Compare the key in memory cell pVal with the key that the sorter cursor // passed as the first argument currently points to. For the purposes of // the comparison, ignore the rowid field at the end of each record. // // If the sorter cursor key contains any NULL values, consider it to be // less than pVal. Even if pVal also contains NULL values. // // If an error occurs, return an SQLite error code (i.e. SQLITE_NOMEM). // Otherwise, set *pRes to a negative, zero or positive value if the // key in pVal is smaller than, equal to or larger than the current sorter // key. // // This routine forms the core of the OP_SorterCompare opcode, which in // turn is used to verify uniqueness when constructing a UNIQUE INDEX. func Xsqlite3VdbeSorterCompare(tls *libc.TLS, pCsr uintptr, pVal uintptr, nKeyCol int32, pRes uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pSorter uintptr var r2 uintptr var pKeyInfo uintptr var i int32 var pKey uintptr pSorter = *(*uintptr)(unsafe.Pointer(pCsr + 48)) r2 = (*VdbeSorter)(unsafe.Pointer(pSorter)).FpUnpacked pKeyInfo = (*VdbeCursor)(unsafe.Pointer(pCsr)).FpKeyInfo if r2 == uintptr(0) { r2 = libc.AssignPtrUintptr(pSorter+48, Xsqlite3VdbeAllocUnpackedRecord(tls, pKeyInfo)) if r2 == uintptr(0) { return SQLITE_NOMEM } (*UnpackedRecord)(unsafe.Pointer(r2)).FnField = U16(nKeyCol) } pKey = vdbeSorterRowkey(tls, pSorter, bp) Xsqlite3VdbeRecordUnpack(tls, pKeyInfo, *(*int32)(unsafe.Pointer(bp)), pKey, r2) for i = 0; i < nKeyCol; i++ { if int32((*Mem)(unsafe.Pointer((*UnpackedRecord)(unsafe.Pointer(r2)).FaMem+uintptr(i)*56)).Fflags)&MEM_Null != 0 { *(*int32)(unsafe.Pointer(pRes)) = -1 return SQLITE_OK } } *(*int32)(unsafe.Pointer(pRes)) = Xsqlite3VdbeRecordCompare(tls, (*Mem)(unsafe.Pointer(pVal)).Fn, (*Mem)(unsafe.Pointer(pVal)).Fz, r2) return SQLITE_OK } // Forward references to internal structures type MemJournal1 = struct { FpMethod uintptr FnChunkSize int32 FnSpill int32 FpFirst uintptr Fendpoint FilePoint Freadpoint FilePoint Fflags int32 F__ccgo_pad1 [4]byte FpVfs uintptr FzJournal uintptr } // Forward references to internal structures type MemJournal = MemJournal1 type FilePoint1 = struct { FiOffset Sqlite3_int64 FpChunk uintptr } type FilePoint = FilePoint1 type FileChunk1 = struct { FpNext uintptr FzChunk [8]U8 } type FileChunk = FileChunk1 func memjrnlRead(tls *libc.TLS, pJfd uintptr, zBuf uintptr, iAmt int32, iOfst Sqlite_int64) int32 { var p uintptr = pJfd var zOut uintptr = zBuf var nRead int32 = iAmt var iChunkOffset int32 var pChunk uintptr if Sqlite_int64(iAmt)+iOfst > (*MemJournal)(unsafe.Pointer(p)).Fendpoint.FiOffset { return SQLITE_IOERR | int32(2)<<8 } if (*MemJournal)(unsafe.Pointer(p)).Freadpoint.FiOffset != iOfst || iOfst == int64(0) { var iOff Sqlite3_int64 = int64(0) for pChunk = (*MemJournal)(unsafe.Pointer(p)).FpFirst; pChunk != 0 && iOff+Sqlite3_int64((*MemJournal)(unsafe.Pointer(p)).FnChunkSize) <= iOfst; pChunk = (*FileChunk)(unsafe.Pointer(pChunk)).FpNext { iOff = iOff + Sqlite3_int64((*MemJournal)(unsafe.Pointer(p)).FnChunkSize) } } else { pChunk = (*MemJournal)(unsafe.Pointer(p)).Freadpoint.FpChunk } iChunkOffset = int32(iOfst % Sqlite_int64((*MemJournal)(unsafe.Pointer(p)).FnChunkSize)) for __ccgo := true; __ccgo; __ccgo = nRead >= 0 && libc.AssignUintptr(&pChunk, (*FileChunk)(unsafe.Pointer(pChunk)).FpNext) != uintptr(0) && nRead > 0 { var iSpace int32 = (*MemJournal)(unsafe.Pointer(p)).FnChunkSize - iChunkOffset var nCopy int32 = func() int32 { if nRead < (*MemJournal)(unsafe.Pointer(p)).FnChunkSize-iChunkOffset { return nRead } return (*MemJournal)(unsafe.Pointer(p)).FnChunkSize - iChunkOffset }() libc.Xmemcpy(tls, zOut, pChunk+8+uintptr(iChunkOffset), uint64(nCopy)) zOut += uintptr(nCopy) nRead = nRead - iSpace iChunkOffset = 0 } (*MemJournal)(unsafe.Pointer(p)).Freadpoint.FiOffset = func() int64 { if pChunk != 0 { return iOfst + Sqlite_int64(iAmt) } return int64(0) }() (*MemJournal)(unsafe.Pointer(p)).Freadpoint.FpChunk = pChunk return SQLITE_OK } func memjrnlFreeChunks(tls *libc.TLS, pFirst uintptr) { var pIter uintptr var pNext uintptr for pIter = pFirst; pIter != 0; pIter = pNext { pNext = (*FileChunk)(unsafe.Pointer(pIter)).FpNext Xsqlite3_free(tls, pIter) } } func memjrnlCreateFile(tls *libc.TLS, p uintptr) int32 { var rc int32 var pReal uintptr = p var copy = *(*MemJournal)(unsafe.Pointer(p)) libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(MemJournal{}))) rc = Xsqlite3OsOpen(tls, copy.FpVfs, copy.FzJournal, pReal, copy.Fflags, uintptr(0)) if rc == SQLITE_OK { var nChunk int32 = copy.FnChunkSize var iOff I64 = int64(0) var pIter uintptr for pIter = copy.FpFirst; pIter != 0; pIter = (*FileChunk)(unsafe.Pointer(pIter)).FpNext { if iOff+I64(nChunk) > copy.Fendpoint.FiOffset { nChunk = int32(copy.Fendpoint.FiOffset - iOff) } rc = Xsqlite3OsWrite(tls, pReal, pIter+8, nChunk, iOff) if rc != 0 { break } iOff = iOff + I64(nChunk) } if rc == SQLITE_OK { memjrnlFreeChunks(tls, copy.FpFirst) } } if rc != SQLITE_OK { Xsqlite3OsClose(tls, pReal) *(*MemJournal)(unsafe.Pointer(p)) = copy } return rc } func memjrnlWrite(tls *libc.TLS, pJfd uintptr, zBuf uintptr, iAmt int32, iOfst Sqlite_int64) int32 { var p uintptr = pJfd var nWrite int32 = iAmt var zWrite uintptr = zBuf if (*MemJournal)(unsafe.Pointer(p)).FnSpill > 0 && Sqlite_int64(iAmt)+iOfst > Sqlite_int64((*MemJournal)(unsafe.Pointer(p)).FnSpill) { var rc int32 = memjrnlCreateFile(tls, p) if rc == SQLITE_OK { rc = Xsqlite3OsWrite(tls, pJfd, zBuf, iAmt, iOfst) } return rc } else { if iOfst > int64(0) && iOfst != (*MemJournal)(unsafe.Pointer(p)).Fendpoint.FiOffset { memjrnlTruncate(tls, pJfd, iOfst) } if iOfst == int64(0) && (*MemJournal)(unsafe.Pointer(p)).FpFirst != 0 { libc.Xmemcpy(tls, (*MemJournal)(unsafe.Pointer(p)).FpFirst+8, zBuf, uint64(iAmt)) } else { for nWrite > 0 { var pChunk uintptr = (*MemJournal)(unsafe.Pointer(p)).Fendpoint.FpChunk var iChunkOffset int32 = int32((*MemJournal)(unsafe.Pointer(p)).Fendpoint.FiOffset % Sqlite3_int64((*MemJournal)(unsafe.Pointer(p)).FnChunkSize)) var iSpace int32 = func() int32 { if nWrite < (*MemJournal)(unsafe.Pointer(p)).FnChunkSize-iChunkOffset { return nWrite } return (*MemJournal)(unsafe.Pointer(p)).FnChunkSize - iChunkOffset }() if iChunkOffset == 0 { var pNew uintptr = Xsqlite3_malloc(tls, int32(uint64(unsafe.Sizeof(FileChunk{}))+uint64((*MemJournal)(unsafe.Pointer(p)).FnChunkSize-8))) if !(pNew != 0) { return SQLITE_IOERR | int32(12)<<8 } (*FileChunk)(unsafe.Pointer(pNew)).FpNext = uintptr(0) if pChunk != 0 { (*FileChunk)(unsafe.Pointer(pChunk)).FpNext = pNew } else { (*MemJournal)(unsafe.Pointer(p)).FpFirst = pNew } pChunk = libc.AssignPtrUintptr(p+24+8, pNew) } libc.Xmemcpy(tls, pChunk+8+uintptr(iChunkOffset), zWrite, uint64(iSpace)) zWrite += uintptr(iSpace) nWrite = nWrite - iSpace *(*Sqlite3_int64)(unsafe.Pointer(p + 24)) += Sqlite3_int64(iSpace) } } } return SQLITE_OK } func memjrnlTruncate(tls *libc.TLS, pJfd uintptr, size Sqlite_int64) int32 { var p uintptr = pJfd if size < (*MemJournal)(unsafe.Pointer(p)).Fendpoint.FiOffset { var pIter uintptr = uintptr(0) if size == int64(0) { memjrnlFreeChunks(tls, (*MemJournal)(unsafe.Pointer(p)).FpFirst) (*MemJournal)(unsafe.Pointer(p)).FpFirst = uintptr(0) } else { var iOff I64 = I64((*MemJournal)(unsafe.Pointer(p)).FnChunkSize) for pIter = (*MemJournal)(unsafe.Pointer(p)).FpFirst; pIter != 0 && iOff < size; pIter = (*FileChunk)(unsafe.Pointer(pIter)).FpNext { iOff = iOff + I64((*MemJournal)(unsafe.Pointer(p)).FnChunkSize) } if pIter != 0 { memjrnlFreeChunks(tls, (*FileChunk)(unsafe.Pointer(pIter)).FpNext) (*FileChunk)(unsafe.Pointer(pIter)).FpNext = uintptr(0) } } (*MemJournal)(unsafe.Pointer(p)).Fendpoint.FpChunk = pIter (*MemJournal)(unsafe.Pointer(p)).Fendpoint.FiOffset = size (*MemJournal)(unsafe.Pointer(p)).Freadpoint.FpChunk = uintptr(0) (*MemJournal)(unsafe.Pointer(p)).Freadpoint.FiOffset = int64(0) } return SQLITE_OK } func memjrnlClose(tls *libc.TLS, pJfd uintptr) int32 { var p uintptr = pJfd memjrnlFreeChunks(tls, (*MemJournal)(unsafe.Pointer(p)).FpFirst) return SQLITE_OK } func memjrnlSync(tls *libc.TLS, pJfd uintptr, flags int32) int32 { _ = pJfd _ = flags return SQLITE_OK } func memjrnlFileSize(tls *libc.TLS, pJfd uintptr, pSize uintptr) int32 { var p uintptr = pJfd *(*Sqlite_int64)(unsafe.Pointer(pSize)) = (*MemJournal)(unsafe.Pointer(p)).Fendpoint.FiOffset return SQLITE_OK } var sMemJournalMethods = sqlite3_io_methods{ FiVersion: 1, FxClose: 0, FxRead: 0, FxWrite: 0, FxTruncate: 0, FxSync: 0, FxFileSize: 0, } // Open a journal file. // // The behaviour of the journal file depends on the value of parameter // nSpill. If nSpill is 0, then the journal file is always create and // accessed using the underlying VFS. If nSpill is less than zero, then // all content is always stored in main-memory. Finally, if nSpill is a // positive value, then the journal file is initially created in-memory // but may be flushed to disk later on. In this case the journal file is // flushed to disk either when it grows larger than nSpill bytes in size, // or when sqlite3JournalCreate() is called. func Xsqlite3JournalOpen(tls *libc.TLS, pVfs uintptr, zName uintptr, pJfd uintptr, flags int32, nSpill int32) int32 { var p uintptr = pJfd libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(MemJournal{}))) if nSpill == 0 { return Xsqlite3OsOpen(tls, pVfs, zName, pJfd, flags, uintptr(0)) } if nSpill > 0 { (*MemJournal)(unsafe.Pointer(p)).FnChunkSize = nSpill } else { (*MemJournal)(unsafe.Pointer(p)).FnChunkSize = int32(uint64(8+MEMJOURNAL_DFLT_FILECHUNKSIZE) - uint64(unsafe.Sizeof(FileChunk{}))) } (*Sqlite3_file)(unsafe.Pointer(pJfd)).FpMethods = uintptr(unsafe.Pointer(&sMemJournalMethods)) (*MemJournal)(unsafe.Pointer(p)).FnSpill = nSpill (*MemJournal)(unsafe.Pointer(p)).Fflags = flags (*MemJournal)(unsafe.Pointer(p)).FzJournal = zName (*MemJournal)(unsafe.Pointer(p)).FpVfs = pVfs return SQLITE_OK } // Open an in-memory journal file. func Xsqlite3MemJournalOpen(tls *libc.TLS, pJfd uintptr) { Xsqlite3JournalOpen(tls, uintptr(0), uintptr(0), pJfd, 0, -1) } // The file-handle passed as the only argument is open on a journal file. // Return true if this "journal file" is currently stored in heap memory, // or false otherwise. func Xsqlite3JournalIsInMemory(tls *libc.TLS, p uintptr) int32 { return libc.Bool32((*Sqlite3_file)(unsafe.Pointer(p)).FpMethods == uintptr(unsafe.Pointer(&sMemJournalMethods))) } // Return the number of bytes required to store a JournalFile that uses vfs // pVfs to create the underlying on-disk files. func Xsqlite3JournalSize(tls *libc.TLS, pVfs uintptr) int32 { return func() int32 { if (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile > int32(unsafe.Sizeof(MemJournal{})) { return (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FszOsFile } return int32(unsafe.Sizeof(MemJournal{})) }() } func walkWindowList(tls *libc.TLS, pWalker uintptr, pList uintptr, bOneOnly int32) int32 { var pWin uintptr for pWin = pList; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { var rc int32 rc = Xsqlite3WalkExprList(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpOrderBy) if rc != 0 { return WRC_Abort } rc = Xsqlite3WalkExprList(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpPartition) if rc != 0 { return WRC_Abort } rc = Xsqlite3WalkExpr(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpFilter) if rc != 0 { return WRC_Abort } rc = Xsqlite3WalkExpr(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpStart) if rc != 0 { return WRC_Abort } rc = Xsqlite3WalkExpr(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpEnd) if rc != 0 { return WRC_Abort } if bOneOnly != 0 { break } } return WRC_Continue } func walkExpr(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var rc int32 for 1 != 0 { rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Walker)(unsafe.Pointer(pWalker)).FxExprCallback})).f(tls, pWalker, pExpr) if rc != 0 { return rc & WRC_Abort } if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_TokenOnly|EP_Leaf) != U32(0)) { if (*Expr)(unsafe.Pointer(pExpr)).FpLeft != 0 && walkExpr(tls, pWalker, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) != 0 { return WRC_Abort } if (*Expr)(unsafe.Pointer(pExpr)).FpRight != 0 { pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpRight continue } else if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { if Xsqlite3WalkSelect(tls, pWalker, *(*uintptr)(unsafe.Pointer(pExpr + 32))) != 0 { return WRC_Abort } } else { if *(*uintptr)(unsafe.Pointer(pExpr + 32)) != 0 { if Xsqlite3WalkExprList(tls, pWalker, *(*uintptr)(unsafe.Pointer(pExpr + 32))) != 0 { return WRC_Abort } } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { if walkWindowList(tls, pWalker, *(*uintptr)(unsafe.Pointer(pExpr + 64)), 1) != 0 { return WRC_Abort } } } } break } return WRC_Continue } func Xsqlite3WalkExpr(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if pExpr != 0 { return walkExpr(tls, pWalker, pExpr) } return WRC_Continue } // Call sqlite3WalkExpr() for every expression in list p or until // an abort request is seen. func Xsqlite3WalkExprList(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { var i int32 var pItem uintptr if p != 0 { i = (*ExprList)(unsafe.Pointer(p)).FnExpr pItem = p + 8 __1: if !(i > 0) { goto __3 } { if Xsqlite3WalkExpr(tls, pWalker, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr) != 0 { return WRC_Abort } } goto __2 __2: i-- pItem += 32 goto __1 goto __3 __3: } return WRC_Continue } // This is a no-op callback for Walker->xSelectCallback2. If this // callback is set, then the Select->pWinDefn list is traversed. func Xsqlite3WalkWinDefnDummyCallback(tls *libc.TLS, pWalker uintptr, p uintptr) { _ = pWalker _ = p } // Walk all expressions associated with SELECT statement p. Do // not invoke the SELECT callback on p, but do (of course) invoke // any expr callbacks and SELECT callbacks that come from subqueries. // Return WRC_Abort or WRC_Continue. func Xsqlite3WalkSelectExpr(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { if Xsqlite3WalkExprList(tls, pWalker, (*Select)(unsafe.Pointer(p)).FpEList) != 0 { return WRC_Abort } if Xsqlite3WalkExpr(tls, pWalker, (*Select)(unsafe.Pointer(p)).FpWhere) != 0 { return WRC_Abort } if Xsqlite3WalkExprList(tls, pWalker, (*Select)(unsafe.Pointer(p)).FpGroupBy) != 0 { return WRC_Abort } if Xsqlite3WalkExpr(tls, pWalker, (*Select)(unsafe.Pointer(p)).FpHaving) != 0 { return WRC_Abort } if Xsqlite3WalkExprList(tls, pWalker, (*Select)(unsafe.Pointer(p)).FpOrderBy) != 0 { return WRC_Abort } if Xsqlite3WalkExpr(tls, pWalker, (*Select)(unsafe.Pointer(p)).FpLimit) != 0 { return WRC_Abort } if (*Select)(unsafe.Pointer(p)).FpWinDefn != 0 { var pParse uintptr if (*Walker)(unsafe.Pointer(pWalker)).FxSelectCallback2 == *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3WalkWinDefnDummyCallback})) || libc.AssignUintptr(&pParse, (*Walker)(unsafe.Pointer(pWalker)).FpParse) != uintptr(0) && int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME || (*Walker)(unsafe.Pointer(pWalker)).FxSelectCallback2 == *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3SelectPopWith})) { var rc int32 = walkWindowList(tls, pWalker, (*Select)(unsafe.Pointer(p)).FpWinDefn, 0) return rc } } return WRC_Continue } // Walk the parse trees associated with all subqueries in the // FROM clause of SELECT statement p. Do not invoke the select // callback on p, but do invoke it on each FROM clause subquery // and on any subqueries further down in the tree. Return // WRC_Abort or WRC_Continue; func Xsqlite3WalkSelectFrom(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { var pSrc uintptr var i int32 var pItem uintptr pSrc = (*Select)(unsafe.Pointer(p)).FpSrc if pSrc != 0 { i = (*SrcList)(unsafe.Pointer(pSrc)).FnSrc pItem = pSrc + 8 __1: if !(i > 0) { goto __3 } { if (*SrcItem)(unsafe.Pointer(pItem)).FpSelect != 0 && Xsqlite3WalkSelect(tls, pWalker, (*SrcItem)(unsafe.Pointer(pItem)).FpSelect) != 0 { return WRC_Abort } if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x4>>2)) != 0 && Xsqlite3WalkExprList(tls, pWalker, *(*uintptr)(unsafe.Pointer(pItem + 88))) != 0 { return WRC_Abort } } goto __2 __2: i-- pItem += 104 goto __1 goto __3 __3: } return WRC_Continue } // Call sqlite3WalkExpr() for every expression in Select statement p. // Invoke sqlite3WalkSelect() for subqueries in the FROM clause and // on the compound select chain, p->pPrior. // // If it is not NULL, the xSelectCallback() callback is invoked before // the walk of the expressions and FROM clause. The xSelectCallback2() // method is invoked following the walk of the expressions and FROM clause, // but only if both xSelectCallback and xSelectCallback2 are both non-NULL // and if the expressions and FROM clause both return WRC_Continue; // // Return WRC_Continue under normal conditions. Return WRC_Abort if // there is an abort request. // // If the Walker does not have an xSelectCallback() then this routine // is a no-op returning WRC_Continue. func Xsqlite3WalkSelect(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { var rc int32 if p == uintptr(0) { return WRC_Continue } if (*Walker)(unsafe.Pointer(pWalker)).FxSelectCallback == uintptr(0) { return WRC_Continue } for __ccgo := true; __ccgo; __ccgo = p != uintptr(0) { rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Walker)(unsafe.Pointer(pWalker)).FxSelectCallback})).f(tls, pWalker, p) if rc != 0 { return rc & WRC_Abort } if Xsqlite3WalkSelectExpr(tls, pWalker, p) != 0 || Xsqlite3WalkSelectFrom(tls, pWalker, p) != 0 { return WRC_Abort } if (*Walker)(unsafe.Pointer(pWalker)).FxSelectCallback2 != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Walker)(unsafe.Pointer(pWalker)).FxSelectCallback2})).f(tls, pWalker, p) } p = (*Select)(unsafe.Pointer(p)).FpPrior } return WRC_Continue } // Increase the walkerDepth when entering a subquery, and // descrease when leaving the subquery. func Xsqlite3WalkerDepthIncrease(tls *libc.TLS, pWalker uintptr, pSelect uintptr) int32 { _ = pSelect (*Walker)(unsafe.Pointer(pWalker)).FwalkerDepth++ return WRC_Continue } func Xsqlite3WalkerDepthDecrease(tls *libc.TLS, pWalker uintptr, pSelect uintptr) { _ = pSelect (*Walker)(unsafe.Pointer(pWalker)).FwalkerDepth-- } // No-op routine for the parse-tree walker. // // When this routine is the Walker.xExprCallback then expression trees // are walked without any actions being taken at each node. Presumably, // when this routine is used for Walker.xExprCallback then // Walker.xSelectCallback is set to do something useful for every // subquery in the parser tree. func Xsqlite3ExprWalkNoop(tls *libc.TLS, NotUsed uintptr, NotUsed2 uintptr) int32 { _ = NotUsed _ = NotUsed2 return WRC_Continue } // No-op routine for the parse-tree walker for SELECT statements. // subquery in the parser tree. func Xsqlite3SelectWalkNoop(tls *libc.TLS, NotUsed uintptr, NotUsed2 uintptr) int32 { _ = NotUsed _ = NotUsed2 return WRC_Continue } func incrAggDepth(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AGG_FUNCTION { *(*U8)(unsafe.Pointer(pExpr + 2)) += U8(*(*int32)(unsafe.Pointer(pWalker + 40))) } return WRC_Continue } func incrAggFunctionDepth(tls *libc.TLS, pExpr uintptr, N int32) { bp := tls.Alloc(48) defer tls.Free(48) if N > 0 { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{incrAggDepth})) *(*int32)(unsafe.Pointer(bp + 40)) = N Xsqlite3WalkExpr(tls, bp, pExpr) } } func resolveAlias(tls *libc.TLS, pParse uintptr, pEList uintptr, iCol int32, pExpr uintptr, nSubquery int32) { bp := tls.Alloc(72) defer tls.Free(72) var pOrig uintptr var pDup uintptr var db uintptr pOrig = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(iCol)*32)).FpExpr db = (*Parse)(unsafe.Pointer(pParse)).Fdb pDup = Xsqlite3ExprDup(tls, db, pOrig, 0) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3ExprDelete(tls, db, pDup) pDup = uintptr(0) } else { incrAggFunctionDepth(tls, pDup, nSubquery) if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLLATE { pDup = Xsqlite3ExprAddCollateString(tls, pParse, pDup, *(*uintptr)(unsafe.Pointer(pExpr + 8))) } libc.Xmemcpy(tls, bp, pDup, uint64(unsafe.Sizeof(Expr{}))) libc.Xmemcpy(tls, pDup, pExpr, uint64(unsafe.Sizeof(Expr{}))) libc.Xmemcpy(tls, pExpr, bp, uint64(unsafe.Sizeof(Expr{}))) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { if *(*uintptr)(unsafe.Pointer(pExpr + 64)) != uintptr(0) { (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 64)))).FpOwner = pExpr } } Xsqlite3ExprDeferredDelete(tls, pParse, pDup) } } // Subqueries stores the original database, table and column names for their // result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN". // Check to see if the zSpan given to this routine matches the zDb, zTab, // and zCol. If any of zDb, zTab, and zCol are NULL then those fields will // match anything. func Xsqlite3MatchEName(tls *libc.TLS, pItem uintptr, zCol uintptr, zTab uintptr, zDb uintptr) int32 { var n int32 var zSpan uintptr if int32(*(*uint16)(unsafe.Pointer(pItem + 16 + 4))&0x3>>0) != ENAME_TAB { return 0 } zSpan = (*ExprList_item)(unsafe.Pointer(pItem)).FzEName for n = 0; *(*int8)(unsafe.Pointer(zSpan + uintptr(n))) != 0 && int32(*(*int8)(unsafe.Pointer(zSpan + uintptr(n)))) != '.'; n++ { } if zDb != 0 && (Xsqlite3_strnicmp(tls, zSpan, zDb, n) != 0 || int32(*(*int8)(unsafe.Pointer(zDb + uintptr(n)))) != 0) { return 0 } zSpan += uintptr(n + 1) for n = 0; *(*int8)(unsafe.Pointer(zSpan + uintptr(n))) != 0 && int32(*(*int8)(unsafe.Pointer(zSpan + uintptr(n)))) != '.'; n++ { } if zTab != 0 && (Xsqlite3_strnicmp(tls, zSpan, zTab, n) != 0 || int32(*(*int8)(unsafe.Pointer(zTab + uintptr(n)))) != 0) { return 0 } zSpan += uintptr(n + 1) if zCol != 0 && Xsqlite3StrICmp(tls, zSpan, zCol) != 0 { return 0 } return 1 } func areDoubleQuotedStringsEnabled(tls *libc.TLS, db uintptr, pTopNC uintptr) int32 { if (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 { return 1 } if (*NameContext)(unsafe.Pointer(pTopNC)).FncFlags&NC_IsDDL != 0 { if Xsqlite3WritableSchema(tls, db) != 0 && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DqsDML) != uint64(0) { return 1 } return libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DqsDDL) != uint64(0)) } else { return libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DqsDML) != uint64(0)) } return int32(0) } // The argument is guaranteed to be a non-NULL Expr node of type TK_COLUMN. // return the appropriate colUsed mask. func Xsqlite3ExprColUsed(tls *libc.TLS, pExpr uintptr) Bitmask { var n int32 var pExTab uintptr n = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) pExTab = *(*uintptr)(unsafe.Pointer(pExpr + 64)) if (*Table)(unsafe.Pointer(pExTab)).FtabFlags&U32(TF_HasGenerated) != U32(0) && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pExTab)).FaCol+uintptr(n)*24)).FcolFlags)&COLFLAG_GENERATED != 0 { if int32((*Table)(unsafe.Pointer(pExTab)).FnCol) >= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) { return libc.Uint64(libc.Uint64FromInt32(-1)) } return uint64(1)<= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) { n = int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) - 1 } return uint64(1) << n } return Bitmask(0) } func extendFJMatch(tls *libc.TLS, pParse uintptr, ppList uintptr, pMatch uintptr, iColumn I16) { var pNew uintptr = Xsqlite3ExprAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_COLUMN, uintptr(0), 0) if pNew != 0 { (*Expr)(unsafe.Pointer(pNew)).FiTable = (*SrcItem)(unsafe.Pointer(pMatch)).FiCursor (*Expr)(unsafe.Pointer(pNew)).FiColumn = iColumn *(*uintptr)(unsafe.Pointer(pNew + 64)) = (*SrcItem)(unsafe.Pointer(pMatch)).FpTab *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_CanBeNull) *(*uintptr)(unsafe.Pointer(ppList)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(ppList)), pNew) } } func isValidSchemaTableName(tls *libc.TLS, zTab uintptr, pTab uintptr, pSchema uintptr) int32 { var zLegacy uintptr if Xsqlite3_strnicmp(tls, zTab, ts+7733, 7) != 0 { return 0 } zLegacy = (*Table)(unsafe.Pointer(pTab)).FzName if libc.Xstrcmp(tls, zLegacy+uintptr(7), ts+7741+7) == 0 { if Xsqlite3StrICmp(tls, zTab+uintptr(7), ts+7760+7) == 0 { return 1 } if pSchema == uintptr(0) { return 0 } if Xsqlite3StrICmp(tls, zTab+uintptr(7), ts+7235+7) == 0 { return 1 } if Xsqlite3StrICmp(tls, zTab+uintptr(7), ts+7779+7) == 0 { return 1 } } else { if Xsqlite3StrICmp(tls, zTab+uintptr(7), ts+7779+7) == 0 { return 1 } } return 0 } func lookupName(tls *libc.TLS, pParse uintptr, zDb uintptr, zTab uintptr, zCol uintptr, pNC uintptr, pExpr uintptr) int32 { bp := tls.Alloc(104) defer tls.Free(104) var i int32 var j int32 var cnt int32 var cntTab int32 var nSubquery int32 var db uintptr var pItem uintptr var pMatch uintptr var pTopNC uintptr var pSchema uintptr var eNewExprOp int32 var pTab uintptr var pCol uintptr var hit int32 var hCol U8 var op int32 var pUpsert uintptr var iCol int32 var hCol1 U8 var pOrig uintptr var zAs uintptr var pEList uintptr var pSrcList uintptr var zErr uintptr cnt = 0 cntTab = 0 nSubquery = 0 db = (*Parse)(unsafe.Pointer(pParse)).Fdb pMatch = uintptr(0) pTopNC = pNC pSchema = uintptr(0) eNewExprOp = TK_COLUMN pTab = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 96)) = uintptr(0) (*Expr)(unsafe.Pointer(pExpr)).FiTable = -1 if !(zDb != 0) { goto __1 } if !((*NameContext)(unsafe.Pointer(pNC)).FncFlags&(NC_PartIdx|NC_IsCheck) != 0) { goto __2 } zDb = uintptr(0) goto __3 __2: i = 0 __4: if !(i < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __6 } if !(Xsqlite3StrICmp(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FzDbSName, zDb) == 0) { goto __7 } pSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpSchema goto __6 __7: ; goto __5 __5: i++ goto __4 goto __6 __6: ; if !(i == (*Sqlite3)(unsafe.Pointer(db)).FnDb && Xsqlite3StrICmp(tls, ts+7793, zDb) == 0) { goto __8 } pSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FzDbSName __8: ; __3: ; __1: ; __9: pSrcList = (*NameContext)(unsafe.Pointer(pNC)).FpSrcList if !(pSrcList != 0) { goto __12 } i = 0 pItem = pSrcList + 8 __13: if !(i < (*SrcList)(unsafe.Pointer(pSrcList)).FnSrc) { goto __15 } pTab = (*SrcItem)(unsafe.Pointer(pItem)).FpTab if !(uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x2000>>13)) != 0) { goto __16 } hit = 0 pEList = (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpSelect)).FpEList j = 0 __17: if !(j < (*ExprList)(unsafe.Pointer(pEList)).FnExpr) { goto __19 } if !!(Xsqlite3MatchEName(tls, pEList+8+uintptr(j)*32, zCol, zTab, zDb) != 0) { goto __20 } goto __18 __20: ; if !(cnt > 0) { goto __21 } if !(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x400>>10) == 0 || Xsqlite3IdListIndex(tls, *(*uintptr)(unsafe.Pointer(pItem + 72)), zCol) < 0) { goto __22 } Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(bp + 96))) *(*uintptr)(unsafe.Pointer(bp + 96)) = uintptr(0) goto __23 __22: if !(int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_RIGHT == 0) { goto __24 } goto __18 goto __25 __24: if !(int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_LEFT == 0) { goto __26 } cnt = 0 Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(bp + 96))) *(*uintptr)(unsafe.Pointer(bp + 96)) = uintptr(0) goto __27 __26: extendFJMatch(tls, pParse, bp+96, pMatch, (*Expr)(unsafe.Pointer(pExpr)).FiColumn) __27: ; __25: ; __23: ; __21: ; cnt++ cntTab = 2 pMatch = pItem (*Expr)(unsafe.Pointer(pExpr)).FiColumn = YnVar(j) libc.SetBitFieldPtr16Uint32(pEList+8+uintptr(j)*32+16+4, uint32(1), 6, 0x40) hit = 1 if !(uint32(int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(j)*32 + 16 + 4))&0x80>>7)) != 0) { goto __28 } goto __19 __28: ; goto __18 __18: j++ goto __17 goto __19 __19: ; if !(hit != 0 || zTab == uintptr(0)) { goto __29 } goto __14 __29: ; __16: ; if !(zTab != 0) { goto __30 } if !(zDb != 0) { goto __31 } if !((*Table)(unsafe.Pointer(pTab)).FpSchema != pSchema) { goto __32 } goto __14 __32: ; if !(pSchema == uintptr(0) && libc.Xstrcmp(tls, zDb, ts+7798) != 0) { goto __33 } goto __14 __33: ; __31: ; if !((*SrcItem)(unsafe.Pointer(pItem)).FzAlias != uintptr(0)) { goto __34 } if !(Xsqlite3StrICmp(tls, zTab, (*SrcItem)(unsafe.Pointer(pItem)).FzAlias) != 0) { goto __36 } goto __14 __36: ; goto __35 __34: if !(Xsqlite3StrICmp(tls, zTab, (*Table)(unsafe.Pointer(pTab)).FzName) != 0) { goto __37 } if !((*Table)(unsafe.Pointer(pTab)).Ftnum != Pgno(1)) { goto __38 } goto __14 __38: ; if !!(isValidSchemaTableName(tls, zTab, pTab, pSchema) != 0) { goto __39 } goto __14 __39: ; __37: ; __35: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && (*SrcItem)(unsafe.Pointer(pItem)).FzAlias != 0) { goto __40 } Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), pExpr+64) __40: ; __30: ; hCol = Xsqlite3StrIHash(tls, zCol) j = 0 pCol = (*Table)(unsafe.Pointer(pTab)).FaCol __41: if !(j < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __43 } if !(int32((*Column)(unsafe.Pointer(pCol)).FhName) == int32(hCol) && Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName, zCol) == 0) { goto __44 } if !(cnt > 0) { goto __45 } if !(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x400>>10) == 0 || Xsqlite3IdListIndex(tls, *(*uintptr)(unsafe.Pointer(pItem + 72)), zCol) < 0) { goto __46 } Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(bp + 96))) *(*uintptr)(unsafe.Pointer(bp + 96)) = uintptr(0) goto __47 __46: if !(int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_RIGHT == 0) { goto __48 } goto __42 goto __49 __48: if !(int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_LEFT == 0) { goto __50 } cnt = 0 Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(bp + 96))) *(*uintptr)(unsafe.Pointer(bp + 96)) = uintptr(0) goto __51 __50: extendFJMatch(tls, pParse, bp+96, pMatch, (*Expr)(unsafe.Pointer(pExpr)).FiColumn) __51: ; __49: ; __47: ; __45: ; cnt++ pMatch = pItem (*Expr)(unsafe.Pointer(pExpr)).FiColumn = func() int16 { if j == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { return int16(-1) } return I16(j) }() if !(uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x2000>>13)) != 0) { goto __52 } Xsqlite3SrcItemColumnUsed(tls, pItem, j) __52: ; goto __43 __44: ; goto __42 __42: j++ pCol += 24 goto __41 goto __43 __43: ; if !(0 == cnt && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_NoVisibleRowid) == U32(0)) { goto __53 } cntTab++ pMatch = pItem __53: ; goto __14 __14: i++ pItem += 104 goto __13 goto __15 __15: ; if !(pMatch != 0) { goto __54 } (*Expr)(unsafe.Pointer(pExpr)).FiTable = (*SrcItem)(unsafe.Pointer(pMatch)).FiCursor *(*uintptr)(unsafe.Pointer(pExpr + 64)) = (*SrcItem)(unsafe.Pointer(pMatch)).FpTab if !(int32((*SrcItem)(unsafe.Pointer(pMatch)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ) != 0) { goto __55 } *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_CanBeNull) __55: ; pSchema = (*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 64)))).FpSchema __54: ; __12: ; if !(cnt == 0 && zDb == uintptr(0)) { goto __56 } pTab = uintptr(0) if !((*Parse)(unsafe.Pointer(pParse)).FpTriggerTab != uintptr(0)) { goto __57 } op = int32((*Parse)(unsafe.Pointer(pParse)).FeTriggerOp) if !((*Parse)(unsafe.Pointer(pParse)).FbReturning != 0) { goto __58 } if !((*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_UBaseReg != 0 && (zTab == uintptr(0) || Xsqlite3StrICmp(tls, zTab, (*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).FpTriggerTab)).FzName) == 0)) { goto __60 } (*Expr)(unsafe.Pointer(pExpr)).FiTable = libc.Bool32(op != TK_DELETE) pTab = (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab __60: ; goto __59 __58: if !(op != TK_DELETE && zTab != 0 && Xsqlite3StrICmp(tls, ts+7800, zTab) == 0) { goto __61 } (*Expr)(unsafe.Pointer(pExpr)).FiTable = 1 pTab = (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab goto __62 __61: if !(op != TK_INSERT && zTab != 0 && Xsqlite3StrICmp(tls, ts+7804, zTab) == 0) { goto __63 } (*Expr)(unsafe.Pointer(pExpr)).FiTable = 0 pTab = (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab __63: ; __62: ; __59: ; __57: ; if !((*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_UUpsert != 0 && zTab != uintptr(0)) { goto __64 } pUpsert = *(*uintptr)(unsafe.Pointer(pNC + 16)) if !(pUpsert != 0 && Xsqlite3StrICmp(tls, ts+7808, zTab) == 0) { goto __65 } pTab = (*SrcItem)(unsafe.Pointer((*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertSrc + 8)).FpTab (*Expr)(unsafe.Pointer(pExpr)).FiTable = EXCLUDED_TABLE_NUMBER __65: ; __64: ; if !(pTab != 0) { goto __66 } hCol1 = Xsqlite3StrIHash(tls, zCol) pSchema = (*Table)(unsafe.Pointer(pTab)).FpSchema cntTab++ iCol = 0 pCol = (*Table)(unsafe.Pointer(pTab)).FaCol __67: if !(iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __69 } if !(int32((*Column)(unsafe.Pointer(pCol)).FhName) == int32(hCol1) && Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName, zCol) == 0) { goto __70 } if !(iCol == int32((*Table)(unsafe.Pointer(pTab)).FiPKey)) { goto __71 } iCol = -1 __71: ; goto __69 __70: ; goto __68 __68: iCol++ pCol += 24 goto __67 goto __69 __69: ; if !(iCol >= int32((*Table)(unsafe.Pointer(pTab)).FnCol) && Xsqlite3IsRowid(tls, zCol) != 0 && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_NoVisibleRowid) == U32(0)) { goto __72 } iCol = -1 __72: ; if !(iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __73 } cnt++ pMatch = uintptr(0) if !((*Expr)(unsafe.Pointer(pExpr)).FiTable == EXCLUDED_TABLE_NUMBER) { goto __74 } if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __76 } (*Expr)(unsafe.Pointer(pExpr)).FiColumn = YnVar(iCol) *(*uintptr)(unsafe.Pointer(pExpr + 64)) = pTab eNewExprOp = TK_COLUMN goto __77 __76: (*Expr)(unsafe.Pointer(pExpr)).FiTable = (*Upsert)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNC + 16)))).FregData + int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(iCol))) eNewExprOp = TK_REGISTER __77: ; goto __75 __74: ; *(*uintptr)(unsafe.Pointer(pExpr + 64)) = pTab if !((*Parse)(unsafe.Pointer(pParse)).FbReturning != 0) { goto __78 } eNewExprOp = TK_REGISTER (*Expr)(unsafe.Pointer(pExpr)).Fop2 = U8(TK_COLUMN) (*Expr)(unsafe.Pointer(pExpr)).FiColumn = YnVar(iCol) (*Expr)(unsafe.Pointer(pExpr)).FiTable = *(*int32)(unsafe.Pointer(pNC + 16)) + (int32((*Table)(unsafe.Pointer(pTab)).FnCol)+1)*(*Expr)(unsafe.Pointer(pExpr)).FiTable + int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(iCol))) + 1 goto __79 __78: (*Expr)(unsafe.Pointer(pExpr)).FiColumn = I16(iCol) eNewExprOp = TK_TRIGGER if !(iCol < 0) { goto __80 } (*Expr)(unsafe.Pointer(pExpr)).FaffExpr = int8(SQLITE_AFF_INTEGER) goto __81 __80: if !((*Expr)(unsafe.Pointer(pExpr)).FiTable == 0) { goto __82 } *(*U32)(unsafe.Pointer(pParse + 212)) |= func() uint32 { if iCol >= 32 { return 0xffffffff } return U32(1) << iCol }() goto __83 __82: ; *(*U32)(unsafe.Pointer(pParse + 216)) |= func() uint32 { if iCol >= 32 { return 0xffffffff } return U32(1) << iCol }() __83: ; __81: ; __79: ; __75: ; __73: ; __66: ; __56: ; if !(cnt == 0 && cntTab == 1 && pMatch != 0 && (*NameContext)(unsafe.Pointer(pNC)).FncFlags&(NC_IdxExpr|NC_GenCol) == 0 && Xsqlite3IsRowid(tls, zCol) != 0 && (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pMatch)).FpTab)).FtabFlags&U32(TF_NoVisibleRowid) == U32(0)) { goto __84 } cnt = 1 (*Expr)(unsafe.Pointer(pExpr)).FiColumn = int16(-1) (*Expr)(unsafe.Pointer(pExpr)).FaffExpr = int8(SQLITE_AFF_INTEGER) __84: ; if !(cnt == 0 && (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_UEList != 0 && zTab == uintptr(0)) { goto __85 } pEList = *(*uintptr)(unsafe.Pointer(pNC + 16)) j = 0 __86: if !(j < (*ExprList)(unsafe.Pointer(pEList)).FnExpr) { goto __88 } zAs = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(j)*32)).FzEName if !(int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(j)*32 + 16 + 4))&0x3>>0) == ENAME_NAME && Xsqlite3_stricmp(tls, zAs, zCol) == 0) { goto __89 } pOrig = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(j)*32)).FpExpr if !((*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_AllowAgg == 0 && (*Expr)(unsafe.Pointer(pOrig)).Fflags&U32(EP_Agg) != U32(0)) { goto __90 } Xsqlite3ErrorMsg(tls, pParse, ts+7817, libc.VaList(bp, zAs)) return WRC_Abort __90: ; if !((*Expr)(unsafe.Pointer(pOrig)).Fflags&U32(EP_Win) != U32(0) && ((*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_AllowWin == 0 || pNC != pTopNC)) { goto __91 } Xsqlite3ErrorMsg(tls, pParse, ts+7848, libc.VaList(bp+8, zAs)) return WRC_Abort __91: ; if !(Xsqlite3ExprVectorSize(tls, pOrig) != 1) { goto __92 } Xsqlite3ErrorMsg(tls, pParse, ts+7885, 0) return WRC_Abort __92: ; resolveAlias(tls, pParse, pEList, j, pExpr, nSubquery) cnt = 1 pMatch = uintptr(0) if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __93 } Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), pExpr) __93: ; goto lookupname_end __89: ; goto __87 __87: j++ goto __86 goto __88 __88: ; __85: ; if !(cnt != 0) { goto __94 } goto __11 __94: ; pNC = (*NameContext)(unsafe.Pointer(pNC)).FpNext nSubquery++ goto __10 __10: if pNC != 0 { goto __9 } goto __11 __11: ; if !(cnt == 0 && zTab == uintptr(0)) { goto __95 } if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_DblQuoted) != U32(0) && areDoubleQuotedStringsEnabled(tls, db, pTopNC) != 0) { goto __96 } Xsqlite3_log(tls, SQLITE_WARNING, ts+7903, libc.VaList(bp+16, zCol)) (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_STRING) libc.Xmemset(tls, pExpr+64, 0, uint64(unsafe.Sizeof(struct{ FpTab uintptr }{}))) return WRC_Prune __96: ; if !(Xsqlite3ExprIdToTrueFalse(tls, pExpr) != 0) { goto __97 } return WRC_Prune __97: ; __95: ; if !(cnt != 1) { goto __98 } if !(*(*uintptr)(unsafe.Pointer(bp + 96)) != 0) { goto __99 } if !((*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 96)))).FnExpr == cnt-1) { goto __100 } if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Leaf) != U32(0)) { goto __102 } *(*U32)(unsafe.Pointer(pExpr + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_Leaf)) goto __103 __102: Xsqlite3ExprDelete(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) (*Expr)(unsafe.Pointer(pExpr)).FpLeft = uintptr(0) Xsqlite3ExprDelete(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpRight) (*Expr)(unsafe.Pointer(pExpr)).FpRight = uintptr(0) __103: ; extendFJMatch(tls, pParse, bp+96, pMatch, (*Expr)(unsafe.Pointer(pExpr)).FiColumn) (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_FUNCTION) *(*uintptr)(unsafe.Pointer(pExpr + 8)) = ts + 7938 *(*uintptr)(unsafe.Pointer(pExpr + 32)) = *(*uintptr)(unsafe.Pointer(bp + 96)) cnt = 1 goto lookupname_end goto __101 __100: Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(bp + 96))) *(*uintptr)(unsafe.Pointer(bp + 96)) = uintptr(0) __101: ; __99: ; if cnt == 0 { zErr = ts + 7947 } else { zErr = ts + 7962 } if !(zDb != 0) { goto __104 } Xsqlite3ErrorMsg(tls, pParse, ts+7984, libc.VaList(bp+24, zErr, zDb, zTab, zCol)) goto __105 __104: if !(zTab != 0) { goto __106 } Xsqlite3ErrorMsg(tls, pParse, ts+7997, libc.VaList(bp+56, zErr, zTab, zCol)) goto __107 __106: Xsqlite3ErrorMsg(tls, pParse, ts+8007, libc.VaList(bp+80, zErr, zCol)) __107: ; __105: ; Xsqlite3RecordErrorOffsetOfExpr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) (*NameContext)(unsafe.Pointer(pTopNC)).FnNcErr++ __98: ; if !!((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_TokenOnly|EP_Leaf) != U32(0)) { goto __108 } Xsqlite3ExprDelete(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) (*Expr)(unsafe.Pointer(pExpr)).FpLeft = uintptr(0) Xsqlite3ExprDelete(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpRight) (*Expr)(unsafe.Pointer(pExpr)).FpRight = uintptr(0) *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_Leaf) __108: ; if !(int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) >= 0 && pMatch != uintptr(0)) { goto __109 } *(*Bitmask)(unsafe.Pointer(pMatch + 80)) |= Xsqlite3ExprColUsed(tls, pExpr) __109: ; (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(eNewExprOp) lookupname_end: if !(cnt == 1) { goto __110 } if !((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FxAuth != 0 && (int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_TRIGGER)) { goto __112 } Xsqlite3AuthRead(tls, pParse, pExpr, pSchema, (*NameContext)(unsafe.Pointer(pNC)).FpSrcList) __112: ; __113: ; (*NameContext)(unsafe.Pointer(pTopNC)).FnRef++ if !(pTopNC == pNC) { goto __116 } goto __115 __116: ; pTopNC = (*NameContext)(unsafe.Pointer(pTopNC)).FpNext goto __114 __114: goto __113 goto __115 __115: ; return WRC_Prune goto __111 __110: return WRC_Abort __111: ; return int32(0) } // Allocate and return a pointer to an expression to load the column iCol // from datasource iSrc in SrcList pSrc. func Xsqlite3CreateColumnExpr(tls *libc.TLS, db uintptr, pSrc uintptr, iSrc int32, iCol int32) uintptr { var p uintptr = Xsqlite3ExprAlloc(tls, db, TK_COLUMN, uintptr(0), 0) if p != 0 { var pItem uintptr = pSrc + 8 + uintptr(iSrc)*104 var pTab uintptr pTab = libc.AssignPtrUintptr(p+64, (*SrcItem)(unsafe.Pointer(pItem)).FpTab) (*Expr)(unsafe.Pointer(p)).FiTable = (*SrcItem)(unsafe.Pointer(pItem)).FiCursor if int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64)))).FiPKey) == iCol { (*Expr)(unsafe.Pointer(p)).FiColumn = int16(-1) } else { (*Expr)(unsafe.Pointer(p)).FiColumn = YnVar(iCol) if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated) != U32(0) && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FcolFlags)&COLFLAG_GENERATED != 0 { (*SrcItem)(unsafe.Pointer(pItem)).FcolUsed = func() uint64 { if int32((*Table)(unsafe.Pointer(pTab)).FnCol) >= 64 { return libc.Uint64(libc.Uint64FromInt32(-1)) } return uint64(1)<= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) { return int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) - 1 } return iCol }() } } } return p } func notValidImpl(tls *libc.TLS, pParse uintptr, pNC uintptr, zMsg uintptr, pExpr uintptr, pError uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var zIn uintptr = ts + 8014 if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_IdxExpr != 0 { zIn = ts + 8042 } else if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_IsCheck != 0 { zIn = ts + 8060 } else if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_GenCol != 0 { zIn = ts + 8078 } Xsqlite3ErrorMsg(tls, pParse, ts+8096, libc.VaList(bp, zMsg, zIn)) if pExpr != 0 { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_NULL) } Xsqlite3RecordErrorOffsetOfExpr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pError) } func exprProbability(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*float64)(unsafe.Pointer(bp)) = -1.0 if int32((*Expr)(unsafe.Pointer(p)).Fop) != TK_FLOAT { return -1 } Xsqlite3AtoF(tls, *(*uintptr)(unsafe.Pointer(p + 8)), bp, Xsqlite3Strlen30(tls, *(*uintptr)(unsafe.Pointer(p + 8))), uint8(SQLITE_UTF8)) if *(*float64)(unsafe.Pointer(bp)) > 1.0 { return -1 } return libc.Int32FromFloat64(*(*float64)(unsafe.Pointer(bp)) * 134217728.0) } func resolveExprStep(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { bp := tls.Alloc(96) defer tls.Free(96) var pNC uintptr var pParse uintptr pNC = *(*uintptr)(unsafe.Pointer(pWalker + 40)) pParse = (*NameContext)(unsafe.Pointer(pNC)).FpParse switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { case TK_ROW: { var pSrcList uintptr = (*NameContext)(unsafe.Pointer(pNC)).FpSrcList var pItem uintptr pItem = pSrcList + 8 (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_COLUMN) *(*uintptr)(unsafe.Pointer(pExpr + 64)) = (*SrcItem)(unsafe.Pointer(pItem)).FpTab (*Expr)(unsafe.Pointer(pExpr)).FiTable = (*SrcItem)(unsafe.Pointer(pItem)).FiCursor (*Expr)(unsafe.Pointer(pExpr)).FiColumn-- (*Expr)(unsafe.Pointer(pExpr)).FaffExpr = int8(SQLITE_AFF_INTEGER) break } case TK_NOTNULL: fallthrough case TK_ISNULL: { var p uintptr var i int32 i = 0 p = pNC __1: if !(p != 0 && i < int32(uint64(unsafe.Sizeof([8]int32{}))/uint64(unsafe.Sizeof(int32(0))))) { goto __3 } { *(*int32)(unsafe.Pointer(bp + 64 + uintptr(i)*4)) = (*NameContext)(unsafe.Pointer(p)).FnRef } goto __2 __2: p = (*NameContext)(unsafe.Pointer(p)).FpNext i++ goto __1 goto __3 __3: ; Xsqlite3WalkExpr(tls, pWalker, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) if 0 == Xsqlite3ExprCanBeNull(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { *(*int32)(unsafe.Pointer(pExpr + 8)) = libc.Bool32(int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_NOTNULL) *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_IntValue) (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_INTEGER) i = 0 p = pNC __4: if !(p != 0 && i < int32(uint64(unsafe.Sizeof([8]int32{}))/uint64(unsafe.Sizeof(int32(0))))) { goto __6 } { (*NameContext)(unsafe.Pointer(p)).FnRef = *(*int32)(unsafe.Pointer(bp + 64 + uintptr(i)*4)) } goto __5 __5: p = (*NameContext)(unsafe.Pointer(p)).FpNext i++ goto __4 goto __6 __6: ; Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) (*Expr)(unsafe.Pointer(pExpr)).FpLeft = uintptr(0) } return WRC_Prune } case TK_ID: fallthrough case TK_DOT: { var zColumn uintptr var zTable uintptr var zDb uintptr var pRight uintptr if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_ID { zDb = uintptr(0) zTable = uintptr(0) zColumn = *(*uintptr)(unsafe.Pointer(pExpr + 8)) } else { var pLeft uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&(NC_IdxExpr|NC_GenCol) != 0 { notValidImpl(tls, pParse, pNC, ts+8116, uintptr(0), pExpr) } pRight = (*Expr)(unsafe.Pointer(pExpr)).FpRight if int32((*Expr)(unsafe.Pointer(pRight)).Fop) == TK_ID { zDb = uintptr(0) } else { zDb = *(*uintptr)(unsafe.Pointer(pLeft + 8)) pLeft = (*Expr)(unsafe.Pointer(pRight)).FpLeft pRight = (*Expr)(unsafe.Pointer(pRight)).FpRight } zTable = *(*uintptr)(unsafe.Pointer(pLeft + 8)) zColumn = *(*uintptr)(unsafe.Pointer(pRight + 8)) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameTokenRemap(tls, pParse, pExpr, pRight) Xsqlite3RenameTokenRemap(tls, pParse, pExpr+64, pLeft) } } return lookupName(tls, pParse, zDb, zTable, zColumn, pNC, pExpr) } case TK_FUNCTION: { var pList uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 32)) var n int32 if pList != 0 { n = (*ExprList)(unsafe.Pointer(pList)).FnExpr } else { n = 0 } var no_such_func int32 = 0 var wrong_num_args int32 = 0 var is_agg int32 = 0 var zId uintptr var pDef uintptr var enc U8 = (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fenc var savedAllowFlags int32 = (*NameContext)(unsafe.Pointer(pNC)).FncFlags & (NC_AllowAgg | NC_AllowWin) var pWin uintptr = func() uintptr { if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) && int32((*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 64)))).FeFrmType) != TK_FILTER { return *(*uintptr)(unsafe.Pointer(pExpr + 64)) } return uintptr(0) }() zId = *(*uintptr)(unsafe.Pointer(pExpr + 8)) pDef = Xsqlite3FindFunction(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, zId, n, enc, uint8(0)) if pDef == uintptr(0) { pDef = Xsqlite3FindFunction(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, zId, -2, enc, uint8(0)) if pDef == uintptr(0) { no_such_func = 1 } else { wrong_num_args = 1 } } else { is_agg = libc.Bool32((*FuncDef)(unsafe.Pointer(pDef)).FxFinalize != uintptr(0)) if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_UNLIKELY) != 0 { *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_Unlikely) if n == 2 { (*Expr)(unsafe.Pointer(pExpr)).FiTable = exprProbability(tls, (*ExprList_item)(unsafe.Pointer(pList+8+1*32)).FpExpr) if (*Expr)(unsafe.Pointer(pExpr)).FiTable < 0 { Xsqlite3ErrorMsg(tls, pParse, ts+8133, libc.VaList(bp, pExpr)) (*NameContext)(unsafe.Pointer(pNC)).FnNcErr++ } } else { (*Expr)(unsafe.Pointer(pExpr)).FiTable = func() int32 { if int32(*(*int8)(unsafe.Pointer((*FuncDef)(unsafe.Pointer(pDef)).FzName))) == 'u' { return 8388608 } return 125829120 }() } } { var auth int32 = Xsqlite3AuthCheck(tls, pParse, SQLITE_FUNCTION, uintptr(0), (*FuncDef)(unsafe.Pointer(pDef)).FzName, uintptr(0)) if auth != SQLITE_OK { if auth == SQLITE_DENY { Xsqlite3ErrorMsg(tls, pParse, ts+8197, libc.VaList(bp+8, pExpr)) (*NameContext)(unsafe.Pointer(pNC)).FnNcErr++ } (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_NULL) return WRC_Prune } } if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) != 0 { *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_ConstFunc) } if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_CONSTANT) == U32(0) { if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&(NC_IdxExpr|NC_PartIdx|NC_GenCol) != 0 { notValidImpl(tls, pParse, pNC, ts+8233, uintptr(0), pExpr) } } else { (*Expr)(unsafe.Pointer(pExpr)).Fop2 = U8((*NameContext)(unsafe.Pointer(pNC)).FncFlags & NC_SelfRef) if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_FromDDL != 0 { *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_FromDDL) } } if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_INTERNAL) != U32(0) && int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0 && (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmDbFlags&U32(DBFLAG_InternalFunc) == U32(0) { no_such_func = 1 pDef = uintptr(0) } else if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE) != U32(0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { Xsqlite3ExprFunctionUsable(tls, pParse, pExpr, pDef) } } if 0 == libc.Bool32(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { if pDef != 0 && (*FuncDef)(unsafe.Pointer(pDef)).FxValue == uintptr(0) && pWin != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+8261, libc.VaList(bp+16, pExpr)) (*NameContext)(unsafe.Pointer(pNC)).FnNcErr++ } else if is_agg != 0 && (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_AllowAgg == 0 || is_agg != 0 && (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_WINDOW) != 0 && !(pWin != 0) || is_agg != 0 && pWin != 0 && (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_AllowWin == 0 { var zType uintptr if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_WINDOW) != 0 || pWin != 0 { zType = ts + 8304 } else { zType = ts + 8311 } Xsqlite3ErrorMsg(tls, pParse, ts+8321, libc.VaList(bp+24, zType, pExpr)) (*NameContext)(unsafe.Pointer(pNC)).FnNcErr++ is_agg = 0 } else if no_such_func != 0 && int32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Finit.Fbusy) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+8349, libc.VaList(bp+40, pExpr)) (*NameContext)(unsafe.Pointer(pNC)).FnNcErr++ } else if wrong_num_args != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+8371, libc.VaList(bp+48, pExpr)) (*NameContext)(unsafe.Pointer(pNC)).FnNcErr++ } else if is_agg == 0 && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { Xsqlite3ErrorMsg(tls, pParse, ts+8415, libc.VaList(bp+56, pExpr)) (*NameContext)(unsafe.Pointer(pNC)).FnNcErr++ } if is_agg != 0 { *(*int32)(unsafe.Pointer(pNC + 40)) &= ^(NC_AllowWin | func() int32 { if !(pWin != 0) { return NC_AllowAgg } return 0 }()) } } else if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { is_agg = 1 } Xsqlite3WalkExprList(tls, pWalker, pList) if is_agg != 0 { if pWin != 0 { var pSel uintptr = (*NameContext)(unsafe.Pointer(pNC)).FpWinSelect if libc.Bool32(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) == 0 { Xsqlite3WindowUpdate(tls, pParse, func() uintptr { if pSel != 0 { return (*Select)(unsafe.Pointer(pSel)).FpWinDefn } return uintptr(0) }(), pWin, pDef) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { break } } Xsqlite3WalkExprList(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpPartition) Xsqlite3WalkExprList(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpOrderBy) Xsqlite3WalkExpr(tls, pWalker, (*Window)(unsafe.Pointer(pWin)).FpFilter) Xsqlite3WindowLink(tls, pSel, pWin) *(*int32)(unsafe.Pointer(pNC + 40)) |= NC_HasWin } else { var pNC2 uintptr (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_AGG_FUNCTION) (*Expr)(unsafe.Pointer(pExpr)).Fop2 = U8(0) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { Xsqlite3WalkExpr(tls, pWalker, (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 64)))).FpFilter) } pNC2 = pNC for pNC2 != 0 && Xsqlite3ReferencesSrcList(tls, pParse, pExpr, (*NameContext)(unsafe.Pointer(pNC2)).FpSrcList) == 0 { (*Expr)(unsafe.Pointer(pExpr)).Fop2++ pNC2 = (*NameContext)(unsafe.Pointer(pNC2)).FpNext } if pNC2 != 0 && pDef != 0 { *(*int32)(unsafe.Pointer(pNC2 + 40)) |= int32(U32(NC_HasAgg) | ((*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags^U32(SQLITE_FUNC_ANYORDER))& U32(SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER)) } } *(*int32)(unsafe.Pointer(pNC + 40)) |= savedAllowFlags } return WRC_Prune } case TK_SELECT: fallthrough case TK_EXISTS: fallthrough case TK_IN: { if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { var nRef int32 = (*NameContext)(unsafe.Pointer(pNC)).FnRef if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_SelfRef != 0 { notValidImpl(tls, pParse, pNC, ts+8463, pExpr, pExpr) } else { Xsqlite3WalkSelect(tls, pWalker, *(*uintptr)(unsafe.Pointer(pExpr + 32))) } if nRef != (*NameContext)(unsafe.Pointer(pNC)).FnRef { *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_VarSelect) } *(*int32)(unsafe.Pointer(pNC + 40)) |= NC_Subquery } break } case TK_VARIABLE: { if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol) != 0 { notValidImpl(tls, pParse, pNC, ts+8474, pExpr, pExpr) } break } case TK_IS: fallthrough case TK_ISNOT: { var pRight uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) if pRight != 0 && (int32((*Expr)(unsafe.Pointer(pRight)).Fop) == TK_ID || int32((*Expr)(unsafe.Pointer(pRight)).Fop) == TK_TRUEFALSE) { var rc int32 = resolveExprStep(tls, pWalker, pRight) if rc == WRC_Abort { return WRC_Abort } if int32((*Expr)(unsafe.Pointer(pRight)).Fop) == TK_TRUEFALSE { (*Expr)(unsafe.Pointer(pExpr)).Fop2 = (*Expr)(unsafe.Pointer(pExpr)).Fop (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_TRUTH) return WRC_Continue } } } fallthrough case TK_BETWEEN: fallthrough case TK_EQ: fallthrough case TK_NE: fallthrough case TK_LT: fallthrough case TK_LE: fallthrough case TK_GT: fallthrough case TK_GE: { var nLeft int32 var nRight int32 if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { break } nLeft = Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_BETWEEN { nRight = Xsqlite3ExprVectorSize(tls, (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32))+8)).FpExpr) if nRight == nLeft { nRight = Xsqlite3ExprVectorSize(tls, (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32))+8+1*32)).FpExpr) } } else { nRight = Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) } if nLeft != nRight { Xsqlite3ErrorMsg(tls, pParse, ts+7885, 0) Xsqlite3RecordErrorOffsetOfExpr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) } break } } if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return WRC_Abort } return WRC_Continue } func resolveAsName(tls *libc.TLS, pParse uintptr, pEList uintptr, pE uintptr) int32 { var i int32 _ = pParse if int32((*Expr)(unsafe.Pointer(pE)).Fop) == TK_ID { var zCol uintptr zCol = *(*uintptr)(unsafe.Pointer(pE + 8)) for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { if int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(i)*32 + 16 + 4))&0x3>>0) == ENAME_NAME && Xsqlite3_stricmp(tls, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(i)*32)).FzEName, zCol) == 0 { return i + 1 } } } return 0 } func resolveOrderByTermToExprList(tls *libc.TLS, pParse uintptr, pSelect uintptr, pE uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var i int32 var pEList uintptr var db uintptr var rc int32 var savedSuppErr U8 pEList = (*Select)(unsafe.Pointer(pSelect)).FpEList libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp)).FpSrcList = (*Select)(unsafe.Pointer(pSelect)).FpSrc *(*uintptr)(unsafe.Pointer(bp + 16)) = pEList (*NameContext)(unsafe.Pointer(bp)).FncFlags = NC_AllowAgg | NC_UEList | NC_NoSelect (*NameContext)(unsafe.Pointer(bp)).FnNcErr = 0 db = (*Parse)(unsafe.Pointer(pParse)).Fdb savedSuppErr = (*Sqlite3)(unsafe.Pointer(db)).FsuppressErr (*Sqlite3)(unsafe.Pointer(db)).FsuppressErr = U8(1) rc = Xsqlite3ResolveExprNames(tls, bp, pE) (*Sqlite3)(unsafe.Pointer(db)).FsuppressErr = savedSuppErr if rc != 0 { return 0 } for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { if Xsqlite3ExprCompare(tls, uintptr(0), (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(i)*32)).FpExpr, pE, -1) < 2 { return i + 1 } } return 0 } func resolveOutOfRangeError(tls *libc.TLS, pParse uintptr, zType uintptr, i int32, mx int32, pError uintptr) { bp := tls.Alloc(24) defer tls.Free(24) Xsqlite3ErrorMsg(tls, pParse, ts+8485, libc.VaList(bp, i, zType, mx)) Xsqlite3RecordErrorOffsetOfExpr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pError) } func resolveCompoundOrderBy(tls *libc.TLS, pParse uintptr, pSelect uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var i int32 var pOrderBy uintptr var pEList uintptr var db uintptr var moreToDo int32 = 1 pOrderBy = (*Select)(unsafe.Pointer(pSelect)).FpOrderBy if pOrderBy == uintptr(0) { return 0 } db = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr > *(*int32)(unsafe.Pointer(db + 136 + 2*4)) { Xsqlite3ErrorMsg(tls, pParse, ts+8541, 0) return 1 } for i = 0; i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr; i++ { libc.SetBitFieldPtr16Uint32(pOrderBy+8+uintptr(i)*32+16+4, uint32(0), 2, 0x4) } (*Select)(unsafe.Pointer(pSelect)).FpNext = uintptr(0) for (*Select)(unsafe.Pointer(pSelect)).FpPrior != 0 { (*Select)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpPrior)).FpNext = pSelect pSelect = (*Select)(unsafe.Pointer(pSelect)).FpPrior } for pSelect != 0 && moreToDo != 0 { var pItem uintptr moreToDo = 0 pEList = (*Select)(unsafe.Pointer(pSelect)).FpEList i = 0 pItem = pOrderBy + 8 __1: if !(i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr) { goto __3 } { *(*int32)(unsafe.Pointer(bp + 8)) = -1 var pE uintptr var pDup uintptr if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 16 + 4))&0x4>>2)) != 0 { goto __2 } pE = Xsqlite3ExprSkipCollateAndLikely(tls, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr) if pE == uintptr(0) { goto __2 } if Xsqlite3ExprIsInteger(tls, pE, bp+8) != 0 { if *(*int32)(unsafe.Pointer(bp + 8)) <= 0 || *(*int32)(unsafe.Pointer(bp + 8)) > (*ExprList)(unsafe.Pointer(pEList)).FnExpr { resolveOutOfRangeError(tls, pParse, ts+8575, i+1, (*ExprList)(unsafe.Pointer(pEList)).FnExpr, pE) return 1 } } else { *(*int32)(unsafe.Pointer(bp + 8)) = resolveAsName(tls, pParse, pEList, pE) if *(*int32)(unsafe.Pointer(bp + 8)) == 0 { pDup = Xsqlite3ExprDup(tls, db, pE, 0) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { *(*int32)(unsafe.Pointer(bp + 8)) = resolveOrderByTermToExprList(tls, pParse, pSelect, pDup) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && *(*int32)(unsafe.Pointer(bp + 8)) > 0 { resolveOrderByTermToExprList(tls, pParse, pSelect, pE) } } Xsqlite3ExprDelete(tls, db, pDup) } } if *(*int32)(unsafe.Pointer(bp + 8)) > 0 { if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { var pNew uintptr = Xsqlite3Expr(tls, db, TK_INTEGER, uintptr(0)) if pNew == uintptr(0) { return 1 } *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_IntValue) *(*int32)(unsafe.Pointer(pNew + 8)) = *(*int32)(unsafe.Pointer(bp + 8)) if (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr == pE { (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr = pNew } else { var pParent uintptr = (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr for int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pParent)).FpLeft)).Fop) == TK_COLLATE { pParent = (*Expr)(unsafe.Pointer(pParent)).FpLeft } (*Expr)(unsafe.Pointer(pParent)).FpLeft = pNew } Xsqlite3ExprDelete(tls, db, pE) *(*U16)(unsafe.Pointer(pItem + 24)) = U16(*(*int32)(unsafe.Pointer(bp + 8))) } libc.SetBitFieldPtr16Uint32(pItem+16+4, uint32(1), 2, 0x4) } else { moreToDo = 1 } } goto __2 __2: i++ pItem += 32 goto __1 goto __3 __3: ; pSelect = (*Select)(unsafe.Pointer(pSelect)).FpNext } for i = 0; i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr; i++ { if int32(*(*uint16)(unsafe.Pointer(pOrderBy + 8 + uintptr(i)*32 + 16 + 4))&0x4>>2) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+8581, libc.VaList(bp, i+1)) return 1 } } return 0 } // Check every term in the ORDER BY or GROUP BY clause pOrderBy of // the SELECT statement pSelect. If any term is reference to a // result set expression (as determined by the ExprList.a.u.x.iOrderByCol // field) then convert that term into a copy of the corresponding result set // column. // // If any errors are detected, add an error message to pParse and // return non-zero. Return zero if no errors are seen. func Xsqlite3ResolveOrderGroupBy(tls *libc.TLS, pParse uintptr, pSelect uintptr, pOrderBy uintptr, zType uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var i int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pEList uintptr var pItem uintptr if pOrderBy == uintptr(0) || (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 || int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { return 0 } if (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr > *(*int32)(unsafe.Pointer(db + 136 + 2*4)) { Xsqlite3ErrorMsg(tls, pParse, ts+8642, libc.VaList(bp, zType)) return 1 } pEList = (*Select)(unsafe.Pointer(pSelect)).FpEList i = 0 pItem = pOrderBy + 8 __1: if !(i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr) { goto __3 } { if *(*U16)(unsafe.Pointer(pItem + 24)) != 0 { if int32(*(*U16)(unsafe.Pointer(pItem + 24))) > (*ExprList)(unsafe.Pointer(pEList)).FnExpr { resolveOutOfRangeError(tls, pParse, zType, i+1, (*ExprList)(unsafe.Pointer(pEList)).FnExpr, uintptr(0)) return 1 } resolveAlias(tls, pParse, pEList, int32(*(*U16)(unsafe.Pointer(pItem + 24)))-1, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr, 0) } } goto __2 __2: i++ pItem += 32 goto __1 goto __3 __3: ; return 0 } func resolveRemoveWindowsCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { _ = pWalker if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { var pWin uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 64)) Xsqlite3WindowUnlinkFromSelect(tls, pWin) } return WRC_Continue } func windowRemoveExprFromSelect(tls *libc.TLS, pSelect uintptr, pExpr uintptr) { bp := tls.Alloc(48) defer tls.Free(48) if (*Select)(unsafe.Pointer(pSelect)).FpWin != 0 { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{resolveRemoveWindowsCb})) *(*uintptr)(unsafe.Pointer(bp + 40)) = pSelect Xsqlite3WalkExpr(tls, bp, pExpr) } } func resolveOrderGroupBy(tls *libc.TLS, pNC uintptr, pSelect uintptr, pOrderBy uintptr, zType uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var i int32 var j int32 var pItem uintptr var pParse uintptr var nResult int32 nResult = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpEList)).FnExpr pParse = (*NameContext)(unsafe.Pointer(pNC)).FpParse i = 0 pItem = pOrderBy + 8 __1: if !(i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr) { goto __3 } { var pE uintptr = (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr var pE2 uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, pE) if pE2 == uintptr(0) { goto __2 } if int32(*(*int8)(unsafe.Pointer(zType))) != 'G' { *(*int32)(unsafe.Pointer(bp)) = resolveAsName(tls, pParse, (*Select)(unsafe.Pointer(pSelect)).FpEList, pE2) if *(*int32)(unsafe.Pointer(bp)) > 0 { *(*U16)(unsafe.Pointer(pItem + 24)) = U16(*(*int32)(unsafe.Pointer(bp))) goto __2 } } if Xsqlite3ExprIsInteger(tls, pE2, bp) != 0 { if *(*int32)(unsafe.Pointer(bp)) < 1 || *(*int32)(unsafe.Pointer(bp)) > 0xffff { resolveOutOfRangeError(tls, pParse, zType, i+1, nResult, pE2) return 1 } *(*U16)(unsafe.Pointer(pItem + 24)) = U16(*(*int32)(unsafe.Pointer(bp))) goto __2 } *(*U16)(unsafe.Pointer(pItem + 24)) = U16(0) if Xsqlite3ResolveExprNames(tls, pNC, pE) != 0 { return 1 } for j = 0; j < (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpEList)).FnExpr; j++ { if Xsqlite3ExprCompare(tls, uintptr(0), pE, (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpEList+8+uintptr(j)*32)).FpExpr, -1) == 0 { windowRemoveExprFromSelect(tls, pSelect, pE) *(*U16)(unsafe.Pointer(pItem + 24)) = U16(j + 1) } } } goto __2 __2: i++ pItem += 32 goto __1 goto __3 __3: ; return Xsqlite3ResolveOrderGroupBy(tls, pParse, pSelect, pOrderBy, zType) } func resolveSelectStep(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var pOuterNC uintptr var isCompound int32 var nCompound int32 var pParse uintptr var i int32 var pGroupBy uintptr var pLeftmost uintptr var db uintptr if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Resolved) != 0 { return WRC_Prune } pOuterNC = *(*uintptr)(unsafe.Pointer(pWalker + 40)) pParse = (*Walker)(unsafe.Pointer(pWalker)).FpParse db = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Expanded) == U32(0) { Xsqlite3SelectPrep(tls, pParse, p, pOuterNC) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return WRC_Abort } return WRC_Prune } isCompound = libc.Bool32((*Select)(unsafe.Pointer(p)).FpPrior != uintptr(0)) nCompound = 0 pLeftmost = p for p != 0 { *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_Resolved) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp)).FpWinSelect = p if Xsqlite3ResolveExprNames(tls, bp, (*Select)(unsafe.Pointer(p)).FpLimit) != 0 { return WRC_Abort } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Converted) != 0 { var pSub uintptr = (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FpSelect (*Select)(unsafe.Pointer(pSub)).FpOrderBy = (*Select)(unsafe.Pointer(p)).FpOrderBy (*Select)(unsafe.Pointer(p)).FpOrderBy = uintptr(0) } for i = 0; i < (*SrcList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc)).FnSrc; i++ { var pItem uintptr = (*Select)(unsafe.Pointer(p)).FpSrc + 8 + uintptr(i)*104 if (*SrcItem)(unsafe.Pointer(pItem)).FpSelect != 0 && (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpSelect)).FselFlags&U32(SF_Resolved) == U32(0) { var nRef int32 if pOuterNC != 0 { nRef = (*NameContext)(unsafe.Pointer(pOuterNC)).FnRef } else { nRef = 0 } var zSavedContext uintptr = (*Parse)(unsafe.Pointer(pParse)).FzAuthContext if (*SrcItem)(unsafe.Pointer(pItem)).FzName != 0 { (*Parse)(unsafe.Pointer(pParse)).FzAuthContext = (*SrcItem)(unsafe.Pointer(pItem)).FzName } Xsqlite3ResolveSelectNames(tls, pParse, (*SrcItem)(unsafe.Pointer(pItem)).FpSelect, pOuterNC) (*Parse)(unsafe.Pointer(pParse)).FzAuthContext = zSavedContext if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return WRC_Abort } if pOuterNC != 0 { libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(libc.Bool32((*NameContext)(unsafe.Pointer(pOuterNC)).FnRef > nRef)), 3, 0x8) } } } (*NameContext)(unsafe.Pointer(bp)).FncFlags = NC_AllowAgg | NC_AllowWin (*NameContext)(unsafe.Pointer(bp)).FpSrcList = (*Select)(unsafe.Pointer(p)).FpSrc (*NameContext)(unsafe.Pointer(bp)).FpNext = pOuterNC if Xsqlite3ResolveExprListNames(tls, bp, (*Select)(unsafe.Pointer(p)).FpEList) != 0 { return WRC_Abort } *(*int32)(unsafe.Pointer(bp + 40)) &= libc.CplInt32(NC_AllowWin) pGroupBy = (*Select)(unsafe.Pointer(p)).FpGroupBy if pGroupBy != 0 || (*NameContext)(unsafe.Pointer(bp)).FncFlags&NC_HasAgg != 0 { *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_Aggregate | (*NameContext)(unsafe.Pointer(bp)).FncFlags&(NC_MinMaxAgg|NC_OrderAgg)) } else { *(*int32)(unsafe.Pointer(bp + 40)) &= libc.CplInt32(NC_AllowAgg) } *(*uintptr)(unsafe.Pointer(bp + 16)) = (*Select)(unsafe.Pointer(p)).FpEList *(*int32)(unsafe.Pointer(bp + 40)) |= NC_UEList if (*Select)(unsafe.Pointer(p)).FpHaving != 0 { if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Aggregate) == U32(0) { Xsqlite3ErrorMsg(tls, pParse, ts+8673, 0) return WRC_Abort } if Xsqlite3ResolveExprNames(tls, bp, (*Select)(unsafe.Pointer(p)).FpHaving) != 0 { return WRC_Abort } } if Xsqlite3ResolveExprNames(tls, bp, (*Select)(unsafe.Pointer(p)).FpWhere) != 0 { return WRC_Abort } for i = 0; i < (*SrcList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc)).FnSrc; i++ { var pItem uintptr = (*Select)(unsafe.Pointer(p)).FpSrc + 8 + uintptr(i)*104 if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x4>>2)) != 0 && Xsqlite3ResolveExprListNames(tls, bp, *(*uintptr)(unsafe.Pointer(pItem + 88))) != 0 { return WRC_Abort } } if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { var pWin uintptr for pWin = (*Select)(unsafe.Pointer(p)).FpWinDefn; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { if Xsqlite3ResolveExprListNames(tls, bp, (*Window)(unsafe.Pointer(pWin)).FpOrderBy) != 0 || Xsqlite3ResolveExprListNames(tls, bp, (*Window)(unsafe.Pointer(pWin)).FpPartition) != 0 { return WRC_Abort } } } (*NameContext)(unsafe.Pointer(bp)).FpNext = uintptr(0) *(*int32)(unsafe.Pointer(bp + 40)) |= NC_AllowAgg | NC_AllowWin if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Converted) != 0 { var pSub uintptr = (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FpSelect (*Select)(unsafe.Pointer(p)).FpOrderBy = (*Select)(unsafe.Pointer(pSub)).FpOrderBy (*Select)(unsafe.Pointer(pSub)).FpOrderBy = uintptr(0) } if (*Select)(unsafe.Pointer(p)).FpOrderBy != uintptr(0) && isCompound <= nCompound && resolveOrderGroupBy(tls, bp, p, (*Select)(unsafe.Pointer(p)).FpOrderBy, ts+8575) != 0 { return WRC_Abort } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return WRC_Abort } *(*int32)(unsafe.Pointer(bp + 40)) &= libc.CplInt32(NC_AllowWin) if pGroupBy != 0 { var pItem uintptr if resolveOrderGroupBy(tls, bp, p, pGroupBy, ts+8712) != 0 || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return WRC_Abort } i = 0 pItem = pGroupBy + 8 __1: if !(i < (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr) { goto __3 } { if (*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pItem)).FpExpr)).Fflags&U32(EP_Agg) != U32(0) { Xsqlite3ErrorMsg(tls, pParse, ts+8718, 0) return WRC_Abort } } goto __2 __2: i++ pItem += 32 goto __1 goto __3 __3: } if (*Select)(unsafe.Pointer(p)).FpNext != 0 && (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr != (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpNext)).FpEList)).FnExpr { Xsqlite3SelectWrongNumTermsError(tls, pParse, (*Select)(unsafe.Pointer(p)).FpNext) return WRC_Abort } p = (*Select)(unsafe.Pointer(p)).FpPrior nCompound++ } if isCompound != 0 && resolveCompoundOrderBy(tls, pParse, pLeftmost) != 0 { return WRC_Abort } return WRC_Prune } // This routine walks an expression tree and resolves references to // table columns and result-set columns. At the same time, do error // checking on function usage and set a flag if any aggregate functions // are seen. // // To resolve table columns references we look for nodes (or subtrees) of the // form X.Y.Z or Y.Z or just Z where // // X: The name of a database. Ex: "main" or "temp" or // the symbolic name assigned to an ATTACH-ed database. // // Y: The name of a table in a FROM clause. Or in a trigger // one of the special names "old" or "new". // // Z: The name of a column in table Y. // // The node at the root of the subtree is modified as follows: // // Expr.op Changed to TK_COLUMN // Expr.pTab Points to the Table object for X.Y // Expr.iColumn The column index in X.Y. -1 for the rowid. // Expr.iTable The VDBE cursor number for X.Y // // To resolve result-set references, look for expression nodes of the // form Z (with no X and Y prefix) where the Z matches the right-hand // size of an AS clause in the result-set of a SELECT. The Z expression // is replaced by a copy of the left-hand side of the result-set expression. // Table-name and function resolution occurs on the substituted expression // tree. For example, in: // // SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x; // // The "x" term of the order by is replaced by "a+b" to render: // // SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; // // Function calls are checked to make sure that the function is // defined and that the correct number of arguments are specified. // If the function is an aggregate function, then the NC_HasAgg flag is // set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. // If an expression contains aggregate functions then the EP_Agg // property on the expression is set. // // An error message is left in pParse if anything is amiss. The number // if errors is returned. func Xsqlite3ResolveExprNames(tls *libc.TLS, pNC uintptr, pExpr uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var savedHasAgg int32 if pExpr == uintptr(0) { return SQLITE_OK } savedHasAgg = (*NameContext)(unsafe.Pointer(pNC)).FncFlags & (NC_HasAgg | NC_MinMaxAgg | NC_HasWin | NC_OrderAgg) *(*int32)(unsafe.Pointer(pNC + 40)) &= libc.CplInt32(NC_HasAgg | NC_MinMaxAgg | NC_HasWin | NC_OrderAgg) (*Walker)(unsafe.Pointer(bp)).FpParse = (*NameContext)(unsafe.Pointer(pNC)).FpParse (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{resolveExprStep})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = func() uintptr { if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_NoSelect != 0 { return uintptr(0) } return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{resolveSelectStep})) }() (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 40)) = pNC *(*int32)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse + 316)) += (*Expr)(unsafe.Pointer(pExpr)).FnHeight if Xsqlite3ExprCheckHeight(tls, (*Walker)(unsafe.Pointer(bp)).FpParse, (*Parse)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse)).FnHeight) != 0 { return SQLITE_ERROR } Xsqlite3WalkExpr(tls, bp, pExpr) *(*int32)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse + 316)) -= (*Expr)(unsafe.Pointer(pExpr)).FnHeight *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32((*NameContext)(unsafe.Pointer(pNC)).FncFlags & (NC_HasAgg | NC_HasWin)) *(*int32)(unsafe.Pointer(pNC + 40)) |= savedHasAgg return libc.Bool32((*NameContext)(unsafe.Pointer(pNC)).FnNcErr > 0 || (*Parse)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse)).FnErr > 0) } // Resolve all names for all expression in an expression list. This is // just like sqlite3ResolveExprNames() except that it works for an expression // list rather than a single expression. func Xsqlite3ResolveExprListNames(tls *libc.TLS, pNC uintptr, pList uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var i int32 var savedHasAgg int32 = 0 if pList == uintptr(0) { return WRC_Continue } (*Walker)(unsafe.Pointer(bp)).FpParse = (*NameContext)(unsafe.Pointer(pNC)).FpParse (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{resolveExprStep})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{resolveSelectStep})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 40)) = pNC savedHasAgg = (*NameContext)(unsafe.Pointer(pNC)).FncFlags & (NC_HasAgg | NC_MinMaxAgg | NC_HasWin | NC_OrderAgg) *(*int32)(unsafe.Pointer(pNC + 40)) &= libc.CplInt32(NC_HasAgg | NC_MinMaxAgg | NC_HasWin | NC_OrderAgg) for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { var pExpr uintptr = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(i)*32)).FpExpr if pExpr == uintptr(0) { continue } *(*int32)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse + 316)) += (*Expr)(unsafe.Pointer(pExpr)).FnHeight if Xsqlite3ExprCheckHeight(tls, (*Walker)(unsafe.Pointer(bp)).FpParse, (*Parse)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse)).FnHeight) != 0 { return WRC_Abort } Xsqlite3WalkExpr(tls, bp, pExpr) *(*int32)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse + 316)) -= (*Expr)(unsafe.Pointer(pExpr)).FnHeight if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg) != 0 { *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32((*NameContext)(unsafe.Pointer(pNC)).FncFlags & (NC_HasAgg | NC_HasWin)) savedHasAgg = savedHasAgg | (*NameContext)(unsafe.Pointer(pNC)).FncFlags&(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg) *(*int32)(unsafe.Pointer(pNC + 40)) &= libc.CplInt32(NC_HasAgg | NC_MinMaxAgg | NC_HasWin | NC_OrderAgg) } if (*Parse)(unsafe.Pointer((*Walker)(unsafe.Pointer(bp)).FpParse)).FnErr > 0 { return WRC_Abort } } *(*int32)(unsafe.Pointer(pNC + 40)) |= savedHasAgg return WRC_Continue } // Resolve all names in all expressions of a SELECT and in all // decendents of the SELECT, including compounds off of p->pPrior, // subqueries in expressions, and subqueries used as FROM clause // terms. // // See sqlite3ResolveExprNames() for a description of the kinds of // transformations that occur. // // All SELECT statements should have been expanded using // sqlite3SelectExpand() prior to invoking this routine. func Xsqlite3ResolveSelectNames(tls *libc.TLS, pParse uintptr, p uintptr, pOuterNC uintptr) { bp := tls.Alloc(48) defer tls.Free(48) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{resolveExprStep})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{resolveSelectStep})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = uintptr(0) (*Walker)(unsafe.Pointer(bp)).FpParse = pParse *(*uintptr)(unsafe.Pointer(bp + 40)) = pOuterNC Xsqlite3WalkSelect(tls, bp, p) } // Resolve names in expressions that can only reference a single table // or which cannot reference any tables at all. Examples: // // "type" flag // ------------ // (1) CHECK constraints NC_IsCheck // (2) WHERE clauses on partial indices NC_PartIdx // (3) Expressions in indexes on expressions NC_IdxExpr // (4) Expression arguments to VACUUM INTO. 0 // (5) GENERATED ALWAYS as expressions NC_GenCol // // In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN // nodes of the expression is set to -1 and the Expr.iColumn value is // set to the column number. In case (4), TK_COLUMN nodes cause an error. // // Any errors cause an error message to be set in pParse. func Xsqlite3ResolveSelfReference(tls *libc.TLS, pParse uintptr, pTab uintptr, type1 int32, pExpr uintptr, pList uintptr) int32 { bp := tls.Alloc(168) defer tls.Free(168) var rc int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) libc.Xmemset(tls, bp+56, 0, uint64(unsafe.Sizeof(SrcList{}))) if pTab != 0 { (*SrcList)(unsafe.Pointer(bp + 56)).FnSrc = 1 (*SrcItem)(unsafe.Pointer(bp + 56 + 8)).FzName = (*Table)(unsafe.Pointer(pTab)).FzName (*SrcItem)(unsafe.Pointer(bp + 56 + 8)).FpTab = pTab (*SrcItem)(unsafe.Pointer(bp + 56 + 8)).FiCursor = -1 if (*Table)(unsafe.Pointer(pTab)).FpSchema != (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb+1*32)).FpSchema { type1 = type1 | NC_FromDDL } } (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp)).FpSrcList = bp + 56 (*NameContext)(unsafe.Pointer(bp)).FncFlags = type1 | NC_IsDDL if libc.AssignInt32(&rc, Xsqlite3ResolveExprNames(tls, bp, pExpr)) != SQLITE_OK { return rc } if pList != 0 { rc = Xsqlite3ResolveExprListNames(tls, bp, pList) } return rc } // Return the affinity character for a single column of a table. func Xsqlite3TableColumnAffinity(tls *libc.TLS, pTab uintptr, iCol int32) int8 { if iCol < 0 || iCol >= int32((*Table)(unsafe.Pointer(pTab)).FnCol) { return int8(SQLITE_AFF_INTEGER) } return (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24)).Faffinity } // Return the 'affinity' of the expression pExpr if any. // // If pExpr is a column, a reference to a column via an 'AS' alias, // or a sub-select with a column as the return value, then the // affinity of that column is returned. Otherwise, 0x00 is returned, // indicating no affinity for the expression. // // i.e. the WHERE clause expressions in the following statements all // have an affinity: // // CREATE TABLE t1(a); // SELECT * FROM t1 WHERE a; // SELECT a AS b FROM t1 WHERE b; // SELECT * FROM t1 WHERE (select a from t1); func Xsqlite3ExprAffinity(tls *libc.TLS, pExpr uintptr) int8 { var op int32 op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) for 1 != 0 { if op == TK_COLUMN || op == TK_AGG_COLUMN && *(*uintptr)(unsafe.Pointer(pExpr + 64)) != uintptr(0) { return Xsqlite3TableColumnAffinity(tls, *(*uintptr)(unsafe.Pointer(pExpr + 64)), int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn)) } if op == TK_SELECT { return Xsqlite3ExprAffinity(tls, (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FpEList+8)).FpExpr) } if op == TK_CAST { return Xsqlite3AffinityType(tls, *(*uintptr)(unsafe.Pointer(pExpr + 8)), uintptr(0)) } if op == TK_SELECT_COLUMN { return Xsqlite3ExprAffinity(tls, (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft + 32)))).FpEList+8+uintptr((*Expr)(unsafe.Pointer(pExpr)).FiColumn)*32)).FpExpr) } if op == TK_VECTOR { return Xsqlite3ExprAffinity(tls, (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32))+8)).FpExpr) } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Skip|EP_IfNullRow) != U32(0) { pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) continue } if op != TK_REGISTER || libc.AssignInt32(&op, int32((*Expr)(unsafe.Pointer(pExpr)).Fop2)) == TK_REGISTER { break } } return (*Expr)(unsafe.Pointer(pExpr)).FaffExpr } // Make a guess at all the possible datatypes of the result that could // be returned by an expression. Return a bitmask indicating the answer: // // 0x01 Numeric // 0x02 Text // 0x04 Blob // // If the expression must return NULL, then 0x00 is returned. func Xsqlite3ExprDataType(tls *libc.TLS, pExpr uintptr) int32 { for pExpr != 0 { switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { case TK_COLLATE: fallthrough case TK_IF_NULL_ROW: fallthrough case TK_UPLUS: { pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft break } case TK_NULL: { pExpr = uintptr(0) break } case TK_STRING: { return 0x02 } case TK_BLOB: { return 0x04 } case TK_CONCAT: { return 0x06 } case TK_VARIABLE: fallthrough case TK_AGG_FUNCTION: fallthrough case TK_FUNCTION: { return 0x07 } case TK_COLUMN: fallthrough case TK_AGG_COLUMN: fallthrough case TK_SELECT: fallthrough case TK_CAST: fallthrough case TK_SELECT_COLUMN: fallthrough case TK_VECTOR: { var aff int32 = int32(Xsqlite3ExprAffinity(tls, pExpr)) if aff >= SQLITE_AFF_NUMERIC { return 0x05 } if aff == SQLITE_AFF_TEXT { return 0x06 } return 0x07 } case TK_CASE: { var res int32 = 0 var ii int32 var pList uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 32)) for ii = 1; ii < (*ExprList)(unsafe.Pointer(pList)).FnExpr; ii = ii + 2 { res = res | Xsqlite3ExprDataType(tls, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(ii)*32)).FpExpr) } if (*ExprList)(unsafe.Pointer(pList)).FnExpr%2 != 0 { res = res | Xsqlite3ExprDataType(tls, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr((*ExprList)(unsafe.Pointer(pList)).FnExpr-1)*32)).FpExpr) } return res } default: { return 0x01 } } } return 0x00 } // Set the collating sequence for expression pExpr to be the collating // sequence named by pToken. Return a pointer to a new Expr node that // implements the COLLATE operator. // // If a memory allocation error occurs, that fact is recorded in pParse->db // and the pExpr parameter is returned unchanged. func Xsqlite3ExprAddCollateToken(tls *libc.TLS, pParse uintptr, pExpr uintptr, pCollName uintptr, dequote int32) uintptr { if (*Token)(unsafe.Pointer(pCollName)).Fn > uint32(0) { var pNew uintptr = Xsqlite3ExprAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_COLLATE, pCollName, dequote) if pNew != 0 { (*Expr)(unsafe.Pointer(pNew)).FpLeft = pExpr *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_Collate | EP_Skip) pExpr = pNew } } return pExpr } func Xsqlite3ExprAddCollateString(tls *libc.TLS, pParse uintptr, pExpr uintptr, zC uintptr) uintptr { bp := tls.Alloc(16) defer tls.Free(16) Xsqlite3TokenInit(tls, bp, zC) return Xsqlite3ExprAddCollateToken(tls, pParse, pExpr, bp, 0) } // Skip over any TK_COLLATE operators. func Xsqlite3ExprSkipCollate(tls *libc.TLS, pExpr uintptr) uintptr { for pExpr != 0 && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Skip) != U32(0) { pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft } return pExpr } // Skip over any TK_COLLATE operators and/or any unlikely() // or likelihood() or likely() functions at the root of an // expression. func Xsqlite3ExprSkipCollateAndLikely(tls *libc.TLS, pExpr uintptr) uintptr { for pExpr != 0 && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Skip|EP_Unlikely) != U32(0) { if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Unlikely) != U32(0) { pExpr = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)) + 8)).FpExpr } else { pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft } } return pExpr } // Return the collation sequence for the expression pExpr. If // there is no defined collating sequence, return NULL. // // See also: sqlite3ExprNNCollSeq() // // The sqlite3ExprNNCollSeq() works the same exact that it returns the // default collation if pExpr has no defined collation. // // The collating sequence might be determined by a COLLATE operator // or by the presence of a column with a defined collating sequence. // COLLATE operators take first precedence. Left operands take // precedence over right operands. func Xsqlite3ExprCollSeq(tls *libc.TLS, pParse uintptr, pExpr uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pColl uintptr = uintptr(0) var p uintptr = pExpr for p != 0 { var op int32 = int32((*Expr)(unsafe.Pointer(p)).Fop) if op == TK_REGISTER { op = int32((*Expr)(unsafe.Pointer(p)).Fop2) } if op == TK_AGG_COLUMN && *(*uintptr)(unsafe.Pointer(p + 64)) != uintptr(0) || op == TK_COLUMN || op == TK_TRIGGER { var j int32 if libc.AssignInt32(&j, int32((*Expr)(unsafe.Pointer(p)).FiColumn)) >= 0 { var zColl uintptr = Xsqlite3ColumnColl(tls, (*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64)))).FaCol+uintptr(j)*24) pColl = Xsqlite3FindCollSeq(tls, db, (*Sqlite3)(unsafe.Pointer(db)).Fenc, zColl, 0) } break } if op == TK_CAST || op == TK_UPLUS { p = (*Expr)(unsafe.Pointer(p)).FpLeft continue } if op == TK_VECTOR { p = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32)) + 8)).FpExpr continue } if op == TK_COLLATE { pColl = Xsqlite3GetCollSeq(tls, pParse, (*Sqlite3)(unsafe.Pointer(db)).Fenc, uintptr(0), *(*uintptr)(unsafe.Pointer(p + 8))) break } if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_Collate) != 0 { if (*Expr)(unsafe.Pointer(p)).FpLeft != 0 && (*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(p)).FpLeft)).Fflags&U32(EP_Collate) != U32(0) { p = (*Expr)(unsafe.Pointer(p)).FpLeft } else { var pNext uintptr = (*Expr)(unsafe.Pointer(p)).FpRight if *(*uintptr)(unsafe.Pointer(p + 32)) != uintptr(0) && !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32)))).FnExpr; i++ { if (*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32))+8+uintptr(i)*32)).FpExpr)).Fflags&U32(EP_Collate) != U32(0) { pNext = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32)) + 8 + uintptr(i)*32)).FpExpr break } } } p = pNext } } else { break } } if Xsqlite3CheckCollSeq(tls, pParse, pColl) != 0 { pColl = uintptr(0) } return pColl } // Return the collation sequence for the expression pExpr. If // there is no defined collating sequence, return a pointer to the // defautl collation sequence. // // See also: sqlite3ExprCollSeq() // // The sqlite3ExprCollSeq() routine works the same except that it // returns NULL if there is no defined collation. func Xsqlite3ExprNNCollSeq(tls *libc.TLS, pParse uintptr, pExpr uintptr) uintptr { var p uintptr = Xsqlite3ExprCollSeq(tls, pParse, pExpr) if p == uintptr(0) { p = (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FpDfltColl } return p } // Return TRUE if the two expressions have equivalent collating sequences. func Xsqlite3ExprCollSeqMatch(tls *libc.TLS, pParse uintptr, pE1 uintptr, pE2 uintptr) int32 { var pColl1 uintptr = Xsqlite3ExprNNCollSeq(tls, pParse, pE1) var pColl2 uintptr = Xsqlite3ExprNNCollSeq(tls, pParse, pE2) return libc.Bool32(Xsqlite3StrICmp(tls, (*CollSeq)(unsafe.Pointer(pColl1)).FzName, (*CollSeq)(unsafe.Pointer(pColl2)).FzName) == 0) } // 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 Xsqlite3CompareAffinity(tls *libc.TLS, pExpr uintptr, aff2 int8) int8 { var aff1 int8 = Xsqlite3ExprAffinity(tls, pExpr) if int32(aff1) > SQLITE_AFF_NONE && int32(aff2) > SQLITE_AFF_NONE { if int32(aff1) >= SQLITE_AFF_NUMERIC || int32(aff2) >= SQLITE_AFF_NUMERIC { return int8(SQLITE_AFF_NUMERIC) } else { return int8(SQLITE_AFF_BLOB) } } else { return int8(func() int32 { if int32(aff1) <= SQLITE_AFF_NONE { return int32(aff2) } return int32(aff1) }() | SQLITE_AFF_NONE) } return int8(0) } func comparisonAffinity(tls *libc.TLS, pExpr uintptr) int8 { var aff int8 aff = Xsqlite3ExprAffinity(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) if (*Expr)(unsafe.Pointer(pExpr)).FpRight != 0 { aff = Xsqlite3CompareAffinity(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight, aff) } else if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { aff = Xsqlite3CompareAffinity(tls, (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FpEList+8)).FpExpr, aff) } else if int32(aff) == 0 { aff = int8(SQLITE_AFF_BLOB) } return aff } // 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 Xsqlite3IndexAffinityOk(tls *libc.TLS, pExpr uintptr, idx_affinity int8) int32 { var aff int8 = comparisonAffinity(tls, pExpr) if int32(aff) < SQLITE_AFF_TEXT { return 1 } if int32(aff) == SQLITE_AFF_TEXT { return libc.Bool32(int32(idx_affinity) == SQLITE_AFF_TEXT) } return libc.Bool32(int32(idx_affinity) >= SQLITE_AFF_NUMERIC) } func binaryCompareP5(tls *libc.TLS, pExpr1 uintptr, pExpr2 uintptr, jumpIfNull int32) U8 { var aff U8 = U8(Xsqlite3ExprAffinity(tls, pExpr2)) aff = U8(int32(U8(Xsqlite3CompareAffinity(tls, pExpr1, int8(aff)))) | int32(U8(jumpIfNull))) return aff } // Return a pointer to the collation sequence that should be used by // a binary comparison operator comparing pLeft and pRight. // // If the left hand expression has a collating sequence type, then it is // used. Otherwise the collation sequence for the right hand expression // is used, or the default (BINARY) if neither expression has a collating // type. // // Argument pRight (but not pLeft) may be a null pointer. In this case, // it is not considered. func Xsqlite3BinaryCompareCollSeq(tls *libc.TLS, pParse uintptr, pLeft uintptr, pRight uintptr) uintptr { var pColl uintptr if (*Expr)(unsafe.Pointer(pLeft)).Fflags&U32(EP_Collate) != 0 { pColl = Xsqlite3ExprCollSeq(tls, pParse, pLeft) } else if pRight != 0 && (*Expr)(unsafe.Pointer(pRight)).Fflags&U32(EP_Collate) != U32(0) { pColl = Xsqlite3ExprCollSeq(tls, pParse, pRight) } else { pColl = Xsqlite3ExprCollSeq(tls, pParse, pLeft) if !(pColl != 0) { pColl = Xsqlite3ExprCollSeq(tls, pParse, pRight) } } return pColl } // Expresssion p is a comparison operator. Return a collation sequence // appropriate for the comparison operator. // // This is normally just a wrapper around sqlite3BinaryCompareCollSeq(). // However, if the OP_Commuted flag is set, then the order of the operands // is reversed in the sqlite3BinaryCompareCollSeq() call so that the // correct collating sequence is found. func Xsqlite3ExprCompareCollSeq(tls *libc.TLS, pParse uintptr, p uintptr) uintptr { if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_Commuted) != U32(0) { return Xsqlite3BinaryCompareCollSeq(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpRight, (*Expr)(unsafe.Pointer(p)).FpLeft) } else { return Xsqlite3BinaryCompareCollSeq(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpLeft, (*Expr)(unsafe.Pointer(p)).FpRight) } return uintptr(0) } func codeCompare(tls *libc.TLS, pParse uintptr, pLeft uintptr, pRight uintptr, opcode int32, in1 int32, in2 int32, dest int32, jumpIfNull int32, isCommuted int32) int32 { var p5 int32 var addr int32 var p4 uintptr if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return 0 } if isCommuted != 0 { p4 = Xsqlite3BinaryCompareCollSeq(tls, pParse, pRight, pLeft) } else { p4 = Xsqlite3BinaryCompareCollSeq(tls, pParse, pLeft, pRight) } p5 = int32(binaryCompareP5(tls, pLeft, pRight, jumpIfNull)) addr = Xsqlite3VdbeAddOp4(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, opcode, in2, dest, in1, p4, -2) Xsqlite3VdbeChangeP5(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, uint16(U8(p5))) return addr } // Return true if expression pExpr is a vector, or false otherwise. // // A vector is defined as any expression that results in two or more // columns of result. Every TK_VECTOR node is an vector because the // parser will not generate a TK_VECTOR with fewer than two entries. // But a TK_SELECT might be either a vector or a scalar. It is only // considered a vector if it has two or more result columns. func Xsqlite3ExprIsVector(tls *libc.TLS, pExpr uintptr) int32 { return libc.Bool32(Xsqlite3ExprVectorSize(tls, pExpr) > 1) } // If the expression passed as the only argument is of type TK_VECTOR // return the number of expressions in the vector. Or, if the expression // is a sub-select, return the number of columns in the sub-select. For // any other type of expression, return 1. func Xsqlite3ExprVectorSize(tls *libc.TLS, pExpr uintptr) int32 { var op U8 = (*Expr)(unsafe.Pointer(pExpr)).Fop if int32(op) == TK_REGISTER { op = (*Expr)(unsafe.Pointer(pExpr)).Fop2 } if int32(op) == TK_VECTOR { return (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FnExpr } else if int32(op) == TK_SELECT { return (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FpEList)).FnExpr } else { return 1 } return int32(0) } // Return a pointer to a subexpression of pVector that is the i-th // column of the vector (numbered starting with 0). The caller must // ensure that i is within range. // // If pVector is really a scalar (and "scalar" here includes subqueries // that return a single column!) then return pVector unmodified. // // pVector retains ownership of the returned subexpression. // // If the vector is a (SELECT ...) then the expression returned is // just the expression for the i-th term of the result set, and may // not be ready for evaluation because the table cursor has not yet // been positioned. func Xsqlite3VectorFieldSubexpr(tls *libc.TLS, pVector uintptr, i int32) uintptr { if Xsqlite3ExprIsVector(tls, pVector) != 0 { if int32((*Expr)(unsafe.Pointer(pVector)).Fop) == TK_SELECT || int32((*Expr)(unsafe.Pointer(pVector)).Fop2) == TK_SELECT { return (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pVector + 32)))).FpEList + 8 + uintptr(i)*32)).FpExpr } else { return (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pVector + 32)) + 8 + uintptr(i)*32)).FpExpr } } return pVector } // Compute and return a new Expr object which when passed to // sqlite3ExprCode() will generate all necessary code to compute // the iField-th column of the vector expression pVector. // // It is ok for pVector to be a scalar (as long as iField==0). // In that case, this routine works like sqlite3ExprDup(). // // The caller owns the returned Expr object and is responsible for // ensuring that the returned value eventually gets freed. // // The caller retains ownership of pVector. If pVector is a TK_SELECT, // then the returned object will reference pVector and so pVector must remain // valid for the life of the returned object. If pVector is a TK_VECTOR // or a scalar expression, then it can be deleted as soon as this routine // returns. // // A trick to cause a TK_SELECT pVector to be deleted together with // the returned Expr object is to attach the pVector to the pRight field // of the returned TK_SELECT_COLUMN Expr object. func Xsqlite3ExprForVectorField(tls *libc.TLS, pParse uintptr, pVector uintptr, iField int32, nField int32) uintptr { var pRet uintptr if int32((*Expr)(unsafe.Pointer(pVector)).Fop) == TK_SELECT { pRet = Xsqlite3PExpr(tls, pParse, TK_SELECT_COLUMN, uintptr(0), uintptr(0)) if pRet != 0 { (*Expr)(unsafe.Pointer(pRet)).FiTable = nField (*Expr)(unsafe.Pointer(pRet)).FiColumn = YnVar(iField) (*Expr)(unsafe.Pointer(pRet)).FpLeft = pVector } } else { if int32((*Expr)(unsafe.Pointer(pVector)).Fop) == TK_VECTOR { var ppVector uintptr ppVector = *(*uintptr)(unsafe.Pointer(pVector + 32)) + 8 + uintptr(iField)*32 pVector = *(*uintptr)(unsafe.Pointer(ppVector)) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { *(*uintptr)(unsafe.Pointer(ppVector)) = uintptr(0) return pVector } } pRet = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pVector, 0) } return pRet } func exprCodeSubselect(tls *libc.TLS, pParse uintptr, pExpr uintptr) int32 { var reg int32 = 0 if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_SELECT { reg = Xsqlite3CodeSubselect(tls, pParse, pExpr) } return reg } func exprVectorRegister(tls *libc.TLS, pParse uintptr, pVector uintptr, iField int32, regSelect int32, ppExpr uintptr, pRegFree uintptr) int32 { var op U8 = (*Expr)(unsafe.Pointer(pVector)).Fop if int32(op) == TK_REGISTER { *(*uintptr)(unsafe.Pointer(ppExpr)) = Xsqlite3VectorFieldSubexpr(tls, pVector, iField) return (*Expr)(unsafe.Pointer(pVector)).FiTable + iField } if int32(op) == TK_SELECT { *(*uintptr)(unsafe.Pointer(ppExpr)) = (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pVector + 32)))).FpEList + 8 + uintptr(iField)*32)).FpExpr return regSelect + iField } if int32(op) == TK_VECTOR { *(*uintptr)(unsafe.Pointer(ppExpr)) = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pVector + 32)) + 8 + uintptr(iField)*32)).FpExpr return Xsqlite3ExprCodeTemp(tls, pParse, *(*uintptr)(unsafe.Pointer(ppExpr)), pRegFree) } return 0 } func codeVectorCompare(tls *libc.TLS, pParse uintptr, pExpr uintptr, dest int32, op U8, p5 U8) { bp := tls.Alloc(28) defer tls.Free(28) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var pLeft uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft var pRight uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpRight var nLeft int32 = Xsqlite3ExprVectorSize(tls, pLeft) var i int32 var regLeft int32 = 0 var regRight int32 = 0 var opx U8 = op var addrCmp int32 = 0 var addrDone int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var isCommuted int32 = libc.Bool32((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Commuted) != U32(0)) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } if nLeft != Xsqlite3ExprVectorSize(tls, pRight) { Xsqlite3ErrorMsg(tls, pParse, ts+7885, 0) return } if int32(op) == TK_LE { opx = U8(TK_LT) } if int32(op) == TK_GE { opx = U8(TK_GT) } if int32(op) == TK_NE { opx = U8(TK_EQ) } regLeft = exprCodeSubselect(tls, pParse, pLeft) regRight = exprCodeSubselect(tls, pParse, pRight) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, dest) for i = 0; 1 != 0; i++ { *(*int32)(unsafe.Pointer(bp + 8)) = 0 *(*int32)(unsafe.Pointer(bp + 24)) = 0 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var r1 int32 var r2 int32 if addrCmp != 0 { Xsqlite3VdbeJumpHere(tls, v, addrCmp) } r1 = exprVectorRegister(tls, pParse, pLeft, i, regLeft, bp, bp+8) r2 = exprVectorRegister(tls, pParse, pRight, i, regRight, bp+16, bp+24) addrCmp = Xsqlite3VdbeCurrentAddr(tls, v) codeCompare(tls, pParse, *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 16)), int32(opx), r1, r2, addrDone, int32(p5), isCommuted) Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 8))) Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 24))) if (int32(opx) == TK_LT || int32(opx) == TK_GT) && i < nLeft-1 { addrCmp = Xsqlite3VdbeAddOp0(tls, v, OP_ElseEq) } if int32(p5) == SQLITE_NULLEQ { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, dest) } else { Xsqlite3VdbeAddOp3(tls, v, OP_ZeroOrNull, r1, dest, r2) } if i == nLeft-1 { break } if int32(opx) == TK_EQ { Xsqlite3VdbeAddOp2(tls, v, OP_NotNull, dest, addrDone) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addrDone) if i == nLeft-2 { opx = op } } } Xsqlite3VdbeJumpHere(tls, v, addrCmp) Xsqlite3VdbeResolveLabel(tls, v, addrDone) if int32(op) == TK_NE { Xsqlite3VdbeAddOp2(tls, v, OP_Not, dest, dest) } } // Check that argument nHeight is less than or equal to the maximum // expression depth allowed. If it is not, leave an error message in // pParse. func Xsqlite3ExprCheckHeight(tls *libc.TLS, pParse uintptr, nHeight int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var mxHeight int32 = *(*int32)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb + 136 + 3*4)) if nHeight > mxHeight { Xsqlite3ErrorMsg(tls, pParse, ts+8777, libc.VaList(bp, mxHeight)) rc = SQLITE_ERROR } return rc } func heightOfExpr(tls *libc.TLS, p uintptr, pnHeight uintptr) { if p != 0 { if (*Expr)(unsafe.Pointer(p)).FnHeight > *(*int32)(unsafe.Pointer(pnHeight)) { *(*int32)(unsafe.Pointer(pnHeight)) = (*Expr)(unsafe.Pointer(p)).FnHeight } } } func heightOfExprList(tls *libc.TLS, p uintptr, pnHeight uintptr) { if p != 0 { var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(p)).FnExpr; i++ { heightOfExpr(tls, (*ExprList_item)(unsafe.Pointer(p+8+uintptr(i)*32)).FpExpr, pnHeight) } } } func heightOfSelect(tls *libc.TLS, pSelect uintptr, pnHeight uintptr) { var p uintptr for p = pSelect; p != 0; p = (*Select)(unsafe.Pointer(p)).FpPrior { heightOfExpr(tls, (*Select)(unsafe.Pointer(p)).FpWhere, pnHeight) heightOfExpr(tls, (*Select)(unsafe.Pointer(p)).FpHaving, pnHeight) heightOfExpr(tls, (*Select)(unsafe.Pointer(p)).FpLimit, pnHeight) heightOfExprList(tls, (*Select)(unsafe.Pointer(p)).FpEList, pnHeight) heightOfExprList(tls, (*Select)(unsafe.Pointer(p)).FpGroupBy, pnHeight) heightOfExprList(tls, (*Select)(unsafe.Pointer(p)).FpOrderBy, pnHeight) } } func exprSetHeight(tls *libc.TLS, p uintptr) { bp := tls.Alloc(4) defer tls.Free(4) if (*Expr)(unsafe.Pointer(p)).FpLeft != 0 { *(*int32)(unsafe.Pointer(bp)) = (*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(p)).FpLeft)).FnHeight } else { *(*int32)(unsafe.Pointer(bp)) = 0 } if (*Expr)(unsafe.Pointer(p)).FpRight != 0 && (*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(p)).FpRight)).FnHeight > *(*int32)(unsafe.Pointer(bp)) { *(*int32)(unsafe.Pointer(bp)) = (*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(p)).FpRight)).FnHeight } if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_xIsSelect) != U32(0) { heightOfSelect(tls, *(*uintptr)(unsafe.Pointer(p + 32)), bp) } else if *(*uintptr)(unsafe.Pointer(p + 32)) != 0 { heightOfExprList(tls, *(*uintptr)(unsafe.Pointer(p + 32)), bp) *(*U32)(unsafe.Pointer(p + 4)) |= U32(EP_Collate|EP_Subquery|EP_HasFunc) & Xsqlite3ExprListFlags(tls, *(*uintptr)(unsafe.Pointer(p + 32))) } (*Expr)(unsafe.Pointer(p)).FnHeight = *(*int32)(unsafe.Pointer(bp)) + 1 } // Set the Expr.nHeight variable using the exprSetHeight() function. If // the height is greater than the maximum allowed expression depth, // leave an error in pParse. // // Also propagate all EP_Propagate flags from the Expr.x.pList into // Expr.flags. func Xsqlite3ExprSetHeightAndFlags(tls *libc.TLS, pParse uintptr, p uintptr) { if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } exprSetHeight(tls, p) Xsqlite3ExprCheckHeight(tls, pParse, (*Expr)(unsafe.Pointer(p)).FnHeight) } // Return the maximum height of any expression tree referenced // by the select statement passed as an argument. func Xsqlite3SelectExprHeight(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = 0 heightOfSelect(tls, p, bp) return *(*int32)(unsafe.Pointer(bp)) } // This routine is the core allocator for Expr nodes. // // Construct a new expression node and return a pointer to it. Memory // for this node and for the pToken argument is a single allocation // obtained from sqlite3DbMalloc(). The calling function // is responsible for making sure the node eventually gets freed. // // If dequote is true, then the token (if it exists) is dequoted. // If dequote is false, no dequoting is performed. The deQuote // parameter is ignored if pToken is NULL or if the token does not // appear to be quoted. If the quotes were of the form "..." (double-quotes) // then the EP_DblQuoted flag is set on the expression node. // // Special case: If op==TK_INTEGER and pToken points to a string that // can be translated into a 32-bit integer, then the token is not // stored in u.zToken. Instead, the integer values is written // into u.iValue and the EP_IntValue flag is set. No extra storage // is allocated to hold the integer text and the dequote flag is ignored. func Xsqlite3ExprAlloc(tls *libc.TLS, db uintptr, op int32, pToken uintptr, dequote int32) uintptr { bp := tls.Alloc(4) defer tls.Free(4) var pNew uintptr var nExtra int32 = 0 *(*int32)(unsafe.Pointer(bp)) = 0 if pToken != 0 { if op != TK_INTEGER || (*Token)(unsafe.Pointer(pToken)).Fz == uintptr(0) || Xsqlite3GetInt32(tls, (*Token)(unsafe.Pointer(pToken)).Fz, bp) == 0 { nExtra = int32((*Token)(unsafe.Pointer(pToken)).Fn + uint32(1)) } } pNew = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(Expr{}))+uint64(nExtra)) if pNew != 0 { libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(pNew)).Fop = U8(op) (*Expr)(unsafe.Pointer(pNew)).FiAgg = int16(-1) if pToken != 0 { if nExtra == 0 { *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_IntValue | EP_Leaf | func() int32 { if *(*int32)(unsafe.Pointer(bp)) != 0 { return EP_IsTrue } return EP_IsFalse }()) *(*int32)(unsafe.Pointer(pNew + 8)) = *(*int32)(unsafe.Pointer(bp)) } else { *(*uintptr)(unsafe.Pointer(pNew + 8)) = pNew + 1*72 if (*Token)(unsafe.Pointer(pToken)).Fn != 0 { libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(pNew + 8)), (*Token)(unsafe.Pointer(pToken)).Fz, uint64((*Token)(unsafe.Pointer(pToken)).Fn)) } *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNew + 8)) + uintptr((*Token)(unsafe.Pointer(pToken)).Fn))) = int8(0) if dequote != 0 && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNew + 8)))))])&0x80 != 0 { Xsqlite3DequoteExpr(tls, pNew) } } } (*Expr)(unsafe.Pointer(pNew)).FnHeight = 1 } return pNew } // Allocate a new expression node from a zero-terminated token that has // already been dequoted. func Xsqlite3Expr(tls *libc.TLS, db uintptr, op int32, zToken uintptr) uintptr { bp := tls.Alloc(16) defer tls.Free(16) (*Token)(unsafe.Pointer(bp)).Fz = zToken (*Token)(unsafe.Pointer(bp)).Fn = uint32(Xsqlite3Strlen30(tls, zToken)) return Xsqlite3ExprAlloc(tls, db, op, bp, 0) } // Attach subtrees pLeft and pRight to the Expr node pRoot. // // If pRoot==NULL that means that a memory allocation error has occurred. // In that case, delete the subtrees pLeft and pRight. func Xsqlite3ExprAttachSubtrees(tls *libc.TLS, db uintptr, pRoot uintptr, pLeft uintptr, pRight uintptr) { if pRoot == uintptr(0) { Xsqlite3ExprDelete(tls, db, pLeft) Xsqlite3ExprDelete(tls, db, pRight) } else { if pRight != 0 { (*Expr)(unsafe.Pointer(pRoot)).FpRight = pRight *(*U32)(unsafe.Pointer(pRoot + 4)) |= U32(EP_Collate|EP_Subquery|EP_HasFunc) & (*Expr)(unsafe.Pointer(pRight)).Fflags (*Expr)(unsafe.Pointer(pRoot)).FnHeight = (*Expr)(unsafe.Pointer(pRight)).FnHeight + 1 } else { (*Expr)(unsafe.Pointer(pRoot)).FnHeight = 1 } if pLeft != 0 { (*Expr)(unsafe.Pointer(pRoot)).FpLeft = pLeft *(*U32)(unsafe.Pointer(pRoot + 4)) |= U32(EP_Collate|EP_Subquery|EP_HasFunc) & (*Expr)(unsafe.Pointer(pLeft)).Fflags if (*Expr)(unsafe.Pointer(pLeft)).FnHeight >= (*Expr)(unsafe.Pointer(pRoot)).FnHeight { (*Expr)(unsafe.Pointer(pRoot)).FnHeight = (*Expr)(unsafe.Pointer(pLeft)).FnHeight + 1 } } } } // Allocate an Expr node which joins as many as two subtrees. // // One or both of the subtrees can be NULL. Return a pointer to the new // Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed, // free the subtrees and return NULL. func Xsqlite3PExpr(tls *libc.TLS, pParse uintptr, op int32, pLeft uintptr, pRight uintptr) uintptr { var p uintptr p = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Expr{}))) if p != 0 { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(p)).Fop = U8(op & 0xff) (*Expr)(unsafe.Pointer(p)).FiAgg = int16(-1) Xsqlite3ExprAttachSubtrees(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, p, pLeft, pRight) Xsqlite3ExprCheckHeight(tls, pParse, (*Expr)(unsafe.Pointer(p)).FnHeight) } else { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pLeft) Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pRight) } return p } // Add pSelect to the Expr.x.pSelect field. Or, if pExpr is NULL (due // do a memory allocation failure) then delete the pSelect object. func Xsqlite3PExprAddSelect(tls *libc.TLS, pParse uintptr, pExpr uintptr, pSelect uintptr) { if pExpr != 0 { *(*uintptr)(unsafe.Pointer(pExpr + 32)) = pSelect *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_xIsSelect | EP_Subquery) Xsqlite3ExprSetHeightAndFlags(tls, pParse, pExpr) } else { Xsqlite3SelectDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pSelect) } } // Expression list pEList is a list of vector values. This function // converts the contents of pEList to a VALUES(...) Select statement // returning 1 row for each element of the list. For example, the // expression list: // // ( (1,2), (3,4) (5,6) ) // // is translated to the equivalent of: // // VALUES(1,2), (3,4), (5,6) // // Each of the vector values in pEList must contain exactly nElem terms. // If a list element that is not a vector or does not contain nElem terms, // an error message is left in pParse. // // This is used as part of processing IN(...) expressions with a list // of vectors on the RHS. e.g. "... IN ((1,2), (3,4), (5,6))". func Xsqlite3ExprListToValues(tls *libc.TLS, pParse uintptr, nElem int32, pEList uintptr) uintptr { bp := tls.Alloc(24) defer tls.Free(24) var ii int32 var pRet uintptr = uintptr(0) for ii = 0; ii < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; ii++ { var pSel uintptr var pExpr uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(ii)*32)).FpExpr var nExprElem int32 if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_VECTOR { nExprElem = (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FnExpr } else { nExprElem = 1 } if nExprElem != nElem { Xsqlite3ErrorMsg(tls, pParse, ts+8825, libc.VaList(bp, nExprElem, func() uintptr { if nExprElem > 1 { return ts + 8869 } return ts + 1544 }(), nElem)) break } pSel = Xsqlite3SelectNew(tls, pParse, *(*uintptr)(unsafe.Pointer(pExpr + 32)), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(SF_Values), uintptr(0)) *(*uintptr)(unsafe.Pointer(pExpr + 32)) = uintptr(0) if pSel != 0 { if pRet != 0 { (*Select)(unsafe.Pointer(pSel)).Fop = U8(TK_ALL) (*Select)(unsafe.Pointer(pSel)).FpPrior = pRet } pRet = pSel } } if pRet != 0 && (*Select)(unsafe.Pointer(pRet)).FpPrior != 0 { *(*U32)(unsafe.Pointer(pRet + 4)) |= U32(SF_MultiValue) } Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pEList) return pRet } // Join two expressions using an AND operator. If either expression is // NULL, then just return the other expression. // // If one side or the other of the AND is known to be false, then instead // of returning an AND expression, just return a constant expression with // a value of false. func Xsqlite3ExprAnd(tls *libc.TLS, pParse uintptr, pLeft uintptr, pRight uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if pLeft == uintptr(0) { return pRight } else if pRight == uintptr(0) { return pLeft } else if ((*Expr)(unsafe.Pointer(pLeft)).Fflags&U32(EP_OuterON|EP_IsFalse) == U32(EP_IsFalse) || (*Expr)(unsafe.Pointer(pRight)).Fflags&U32(EP_OuterON|EP_IsFalse) == U32(EP_IsFalse)) && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { Xsqlite3ExprDeferredDelete(tls, pParse, pLeft) Xsqlite3ExprDeferredDelete(tls, pParse, pRight) return Xsqlite3Expr(tls, db, TK_INTEGER, ts+8871) } else { return Xsqlite3PExpr(tls, pParse, TK_AND, pLeft, pRight) } return uintptr(0) } // Construct a new expression node for a function with multiple // arguments. func Xsqlite3ExprFunction(tls *libc.TLS, pParse uintptr, pList uintptr, pToken uintptr, eDistinct int32) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var pNew uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb pNew = Xsqlite3ExprAlloc(tls, db, TK_FUNCTION, pToken, 1) if pNew == uintptr(0) { Xsqlite3ExprListDelete(tls, db, pList) return uintptr(0) } *(*int32)(unsafe.Pointer(pNew + 52)) = int32((int64((*Token)(unsafe.Pointer(pToken)).Fz) - int64((*Parse)(unsafe.Pointer(pParse)).FzTail)) / 1) if pList != 0 && (*ExprList)(unsafe.Pointer(pList)).FnExpr > *(*int32)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb + 136 + 6*4)) && !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0) { Xsqlite3ErrorMsg(tls, pParse, ts+8873, libc.VaList(bp, pToken)) } *(*uintptr)(unsafe.Pointer(pNew + 32)) = pList *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_HasFunc) Xsqlite3ExprSetHeightAndFlags(tls, pParse, pNew) if eDistinct == SF_Distinct { *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_Distinct) } return pNew } // Check to see if a function is usable according to current access // rules: // // SQLITE_FUNC_DIRECT - Only usable from top-level SQL // // SQLITE_FUNC_UNSAFE - Usable if TRUSTED_SCHEMA or from // top-level SQL // // If the function is not usable, create an error. func Xsqlite3ExprFunctionUsable(tls *libc.TLS, pParse uintptr, pExpr uintptr, pDef uintptr) { bp := tls.Alloc(8) defer tls.Free(8) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_FromDDL) != U32(0) { if (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_DIRECT) != U32(0) || (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_TrustedSchema) == uint64(0) { Xsqlite3ErrorMsg(tls, pParse, ts+8907, libc.VaList(bp, pExpr)) } } } // Assign a variable number to an expression that encodes a wildcard // in the original SQL statement. // // Wildcards consisting of a single "?" are assigned the next sequential // variable number. // // Wildcards of the form "?nnn" are assigned the number "nnn". We make // sure "nnn" is not too big to avoid a denial of service attack when // the SQL statement comes from an external source. // // Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number // as the previous instance of the same wildcard. Or if this is the first // instance of the wildcard, the next sequential variable number is // assigned. func Xsqlite3ExprAssignVarNumber(tls *libc.TLS, pParse uintptr, pExpr uintptr, n U32) { bp := tls.Alloc(16) defer tls.Free(16) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var z uintptr var x YnVar if pExpr == uintptr(0) { return } z = *(*uintptr)(unsafe.Pointer(pExpr + 8)) if int32(*(*int8)(unsafe.Pointer(z + 1))) == 0 { x = libc.PreIncInt16(&(*Parse)(unsafe.Pointer(pParse)).FnVar, 1) } else { var doAdd int32 = 0 if int32(*(*int8)(unsafe.Pointer(z))) == '?' { var bOk int32 if n == U32(2) { *(*I64)(unsafe.Pointer(bp + 8)) = I64(int32(*(*int8)(unsafe.Pointer(z + 1))) - '0') bOk = 1 } else { bOk = libc.Bool32(0 == Xsqlite3Atoi64(tls, z+1, bp+8, int32(n-U32(1)), uint8(SQLITE_UTF8))) } if bOk == 0 || *(*I64)(unsafe.Pointer(bp + 8)) < int64(1) || *(*I64)(unsafe.Pointer(bp + 8)) > I64(*(*int32)(unsafe.Pointer(db + 136 + 9*4))) { Xsqlite3ErrorMsg(tls, pParse, ts+8927, libc.VaList(bp, *(*int32)(unsafe.Pointer(db + 136 + 9*4)))) Xsqlite3RecordErrorOffsetOfExpr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) return } x = YnVar(*(*I64)(unsafe.Pointer(bp + 8))) if int32(x) > int32((*Parse)(unsafe.Pointer(pParse)).FnVar) { (*Parse)(unsafe.Pointer(pParse)).FnVar = YnVar(int32(x)) doAdd = 1 } else if Xsqlite3VListNumToName(tls, (*Parse)(unsafe.Pointer(pParse)).FpVList, int32(x)) == uintptr(0) { doAdd = 1 } } else { x = YnVar(Xsqlite3VListNameToNum(tls, (*Parse)(unsafe.Pointer(pParse)).FpVList, z, int32(n))) if int32(x) == 0 { x = libc.PreIncInt16(&(*Parse)(unsafe.Pointer(pParse)).FnVar, 1) doAdd = 1 } } if doAdd != 0 { (*Parse)(unsafe.Pointer(pParse)).FpVList = Xsqlite3VListAdd(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpVList, z, int32(n), int32(x)) } } (*Expr)(unsafe.Pointer(pExpr)).FiColumn = x if int32(x) > *(*int32)(unsafe.Pointer(db + 136 + 9*4)) { Xsqlite3ErrorMsg(tls, pParse, ts+8970, 0) Xsqlite3RecordErrorOffsetOfExpr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) } } func sqlite3ExprDeleteNN(tls *libc.TLS, db uintptr, p uintptr) { if !((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_TokenOnly|EP_Leaf) != U32(0)) { if (*Expr)(unsafe.Pointer(p)).FpLeft != 0 && int32((*Expr)(unsafe.Pointer(p)).Fop) != TK_SELECT_COLUMN { sqlite3ExprDeleteNN(tls, db, (*Expr)(unsafe.Pointer(p)).FpLeft) } if (*Expr)(unsafe.Pointer(p)).FpRight != 0 { sqlite3ExprDeleteNN(tls, db, (*Expr)(unsafe.Pointer(p)).FpRight) } else if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_xIsSelect) != U32(0) { Xsqlite3SelectDelete(tls, db, *(*uintptr)(unsafe.Pointer(p + 32))) } else { Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(p + 32))) if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_WinFunc) != U32(0) { Xsqlite3WindowDelete(tls, db, *(*uintptr)(unsafe.Pointer(p + 64))) } } } if !((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_Static) != U32(0)) { Xsqlite3DbNNFreeNN(tls, db, p) } } func Xsqlite3ExprDelete(tls *libc.TLS, db uintptr, p uintptr) { if p != 0 { sqlite3ExprDeleteNN(tls, db, p) } } // Clear both elements of an OnOrUsing object func Xsqlite3ClearOnOrUsing(tls *libc.TLS, db uintptr, p uintptr) { if p == uintptr(0) { } else if (*OnOrUsing)(unsafe.Pointer(p)).FpOn != 0 { sqlite3ExprDeleteNN(tls, db, (*OnOrUsing)(unsafe.Pointer(p)).FpOn) } else if (*OnOrUsing)(unsafe.Pointer(p)).FpUsing != 0 { Xsqlite3IdListDelete(tls, db, (*OnOrUsing)(unsafe.Pointer(p)).FpUsing) } } // Arrange to cause pExpr to be deleted when the pParse is deleted. // This is similar to sqlite3ExprDelete() except that the delete is // deferred untilthe pParse is deleted. // // The pExpr might be deleted immediately on an OOM error. // // The deferred delete is (currently) implemented by adding the // pExpr to the pParse->pConstExpr list with a register number of 0. func Xsqlite3ExprDeferredDelete(tls *libc.TLS, pParse uintptr, pExpr uintptr) { Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3ExprDelete})), pExpr) } // Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the // expression. func Xsqlite3ExprUnmapAndDelete(tls *libc.TLS, pParse uintptr, p uintptr) { if p != 0 { if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameExprUnmap(tls, pParse, p) } sqlite3ExprDeleteNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, p) } } func exprStructSize(tls *libc.TLS, p uintptr) int32 { if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_TokenOnly) != U32(0) { return int32(uintptr(0) + 16) } if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_Reduced) != U32(0) { return int32(uintptr(0) + 44) } return int32(unsafe.Sizeof(Expr{})) } func dupedExprStructSize(tls *libc.TLS, p uintptr, flags int32) int32 { var nSize int32 if 0 == flags || int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_SELECT_COLUMN || (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_WinFunc) != U32(0) { nSize = int32(unsafe.Sizeof(Expr{})) } else { if (*Expr)(unsafe.Pointer(p)).FpLeft != 0 || *(*uintptr)(unsafe.Pointer(p + 32)) != 0 { nSize = int32(uint64(uintptr(0)+44) | uint64(EP_Reduced)) } else { nSize = int32(uint64(uintptr(0)+16) | uint64(EP_TokenOnly)) } } return nSize } func dupedExprNodeSize(tls *libc.TLS, p uintptr, flags int32) int32 { var nByte int32 = dupedExprStructSize(tls, p, flags) & 0xfff if !((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_IntValue) != U32(0)) && *(*uintptr)(unsafe.Pointer(p + 8)) != 0 { nByte = int32(Size_t(nByte) + (libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(p + 8)))&uint64(0x3fffffff) + uint64(1))) } return (nByte + 7) & libc.CplInt32(7) } func dupedExprSize(tls *libc.TLS, p uintptr, flags int32) int32 { var nByte int32 = 0 if p != 0 { nByte = dupedExprNodeSize(tls, p, flags) if flags&EXPRDUP_REDUCE != 0 { nByte = nByte + (dupedExprSize(tls, (*Expr)(unsafe.Pointer(p)).FpLeft, flags) + dupedExprSize(tls, (*Expr)(unsafe.Pointer(p)).FpRight, flags)) } } return nByte } func exprDup(tls *libc.TLS, db uintptr, p uintptr, dupFlags int32, pzBuffer uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var pNew uintptr var staticFlag U32 if pzBuffer != 0 { *(*uintptr)(unsafe.Pointer(bp)) = *(*uintptr)(unsafe.Pointer(pzBuffer)) staticFlag = U32(EP_Static) } else { *(*uintptr)(unsafe.Pointer(bp)) = Xsqlite3DbMallocRawNN(tls, db, uint64(dupedExprSize(tls, p, dupFlags))) staticFlag = U32(0) } pNew = *(*uintptr)(unsafe.Pointer(bp)) if pNew != 0 { var nStructSize uint32 = uint32(dupedExprStructSize(tls, p, dupFlags)) var nNewSize int32 = int32(nStructSize & uint32(0xfff)) var nToken int32 if !((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_IntValue) != U32(0)) && *(*uintptr)(unsafe.Pointer(p + 8)) != 0 { nToken = Xsqlite3Strlen30(tls, *(*uintptr)(unsafe.Pointer(p + 8))) + 1 } else { nToken = 0 } if dupFlags != 0 { libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp)), p, uint64(nNewSize)) } else { var nSize U32 = U32(exprStructSize(tls, p)) libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp)), p, uint64(nSize)) if uint64(nSize) < uint64(unsafe.Sizeof(Expr{})) { libc.Xmemset(tls, *(*uintptr)(unsafe.Pointer(bp))+uintptr(nSize), 0, uint64(unsafe.Sizeof(Expr{}))-uint64(nSize)) } } *(*U32)(unsafe.Pointer(pNew + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_Reduced | EP_TokenOnly | EP_Static)) *(*U32)(unsafe.Pointer(pNew + 4)) |= nStructSize & uint32(EP_Reduced|EP_TokenOnly) *(*U32)(unsafe.Pointer(pNew + 4)) |= staticFlag if dupFlags != 0 { } if nToken != 0 { var zToken uintptr = libc.AssignPtrUintptr(pNew+8, *(*uintptr)(unsafe.Pointer(bp))+uintptr(nNewSize)) libc.Xmemcpy(tls, zToken, *(*uintptr)(unsafe.Pointer(p + 8)), uint64(nToken)) } if U32(0) == ((*Expr)(unsafe.Pointer(p)).Fflags|(*Expr)(unsafe.Pointer(pNew)).Fflags)&U32(EP_TokenOnly|EP_Leaf) { if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_xIsSelect) != U32(0) { *(*uintptr)(unsafe.Pointer(pNew + 32)) = Xsqlite3SelectDup(tls, db, *(*uintptr)(unsafe.Pointer(p + 32)), dupFlags) } else { *(*uintptr)(unsafe.Pointer(pNew + 32)) = Xsqlite3ExprListDup(tls, db, *(*uintptr)(unsafe.Pointer(p + 32)), dupFlags) } } if (*Expr)(unsafe.Pointer(pNew)).Fflags&U32(EP_Reduced|EP_TokenOnly|EP_WinFunc) != U32(0) { *(*uintptr)(unsafe.Pointer(bp)) += uintptr(dupedExprNodeSize(tls, p, dupFlags)) if !((*Expr)(unsafe.Pointer(pNew)).Fflags&U32(EP_TokenOnly|EP_Leaf) != U32(0)) { (*Expr)(unsafe.Pointer(pNew)).FpLeft = func() uintptr { if (*Expr)(unsafe.Pointer(p)).FpLeft != 0 { return exprDup(tls, db, (*Expr)(unsafe.Pointer(p)).FpLeft, EXPRDUP_REDUCE, bp) } return uintptr(0) }() (*Expr)(unsafe.Pointer(pNew)).FpRight = func() uintptr { if (*Expr)(unsafe.Pointer(p)).FpRight != 0 { return exprDup(tls, db, (*Expr)(unsafe.Pointer(p)).FpRight, EXPRDUP_REDUCE, bp) } return uintptr(0) }() } if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_WinFunc) != U32(0) { *(*uintptr)(unsafe.Pointer(pNew + 64)) = Xsqlite3WindowDup(tls, db, pNew, *(*uintptr)(unsafe.Pointer(p + 64))) } if pzBuffer != 0 { *(*uintptr)(unsafe.Pointer(pzBuffer)) = *(*uintptr)(unsafe.Pointer(bp)) } } else { if !((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_TokenOnly|EP_Leaf) != U32(0)) { if int32((*Expr)(unsafe.Pointer(pNew)).Fop) == TK_SELECT_COLUMN { (*Expr)(unsafe.Pointer(pNew)).FpLeft = (*Expr)(unsafe.Pointer(p)).FpLeft } else { (*Expr)(unsafe.Pointer(pNew)).FpLeft = Xsqlite3ExprDup(tls, db, (*Expr)(unsafe.Pointer(p)).FpLeft, 0) } (*Expr)(unsafe.Pointer(pNew)).FpRight = Xsqlite3ExprDup(tls, db, (*Expr)(unsafe.Pointer(p)).FpRight, 0) } } } return pNew } // Create and return a deep copy of the object passed as the second // argument. If an OOM condition is encountered, NULL is returned // and the db->mallocFailed flag set. func Xsqlite3WithDup(tls *libc.TLS, db uintptr, p uintptr) uintptr { var pRet uintptr = uintptr(0) if p != 0 { var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(With{})) + uint64(unsafe.Sizeof(Cte{}))*uint64((*With)(unsafe.Pointer(p)).FnCte-1)) pRet = Xsqlite3DbMallocZero(tls, db, uint64(nByte)) if pRet != 0 { var i int32 (*With)(unsafe.Pointer(pRet)).FnCte = (*With)(unsafe.Pointer(p)).FnCte for i = 0; i < (*With)(unsafe.Pointer(p)).FnCte; i++ { (*Cte)(unsafe.Pointer(pRet + 16 + uintptr(i)*48)).FpSelect = Xsqlite3SelectDup(tls, db, (*Cte)(unsafe.Pointer(p+16+uintptr(i)*48)).FpSelect, 0) (*Cte)(unsafe.Pointer(pRet + 16 + uintptr(i)*48)).FpCols = Xsqlite3ExprListDup(tls, db, (*Cte)(unsafe.Pointer(p+16+uintptr(i)*48)).FpCols, 0) (*Cte)(unsafe.Pointer(pRet + 16 + uintptr(i)*48)).FzName = Xsqlite3DbStrDup(tls, db, (*Cte)(unsafe.Pointer(p+16+uintptr(i)*48)).FzName) (*Cte)(unsafe.Pointer(pRet + 16 + uintptr(i)*48)).FeM10d = (*Cte)(unsafe.Pointer(p + 16 + uintptr(i)*48)).FeM10d } } } return pRet } func gatherSelectWindowsCallback(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_FUNCTION && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { var pSelect uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pWin uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 64)) Xsqlite3WindowLink(tls, pSelect, pWin) } return WRC_Continue } func gatherSelectWindowsSelectCallback(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { if p == *(*uintptr)(unsafe.Pointer(pWalker + 40)) { return WRC_Continue } return WRC_Prune } func gatherSelectWindows(tls *libc.TLS, p uintptr) { bp := tls.Alloc(48) defer tls.Free(48) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{gatherSelectWindowsCallback})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{gatherSelectWindowsSelectCallback})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = uintptr(0) (*Walker)(unsafe.Pointer(bp)).FpParse = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 40)) = p Xsqlite3WalkSelect(tls, bp, p) } // The following group of routines make deep copies of expressions, // expression lists, ID lists, and select statements. The copies can // be deleted (by being passed to their respective ...Delete() routines) // without effecting the originals. // // The expression list, ID, and source lists return by sqlite3ExprListDup(), // sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded // by subsequent calls to sqlite*ListAppend() routines. // // Any tables that the SrcList might point to are not duplicated. // // The flags parameter contains a combination of the EXPRDUP_XXX flags. // If the EXPRDUP_REDUCE flag is set, then the structure returned is a // truncated version of the usual Expr structure that will be stored as // part of the in-memory representation of the database schema. func Xsqlite3ExprDup(tls *libc.TLS, db uintptr, p uintptr, flags int32) uintptr { if p != 0 { return exprDup(tls, db, p, flags, uintptr(0)) } return uintptr(0) } func Xsqlite3ExprListDup(tls *libc.TLS, db uintptr, p uintptr, flags int32) uintptr { var pNew uintptr var pItem uintptr var pOldItem uintptr var i int32 var pPriorSelectColOld uintptr = uintptr(0) var pPriorSelectColNew uintptr = uintptr(0) if p == uintptr(0) { return uintptr(0) } pNew = Xsqlite3DbMallocRawNN(tls, db, uint64(Xsqlite3DbMallocSize(tls, db, p))) if pNew == uintptr(0) { return uintptr(0) } (*ExprList)(unsafe.Pointer(pNew)).FnExpr = (*ExprList)(unsafe.Pointer(p)).FnExpr (*ExprList)(unsafe.Pointer(pNew)).FnAlloc = (*ExprList)(unsafe.Pointer(p)).FnAlloc pItem = pNew + 8 pOldItem = p + 8 i = 0 __1: if !(i < (*ExprList)(unsafe.Pointer(p)).FnExpr) { goto __3 } { var pOldExpr uintptr = (*ExprList_item)(unsafe.Pointer(pOldItem)).FpExpr var pNewExpr uintptr (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr = Xsqlite3ExprDup(tls, db, pOldExpr, flags) if pOldExpr != 0 && int32((*Expr)(unsafe.Pointer(pOldExpr)).Fop) == TK_SELECT_COLUMN && libc.AssignUintptr(&pNewExpr, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr) != uintptr(0) { if (*Expr)(unsafe.Pointer(pNewExpr)).FpRight != 0 { pPriorSelectColOld = (*Expr)(unsafe.Pointer(pOldExpr)).FpRight pPriorSelectColNew = (*Expr)(unsafe.Pointer(pNewExpr)).FpRight (*Expr)(unsafe.Pointer(pNewExpr)).FpLeft = (*Expr)(unsafe.Pointer(pNewExpr)).FpRight } else { if (*Expr)(unsafe.Pointer(pOldExpr)).FpLeft != pPriorSelectColOld { pPriorSelectColOld = (*Expr)(unsafe.Pointer(pOldExpr)).FpLeft pPriorSelectColNew = Xsqlite3ExprDup(tls, db, pPriorSelectColOld, flags) (*Expr)(unsafe.Pointer(pNewExpr)).FpRight = pPriorSelectColNew } (*Expr)(unsafe.Pointer(pNewExpr)).FpLeft = pPriorSelectColNew } } (*ExprList_item)(unsafe.Pointer(pItem)).FzEName = Xsqlite3DbStrDup(tls, db, (*ExprList_item)(unsafe.Pointer(pOldItem)).FzEName) (*ExprList_item)(unsafe.Pointer(pItem)).Ffg = (*ExprList_item)(unsafe.Pointer(pOldItem)).Ffg libc.SetBitFieldPtr16Uint32(pItem+16+4, uint32(0), 2, 0x4) (*ExprList_item)(unsafe.Pointer(pItem)).Fu = (*ExprList_item)(unsafe.Pointer(pOldItem)).Fu } goto __2 __2: i++ pItem += 32 pOldItem += 32 goto __1 goto __3 __3: ; return pNew } // If cursors, triggers, views and subqueries are all omitted from // the build, then none of the following routines, except for // sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes // called with a NULL argument. func Xsqlite3SrcListDup(tls *libc.TLS, db uintptr, p uintptr, flags int32) uintptr { var pNew uintptr var i int32 var nByte int32 if p == uintptr(0) { return uintptr(0) } nByte = int32(uint64(unsafe.Sizeof(SrcList{})) + func() uint64 { if (*SrcList)(unsafe.Pointer(p)).FnSrc > 0 { return uint64(unsafe.Sizeof(SrcItem{})) * uint64((*SrcList)(unsafe.Pointer(p)).FnSrc-1) } return uint64(0) }()) pNew = Xsqlite3DbMallocRawNN(tls, db, uint64(nByte)) if pNew == uintptr(0) { return uintptr(0) } (*SrcList)(unsafe.Pointer(pNew)).FnSrc = int32(libc.AssignPtrUint32(pNew+4, U32((*SrcList)(unsafe.Pointer(p)).FnSrc))) for i = 0; i < (*SrcList)(unsafe.Pointer(p)).FnSrc; i++ { var pNewItem uintptr = pNew + 8 + uintptr(i)*104 var pOldItem uintptr = p + 8 + uintptr(i)*104 var pTab uintptr (*SrcItem)(unsafe.Pointer(pNewItem)).FpSchema = (*SrcItem)(unsafe.Pointer(pOldItem)).FpSchema (*SrcItem)(unsafe.Pointer(pNewItem)).FzDatabase = Xsqlite3DbStrDup(tls, db, (*SrcItem)(unsafe.Pointer(pOldItem)).FzDatabase) (*SrcItem)(unsafe.Pointer(pNewItem)).FzName = Xsqlite3DbStrDup(tls, db, (*SrcItem)(unsafe.Pointer(pOldItem)).FzName) (*SrcItem)(unsafe.Pointer(pNewItem)).FzAlias = Xsqlite3DbStrDup(tls, db, (*SrcItem)(unsafe.Pointer(pOldItem)).FzAlias) (*SrcItem)(unsafe.Pointer(pNewItem)).Ffg = (*SrcItem)(unsafe.Pointer(pOldItem)).Ffg (*SrcItem)(unsafe.Pointer(pNewItem)).FiCursor = (*SrcItem)(unsafe.Pointer(pOldItem)).FiCursor (*SrcItem)(unsafe.Pointer(pNewItem)).FaddrFillSub = (*SrcItem)(unsafe.Pointer(pOldItem)).FaddrFillSub (*SrcItem)(unsafe.Pointer(pNewItem)).FregReturn = (*SrcItem)(unsafe.Pointer(pOldItem)).FregReturn if uint32(int32(*(*uint16)(unsafe.Pointer(pNewItem + 60 + 4))&0x2>>1)) != 0 { *(*uintptr)(unsafe.Pointer(pNewItem + 88)) = Xsqlite3DbStrDup(tls, db, *(*uintptr)(unsafe.Pointer(pOldItem + 88))) } (*SrcItem)(unsafe.Pointer(pNewItem)).Fu2 = (*SrcItem)(unsafe.Pointer(pOldItem)).Fu2 if uint32(int32(*(*uint16)(unsafe.Pointer(pNewItem + 60 + 4))&0x100>>8)) != 0 { (*CteUse)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNewItem + 96)))).FnUse++ } if uint32(int32(*(*uint16)(unsafe.Pointer(pNewItem + 60 + 4))&0x4>>2)) != 0 { *(*uintptr)(unsafe.Pointer(pNewItem + 88)) = Xsqlite3ExprListDup(tls, db, *(*uintptr)(unsafe.Pointer(pOldItem + 88)), flags) } pTab = libc.AssignPtrUintptr(pNewItem+32, (*SrcItem)(unsafe.Pointer(pOldItem)).FpTab) if pTab != 0 { (*Table)(unsafe.Pointer(pTab)).FnTabRef++ } (*SrcItem)(unsafe.Pointer(pNewItem)).FpSelect = Xsqlite3SelectDup(tls, db, (*SrcItem)(unsafe.Pointer(pOldItem)).FpSelect, flags) if uint32(int32(*(*uint16)(unsafe.Pointer(pOldItem + 60 + 4))&0x400>>10)) != 0 { *(*uintptr)(unsafe.Pointer(pNewItem + 72)) = Xsqlite3IdListDup(tls, db, *(*uintptr)(unsafe.Pointer(pOldItem + 72))) } else { *(*uintptr)(unsafe.Pointer(pNewItem + 72)) = Xsqlite3ExprDup(tls, db, *(*uintptr)(unsafe.Pointer(pOldItem + 72)), flags) } (*SrcItem)(unsafe.Pointer(pNewItem)).FcolUsed = (*SrcItem)(unsafe.Pointer(pOldItem)).FcolUsed } return pNew } func Xsqlite3IdListDup(tls *libc.TLS, db uintptr, p uintptr) uintptr { var pNew uintptr var i int32 if p == uintptr(0) { return uintptr(0) } pNew = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(IdList{}))+uint64((*IdList)(unsafe.Pointer(p)).FnId-1)*uint64(unsafe.Sizeof(IdList_item{}))) if pNew == uintptr(0) { return uintptr(0) } (*IdList)(unsafe.Pointer(pNew)).FnId = (*IdList)(unsafe.Pointer(p)).FnId (*IdList)(unsafe.Pointer(pNew)).FeU4 = (*IdList)(unsafe.Pointer(p)).FeU4 for i = 0; i < (*IdList)(unsafe.Pointer(p)).FnId; i++ { var pNewItem uintptr = pNew + 8 + uintptr(i)*16 var pOldItem uintptr = p + 8 + uintptr(i)*16 (*IdList_item)(unsafe.Pointer(pNewItem)).FzName = Xsqlite3DbStrDup(tls, db, (*IdList_item)(unsafe.Pointer(pOldItem)).FzName) (*IdList_item)(unsafe.Pointer(pNewItem)).Fu4 = (*IdList_item)(unsafe.Pointer(pOldItem)).Fu4 } return pNew } func Xsqlite3SelectDup(tls *libc.TLS, db uintptr, pDup uintptr, flags int32) uintptr { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var pNext uintptr = uintptr(0) var pp uintptr = bp var p uintptr for p = pDup; p != 0; p = (*Select)(unsafe.Pointer(p)).FpPrior { var pNew uintptr = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(Select{}))) if pNew == uintptr(0) { break } (*Select)(unsafe.Pointer(pNew)).FpEList = Xsqlite3ExprListDup(tls, db, (*Select)(unsafe.Pointer(p)).FpEList, flags) (*Select)(unsafe.Pointer(pNew)).FpSrc = Xsqlite3SrcListDup(tls, db, (*Select)(unsafe.Pointer(p)).FpSrc, flags) (*Select)(unsafe.Pointer(pNew)).FpWhere = Xsqlite3ExprDup(tls, db, (*Select)(unsafe.Pointer(p)).FpWhere, flags) (*Select)(unsafe.Pointer(pNew)).FpGroupBy = Xsqlite3ExprListDup(tls, db, (*Select)(unsafe.Pointer(p)).FpGroupBy, flags) (*Select)(unsafe.Pointer(pNew)).FpHaving = Xsqlite3ExprDup(tls, db, (*Select)(unsafe.Pointer(p)).FpHaving, flags) (*Select)(unsafe.Pointer(pNew)).FpOrderBy = Xsqlite3ExprListDup(tls, db, (*Select)(unsafe.Pointer(p)).FpOrderBy, flags) (*Select)(unsafe.Pointer(pNew)).Fop = (*Select)(unsafe.Pointer(p)).Fop (*Select)(unsafe.Pointer(pNew)).FpNext = pNext (*Select)(unsafe.Pointer(pNew)).FpPrior = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpLimit = Xsqlite3ExprDup(tls, db, (*Select)(unsafe.Pointer(p)).FpLimit, flags) (*Select)(unsafe.Pointer(pNew)).FiLimit = 0 (*Select)(unsafe.Pointer(pNew)).FiOffset = 0 (*Select)(unsafe.Pointer(pNew)).FselFlags = (*Select)(unsafe.Pointer(p)).FselFlags & libc.Uint32FromInt32(libc.CplInt32(SF_UsesEphemeral)) *(*int32)(unsafe.Pointer(pNew + 20)) = -1 *(*int32)(unsafe.Pointer(pNew + 20 + 1*4)) = -1 (*Select)(unsafe.Pointer(pNew)).FnSelectRow = (*Select)(unsafe.Pointer(p)).FnSelectRow (*Select)(unsafe.Pointer(pNew)).FpWith = Xsqlite3WithDup(tls, db, (*Select)(unsafe.Pointer(p)).FpWith) (*Select)(unsafe.Pointer(pNew)).FpWin = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpWinDefn = Xsqlite3WindowListDup(tls, db, (*Select)(unsafe.Pointer(p)).FpWinDefn) if (*Select)(unsafe.Pointer(p)).FpWin != 0 && int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 { gatherSelectWindows(tls, pNew) } (*Select)(unsafe.Pointer(pNew)).FselId = (*Select)(unsafe.Pointer(p)).FselId if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Select)(unsafe.Pointer(pNew)).FpNext = uintptr(0) Xsqlite3SelectDelete(tls, db, pNew) break } *(*uintptr)(unsafe.Pointer(pp)) = pNew pp = pNew + 80 pNext = pNew } return *(*uintptr)(unsafe.Pointer(bp)) } var zeroItem = ExprList_item{} func Xsqlite3ExprListAppendNew(tls *libc.TLS, db uintptr, pExpr uintptr) uintptr { var pItem uintptr var pList uintptr pList = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(ExprList{}))+uint64(unsafe.Sizeof(ExprList_item{}))*uint64(4)) if pList == uintptr(0) { Xsqlite3ExprDelete(tls, db, pExpr) return uintptr(0) } (*ExprList)(unsafe.Pointer(pList)).FnAlloc = 4 (*ExprList)(unsafe.Pointer(pList)).FnExpr = 1 pItem = pList + 8 *(*ExprList_item)(unsafe.Pointer(pItem)) = zeroItem (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr = pExpr return pList } func Xsqlite3ExprListAppendGrow(tls *libc.TLS, db uintptr, pList uintptr, pExpr uintptr) uintptr { var pItem uintptr var pNew uintptr *(*int32)(unsafe.Pointer(pList + 4)) *= 2 pNew = Xsqlite3DbRealloc(tls, db, pList, uint64(unsafe.Sizeof(ExprList{}))+uint64((*ExprList)(unsafe.Pointer(pList)).FnAlloc-1)*uint64(unsafe.Sizeof(ExprList_item{}))) if pNew == uintptr(0) { Xsqlite3ExprListDelete(tls, db, pList) Xsqlite3ExprDelete(tls, db, pExpr) return uintptr(0) } else { pList = pNew } pItem = pList + 8 + uintptr(libc.PostIncInt32(&(*ExprList)(unsafe.Pointer(pList)).FnExpr, 1))*32 *(*ExprList_item)(unsafe.Pointer(pItem)) = zeroItem (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr = pExpr return pList } func Xsqlite3ExprListAppend(tls *libc.TLS, pParse uintptr, pList uintptr, pExpr uintptr) uintptr { var pItem uintptr if pList == uintptr(0) { return Xsqlite3ExprListAppendNew(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) } if (*ExprList)(unsafe.Pointer(pList)).FnAlloc < (*ExprList)(unsafe.Pointer(pList)).FnExpr+1 { return Xsqlite3ExprListAppendGrow(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pList, pExpr) } pItem = pList + 8 + uintptr(libc.PostIncInt32(&(*ExprList)(unsafe.Pointer(pList)).FnExpr, 1))*32 *(*ExprList_item)(unsafe.Pointer(pItem)) = zeroItem (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr = pExpr return pList } // pColumns and pExpr form a vector assignment which is part of the SET // clause of an UPDATE statement. Like this: // // (a,b,c) = (expr1,expr2,expr3) // // Or: (a,b,c) = (SELECT x,y,z FROM ....) // // For each term of the vector assignment, append new entries to the // expression list pList. In the case of a subquery on the RHS, append // TK_SELECT_COLUMN expressions. func Xsqlite3ExprListAppendVector(tls *libc.TLS, pParse uintptr, pList uintptr, pColumns uintptr, pExpr uintptr) uintptr { bp := tls.Alloc(16) defer tls.Free(16) var db uintptr var n int32 var i int32 var iFirst int32 var pSubExpr uintptr var pFirst uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb if pList != 0 { iFirst = (*ExprList)(unsafe.Pointer(pList)).FnExpr } else { iFirst = 0 } if !(pColumns == uintptr(0)) { goto __1 } goto vector_append_error __1: ; if !(pExpr == uintptr(0)) { goto __2 } goto vector_append_error __2: ; if !(int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_SELECT && (*IdList)(unsafe.Pointer(pColumns)).FnId != libc.AssignInt32(&n, Xsqlite3ExprVectorSize(tls, pExpr))) { goto __3 } Xsqlite3ErrorMsg(tls, pParse, ts+8993, libc.VaList(bp, (*IdList)(unsafe.Pointer(pColumns)).FnId, n)) goto vector_append_error __3: ; i = 0 __4: if !(i < (*IdList)(unsafe.Pointer(pColumns)).FnId) { goto __6 } pSubExpr = Xsqlite3ExprForVectorField(tls, pParse, pExpr, i, (*IdList)(unsafe.Pointer(pColumns)).FnId) if !(pSubExpr == uintptr(0)) { goto __7 } goto __5 __7: ; pList = Xsqlite3ExprListAppend(tls, pParse, pList, pSubExpr) if !(pList != 0) { goto __8 } (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr((*ExprList)(unsafe.Pointer(pList)).FnExpr-1)*32)).FzEName = (*IdList_item)(unsafe.Pointer(pColumns + 8 + uintptr(i)*16)).FzName (*IdList_item)(unsafe.Pointer(pColumns + 8 + uintptr(i)*16)).FzName = uintptr(0) __8: ; goto __5 __5: i++ goto __4 goto __6 __6: ; if !(!(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_SELECT && pList != uintptr(0)) { goto __9 } pFirst = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(iFirst)*32)).FpExpr (*Expr)(unsafe.Pointer(pFirst)).FpRight = pExpr pExpr = uintptr(0) (*Expr)(unsafe.Pointer(pFirst)).FiTable = (*IdList)(unsafe.Pointer(pColumns)).FnId __9: ; vector_append_error: Xsqlite3ExprUnmapAndDelete(tls, pParse, pExpr) Xsqlite3IdListDelete(tls, db, pColumns) return pList } // Set the sort order for the last element on the given ExprList. func Xsqlite3ExprListSetSortOrder(tls *libc.TLS, p uintptr, iSortOrder int32, eNulls int32) { var pItem uintptr if p == uintptr(0) { return } pItem = p + 8 + uintptr((*ExprList)(unsafe.Pointer(p)).FnExpr-1)*32 if iSortOrder == -1 { iSortOrder = SQLITE_SO_ASC } (*ExprList_item)(unsafe.Pointer(pItem)).Ffg.FsortFlags = U8(iSortOrder) if eNulls != -1 { libc.SetBitFieldPtr16Uint32(pItem+16+4, uint32(1), 5, 0x20) if iSortOrder != eNulls { *(*U8)(unsafe.Pointer(pItem + 16)) |= U8(KEYINFO_ORDER_BIGNULL) } } } // Set the ExprList.a[].zEName element of the most recently added item // on the expression list. // // pList might be NULL following an OOM error. But pName should never be // NULL. If a memory allocation fails, the pParse->db->mallocFailed flag // is set. func Xsqlite3ExprListSetName(tls *libc.TLS, pParse uintptr, pList uintptr, pName uintptr, dequote int32) { if pList != 0 { var pItem uintptr pItem = pList + 8 + uintptr((*ExprList)(unsafe.Pointer(pList)).FnExpr-1)*32 (*ExprList_item)(unsafe.Pointer(pItem)).FzEName = Xsqlite3DbStrNDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Token)(unsafe.Pointer(pName)).Fz, uint64((*Token)(unsafe.Pointer(pName)).Fn)) if dequote != 0 { Xsqlite3Dequote(tls, (*ExprList_item)(unsafe.Pointer(pItem)).FzEName) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameTokenMap(tls, pParse, (*ExprList_item)(unsafe.Pointer(pItem)).FzEName, pName) } } } } // Set the ExprList.a[].zSpan element of the most recently added item // on the expression list. // // pList might be NULL following an OOM error. But pSpan should never be // NULL. If a memory allocation fails, the pParse->db->mallocFailed flag // is set. func Xsqlite3ExprListSetSpan(tls *libc.TLS, pParse uintptr, pList uintptr, zStart uintptr, zEnd uintptr) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if pList != 0 { var pItem uintptr = pList + 8 + uintptr((*ExprList)(unsafe.Pointer(pList)).FnExpr-1)*32 if (*ExprList_item)(unsafe.Pointer(pItem)).FzEName == uintptr(0) { (*ExprList_item)(unsafe.Pointer(pItem)).FzEName = Xsqlite3DbSpanDup(tls, db, zStart, zEnd) libc.SetBitFieldPtr16Uint32(pItem+16+4, uint32(ENAME_SPAN), 0, 0x3) } } } // If the expression list pEList contains more than iLimit elements, // leave an error message in pParse. func Xsqlite3ExprListCheckLength(tls *libc.TLS, pParse uintptr, pEList uintptr, zObject uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var mx int32 = *(*int32)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb + 136 + 2*4)) if pEList != 0 && (*ExprList)(unsafe.Pointer(pEList)).FnExpr > mx { Xsqlite3ErrorMsg(tls, pParse, ts+9023, libc.VaList(bp, zObject)) } } func exprListDeleteNN(tls *libc.TLS, db uintptr, pList uintptr) { var i int32 = (*ExprList)(unsafe.Pointer(pList)).FnExpr var pItem uintptr = pList + 8 for __ccgo := true; __ccgo; __ccgo = libc.PreDecInt32(&i, 1) > 0 { Xsqlite3ExprDelete(tls, db, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr) if (*ExprList_item)(unsafe.Pointer(pItem)).FzEName != 0 { Xsqlite3DbNNFreeNN(tls, db, (*ExprList_item)(unsafe.Pointer(pItem)).FzEName) } pItem += 32 } Xsqlite3DbNNFreeNN(tls, db, pList) } func Xsqlite3ExprListDelete(tls *libc.TLS, db uintptr, pList uintptr) { if pList != 0 { exprListDeleteNN(tls, db, pList) } } // Return the bitwise-OR of all Expr.flags fields in the given // ExprList. func Xsqlite3ExprListFlags(tls *libc.TLS, pList uintptr) U32 { var i int32 var m U32 = U32(0) for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { var pExpr uintptr = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(i)*32)).FpExpr m = m | (*Expr)(unsafe.Pointer(pExpr)).Fflags } return m } // This is a SELECT-node callback for the expression walker that // always "fails". By "fail" in this case, we mean set // pWalker->eCode to zero and abort. // // This callback is used by multiple expression walkers. func Xsqlite3SelectWalkFail(tls *libc.TLS, pWalker uintptr, NotUsed uintptr) int32 { _ = NotUsed (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) return WRC_Abort } // Check the input string to see if it is "true" or "false" (in any case). // // If the string is.... Return // "true" EP_IsTrue // "false" EP_IsFalse // anything else 0 func Xsqlite3IsTrueOrFalse(tls *libc.TLS, zIn uintptr) U32 { if Xsqlite3StrICmp(tls, zIn, ts+9046) == 0 { return U32(EP_IsTrue) } if Xsqlite3StrICmp(tls, zIn, ts+9051) == 0 { return U32(EP_IsFalse) } return U32(0) } // If the input expression is an ID with the name "true" or "false" // then convert it into an TK_TRUEFALSE term. Return non-zero if // the conversion happened, and zero if the expression is unaltered. func Xsqlite3ExprIdToTrueFalse(tls *libc.TLS, pExpr uintptr) int32 { var v U32 if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Quoted|EP_IntValue) != U32(0)) && libc.AssignUint32(&v, Xsqlite3IsTrueOrFalse(tls, *(*uintptr)(unsafe.Pointer(pExpr + 8)))) != U32(0) { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_TRUEFALSE) *(*U32)(unsafe.Pointer(pExpr + 4)) |= v return 1 } return 0 } // The argument must be a TK_TRUEFALSE Expr node. Return 1 if it is TRUE // and 0 if it is FALSE. func Xsqlite3ExprTruthValue(tls *libc.TLS, pExpr uintptr) int32 { pExpr = Xsqlite3ExprSkipCollate(tls, pExpr) return libc.Bool32(int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 8)) + 4))) == 0) } // If pExpr is an AND or OR expression, try to simplify it by eliminating // terms that are always true or false. Return the simplified expression. // Or return the original expression if no simplification is possible. // // Examples: // // (x<10) AND true => (x<10) // (x<10) AND false => false // (x<10) AND (y=22 OR false) => (x<10) AND (y=22) // (x<10) AND (y=22 OR true) => (x<10) // (y=22) OR true => true func Xsqlite3ExprSimplifiedAndOr(tls *libc.TLS, pExpr uintptr) uintptr { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AND || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_OR { var pRight uintptr = Xsqlite3ExprSimplifiedAndOr(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) var pLeft uintptr = Xsqlite3ExprSimplifiedAndOr(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) if (*Expr)(unsafe.Pointer(pLeft)).Fflags&U32(EP_OuterON|EP_IsTrue) == U32(EP_IsTrue) || (*Expr)(unsafe.Pointer(pRight)).Fflags&U32(EP_OuterON|EP_IsFalse) == U32(EP_IsFalse) { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AND { pExpr = pRight } else { pExpr = pLeft } } else if (*Expr)(unsafe.Pointer(pRight)).Fflags&U32(EP_OuterON|EP_IsTrue) == U32(EP_IsTrue) || (*Expr)(unsafe.Pointer(pLeft)).Fflags&U32(EP_OuterON|EP_IsFalse) == U32(EP_IsFalse) { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AND { pExpr = pLeft } else { pExpr = pRight } } } return pExpr } func exprNodeIsConstant(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) == 2 && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0) { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) return WRC_Abort } { switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { case TK_FUNCTION: if (int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) >= 4 || (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_ConstFunc) != U32(0)) && !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0)) { if int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) == 5 { *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_FromDDL) } return WRC_Continue } else { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) return WRC_Abort } fallthrough case TK_ID: if Xsqlite3ExprIdToTrueFalse(tls, pExpr) != 0 { return WRC_Prune } fallthrough case TK_COLUMN: fallthrough case TK_AGG_FUNCTION: fallthrough case TK_AGG_COLUMN: if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_FixedCol) != U32(0) && int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) != 2 { return WRC_Continue } if int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) == 3 && (*Expr)(unsafe.Pointer(pExpr)).FiTable == *(*int32)(unsafe.Pointer(pWalker + 40)) { return WRC_Continue } fallthrough case TK_IF_NULL_ROW: fallthrough case TK_REGISTER: fallthrough case TK_DOT: (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) return WRC_Abort case TK_VARIABLE: if int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) == 5 { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_NULL) } else if int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) == 4 { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) return WRC_Abort } fallthrough default: return WRC_Continue } } return int32(0) } func exprIsConst(tls *libc.TLS, p uintptr, initFlag int32, iCur int32) int32 { bp := tls.Alloc(48) defer tls.Free(48) (*Walker)(unsafe.Pointer(bp)).FeCode = U16(initFlag) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{exprNodeIsConstant})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkFail})) *(*int32)(unsafe.Pointer(bp + 40)) = iCur Xsqlite3WalkExpr(tls, bp, p) return int32((*Walker)(unsafe.Pointer(bp)).FeCode) } // Walk an expression tree. Return non-zero if the expression is constant // and 0 if it involves variables or function calls. // // For the purposes of this function, a double-quoted string (ex: "abc") // is considered a variable but a single-quoted string (ex: 'abc') is // a constant. func Xsqlite3ExprIsConstant(tls *libc.TLS, p uintptr) int32 { return exprIsConst(tls, p, 1, 0) } // Walk an expression tree. Return non-zero if // // (1) the expression is constant, and // (2) the expression does originate in the ON or USING clause // of a LEFT JOIN, and // (3) the expression does not contain any EP_FixedCol TK_COLUMN // operands created by the constant propagation optimization. // // When this routine returns true, it indicates that the expression // can be added to the pParse->pConstExpr list and evaluated once when // the prepared statement starts up. See sqlite3ExprCodeRunJustOnce(). func Xsqlite3ExprIsConstantNotJoin(tls *libc.TLS, p uintptr) int32 { return exprIsConst(tls, p, 2, 0) } // Walk an expression tree. Return non-zero if the expression is constant // for any single row of the table with cursor iCur. In other words, the // expression must not refer to any non-deterministic function nor any // table other than iCur. func Xsqlite3ExprIsTableConstant(tls *libc.TLS, p uintptr, iCur int32) int32 { return exprIsConst(tls, p, 3, iCur) } // Check pExpr to see if it is an invariant constraint on data source pSrc. // This is an optimization. False negatives will perhaps cause slower // queries, but false positives will yield incorrect answers. So when in // doubt, return 0. // // To be an invariant constraint, the following must be true: // // (1) pExpr cannot refer to any table other than pSrc->iCursor. // // (2) pExpr cannot use subqueries or non-deterministic functions. // // (3) pSrc cannot be part of the left operand for a RIGHT JOIN. // (Is there some way to relax this constraint?) // // (4) If pSrc is the right operand of a LEFT JOIN, then... // (4a) pExpr must come from an ON clause.. // (4b) and specifically the ON clause associated with the LEFT JOIN. // // ** // ** (5) If pSrc is not the right operand of a LEFT JOIN or the left // ** operand of a RIGHT JOIN, then pExpr must be from the WHERE // ** clause, not an ON clause. func Xsqlite3ExprIsTableConstraint(tls *libc.TLS, pExpr uintptr, pSrc uintptr) int32 { if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&JT_LTORJ != 0 { return 0 } if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&JT_LEFT != 0 { if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0)) { return 0 } if *(*int32)(unsafe.Pointer(pExpr + 52)) != (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor { return 0 } } else { if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0) { return 0 } } return Xsqlite3ExprIsTableConstant(tls, pExpr, (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor) } func exprNodeIsConstantOrGroupBy(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var pGroupBy uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr; i++ { var p uintptr = (*ExprList_item)(unsafe.Pointer(pGroupBy + 8 + uintptr(i)*32)).FpExpr if Xsqlite3ExprCompare(tls, uintptr(0), pExpr, p, -1) < 2 { var pColl uintptr = Xsqlite3ExprNNCollSeq(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, p) if Xsqlite3IsBinary(tls, pColl) != 0 { return WRC_Prune } } } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) return WRC_Abort } return exprNodeIsConstant(tls, pWalker, pExpr) } // Walk the expression tree passed as the first argument. Return non-zero // if the expression consists entirely of constants or copies of terms // in pGroupBy that sort with the BINARY collation sequence. // // This routine is used to determine if a term of the HAVING clause can // be promoted into the WHERE clause. In order for such a promotion to work, // the value of the HAVING clause term must be the same for all members of // a "group". The requirement that the GROUP BY term must be BINARY // assumes that no other collating sequence will have a finer-grained // grouping than binary. In other words (A=B COLLATE binary) implies // A=B in every other collating sequence. The requirement that the // GROUP BY be BINARY is stricter than necessary. It would also work // to promote HAVING clauses that use the same alternative collating // sequence as the GROUP BY term, but that is much harder to check, // alternative collating sequences are uncommon, and this is only an // optimization, so we take the easy way out and simply require the // GROUP BY to use the BINARY collating sequence. func Xsqlite3ExprIsConstantOrGroupBy(tls *libc.TLS, pParse uintptr, p uintptr, pGroupBy uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) (*Walker)(unsafe.Pointer(bp)).FeCode = U16(1) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{exprNodeIsConstantOrGroupBy})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 40)) = pGroupBy (*Walker)(unsafe.Pointer(bp)).FpParse = pParse Xsqlite3WalkExpr(tls, bp, p) return int32((*Walker)(unsafe.Pointer(bp)).FeCode) } // Walk an expression tree for the DEFAULT field of a column definition // in a CREATE TABLE statement. Return non-zero if the expression is // acceptable for use as a DEFAULT. That is to say, return non-zero if // the expression is constant or a function call with constant arguments. // Return and 0 if there are any variables. // // isInit is true when parsing from sqlite_schema. isInit is false when // processing a new CREATE TABLE statement. When isInit is true, parameters // (such as ? or $abc) in the expression are converted into NULL. When // isInit is false, parameters raise an error. Parameters should not be // allowed in a CREATE TABLE statement, but some legacy versions of SQLite // allowed it, so we need to support it when reading sqlite_schema for // backwards compatibility. // // If isInit is true, set EP_FromDDL on every TK_FUNCTION node. // // For the purposes of this function, a double-quoted string (ex: "abc") // is considered a variable but a single-quoted string (ex: 'abc') is // a constant. func Xsqlite3ExprIsConstantOrFunction(tls *libc.TLS, p uintptr, isInit U8) int32 { return exprIsConst(tls, p, 4+int32(isInit), 0) } // If the expression p codes a constant integer that is small enough // to fit in a 32-bit integer, return 1 and put the value of the integer // in *pValue. If the expression is not an integer or if it is too big // to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. func Xsqlite3ExprIsInteger(tls *libc.TLS, p uintptr, pValue uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 = 0 if p == uintptr(0) { return 0 } if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_IntValue) != 0 { *(*int32)(unsafe.Pointer(pValue)) = *(*int32)(unsafe.Pointer(p + 8)) return 1 } switch int32((*Expr)(unsafe.Pointer(p)).Fop) { case TK_UPLUS: { rc = Xsqlite3ExprIsInteger(tls, (*Expr)(unsafe.Pointer(p)).FpLeft, pValue) break } case TK_UMINUS: { *(*int32)(unsafe.Pointer(bp)) = 0 if Xsqlite3ExprIsInteger(tls, (*Expr)(unsafe.Pointer(p)).FpLeft, bp) != 0 { *(*int32)(unsafe.Pointer(pValue)) = -*(*int32)(unsafe.Pointer(bp)) rc = 1 } break } default: break } return rc } // Return FALSE if there is no chance that the expression can be NULL. // // If the expression might be NULL or if the expression is too complex // to tell return TRUE. // // This routine is used as an optimization, to skip OP_IsNull opcodes // when we know that a value cannot be NULL. Hence, a false positive // (returning TRUE when in fact the expression can never be NULL) might // be a small performance hit but is otherwise harmless. On the other // hand, a false negative (returning FALSE when the result could be NULL) // will likely result in an incorrect answer. So when in doubt, return // TRUE. func Xsqlite3ExprCanBeNull(tls *libc.TLS, p uintptr) int32 { var op U8 for int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_UPLUS || int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_UMINUS { p = (*Expr)(unsafe.Pointer(p)).FpLeft } op = (*Expr)(unsafe.Pointer(p)).Fop if int32(op) == TK_REGISTER { op = (*Expr)(unsafe.Pointer(p)).Fop2 } switch int32(op) { case TK_INTEGER: fallthrough case TK_STRING: fallthrough case TK_FLOAT: fallthrough case TK_BLOB: return 0 case TK_COLUMN: return libc.Bool32((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_CanBeNull) != U32(0) || *(*uintptr)(unsafe.Pointer(p + 64)) == uintptr(0) || int32((*Expr)(unsafe.Pointer(p)).FiColumn) >= 0 && (*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64)))).FaCol != uintptr(0) && int32(*(*uint8)(unsafe.Pointer((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64)))).FaCol + uintptr((*Expr)(unsafe.Pointer(p)).FiColumn)*24 + 8))&0xf>>0) == 0) default: return 1 } return int32(0) } // 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 Xsqlite3ExprNeedsNoAffinityChange(tls *libc.TLS, p uintptr, aff int8) int32 { var op U8 var unaryMinus int32 = 0 if int32(aff) == SQLITE_AFF_BLOB { return 1 } for int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_UPLUS || int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_UMINUS { if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_UMINUS { unaryMinus = 1 } p = (*Expr)(unsafe.Pointer(p)).FpLeft } op = (*Expr)(unsafe.Pointer(p)).Fop if int32(op) == TK_REGISTER { op = (*Expr)(unsafe.Pointer(p)).Fop2 } switch int32(op) { case TK_INTEGER: { return libc.Bool32(int32(aff) >= SQLITE_AFF_NUMERIC) } case TK_FLOAT: { return libc.Bool32(int32(aff) >= SQLITE_AFF_NUMERIC) } case TK_STRING: { return libc.Bool32(!(unaryMinus != 0) && int32(aff) == SQLITE_AFF_TEXT) } case TK_BLOB: { return libc.BoolInt32(!(unaryMinus != 0)) } case TK_COLUMN: { return libc.Bool32(int32(aff) >= SQLITE_AFF_NUMERIC && int32((*Expr)(unsafe.Pointer(p)).FiColumn) < 0) } default: { return 0 } } return int32(0) } // Return TRUE if the given string is a row-id column name. func Xsqlite3IsRowid(tls *libc.TLS, z uintptr) int32 { if Xsqlite3StrICmp(tls, z, ts+9057) == 0 { return 1 } if Xsqlite3StrICmp(tls, z, ts+9065) == 0 { return 1 } if Xsqlite3StrICmp(tls, z, ts+9071) == 0 { return 1 } return 0 } func isCandidateForInOpt(tls *libc.TLS, pX uintptr) uintptr { var p uintptr var pSrc uintptr var pEList uintptr var pTab uintptr var i int32 if !((*Expr)(unsafe.Pointer(pX)).Fflags&U32(EP_xIsSelect) != U32(0)) { return uintptr(0) } if (*Expr)(unsafe.Pointer(pX)).Fflags&U32(EP_VarSelect) != U32(0) { return uintptr(0) } p = *(*uintptr)(unsafe.Pointer(pX + 32)) if (*Select)(unsafe.Pointer(p)).FpPrior != 0 { return uintptr(0) } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct|SF_Aggregate) != 0 { return uintptr(0) } if (*Select)(unsafe.Pointer(p)).FpLimit != 0 { return uintptr(0) } if (*Select)(unsafe.Pointer(p)).FpWhere != 0 { return uintptr(0) } pSrc = (*Select)(unsafe.Pointer(p)).FpSrc if (*SrcList)(unsafe.Pointer(pSrc)).FnSrc != 1 { return uintptr(0) } if (*SrcItem)(unsafe.Pointer(pSrc+8)).FpSelect != 0 { return uintptr(0) } pTab = (*SrcItem)(unsafe.Pointer(pSrc + 8)).FpTab if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { return uintptr(0) } pEList = (*Select)(unsafe.Pointer(p)).FpEList for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { var pRes uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FpExpr if int32((*Expr)(unsafe.Pointer(pRes)).Fop) != TK_COLUMN { return uintptr(0) } } return p } func sqlite3SetHasNullFlag(tls *libc.TLS, v uintptr, iCur int32, regHasNull int32) { var addr1 int32 Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regHasNull) addr1 = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, iCur) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iCur, 0, regHasNull) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_TYPEOFARG)) Xsqlite3VdbeJumpHere(tls, v, addr1) } func sqlite3InRhsIsConstant(tls *libc.TLS, pIn uintptr) int32 { var pLHS uintptr var res int32 pLHS = (*Expr)(unsafe.Pointer(pIn)).FpLeft (*Expr)(unsafe.Pointer(pIn)).FpLeft = uintptr(0) res = Xsqlite3ExprIsConstant(tls, pIn) (*Expr)(unsafe.Pointer(pIn)).FpLeft = pLHS return res } // This function is used by the implementation of the IN (...) operator. // The pX parameter is the expression on the RHS of the IN operator, which // might be either a list of expressions or a subquery. // // The job of this routine is to find or create a b-tree object that can // be used either to test for membership in the RHS set or to iterate through // all members of the RHS set, skipping duplicates. // // A cursor is opened on the b-tree object that is the RHS of the IN operator // and the *piTab parameter is set to the index of that cursor. // // The returned value of this function indicates the b-tree type, as follows: // // IN_INDEX_ROWID - The cursor was opened on a database table. // IN_INDEX_INDEX_ASC - The cursor was opened on an ascending index. // IN_INDEX_INDEX_DESC - The cursor was opened on a descending index. // IN_INDEX_EPH - The cursor was opened on a specially created and // populated epheremal table. // IN_INDEX_NOOP - No cursor was allocated. The IN operator must be // implemented as a sequence of comparisons. // // An existing b-tree might be used if the RHS expression pX is a simple // subquery such as: // // SELECT , ... FROM // // If the RHS of the IN operator is a list or a more complex subquery, then // an ephemeral table might need to be generated from the RHS and then // pX->iTable made to point to the ephemeral table instead of an // existing table. In this case, the creation and initialization of the // ephmeral table might be put inside of a subroutine, the EP_Subrtn flag // will be set on pX and the pX->y.sub fields will be set to show where // the subroutine is coded. // // The inFlags parameter must contain, at a minimum, one of the bits // IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains // IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast // membership test. When the IN_INDEX_LOOP bit is set, the IN index will // be used to loop over all values of the RHS of the IN operator. // // When IN_INDEX_LOOP is used (and the b-tree will be used to iterate // through the set members) then the b-tree must not contain duplicates. // An epheremal table will be created unless the selected columns are guaranteed // to be unique - either because it is an INTEGER PRIMARY KEY or due to // a UNIQUE constraint or index. // // When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used // for fast set membership tests) then an epheremal table must // be used unless is a single INTEGER PRIMARY KEY column or an // index can be found with the specified as its left-most. // // If the IN_INDEX_NOOP_OK and IN_INDEX_MEMBERSHIP are both set and // if the RHS of the IN operator is a list (not a subquery) then this // routine might decide that creating an ephemeral b-tree for membership // testing is too expensive and return IN_INDEX_NOOP. In that case, the // calling routine should implement the IN operator using a sequence // of Eq or Ne comparison operations. // // When the b-tree is being used for membership tests, the calling function // might need to know whether or not the RHS side of the IN operator // contains a NULL. If prRhsHasNull is not a NULL pointer and // if there is any chance that the (...) might contain a NULL value at // runtime, then a register is allocated and the register number written // to *prRhsHasNull. If there is no chance that the (...) contains a // NULL value, then *prRhsHasNull is left unchanged. // // If a register is allocated and its location stored in *prRhsHasNull, then // the value in that register will be NULL if the b-tree contains one or more // NULL values, and it will be some non-NULL value if the b-tree contains no // NULL values. // // If the aiMap parameter is not NULL, it must point to an array containing // one element for each column returned by the SELECT statement on the RHS // of the IN(...) operator. The i'th entry of the array is populated with the // offset of the index column that matches the i'th column returned by the // SELECT. For example, if the expression and selected index are: // // (?,?,?) IN (SELECT a, b, c FROM t1) // CREATE INDEX i1 ON t1(b, c, a); // // then aiMap[] is populated with {2, 0, 1}. func Xsqlite3FindInIndex(tls *libc.TLS, pParse uintptr, pX uintptr, inFlags U32, prRhsHasNull uintptr, aiMap uintptr, piTab uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var p uintptr var eType int32 = 0 var iTab int32 var mustBeUnique int32 var v uintptr = Xsqlite3GetVdbe(tls, pParse) mustBeUnique = libc.Bool32(inFlags&U32(IN_INDEX_LOOP) != U32(0)) iTab = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) if prRhsHasNull != 0 && (*Expr)(unsafe.Pointer(pX)).Fflags&U32(EP_xIsSelect) != U32(0) { var i int32 var pEList uintptr = (*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pX + 32)))).FpEList for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { if Xsqlite3ExprCanBeNull(tls, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(i)*32)).FpExpr) != 0 { break } } if i == (*ExprList)(unsafe.Pointer(pEList)).FnExpr { prRhsHasNull = uintptr(0) } } if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 && libc.AssignUintptr(&p, isCandidateForInOpt(tls, pX)) != uintptr(0) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTab uintptr var iDb int32 var pEList uintptr = (*Select)(unsafe.Pointer(p)).FpEList var nExpr int32 = (*ExprList)(unsafe.Pointer(pEList)).FnExpr pTab = (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FpTab iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) Xsqlite3CodeVerifySchema(tls, pParse, iDb) Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pTab)).FzName) if nExpr == 1 && int32((*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pEList+8)).FpExpr)).FiColumn) < 0 { var iAddr int32 = Xsqlite3VdbeAddOp0(tls, v, OP_Once) Xsqlite3OpenTable(tls, pParse, iTab, iDb, pTab, OP_OpenRead) eType = IN_INDEX_ROWID Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+9075, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) Xsqlite3VdbeJumpHere(tls, v, iAddr) } else { var pIdx uintptr var affinity_ok int32 = 1 var i int32 for i = 0; i < nExpr && affinity_ok != 0; i++ { var pLhs uintptr = Xsqlite3VectorFieldSubexpr(tls, (*Expr)(unsafe.Pointer(pX)).FpLeft, i) var iCol int32 = int32((*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FpExpr)).FiColumn) var idxaff int8 = Xsqlite3TableColumnAffinity(tls, pTab, iCol) var cmpaff int8 = Xsqlite3CompareAffinity(tls, pLhs, idxaff) switch int32(cmpaff) { case SQLITE_AFF_BLOB: break fallthrough case SQLITE_AFF_TEXT: break fallthrough default: affinity_ok = libc.Bool32(int32(idxaff) >= SQLITE_AFF_NUMERIC) } } if affinity_ok != 0 { for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0 && eType == 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { var colUsed Bitmask var mCol Bitmask if int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) < nExpr { continue } if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != uintptr(0) { continue } if int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) >= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))-1 { continue } if mustBeUnique != 0 { if int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) > nExpr || int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) > nExpr && !(int32((*Index)(unsafe.Pointer(pIdx)).FonError) != OE_None) { continue } } colUsed = uint64(0) for i = 0; i < nExpr; i++ { var pLhs uintptr = Xsqlite3VectorFieldSubexpr(tls, (*Expr)(unsafe.Pointer(pX)).FpLeft, i) var pRhs uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FpExpr var pReq uintptr = Xsqlite3BinaryCompareCollSeq(tls, pParse, pLhs, pRhs) var j int32 for j = 0; j < nExpr; j++ { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j)*2))) != int32((*Expr)(unsafe.Pointer(pRhs)).FiColumn) { continue } if pReq != uintptr(0) && Xsqlite3StrICmp(tls, (*CollSeq)(unsafe.Pointer(pReq)).FzName, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(j)*8))) != 0 { continue } break } if j == nExpr { break } mCol = uint64(1) << j if mCol&colUsed != 0 { break } colUsed = colUsed | mCol if aiMap != 0 { *(*int32)(unsafe.Pointer(aiMap + uintptr(i)*4)) = j } } if colUsed == uint64(1)<iTable, // however the cursor number returned might not be the same, as it might // have been duplicated using OP_OpenDup. // // If the LHS expression ("x" in the examples) is a column value, or // the SELECT statement returns a column value, then the affinity of that // column is used to build the index keys. If both 'x' and the // SELECT... statement are columns, then numeric affinity is used // if either column has NUMERIC or INTEGER affinity. If neither // 'x' nor the SELECT... statement are columns, then numeric affinity // is used. func Xsqlite3CodeRhsOfIN(tls *libc.TLS, pParse uintptr, pExpr uintptr, iTab int32) { bp := tls.Alloc(65) defer tls.Free(65) var addrOnce int32 = 0 var addr int32 var pLeft uintptr var pKeyInfo uintptr = uintptr(0) var nVal int32 var v uintptr v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_VarSelect) != U32(0)) && (*Parse)(unsafe.Pointer(pParse)).FiSelfTab == 0 { if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Subrtn) != U32(0) { addrOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+9197, libc.VaList(bp, (*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FselId)) } Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, *(*int32)(unsafe.Pointer(pExpr + 64 + 4)), *(*int32)(unsafe.Pointer(pExpr + 64))) Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, iTab, (*Expr)(unsafe.Pointer(pExpr)).FiTable) Xsqlite3VdbeJumpHere(tls, v, addrOnce) return } *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_Subrtn) *(*int32)(unsafe.Pointer(pExpr + 64 + 4)) = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) *(*int32)(unsafe.Pointer(pExpr + 64)) = Xsqlite3VdbeAddOp2(tls, v, OP_BeginSubrtn, 0, *(*int32)(unsafe.Pointer(pExpr + 64 + 4))) + 1 addrOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) } pLeft = (*Expr)(unsafe.Pointer(pExpr)).FpLeft nVal = Xsqlite3ExprVectorSize(tls, pLeft) (*Expr)(unsafe.Pointer(pExpr)).FiTable = iTab addr = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, (*Expr)(unsafe.Pointer(pExpr)).FiTable, nVal) pKeyInfo = Xsqlite3KeyInfoAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, nVal, 1) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { var pSelect uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 32)) var pEList uintptr = (*Select)(unsafe.Pointer(pSelect)).FpEList Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+9220, libc.VaList(bp+8, func() uintptr { if addrOnce != 0 { return ts + 1544 } return ts + 9239 }(), (*Select)(unsafe.Pointer(pSelect)).FselId)) if (*ExprList)(unsafe.Pointer(pEList)).FnExpr == nVal { var pCopy uintptr var i int32 var rc int32 Xsqlite3SelectDestInit(tls, bp+24, SRT_Set, iTab) (*SelectDest)(unsafe.Pointer(bp + 24)).FzAffSdst = exprINAffinity(tls, pParse, pExpr) (*Select)(unsafe.Pointer(pSelect)).FiLimit = 0 pCopy = Xsqlite3SelectDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pSelect, 0) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { rc = 1 } else { rc = Xsqlite3Select(tls, pParse, pCopy, bp+24) } Xsqlite3SelectDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pCopy) Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*SelectDest)(unsafe.Pointer(bp+24)).FzAffSdst) if rc != 0 { Xsqlite3KeyInfoUnref(tls, pKeyInfo) return } for i = 0; i < nVal; i++ { var p uintptr = Xsqlite3VectorFieldSubexpr(tls, pLeft, i) *(*uintptr)(unsafe.Pointer(pKeyInfo + 32 + uintptr(i)*8)) = Xsqlite3BinaryCompareCollSeq(tls, pParse, p, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(i)*32)).FpExpr) } } } else if *(*uintptr)(unsafe.Pointer(pExpr + 32)) != uintptr(0) { var i int32 var pList uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 32)) var pItem uintptr var r1 int32 var r2 int32 *(*int8)(unsafe.Pointer(bp + 64)) = Xsqlite3ExprAffinity(tls, pLeft) if int32(*(*int8)(unsafe.Pointer(bp + 64))) <= SQLITE_AFF_NONE { *(*int8)(unsafe.Pointer(bp + 64)) = int8(SQLITE_AFF_BLOB) } else if int32(*(*int8)(unsafe.Pointer(bp + 64))) == SQLITE_AFF_REAL { *(*int8)(unsafe.Pointer(bp + 64)) = int8(SQLITE_AFF_NUMERIC) } if pKeyInfo != 0 { *(*uintptr)(unsafe.Pointer(pKeyInfo + 32)) = Xsqlite3ExprCollSeq(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) } r1 = Xsqlite3GetTempReg(tls, pParse) r2 = Xsqlite3GetTempReg(tls, pParse) i = (*ExprList)(unsafe.Pointer(pList)).FnExpr pItem = pList + 8 __1: if !(i > 0) { goto __3 } { var pE2 uintptr = (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr if addrOnce != 0 && !(Xsqlite3ExprIsConstant(tls, pE2) != 0) { Xsqlite3VdbeChangeToNoop(tls, v, addrOnce-1) Xsqlite3VdbeChangeToNoop(tls, v, addrOnce) *(*U32)(unsafe.Pointer(pExpr + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_Subrtn)) addrOnce = 0 } Xsqlite3ExprCode(tls, pParse, pE2, r1) Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, r1, 1, r2, bp+64, 1) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iTab, r2, r1, 1) } goto __2 __2: i-- pItem += 32 goto __1 goto __3 __3: ; Xsqlite3ReleaseTempReg(tls, pParse, r1) Xsqlite3ReleaseTempReg(tls, pParse, r2) } if pKeyInfo != 0 { Xsqlite3VdbeChangeP4(tls, v, addr, pKeyInfo, -8) } if addrOnce != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_NullRow, iTab) Xsqlite3VdbeJumpHere(tls, v, addrOnce) Xsqlite3VdbeAddOp3(tls, v, OP_Return, *(*int32)(unsafe.Pointer(pExpr + 64 + 4)), *(*int32)(unsafe.Pointer(pExpr + 64)), 1) Xsqlite3ClearTempRegCache(tls, pParse) } } // Generate code for scalar subqueries used as a subquery expression // or EXISTS operator: // // (SELECT a FROM b) -- subquery // EXISTS (SELECT a FROM b) -- EXISTS subquery // // The pExpr parameter is the SELECT or EXISTS operator to be coded. // // Return the register that holds the result. For a multi-column SELECT, // the result is stored in a contiguous array of registers and the // return value is the register of the left-most result column. // Return 0 if an error occurs. func Xsqlite3CodeSubselect(tls *libc.TLS, pParse uintptr, pExpr uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var addrOnce int32 = 0 var rReg int32 = 0 var pSel uintptr var nReg int32 var pLimit uintptr var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return 0 } pSel = *(*uintptr)(unsafe.Pointer(pExpr + 32)) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Subrtn) != U32(0) { Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+9251, libc.VaList(bp, (*Select)(unsafe.Pointer(pSel)).FselId)) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, *(*int32)(unsafe.Pointer(pExpr + 64 + 4)), *(*int32)(unsafe.Pointer(pExpr + 64))) return (*Expr)(unsafe.Pointer(pExpr)).FiTable } *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_Subrtn) *(*int32)(unsafe.Pointer(pExpr + 64 + 4)) = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) *(*int32)(unsafe.Pointer(pExpr + 64)) = Xsqlite3VdbeAddOp2(tls, v, OP_BeginSubrtn, 0, *(*int32)(unsafe.Pointer(pExpr + 64 + 4))) + 1 if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_VarSelect) != U32(0)) { addrOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) } Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+9269, libc.VaList(bp+8, func() uintptr { if addrOnce != 0 { return ts + 1544 } return ts + 9239 }(), (*Select)(unsafe.Pointer(pSel)).FselId)) if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_SELECT { nReg = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSel)).FpEList)).FnExpr } else { nReg = 1 } Xsqlite3SelectDestInit(tls, bp+24, 0, (*Parse)(unsafe.Pointer(pParse)).FnMem+1) *(*int32)(unsafe.Pointer(pParse + 56)) += nReg if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_SELECT { (*SelectDest)(unsafe.Pointer(bp + 24)).FeDest = U8(SRT_Mem) (*SelectDest)(unsafe.Pointer(bp + 24)).FiSdst = (*SelectDest)(unsafe.Pointer(bp + 24)).FiSDParm (*SelectDest)(unsafe.Pointer(bp + 24)).FnSdst = nReg Xsqlite3VdbeAddOp3(tls, v, OP_Null, 0, (*SelectDest)(unsafe.Pointer(bp+24)).FiSDParm, (*SelectDest)(unsafe.Pointer(bp+24)).FiSDParm+nReg-1) } else { (*SelectDest)(unsafe.Pointer(bp + 24)).FeDest = U8(SRT_Exists) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*SelectDest)(unsafe.Pointer(bp+24)).FiSDParm) } if (*Select)(unsafe.Pointer(pSel)).FpLimit != 0 { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb pLimit = Xsqlite3Expr(tls, db, TK_INTEGER, ts+8871) if pLimit != 0 { (*Expr)(unsafe.Pointer(pLimit)).FaffExpr = int8(SQLITE_AFF_NUMERIC) pLimit = Xsqlite3PExpr(tls, pParse, TK_NE, Xsqlite3ExprDup(tls, db, (*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(pSel)).FpLimit)).FpLeft, 0), pLimit) } Xsqlite3ExprDeferredDelete(tls, pParse, (*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(pSel)).FpLimit)).FpLeft) (*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(pSel)).FpLimit)).FpLeft = pLimit } else { pLimit = Xsqlite3Expr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_INTEGER, ts+9290) (*Select)(unsafe.Pointer(pSel)).FpLimit = Xsqlite3PExpr(tls, pParse, TK_LIMIT, pLimit, uintptr(0)) } (*Select)(unsafe.Pointer(pSel)).FiLimit = 0 if Xsqlite3Select(tls, pParse, pSel, bp+24) != 0 { (*Expr)(unsafe.Pointer(pExpr)).Fop2 = (*Expr)(unsafe.Pointer(pExpr)).Fop (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_ERROR) return 0 } (*Expr)(unsafe.Pointer(pExpr)).FiTable = libc.AssignInt32(&rReg, (*SelectDest)(unsafe.Pointer(bp+24)).FiSDParm) if addrOnce != 0 { Xsqlite3VdbeJumpHere(tls, v, addrOnce) } Xsqlite3VdbeAddOp3(tls, v, OP_Return, *(*int32)(unsafe.Pointer(pExpr + 64 + 4)), *(*int32)(unsafe.Pointer(pExpr + 64)), 1) Xsqlite3ClearTempRegCache(tls, pParse) return rReg } // Expr pIn is an IN(...) expression. This function checks that the // sub-select on the RHS of the IN() operator has the same number of // columns as the vector on the LHS. Or, if the RHS of the IN() is not // a sub-query, that the LHS is a vector of size 1. func Xsqlite3ExprCheckIN(tls *libc.TLS, pParse uintptr, pIn uintptr) int32 { var nVector int32 = Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pIn)).FpLeft) if (*Expr)(unsafe.Pointer(pIn)).Fflags&U32(EP_xIsSelect) != U32(0) && !(int32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed) != 0) { if nVector != (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pIn + 32)))).FpEList)).FnExpr { Xsqlite3SubselectError(tls, pParse, (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pIn + 32)))).FpEList)).FnExpr, nVector) return 1 } } else if nVector != 1 { Xsqlite3VectorErrorMsg(tls, pParse, (*Expr)(unsafe.Pointer(pIn)).FpLeft) return 1 } return 0 } func sqlite3ExprCodeIN(tls *libc.TLS, pParse uintptr, pExpr uintptr, destIfFalse int32, destIfNull int32) { bp := tls.Alloc(16) defer tls.Free(16) var eType int32 var rLhs int32 var rLhsOrig int32 var v uintptr var aiMap uintptr var zAff uintptr var nVector int32 var pLeft uintptr var i int32 var destStep2 int32 var destStep6 int32 var addrTruthOp int32 var destNotNull int32 var addrTop int32 var okConstFactor U8 var op int32 var op1 int32 var pList uintptr var pColl uintptr var labelOk int32 var r2 int32 var regCkNull int32 var ii int32 var p uintptr var p1 uintptr var pColl1 uintptr var r3 int32 *(*int32)(unsafe.Pointer(bp)) = 0 aiMap = uintptr(0) zAff = uintptr(0) destStep6 = 0 *(*int32)(unsafe.Pointer(bp + 4)) = 0 okConstFactor = (*Parse)(unsafe.Pointer(pParse)).FokConstFactor pLeft = (*Expr)(unsafe.Pointer(pExpr)).FpLeft if !(Xsqlite3ExprCheckIN(tls, pParse, pExpr) != 0) { goto __1 } return __1: ; zAff = exprINAffinity(tls, pParse, pExpr) nVector = Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) aiMap = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(nVector)*(uint64(unsafe.Sizeof(int32(0)))+uint64(unsafe.Sizeof(int8(0))))+uint64(1)) if !((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0) { goto __2 } goto sqlite3ExprCodeIN_oom_error __2: ; v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe eType = Xsqlite3FindInIndex(tls, pParse, pExpr, uint32(IN_INDEX_MEMBERSHIP|IN_INDEX_NOOP_OK), func() uintptr { if destIfFalse == destIfNull { return uintptr(0) } return bp }(), aiMap, bp+4) (*Parse)(unsafe.Pointer(pParse)).FokConstFactor = U8(0) rLhsOrig = exprCodeVector(tls, pParse, pLeft, bp+8) (*Parse)(unsafe.Pointer(pParse)).FokConstFactor = okConstFactor i = 0 __3: if !(i < nVector && *(*int32)(unsafe.Pointer(aiMap + uintptr(i)*4)) == i) { goto __5 } goto __4 __4: i++ goto __3 goto __5 __5: ; if !(i == nVector) { goto __6 } rLhs = rLhsOrig goto __7 __6: rLhs = Xsqlite3GetTempRange(tls, pParse, nVector) i = 0 __8: if !(i < nVector) { goto __10 } Xsqlite3VdbeAddOp3(tls, v, OP_Copy, rLhsOrig+i, rLhs+*(*int32)(unsafe.Pointer(aiMap + uintptr(i)*4)), 0) goto __9 __9: i++ goto __8 goto __10 __10: ; __7: ; if !(eType == IN_INDEX_NOOP) { goto __11 } labelOk = Xsqlite3VdbeMakeLabel(tls, pParse) regCkNull = 0 pList = *(*uintptr)(unsafe.Pointer(pExpr + 32)) pColl = Xsqlite3ExprCollSeq(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) if !(destIfNull != destIfFalse) { goto __12 } regCkNull = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_BitAnd, rLhs, rLhs, regCkNull) __12: ; ii = 0 __13: if !(ii < (*ExprList)(unsafe.Pointer(pList)).FnExpr) { goto __15 } r2 = Xsqlite3ExprCodeTemp(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(ii)*32)).FpExpr, bp+12) if !(regCkNull != 0 && Xsqlite3ExprCanBeNull(tls, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(ii)*32)).FpExpr) != 0) { goto __16 } Xsqlite3VdbeAddOp3(tls, v, OP_BitAnd, regCkNull, r2, regCkNull) __16: ; Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 12))) if !(ii < (*ExprList)(unsafe.Pointer(pList)).FnExpr-1 || destIfNull != destIfFalse) { goto __17 } if rLhs != r2 { op = OP_Eq } else { op = OP_NotNull } Xsqlite3VdbeAddOp4(tls, v, op, rLhs, labelOk, r2, pColl, -2) Xsqlite3VdbeChangeP5(tls, v, uint16(*(*int8)(unsafe.Pointer(zAff)))) goto __18 __17: if rLhs != r2 { op1 = OP_Ne } else { op1 = OP_IsNull } Xsqlite3VdbeAddOp4(tls, v, op1, rLhs, destIfFalse, r2, pColl, -2) Xsqlite3VdbeChangeP5(tls, v, uint16(int32(*(*int8)(unsafe.Pointer(zAff)))|SQLITE_JUMPIFNULL)) __18: ; goto __14 __14: ii++ goto __13 goto __15 __15: ; if !(regCkNull != 0) { goto __19 } Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regCkNull, destIfNull) Xsqlite3VdbeGoto(tls, v, destIfFalse) __19: ; Xsqlite3VdbeResolveLabel(tls, v, labelOk) Xsqlite3ReleaseTempReg(tls, pParse, regCkNull) goto sqlite3ExprCodeIN_finished __11: ; if !(destIfNull == destIfFalse) { goto __20 } destStep2 = destIfFalse goto __21 __20: destStep2 = libc.AssignInt32(&destStep6, Xsqlite3VdbeMakeLabel(tls, pParse)) __21: ; i = 0 __22: if !(i < nVector) { goto __24 } p = Xsqlite3VectorFieldSubexpr(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, i) if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __25 } goto sqlite3ExprCodeIN_oom_error __25: ; if !(Xsqlite3ExprCanBeNull(tls, p) != 0) { goto __26 } Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, rLhs+i, destStep2) __26: ; goto __23 __23: i++ goto __22 goto __24 __24: ; if !(eType == IN_INDEX_ROWID) { goto __27 } Xsqlite3VdbeAddOp3(tls, v, OP_SeekRowid, *(*int32)(unsafe.Pointer(bp + 4)), destIfFalse, rLhs) addrTruthOp = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) goto __28 __27: Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, rLhs, nVector, 0, zAff, nVector) if !(destIfFalse == destIfNull) { goto __29 } Xsqlite3VdbeAddOp4Int(tls, v, OP_NotFound, *(*int32)(unsafe.Pointer(bp + 4)), destIfFalse, rLhs, nVector) goto sqlite3ExprCodeIN_finished __29: ; addrTruthOp = Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, *(*int32)(unsafe.Pointer(bp + 4)), 0, rLhs, nVector) __28: ; if !(*(*int32)(unsafe.Pointer(bp)) != 0 && nVector == 1) { goto __30 } Xsqlite3VdbeAddOp2(tls, v, OP_NotNull, *(*int32)(unsafe.Pointer(bp)), destIfFalse) __30: ; if !(destIfFalse == destIfNull) { goto __31 } Xsqlite3VdbeGoto(tls, v, destIfFalse) __31: ; if !(destStep6 != 0) { goto __32 } Xsqlite3VdbeResolveLabel(tls, v, destStep6) __32: ; addrTop = Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, *(*int32)(unsafe.Pointer(bp + 4)), destIfFalse) if !(nVector > 1) { goto __33 } destNotNull = Xsqlite3VdbeMakeLabel(tls, pParse) goto __34 __33: destNotNull = destIfFalse __34: ; i = 0 __35: if !(i < nVector) { goto __37 } r3 = Xsqlite3GetTempReg(tls, pParse) p1 = Xsqlite3VectorFieldSubexpr(tls, pLeft, i) pColl1 = Xsqlite3ExprCollSeq(tls, pParse, p1) Xsqlite3VdbeAddOp3(tls, v, OP_Column, *(*int32)(unsafe.Pointer(bp + 4)), i, r3) Xsqlite3VdbeAddOp4(tls, v, OP_Ne, rLhs+i, destNotNull, r3, pColl1, -2) Xsqlite3ReleaseTempReg(tls, pParse, r3) goto __36 __36: i++ goto __35 goto __37 __37: ; Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, destIfNull) if !(nVector > 1) { goto __38 } Xsqlite3VdbeResolveLabel(tls, v, destNotNull) Xsqlite3VdbeAddOp2(tls, v, OP_Next, *(*int32)(unsafe.Pointer(bp + 4)), addrTop+1) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, destIfFalse) __38: ; Xsqlite3VdbeJumpHere(tls, v, addrTruthOp) sqlite3ExprCodeIN_finished: if !(rLhs != rLhsOrig) { goto __39 } Xsqlite3ReleaseTempReg(tls, pParse, rLhs) __39: ; sqlite3ExprCodeIN_oom_error: Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, aiMap) Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, zAff) } func codeReal(tls *libc.TLS, v uintptr, z uintptr, negateFlag int32, iMem int32) { bp := tls.Alloc(8) defer tls.Free(8) if z != uintptr(0) { Xsqlite3AtoF(tls, z, bp, Xsqlite3Strlen30(tls, z), uint8(SQLITE_UTF8)) if negateFlag != 0 { *(*float64)(unsafe.Pointer(bp)) = -*(*float64)(unsafe.Pointer(bp)) } Xsqlite3VdbeAddOp4Dup8(tls, v, OP_Real, 0, iMem, 0, bp, -12) } } func codeInteger(tls *libc.TLS, pParse uintptr, pExpr uintptr, negFlag int32, iMem int32) { bp := tls.Alloc(24) defer tls.Free(24) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_IntValue) != 0 { var i int32 = *(*int32)(unsafe.Pointer(pExpr + 8)) if negFlag != 0 { i = -i } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, i, iMem) } else { var c int32 var z uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 8)) c = Xsqlite3DecOrHexToI64(tls, z, bp+16) if c == 3 && !(negFlag != 0) || c == 2 || negFlag != 0 && *(*I64)(unsafe.Pointer(bp + 16)) == int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32) { if Xsqlite3_strnicmp(tls, z, ts+9292, 2) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+9295, libc.VaList(bp, func() uintptr { if negFlag != 0 { return ts + 6284 } return ts + 1544 }(), pExpr)) } else { codeReal(tls, v, z, negFlag, iMem) } } else { if negFlag != 0 { if c == 3 { *(*I64)(unsafe.Pointer(bp + 16)) = int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32) } else { *(*I64)(unsafe.Pointer(bp + 16)) = -*(*I64)(unsafe.Pointer(bp + 16)) } } Xsqlite3VdbeAddOp4Dup8(tls, v, OP_Int64, 0, iMem, 0, bp+16, -13) } } } // Generate code that will load into register regOut a value that is // appropriate for the iIdxCol-th column of index pIdx. func Xsqlite3ExprCodeLoadIndexColumn(tls *libc.TLS, pParse uintptr, pIdx uintptr, iTabCur int32, iIdxCol int32, regOut int32) { var iTabCol I16 = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(iIdxCol)*2)) if int32(iTabCol) == -2 { (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = iTabCur + 1 Xsqlite3ExprCodeCopy(tls, pParse, (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr+8+uintptr(iIdxCol)*32)).FpExpr, regOut) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = 0 } else { Xsqlite3ExprCodeGetColumnOfTable(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, (*Index)(unsafe.Pointer(pIdx)).FpTable, iTabCur, int32(iTabCol), regOut) } } // Generate code that will compute the value of generated column pCol // and store the result in register regOut func Xsqlite3ExprCodeGeneratedColumn(tls *libc.TLS, pParse uintptr, pTab uintptr, pCol uintptr, regOut int32) { var iAddr int32 var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var nErr int32 = (*Parse)(unsafe.Pointer(pParse)).FnErr if (*Parse)(unsafe.Pointer(pParse)).FiSelfTab > 0 { iAddr = Xsqlite3VdbeAddOp3(tls, v, OP_IfNullRow, (*Parse)(unsafe.Pointer(pParse)).FiSelfTab-1, 0, regOut) } else { iAddr = 0 } Xsqlite3ExprCodeCopy(tls, pParse, Xsqlite3ColumnExpr(tls, pTab, pCol), regOut) if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) >= SQLITE_AFF_TEXT { Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, regOut, 1, 0, pCol+10, 1) } if iAddr != 0 { Xsqlite3VdbeJumpHere(tls, v, iAddr) } if (*Parse)(unsafe.Pointer(pParse)).FnErr > nErr { (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FerrByteOffset = -1 } } // Generate code to extract the value of the iCol-th column of a table. func Xsqlite3ExprCodeGetColumnOfTable(tls *libc.TLS, v uintptr, pTab uintptr, iTabCur int32, iCol int32, regOut int32) { bp := tls.Alloc(8) defer tls.Free(8) var pCol uintptr if iCol < 0 || iCol == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iTabCur, regOut) } else { var op int32 var x int32 if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { op = OP_VColumn x = iCol } else if int32((*Column)(unsafe.Pointer(libc.AssignUintptr(&pCol, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24))).FcolFlags)&COLFLAG_VIRTUAL != 0 { var pParse uintptr = Xsqlite3VdbeParser(tls, v) if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_BUSY != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+9322, libc.VaList(bp, (*Column)(unsafe.Pointer(pCol)).FzCnName)) } else { var savedSelfTab int32 = (*Parse)(unsafe.Pointer(pParse)).FiSelfTab *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_BUSY) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = iTabCur + 1 Xsqlite3ExprCodeGeneratedColumn(tls, pParse, pTab, pCol, regOut) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = savedSelfTab *(*U16)(unsafe.Pointer(pCol + 16)) &= libc.Uint16FromInt32(libc.CplInt32(COLFLAG_BUSY)) } return } else if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { x = int32(Xsqlite3TableColumnToIndex(tls, Xsqlite3PrimaryKeyIndex(tls, pTab), int16(iCol))) op = OP_Column } else { x = int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(iCol))) op = OP_Column } Xsqlite3VdbeAddOp3(tls, v, op, iTabCur, x, regOut) Xsqlite3ColumnDefault(tls, v, pTab, iCol, regOut) } } // Generate code that will extract the iColumn-th column from // table pTab and store the column value in register iReg. // // There must be an open cursor to pTab in iTable when this routine // is called. If iColumn<0 then code is generated that extracts the rowid. func Xsqlite3ExprCodeGetColumn(tls *libc.TLS, pParse uintptr, pTab uintptr, iColumn int32, iTable int32, iReg int32, p5 U8) int32 { Xsqlite3ExprCodeGetColumnOfTable(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, pTab, iTable, iColumn, iReg) if p5 != 0 { var pOp uintptr = Xsqlite3VdbeGetLastOp(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe) if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Column { (*VdbeOp)(unsafe.Pointer(pOp)).Fp5 = U16(p5) } } return iReg } // Generate code to move content from registers iFrom...iFrom+nReg-1 // over to iTo..iTo+nReg-1. func Xsqlite3ExprCodeMove(tls *libc.TLS, pParse uintptr, iFrom int32, iTo int32, nReg int32) { Xsqlite3VdbeAddOp3(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, OP_Move, iFrom, iTo, nReg) } func exprToRegister(tls *libc.TLS, pExpr uintptr, iReg int32) { var p uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, pExpr) if p == uintptr(0) { return } (*Expr)(unsafe.Pointer(p)).Fop2 = (*Expr)(unsafe.Pointer(p)).Fop (*Expr)(unsafe.Pointer(p)).Fop = U8(TK_REGISTER) (*Expr)(unsafe.Pointer(p)).FiTable = iReg *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_Skip)) } func exprCodeVector(tls *libc.TLS, pParse uintptr, p uintptr, piFreeable uintptr) int32 { var iResult int32 var nResult int32 = Xsqlite3ExprVectorSize(tls, p) if nResult == 1 { iResult = Xsqlite3ExprCodeTemp(tls, pParse, p, piFreeable) } else { *(*int32)(unsafe.Pointer(piFreeable)) = 0 if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_SELECT { iResult = Xsqlite3CodeSubselect(tls, pParse, p) } else { var i int32 iResult = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nResult for i = 0; i < nResult; i++ { Xsqlite3ExprCodeFactorable(tls, pParse, (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32))+8+uintptr(i)*32)).FpExpr, i+iResult) } } } return iResult } func setDoNotMergeFlagOnCopy(tls *libc.TLS, v uintptr) { if int32((*VdbeOp)(unsafe.Pointer(Xsqlite3VdbeGetLastOp(tls, v))).Fopcode) == OP_Copy { Xsqlite3VdbeChangeP5(tls, v, uint16(1)) } } func exprCodeInlineFunction(tls *libc.TLS, pParse uintptr, pFarg uintptr, iFuncId int32, target int32) int32 { bp := tls.Alloc(120) defer tls.Free(120) var nFarg int32 var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe nFarg = (*ExprList)(unsafe.Pointer(pFarg)).FnExpr switch iFuncId { case INLINEFUNC_coalesce: { var endCoalesce int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var i int32 Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pFarg+8)).FpExpr, target) for i = 1; i < nFarg; i++ { Xsqlite3VdbeAddOp2(tls, v, OP_NotNull, target, endCoalesce) Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pFarg+8+uintptr(i)*32)).FpExpr, target) } setDoNotMergeFlagOnCopy(tls, v) Xsqlite3VdbeResolveLabel(tls, v, endCoalesce) break } case INLINEFUNC_iif: { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(bp)).Fop = U8(TK_CASE) *(*uintptr)(unsafe.Pointer(bp + 32)) = pFarg return Xsqlite3ExprCodeTarget(tls, pParse, bp, target) } case INLINEFUNC_sqlite_offset: { var pArg uintptr = (*ExprList_item)(unsafe.Pointer(pFarg + 8)).FpExpr if int32((*Expr)(unsafe.Pointer(pArg)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pArg)).FiTable >= 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Offset, (*Expr)(unsafe.Pointer(pArg)).FiTable, int32((*Expr)(unsafe.Pointer(pArg)).FiColumn), target) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, target) } break } default: { target = Xsqlite3ExprCodeTarget(tls, pParse, (*ExprList_item)(unsafe.Pointer(pFarg+8)).FpExpr, target) break } case INLINEFUNC_expr_compare: { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, Xsqlite3ExprCompare(tls, uintptr(0), (*ExprList_item)(unsafe.Pointer(pFarg+8)).FpExpr, (*ExprList_item)(unsafe.Pointer(pFarg+8+1*32)).FpExpr, -1), target) break } case INLINEFUNC_expr_implies_expr: { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, Xsqlite3ExprImpliesExpr(tls, pParse, (*ExprList_item)(unsafe.Pointer(pFarg+8)).FpExpr, (*ExprList_item)(unsafe.Pointer(pFarg+8+1*32)).FpExpr, -1), target) break } case INLINEFUNC_implies_nonnull_row: { var pA1 uintptr pA1 = (*ExprList_item)(unsafe.Pointer(pFarg + 8 + 1*32)).FpExpr if int32((*Expr)(unsafe.Pointer(pA1)).Fop) == TK_COLUMN { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, Xsqlite3ExprImpliesNonNullRow(tls, (*ExprList_item)(unsafe.Pointer(pFarg+8)).FpExpr, (*Expr)(unsafe.Pointer(pA1)).FiTable), target) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, target) } break } case INLINEFUNC_affinity: { *(*[6]uintptr)(unsafe.Pointer(bp + 72)) = [6]uintptr{ts + 9352, ts + 9357, ts + 9362, ts + 7543, ts + 7538, ts + 9370} var aff int8 aff = Xsqlite3ExprAffinity(tls, (*ExprList_item)(unsafe.Pointer(pFarg+8)).FpExpr) Xsqlite3VdbeLoadString(tls, v, target, func() uintptr { if int32(aff) <= SQLITE_AFF_NONE { return ts + 9378 } return *(*uintptr)(unsafe.Pointer(bp + 72 + uintptr(int32(aff)-SQLITE_AFF_BLOB)*8)) }()) break } } return target } func sqlite3IndexedExprLookup(tls *libc.TLS, pParse uintptr, pExpr uintptr, target int32) int32 { var p uintptr var v uintptr for p = (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr; p != 0; p = (*IndexedExpr)(unsafe.Pointer(p)).FpIENext { var exprAff U8 var iDataCur int32 = (*IndexedExpr)(unsafe.Pointer(p)).FiDataCur if iDataCur < 0 { continue } if (*Parse)(unsafe.Pointer(pParse)).FiSelfTab != 0 { if (*IndexedExpr)(unsafe.Pointer(p)).FiDataCur != (*Parse)(unsafe.Pointer(pParse)).FiSelfTab-1 { continue } iDataCur = -1 } if Xsqlite3ExprCompare(tls, uintptr(0), pExpr, (*IndexedExpr)(unsafe.Pointer(p)).FpExpr, iDataCur) != 0 { continue } exprAff = U8(Xsqlite3ExprAffinity(tls, pExpr)) if int32(exprAff) <= SQLITE_AFF_BLOB && int32((*IndexedExpr)(unsafe.Pointer(p)).Faff) != SQLITE_AFF_BLOB || int32(exprAff) == SQLITE_AFF_TEXT && int32((*IndexedExpr)(unsafe.Pointer(p)).Faff) != SQLITE_AFF_TEXT || int32(exprAff) >= SQLITE_AFF_NUMERIC && int32((*IndexedExpr)(unsafe.Pointer(p)).Faff) != SQLITE_AFF_NUMERIC { continue } v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if (*IndexedExpr)(unsafe.Pointer(p)).FbMaybeNullRow != 0 { var addr int32 = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp3(tls, v, OP_IfNullRow, (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCur, addr+3, target) Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCur, (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCol, target) Xsqlite3VdbeGoto(tls, v, 0) p = (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr = uintptr(0) Xsqlite3ExprCode(tls, pParse, pExpr, target) (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr = p Xsqlite3VdbeJumpHere(tls, v, addr+2) } else { Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCur, (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCol, target) } return target } return -1 } // Generate code into the current Vdbe to evaluate the given // expression. Attempt to store the results in register "target". // Return the register where results are stored. // // With this routine, there is no guarantee that results will // be stored in target. The result might be stored in some other // register if it is convenient to do so. The calling function // must check the return code and move the results to the desired // register. func Xsqlite3ExprCodeTarget(tls *libc.TLS, pParse uintptr, pExpr uintptr, target int32) int32 { bp := tls.Alloc(192) defer tls.Free(192) var v uintptr var op int32 var inReg int32 var r1 int32 var r2 int32 var p5 int32 var pTab uintptr var pAggInfo uintptr var pCol uintptr var aff int32 var pCol1 uintptr var pTab1 uintptr var iSrc int32 var iCol int32 var iTab int32 var iReg int32 var n int32 var z uintptr var zBlob uintptr var z1 uintptr var pLeft uintptr var pLeft1 uintptr var isTrue int32 var bNormal int32 var addr int32 var pInfo uintptr var exprOp U8 var pFarg uintptr var nFarg int32 var pDef uintptr var zId uintptr var constMask U32 var i int32 var db uintptr var enc U8 var pColl uintptr var nCol int32 var n1 int32 var pLeft2 uintptr var destIfFalse int32 var destIfNull int32 var pTab2 uintptr var iCol1 int32 var p1 int32 var addrINR int32 var okConstFactor U8 var pAggInfo1 uintptr var endLabel int32 var nextCase int32 var nExpr int32 var i1 int32 var pEList uintptr var aListelem uintptr var pX uintptr var pTest uintptr var pDel uintptr var db1 uintptr v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe inReg = target *(*int32)(unsafe.Pointer(bp + 40)) = 0 *(*int32)(unsafe.Pointer(bp + 44)) = 0 p5 = 0 expr_code_doover: if !(pExpr == uintptr(0)) { goto __1 } op = TK_NULL goto __2 __1: if !((*Parse)(unsafe.Pointer(pParse)).FpIdxEpr != uintptr(0) && !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Leaf) != U32(0)) && libc.AssignInt32(&r1, sqlite3IndexedExprLookup(tls, pParse, pExpr, target)) >= 0) { goto __3 } return r1 goto __4 __3: ; op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) __4: ; __2: ; switch op { case TK_AGG_COLUMN: goto __6 case TK_COLUMN: goto __7 case TK_INTEGER: goto __8 case TK_TRUEFALSE: goto __9 case TK_FLOAT: goto __10 case TK_STRING: goto __11 default: goto __12 case TK_BLOB: goto __13 case TK_VARIABLE: goto __14 case TK_REGISTER: goto __15 case TK_CAST: goto __16 case TK_IS: goto __17 case TK_ISNOT: goto __18 case TK_LT: goto __19 case TK_LE: goto __20 case TK_GT: goto __21 case TK_GE: goto __22 case TK_NE: goto __23 case TK_EQ: goto __24 case TK_AND: goto __25 case TK_OR: goto __26 case TK_PLUS: goto __27 case TK_STAR: goto __28 case TK_MINUS: goto __29 case TK_REM: goto __30 case TK_BITAND: goto __31 case TK_BITOR: goto __32 case TK_SLASH: goto __33 case TK_LSHIFT: goto __34 case TK_RSHIFT: goto __35 case TK_CONCAT: goto __36 case TK_UMINUS: goto __37 case TK_BITNOT: goto __38 case TK_NOT: goto __39 case TK_TRUTH: goto __40 case TK_ISNULL: goto __41 case TK_NOTNULL: goto __42 case TK_AGG_FUNCTION: goto __43 case TK_FUNCTION: goto __44 case TK_EXISTS: goto __45 case TK_SELECT: goto __46 case TK_SELECT_COLUMN: goto __47 case TK_IN: goto __48 case TK_BETWEEN: goto __49 case TK_COLLATE: goto __50 case TK_SPAN: goto __51 case TK_UPLUS: goto __52 case TK_TRIGGER: goto __53 case TK_VECTOR: goto __54 case TK_IF_NULL_ROW: goto __55 case TK_CASE: goto __56 case TK_RAISE: goto __57 } goto __5 __6: pAggInfo = (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo pCol = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol + uintptr((*Expr)(unsafe.Pointer(pExpr)).FiAgg)*24 if !!(int32((*AggInfo)(unsafe.Pointer(pAggInfo)).FdirectMode) != 0) { goto __58 } return func() int32 { return (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg + int32((*Expr)(unsafe.Pointer(pExpr)).FiAgg) }() goto __59 __58: if !((*AggInfo)(unsafe.Pointer(pAggInfo)).FuseSortingIdx != 0) { goto __60 } pTab = (*AggInfo_col)(unsafe.Pointer(pCol)).FpTab Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdxPTab, int32((*AggInfo_col)(unsafe.Pointer(pCol)).FiSorterColumn), target) if !(pTab == uintptr(0)) { goto __62 } goto __63 __62: if !(int32((*AggInfo_col)(unsafe.Pointer(pCol)).FiColumn) < 0) { goto __64 } goto __65 __64: ; if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr((*AggInfo_col)(unsafe.Pointer(pCol)).FiColumn)*24)).Faffinity) == SQLITE_AFF_REAL) { goto __66 } Xsqlite3VdbeAddOp1(tls, v, OP_RealAffinity, target) __66: ; __65: ; __63: ; return target goto __61 __60: if !(*(*uintptr)(unsafe.Pointer(pExpr + 64)) == uintptr(0)) { goto __67 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*Expr)(unsafe.Pointer(pExpr)).FiTable, int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn), target) return target __67: ; __61: ; __59: ; __7: iTab = (*Expr)(unsafe.Pointer(pExpr)).FiTable if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_FixedCol) != U32(0)) { goto __68 } iReg = Xsqlite3ExprCodeTarget(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, target) aff = int32(Xsqlite3TableColumnAffinity(tls, *(*uintptr)(unsafe.Pointer(pExpr + 64)), int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn))) if !(aff > SQLITE_AFF_BLOB) { goto __69 } Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, iReg, 1, 0, uintptr(unsafe.Pointer(&zAff))+uintptr((aff-'B')*2), -1) __69: ; return iReg __68: ; if !(iTab < 0) { goto __70 } if !((*Parse)(unsafe.Pointer(pParse)).FiSelfTab < 0) { goto __71 } iCol = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) pTab1 = *(*uintptr)(unsafe.Pointer(pExpr + 64)) if !(iCol < 0) { goto __73 } return -1 - (*Parse)(unsafe.Pointer(pParse)).FiSelfTab __73: ; pCol1 = (*Table)(unsafe.Pointer(pTab1)).FaCol + uintptr(iCol)*24 iSrc = int32(Xsqlite3TableColumnToStorage(tls, pTab1, int16(iCol))) - (*Parse)(unsafe.Pointer(pParse)).FiSelfTab if !(int32((*Column)(unsafe.Pointer(pCol1)).FcolFlags)&COLFLAG_GENERATED != 0) { goto __74 } if !(int32((*Column)(unsafe.Pointer(pCol1)).FcolFlags)&COLFLAG_BUSY != 0) { goto __76 } Xsqlite3ErrorMsg(tls, pParse, ts+9322, libc.VaList(bp, (*Column)(unsafe.Pointer(pCol1)).FzCnName)) return 0 __76: ; *(*U16)(unsafe.Pointer(pCol1 + 16)) |= U16(COLFLAG_BUSY) if !(int32((*Column)(unsafe.Pointer(pCol1)).FcolFlags)&COLFLAG_NOTAVAIL != 0) { goto __77 } Xsqlite3ExprCodeGeneratedColumn(tls, pParse, pTab1, pCol1, iSrc) __77: ; *(*U16)(unsafe.Pointer(pCol1 + 16)) &= libc.Uint16FromInt32(libc.CplInt32(COLFLAG_BUSY | COLFLAG_NOTAVAIL)) return iSrc goto __75 __74: if !(int32((*Column)(unsafe.Pointer(pCol1)).Faffinity) == SQLITE_AFF_REAL) { goto __78 } Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, iSrc, target) Xsqlite3VdbeAddOp1(tls, v, OP_RealAffinity, target) return target goto __79 __78: return iSrc __79: ; __75: ; goto __72 __71: iTab = (*Parse)(unsafe.Pointer(pParse)).FiSelfTab - 1 __72: ; __70: ; iReg = Xsqlite3ExprCodeGetColumn(tls, pParse, *(*uintptr)(unsafe.Pointer(pExpr + 64)), int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn), iTab, target, (*Expr)(unsafe.Pointer(pExpr)).Fop2) return iReg __8: codeInteger(tls, pParse, pExpr, 0, target) return target __9: Xsqlite3VdbeAddOp2(tls, v, OP_Integer, Xsqlite3ExprTruthValue(tls, pExpr), target) return target __10: ; codeReal(tls, v, *(*uintptr)(unsafe.Pointer(pExpr + 8)), 0, target) return target __11: ; Xsqlite3VdbeLoadString(tls, v, target, *(*uintptr)(unsafe.Pointer(pExpr + 8))) return target __12: ; Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, target) return target __13: ; z = *(*uintptr)(unsafe.Pointer(pExpr + 8)) + 2 n = Xsqlite3Strlen30(tls, z) - 1 zBlob = Xsqlite3HexToBlob(tls, Xsqlite3VdbeDb(tls, v), z, n) Xsqlite3VdbeAddOp4(tls, v, OP_Blob, n/2, target, 0, zBlob, -6) return target __14: ; Xsqlite3VdbeAddOp2(tls, v, OP_Variable, int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn), target) if !(int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 8)) + 1))) != 0) { goto __80 } z1 = Xsqlite3VListNumToName(tls, (*Parse)(unsafe.Pointer(pParse)).FpVList, int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn)) *(*VList)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).FpVList)) = 0 Xsqlite3VdbeAppendP4(tls, v, z1, -1) __80: ; return target __15: return (*Expr)(unsafe.Pointer(pExpr)).FiTable __16: inReg = Xsqlite3ExprCodeTarget(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, target) if !(inReg != target) { goto __81 } Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, inReg, target) inReg = target __81: ; Xsqlite3VdbeAddOp2(tls, v, OP_Cast, target, int32(Xsqlite3AffinityType(tls, *(*uintptr)(unsafe.Pointer(pExpr + 8)), uintptr(0)))) return inReg __17: __18: if op == TK_IS { op = TK_EQ } else { op = TK_NE } p5 = SQLITE_NULLEQ __19: __20: __21: __22: __23: __24: pLeft = (*Expr)(unsafe.Pointer(pExpr)).FpLeft if !(Xsqlite3ExprIsVector(tls, pLeft) != 0) { goto __82 } codeVectorCompare(tls, pParse, pExpr, target, uint8(op), uint8(p5)) goto __83 __82: r1 = Xsqlite3ExprCodeTemp(tls, pParse, pLeft, bp+40) r2 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, bp+44) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, inReg) codeCompare(tls, pParse, pLeft, (*Expr)(unsafe.Pointer(pExpr)).FpRight, op, r1, r2, Xsqlite3VdbeCurrentAddr(tls, v)+2, p5, libc.Bool32((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Commuted) != U32(0))) if !(p5 == SQLITE_NULLEQ) { goto __84 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, inReg) goto __85 __84: Xsqlite3VdbeAddOp3(tls, v, OP_ZeroOrNull, r1, inReg, r2) __85: ; __83: ; goto __5 __25: __26: __27: __28: __29: __30: __31: __32: __33: __34: __35: __36: ; r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp+40) r2 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, bp+44) Xsqlite3VdbeAddOp3(tls, v, op, r2, r1, target) goto __5 __37: pLeft1 = (*Expr)(unsafe.Pointer(pExpr)).FpLeft if !(int32((*Expr)(unsafe.Pointer(pLeft1)).Fop) == TK_INTEGER) { goto __86 } codeInteger(tls, pParse, pLeft1, 1, target) return target goto __87 __86: if !(int32((*Expr)(unsafe.Pointer(pLeft1)).Fop) == TK_FLOAT) { goto __88 } codeReal(tls, v, *(*uintptr)(unsafe.Pointer(pLeft1 + 8)), 1, target) return target goto __89 __88: (*Expr)(unsafe.Pointer(bp + 48)).Fop = U8(TK_INTEGER) (*Expr)(unsafe.Pointer(bp + 48)).Fflags = U32(EP_IntValue | EP_TokenOnly) *(*int32)(unsafe.Pointer(bp + 48 + 8)) = 0 r1 = Xsqlite3ExprCodeTemp(tls, pParse, bp+48, bp+40) r2 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp+44) Xsqlite3VdbeAddOp3(tls, v, OP_Subtract, r2, r1, target) __89: ; __87: ; goto __5 __38: __39: ; r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp+40) Xsqlite3VdbeAddOp2(tls, v, op, r1, inReg) goto __5 __40: r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp+40) isTrue = Xsqlite3ExprTruthValue(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) bNormal = libc.Bool32(int32((*Expr)(unsafe.Pointer(pExpr)).Fop2) == TK_IS) Xsqlite3VdbeAddOp4Int(tls, v, OP_IsTrue, r1, inReg, libc.BoolInt32(!(isTrue != 0)), isTrue^bNormal) goto __5 __41: __42: ; Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, target) r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp+40) addr = Xsqlite3VdbeAddOp1(tls, v, op, r1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, target) Xsqlite3VdbeJumpHere(tls, v, addr) goto __5 __43: pInfo = (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo if !(pInfo == uintptr(0) || int32((*Expr)(unsafe.Pointer(pExpr)).FiAgg) < 0 || int32((*Expr)(unsafe.Pointer(pExpr)).FiAgg) >= (*AggInfo)(unsafe.Pointer(pInfo)).FnFunc) { goto __90 } Xsqlite3ErrorMsg(tls, pParse, ts+9383, libc.VaList(bp+8, pExpr)) goto __91 __90: return func() int32 { return (*AggInfo)(unsafe.Pointer(pInfo)).FiFirstReg + (*AggInfo)(unsafe.Pointer(pInfo)).FnColumn + int32((*Expr)(unsafe.Pointer(pExpr)).FiAgg) }() __91: ; goto __5 __44: constMask = U32(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb enc = (*Sqlite3)(unsafe.Pointer(db)).Fenc pColl = uintptr(0) if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0)) { goto __92 } return (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 64)))).FregResult __92: ; if !((*Parse)(unsafe.Pointer(pParse)).FokConstFactor != 0 && Xsqlite3ExprIsConstantNotJoin(tls, pExpr) != 0) { goto __93 } return Xsqlite3ExprCodeRunJustOnce(tls, pParse, pExpr, -1) __93: ; pFarg = *(*uintptr)(unsafe.Pointer(pExpr + 32)) if pFarg != 0 { nFarg = (*ExprList)(unsafe.Pointer(pFarg)).FnExpr } else { nFarg = 0 } zId = *(*uintptr)(unsafe.Pointer(pExpr + 8)) pDef = Xsqlite3FindFunction(tls, db, zId, nFarg, enc, uint8(0)) if !(pDef == uintptr(0) || (*FuncDef)(unsafe.Pointer(pDef)).FxFinalize != uintptr(0)) { goto __94 } Xsqlite3ErrorMsg(tls, pParse, ts+9410, libc.VaList(bp+16, pExpr)) goto __5 __94: ; if !((*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_INLINE) != 0) { goto __95 } return exprCodeInlineFunction(tls, pParse, pFarg, int32((*FuncDef)(unsafe.Pointer(pDef)).FpUserData), target) goto __96 __95: if !((*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE) != 0) { goto __97 } Xsqlite3ExprFunctionUsable(tls, pParse, pExpr, pDef) __97: ; __96: ; i = 0 __98: if !(i < nFarg) { goto __100 } if !(i < 32 && Xsqlite3ExprIsConstant(tls, (*ExprList_item)(unsafe.Pointer(pFarg+8+uintptr(i)*32)).FpExpr) != 0) { goto __101 } constMask = constMask | uint32(1)<= 2 && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_InfixFunc) != U32(0)) { goto __109 } pDef = Xsqlite3VtabOverloadFunction(tls, db, pDef, nFarg, (*ExprList_item)(unsafe.Pointer(pFarg+8+1*32)).FpExpr) goto __110 __109: if !(nFarg > 0) { goto __111 } pDef = Xsqlite3VtabOverloadFunction(tls, db, pDef, nFarg, (*ExprList_item)(unsafe.Pointer(pFarg+8)).FpExpr) __111: ; __110: ; if !((*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_NEEDCOLL) != 0) { goto __112 } if !!(pColl != 0) { goto __113 } pColl = (*Sqlite3)(unsafe.Pointer(db)).FpDfltColl __113: ; Xsqlite3VdbeAddOp4(tls, v, OP_CollSeq, 0, 0, 0, pColl, -2) __112: ; Xsqlite3VdbeAddFunctionCall(tls, pParse, int32(constMask), r1, target, nFarg, pDef, int32((*Expr)(unsafe.Pointer(pExpr)).Fop2)) if !(nFarg != 0) { goto __114 } if !(constMask == U32(0)) { goto __115 } Xsqlite3ReleaseTempRange(tls, pParse, r1, nFarg) goto __116 __115: ; __116: ; __114: ; return target __45: __46: ; if !((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0) { goto __117 } return 0 goto __118 __117: if !(op == TK_SELECT && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) && libc.AssignInt32(&nCol, (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FpEList)).FnExpr) != 1) { goto __119 } Xsqlite3SubselectError(tls, pParse, nCol, 1) goto __120 __119: return Xsqlite3CodeSubselect(tls, pParse, pExpr) __120: ; __118: ; goto __5 __47: pLeft2 = (*Expr)(unsafe.Pointer(pExpr)).FpLeft if !((*Expr)(unsafe.Pointer(pLeft2)).FiTable == 0 || int32((*Parse)(unsafe.Pointer(pParse)).FwithinRJSubrtn) > int32((*Expr)(unsafe.Pointer(pLeft2)).Fop2)) { goto __121 } (*Expr)(unsafe.Pointer(pLeft2)).FiTable = Xsqlite3CodeSubselect(tls, pParse, pLeft2) (*Expr)(unsafe.Pointer(pLeft2)).Fop2 = (*Parse)(unsafe.Pointer(pParse)).FwithinRJSubrtn __121: ; n1 = Xsqlite3ExprVectorSize(tls, pLeft2) if !((*Expr)(unsafe.Pointer(pExpr)).FiTable != n1) { goto __122 } Xsqlite3ErrorMsg(tls, pParse, ts+8993, libc.VaList(bp+24, (*Expr)(unsafe.Pointer(pExpr)).FiTable, n1)) __122: ; return (*Expr)(unsafe.Pointer(pLeft2)).FiTable + int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) __48: destIfFalse = Xsqlite3VdbeMakeLabel(tls, pParse) destIfNull = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, target) sqlite3ExprCodeIN(tls, pParse, pExpr, destIfFalse, destIfNull) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, target) Xsqlite3VdbeResolveLabel(tls, v, destIfFalse) Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, target, 0) Xsqlite3VdbeResolveLabel(tls, v, destIfNull) return target __49: exprCodeBetween(tls, pParse, pExpr, target, uintptr(0), 0) return target __50: if !!((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Collate) != U32(0)) { goto __123 } inReg = Xsqlite3ExprCodeTarget(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, target) if !(inReg != target) { goto __125 } Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, inReg, target) inReg = target __125: ; Xsqlite3VdbeAddOp1(tls, v, OP_ClrSubtype, inReg) return inReg goto __124 __123: pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft goto expr_code_doover __124: ; __51: __52: pExpr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft goto expr_code_doover __53: ; pTab2 = *(*uintptr)(unsafe.Pointer(pExpr + 64)) iCol1 = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) p1 = (*Expr)(unsafe.Pointer(pExpr)).FiTable*(int32((*Table)(unsafe.Pointer(pTab2)).FnCol)+1) + 1 + int32(Xsqlite3TableColumnToStorage(tls, pTab2, int16(iCol1))) Xsqlite3VdbeAddOp2(tls, v, OP_Param, p1, target) if !(iCol1 >= 0 && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab2)).FaCol+uintptr(iCol1)*24)).Faffinity) == SQLITE_AFF_REAL) { goto __126 } Xsqlite3VdbeAddOp1(tls, v, OP_RealAffinity, target) __126: ; goto __5 __54: Xsqlite3ErrorMsg(tls, pParse, ts+7885, 0) goto __5 __55: okConstFactor = (*Parse)(unsafe.Pointer(pParse)).FokConstFactor pAggInfo1 = (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo if !(pAggInfo1 != 0) { goto __127 } if !!(int32((*AggInfo)(unsafe.Pointer(pAggInfo1)).FdirectMode) != 0) { goto __128 } inReg = func() int32 { return (*AggInfo)(unsafe.Pointer(pAggInfo1)).FiFirstReg + int32((*Expr)(unsafe.Pointer(pExpr)).FiAgg) }() goto __5 __128: ; if !((*AggInfo)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpAggInfo)).FuseSortingIdx != 0) { goto __129 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*AggInfo)(unsafe.Pointer(pAggInfo1)).FsortingIdxPTab, int32((*AggInfo_col)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo1)).FaCol+uintptr((*Expr)(unsafe.Pointer(pExpr)).FiAgg)*24)).FiSorterColumn), target) inReg = target goto __5 __129: ; __127: ; addrINR = Xsqlite3VdbeAddOp3(tls, v, OP_IfNullRow, (*Expr)(unsafe.Pointer(pExpr)).FiTable, 0, target) (*Parse)(unsafe.Pointer(pParse)).FokConstFactor = U8(0) inReg = Xsqlite3ExprCodeTarget(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, target) (*Parse)(unsafe.Pointer(pParse)).FokConstFactor = okConstFactor if !(inReg != target) { goto __130 } Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, inReg, target) inReg = target __130: ; Xsqlite3VdbeJumpHere(tls, v, addrINR) goto __5 __56: pTest = uintptr(0) pDel = uintptr(0) db1 = (*Parse)(unsafe.Pointer(pParse)).Fdb pEList = *(*uintptr)(unsafe.Pointer(pExpr + 32)) aListelem = pEList + 8 nExpr = (*ExprList)(unsafe.Pointer(pEList)).FnExpr endLabel = Xsqlite3VdbeMakeLabel(tls, pParse) if !(libc.AssignUintptr(&pX, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) != uintptr(0)) { goto __131 } pDel = Xsqlite3ExprDup(tls, db1, pX, 0) if !((*Sqlite3)(unsafe.Pointer(db1)).FmallocFailed != 0) { goto __132 } Xsqlite3ExprDelete(tls, db1, pDel) goto __5 __132: ; exprToRegister(tls, pDel, exprCodeVector(tls, pParse, pDel, bp+40)) libc.Xmemset(tls, bp+120, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(bp + 120)).Fop = U8(TK_EQ) (*Expr)(unsafe.Pointer(bp + 120)).FpLeft = pDel pTest = bp + 120 *(*int32)(unsafe.Pointer(bp + 40)) = 0 __131: ; i1 = 0 __133: if !(i1 < nExpr-1) { goto __135 } if !(pX != 0) { goto __136 } (*Expr)(unsafe.Pointer(bp + 120)).FpRight = (*ExprList_item)(unsafe.Pointer(aListelem + uintptr(i1)*32)).FpExpr goto __137 __136: pTest = (*ExprList_item)(unsafe.Pointer(aListelem + uintptr(i1)*32)).FpExpr __137: ; nextCase = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3ExprIfFalse(tls, pParse, pTest, nextCase, SQLITE_JUMPIFNULL) Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(aListelem+uintptr(i1+1)*32)).FpExpr, target) Xsqlite3VdbeGoto(tls, v, endLabel) Xsqlite3VdbeResolveLabel(tls, v, nextCase) goto __134 __134: i1 = i1 + 2 goto __133 goto __135 __135: ; if !(nExpr&1 != 0) { goto __138 } Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(nExpr-1)*32)).FpExpr, target) goto __139 __138: Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, target) __139: ; Xsqlite3ExprDelete(tls, db1, pDel) setDoNotMergeFlagOnCopy(tls, v) Xsqlite3VdbeResolveLabel(tls, v, endLabel) goto __5 __57: ; if !(!(int32((*Parse)(unsafe.Pointer(pParse)).FpTriggerTab) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0)) { goto __140 } Xsqlite3ErrorMsg(tls, pParse, ts+9434, 0) return 0 __140: ; if !(int32((*Expr)(unsafe.Pointer(pExpr)).FaffExpr) == OE_Abort) { goto __141 } Xsqlite3MayAbort(tls, pParse) __141: ; if !(int32((*Expr)(unsafe.Pointer(pExpr)).FaffExpr) == OE_Ignore) { goto __142 } Xsqlite3VdbeAddOp4(tls, v, OP_Halt, SQLITE_OK, OE_Ignore, 0, *(*uintptr)(unsafe.Pointer(pExpr + 8)), 0) goto __143 __142: Xsqlite3HaltConstraint(tls, pParse, func() int32 { if (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab != 0 { return SQLITE_CONSTRAINT | int32(7)<<8 } return SQLITE_ERROR }(), int32((*Expr)(unsafe.Pointer(pExpr)).FaffExpr), *(*uintptr)(unsafe.Pointer(pExpr + 8)), int8(0), uint8(0)) __143: ; goto __5 __5: ; Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 40))) Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 44))) return inReg } var zAff = *(*[10]int8)(unsafe.Pointer(ts + 9484)) // Generate code that will evaluate expression pExpr just one time // per prepared statement execution. // // If the expression uses functions (that might throw an exception) then // guard them with an OP_Once opcode to ensure that the code is only executed // once. If no functions are involved, then factor the code out and put it at // the end of the prepared statement in the initialization section. // // If regDest>=0 then the result is always stored in that register and the // result is not reusable. If regDest<0 then this routine is free to // store the value whereever it wants. The register where the expression // is stored is returned. When regDest<0, two identical expressions might // code to the same register, if they do not contain function calls and hence // are factored out into the initialization section at the end of the // prepared statement. func Xsqlite3ExprCodeRunJustOnce(tls *libc.TLS, pParse uintptr, pExpr uintptr, regDest int32) int32 { var p uintptr p = (*Parse)(unsafe.Pointer(pParse)).FpConstExpr if regDest < 0 && p != 0 { var pItem uintptr var i int32 pItem = p + 8 i = (*ExprList)(unsafe.Pointer(p)).FnExpr __1: if !(i > 0) { goto __3 } { if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 16 + 4))&0x8>>3)) != 0 && Xsqlite3ExprCompare(tls, uintptr(0), (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr, pExpr, -1) == 0 { return *(*int32)(unsafe.Pointer(pItem + 24)) } } goto __2 __2: pItem += 32 i-- goto __1 goto __3 __3: } pExpr = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr, 0) if pExpr != uintptr(0) && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_HasFunc) != U32(0) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var addr int32 addr = Xsqlite3VdbeAddOp0(tls, v, OP_Once) (*Parse)(unsafe.Pointer(pParse)).FokConstFactor = U8(0) if !(int32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed) != 0) { if regDest < 0 { regDest = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) } Xsqlite3ExprCode(tls, pParse, pExpr, regDest) } (*Parse)(unsafe.Pointer(pParse)).FokConstFactor = U8(1) Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) Xsqlite3VdbeJumpHere(tls, v, addr) } else { p = Xsqlite3ExprListAppend(tls, pParse, p, pExpr) if p != 0 { var pItem uintptr = p + 8 + uintptr((*ExprList)(unsafe.Pointer(p)).FnExpr-1)*32 libc.SetBitFieldPtr16Uint32(pItem+16+4, uint32(libc.Bool32(regDest < 0)), 3, 0x8) if regDest < 0 { regDest = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) } *(*int32)(unsafe.Pointer(pItem + 24)) = regDest } (*Parse)(unsafe.Pointer(pParse)).FpConstExpr = p } return regDest } // Generate code to evaluate an expression and store the results // into a register. Return the register number where the results // are stored. // // If the register is a temporary register that can be deallocated, // then write its number into *pReg. If the result register is not // a temporary, then set *pReg to zero. // // If pExpr is a constant, then this routine might generate this // code to fill the register in the initialization section of the // VDBE program, in order to factor it out of the evaluation loop. func Xsqlite3ExprCodeTemp(tls *libc.TLS, pParse uintptr, pExpr uintptr, pReg uintptr) int32 { var r2 int32 pExpr = Xsqlite3ExprSkipCollateAndLikely(tls, pExpr) if (*Parse)(unsafe.Pointer(pParse)).FokConstFactor != 0 && pExpr != uintptr(0) && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_REGISTER && Xsqlite3ExprIsConstantNotJoin(tls, pExpr) != 0 { *(*int32)(unsafe.Pointer(pReg)) = 0 r2 = Xsqlite3ExprCodeRunJustOnce(tls, pParse, pExpr, -1) } else { var r1 int32 = Xsqlite3GetTempReg(tls, pParse) r2 = Xsqlite3ExprCodeTarget(tls, pParse, pExpr, r1) if r2 == r1 { *(*int32)(unsafe.Pointer(pReg)) = r1 } else { Xsqlite3ReleaseTempReg(tls, pParse, r1) *(*int32)(unsafe.Pointer(pReg)) = 0 } } return r2 } // Generate code that will evaluate expression pExpr and store the // results in register target. The results are guaranteed to appear // in register target. func Xsqlite3ExprCode(tls *libc.TLS, pParse uintptr, pExpr uintptr, target int32) { var inReg int32 if (*Parse)(unsafe.Pointer(pParse)).FpVdbe == uintptr(0) { return } inReg = Xsqlite3ExprCodeTarget(tls, pParse, pExpr, target) if inReg != target { var op U8 if pExpr != 0 && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Subquery) != U32(0) { op = U8(OP_Copy) } else { op = U8(OP_SCopy) } Xsqlite3VdbeAddOp2(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, int32(op), inReg, target) } } // Make a transient copy of expression pExpr and then code it using // sqlite3ExprCode(). This routine works just like sqlite3ExprCode() // except that the input expression is guaranteed to be unchanged. func Xsqlite3ExprCodeCopy(tls *libc.TLS, pParse uintptr, pExpr uintptr, target int32) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb pExpr = Xsqlite3ExprDup(tls, db, pExpr, 0) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { Xsqlite3ExprCode(tls, pParse, pExpr, target) } Xsqlite3ExprDelete(tls, db, pExpr) } // Generate code that will evaluate expression pExpr and store the // results in register target. The results are guaranteed to appear // in register target. If the expression is constant, then this routine // might choose to code the expression at initialization time. func Xsqlite3ExprCodeFactorable(tls *libc.TLS, pParse uintptr, pExpr uintptr, target int32) { if (*Parse)(unsafe.Pointer(pParse)).FokConstFactor != 0 && Xsqlite3ExprIsConstantNotJoin(tls, pExpr) != 0 { Xsqlite3ExprCodeRunJustOnce(tls, pParse, pExpr, target) } else { Xsqlite3ExprCodeCopy(tls, pParse, pExpr, target) } } // Generate code that pushes the value of every element of the given // expression list into a sequence of registers beginning at target. // // Return the number of elements evaluated. The number returned will // usually be pList->nExpr but might be reduced if SQLITE_ECEL_OMITREF // is defined. // // The SQLITE_ECEL_DUP flag prevents the arguments from being // filled using OP_SCopy. OP_Copy must be used instead. // // The SQLITE_ECEL_FACTOR argument allows constant arguments to be // factored out into initialization code. // // The SQLITE_ECEL_REF flag means that expressions in the list with // ExprList.a[].u.x.iOrderByCol>0 have already been evaluated and stored // in registers at srcReg, and so the value can be copied from there. // If SQLITE_ECEL_OMITREF is also set, then the values with u.x.iOrderByCol>0 // are simply omitted rather than being copied from srcReg. func Xsqlite3ExprCodeExprList(tls *libc.TLS, pParse uintptr, pList uintptr, target int32, srcReg int32, flags U8) int32 { var pItem uintptr var i int32 var j int32 var n int32 var copyOp U8 if int32(flags)&SQLITE_ECEL_DUP != 0 { copyOp = uint8(OP_Copy) } else { copyOp = uint8(OP_SCopy) } var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe n = (*ExprList)(unsafe.Pointer(pList)).FnExpr if !(int32((*Parse)(unsafe.Pointer(pParse)).FokConstFactor) != 0) { flags = libc.Uint8FromInt32(int32(flags) & libc.CplInt32(SQLITE_ECEL_FACTOR)) } pItem = pList + 8 i = 0 __1: if !(i < n) { goto __3 } { var pExpr uintptr = (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr if int32(flags)&SQLITE_ECEL_REF != 0 && libc.AssignInt32(&j, int32(*(*U16)(unsafe.Pointer(pItem + 24)))) > 0 { if int32(flags)&SQLITE_ECEL_OMITREF != 0 { i-- n-- } else { Xsqlite3VdbeAddOp2(tls, v, int32(copyOp), j+srcReg-1, target+i) } } else if int32(flags)&SQLITE_ECEL_FACTOR != 0 && Xsqlite3ExprIsConstantNotJoin(tls, pExpr) != 0 { Xsqlite3ExprCodeRunJustOnce(tls, pParse, pExpr, target+i) } else { var inReg int32 = Xsqlite3ExprCodeTarget(tls, pParse, pExpr, target+i) if inReg != target+i { var pOp uintptr if int32(copyOp) == OP_Copy && int32((*VdbeOp)(unsafe.Pointer(libc.AssignUintptr(&pOp, Xsqlite3VdbeGetLastOp(tls, v)))).Fopcode) == OP_Copy && (*VdbeOp)(unsafe.Pointer(pOp)).Fp1+(*VdbeOp)(unsafe.Pointer(pOp)).Fp3+1 == inReg && (*VdbeOp)(unsafe.Pointer(pOp)).Fp2+(*VdbeOp)(unsafe.Pointer(pOp)).Fp3+1 == target+i && int32((*VdbeOp)(unsafe.Pointer(pOp)).Fp5) == 0 { (*VdbeOp)(unsafe.Pointer(pOp)).Fp3++ } else { Xsqlite3VdbeAddOp2(tls, v, int32(copyOp), inReg, target+i) } } } } goto __2 __2: i++ pItem += 32 goto __1 goto __3 __3: ; return n } func exprCodeBetween(tls *libc.TLS, pParse uintptr, pExpr uintptr, dest int32, xJump uintptr, jumpIfNull int32) { bp := tls.Alloc(220) defer tls.Free(220) *(*int32)(unsafe.Pointer(bp + 216)) = 0 var pDel uintptr = uintptr(0) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Expr{}))) libc.Xmemset(tls, bp+72, 0, uint64(unsafe.Sizeof(Expr{}))) libc.Xmemset(tls, bp+144, 0, uint64(unsafe.Sizeof(Expr{}))) pDel = Xsqlite3ExprDup(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, 0) if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 { (*Expr)(unsafe.Pointer(bp + 144)).Fop = U8(TK_AND) (*Expr)(unsafe.Pointer(bp + 144)).FpLeft = bp (*Expr)(unsafe.Pointer(bp + 144)).FpRight = bp + 72 (*Expr)(unsafe.Pointer(bp)).Fop = U8(TK_GE) (*Expr)(unsafe.Pointer(bp)).FpLeft = pDel (*Expr)(unsafe.Pointer(bp)).FpRight = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)) + 8)).FpExpr (*Expr)(unsafe.Pointer(bp + 72)).Fop = U8(TK_LE) (*Expr)(unsafe.Pointer(bp + 72)).FpLeft = pDel (*Expr)(unsafe.Pointer(bp + 72)).FpRight = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)) + 8 + 1*32)).FpExpr exprToRegister(tls, pDel, exprCodeVector(tls, pParse, pDel, bp+216)) if xJump != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr, int32, int32) })(unsafe.Pointer(&struct{ uintptr }{xJump})).f(tls, pParse, bp+144, dest, jumpIfNull) } else { *(*U32)(unsafe.Pointer(pDel + 4)) |= U32(EP_OuterON) Xsqlite3ExprCodeTarget(tls, pParse, bp+144, dest) } Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 216))) } Xsqlite3ExprDelete(tls, db, pDel) } // Generate code for a boolean expression such that a jump is made // to the label "dest" if the expression is true but execution // continues straight thru if the expression is false. // // If the expression evaluates to NULL (neither true nor false), then // take the jump if the jumpIfNull flag is SQLITE_JUMPIFNULL. // // This code depends on the fact that certain token values (ex: TK_EQ) // are the same as opcode values (ex: OP_Eq) that implement the corresponding // operation. Special comments in vdbe.c and the mkopcodeh.awk script in // the make process cause these values to align. Assert()s in the code // below verify that the numbers are aligned correctly. func Xsqlite3ExprIfTrue(tls *libc.TLS, pParse uintptr, pExpr uintptr, dest int32, jumpIfNull int32) { bp := tls.Alloc(8) defer tls.Free(8) var v uintptr var op int32 var r1 int32 var r2 int32 var d2 int32 var pAlt uintptr var isNot int32 var isTrue int32 var destIfFalse int32 var destIfNull int32 v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe op = 0 *(*int32)(unsafe.Pointer(bp)) = 0 *(*int32)(unsafe.Pointer(bp + 4)) = 0 if !(v == uintptr(0)) { goto __1 } return __1: ; if !(pExpr == uintptr(0)) { goto __2 } return __2: ; op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) switch op { case TK_AND: goto __4 case TK_OR: goto __5 case TK_NOT: goto __6 case TK_TRUTH: goto __7 case TK_IS: goto __8 case TK_ISNOT: goto __9 case TK_LT: goto __10 case TK_LE: goto __11 case TK_GT: goto __12 case TK_GE: goto __13 case TK_NE: goto __14 case TK_EQ: goto __15 case TK_ISNULL: goto __16 case TK_NOTNULL: goto __17 case TK_BETWEEN: goto __18 case TK_IN: goto __19 default: goto __20 } goto __3 __4: __5: pAlt = Xsqlite3ExprSimplifiedAndOr(tls, pExpr) if !(pAlt != pExpr) { goto __21 } Xsqlite3ExprIfTrue(tls, pParse, pAlt, dest, jumpIfNull) goto __22 __21: if !(op == TK_AND) { goto __23 } d2 = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3ExprIfFalse(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL) Xsqlite3ExprIfTrue(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, dest, jumpIfNull) Xsqlite3VdbeResolveLabel(tls, v, d2) goto __24 __23: ; Xsqlite3ExprIfTrue(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, jumpIfNull) Xsqlite3ExprIfTrue(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, dest, jumpIfNull) __24: ; __22: ; goto __3 __6: ; Xsqlite3ExprIfFalse(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, jumpIfNull) goto __3 __7: ; isNot = libc.Bool32(int32((*Expr)(unsafe.Pointer(pExpr)).Fop2) == TK_ISNOT) isTrue = Xsqlite3ExprTruthValue(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) if !(isTrue^isNot != 0) { goto __25 } Xsqlite3ExprIfTrue(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, func() int32 { if isNot != 0 { return SQLITE_JUMPIFNULL } return 0 }()) goto __26 __25: Xsqlite3ExprIfFalse(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, func() int32 { if isNot != 0 { return SQLITE_JUMPIFNULL } return 0 }()) __26: ; goto __3 __8: __9: ; if op == TK_IS { op = TK_EQ } else { op = TK_NE } jumpIfNull = SQLITE_NULLEQ __10: __11: __12: __13: __14: __15: if !(Xsqlite3ExprIsVector(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) != 0) { goto __27 } goto default_expr __27: ; r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp) r2 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, bp+4) codeCompare(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, (*Expr)(unsafe.Pointer(pExpr)).FpRight, op, r1, r2, dest, jumpIfNull, libc.Bool32((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Commuted) != U32(0))) goto __3 __16: __17: ; r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp) Xsqlite3VdbeTypeofColumn(tls, v, r1) Xsqlite3VdbeAddOp2(tls, v, op, r1, dest) goto __3 __18: ; exprCodeBetween(tls, pParse, pExpr, dest, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, int32) }{Xsqlite3ExprIfTrue})), jumpIfNull) goto __3 __19: destIfFalse = Xsqlite3VdbeMakeLabel(tls, pParse) if jumpIfNull != 0 { destIfNull = dest } else { destIfNull = destIfFalse } sqlite3ExprCodeIN(tls, pParse, pExpr, destIfFalse, destIfNull) Xsqlite3VdbeGoto(tls, v, dest) Xsqlite3VdbeResolveLabel(tls, v, destIfFalse) goto __3 __20: default_expr: if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_IsTrue) == U32(EP_IsTrue)) { goto __28 } Xsqlite3VdbeGoto(tls, v, dest) goto __29 __28: if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_IsFalse) == U32(EP_IsFalse)) { goto __30 } goto __31 __30: r1 = Xsqlite3ExprCodeTemp(tls, pParse, pExpr, bp) Xsqlite3VdbeAddOp3(tls, v, OP_If, r1, dest, libc.Bool32(jumpIfNull != 0)) __31: ; __29: ; goto __3 __3: ; Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp))) Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 4))) } // Generate code for a boolean expression such that a jump is made // to the label "dest" if the expression is false but execution // continues straight thru if the expression is true. // // If the expression evaluates to NULL (neither true nor false) then // jump if jumpIfNull is SQLITE_JUMPIFNULL or fall through if jumpIfNull // is 0. func Xsqlite3ExprIfFalse(tls *libc.TLS, pParse uintptr, pExpr uintptr, dest int32, jumpIfNull int32) { bp := tls.Alloc(8) defer tls.Free(8) var v uintptr var op int32 var r1 int32 var r2 int32 var d2 int32 var pAlt uintptr var isNot int32 var isTrue int32 var destIfNull int32 v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe op = 0 *(*int32)(unsafe.Pointer(bp)) = 0 *(*int32)(unsafe.Pointer(bp + 4)) = 0 if !(v == uintptr(0)) { goto __1 } return __1: ; if !(pExpr == uintptr(0)) { goto __2 } return __2: ; op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) + TK_ISNULL&1 ^ 1 - TK_ISNULL&1 switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { case TK_AND: goto __4 case TK_OR: goto __5 case TK_NOT: goto __6 case TK_TRUTH: goto __7 case TK_IS: goto __8 case TK_ISNOT: goto __9 case TK_LT: goto __10 case TK_LE: goto __11 case TK_GT: goto __12 case TK_GE: goto __13 case TK_NE: goto __14 case TK_EQ: goto __15 case TK_ISNULL: goto __16 case TK_NOTNULL: goto __17 case TK_BETWEEN: goto __18 case TK_IN: goto __19 default: goto __20 } goto __3 __4: __5: pAlt = Xsqlite3ExprSimplifiedAndOr(tls, pExpr) if !(pAlt != pExpr) { goto __21 } Xsqlite3ExprIfFalse(tls, pParse, pAlt, dest, jumpIfNull) goto __22 __21: if !(int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AND) { goto __23 } Xsqlite3ExprIfFalse(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, jumpIfNull) Xsqlite3ExprIfFalse(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, dest, jumpIfNull) goto __24 __23: d2 = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3ExprIfTrue(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL) Xsqlite3ExprIfFalse(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, dest, jumpIfNull) Xsqlite3VdbeResolveLabel(tls, v, d2) __24: ; __22: ; goto __3 __6: ; Xsqlite3ExprIfTrue(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, jumpIfNull) goto __3 __7: ; isNot = libc.Bool32(int32((*Expr)(unsafe.Pointer(pExpr)).Fop2) == TK_ISNOT) isTrue = Xsqlite3ExprTruthValue(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) if !(isTrue^isNot != 0) { goto __25 } Xsqlite3ExprIfFalse(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, func() int32 { if isNot != 0 { return 0 } return SQLITE_JUMPIFNULL }()) goto __26 __25: Xsqlite3ExprIfTrue(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, dest, func() int32 { if isNot != 0 { return 0 } return SQLITE_JUMPIFNULL }()) __26: ; goto __3 __8: __9: ; if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_IS { op = TK_NE } else { op = TK_EQ } jumpIfNull = SQLITE_NULLEQ __10: __11: __12: __13: __14: __15: if !(Xsqlite3ExprIsVector(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) != 0) { goto __27 } goto default_expr __27: ; r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp) r2 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, bp+4) codeCompare(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, (*Expr)(unsafe.Pointer(pExpr)).FpRight, op, r1, r2, dest, jumpIfNull, libc.Bool32((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Commuted) != U32(0))) goto __3 __16: __17: r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, bp) Xsqlite3VdbeTypeofColumn(tls, v, r1) Xsqlite3VdbeAddOp2(tls, v, op, r1, dest) goto __3 __18: ; exprCodeBetween(tls, pParse, pExpr, dest, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, int32) }{Xsqlite3ExprIfFalse})), jumpIfNull) goto __3 __19: if !(jumpIfNull != 0) { goto __28 } sqlite3ExprCodeIN(tls, pParse, pExpr, dest, dest) goto __29 __28: destIfNull = Xsqlite3VdbeMakeLabel(tls, pParse) sqlite3ExprCodeIN(tls, pParse, pExpr, dest, destIfNull) Xsqlite3VdbeResolveLabel(tls, v, destIfNull) __29: ; goto __3 __20: default_expr: if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_IsFalse) == U32(EP_IsFalse)) { goto __30 } Xsqlite3VdbeGoto(tls, v, dest) goto __31 __30: if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_IsTrue) == U32(EP_IsTrue)) { goto __32 } goto __33 __32: r1 = Xsqlite3ExprCodeTemp(tls, pParse, pExpr, bp) Xsqlite3VdbeAddOp3(tls, v, OP_IfNot, r1, dest, libc.Bool32(jumpIfNull != 0)) __33: ; __31: ; goto __3 __3: ; Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp))) Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 4))) } // Like sqlite3ExprIfFalse() except that a copy is made of pExpr before // code generation, and that copy is deleted after code generation. This // ensures that the original pExpr is unchanged. func Xsqlite3ExprIfFalseDup(tls *libc.TLS, pParse uintptr, pExpr uintptr, dest int32, jumpIfNull int32) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pCopy uintptr = Xsqlite3ExprDup(tls, db, pExpr, 0) if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 { Xsqlite3ExprIfFalse(tls, pParse, pCopy, dest, jumpIfNull) } Xsqlite3ExprDelete(tls, db, pCopy) } func exprCompareVariable(tls *libc.TLS, pParse uintptr, pVar uintptr, pExpr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var res int32 = 0 var iVar int32 var pL uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) Xsqlite3ValueFromExpr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr, uint8(SQLITE_UTF8), uint8(SQLITE_AFF_BLOB), bp) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { iVar = int32((*Expr)(unsafe.Pointer(pVar)).FiColumn) Xsqlite3VdbeSetVarmask(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, iVar) pL = Xsqlite3VdbeGetBoundValue(tls, (*Parse)(unsafe.Pointer(pParse)).FpReprepare, iVar, uint8(SQLITE_AFF_BLOB)) if pL != 0 { if Xsqlite3_value_type(tls, pL) == SQLITE_TEXT { Xsqlite3_value_text(tls, pL) } res = libc.Bool32(0 == Xsqlite3MemCompare(tls, pL, *(*uintptr)(unsafe.Pointer(bp)), uintptr(0))) } Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3ValueFree(tls, pL) } return res } // Do a deep comparison of two expression trees. Return 0 if the two // expressions are completely identical. Return 1 if they differ only // by a COLLATE operator at the top level. Return 2 if there are differences // other than the top-level COLLATE operator. // // If any subelement of pB has Expr.iTable==(-1) then it is allowed // to compare equal to an equivalent element in pA with Expr.iTable==iTab. // // The pA side might be using TK_REGISTER. If that is the case and pB is // not using TK_REGISTER but is otherwise equivalent, then still return 0. // // Sometimes this routine will return 2 even if the two expressions // really are equivalent. If we cannot prove that the expressions are // identical, we return 2 just to be safe. So if this routine // returns 2, then you do not really know for certain if the two // expressions are the same. But if you get a 0 or 1 return, then you // can be sure the expressions are the same. In the places where // this routine is used, it does not hurt to get an extra 2 - that // just might result in some slightly slower code. But returning // an incorrect 0 or 1 could lead to a malfunction. // // If pParse is not NULL then TK_VARIABLE terms in pA with bindings in // pParse->pReprepare can be matched against literals in pB. The // pParse->pVdbe->expmask bitmask is updated for each variable referenced. // If pParse is NULL (the normal case) then any TK_VARIABLE term in // Argument pParse should normally be NULL. If it is not NULL and pA or // pB causes a return value of 2. func Xsqlite3ExprCompare(tls *libc.TLS, pParse uintptr, pA uintptr, pB uintptr, iTab int32) int32 { var combinedFlags U32 if pA == uintptr(0) || pB == uintptr(0) { if pB == pA { return 0 } return 2 } if pParse != 0 && int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_VARIABLE && exprCompareVariable(tls, pParse, pA, pB) != 0 { return 0 } combinedFlags = (*Expr)(unsafe.Pointer(pA)).Fflags | (*Expr)(unsafe.Pointer(pB)).Fflags if combinedFlags&U32(EP_IntValue) != 0 { if (*Expr)(unsafe.Pointer(pA)).Fflags&(*Expr)(unsafe.Pointer(pB)).Fflags&U32(EP_IntValue) != U32(0) && *(*int32)(unsafe.Pointer(pA + 8)) == *(*int32)(unsafe.Pointer(pB + 8)) { return 0 } return 2 } if int32((*Expr)(unsafe.Pointer(pA)).Fop) != int32((*Expr)(unsafe.Pointer(pB)).Fop) || int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_RAISE { if int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_COLLATE && Xsqlite3ExprCompare(tls, pParse, (*Expr)(unsafe.Pointer(pA)).FpLeft, pB, iTab) < 2 { return 1 } if int32((*Expr)(unsafe.Pointer(pB)).Fop) == TK_COLLATE && Xsqlite3ExprCompare(tls, pParse, pA, (*Expr)(unsafe.Pointer(pB)).FpLeft, iTab) < 2 { return 1 } if int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_AGG_COLUMN && int32((*Expr)(unsafe.Pointer(pB)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pB)).FiTable < 0 && (*Expr)(unsafe.Pointer(pA)).FiTable == iTab { } else { return 2 } } if *(*uintptr)(unsafe.Pointer(pA + 8)) != 0 { if int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_FUNCTION || int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_AGG_FUNCTION { if Xsqlite3StrICmp(tls, *(*uintptr)(unsafe.Pointer(pA + 8)), *(*uintptr)(unsafe.Pointer(pB + 8))) != 0 { return 2 } if libc.Bool32((*Expr)(unsafe.Pointer(pA)).Fflags&U32(EP_WinFunc) != U32(0)) != libc.Bool32((*Expr)(unsafe.Pointer(pB)).Fflags&U32(EP_WinFunc) != U32(0)) { return 2 } if (*Expr)(unsafe.Pointer(pA)).Fflags&U32(EP_WinFunc) != U32(0) { if Xsqlite3WindowCompare(tls, pParse, *(*uintptr)(unsafe.Pointer(pA + 64)), *(*uintptr)(unsafe.Pointer(pB + 64)), 1) != 0 { return 2 } } } else if int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_NULL { return 0 } else if int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_COLLATE { if Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(pA + 8)), *(*uintptr)(unsafe.Pointer(pB + 8))) != 0 { return 2 } } else if *(*uintptr)(unsafe.Pointer(pB + 8)) != uintptr(0) && int32((*Expr)(unsafe.Pointer(pA)).Fop) != TK_COLUMN && int32((*Expr)(unsafe.Pointer(pA)).Fop) != TK_AGG_COLUMN && libc.Xstrcmp(tls, *(*uintptr)(unsafe.Pointer(pA + 8)), *(*uintptr)(unsafe.Pointer(pB + 8))) != 0 { return 2 } } if (*Expr)(unsafe.Pointer(pA)).Fflags&U32(EP_Distinct|EP_Commuted) != (*Expr)(unsafe.Pointer(pB)).Fflags&U32(EP_Distinct|EP_Commuted) { return 2 } if combinedFlags&U32(EP_TokenOnly) == U32(0) { if combinedFlags&U32(EP_xIsSelect) != 0 { return 2 } if combinedFlags&U32(EP_FixedCol) == U32(0) && Xsqlite3ExprCompare(tls, pParse, (*Expr)(unsafe.Pointer(pA)).FpLeft, (*Expr)(unsafe.Pointer(pB)).FpLeft, iTab) != 0 { return 2 } if Xsqlite3ExprCompare(tls, pParse, (*Expr)(unsafe.Pointer(pA)).FpRight, (*Expr)(unsafe.Pointer(pB)).FpRight, iTab) != 0 { return 2 } if Xsqlite3ExprListCompare(tls, *(*uintptr)(unsafe.Pointer(pA + 32)), *(*uintptr)(unsafe.Pointer(pB + 32)), iTab) != 0 { return 2 } if int32((*Expr)(unsafe.Pointer(pA)).Fop) != TK_STRING && int32((*Expr)(unsafe.Pointer(pA)).Fop) != TK_TRUEFALSE && combinedFlags&U32(EP_Reduced) == U32(0) { if int32((*Expr)(unsafe.Pointer(pA)).FiColumn) != int32((*Expr)(unsafe.Pointer(pB)).FiColumn) { return 2 } if int32((*Expr)(unsafe.Pointer(pA)).Fop2) != int32((*Expr)(unsafe.Pointer(pB)).Fop2) && int32((*Expr)(unsafe.Pointer(pA)).Fop) == TK_TRUTH { return 2 } if int32((*Expr)(unsafe.Pointer(pA)).Fop) != TK_IN && (*Expr)(unsafe.Pointer(pA)).FiTable != (*Expr)(unsafe.Pointer(pB)).FiTable && (*Expr)(unsafe.Pointer(pA)).FiTable != iTab { return 2 } } } return 0 } // Compare two ExprList objects. Return 0 if they are identical, 1 // if they are certainly different, or 2 if it is not possible to // determine if they are identical or not. // // If any subelement of pB has Expr.iTable==(-1) then it is allowed // to compare equal to an equivalent element in pA with Expr.iTable==iTab. // // This routine might return non-zero for equivalent ExprLists. The // only consequence will be disabled optimizations. But this routine // must never return 0 if the two ExprList objects are different, or // a malfunction will result. // // Two NULL pointers are considered to be the same. But a NULL pointer // always differs from a non-NULL pointer. func Xsqlite3ExprListCompare(tls *libc.TLS, pA uintptr, pB uintptr, iTab int32) int32 { var i int32 if pA == uintptr(0) && pB == uintptr(0) { return 0 } if pA == uintptr(0) || pB == uintptr(0) { return 1 } if (*ExprList)(unsafe.Pointer(pA)).FnExpr != (*ExprList)(unsafe.Pointer(pB)).FnExpr { return 1 } for i = 0; i < (*ExprList)(unsafe.Pointer(pA)).FnExpr; i++ { var res int32 var pExprA uintptr = (*ExprList_item)(unsafe.Pointer(pA + 8 + uintptr(i)*32)).FpExpr var pExprB uintptr = (*ExprList_item)(unsafe.Pointer(pB + 8 + uintptr(i)*32)).FpExpr if int32((*ExprList_item)(unsafe.Pointer(pA+8+uintptr(i)*32)).Ffg.FsortFlags) != int32((*ExprList_item)(unsafe.Pointer(pB+8+uintptr(i)*32)).Ffg.FsortFlags) { return 1 } if libc.AssignInt32(&res, Xsqlite3ExprCompare(tls, uintptr(0), pExprA, pExprB, iTab)) != 0 { return res } } return 0 } // Like sqlite3ExprCompare() except COLLATE operators at the top-level // are ignored. func Xsqlite3ExprCompareSkip(tls *libc.TLS, pA uintptr, pB uintptr, iTab int32) int32 { return Xsqlite3ExprCompare(tls, uintptr(0), Xsqlite3ExprSkipCollateAndLikely(tls, pA), Xsqlite3ExprSkipCollateAndLikely(tls, pB), iTab) } func exprImpliesNotNull(tls *libc.TLS, pParse uintptr, p uintptr, pNN uintptr, iTab int32, seenNot int32) int32 { if Xsqlite3ExprCompare(tls, pParse, p, pNN, iTab) == 0 { return libc.Bool32(int32((*Expr)(unsafe.Pointer(pNN)).Fop) != TK_NULL) } { switch int32((*Expr)(unsafe.Pointer(p)).Fop) { case TK_IN: { if seenNot != 0 && (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_xIsSelect) != U32(0) { return 0 } return exprImpliesNotNull(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpLeft, pNN, iTab, 1) } case TK_BETWEEN: { var pList uintptr pList = *(*uintptr)(unsafe.Pointer(p + 32)) if seenNot != 0 { return 0 } if exprImpliesNotNull(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8)).FpExpr, pNN, iTab, 1) != 0 || exprImpliesNotNull(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8+1*32)).FpExpr, pNN, iTab, 1) != 0 { return 1 } return exprImpliesNotNull(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpLeft, pNN, iTab, 1) } case TK_EQ: fallthrough case TK_NE: fallthrough case TK_LT: fallthrough case TK_LE: fallthrough case TK_GT: fallthrough case TK_GE: fallthrough case TK_PLUS: fallthrough case TK_MINUS: fallthrough case TK_BITOR: fallthrough case TK_LSHIFT: fallthrough case TK_RSHIFT: fallthrough case TK_CONCAT: seenNot = 1 fallthrough case TK_STAR: fallthrough case TK_REM: fallthrough case TK_BITAND: fallthrough case TK_SLASH: { if exprImpliesNotNull(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpRight, pNN, iTab, seenNot) != 0 { return 1 } } fallthrough case TK_SPAN: fallthrough case TK_COLLATE: fallthrough case TK_UPLUS: fallthrough case TK_UMINUS: { return exprImpliesNotNull(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpLeft, pNN, iTab, seenNot) } case TK_TRUTH: { if seenNot != 0 { return 0 } if int32((*Expr)(unsafe.Pointer(p)).Fop2) != TK_IS { return 0 } return exprImpliesNotNull(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpLeft, pNN, iTab, 1) } case TK_BITNOT: fallthrough case TK_NOT: { return exprImpliesNotNull(tls, pParse, (*Expr)(unsafe.Pointer(p)).FpLeft, pNN, iTab, 1) } } } return 0 } // Return true if we can prove the pE2 will always be true if pE1 is // true. Return false if we cannot complete the proof or if pE2 might // be false. Examples: // // pE1: x==5 pE2: x==5 Result: true // pE1: x>0 pE2: x==5 Result: false // pE1: x=21 pE2: x=21 OR y=43 Result: true // pE1: x!=123 pE2: x IS NOT NULL Result: true // pE1: x!=?1 pE2: x IS NOT NULL Result: true // pE1: x IS NULL pE2: x IS NOT NULL Result: false // pE1: x IS ?2 pE2: x IS NOT NULL Reuslt: false // // When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has // Expr.iTable<0 then assume a table number given by iTab. // // If pParse is not NULL, then the values of bound variables in pE1 are // compared against literal values in pE2 and pParse->pVdbe->expmask is // modified to record which bound variables are referenced. If pParse // is NULL, then false will be returned if pE1 contains any bound variables. // // When in doubt, return false. Returning true might give a performance // improvement. Returning false might cause a performance reduction, but // it will always give the correct answer and is hence always safe. func Xsqlite3ExprImpliesExpr(tls *libc.TLS, pParse uintptr, pE1 uintptr, pE2 uintptr, iTab int32) int32 { if Xsqlite3ExprCompare(tls, pParse, pE1, pE2, iTab) == 0 { return 1 } if int32((*Expr)(unsafe.Pointer(pE2)).Fop) == TK_OR && (Xsqlite3ExprImpliesExpr(tls, pParse, pE1, (*Expr)(unsafe.Pointer(pE2)).FpLeft, iTab) != 0 || Xsqlite3ExprImpliesExpr(tls, pParse, pE1, (*Expr)(unsafe.Pointer(pE2)).FpRight, iTab) != 0) { return 1 } if int32((*Expr)(unsafe.Pointer(pE2)).Fop) == TK_NOTNULL && exprImpliesNotNull(tls, pParse, pE1, (*Expr)(unsafe.Pointer(pE2)).FpLeft, iTab, 0) != 0 { return 1 } return 0 } func impliesNotNullRow(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0) { return WRC_Prune } switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { case TK_ISNOT: fallthrough case TK_ISNULL: fallthrough case TK_NOTNULL: fallthrough case TK_IS: fallthrough case TK_OR: fallthrough case TK_VECTOR: fallthrough case TK_CASE: fallthrough case TK_IN: fallthrough case TK_FUNCTION: fallthrough case TK_TRUTH: return WRC_Prune case TK_COLUMN: if *(*int32)(unsafe.Pointer(pWalker + 40)) == (*Expr)(unsafe.Pointer(pExpr)).FiTable { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(1) return WRC_Abort } return WRC_Prune case TK_AND: if int32((*Walker)(unsafe.Pointer(pWalker)).FeCode) == 0 { Xsqlite3WalkExpr(tls, pWalker, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) if (*Walker)(unsafe.Pointer(pWalker)).FeCode != 0 { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) Xsqlite3WalkExpr(tls, pWalker, (*Expr)(unsafe.Pointer(pExpr)).FpRight) } } return WRC_Prune case TK_BETWEEN: if Xsqlite3WalkExpr(tls, pWalker, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) == WRC_Abort { return WRC_Abort } return WRC_Prune case TK_EQ: fallthrough case TK_NE: fallthrough case TK_LT: fallthrough case TK_LE: fallthrough case TK_GT: fallthrough case TK_GE: { var pLeft uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft var pRight uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpRight if int32((*Expr)(unsafe.Pointer(pLeft)).Fop) == TK_COLUMN && *(*uintptr)(unsafe.Pointer(pLeft + 64)) != uintptr(0) && int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pLeft + 64)))).FeTabType) == TABTYP_VTAB || int32((*Expr)(unsafe.Pointer(pRight)).Fop) == TK_COLUMN && *(*uintptr)(unsafe.Pointer(pRight + 64)) != uintptr(0) && int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pRight + 64)))).FeTabType) == TABTYP_VTAB { return WRC_Prune } } fallthrough default: return WRC_Continue } return int32(0) } // Return true (non-zero) if expression p can only be true if at least // one column of table iTab is non-null. In other words, return true // if expression p will always be NULL or false if every column of iTab // is NULL. // // False negatives are acceptable. In other words, it is ok to return // zero even if expression p will never be true of every column of iTab // is NULL. A false negative is merely a missed optimization opportunity. // // False positives are not allowed, however. A false positive may result // in an incorrect answer. // // Terms of p that are marked with EP_OuterON (and hence that come from // the ON or USING clauses of OUTER JOINS) are excluded from the analysis. // // This routine is used to check if a LEFT JOIN can be converted into // an ordinary JOIN. The p argument is the WHERE clause. If the WHERE // clause requires that some column of the right table of the LEFT JOIN // be non-NULL, then the LEFT JOIN can be safely converted into an // ordinary join. func Xsqlite3ExprImpliesNonNullRow(tls *libc.TLS, p uintptr, iTab int32) int32 { bp := tls.Alloc(48) defer tls.Free(48) p = Xsqlite3ExprSkipCollateAndLikely(tls, p) if p == uintptr(0) { return 0 } if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_NOTNULL { p = (*Expr)(unsafe.Pointer(p)).FpLeft } else { for int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_AND { if Xsqlite3ExprImpliesNonNullRow(tls, (*Expr)(unsafe.Pointer(p)).FpLeft, iTab) != 0 { return 1 } p = (*Expr)(unsafe.Pointer(p)).FpRight } } (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{impliesNotNullRow})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = uintptr(0) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = uintptr(0) (*Walker)(unsafe.Pointer(bp)).FeCode = U16(0) *(*int32)(unsafe.Pointer(bp + 40)) = iTab Xsqlite3WalkExpr(tls, bp, p) return int32((*Walker)(unsafe.Pointer(bp)).FeCode) } func exprIdxCover(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*IdxCover)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pWalker + 40)))).FiCur && int32(Xsqlite3TableColumnToIndex(tls, (*IdxCover)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pWalker + 40)))).FpIdx, (*Expr)(unsafe.Pointer(pExpr)).FiColumn)) < 0 { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(1) return WRC_Abort } return WRC_Continue } // Determine if an index pIdx on table with cursor iCur contains will // the expression pExpr. Return true if the index does cover the // expression and false if the pExpr expression references table columns // that are not found in the index pIdx. // // An index covering an expression means that the expression can be // evaluated using only the index and without having to lookup the // corresponding table entry. func Xsqlite3ExprCoveredByIndex(tls *libc.TLS, pExpr uintptr, iCur int32, pIdx uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*IdxCover)(unsafe.Pointer(bp + 48)).FiCur = iCur (*IdxCover)(unsafe.Pointer(bp + 48)).FpIdx = pIdx (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{exprIdxCover})) *(*uintptr)(unsafe.Pointer(bp + 40)) = bp + 48 Xsqlite3WalkExpr(tls, bp, pExpr) return libc.BoolInt32(!((*Walker)(unsafe.Pointer(bp)).FeCode != 0)) } func selectRefEnter(tls *libc.TLS, pWalker uintptr, pSelect uintptr) int32 { var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pSrc uintptr = (*Select)(unsafe.Pointer(pSelect)).FpSrc var i I64 var j I64 var piNew uintptr if (*SrcList)(unsafe.Pointer(pSrc)).FnSrc == 0 { return WRC_Continue } j = (*RefSrcList)(unsafe.Pointer(p)).FnExclude *(*I64)(unsafe.Pointer(p + 16)) += I64((*SrcList)(unsafe.Pointer(pSrc)).FnSrc) piNew = Xsqlite3DbRealloc(tls, (*RefSrcList)(unsafe.Pointer(p)).Fdb, (*RefSrcList)(unsafe.Pointer(p)).FaiExclude, uint64((*RefSrcList)(unsafe.Pointer(p)).FnExclude)*uint64(unsafe.Sizeof(int32(0)))) if piNew == uintptr(0) { (*RefSrcList)(unsafe.Pointer(p)).FnExclude = int64(0) return WRC_Abort } else { (*RefSrcList)(unsafe.Pointer(p)).FaiExclude = piNew } i = int64(0) __1: if !(i < I64((*SrcList)(unsafe.Pointer(pSrc)).FnSrc)) { goto __3 } { *(*int32)(unsafe.Pointer((*RefSrcList)(unsafe.Pointer(p)).FaiExclude + uintptr(j)*4)) = (*SrcItem)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104)).FiCursor } goto __2 __2: i++ j++ goto __1 goto __3 __3: ; return WRC_Continue } func selectRefLeave(tls *libc.TLS, pWalker uintptr, pSelect uintptr) { var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pSrc uintptr = (*Select)(unsafe.Pointer(pSelect)).FpSrc if (*RefSrcList)(unsafe.Pointer(p)).FnExclude != 0 { *(*I64)(unsafe.Pointer(p + 16)) -= I64((*SrcList)(unsafe.Pointer(pSrc)).FnSrc) } } func exprRefToSrcList(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AGG_COLUMN { var i int32 var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pSrc uintptr = (*RefSrcList)(unsafe.Pointer(p)).FpRef var nSrc int32 if pSrc != 0 { nSrc = (*SrcList)(unsafe.Pointer(pSrc)).FnSrc } else { nSrc = 0 } for i = 0; i < nSrc; i++ { if (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*SrcItem)(unsafe.Pointer(pSrc+8+uintptr(i)*104)).FiCursor { *(*U16)(unsafe.Pointer(pWalker + 36)) |= U16(1) return WRC_Continue } } for i = 0; I64(i) < (*RefSrcList)(unsafe.Pointer(p)).FnExclude && *(*int32)(unsafe.Pointer((*RefSrcList)(unsafe.Pointer(p)).FaiExclude + uintptr(i)*4)) != (*Expr)(unsafe.Pointer(pExpr)).FiTable; i++ { } if I64(i) >= (*RefSrcList)(unsafe.Pointer(p)).FnExclude { *(*U16)(unsafe.Pointer(pWalker + 36)) |= U16(2) } } return WRC_Continue } // Check to see if pExpr references any tables in pSrcList. // Possible return values: // // 1 pExpr does references a table in pSrcList. // // 0 pExpr references some table that is not defined in either // pSrcList or in subqueries of pExpr itself. // // -1 pExpr only references no tables at all, or it only // references tables defined in subqueries of pExpr itself. // // As currently used, pExpr is always an aggregate function call. That // fact is exploited for efficiency. func Xsqlite3ReferencesSrcList(tls *libc.TLS, pParse uintptr, pExpr uintptr, pSrcList uintptr) int32 { bp := tls.Alloc(80) defer tls.Free(80) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) libc.Xmemset(tls, bp+48, 0, uint64(unsafe.Sizeof(RefSrcList{}))) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{exprRefToSrcList})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{selectRefEnter})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{selectRefLeave})) *(*uintptr)(unsafe.Pointer(bp + 40)) = bp + 48 (*RefSrcList)(unsafe.Pointer(bp + 48)).Fdb = (*Parse)(unsafe.Pointer(pParse)).Fdb (*RefSrcList)(unsafe.Pointer(bp + 48)).FpRef = pSrcList Xsqlite3WalkExprList(tls, bp, *(*uintptr)(unsafe.Pointer(pExpr + 32))) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { Xsqlite3WalkExpr(tls, bp, (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 64)))).FpFilter) } if (*RefSrcList)(unsafe.Pointer(bp+48)).FaiExclude != 0 { Xsqlite3DbNNFreeNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*RefSrcList)(unsafe.Pointer(bp+48)).FaiExclude) } if int32((*Walker)(unsafe.Pointer(bp)).FeCode)&0x01 != 0 { return 1 } else if (*Walker)(unsafe.Pointer(bp)).FeCode != 0 { return 0 } else { return -1 } return int32(0) } func agginfoPersistExprCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_TokenOnly|EP_Reduced) != U32(0)) && (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo != uintptr(0) { var pAggInfo uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo var iAgg int32 = int32((*Expr)(unsafe.Pointer(pExpr)).FiAgg) var pParse uintptr = (*Walker)(unsafe.Pointer(pWalker)).FpParse var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_AGG_FUNCTION { if (*AggInfo_col)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol+uintptr(iAgg)*24)).FpCExpr == pExpr { pExpr = Xsqlite3ExprDup(tls, db, pExpr, 0) if pExpr != 0 { (*AggInfo_col)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol + uintptr(iAgg)*24)).FpCExpr = pExpr Xsqlite3ExprDeferredDelete(tls, pParse, pExpr) } } } else { if (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc+uintptr(iAgg)*24)).FpFExpr == pExpr { pExpr = Xsqlite3ExprDup(tls, db, pExpr, 0) if pExpr != 0 { (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc + uintptr(iAgg)*24)).FpFExpr = pExpr Xsqlite3ExprDeferredDelete(tls, pParse, pExpr) } } } } return WRC_Continue } // Initialize a Walker object so that will persist AggInfo entries referenced // by the tree that is walked. func Xsqlite3AggInfoPersistWalkerInit(tls *libc.TLS, pWalker uintptr, pParse uintptr) { libc.Xmemset(tls, pWalker, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(pWalker)).FpParse = pParse (*Walker)(unsafe.Pointer(pWalker)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{agginfoPersistExprCb})) (*Walker)(unsafe.Pointer(pWalker)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkNoop})) } func addAggInfoColumn(tls *libc.TLS, db uintptr, pInfo uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) (*AggInfo)(unsafe.Pointer(pInfo)).FaCol = Xsqlite3ArrayAllocate(tls, db, (*AggInfo)(unsafe.Pointer(pInfo)).FaCol, int32(unsafe.Sizeof(AggInfo_col{})), pInfo+32, bp) return *(*int32)(unsafe.Pointer(bp)) } func addAggInfoFunc(tls *libc.TLS, db uintptr, pInfo uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) (*AggInfo)(unsafe.Pointer(pInfo)).FaFunc = Xsqlite3ArrayAllocate(tls, db, (*AggInfo)(unsafe.Pointer(pInfo)).FaFunc, int32(unsafe.Sizeof(AggInfo_func{})), pInfo+48, bp) return *(*int32)(unsafe.Pointer(bp)) } func findOrCreateAggInfoColumn(tls *libc.TLS, pParse uintptr, pAggInfo uintptr, pExpr uintptr) { var pCol uintptr var k int32 var pE uintptr var j int32 var n int32 var pGB uintptr var pTerm uintptr pCol = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol k = 0 __1: if !(k < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn) { goto __3 } if !((*AggInfo_col)(unsafe.Pointer(pCol)).FiTable == (*Expr)(unsafe.Pointer(pExpr)).FiTable && int32((*AggInfo_col)(unsafe.Pointer(pCol)).FiColumn) == int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_IF_NULL_ROW) { goto __4 } goto fix_up_expr __4: ; goto __2 __2: k++ pCol += 24 goto __1 goto __3 __3: ; k = addAggInfoColumn(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pAggInfo) if !(k < 0) { goto __5 } return __5: ; pCol = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol + uintptr(k)*24 (*AggInfo_col)(unsafe.Pointer(pCol)).FpTab = *(*uintptr)(unsafe.Pointer(pExpr + 64)) (*AggInfo_col)(unsafe.Pointer(pCol)).FiTable = (*Expr)(unsafe.Pointer(pExpr)).FiTable (*AggInfo_col)(unsafe.Pointer(pCol)).FiColumn = (*Expr)(unsafe.Pointer(pExpr)).FiColumn (*AggInfo_col)(unsafe.Pointer(pCol)).FiSorterColumn = int16(-1) (*AggInfo_col)(unsafe.Pointer(pCol)).FpCExpr = pExpr if !((*AggInfo)(unsafe.Pointer(pAggInfo)).FpGroupBy != 0 && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_IF_NULL_ROW) { goto __6 } pGB = (*AggInfo)(unsafe.Pointer(pAggInfo)).FpGroupBy pTerm = pGB + 8 n = (*ExprList)(unsafe.Pointer(pGB)).FnExpr j = 0 __7: if !(j < n) { goto __9 } pE = (*ExprList_item)(unsafe.Pointer(pTerm)).FpExpr if !(int32((*Expr)(unsafe.Pointer(pE)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pE)).FiTable == (*Expr)(unsafe.Pointer(pExpr)).FiTable && int32((*Expr)(unsafe.Pointer(pE)).FiColumn) == int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn)) { goto __10 } (*AggInfo_col)(unsafe.Pointer(pCol)).FiSorterColumn = I16(j) goto __9 __10: ; goto __8 __8: j++ pTerm += 32 goto __7 goto __9 __9: ; __6: ; if !(int32((*AggInfo_col)(unsafe.Pointer(pCol)).FiSorterColumn) < 0) { goto __11 } (*AggInfo_col)(unsafe.Pointer(pCol)).FiSorterColumn = I16(libc.PostIncUint16(&(*AggInfo)(unsafe.Pointer(pAggInfo)).FnSortingColumn, 1)) __11: ; fix_up_expr: ; (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo = pAggInfo if !(int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN) { goto __12 } (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_AGG_COLUMN) __12: ; (*Expr)(unsafe.Pointer(pExpr)).FiAgg = I16(k) } func analyzeAggregate(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) var i int32 var pNC uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pParse uintptr = (*NameContext)(unsafe.Pointer(pNC)).FpParse var pSrcList uintptr = (*NameContext)(unsafe.Pointer(pNC)).FpSrcList var pAggInfo uintptr = *(*uintptr)(unsafe.Pointer(pNC + 16)) switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { default: { var pIEpr uintptr if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_InAggFunc == 0 { break } if (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr == uintptr(0) { break } for pIEpr = (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr; pIEpr != 0; pIEpr = (*IndexedExpr)(unsafe.Pointer(pIEpr)).FpIENext { var iDataCur int32 = (*IndexedExpr)(unsafe.Pointer(pIEpr)).FiDataCur if iDataCur < 0 { continue } if Xsqlite3ExprCompare(tls, uintptr(0), pExpr, (*IndexedExpr)(unsafe.Pointer(pIEpr)).FpExpr, iDataCur) == 0 { break } } if pIEpr == uintptr(0) { break } if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc|EP_Subrtn) == U32(0)) { break } if (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo != uintptr(0) { break } libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(bp)).Fop = U8(TK_AGG_COLUMN) (*Expr)(unsafe.Pointer(bp)).FiTable = (*IndexedExpr)(unsafe.Pointer(pIEpr)).FiIdxCur (*Expr)(unsafe.Pointer(bp)).FiColumn = YnVar((*IndexedExpr)(unsafe.Pointer(pIEpr)).FiIdxCol) findOrCreateAggInfoColumn(tls, pParse, pAggInfo, bp) (*AggInfo_col)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol + uintptr((*Expr)(unsafe.Pointer(bp)).FiAgg)*24)).FpCExpr = pExpr (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo = pAggInfo (*Expr)(unsafe.Pointer(pExpr)).FiAgg = (*Expr)(unsafe.Pointer(bp)).FiAgg return WRC_Prune } case TK_IF_NULL_ROW: fallthrough case TK_AGG_COLUMN: fallthrough case TK_COLUMN: { if pSrcList != uintptr(0) { var pItem uintptr = pSrcList + 8 i = 0 __1: if !(i < (*SrcList)(unsafe.Pointer(pSrcList)).FnSrc) { goto __3 } { if (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*SrcItem)(unsafe.Pointer(pItem)).FiCursor { findOrCreateAggInfoColumn(tls, pParse, pAggInfo, pExpr) goto __3 } } goto __2 __2: i++ pItem += 104 goto __1 goto __3 __3: } return WRC_Prune } case TK_AGG_FUNCTION: { if (*NameContext)(unsafe.Pointer(pNC)).FncFlags&NC_InAggFunc == 0 && (*Walker)(unsafe.Pointer(pWalker)).FwalkerDepth == int32((*Expr)(unsafe.Pointer(pExpr)).Fop2) { var pItem uintptr = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc i = 0 __4: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc) { goto __6 } { if (*AggInfo_func)(unsafe.Pointer(pItem)).FpFExpr == pExpr { goto __6 } if Xsqlite3ExprCompare(tls, uintptr(0), (*AggInfo_func)(unsafe.Pointer(pItem)).FpFExpr, pExpr, -1) == 0 { goto __6 } } goto __5 __5: i++ pItem += 24 goto __4 goto __6 __6: ; if i >= (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc { var enc U8 = (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fenc i = addAggInfoFunc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pAggInfo) if i >= 0 { pItem = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc + uintptr(i)*24 (*AggInfo_func)(unsafe.Pointer(pItem)).FpFExpr = pExpr (*AggInfo_func)(unsafe.Pointer(pItem)).FpFunc = Xsqlite3FindFunction(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(pExpr + 8)), func() int32 { if *(*uintptr)(unsafe.Pointer(pExpr + 32)) != 0 { return (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FnExpr } return 0 }(), enc, uint8(0)) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Distinct) != 0 { (*AggInfo_func)(unsafe.Pointer(pItem)).FiDistinct = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) } else { (*AggInfo_func)(unsafe.Pointer(pItem)).FiDistinct = -1 } } } (*Expr)(unsafe.Pointer(pExpr)).FiAgg = I16(i) (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo = pAggInfo return WRC_Prune } else { return WRC_Continue } } } return WRC_Continue } // Analyze the pExpr expression looking for aggregate functions and // for variables that need to be added to AggInfo object that pNC->pAggInfo // points to. Additional entries are made on the AggInfo object as // necessary. // // This routine should only be called after the expression has been // analyzed by sqlite3ResolveExprNames(). func Xsqlite3ExprAnalyzeAggregates(tls *libc.TLS, pNC uintptr, pExpr uintptr) { bp := tls.Alloc(48) defer tls.Free(48) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{analyzeAggregate})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3WalkerDepthIncrease})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3WalkerDepthDecrease})) (*Walker)(unsafe.Pointer(bp)).FwalkerDepth = 0 *(*uintptr)(unsafe.Pointer(bp + 40)) = pNC (*Walker)(unsafe.Pointer(bp)).FpParse = uintptr(0) Xsqlite3WalkExpr(tls, bp, pExpr) } // Call sqlite3ExprAnalyzeAggregates() for every expression in an // expression list. Return the number of errors. // // If an error is found, the analysis is cut short. func Xsqlite3ExprAnalyzeAggList(tls *libc.TLS, pNC uintptr, pList uintptr) { var pItem uintptr var i int32 if pList != 0 { pItem = pList + 8 i = 0 __1: if !(i < (*ExprList)(unsafe.Pointer(pList)).FnExpr) { goto __3 } { Xsqlite3ExprAnalyzeAggregates(tls, pNC, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr) } goto __2 __2: i++ pItem += 32 goto __1 goto __3 __3: } } // Allocate a single new register for use to hold some intermediate result. func Xsqlite3GetTempReg(tls *libc.TLS, pParse uintptr) int32 { if int32((*Parse)(unsafe.Pointer(pParse)).FnTempReg) == 0 { return libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) } return *(*int32)(unsafe.Pointer(pParse + 228 + uintptr(libc.PreDecUint8(&(*Parse)(unsafe.Pointer(pParse)).FnTempReg, 1))*4)) } // Deallocate a register, making available for reuse for some other // purpose. func Xsqlite3ReleaseTempReg(tls *libc.TLS, pParse uintptr, iReg int32) { if iReg != 0 { if int32((*Parse)(unsafe.Pointer(pParse)).FnTempReg) < int32(uint64(unsafe.Sizeof([8]int32{}))/uint64(unsafe.Sizeof(int32(0)))) { *(*int32)(unsafe.Pointer(pParse + 228 + uintptr(libc.PostIncUint8(&(*Parse)(unsafe.Pointer(pParse)).FnTempReg, 1))*4)) = iReg } } } // Allocate or deallocate a block of nReg consecutive registers. func Xsqlite3GetTempRange(tls *libc.TLS, pParse uintptr, nReg int32) int32 { var i int32 var n int32 if nReg == 1 { return Xsqlite3GetTempReg(tls, pParse) } i = (*Parse)(unsafe.Pointer(pParse)).FiRangeReg n = (*Parse)(unsafe.Pointer(pParse)).FnRangeReg if nReg <= n { *(*int32)(unsafe.Pointer(pParse + 44)) += nReg *(*int32)(unsafe.Pointer(pParse + 40)) -= nReg } else { i = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nReg } return i } func Xsqlite3ReleaseTempRange(tls *libc.TLS, pParse uintptr, iReg int32, nReg int32) { if nReg == 1 { Xsqlite3ReleaseTempReg(tls, pParse, iReg) return } if nReg > (*Parse)(unsafe.Pointer(pParse)).FnRangeReg { (*Parse)(unsafe.Pointer(pParse)).FnRangeReg = nReg (*Parse)(unsafe.Pointer(pParse)).FiRangeReg = iReg } } // Mark all temporary registers as being unavailable for reuse. // // Always invoke this procedure after coding a subroutine or co-routine // that might be invoked from other parts of the code, to ensure that // the sub/co-routine does not use registers in common with the code that // invokes the sub/co-routine. func Xsqlite3ClearTempRegCache(tls *libc.TLS, pParse uintptr) { (*Parse)(unsafe.Pointer(pParse)).FnTempReg = U8(0) (*Parse)(unsafe.Pointer(pParse)).FnRangeReg = 0 } func isAlterableTable(tls *libc.TLS, pParse uintptr, pTab uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if 0 == Xsqlite3_strnicmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName, ts+7733, 7) || (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Eponymous) != U32(0) || (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Shadow) != U32(0) && Xsqlite3ReadOnlyShadowTables(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+9494, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) return 1 } return 0 } func renameTestSchema(tls *libc.TLS, pParse uintptr, zDb uintptr, bTemp int32, zWhen uintptr, bNoDQS int32) { bp := tls.Alloc(64) defer tls.Free(64) (*Parse)(unsafe.Pointer(pParse)).FcolNamesSet = U8(1) Xsqlite3NestedParse(tls, pParse, ts+9522, libc.VaList(bp, zDb, zDb, bTemp, zWhen, bNoDQS)) if bTemp == 0 { Xsqlite3NestedParse(tls, pParse, ts+9697, libc.VaList(bp+40, zDb, zWhen, bNoDQS)) } } func renameFixQuotes(tls *libc.TLS, pParse uintptr, zDb uintptr, bTemp int32) { bp := tls.Alloc(16) defer tls.Free(16) Xsqlite3NestedParse(tls, pParse, ts+9871, libc.VaList(bp, zDb, zDb)) if bTemp == 0 { Xsqlite3NestedParse(tls, pParse, ts+10018, 0) } } func renameReloadSchema(tls *libc.TLS, pParse uintptr, iDb int32, p5 U16) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if v != 0 { Xsqlite3ChangeCookie(tls, pParse, iDb) Xsqlite3VdbeAddParseSchemaOp(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, iDb, uintptr(0), p5) if iDb != 1 { Xsqlite3VdbeAddParseSchemaOp(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, 1, uintptr(0), p5) } } } // Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" // command. func Xsqlite3AlterRenameTable(tls *libc.TLS, pParse uintptr, pSrc uintptr, pName uintptr) { bp := tls.Alloc(184) defer tls.Free(184) var iDb int32 var zDb uintptr var pTab uintptr var zName uintptr var db uintptr var nTabName int32 var zTabName uintptr var v uintptr var pVTab uintptr var i int32 zName = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb pVTab = uintptr(0) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __1 } goto exit_rename_table __1: ; pTab = Xsqlite3LocateTableItem(tls, pParse, uint32(0), pSrc+8) if !!(pTab != 0) { goto __2 } goto exit_rename_table __2: ; iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Table)(unsafe.Pointer(pTab)).FpSchema) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName zName = Xsqlite3NameFromToken(tls, db, pName) if !!(zName != 0) { goto __3 } goto exit_rename_table __3: ; if !(Xsqlite3FindTable(tls, db, zName, zDb) != 0 || Xsqlite3FindIndex(tls, db, zName, zDb) != 0 || Xsqlite3IsShadowTableOf(tls, db, pTab, zName) != 0) { goto __4 } Xsqlite3ErrorMsg(tls, pParse, ts+10169, libc.VaList(bp, zName)) goto exit_rename_table __4: ; if !(SQLITE_OK != isAlterableTable(tls, pParse, pTab)) { goto __5 } goto exit_rename_table __5: ; if !(SQLITE_OK != Xsqlite3CheckObjectName(tls, pParse, zName, ts+10228, zName)) { goto __6 } goto exit_rename_table __6: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __7 } Xsqlite3ErrorMsg(tls, pParse, ts+10234, libc.VaList(bp+8, (*Table)(unsafe.Pointer(pTab)).FzName)) goto exit_rename_table __7: ; if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_ALTER_TABLE, zDb, (*Table)(unsafe.Pointer(pTab)).FzName, uintptr(0)) != 0) { goto __8 } goto exit_rename_table __8: ; if !(Xsqlite3ViewGetColumnNames(tls, pParse, pTab) != 0) { goto __9 } goto exit_rename_table __9: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __10 } pVTab = Xsqlite3GetVTable(tls, db, pTab) if !((*Sqlite3_module)(unsafe.Pointer((*Sqlite3_vtab)(unsafe.Pointer((*VTable)(unsafe.Pointer(pVTab)).FpVtab)).FpModule)).FxRename == uintptr(0)) { goto __11 } pVTab = uintptr(0) __11: ; __10: ; v = Xsqlite3GetVdbe(tls, pParse) if !(v == uintptr(0)) { goto __12 } goto exit_rename_table __12: ; Xsqlite3MayAbort(tls, pParse) zTabName = (*Table)(unsafe.Pointer(pTab)).FzName nTabName = Xsqlite3Utf8CharLen(tls, zTabName, -1) Xsqlite3NestedParse(tls, pParse, ts+10261, libc.VaList(bp+16, zDb, zDb, zTabName, zName, libc.Bool32(iDb == 1), zTabName)) Xsqlite3NestedParse(tls, pParse, ts+10445, libc.VaList(bp+64, zDb, zName, zName, zName, nTabName, zTabName)) if !(Xsqlite3FindTable(tls, db, ts+10750, zDb) != 0) { goto __13 } Xsqlite3NestedParse(tls, pParse, ts+10766, libc.VaList(bp+112, zDb, zName, (*Table)(unsafe.Pointer(pTab)).FzName)) __13: ; if !(iDb != 1) { goto __14 } Xsqlite3NestedParse(tls, pParse, ts+10824, libc.VaList(bp+136, zDb, zTabName, zName, zTabName, zDb, zName)) __14: ; if !(pVTab != 0) { goto __15 } i = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeLoadString(tls, v, i, zName) Xsqlite3VdbeAddOp4(tls, v, OP_VRename, i, 0, 0, pVTab, -11) __15: ; renameReloadSchema(tls, pParse, iDb, uint16(INITFLAG_AlterRename)) renameTestSchema(tls, pParse, zDb, libc.Bool32(iDb == 1), ts+11089, 0) exit_rename_table: Xsqlite3SrcListDelete(tls, db, pSrc) Xsqlite3DbFree(tls, db, zName) } func sqlite3ErrorIfNotEmpty(tls *libc.TLS, pParse uintptr, zDb uintptr, zTab uintptr, zErr uintptr) { bp := tls.Alloc(24) defer tls.Free(24) Xsqlite3NestedParse(tls, pParse, ts+11102, libc.VaList(bp, zErr, zDb, zTab)) } // This function is called after an "ALTER TABLE ... ADD" statement // has been parsed. Argument pColDef contains the text of the new // column definition. // // The Table structure pParse->pNewTable was extended to include // the new column during parsing. func Xsqlite3AlterFinishAddColumn(tls *libc.TLS, pParse uintptr, pColDef uintptr) { bp := tls.Alloc(64) defer tls.Free(64) var pNew uintptr var pTab uintptr var iDb int32 var zDb uintptr var zTab uintptr var zCol uintptr var pCol uintptr var pDflt uintptr var db uintptr var v uintptr var r1 int32 db = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } pNew = (*Parse)(unsafe.Pointer(pParse)).FpNewTable iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pNew)).FpSchema) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName zTab = (*Table)(unsafe.Pointer(pNew)).FzName + 16 pCol = (*Table)(unsafe.Pointer(pNew)).FaCol + uintptr(int32((*Table)(unsafe.Pointer(pNew)).FnCol)-1)*24 pDflt = Xsqlite3ColumnExpr(tls, pNew, pCol) pTab = Xsqlite3FindTable(tls, db, zTab, zDb) if Xsqlite3AuthCheck(tls, pParse, SQLITE_ALTER_TABLE, zDb, (*Table)(unsafe.Pointer(pTab)).FzName, uintptr(0)) != 0 { return } if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_PRIMKEY != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+11140, 0) return } if (*Table)(unsafe.Pointer(pNew)).FpIndex != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+11172, 0) return } if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_GENERATED == 0 { if pDflt != 0 && int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pDflt)).FpLeft)).Fop) == TK_NULL { pDflt = uintptr(0) } if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ForeignKeys) != 0 && *(*uintptr)(unsafe.Pointer(pNew + 64 + 8)) != 0 && pDflt != 0 { sqlite3ErrorIfNotEmpty(tls, pParse, zDb, zTab, ts+11199) } if uint32(int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf>>0)) != 0 && !(pDflt != 0) { sqlite3ErrorIfNotEmpty(tls, pParse, zDb, zTab, ts+11258) } if pDflt != 0 { *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) var rc int32 rc = Xsqlite3ValueFromExpr(tls, db, pDflt, uint8(SQLITE_UTF8), uint8(SQLITE_AFF_BLOB), bp+56) if rc != SQLITE_OK { return } if !(*(*uintptr)(unsafe.Pointer(bp + 56)) != 0) { sqlite3ErrorIfNotEmpty(tls, pParse, zDb, zTab, ts+11311) } Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp + 56))) } } else if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_STORED != 0 { sqlite3ErrorIfNotEmpty(tls, pParse, zDb, zTab, ts+11357) } zCol = Xsqlite3DbStrNDup(tls, db, (*Token)(unsafe.Pointer(pColDef)).Fz, uint64((*Token)(unsafe.Pointer(pColDef)).Fn)) if zCol != 0 { var zEnd uintptr = zCol + uintptr((*Token)(unsafe.Pointer(pColDef)).Fn-uint32(1)) for zEnd > zCol && (int32(*(*int8)(unsafe.Pointer(zEnd))) == ';' || int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zEnd)))])&0x01 != 0) { *(*int8)(unsafe.Pointer(libc.PostDecUintptr(&zEnd, 1))) = int8(0) } Xsqlite3NestedParse(tls, pParse, ts+11384, libc.VaList(bp, zDb, *(*int32)(unsafe.Pointer(pNew + 64)), zCol, *(*int32)(unsafe.Pointer(pNew + 64)), zTab)) Xsqlite3DbFree(tls, db, zCol) } v = Xsqlite3GetVdbe(tls, pParse) if v != 0 { r1 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT) Xsqlite3VdbeUsesBtree(tls, v, iDb) Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, r1, -2) Xsqlite3VdbeAddOp2(tls, v, OP_IfPos, r1, Xsqlite3VdbeCurrentAddr(tls, v)+2) Xsqlite3VdbeAddOp3(tls, v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3) Xsqlite3ReleaseTempReg(tls, pParse, r1) renameReloadSchema(tls, pParse, iDb, uint16(INITFLAG_AlterAdd)) if (*Table)(unsafe.Pointer(pNew)).FpCheck != uintptr(0) || uint32(int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf>>0)) != 0 && int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_GENERATED != 0 { Xsqlite3NestedParse(tls, pParse, ts+11530, libc.VaList(bp+40, zTab, zDb)) } } } // This function is called by the parser after the table-name in // an "ALTER TABLE ADD" statement is parsed. Argument // pSrc is the full-name of the table being altered. // // This routine makes a (partial) copy of the Table structure // for the table being altered and sets Parse.pNewTable to point // to it. Routines called by the parser as the column definition // is parsed (i.e. sqlite3AddColumn()) add the new Column data to // the copy. The copy of the Table structure is deleted by tokenize.c // after parsing is finished. // // Routine sqlite3AlterFinishAddColumn() will be called to complete // coding the "ALTER TABLE ... ADD" statement. func Xsqlite3AlterBeginAddColumn(tls *libc.TLS, pParse uintptr, pSrc uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var pNew uintptr var pTab uintptr var iDb int32 var i int32 var nAlloc int32 var db uintptr var pCol uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __1 } goto exit_begin_add_column __1: ; pTab = Xsqlite3LocateTableItem(tls, pParse, uint32(0), pSrc+8) if !!(pTab != 0) { goto __2 } goto exit_begin_add_column __2: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __3 } Xsqlite3ErrorMsg(tls, pParse, ts+11760, 0) goto exit_begin_add_column __3: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __4 } Xsqlite3ErrorMsg(tls, pParse, ts+11794, 0) goto exit_begin_add_column __4: ; if !(SQLITE_OK != isAlterableTable(tls, pParse, pTab)) { goto __5 } goto exit_begin_add_column __5: ; Xsqlite3MayAbort(tls, pParse) iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) pNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Table{}))) if !!(pNew != 0) { goto __6 } goto exit_begin_add_column __6: ; (*Parse)(unsafe.Pointer(pParse)).FpNewTable = pNew (*Table)(unsafe.Pointer(pNew)).FnTabRef = U32(1) (*Table)(unsafe.Pointer(pNew)).FnCol = (*Table)(unsafe.Pointer(pTab)).FnCol nAlloc = (int32((*Table)(unsafe.Pointer(pNew)).FnCol)-1)/8*8 + 8 (*Table)(unsafe.Pointer(pNew)).FaCol = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Column{}))*uint64(nAlloc)) (*Table)(unsafe.Pointer(pNew)).FzName = Xsqlite3MPrintf(tls, db, ts+11824, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) if !(!(int32((*Table)(unsafe.Pointer(pNew)).FaCol) != 0) || !(int32((*Table)(unsafe.Pointer(pNew)).FzName) != 0)) { goto __7 } goto exit_begin_add_column __7: ; libc.Xmemcpy(tls, (*Table)(unsafe.Pointer(pNew)).FaCol, (*Table)(unsafe.Pointer(pTab)).FaCol, uint64(unsafe.Sizeof(Column{}))*uint64((*Table)(unsafe.Pointer(pNew)).FnCol)) i = 0 __8: if !(i < int32((*Table)(unsafe.Pointer(pNew)).FnCol)) { goto __10 } pCol = (*Table)(unsafe.Pointer(pNew)).FaCol + uintptr(i)*24 (*Column)(unsafe.Pointer(pCol)).FzCnName = Xsqlite3DbStrDup(tls, db, (*Column)(unsafe.Pointer(pCol)).FzCnName) (*Column)(unsafe.Pointer(pCol)).FhName = Xsqlite3StrIHash(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName) goto __9 __9: i++ goto __8 goto __10 __10: ; *(*uintptr)(unsafe.Pointer(pNew + 64 + 16)) = Xsqlite3ExprListDup(tls, db, *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)), 0) (*Table)(unsafe.Pointer(pNew)).FpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema *(*int32)(unsafe.Pointer(pNew + 64)) = *(*int32)(unsafe.Pointer(pTab + 64)) (*Table)(unsafe.Pointer(pNew)).FnTabRef = U32(1) exit_begin_add_column: Xsqlite3SrcListDelete(tls, db, pSrc) return } func isRealTable(tls *libc.TLS, pParse uintptr, pTab uintptr, bDrop int32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var zType uintptr = uintptr(0) if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW { zType = ts + 11843 } if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { zType = ts + 11848 } if zType != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+11862, libc.VaList(bp, func() uintptr { if bDrop != 0 { return ts + 11880 } return ts + 11897 }(), zType, (*Table)(unsafe.Pointer(pTab)).FzName)) return 1 } return 0 } // Handles the following parser reduction: // // cmd ::= ALTER TABLE pSrc RENAME COLUMN pOld TO pNew func Xsqlite3AlterRenameColumn(tls *libc.TLS, pParse uintptr, pSrc uintptr, pOld uintptr, pNew uintptr) { bp := tls.Alloc(112) defer tls.Free(112) var db uintptr var pTab uintptr var iCol int32 var zOld uintptr var zNew uintptr var zDb uintptr var iSchema int32 var bQuote int32 db = (*Parse)(unsafe.Pointer(pParse)).Fdb zOld = uintptr(0) zNew = uintptr(0) pTab = Xsqlite3LocateTableItem(tls, pParse, uint32(0), pSrc+8) if !!(pTab != 0) { goto __1 } goto exit_rename_column __1: ; if !(SQLITE_OK != isAlterableTable(tls, pParse, pTab)) { goto __2 } goto exit_rename_column __2: ; if !(SQLITE_OK != isRealTable(tls, pParse, pTab, 0)) { goto __3 } goto exit_rename_column __3: ; iSchema = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iSchema)*32)).FzDbSName if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_ALTER_TABLE, zDb, (*Table)(unsafe.Pointer(pTab)).FzName, uintptr(0)) != 0) { goto __4 } goto exit_rename_column __4: ; zOld = Xsqlite3NameFromToken(tls, db, pOld) if !!(zOld != 0) { goto __5 } goto exit_rename_column __5: ; iCol = 0 __6: if !(iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __8 } if !(0 == Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FzCnName, zOld)) { goto __9 } goto __8 __9: ; goto __7 __7: iCol++ goto __6 goto __8 __8: ; if !(iCol == int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __10 } Xsqlite3ErrorMsg(tls, pParse, ts+11915, libc.VaList(bp, pOld)) goto exit_rename_column __10: ; renameTestSchema(tls, pParse, zDb, libc.Bool32(iSchema == 1), ts+1544, 0) renameFixQuotes(tls, pParse, zDb, libc.Bool32(iSchema == 1)) Xsqlite3MayAbort(tls, pParse) zNew = Xsqlite3NameFromToken(tls, db, pNew) if !!(zNew != 0) { goto __11 } goto exit_rename_column __11: ; bQuote = int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(pNew)).Fz)))]) & 0x80 Xsqlite3NestedParse(tls, pParse, ts+11936, libc.VaList(bp+8, zDb, zDb, (*Table)(unsafe.Pointer(pTab)).FzName, iCol, zNew, bQuote, libc.Bool32(iSchema == 1), (*Table)(unsafe.Pointer(pTab)).FzName)) Xsqlite3NestedParse(tls, pParse, ts+12118, libc.VaList(bp+72, zDb, (*Table)(unsafe.Pointer(pTab)).FzName, iCol, zNew, bQuote)) renameReloadSchema(tls, pParse, iSchema, uint16(INITFLAG_AlterRename)) renameTestSchema(tls, pParse, zDb, libc.Bool32(iSchema == 1), ts+11089, 1) exit_rename_column: Xsqlite3SrcListDelete(tls, db, pSrc) Xsqlite3DbFree(tls, db, zOld) Xsqlite3DbFree(tls, db, zNew) return } // The context of an ALTER TABLE RENAME COLUMN operation that gets passed // down into the Walker. type RenameCtx = RenameCtx1 // Remember that the parser tree element pPtr was created using // the token pToken. // // In other words, construct a new RenameToken object and add it // to the list of RenameToken objects currently being built up // in pParse->pRename. // // The pPtr argument is returned so that this routine can be used // with tail recursion in tokenExpr() routine, for a small performance // improvement. func Xsqlite3RenameTokenMap(tls *libc.TLS, pParse uintptr, pPtr uintptr, pToken uintptr) uintptr { var pNew uintptr if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) != PARSE_MODE_UNMAP { pNew = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(RenameToken{}))) if pNew != 0 { (*RenameToken)(unsafe.Pointer(pNew)).Fp = pPtr (*RenameToken)(unsafe.Pointer(pNew)).Ft = *(*Token)(unsafe.Pointer(pToken)) (*RenameToken)(unsafe.Pointer(pNew)).FpNext = (*Parse)(unsafe.Pointer(pParse)).FpRename (*Parse)(unsafe.Pointer(pParse)).FpRename = pNew } } return pPtr } // It is assumed that there is already a RenameToken object associated // with parse tree element pFrom. This function remaps the associated token // to parse tree element pTo. func Xsqlite3RenameTokenRemap(tls *libc.TLS, pParse uintptr, pTo uintptr, pFrom uintptr) { var p uintptr for p = (*Parse)(unsafe.Pointer(pParse)).FpRename; p != 0; p = (*RenameToken)(unsafe.Pointer(p)).FpNext { if (*RenameToken)(unsafe.Pointer(p)).Fp == pFrom { (*RenameToken)(unsafe.Pointer(p)).Fp = pTo break } } } func renameUnmapExprCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var pParse uintptr = (*Walker)(unsafe.Pointer(pWalker)).FpParse Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), pExpr) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc|EP_Subrtn) == U32(0) { Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), pExpr+64) } return WRC_Continue } func renameWalkWith(tls *libc.TLS, pWalker uintptr, pSelect uintptr) { bp := tls.Alloc(56) defer tls.Free(56) var pWith uintptr = (*Select)(unsafe.Pointer(pSelect)).FpWith if pWith != 0 { var pParse uintptr = (*Walker)(unsafe.Pointer(pWalker)).FpParse var i int32 var pCopy uintptr = uintptr(0) if (*Select)(unsafe.Pointer((*Cte)(unsafe.Pointer(pWith+16)).FpSelect)).FselFlags&U32(SF_Expanded) == U32(0) { pCopy = Xsqlite3WithDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pWith) pCopy = Xsqlite3WithPush(tls, pParse, pCopy, uint8(1)) } for i = 0; i < (*With)(unsafe.Pointer(pWith)).FnCte; i++ { var p uintptr = (*Cte)(unsafe.Pointer(pWith + 16 + uintptr(i)*48)).FpSelect libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse if pCopy != 0 { Xsqlite3SelectPrep(tls, (*NameContext)(unsafe.Pointer(bp)).FpParse, p, bp) } if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer((*NameContext)(unsafe.Pointer(bp)).FpParse)).Fdb)).FmallocFailed != 0 { return } Xsqlite3WalkSelect(tls, pWalker, p) Xsqlite3RenameExprlistUnmap(tls, pParse, (*Cte)(unsafe.Pointer(pWith+16+uintptr(i)*48)).FpCols) } if pCopy != 0 && (*Parse)(unsafe.Pointer(pParse)).FpWith == pCopy { (*Parse)(unsafe.Pointer(pParse)).FpWith = (*With)(unsafe.Pointer(pCopy)).FpOuter } } } func unmapColumnIdlistNames(tls *libc.TLS, pParse uintptr, pIdList uintptr) { var ii int32 for ii = 0; ii < (*IdList)(unsafe.Pointer(pIdList)).FnId; ii++ { Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), (*IdList_item)(unsafe.Pointer(pIdList+8+uintptr(ii)*16)).FzName) } } func renameUnmapSelectCb(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { var pParse uintptr = (*Walker)(unsafe.Pointer(pWalker)).FpParse var i int32 if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return WRC_Abort } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_View|SF_CopyCte) != 0 { return WRC_Prune } if (*Select)(unsafe.Pointer(p)).FpEList != 0 { var pList uintptr = (*Select)(unsafe.Pointer(p)).FpEList for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { if (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FzEName != 0 && int32(*(*uint16)(unsafe.Pointer(pList + 8 + uintptr(i)*32 + 16 + 4))&0x3>>0) == ENAME_NAME { Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FzEName) } } } if (*Select)(unsafe.Pointer(p)).FpSrc != 0 { var pSrc uintptr = (*Select)(unsafe.Pointer(p)).FpSrc for i = 0; i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc; i++ { Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), (*SrcItem)(unsafe.Pointer(pSrc+8+uintptr(i)*104)).FzName) if int32(*(*uint16)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 60 + 4))&0x400>>10) == 0 { Xsqlite3WalkExpr(tls, pWalker, *(*uintptr)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 72))) } else { unmapColumnIdlistNames(tls, pParse, *(*uintptr)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 72))) } } } renameWalkWith(tls, pWalker, p) return WRC_Continue } // Remove all nodes that are part of expression pExpr from the rename list. func Xsqlite3RenameExprUnmap(tls *libc.TLS, pParse uintptr, pExpr uintptr) { bp := tls.Alloc(48) defer tls.Free(48) var eMode U8 = (*Parse)(unsafe.Pointer(pParse)).FeParseMode libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FpParse = pParse (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameUnmapExprCb})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameUnmapSelectCb})) (*Parse)(unsafe.Pointer(pParse)).FeParseMode = U8(PARSE_MODE_UNMAP) Xsqlite3WalkExpr(tls, bp, pExpr) (*Parse)(unsafe.Pointer(pParse)).FeParseMode = eMode } // Remove all nodes that are part of expression-list pEList from the // rename list. func Xsqlite3RenameExprlistUnmap(tls *libc.TLS, pParse uintptr, pEList uintptr) { bp := tls.Alloc(48) defer tls.Free(48) if pEList != 0 { var i int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FpParse = pParse (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameUnmapExprCb})) Xsqlite3WalkExprList(tls, bp, pEList) for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { if int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(i)*32 + 16 + 4))&0x3>>0) == ENAME_NAME { Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(i)*32)).FzEName) } } } } func renameTokenFree(tls *libc.TLS, db uintptr, pToken uintptr) { var pNext uintptr var p uintptr for p = pToken; p != 0; p = pNext { pNext = (*RenameToken)(unsafe.Pointer(p)).FpNext Xsqlite3DbFree(tls, db, p) } } func renameTokenFind(tls *libc.TLS, pParse uintptr, pCtx uintptr, pPtr uintptr) uintptr { var pp uintptr if pPtr == uintptr(0) { return uintptr(0) } for pp = pParse + 416; *(*uintptr)(unsafe.Pointer(pp)) != 0; pp = *(*uintptr)(unsafe.Pointer(pp)) + 24 { if (*RenameToken)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).Fp == pPtr { var pToken uintptr = *(*uintptr)(unsafe.Pointer(pp)) if pCtx != 0 { *(*uintptr)(unsafe.Pointer(pp)) = (*RenameToken)(unsafe.Pointer(pToken)).FpNext (*RenameToken)(unsafe.Pointer(pToken)).FpNext = (*RenameCtx1)(unsafe.Pointer(pCtx)).FpList (*RenameCtx1)(unsafe.Pointer(pCtx)).FpList = pToken (*RenameCtx1)(unsafe.Pointer(pCtx)).FnList++ } return pToken } } return uintptr(0) } func renameColumnSelectCb(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_View|SF_CopyCte) != 0 { return WRC_Prune } renameWalkWith(tls, pWalker, p) return WRC_Continue } func renameColumnExprCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_TRIGGER && int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) == (*RenameCtx)(unsafe.Pointer(p)).FiCol && (*Parse)(unsafe.Pointer((*Walker)(unsafe.Pointer(pWalker)).FpParse)).FpTriggerTab == (*RenameCtx)(unsafe.Pointer(p)).FpTab { renameTokenFind(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, p, pExpr) } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN && int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) == (*RenameCtx)(unsafe.Pointer(p)).FiCol && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc|EP_Subrtn) == U32(0) && (*RenameCtx)(unsafe.Pointer(p)).FpTab == *(*uintptr)(unsafe.Pointer(pExpr + 64)) { renameTokenFind(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, p, pExpr) } return WRC_Continue } func renameColumnTokenNext(tls *libc.TLS, pCtx uintptr) uintptr { var pBest uintptr = (*RenameCtx)(unsafe.Pointer(pCtx)).FpList var pToken uintptr var pp uintptr for pToken = (*RenameToken)(unsafe.Pointer(pBest)).FpNext; pToken != 0; pToken = (*RenameToken)(unsafe.Pointer(pToken)).FpNext { if (*RenameToken)(unsafe.Pointer(pToken)).Ft.Fz > (*RenameToken)(unsafe.Pointer(pBest)).Ft.Fz { pBest = pToken } } for pp = pCtx; *(*uintptr)(unsafe.Pointer(pp)) != pBest; pp = *(*uintptr)(unsafe.Pointer(pp)) + 24 { } *(*uintptr)(unsafe.Pointer(pp)) = (*RenameToken)(unsafe.Pointer(pBest)).FpNext return pBest } func renameColumnParseError(tls *libc.TLS, pCtx uintptr, zWhen uintptr, pType uintptr, pObject uintptr, pParse uintptr) { bp := tls.Alloc(40) defer tls.Free(40) var zT uintptr = Xsqlite3_value_text(tls, pType) var zN uintptr = Xsqlite3_value_text(tls, pObject) var zErr uintptr zErr = Xsqlite3MPrintf(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, ts+12249, libc.VaList(bp, zT, zN, func() uintptr { if *(*int8)(unsafe.Pointer(zWhen)) != 0 { return ts + 12272 } return ts + 1544 }(), zWhen, (*Parse)(unsafe.Pointer(pParse)).FzErrMsg)) Xsqlite3_result_error(tls, pCtx, zErr, -1) Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, zErr) } func renameColumnElistNames(tls *libc.TLS, pParse uintptr, pCtx uintptr, pEList uintptr, zOld uintptr) { if pEList != 0 { var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { var zName uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FzEName if int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(i)*32 + 16 + 4))&0x3>>0) == ENAME_NAME && zName != uintptr(0) && 0 == Xsqlite3_stricmp(tls, zName, zOld) { renameTokenFind(tls, pParse, pCtx, zName) } } } } func renameColumnIdlistNames(tls *libc.TLS, pParse uintptr, pCtx uintptr, pIdList uintptr, zOld uintptr) { if pIdList != 0 { var i int32 for i = 0; i < (*IdList)(unsafe.Pointer(pIdList)).FnId; i++ { var zName uintptr = (*IdList_item)(unsafe.Pointer(pIdList + 8 + uintptr(i)*16)).FzName if 0 == Xsqlite3_stricmp(tls, zName, zOld) { renameTokenFind(tls, pParse, pCtx, zName) } } } } func renameParseSql(tls *libc.TLS, p uintptr, zDb uintptr, db uintptr, zSql uintptr, bTemp int32) int32 { var rc int32 Xsqlite3ParseObjectInit(tls, p, db) if zSql == uintptr(0) { return SQLITE_NOMEM } if Xsqlite3_strnicmp(tls, zSql, ts+12274, 7) != 0 { return Xsqlite3CorruptError(tls, 113516) } (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = func() uint8 { if bTemp != 0 { return uint8(1) } return uint8(Xsqlite3FindDbName(tls, db, zDb)) }() (*Parse)(unsafe.Pointer(p)).FeParseMode = U8(PARSE_MODE_RENAME) (*Parse)(unsafe.Pointer(p)).Fdb = db (*Parse)(unsafe.Pointer(p)).FnQueryLoop = U32(1) rc = Xsqlite3RunParser(tls, p, zSql) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { rc = SQLITE_NOMEM } if rc == SQLITE_OK && ((*Parse)(unsafe.Pointer(p)).FpNewTable == uintptr(0) && (*Parse)(unsafe.Pointer(p)).FpNewIndex == uintptr(0) && (*Parse)(unsafe.Pointer(p)).FpNewTrigger == uintptr(0)) { rc = Xsqlite3CorruptError(tls, 113527) } (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(0) return rc } func renameEditSql(tls *libc.TLS, pCtx uintptr, pRename uintptr, zSql uintptr, zNew uintptr, bQuote int32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var nNew I64 = I64(Xsqlite3Strlen30(tls, zNew)) var nSql I64 = I64(Xsqlite3Strlen30(tls, zSql)) var db uintptr = Xsqlite3_context_db_handle(tls, pCtx) var rc int32 = SQLITE_OK var zQuot uintptr = uintptr(0) var zOut uintptr var nQuot I64 = int64(0) var zBuf1 uintptr = uintptr(0) var zBuf2 uintptr = uintptr(0) if zNew != 0 { zQuot = Xsqlite3MPrintf(tls, db, ts+12282, libc.VaList(bp, zNew)) if zQuot == uintptr(0) { return SQLITE_NOMEM } else { nQuot = I64(Xsqlite3Strlen30(tls, zQuot) - 1) } zOut = Xsqlite3DbMallocZero(tls, db, uint64(nSql+I64((*RenameCtx)(unsafe.Pointer(pRename)).FnList)*nQuot+int64(1))) } else { zOut = Xsqlite3DbMallocZero(tls, db, uint64((nSql*int64(2)+int64(1))*int64(3))) if zOut != 0 { zBuf1 = zOut + uintptr(nSql*int64(2)+int64(1)) zBuf2 = zOut + uintptr(nSql*int64(4)+int64(2)) } } if zOut != 0 { var nOut int32 = int32(nSql) libc.Xmemcpy(tls, zOut, zSql, uint64(nSql)) for (*RenameCtx)(unsafe.Pointer(pRename)).FpList != 0 { var iOff int32 var nReplace U32 var zReplace uintptr var pBest uintptr = renameColumnTokenNext(tls, pRename) if zNew != 0 { if bQuote == 0 && Xsqlite3IsIdChar(tls, uint8(*(*int8)(unsafe.Pointer((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fz)))) != 0 { nReplace = U32(nNew) zReplace = zNew } else { nReplace = U32(nQuot) zReplace = zQuot if int32(*(*int8)(unsafe.Pointer((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fz + uintptr((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn)))) == '"' { nReplace++ } } } else { libc.Xmemcpy(tls, zBuf1, (*RenameToken)(unsafe.Pointer(pBest)).Ft.Fz, uint64((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn)) *(*int8)(unsafe.Pointer(zBuf1 + uintptr((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn))) = int8(0) Xsqlite3Dequote(tls, zBuf1) Xsqlite3_snprintf(tls, int32(nSql*int64(2)), zBuf2, ts+12288, libc.VaList(bp+8, zBuf1, func() uintptr { if int32(*(*int8)(unsafe.Pointer((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fz + uintptr((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn)))) == '\'' { return ts + 12272 } return ts + 1544 }())) zReplace = zBuf2 nReplace = U32(Xsqlite3Strlen30(tls, zReplace)) } iOff = int32((int64((*RenameToken)(unsafe.Pointer(pBest)).Ft.Fz) - int64(zSql)) / 1) if (*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn != nReplace { libc.Xmemmove(tls, zOut+uintptr(U32(iOff)+nReplace), zOut+uintptr(uint32(iOff)+(*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn), uint64(uint32(nOut)-(uint32(iOff)+(*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn))) nOut = int32(U32(nOut) + (nReplace - (*RenameToken)(unsafe.Pointer(pBest)).Ft.Fn)) *(*int8)(unsafe.Pointer(zOut + uintptr(nOut))) = int8(0) } libc.Xmemcpy(tls, zOut+uintptr(iOff), zReplace, uint64(nReplace)) Xsqlite3DbFree(tls, db, pBest) } Xsqlite3_result_text(tls, pCtx, zOut, -1, libc.UintptrFromInt32(-1)) Xsqlite3DbFree(tls, db, zOut) } else { rc = SQLITE_NOMEM } Xsqlite3_free(tls, zQuot) return rc } func renameResolveTrigger(tls *libc.TLS, pParse uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pNew uintptr = (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger var pStep uintptr var rc int32 = SQLITE_OK libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab = Xsqlite3FindTable(tls, db, (*Trigger)(unsafe.Pointer(pNew)).Ftable, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(Xsqlite3SchemaToIndex(tls, db, (*Trigger)(unsafe.Pointer(pNew)).FpTabSchema))*32)).FzDbSName) (*Parse)(unsafe.Pointer(pParse)).FeTriggerOp = (*Trigger)(unsafe.Pointer(pNew)).Fop if (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab != 0 { rc = Xsqlite3ViewGetColumnNames(tls, pParse, (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab) } if rc == SQLITE_OK && (*Trigger)(unsafe.Pointer(pNew)).FpWhen != 0 { rc = Xsqlite3ResolveExprNames(tls, bp, (*Trigger)(unsafe.Pointer(pNew)).FpWhen) } for pStep = (*Trigger)(unsafe.Pointer(pNew)).Fstep_list; rc == SQLITE_OK && pStep != 0; pStep = (*TriggerStep)(unsafe.Pointer(pStep)).FpNext { if (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect != 0 { Xsqlite3SelectPrep(tls, pParse, (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect, bp) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { rc = (*Parse)(unsafe.Pointer(pParse)).Frc } } if rc == SQLITE_OK && (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget != 0 { var pSrc uintptr = Xsqlite3TriggerStepSrc(tls, pParse, pStep) if pSrc != 0 { var pSel uintptr = Xsqlite3SelectNew(tls, pParse, (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList, pSrc, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(0), uintptr(0)) if pSel == uintptr(0) { (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList = uintptr(0) pSrc = uintptr(0) rc = SQLITE_NOMEM } else { Xsqlite3SelectPrep(tls, pParse, pSel, uintptr(0)) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { rc = SQLITE_ERROR } else { rc = SQLITE_OK } if (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList != 0 { (*Select)(unsafe.Pointer(pSel)).FpEList = uintptr(0) } (*Select)(unsafe.Pointer(pSel)).FpSrc = uintptr(0) Xsqlite3SelectDelete(tls, db, pSel) } if (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom != 0 { var i int32 for i = 0; i < (*SrcList)(unsafe.Pointer((*TriggerStep)(unsafe.Pointer(pStep)).FpFrom)).FnSrc && rc == SQLITE_OK; i++ { var p uintptr = (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom + 8 + uintptr(i)*104 if (*SrcItem)(unsafe.Pointer(p)).FpSelect != 0 { Xsqlite3SelectPrep(tls, pParse, (*SrcItem)(unsafe.Pointer(p)).FpSelect, uintptr(0)) } } } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { rc = SQLITE_NOMEM } (*NameContext)(unsafe.Pointer(bp)).FpSrcList = pSrc if rc == SQLITE_OK && (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere != 0 { rc = Xsqlite3ResolveExprNames(tls, bp, (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere) } if rc == SQLITE_OK { rc = Xsqlite3ResolveExprListNames(tls, bp, (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList) } if (*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert != 0 && rc == SQLITE_OK { var pUpsert uintptr = (*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertSrc = pSrc *(*uintptr)(unsafe.Pointer(bp + 16)) = pUpsert (*NameContext)(unsafe.Pointer(bp)).FncFlags = NC_UUpsert rc = Xsqlite3ResolveExprListNames(tls, bp, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget) if rc == SQLITE_OK { var pUpsertSet uintptr = (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertSet rc = Xsqlite3ResolveExprListNames(tls, bp, pUpsertSet) } if rc == SQLITE_OK { rc = Xsqlite3ResolveExprNames(tls, bp, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertWhere) } if rc == SQLITE_OK { rc = Xsqlite3ResolveExprNames(tls, bp, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTargetWhere) } (*NameContext)(unsafe.Pointer(bp)).FncFlags = 0 } (*NameContext)(unsafe.Pointer(bp)).FpSrcList = uintptr(0) Xsqlite3SrcListDelete(tls, db, pSrc) } else { rc = SQLITE_NOMEM } } } return rc } func renameWalkTrigger(tls *libc.TLS, pWalker uintptr, pTrigger uintptr) { var pStep uintptr Xsqlite3WalkExpr(tls, pWalker, (*Trigger)(unsafe.Pointer(pTrigger)).FpWhen) for pStep = (*Trigger)(unsafe.Pointer(pTrigger)).Fstep_list; pStep != 0; pStep = (*TriggerStep)(unsafe.Pointer(pStep)).FpNext { Xsqlite3WalkSelect(tls, pWalker, (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect) Xsqlite3WalkExpr(tls, pWalker, (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere) Xsqlite3WalkExprList(tls, pWalker, (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList) if (*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert != 0 { var pUpsert uintptr = (*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert Xsqlite3WalkExprList(tls, pWalker, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget) Xsqlite3WalkExprList(tls, pWalker, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertSet) Xsqlite3WalkExpr(tls, pWalker, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertWhere) Xsqlite3WalkExpr(tls, pWalker, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTargetWhere) } if (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom != 0 { var i int32 for i = 0; i < (*SrcList)(unsafe.Pointer((*TriggerStep)(unsafe.Pointer(pStep)).FpFrom)).FnSrc; i++ { Xsqlite3WalkSelect(tls, pWalker, (*SrcItem)(unsafe.Pointer((*TriggerStep)(unsafe.Pointer(pStep)).FpFrom+8+uintptr(i)*104)).FpSelect) } } } } func renameParseCleanup(tls *libc.TLS, pParse uintptr) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pIdx uintptr if (*Parse)(unsafe.Pointer(pParse)).FpVdbe != 0 { Xsqlite3VdbeFinalize(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe) } Xsqlite3DeleteTable(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpNewTable) for libc.AssignUintptr(&pIdx, (*Parse)(unsafe.Pointer(pParse)).FpNewIndex) != uintptr(0) { (*Parse)(unsafe.Pointer(pParse)).FpNewIndex = (*Index)(unsafe.Pointer(pIdx)).FpNext Xsqlite3FreeIndex(tls, db, pIdx) } Xsqlite3DeleteTrigger(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger) Xsqlite3DbFree(tls, db, (*Parse)(unsafe.Pointer(pParse)).FzErrMsg) renameTokenFree(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpRename) Xsqlite3ParseObjectReset(tls, pParse) } func renameColumnFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { bp := tls.Alloc(504) defer tls.Free(504) var db uintptr var zSql uintptr var zDb uintptr var zTable uintptr var iCol int32 var zNew uintptr var bQuote int32 var bTemp int32 var zOld uintptr var rc int32 var pIdx uintptr var i int32 var pTab uintptr var xAuth Sqlite3_xauth var pSelect uintptr var pExpr uintptr var bFKOnly int32 var pFKey uintptr var pUpsertSet uintptr var pTarget uintptr var pStep uintptr db = Xsqlite3_context_db_handle(tls, context) zSql = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) zDb = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8))) zTable = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 4*8))) iCol = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 5*8))) zNew = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 6*8))) bQuote = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 7*8))) bTemp = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 8*8))) xAuth = (*Sqlite3)(unsafe.Pointer(db)).FxAuth _ = NotUsed if !(zSql == uintptr(0)) { goto __1 } return __1: ; if !(zTable == uintptr(0)) { goto __2 } return __2: ; if !(zNew == uintptr(0)) { goto __3 } return __3: ; if !(iCol < 0) { goto __4 } return __4: ; Xsqlite3BtreeEnterAll(tls, db) pTab = Xsqlite3FindTable(tls, db, zTable, zDb) if !(pTab == uintptr(0) || iCol >= int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __5 } Xsqlite3BtreeLeaveAll(tls, db) return __5: ; zOld = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24)).FzCnName libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(RenameCtx{}))) (*RenameCtx)(unsafe.Pointer(bp)).FiCol = func() int32 { if iCol == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { return -1 } return iCol }() (*Sqlite3)(unsafe.Pointer(db)).FxAuth = uintptr(0) rc = renameParseSql(tls, bp+32, zDb, db, zSql, bTemp) libc.Xmemset(tls, bp+456, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp + 456)).FpParse = bp + 32 (*Walker)(unsafe.Pointer(bp + 456)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameColumnExprCb})) (*Walker)(unsafe.Pointer(bp + 456)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameColumnSelectCb})) *(*uintptr)(unsafe.Pointer(bp + 456 + 40)) = bp (*RenameCtx)(unsafe.Pointer(bp)).FpTab = pTab if !(rc != SQLITE_OK) { goto __6 } goto renameColumnFunc_done __6: ; if !((*Parse)(unsafe.Pointer(bp+32)).FpNewTable != 0) { goto __7 } if !(int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FeTabType) == TABTYP_VIEW) { goto __9 } pSelect = *(*uintptr)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable + 64)) *(*U32)(unsafe.Pointer(pSelect + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_View)) (*Parse)(unsafe.Pointer(bp + 32)).Frc = SQLITE_OK Xsqlite3SelectPrep(tls, bp+32, pSelect, uintptr(0)) rc = func() int32 { if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return SQLITE_NOMEM } return (*Parse)(unsafe.Pointer(bp + 32)).Frc }() if !(rc == SQLITE_OK) { goto __11 } Xsqlite3WalkSelect(tls, bp+456, pSelect) __11: ; if !(rc != SQLITE_OK) { goto __12 } goto renameColumnFunc_done __12: ; goto __10 __9: if !(int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FeTabType) == TABTYP_NORM) { goto __13 } bFKOnly = Xsqlite3_stricmp(tls, zTable, (*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FzName) (*RenameCtx)(unsafe.Pointer(bp)).FpTab = (*Parse)(unsafe.Pointer(bp + 32)).FpNewTable if !(bFKOnly == 0) { goto __14 } if !(iCol < int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FnCol)) { goto __15 } renameTokenFind(tls, bp+32, bp, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FaCol+uintptr(iCol)*24)).FzCnName) __15: ; if !((*RenameCtx)(unsafe.Pointer(bp)).FiCol < 0) { goto __16 } renameTokenFind(tls, bp+32, bp, (*Parse)(unsafe.Pointer(bp+32)).FpNewTable+52) __16: ; Xsqlite3WalkExprList(tls, bp+456, (*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FpCheck) pIdx = (*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp + 32)).FpNewTable)).FpIndex __17: if !(pIdx != 0) { goto __19 } Xsqlite3WalkExprList(tls, bp+456, (*Index)(unsafe.Pointer(pIdx)).FaColExpr) goto __18 __18: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext goto __17 goto __19 __19: ; pIdx = (*Parse)(unsafe.Pointer(bp + 32)).FpNewIndex __20: if !(pIdx != 0) { goto __22 } Xsqlite3WalkExprList(tls, bp+456, (*Index)(unsafe.Pointer(pIdx)).FaColExpr) goto __21 __21: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext goto __20 goto __22 __22: ; i = 0 __23: if !(i < int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FnCol)) { goto __25 } pExpr = Xsqlite3ColumnExpr(tls, (*Parse)(unsafe.Pointer(bp+32)).FpNewTable, (*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable)).FaCol+uintptr(i)*24) Xsqlite3WalkExpr(tls, bp+456, pExpr) goto __24 __24: i++ goto __23 goto __25 __25: ; __14: ; pFKey = *(*uintptr)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTable + 64 + 8)) __26: if !(pFKey != 0) { goto __28 } i = 0 __29: if !(i < (*FKey)(unsafe.Pointer(pFKey)).FnCol) { goto __31 } if !(bFKOnly == 0 && (*sColMap)(unsafe.Pointer(pFKey+64+uintptr(i)*16)).FiFrom == iCol) { goto __32 } renameTokenFind(tls, bp+32, bp, pFKey+64+uintptr(i)*16) __32: ; if !(0 == Xsqlite3_stricmp(tls, (*FKey)(unsafe.Pointer(pFKey)).FzTo, zTable) && 0 == Xsqlite3_stricmp(tls, (*sColMap)(unsafe.Pointer(pFKey+64+uintptr(i)*16)).FzCol, zOld)) { goto __33 } renameTokenFind(tls, bp+32, bp, (*sColMap)(unsafe.Pointer(pFKey+64+uintptr(i)*16)).FzCol) __33: ; goto __30 __30: i++ goto __29 goto __31 __31: ; goto __27 __27: pFKey = (*FKey)(unsafe.Pointer(pFKey)).FpNextFrom goto __26 goto __28 __28: ; __13: ; __10: ; goto __8 __7: if !((*Parse)(unsafe.Pointer(bp+32)).FpNewIndex != 0) { goto __34 } Xsqlite3WalkExprList(tls, bp+456, (*Index)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewIndex)).FaColExpr) Xsqlite3WalkExpr(tls, bp+456, (*Index)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewIndex)).FpPartIdxWhere) goto __35 __34: rc = renameResolveTrigger(tls, bp+32) if !(rc != SQLITE_OK) { goto __36 } goto renameColumnFunc_done __36: ; pStep = (*Trigger)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp + 32)).FpNewTrigger)).Fstep_list __37: if !(pStep != 0) { goto __39 } if !((*TriggerStep)(unsafe.Pointer(pStep)).FzTarget != 0) { goto __40 } pTarget = Xsqlite3LocateTable(tls, bp+32, uint32(0), (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget, zDb) if !(pTarget == pTab) { goto __41 } if !((*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert != 0) { goto __42 } pUpsertSet = (*Upsert)(unsafe.Pointer((*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert)).FpUpsertSet renameColumnElistNames(tls, bp+32, bp, pUpsertSet, zOld) __42: ; renameColumnIdlistNames(tls, bp+32, bp, (*TriggerStep)(unsafe.Pointer(pStep)).FpIdList, zOld) renameColumnElistNames(tls, bp+32, bp, (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList, zOld) __41: ; __40: ; goto __38 __38: pStep = (*TriggerStep)(unsafe.Pointer(pStep)).FpNext goto __37 goto __39 __39: ; if !((*Parse)(unsafe.Pointer(bp+32)).FpTriggerTab == pTab) { goto __43 } renameColumnIdlistNames(tls, bp+32, bp, (*Trigger)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+32)).FpNewTrigger)).FpColumns, zOld) __43: ; renameWalkTrigger(tls, bp+456, (*Parse)(unsafe.Pointer(bp+32)).FpNewTrigger) __35: ; __8: ; rc = renameEditSql(tls, context, bp, zSql, zNew, bQuote) renameColumnFunc_done: if !(rc != SQLITE_OK) { goto __44 } if !(rc == SQLITE_ERROR && Xsqlite3WritableSchema(tls, db) != 0) { goto __45 } Xsqlite3_result_value(tls, context, *(*uintptr)(unsafe.Pointer(argv))) goto __46 __45: if !((*Parse)(unsafe.Pointer(bp+32)).FzErrMsg != 0) { goto __47 } renameColumnParseError(tls, context, ts+1544, *(*uintptr)(unsafe.Pointer(argv + 1*8)), *(*uintptr)(unsafe.Pointer(argv + 2*8)), bp+32) goto __48 __47: Xsqlite3_result_error_code(tls, context, rc) __48: ; __46: ; __44: ; renameParseCleanup(tls, bp+32) renameTokenFree(tls, db, (*RenameCtx)(unsafe.Pointer(bp)).FpList) (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth Xsqlite3BtreeLeaveAll(tls, db) } func renameTableExprCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc|EP_Subrtn) == U32(0) && (*RenameCtx)(unsafe.Pointer(p)).FpTab == *(*uintptr)(unsafe.Pointer(pExpr + 64)) { renameTokenFind(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, p, pExpr+64) } return WRC_Continue } func renameTableSelectCb(tls *libc.TLS, pWalker uintptr, pSelect uintptr) int32 { var i int32 var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pSrc uintptr = (*Select)(unsafe.Pointer(pSelect)).FpSrc if (*Select)(unsafe.Pointer(pSelect)).FselFlags&U32(SF_View|SF_CopyCte) != 0 { return WRC_Prune } if pSrc == uintptr(0) { return WRC_Abort } for i = 0; i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc; i++ { var pItem uintptr = pSrc + 8 + uintptr(i)*104 if (*SrcItem)(unsafe.Pointer(pItem)).FpTab == (*RenameCtx)(unsafe.Pointer(p)).FpTab { renameTokenFind(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, p, (*SrcItem)(unsafe.Pointer(pItem)).FzName) } } renameWalkWith(tls, pWalker, pSelect) return WRC_Continue } func renameTableFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { bp := tls.Alloc(560) defer tls.Free(560) var db uintptr = Xsqlite3_context_db_handle(tls, context) var zDb uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) var zInput uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8))) var zOld uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 4*8))) var zNew uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 5*8))) var bTemp int32 = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 6*8))) _ = NotUsed if zInput != 0 && zOld != 0 && zNew != 0 { var rc int32 var bQuote int32 = 1 var xAuth Sqlite3_xauth = (*Sqlite3)(unsafe.Pointer(db)).FxAuth (*Sqlite3)(unsafe.Pointer(db)).FxAuth = uintptr(0) Xsqlite3BtreeEnterAll(tls, db) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(RenameCtx{}))) (*RenameCtx)(unsafe.Pointer(bp)).FpTab = Xsqlite3FindTable(tls, db, zOld, zDb) libc.Xmemset(tls, bp+32, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp + 32)).FpParse = bp + 80 (*Walker)(unsafe.Pointer(bp + 32)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameTableExprCb})) (*Walker)(unsafe.Pointer(bp + 32)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameTableSelectCb})) *(*uintptr)(unsafe.Pointer(bp + 32 + 40)) = bp rc = renameParseSql(tls, bp+80, zDb, db, zInput, bTemp) if rc == SQLITE_OK { var isLegacy int32 = int32((*Sqlite3)(unsafe.Pointer(db)).Fflags & uint64(SQLITE_LegacyAlter)) if (*Parse)(unsafe.Pointer(bp+80)).FpNewTable != 0 { var pTab uintptr = (*Parse)(unsafe.Pointer(bp + 80)).FpNewTable if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW { if isLegacy == 0 { var pSelect uintptr = *(*uintptr)(unsafe.Pointer(pTab + 64)) libc.Xmemset(tls, bp+504, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 504)).FpParse = bp + 80 *(*U32)(unsafe.Pointer(pSelect + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_View)) Xsqlite3SelectPrep(tls, bp+80, *(*uintptr)(unsafe.Pointer(pTab + 64)), bp+504) if (*Parse)(unsafe.Pointer(bp+80)).FnErr != 0 { rc = (*Parse)(unsafe.Pointer(bp + 80)).Frc } else { Xsqlite3WalkSelect(tls, bp+32, *(*uintptr)(unsafe.Pointer(pTab + 64))) } } } else { if (isLegacy == 0 || (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ForeignKeys) != 0) && !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { var pFKey uintptr for pFKey = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)); pFKey != 0; pFKey = (*FKey)(unsafe.Pointer(pFKey)).FpNextFrom { if Xsqlite3_stricmp(tls, (*FKey)(unsafe.Pointer(pFKey)).FzTo, zOld) == 0 { renameTokenFind(tls, bp+80, bp, (*FKey)(unsafe.Pointer(pFKey)).FzTo) } } } if Xsqlite3_stricmp(tls, zOld, (*Table)(unsafe.Pointer(pTab)).FzName) == 0 { (*RenameCtx)(unsafe.Pointer(bp)).FpTab = pTab if isLegacy == 0 { Xsqlite3WalkExprList(tls, bp+32, (*Table)(unsafe.Pointer(pTab)).FpCheck) } renameTokenFind(tls, bp+80, bp, (*Table)(unsafe.Pointer(pTab)).FzName) } } } else if (*Parse)(unsafe.Pointer(bp+80)).FpNewIndex != 0 { renameTokenFind(tls, bp+80, bp, (*Index)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+80)).FpNewIndex)).FzName) if isLegacy == 0 { Xsqlite3WalkExpr(tls, bp+32, (*Index)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+80)).FpNewIndex)).FpPartIdxWhere) } } else { var pTrigger uintptr = (*Parse)(unsafe.Pointer(bp + 80)).FpNewTrigger var pStep uintptr if 0 == Xsqlite3_stricmp(tls, (*Trigger)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+80)).FpNewTrigger)).Ftable, zOld) && (*Table)(unsafe.Pointer((*RenameCtx)(unsafe.Pointer(bp)).FpTab)).FpSchema == (*Trigger)(unsafe.Pointer(pTrigger)).FpTabSchema { renameTokenFind(tls, bp+80, bp, (*Trigger)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+80)).FpNewTrigger)).Ftable) } if isLegacy == 0 { rc = renameResolveTrigger(tls, bp+80) if rc == SQLITE_OK { renameWalkTrigger(tls, bp+32, pTrigger) for pStep = (*Trigger)(unsafe.Pointer(pTrigger)).Fstep_list; pStep != 0; pStep = (*TriggerStep)(unsafe.Pointer(pStep)).FpNext { if (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget != 0 && 0 == Xsqlite3_stricmp(tls, (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget, zOld) { renameTokenFind(tls, bp+80, bp, (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget) } if (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom != 0 { var i int32 for i = 0; i < (*SrcList)(unsafe.Pointer((*TriggerStep)(unsafe.Pointer(pStep)).FpFrom)).FnSrc; i++ { var pItem uintptr = (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom + 8 + uintptr(i)*104 if 0 == Xsqlite3_stricmp(tls, (*SrcItem)(unsafe.Pointer(pItem)).FzName, zOld) { renameTokenFind(tls, bp+80, bp, (*SrcItem)(unsafe.Pointer(pItem)).FzName) } } } } } } } } if rc == SQLITE_OK { rc = renameEditSql(tls, context, bp, zInput, zNew, bQuote) } if rc != SQLITE_OK { if rc == SQLITE_ERROR && Xsqlite3WritableSchema(tls, db) != 0 { Xsqlite3_result_value(tls, context, *(*uintptr)(unsafe.Pointer(argv + 3*8))) } else if (*Parse)(unsafe.Pointer(bp+80)).FzErrMsg != 0 { renameColumnParseError(tls, context, ts+1544, *(*uintptr)(unsafe.Pointer(argv + 1*8)), *(*uintptr)(unsafe.Pointer(argv + 2*8)), bp+80) } else { Xsqlite3_result_error_code(tls, context, rc) } } renameParseCleanup(tls, bp+80) renameTokenFree(tls, db, (*RenameCtx)(unsafe.Pointer(bp)).FpList) Xsqlite3BtreeLeaveAll(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth } return } func renameQuotefixExprCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_STRING && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_DblQuoted) != 0 { renameTokenFind(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, *(*uintptr)(unsafe.Pointer(pWalker + 40)), pExpr) } return WRC_Continue } func renameQuotefixFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { bp := tls.Alloc(504) defer tls.Free(504) var db uintptr = Xsqlite3_context_db_handle(tls, context) var zDb uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) var zInput uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) var xAuth Sqlite3_xauth = (*Sqlite3)(unsafe.Pointer(db)).FxAuth (*Sqlite3)(unsafe.Pointer(db)).FxAuth = uintptr(0) Xsqlite3BtreeEnterAll(tls, db) _ = NotUsed if zDb != 0 && zInput != 0 { var rc int32 rc = renameParseSql(tls, bp, zDb, db, zInput, 0) if rc == SQLITE_OK { libc.Xmemset(tls, bp+424, 0, uint64(unsafe.Sizeof(RenameCtx{}))) libc.Xmemset(tls, bp+456, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp + 456)).FpParse = bp (*Walker)(unsafe.Pointer(bp + 456)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameQuotefixExprCb})) (*Walker)(unsafe.Pointer(bp + 456)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renameColumnSelectCb})) *(*uintptr)(unsafe.Pointer(bp + 456 + 40)) = bp + 424 if (*Parse)(unsafe.Pointer(bp)).FpNewTable != 0 { if int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTable)).FeTabType) == TABTYP_VIEW { var pSelect uintptr = *(*uintptr)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTable + 64)) *(*U32)(unsafe.Pointer(pSelect + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_View)) (*Parse)(unsafe.Pointer(bp)).Frc = SQLITE_OK Xsqlite3SelectPrep(tls, bp, pSelect, uintptr(0)) rc = func() int32 { if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return SQLITE_NOMEM } return (*Parse)(unsafe.Pointer(bp)).Frc }() if rc == SQLITE_OK { Xsqlite3WalkSelect(tls, bp+456, pSelect) } } else { var i int32 Xsqlite3WalkExprList(tls, bp+456, (*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTable)).FpCheck) for i = 0; i < int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTable)).FnCol); i++ { Xsqlite3WalkExpr(tls, bp+456, Xsqlite3ColumnExpr(tls, (*Parse)(unsafe.Pointer(bp)).FpNewTable, (*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTable)).FaCol+uintptr(i)*24)) } } } else if (*Parse)(unsafe.Pointer(bp)).FpNewIndex != 0 { Xsqlite3WalkExprList(tls, bp+456, (*Index)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewIndex)).FaColExpr) Xsqlite3WalkExpr(tls, bp+456, (*Index)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewIndex)).FpPartIdxWhere) } else { rc = renameResolveTrigger(tls, bp) if rc == SQLITE_OK { renameWalkTrigger(tls, bp+456, (*Parse)(unsafe.Pointer(bp)).FpNewTrigger) } } if rc == SQLITE_OK { rc = renameEditSql(tls, context, bp+424, zInput, uintptr(0), 0) } renameTokenFree(tls, db, (*RenameCtx)(unsafe.Pointer(bp+424)).FpList) } if rc != SQLITE_OK { if Xsqlite3WritableSchema(tls, db) != 0 && rc == SQLITE_ERROR { Xsqlite3_result_value(tls, context, *(*uintptr)(unsafe.Pointer(argv + 1*8))) } else { Xsqlite3_result_error_code(tls, context, rc) } } renameParseCleanup(tls, bp) } (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth Xsqlite3BtreeLeaveAll(tls, db) } func renameTableTest(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { bp := tls.Alloc(480) defer tls.Free(480) var db uintptr = Xsqlite3_context_db_handle(tls, context) var zDb uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) var zInput uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) var bTemp int32 = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 4*8))) var isLegacy int32 = int32((*Sqlite3)(unsafe.Pointer(db)).Fflags & uint64(SQLITE_LegacyAlter)) var zWhen uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 5*8))) var bNoDQS int32 = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 6*8))) var xAuth Sqlite3_xauth = (*Sqlite3)(unsafe.Pointer(db)).FxAuth (*Sqlite3)(unsafe.Pointer(db)).FxAuth = uintptr(0) _ = NotUsed if zDb != 0 && zInput != 0 { var rc int32 var flags int32 = int32((*Sqlite3)(unsafe.Pointer(db)).Fflags) if bNoDQS != 0 { *(*U64)(unsafe.Pointer(db + 48)) &= libc.Uint64FromInt32(libc.CplInt32(SQLITE_DqsDML | SQLITE_DqsDDL)) } rc = renameParseSql(tls, bp, zDb, db, zInput, bTemp) *(*U64)(unsafe.Pointer(db + 48)) |= U64(flags & (SQLITE_DqsDML | SQLITE_DqsDDL)) if rc == SQLITE_OK { if isLegacy == 0 && (*Parse)(unsafe.Pointer(bp)).FpNewTable != 0 && int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTable)).FeTabType) == TABTYP_VIEW { libc.Xmemset(tls, bp+424, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 424)).FpParse = bp Xsqlite3SelectPrep(tls, bp, *(*uintptr)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTable + 64)), bp+424) if (*Parse)(unsafe.Pointer(bp)).FnErr != 0 { rc = (*Parse)(unsafe.Pointer(bp)).Frc } } else if (*Parse)(unsafe.Pointer(bp)).FpNewTrigger != 0 { if isLegacy == 0 { rc = renameResolveTrigger(tls, bp) } if rc == SQLITE_OK { var i1 int32 = Xsqlite3SchemaToIndex(tls, db, (*Trigger)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp)).FpNewTrigger)).FpTabSchema) var i2 int32 = Xsqlite3FindDbName(tls, db, zDb) if i1 == i2 { Xsqlite3_result_int(tls, context, 1) } } } } if rc != SQLITE_OK && zWhen != 0 && !(Xsqlite3WritableSchema(tls, db) != 0) { renameColumnParseError(tls, context, zWhen, *(*uintptr)(unsafe.Pointer(argv + 2*8)), *(*uintptr)(unsafe.Pointer(argv + 3*8)), bp) } renameParseCleanup(tls, bp) } (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth } func dropColumnFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { bp := tls.Alloc(448) defer tls.Free(448) var db uintptr var iSchema int32 var zSql uintptr var iCol int32 var zDb uintptr var rc int32 var pCol uintptr var pTab uintptr var zEnd uintptr var zNew uintptr var xAuth Sqlite3_xauth var pEnd uintptr db = Xsqlite3_context_db_handle(tls, context) iSchema = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv))) zSql = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) iCol = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iSchema)*32)).FzDbSName zNew = uintptr(0) xAuth = (*Sqlite3)(unsafe.Pointer(db)).FxAuth (*Sqlite3)(unsafe.Pointer(db)).FxAuth = uintptr(0) _ = NotUsed rc = renameParseSql(tls, bp+24, zDb, db, zSql, libc.Bool32(iSchema == 1)) if !(rc != SQLITE_OK) { goto __1 } goto drop_column_done __1: ; pTab = (*Parse)(unsafe.Pointer(bp + 24)).FpNewTable if !(pTab == uintptr(0) || int32((*Table)(unsafe.Pointer(pTab)).FnCol) == 1 || iCol >= int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __2 } rc = Xsqlite3CorruptError(tls, 114463) goto drop_column_done __2: ; pCol = renameTokenFind(tls, bp+24, uintptr(0), (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FzCnName) if !(iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol)-1) { goto __3 } pEnd = renameTokenFind(tls, bp+24, uintptr(0), (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol+1)*24)).FzCnName) zEnd = (*RenameToken)(unsafe.Pointer(pEnd)).Ft.Fz goto __4 __3: ; zEnd = zSql + uintptr(*(*int32)(unsafe.Pointer(pTab + 64))) __5: if !(int32(*(*int8)(unsafe.Pointer((*RenameToken)(unsafe.Pointer(pCol)).Ft.Fz))) != 0 && int32(*(*int8)(unsafe.Pointer((*RenameToken)(unsafe.Pointer(pCol)).Ft.Fz))) != ',') { goto __6 } (*RenameToken)(unsafe.Pointer(pCol)).Ft.Fz-- goto __5 __6: ; __4: ; zNew = Xsqlite3MPrintf(tls, db, ts+12293, libc.VaList(bp, (int64((*RenameToken)(unsafe.Pointer(pCol)).Ft.Fz)-int64(zSql))/1, zSql, zEnd)) Xsqlite3_result_text(tls, context, zNew, -1, libc.UintptrFromInt32(-1)) Xsqlite3_free(tls, zNew) drop_column_done: renameParseCleanup(tls, bp+24) (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth if !(rc != SQLITE_OK) { goto __7 } Xsqlite3_result_error_code(tls, context, rc) __7: } // This function is called by the parser upon parsing an // // ALTER TABLE pSrc DROP COLUMN pName // // statement. Argument pSrc contains the possibly qualified name of the // table being edited, and token pName the name of the column to drop. func Xsqlite3AlterDropColumn(tls *libc.TLS, pParse uintptr, pSrc uintptr, pName uintptr) { bp := tls.Alloc(64) defer tls.Free(64) var db uintptr var pTab uintptr var iDb int32 var zDb uintptr var zCol uintptr var iCol int32 var iPos int32 var iColPos int32 var regOut int32 var i int32 var addr int32 var reg int32 var regRec int32 var pPk uintptr var nField int32 var iCur int32 var v uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb zCol = uintptr(0) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __1 } goto exit_drop_column __1: ; pTab = Xsqlite3LocateTableItem(tls, pParse, uint32(0), pSrc+8) if !!(pTab != 0) { goto __2 } goto exit_drop_column __2: ; if !(SQLITE_OK != isAlterableTable(tls, pParse, pTab)) { goto __3 } goto exit_drop_column __3: ; if !(SQLITE_OK != isRealTable(tls, pParse, pTab, 1)) { goto __4 } goto exit_drop_column __4: ; zCol = Xsqlite3NameFromToken(tls, db, pName) if !(zCol == uintptr(0)) { goto __5 } goto exit_drop_column __5: ; iCol = Xsqlite3ColumnIndex(tls, pTab, zCol) if !(iCol < 0) { goto __6 } Xsqlite3ErrorMsg(tls, pParse, ts+11915, libc.VaList(bp, pName)) goto exit_drop_column __6: ; if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FcolFlags)&(COLFLAG_PRIMKEY|COLFLAG_UNIQUE) != 0) { goto __7 } Xsqlite3ErrorMsg(tls, pParse, ts+12300, libc.VaList(bp+8, func() uintptr { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FcolFlags)&COLFLAG_PRIMKEY != 0 { return ts + 12328 } return ts + 7479 }(), zCol)) goto exit_drop_column __7: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FnCol) <= 1) { goto __8 } Xsqlite3ErrorMsg(tls, pParse, ts+12340, libc.VaList(bp+24, zCol)) goto exit_drop_column __8: ; iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_ALTER_TABLE, zDb, (*Table)(unsafe.Pointer(pTab)).FzName, zCol) != 0) { goto __9 } goto exit_drop_column __9: ; renameTestSchema(tls, pParse, zDb, libc.Bool32(iDb == 1), ts+1544, 0) renameFixQuotes(tls, pParse, zDb, libc.Bool32(iDb == 1)) Xsqlite3NestedParse(tls, pParse, ts+12388, libc.VaList(bp+32, zDb, iDb, iCol, (*Table)(unsafe.Pointer(pTab)).FzName)) renameReloadSchema(tls, pParse, iDb, uint16(INITFLAG_AlterDrop)) renameTestSchema(tls, pParse, zDb, libc.Bool32(iDb == 1), ts+12509, 1) if !((*Parse)(unsafe.Pointer(pParse)).FnErr == 0 && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0) { goto __10 } pPk = uintptr(0) nField = 0 v = Xsqlite3GetVdbe(tls, pParse) iCur = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) Xsqlite3OpenTable(tls, pParse, iCur, iDb, pTab, OP_OpenWrite) addr = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, iCur) reg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __11 } Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iCur, reg) *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Table)(unsafe.Pointer(pTab)).FnCol) goto __12 __11: pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Index)(unsafe.Pointer(pPk)).FnColumn) i = 0 __13: if !(i < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) { goto __15 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, iCur, i, reg+i+1) goto __14 __14: i++ goto __13 goto __15 __15: ; nField = int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol) __12: ; regRec = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) i = 0 __16: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __18 } if !(i != iCol && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0) { goto __19 } if !(pPk != 0) { goto __20 } iPos = int32(Xsqlite3TableColumnToIndex(tls, pPk, int16(i))) iColPos = int32(Xsqlite3TableColumnToIndex(tls, pPk, int16(iCol))) if !(iPos < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) { goto __22 } goto __17 __22: ; regOut = reg + 1 + iPos - libc.Bool32(iPos > iColPos) goto __21 __20: regOut = reg + 1 + nField __21: ; if !(i == int32((*Table)(unsafe.Pointer(pTab)).FiPKey)) { goto __23 } Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regOut) goto __24 __23: Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iCur, i, regOut) __24: ; nField++ __19: ; goto __17 __17: i++ goto __16 goto __18 __18: ; if !(nField == 0) { goto __25 } (*Parse)(unsafe.Pointer(pParse)).FnMem++ Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, reg+1) nField = 1 __25: ; Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, reg+1, nField, regRec) if !(pPk != 0) { goto __26 } Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iCur, regRec, reg+1, int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) goto __27 __26: Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iCur, regRec, reg) __27: ; Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_SAVEPOSITION)) Xsqlite3VdbeAddOp2(tls, v, OP_Next, iCur, addr+1) Xsqlite3VdbeJumpHere(tls, v, addr) __10: ; exit_drop_column: Xsqlite3DbFree(tls, db, zCol) Xsqlite3SrcListDelete(tls, db, pSrc) } // Register built-in functions used to help implement ALTER TABLE func Xsqlite3AlterFunctions(tls *libc.TLS) { Xsqlite3InsertBuiltinFuncs(tls, uintptr(unsafe.Pointer(&aAlterTableFuncs)), int32(uint64(unsafe.Sizeof(aAlterTableFuncs))/uint64(unsafe.Sizeof(FuncDef{})))) } var aAlterTableFuncs = [5]FuncDef{ {FnArg: int8(9), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_INTERNAL | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FxSFunc: 0, FzName: ts + 12527}, {FnArg: int8(7), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_INTERNAL | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FxSFunc: 0, FzName: ts + 12548}, {FnArg: int8(7), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_INTERNAL | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FxSFunc: 0, FzName: ts + 12568}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_INTERNAL | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FxSFunc: 0, FzName: ts + 12587}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_INTERNAL | SQLITE_UTF8 | SQLITE_FUNC_CONSTANT), FxSFunc: 0, FzName: ts + 12606}} func openStatTable(tls *libc.TLS, pParse uintptr, iDb int32, iStatCur int32, zWhere uintptr, zWhereType uintptr) { bp := tls.Alloc(88) defer tls.Free(88) var i int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pDb uintptr var v uintptr = Xsqlite3GetVdbe(tls, pParse) var nToOpen int32 if (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_Stat4) == U32(0) { nToOpen = 2 } else { nToOpen = 1 } if v == uintptr(0) { return } pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 for i = 0; i < int32(uint64(unsafe.Sizeof(aTable))/uint64(unsafe.Sizeof(struct { FzName uintptr FzCols uintptr }{}))); i++ { var zTab uintptr = aTable[i].FzName var pStat uintptr *(*U8)(unsafe.Pointer(bp + 72 + uintptr(i))) = U8(0) if libc.AssignUintptr(&pStat, Xsqlite3FindTable(tls, db, zTab, (*Db)(unsafe.Pointer(pDb)).FzDbSName)) == uintptr(0) { if i < nToOpen { Xsqlite3NestedParse(tls, pParse, ts+12629, libc.VaList(bp, (*Db)(unsafe.Pointer(pDb)).FzDbSName, zTab, aTable[i].FzCols)) *(*U32)(unsafe.Pointer(bp + 76 + uintptr(i)*4)) = U32((*Parse)(unsafe.Pointer(pParse)).FregRoot) *(*U8)(unsafe.Pointer(bp + 72 + uintptr(i))) = U8(OPFLAG_P2ISREG) } } else { *(*U32)(unsafe.Pointer(bp + 76 + uintptr(i)*4)) = (*Table)(unsafe.Pointer(pStat)).Ftnum Xsqlite3TableLock(tls, pParse, iDb, *(*U32)(unsafe.Pointer(bp + 76 + uintptr(i)*4)), uint8(1), zTab) if zWhere != 0 { Xsqlite3NestedParse(tls, pParse, ts+12652, libc.VaList(bp+24, (*Db)(unsafe.Pointer(pDb)).FzDbSName, zTab, zWhereType, zWhere)) } else if (*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback != 0 { Xsqlite3NestedParse(tls, pParse, ts+12682, libc.VaList(bp+56, (*Db)(unsafe.Pointer(pDb)).FzDbSName, zTab)) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Clear, int32(*(*U32)(unsafe.Pointer(bp + 76 + uintptr(i)*4))), iDb) } } } for i = 0; i < nToOpen; i++ { Xsqlite3VdbeAddOp4Int(tls, v, OP_OpenWrite, iStatCur+i, int32(*(*U32)(unsafe.Pointer(bp + 76 + uintptr(i)*4))), iDb, 3) Xsqlite3VdbeChangeP5(tls, v, uint16(*(*U8)(unsafe.Pointer(bp + 72 + uintptr(i))))) } } var aTable = [3]struct { FzName uintptr FzCols uintptr }{ {FzName: ts + 12700, FzCols: ts + 12713}, {FzName: ts + 12726, FzCols: ts + 12739}, {FzName: ts + 12767}, } // Three SQL functions - stat_init(), stat_push(), and stat_get() - // share an instance of the following structure to hold their state // information. type StatAccum1 = struct { Fdb uintptr FnEst TRowcnt FnRow TRowcnt FnLimit int32 FnCol int32 FnKeyCol int32 FnSkipAhead U8 F__ccgo_pad1 [3]byte Fcurrent StatSample FnPSample TRowcnt FmxSample int32 FiPrn U32 FaBest uintptr FiMin int32 FnSample int32 FnMaxEqZero int32 FiGet int32 Fa uintptr } // Three SQL functions - stat_init(), stat_push(), and stat_get() - // share an instance of the following structure to hold their state // information. type StatAccum = StatAccum1 type StatSample1 = struct { FanEq uintptr FanDLt uintptr FanLt uintptr Fu struct{ FiRowid I64 } FnRowid U32 FisPSample U8 F__ccgo_pad1 [3]byte FiCol int32 FiHash U32 } type StatSample = StatSample1 func sampleClear(tls *libc.TLS, db uintptr, p uintptr) { if (*StatSample)(unsafe.Pointer(p)).FnRowid != 0 { Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(p + 24))) (*StatSample)(unsafe.Pointer(p)).FnRowid = U32(0) } } func sampleSetRowid(tls *libc.TLS, db uintptr, p uintptr, n int32, pData uintptr) { if (*StatSample)(unsafe.Pointer(p)).FnRowid != 0 { Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(p + 24))) } *(*uintptr)(unsafe.Pointer(p + 24)) = Xsqlite3DbMallocRawNN(tls, db, uint64(n)) if *(*uintptr)(unsafe.Pointer(p + 24)) != 0 { (*StatSample)(unsafe.Pointer(p)).FnRowid = U32(n) libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(p + 24)), pData, uint64(n)) } else { (*StatSample)(unsafe.Pointer(p)).FnRowid = U32(0) } } func sampleSetRowidInt64(tls *libc.TLS, db uintptr, p uintptr, iRowid I64) { if (*StatSample)(unsafe.Pointer(p)).FnRowid != 0 { Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(p + 24))) } (*StatSample)(unsafe.Pointer(p)).FnRowid = U32(0) *(*I64)(unsafe.Pointer(p + 24)) = iRowid } func sampleCopy(tls *libc.TLS, p uintptr, pTo uintptr, pFrom uintptr) { (*StatSample)(unsafe.Pointer(pTo)).FisPSample = (*StatSample)(unsafe.Pointer(pFrom)).FisPSample (*StatSample)(unsafe.Pointer(pTo)).FiCol = (*StatSample)(unsafe.Pointer(pFrom)).FiCol (*StatSample)(unsafe.Pointer(pTo)).FiHash = (*StatSample)(unsafe.Pointer(pFrom)).FiHash libc.Xmemcpy(tls, (*StatSample)(unsafe.Pointer(pTo)).FanEq, (*StatSample)(unsafe.Pointer(pFrom)).FanEq, uint64(unsafe.Sizeof(TRowcnt(0)))*uint64((*StatAccum)(unsafe.Pointer(p)).FnCol)) libc.Xmemcpy(tls, (*StatSample)(unsafe.Pointer(pTo)).FanLt, (*StatSample)(unsafe.Pointer(pFrom)).FanLt, uint64(unsafe.Sizeof(TRowcnt(0)))*uint64((*StatAccum)(unsafe.Pointer(p)).FnCol)) libc.Xmemcpy(tls, (*StatSample)(unsafe.Pointer(pTo)).FanDLt, (*StatSample)(unsafe.Pointer(pFrom)).FanDLt, uint64(unsafe.Sizeof(TRowcnt(0)))*uint64((*StatAccum)(unsafe.Pointer(p)).FnCol)) if (*StatSample)(unsafe.Pointer(pFrom)).FnRowid != 0 { sampleSetRowid(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, pTo, int32((*StatSample)(unsafe.Pointer(pFrom)).FnRowid), *(*uintptr)(unsafe.Pointer(pFrom + 24))) } else { sampleSetRowidInt64(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, pTo, *(*I64)(unsafe.Pointer(pFrom + 24))) } } func statAccumDestructor(tls *libc.TLS, pOld uintptr) { var p uintptr = pOld if (*StatAccum)(unsafe.Pointer(p)).FmxSample != 0 { var i int32 for i = 0; i < (*StatAccum)(unsafe.Pointer(p)).FnCol; i++ { sampleClear(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, (*StatAccum)(unsafe.Pointer(p)).FaBest+uintptr(i)*48) } for i = 0; i < (*StatAccum)(unsafe.Pointer(p)).FmxSample; i++ { sampleClear(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, (*StatAccum)(unsafe.Pointer(p)).Fa+uintptr(i)*48) } sampleClear(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, p+40) } Xsqlite3DbFree(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, p) } func statInit(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr var nCol int32 var nKeyCol int32 var nColUp int32 var n int32 var db uintptr = Xsqlite3_context_db_handle(tls, context) var mxSample int32 if (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_Stat4) == U32(0) { mxSample = SQLITE_STAT4_SAMPLES } else { mxSample = 0 } _ = argc nCol = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv))) if uint64(unsafe.Sizeof(TRowcnt(0))) < uint64(8) { nColUp = (nCol + 1) & libc.CplInt32(1) } else { nColUp = nCol } nKeyCol = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) n = int32(uint64(unsafe.Sizeof(StatAccum{})) + uint64(unsafe.Sizeof(TRowcnt(0)))*uint64(nColUp) + uint64(unsafe.Sizeof(TRowcnt(0)))*uint64(nColUp)) if mxSample != 0 { n = int32(uint64(n) + (uint64(unsafe.Sizeof(TRowcnt(0)))*uint64(nColUp) + uint64(unsafe.Sizeof(StatSample{}))*uint64(nCol+mxSample) + uint64(unsafe.Sizeof(TRowcnt(0)))*uint64(3)*uint64(nColUp)*uint64(nCol+mxSample))) } p = Xsqlite3DbMallocZero(tls, db, uint64(n)) if p == uintptr(0) { Xsqlite3_result_error_nomem(tls, context) return } (*StatAccum)(unsafe.Pointer(p)).Fdb = db (*StatAccum)(unsafe.Pointer(p)).FnEst = TRowcnt(Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8)))) (*StatAccum)(unsafe.Pointer(p)).FnRow = uint64(0) (*StatAccum)(unsafe.Pointer(p)).FnLimit = int32(Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8)))) (*StatAccum)(unsafe.Pointer(p)).FnCol = nCol (*StatAccum)(unsafe.Pointer(p)).FnKeyCol = nKeyCol (*StatAccum)(unsafe.Pointer(p)).FnSkipAhead = U8(0) (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanDLt = p + 1*136 (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq = (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanDLt + uintptr(nColUp)*8 (*StatAccum)(unsafe.Pointer(p)).FmxSample = func() int32 { if (*StatAccum)(unsafe.Pointer(p)).FnLimit == 0 { return mxSample } return 0 }() if mxSample != 0 { var pSpace uintptr var i int32 (*StatAccum)(unsafe.Pointer(p)).FiGet = -1 (*StatAccum)(unsafe.Pointer(p)).FnPSample = (*StatAccum)(unsafe.Pointer(p)).FnEst/TRowcnt(mxSample/3+1) + uint64(1) (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanLt = (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq + uintptr(nColUp)*8 (*StatAccum)(unsafe.Pointer(p)).FiPrn = U32(0x689e962d)*U32(nCol) ^ 0xd0944565*U32(Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8)))) (*StatAccum)(unsafe.Pointer(p)).Fa = (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanLt + uintptr(nColUp)*8 (*StatAccum)(unsafe.Pointer(p)).FaBest = (*StatAccum)(unsafe.Pointer(p)).Fa + uintptr(mxSample)*48 pSpace = (*StatAccum)(unsafe.Pointer(p)).Fa + uintptr(mxSample+nCol)*48 for i = 0; i < mxSample+nCol; i++ { (*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa + uintptr(i)*48)).FanEq = pSpace pSpace += uintptr(uint64(unsafe.Sizeof(TRowcnt(0))) * uint64(nColUp)) (*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa + uintptr(i)*48)).FanLt = pSpace pSpace += uintptr(uint64(unsafe.Sizeof(TRowcnt(0))) * uint64(nColUp)) (*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa + uintptr(i)*48)).FanDLt = pSpace pSpace += uintptr(uint64(unsafe.Sizeof(TRowcnt(0))) * uint64(nColUp)) } for i = 0; i < nCol; i++ { (*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).FaBest + uintptr(i)*48)).FiCol = i } } Xsqlite3_result_blob(tls, context, p, int32(unsafe.Sizeof(StatAccum{})), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{statAccumDestructor}))) } var statInitFuncdef = FuncDef{ FnArg: int8(4), FfuncFlags: U32(SQLITE_UTF8), FxSFunc: 0, FzName: ts + 12780} func sampleIsBetterPost(tls *libc.TLS, pAccum uintptr, pNew uintptr, pOld uintptr) int32 { var nCol int32 = (*StatAccum)(unsafe.Pointer(pAccum)).FnCol var i int32 for i = (*StatSample)(unsafe.Pointer(pNew)).FiCol + 1; i < nCol; i++ { if *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pNew)).FanEq + uintptr(i)*8)) > *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pOld)).FanEq + uintptr(i)*8)) { return 1 } if *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pNew)).FanEq + uintptr(i)*8)) < *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pOld)).FanEq + uintptr(i)*8)) { return 0 } } if (*StatSample)(unsafe.Pointer(pNew)).FiHash > (*StatSample)(unsafe.Pointer(pOld)).FiHash { return 1 } return 0 } func sampleIsBetter(tls *libc.TLS, pAccum uintptr, pNew uintptr, pOld uintptr) int32 { var nEqNew TRowcnt = *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pNew)).FanEq + uintptr((*StatSample)(unsafe.Pointer(pNew)).FiCol)*8)) var nEqOld TRowcnt = *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pOld)).FanEq + uintptr((*StatSample)(unsafe.Pointer(pOld)).FiCol)*8)) if nEqNew > nEqOld { return 1 } if nEqNew == nEqOld { if (*StatSample)(unsafe.Pointer(pNew)).FiCol < (*StatSample)(unsafe.Pointer(pOld)).FiCol { return 1 } return libc.Bool32((*StatSample)(unsafe.Pointer(pNew)).FiCol == (*StatSample)(unsafe.Pointer(pOld)).FiCol && sampleIsBetterPost(tls, pAccum, pNew, pOld) != 0) } return 0 } func sampleInsert(tls *libc.TLS, p uintptr, pNew uintptr, nEqZero int32) { var pSample uintptr var i int32 var pOld uintptr var pUpgrade uintptr var pMin uintptr var anEq uintptr var anLt uintptr var anDLt uintptr var iMin int32 pSample = uintptr(0) if !(nEqZero > (*StatAccum)(unsafe.Pointer(p)).FnMaxEqZero) { goto __1 } (*StatAccum)(unsafe.Pointer(p)).FnMaxEqZero = nEqZero __1: ; if !(int32((*StatSample)(unsafe.Pointer(pNew)).FisPSample) == 0) { goto __2 } pUpgrade = uintptr(0) i = (*StatAccum)(unsafe.Pointer(p)).FnSample - 1 __3: if !(i >= 0) { goto __5 } pOld = (*StatAccum)(unsafe.Pointer(p)).Fa + uintptr(i)*48 if !(*(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pOld)).FanEq + uintptr((*StatSample)(unsafe.Pointer(pNew)).FiCol)*8)) == uint64(0)) { goto __6 } if !((*StatSample)(unsafe.Pointer(pOld)).FisPSample != 0) { goto __7 } return __7: ; if !(pUpgrade == uintptr(0) || sampleIsBetter(tls, p, pOld, pUpgrade) != 0) { goto __8 } pUpgrade = pOld __8: ; __6: ; goto __4 __4: i-- goto __3 goto __5 __5: ; if !(pUpgrade != 0) { goto __9 } (*StatSample)(unsafe.Pointer(pUpgrade)).FiCol = (*StatSample)(unsafe.Pointer(pNew)).FiCol *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pUpgrade)).FanEq + uintptr((*StatSample)(unsafe.Pointer(pUpgrade)).FiCol)*8)) = *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pNew)).FanEq + uintptr((*StatSample)(unsafe.Pointer(pUpgrade)).FiCol)*8)) goto find_new_min __9: ; __2: ; if !((*StatAccum)(unsafe.Pointer(p)).FnSample >= (*StatAccum)(unsafe.Pointer(p)).FmxSample) { goto __10 } pMin = (*StatAccum)(unsafe.Pointer(p)).Fa + uintptr((*StatAccum)(unsafe.Pointer(p)).FiMin)*48 anEq = (*StatSample)(unsafe.Pointer(pMin)).FanEq anLt = (*StatSample)(unsafe.Pointer(pMin)).FanLt anDLt = (*StatSample)(unsafe.Pointer(pMin)).FanDLt sampleClear(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, pMin) libc.Xmemmove(tls, pMin, pMin+1*48, uint64(unsafe.Sizeof(StatSample{}))*uint64((*StatAccum)(unsafe.Pointer(p)).FnSample-(*StatAccum)(unsafe.Pointer(p)).FiMin-1)) pSample = (*StatAccum)(unsafe.Pointer(p)).Fa + uintptr((*StatAccum)(unsafe.Pointer(p)).FnSample-1)*48 (*StatSample)(unsafe.Pointer(pSample)).FnRowid = U32(0) (*StatSample)(unsafe.Pointer(pSample)).FanEq = anEq (*StatSample)(unsafe.Pointer(pSample)).FanDLt = anDLt (*StatSample)(unsafe.Pointer(pSample)).FanLt = anLt (*StatAccum)(unsafe.Pointer(p)).FnSample = (*StatAccum)(unsafe.Pointer(p)).FmxSample - 1 __10: ; pSample = (*StatAccum)(unsafe.Pointer(p)).Fa + uintptr((*StatAccum)(unsafe.Pointer(p)).FnSample)*48 sampleCopy(tls, p, pSample, pNew) (*StatAccum)(unsafe.Pointer(p)).FnSample++ libc.Xmemset(tls, (*StatSample)(unsafe.Pointer(pSample)).FanEq, 0, uint64(unsafe.Sizeof(TRowcnt(0)))*uint64(nEqZero)) find_new_min: if !((*StatAccum)(unsafe.Pointer(p)).FnSample >= (*StatAccum)(unsafe.Pointer(p)).FmxSample) { goto __11 } iMin = -1 i = 0 __12: if !(i < (*StatAccum)(unsafe.Pointer(p)).FmxSample) { goto __14 } if !((*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa+uintptr(i)*48)).FisPSample != 0) { goto __15 } goto __13 __15: ; if !(iMin < 0 || sampleIsBetter(tls, p, (*StatAccum)(unsafe.Pointer(p)).Fa+uintptr(iMin)*48, (*StatAccum)(unsafe.Pointer(p)).Fa+uintptr(i)*48) != 0) { goto __16 } iMin = i __16: ; goto __13 __13: i++ goto __12 goto __14 __14: ; (*StatAccum)(unsafe.Pointer(p)).FiMin = iMin __11: } func samplePushPrevious(tls *libc.TLS, p uintptr, iChng int32) { var i int32 for i = (*StatAccum)(unsafe.Pointer(p)).FnCol - 2; i >= iChng; i-- { var pBest uintptr = (*StatAccum)(unsafe.Pointer(p)).FaBest + uintptr(i)*48 *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer(pBest)).FanEq + uintptr(i)*8)) = *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq + uintptr(i)*8)) if (*StatAccum)(unsafe.Pointer(p)).FnSample < (*StatAccum)(unsafe.Pointer(p)).FmxSample || sampleIsBetter(tls, p, pBest, (*StatAccum)(unsafe.Pointer(p)).Fa+uintptr((*StatAccum)(unsafe.Pointer(p)).FiMin)*48) != 0 { sampleInsert(tls, p, pBest, i) } } for i = (*StatAccum)(unsafe.Pointer(p)).FnSample - 1; i >= 0; i-- { var j int32 for j = (*StatAccum)(unsafe.Pointer(p)).FnMaxEqZero; j < (*StatAccum)(unsafe.Pointer(p)).FnCol; j++ { } } if iChng < (*StatAccum)(unsafe.Pointer(p)).FnMaxEqZero { for i = (*StatAccum)(unsafe.Pointer(p)).FnSample - 1; i >= 0; i-- { var j int32 for j = iChng; j < (*StatAccum)(unsafe.Pointer(p)).FnCol; j++ { if *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa+uintptr(i)*48)).FanEq + uintptr(j)*8)) == uint64(0) { *(*TRowcnt)(unsafe.Pointer((*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa+uintptr(i)*48)).FanEq + uintptr(j)*8)) = *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq + uintptr(j)*8)) } } } (*StatAccum)(unsafe.Pointer(p)).FnMaxEqZero = iChng } } func statPush(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var i int32 var p uintptr = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv))) var iChng int32 = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) _ = argc _ = context if (*StatAccum)(unsafe.Pointer(p)).FnRow == uint64(0) { for i = 0; i < (*StatAccum)(unsafe.Pointer(p)).FnCol; i++ { *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq + uintptr(i)*8)) = uint64(1) } } else { if (*StatAccum)(unsafe.Pointer(p)).FmxSample != 0 { samplePushPrevious(tls, p, iChng) } for i = 0; i < iChng; i++ { *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq + uintptr(i)*8))++ } for i = iChng; i < (*StatAccum)(unsafe.Pointer(p)).FnCol; i++ { *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanDLt + uintptr(i)*8))++ if (*StatAccum)(unsafe.Pointer(p)).FmxSample != 0 { *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanLt + uintptr(i)*8)) += *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq + uintptr(i)*8)) } *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanEq + uintptr(i)*8)) = uint64(1) } } (*StatAccum)(unsafe.Pointer(p)).FnRow++ if (*StatAccum)(unsafe.Pointer(p)).FmxSample != 0 { var nLt TRowcnt if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) == SQLITE_INTEGER { sampleSetRowidInt64(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, p+40, Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8)))) } else { sampleSetRowid(tls, (*StatAccum)(unsafe.Pointer(p)).Fdb, p+40, Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))), Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8)))) } (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FiHash = libc.AssignPtrUint32(p+100, (*StatAccum)(unsafe.Pointer(p)).FiPrn*U32(1103515245)+U32(12345)) nLt = *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanLt + uintptr((*StatAccum)(unsafe.Pointer(p)).FnCol-1)*8)) if nLt/(*StatAccum)(unsafe.Pointer(p)).FnPSample != (nLt+uint64(1))/(*StatAccum)(unsafe.Pointer(p)).FnPSample { (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FisPSample = U8(1) (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FiCol = 0 sampleInsert(tls, p, p+40, (*StatAccum)(unsafe.Pointer(p)).FnCol-1) (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FisPSample = U8(0) } for i = 0; i < (*StatAccum)(unsafe.Pointer(p)).FnCol-1; i++ { (*StatAccum)(unsafe.Pointer(p)).Fcurrent.FiCol = i if i >= iChng || sampleIsBetterPost(tls, p, p+40, (*StatAccum)(unsafe.Pointer(p)).FaBest+uintptr(i)*48) != 0 { sampleCopy(tls, p, (*StatAccum)(unsafe.Pointer(p)).FaBest+uintptr(i)*48, p+40) } } } else if (*StatAccum)(unsafe.Pointer(p)).FnLimit != 0 && (*StatAccum)(unsafe.Pointer(p)).FnRow > TRowcnt((*StatAccum)(unsafe.Pointer(p)).FnLimit)*TRowcnt(int32((*StatAccum)(unsafe.Pointer(p)).FnSkipAhead)+1) { (*StatAccum)(unsafe.Pointer(p)).FnSkipAhead++ Xsqlite3_result_int(tls, context, libc.Bool32(*(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanDLt)) > uint64(0))) } } var statPushFuncdef = FuncDef{ FnArg: int8(2 + IsStat4), FfuncFlags: U32(SQLITE_UTF8), FxSFunc: 0, FzName: ts + 12790} func statGet(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(88) defer tls.Free(88) var p uintptr = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv))) var eCall int32 = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if eCall == STAT_GET_STAT1 { var i int32 Xsqlite3StrAccumInit(tls, bp+24, uintptr(0), uintptr(0), 0, ((*StatAccum)(unsafe.Pointer(p)).FnKeyCol+1)*100) Xsqlite3_str_appendf(tls, bp+24, ts+12800, libc.VaList(bp, func() uint64 { if (*StatAccum)(unsafe.Pointer(p)).FnSkipAhead != 0 { return (*StatAccum)(unsafe.Pointer(p)).FnEst } return (*StatAccum)(unsafe.Pointer(p)).FnRow }())) for i = 0; i < (*StatAccum)(unsafe.Pointer(p)).FnKeyCol; i++ { var nDistinct U64 = *(*TRowcnt)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fcurrent.FanDLt + uintptr(i)*8)) + uint64(1) var iVal U64 = ((*StatAccum)(unsafe.Pointer(p)).FnRow + nDistinct - uint64(1)) / nDistinct if iVal == uint64(2) && (*StatAccum)(unsafe.Pointer(p)).FnRow*uint64(10) <= nDistinct*uint64(11) { iVal = uint64(1) } Xsqlite3_str_appendf(tls, bp+24, ts+12805, libc.VaList(bp+8, iVal)) } Xsqlite3ResultStrAccum(tls, context, bp+24) } else if eCall == STAT_GET_ROWID { if (*StatAccum)(unsafe.Pointer(p)).FiGet < 0 { samplePushPrevious(tls, p, 0) (*StatAccum)(unsafe.Pointer(p)).FiGet = 0 } if (*StatAccum)(unsafe.Pointer(p)).FiGet < (*StatAccum)(unsafe.Pointer(p)).FnSample { var pS uintptr = (*StatAccum)(unsafe.Pointer(p)).Fa + uintptr((*StatAccum)(unsafe.Pointer(p)).FiGet)*48 if (*StatSample)(unsafe.Pointer(pS)).FnRowid == U32(0) { Xsqlite3_result_int64(tls, context, *(*I64)(unsafe.Pointer(pS + 24))) } else { Xsqlite3_result_blob(tls, context, *(*uintptr)(unsafe.Pointer(pS + 24)), int32((*StatSample)(unsafe.Pointer(pS)).FnRowid), libc.UintptrFromInt32(-1)) } } } else { var aCnt uintptr = uintptr(0) var i int32 switch eCall { case STAT_GET_NEQ: aCnt = (*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa + uintptr((*StatAccum)(unsafe.Pointer(p)).FiGet)*48)).FanEq break fallthrough case STAT_GET_NLT: aCnt = (*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa + uintptr((*StatAccum)(unsafe.Pointer(p)).FiGet)*48)).FanLt break fallthrough default: { aCnt = (*StatSample)(unsafe.Pointer((*StatAccum)(unsafe.Pointer(p)).Fa + uintptr((*StatAccum)(unsafe.Pointer(p)).FiGet)*48)).FanDLt (*StatAccum)(unsafe.Pointer(p)).FiGet++ break } } Xsqlite3StrAccumInit(tls, bp+56, uintptr(0), uintptr(0), 0, (*StatAccum)(unsafe.Pointer(p)).FnCol*100) for i = 0; i < (*StatAccum)(unsafe.Pointer(p)).FnCol; i++ { Xsqlite3_str_appendf(tls, bp+56, ts+12811, libc.VaList(bp+16, *(*TRowcnt)(unsafe.Pointer(aCnt + uintptr(i)*8)))) } if (*Sqlite3_str)(unsafe.Pointer(bp+56)).FnChar != 0 { (*Sqlite3_str)(unsafe.Pointer(bp+56)).FnChar-- } Xsqlite3ResultStrAccum(tls, context, bp+56) } _ = argc } var statGetFuncdef = FuncDef{ FnArg: int8(1 + IsStat4), FfuncFlags: U32(SQLITE_UTF8), FxSFunc: 0, FzName: ts + 12817} func callStatGet(tls *libc.TLS, pParse uintptr, regStat int32, iParam int32, regOut int32) { Xsqlite3VdbeAddOp2(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, OP_Integer, iParam, regStat+1) Xsqlite3VdbeAddFunctionCall(tls, pParse, 0, regStat, regOut, 1+IsStat4, uintptr(unsafe.Pointer(&statGetFuncdef)), 0) } func analyzeOneTable(tls *libc.TLS, pParse uintptr, pTab uintptr, pOnlyIdx uintptr, iStatCur int32, iMem int32, iTab int32) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pIdx uintptr var iIdxCur int32 var iTabCur int32 var v uintptr var i int32 var jZeroRows int32 = -1 var iDb int32 var needTableCnt U8 = U8(1) var regNewRowid int32 = libc.PostIncInt32(&iMem, 1) var regStat int32 = libc.PostIncInt32(&iMem, 1) var regChng int32 = libc.PostIncInt32(&iMem, 1) var regRowid int32 = libc.PostIncInt32(&iMem, 1) var regTemp int32 = libc.PostIncInt32(&iMem, 1) var regTemp2 int32 = libc.PostIncInt32(&iMem, 1) var regTabname int32 = libc.PostIncInt32(&iMem, 1) var regIdxname int32 = libc.PostIncInt32(&iMem, 1) var regStat1 int32 = libc.PostIncInt32(&iMem, 1) var regPrev int32 = iMem var pStat1 uintptr = uintptr(0) (*Parse)(unsafe.Pointer(pParse)).FnMem = func() int32 { if (*Parse)(unsafe.Pointer(pParse)).FnMem > iMem { return (*Parse)(unsafe.Pointer(pParse)).FnMem } return iMem }() v = Xsqlite3GetVdbe(tls, pParse) if v == uintptr(0) || pTab == uintptr(0) { return } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM) { return } if Xsqlite3_strlike(tls, ts+12826, (*Table)(unsafe.Pointer(pTab)).FzName, uint32('\\')) == 0 { return } iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) if Xsqlite3AuthCheck(tls, pParse, SQLITE_ANALYZE, (*Table)(unsafe.Pointer(pTab)).FzName, uintptr(0), (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) != 0 { return } if (*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback != 0 { pStat1 = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Table{}))+uint64(13)) if pStat1 == uintptr(0) { return } (*Table)(unsafe.Pointer(pStat1)).FzName = pStat1 + 1*104 libc.Xmemcpy(tls, (*Table)(unsafe.Pointer(pStat1)).FzName, ts+12700, uint64(13)) (*Table)(unsafe.Pointer(pStat1)).FnCol = int16(3) (*Table)(unsafe.Pointer(pStat1)).FiPKey = int16(-1) Xsqlite3VdbeAddOp4(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, OP_Noop, 0, 0, 0, pStat1, -6) } Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pTab)).FzName) iTabCur = libc.PostIncInt32(&iTab, 1) iIdxCur = libc.PostIncInt32(&iTab, 1) (*Parse)(unsafe.Pointer(pParse)).FnTab = func() int32 { if (*Parse)(unsafe.Pointer(pParse)).FnTab > iTab { return (*Parse)(unsafe.Pointer(pParse)).FnTab } return iTab }() Xsqlite3OpenTable(tls, pParse, iTabCur, iDb, pTab, OP_OpenRead) Xsqlite3VdbeLoadString(tls, v, regTabname, (*Table)(unsafe.Pointer(pTab)).FzName) for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { var nCol int32 var addrRewind int32 var addrNextRow int32 var zIdxName uintptr var nColTest int32 if pOnlyIdx != 0 && pOnlyIdx != pIdx { continue } if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere == uintptr(0) { needTableCnt = U8(0) } if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) && int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { nCol = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) zIdxName = (*Table)(unsafe.Pointer(pTab)).FzName nColTest = nCol - 1 } else { nCol = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) zIdxName = (*Index)(unsafe.Pointer(pIdx)).FzName if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x8>>3)) != 0 { nColTest = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) - 1 } else { nColTest = nCol - 1 } } Xsqlite3VdbeLoadString(tls, v, regIdxname, zIdxName) (*Parse)(unsafe.Pointer(pParse)).FnMem = func() int32 { if (*Parse)(unsafe.Pointer(pParse)).FnMem > regPrev+nColTest { return (*Parse)(unsafe.Pointer(pParse)).FnMem } return regPrev + nColTest }() Xsqlite3VdbeAddOp3(tls, v, OP_OpenRead, iIdxCur, int32((*Index)(unsafe.Pointer(pIdx)).Ftnum), iDb) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pIdx) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, nCol, regStat+1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol), regRowid) if (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_Stat4) == U32(0) { Xsqlite3VdbeAddOp2(tls, v, OP_Count, iIdxCur, regTemp) addrRewind = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, iIdxCur) } else { addrRewind = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, iIdxCur) Xsqlite3VdbeAddOp3(tls, v, OP_Count, iIdxCur, regTemp, 1) } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, (*Sqlite3)(unsafe.Pointer(db)).FnAnalysisLimit, regTemp2) Xsqlite3VdbeAddFunctionCall(tls, pParse, 0, regStat+1, regStat, 4, uintptr(unsafe.Pointer(&statInitFuncdef)), 0) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regChng) addrNextRow = Xsqlite3VdbeCurrentAddr(tls, v) if nColTest > 0 { var endDistinctTest int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var aGotoChng uintptr aGotoChng = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(int32(0)))*uint64(nColTest)) if aGotoChng == uintptr(0) { continue } Xsqlite3VdbeAddOp0(tls, v, OP_Goto) addrNextRow = Xsqlite3VdbeCurrentAddr(tls, v) if nColTest == 1 && int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) == 1 && int32((*Index)(unsafe.Pointer(pIdx)).FonError) != OE_None { Xsqlite3VdbeAddOp2(tls, v, OP_NotNull, regPrev, endDistinctTest) } for i = 0; i < nColTest; i++ { var pColl uintptr = Xsqlite3LocateCollSeq(tls, pParse, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(i)*8))) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, i, regChng) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iIdxCur, i, regTemp) *(*int32)(unsafe.Pointer(aGotoChng + uintptr(i)*4)) = Xsqlite3VdbeAddOp4(tls, v, OP_Ne, regTemp, 0, regPrev+i, pColl, -2) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NULLEQ)) } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, nColTest, regChng) Xsqlite3VdbeGoto(tls, v, endDistinctTest) Xsqlite3VdbeJumpHere(tls, v, addrNextRow-1) for i = 0; i < nColTest; i++ { Xsqlite3VdbeJumpHere(tls, v, *(*int32)(unsafe.Pointer(aGotoChng + uintptr(i)*4))) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iIdxCur, i, regPrev+i) } Xsqlite3VdbeResolveLabel(tls, v, endDistinctTest) Xsqlite3DbFree(tls, db, aGotoChng) } if (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_Stat4) == U32(0) { if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { Xsqlite3VdbeAddOp2(tls, v, OP_IdxRowid, iIdxCur, regRowid) } else { var pPk uintptr = Xsqlite3PrimaryKeyIndex(tls, (*Index)(unsafe.Pointer(pIdx)).FpTable) var j int32 var k int32 var regKey int32 regKey = Xsqlite3GetTempRange(tls, pParse, int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) for j = 0; j < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol); j++ { k = int32(Xsqlite3TableColumnToIndex(tls, pIdx, *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(j)*2)))) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iIdxCur, k, regKey+j) } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regKey, int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol), regRowid) Xsqlite3ReleaseTempRange(tls, pParse, regKey, int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) } } { Xsqlite3VdbeAddFunctionCall(tls, pParse, 1, regStat, regTemp, 2+IsStat4, uintptr(unsafe.Pointer(&statPushFuncdef)), 0) if (*Sqlite3)(unsafe.Pointer(db)).FnAnalysisLimit != 0 { var j1 int32 var j2 int32 var j3 int32 j1 = Xsqlite3VdbeAddOp1(tls, v, OP_IsNull, regTemp) j2 = Xsqlite3VdbeAddOp1(tls, v, OP_If, regTemp) j3 = Xsqlite3VdbeAddOp4Int(tls, v, OP_SeekGT, iIdxCur, 0, regPrev, 1) Xsqlite3VdbeJumpHere(tls, v, j1) Xsqlite3VdbeAddOp2(tls, v, OP_Next, iIdxCur, addrNextRow) Xsqlite3VdbeJumpHere(tls, v, j2) Xsqlite3VdbeJumpHere(tls, v, j3) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Next, iIdxCur, addrNextRow) } } callStatGet(tls, pParse, regStat, STAT_GET_STAT1, regStat1) Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, regTabname, 3, regTemp, ts+12836, 0) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, iStatCur, regNewRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iStatCur, regTemp, regNewRowid) Xsqlite3VdbeChangeP4(tls, v, -1, pStat1, -5) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_APPEND)) if (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_Stat4) == U32(0) && (*Sqlite3)(unsafe.Pointer(db)).FnAnalysisLimit == 0 { var regEq int32 = regStat1 var regLt int32 = regStat1 + 1 var regDLt int32 = regStat1 + 2 var regSample int32 = regStat1 + 3 var regCol int32 = regStat1 + 4 var regSampleRowid int32 = regCol + nCol var addrNext int32 var addrIsNull int32 var seekOp U8 if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { seekOp = uint8(OP_NotExists) } else { seekOp = uint8(OP_NotFound) } (*Parse)(unsafe.Pointer(pParse)).FnMem = func() int32 { if (*Parse)(unsafe.Pointer(pParse)).FnMem > regCol+nCol { return (*Parse)(unsafe.Pointer(pParse)).FnMem } return regCol + nCol }() addrNext = Xsqlite3VdbeCurrentAddr(tls, v) callStatGet(tls, pParse, regStat, STAT_GET_ROWID, regSampleRowid) addrIsNull = Xsqlite3VdbeAddOp1(tls, v, OP_IsNull, regSampleRowid) callStatGet(tls, pParse, regStat, STAT_GET_NEQ, regEq) callStatGet(tls, pParse, regStat, STAT_GET_NLT, regLt) callStatGet(tls, pParse, regStat, STAT_GET_NDLT, regDLt) Xsqlite3VdbeAddOp4Int(tls, v, int32(seekOp), iTabCur, addrNext, regSampleRowid, 0) for i = 0; i < nCol; i++ { Xsqlite3ExprCodeLoadIndexColumn(tls, pParse, pIdx, iTabCur, i, regCol+i) } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regCol, nCol, regSample) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regTabname, 6, regTemp) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, iStatCur+1, regNewRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iStatCur+1, regTemp, regNewRowid) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 1, addrNext) Xsqlite3VdbeJumpHere(tls, v, addrIsNull) } Xsqlite3VdbeJumpHere(tls, v, addrRewind) } if pOnlyIdx == uintptr(0) && needTableCnt != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Count, iTabCur, regStat1) jZeroRows = Xsqlite3VdbeAddOp1(tls, v, OP_IfNot, regStat1) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regIdxname) Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, regTabname, 3, regTemp, ts+12836, 0) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, iStatCur, regNewRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iStatCur, regTemp, regNewRowid) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_APPEND)) Xsqlite3VdbeChangeP4(tls, v, -1, pStat1, -5) Xsqlite3VdbeJumpHere(tls, v, jZeroRows) } } func loadAnalysis(tls *libc.TLS, pParse uintptr, iDb int32) { var v uintptr = Xsqlite3GetVdbe(tls, pParse) if v != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_LoadAnalysis, iDb) } } func analyzeDatabase(tls *libc.TLS, pParse uintptr, iDb int32) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pSchema uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema var k uintptr var iStatCur int32 var iMem int32 var iTab int32 Xsqlite3BeginWriteOperation(tls, pParse, 0, iDb) iStatCur = (*Parse)(unsafe.Pointer(pParse)).FnTab *(*int32)(unsafe.Pointer(pParse + 52)) += 3 openStatTable(tls, pParse, iDb, iStatCur, uintptr(0), uintptr(0)) iMem = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 iTab = (*Parse)(unsafe.Pointer(pParse)).FnTab for k = (*Hash)(unsafe.Pointer(pSchema + 8)).Ffirst; k != 0; k = (*HashElem)(unsafe.Pointer(k)).Fnext { var pTab uintptr = (*HashElem)(unsafe.Pointer(k)).Fdata analyzeOneTable(tls, pParse, pTab, uintptr(0), iStatCur, iMem, iTab) } loadAnalysis(tls, pParse, iDb) } func analyzeTable(tls *libc.TLS, pParse uintptr, pTab uintptr, pOnlyIdx uintptr) { var iDb int32 var iStatCur int32 iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Table)(unsafe.Pointer(pTab)).FpSchema) Xsqlite3BeginWriteOperation(tls, pParse, 0, iDb) iStatCur = (*Parse)(unsafe.Pointer(pParse)).FnTab *(*int32)(unsafe.Pointer(pParse + 52)) += 3 if pOnlyIdx != 0 { openStatTable(tls, pParse, iDb, iStatCur, (*Index)(unsafe.Pointer(pOnlyIdx)).FzName, ts+12840) } else { openStatTable(tls, pParse, iDb, iStatCur, (*Table)(unsafe.Pointer(pTab)).FzName, ts+12844) } analyzeOneTable(tls, pParse, pTab, pOnlyIdx, iStatCur, (*Parse)(unsafe.Pointer(pParse)).FnMem+1, (*Parse)(unsafe.Pointer(pParse)).FnTab) loadAnalysis(tls, pParse, iDb) } // Generate code for the ANALYZE command. The parser calls this routine // when it recognizes an ANALYZE command. // // ANALYZE -- 1 // ANALYZE -- 2 // ANALYZE ?.? -- 3 // // Form 1 causes all indices in all attached databases to be analyzed. // Form 2 analyzes all indices the single database named. // Form 3 analyzes all indices associated with the named table. func Xsqlite3Analyze(tls *libc.TLS, pParse uintptr, pName1 uintptr, pName2 uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var iDb int32 var i int32 var z uintptr var zDb uintptr var pTab uintptr var pIdx uintptr var v uintptr if SQLITE_OK != Xsqlite3ReadSchema(tls, pParse) { return } if pName1 == uintptr(0) { for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { if i == 1 { continue } analyzeDatabase(tls, pParse, i) } } else if (*Token)(unsafe.Pointer(pName2)).Fn == uint32(0) && libc.AssignInt32(&iDb, Xsqlite3FindDb(tls, db, pName1)) >= 0 { analyzeDatabase(tls, pParse, iDb) } else { iDb = Xsqlite3TwoPartName(tls, pParse, pName1, pName2, bp) if iDb >= 0 { if (*Token)(unsafe.Pointer(pName2)).Fn != 0 { zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName } else { zDb = uintptr(0) } z = Xsqlite3NameFromToken(tls, db, *(*uintptr)(unsafe.Pointer(bp))) if z != 0 { if libc.AssignUintptr(&pIdx, Xsqlite3FindIndex(tls, db, z, zDb)) != uintptr(0) { analyzeTable(tls, pParse, (*Index)(unsafe.Pointer(pIdx)).FpTable, pIdx) } else if libc.AssignUintptr(&pTab, Xsqlite3LocateTable(tls, pParse, uint32(0), z, zDb)) != uintptr(0) { analyzeTable(tls, pParse, pTab, uintptr(0)) } Xsqlite3DbFree(tls, db, z) } } } if int32((*Sqlite3)(unsafe.Pointer(db)).FnSqlExec) == 0 && libc.AssignUintptr(&v, Xsqlite3GetVdbe(tls, pParse)) != uintptr(0) { Xsqlite3VdbeAddOp0(tls, v, OP_Expire) } } type analysisInfo = struct { Fdb uintptr FzDatabase uintptr } // Used to pass information from the analyzer reader through to the // callback routine. type AnalysisInfo = analysisInfo func decodeIntArray(tls *libc.TLS, zIntArray uintptr, nOut int32, aOut uintptr, aLog uintptr, pIndex uintptr) { var z uintptr = zIntArray var c int32 var i int32 var v TRowcnt if z == uintptr(0) { z = ts + 1544 } for i = 0; *(*int8)(unsafe.Pointer(z)) != 0 && i < nOut; i++ { v = uint64(0) for libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(z)))) >= '0' && c <= '9' { v = v*uint64(10) + TRowcnt(c) - uint64('0') z++ } if aOut != 0 { *(*TRowcnt)(unsafe.Pointer(aOut + uintptr(i)*8)) = v } if aLog != 0 { *(*LogEst)(unsafe.Pointer(aLog + uintptr(i)*2)) = Xsqlite3LogEst(tls, v) } if int32(*(*int8)(unsafe.Pointer(z))) == ' ' { z++ } } if pIndex != 0 { libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(0), 2, 0x4) libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(0), 6, 0x40) for *(*int8)(unsafe.Pointer(z)) != 0 { if Xsqlite3_strglob(tls, ts+12848, z) == 0 { libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(1), 2, 0x4) } else if Xsqlite3_strglob(tls, ts+12859, z) == 0 { var sz int32 = Xsqlite3Atoi(tls, z+uintptr(3)) if sz < 2 { sz = 2 } (*Index)(unsafe.Pointer(pIndex)).FszIdxRow = Xsqlite3LogEst(tls, uint64(sz)) } else if Xsqlite3_strglob(tls, ts+12869, z) == 0 { libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(1), 6, 0x40) } for int32(*(*int8)(unsafe.Pointer(z))) != 0 && int32(*(*int8)(unsafe.Pointer(z))) != ' ' { z++ } for int32(*(*int8)(unsafe.Pointer(z))) == ' ' { z++ } } } } func analysisLoader(tls *libc.TLS, pData uintptr, argc int32, argv uintptr, NotUsed uintptr) int32 { bp := tls.Alloc(152) defer tls.Free(152) var pInfo uintptr = pData var pIndex uintptr var pTable uintptr var z uintptr _ = NotUsed _ = argc if argv == uintptr(0) || *(*uintptr)(unsafe.Pointer(argv)) == uintptr(0) || *(*uintptr)(unsafe.Pointer(argv + 2*8)) == uintptr(0) { return 0 } pTable = Xsqlite3FindTable(tls, (*AnalysisInfo)(unsafe.Pointer(pInfo)).Fdb, *(*uintptr)(unsafe.Pointer(argv)), (*AnalysisInfo)(unsafe.Pointer(pInfo)).FzDatabase) if pTable == uintptr(0) { return 0 } if *(*uintptr)(unsafe.Pointer(argv + 1*8)) == uintptr(0) { pIndex = uintptr(0) } else if Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(argv)), *(*uintptr)(unsafe.Pointer(argv + 1*8))) == 0 { pIndex = Xsqlite3PrimaryKeyIndex(tls, pTable) } else { pIndex = Xsqlite3FindIndex(tls, (*AnalysisInfo)(unsafe.Pointer(pInfo)).Fdb, *(*uintptr)(unsafe.Pointer(argv + 1*8)), (*AnalysisInfo)(unsafe.Pointer(pInfo)).FzDatabase) } z = *(*uintptr)(unsafe.Pointer(argv + 2*8)) if pIndex != 0 { var aiRowEst uintptr = uintptr(0) var nCol int32 = int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol) + 1 if (*Index)(unsafe.Pointer(pIndex)).FaiRowEst == uintptr(0) { (*Index)(unsafe.Pointer(pIndex)).FaiRowEst = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(TRowcnt(0)))*uint64(nCol)) if (*Index)(unsafe.Pointer(pIndex)).FaiRowEst == uintptr(0) { Xsqlite3OomFault(tls, (*AnalysisInfo)(unsafe.Pointer(pInfo)).Fdb) } } aiRowEst = (*Index)(unsafe.Pointer(pIndex)).FaiRowEst libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(0), 2, 0x4) decodeIntArray(tls, z, nCol, aiRowEst, (*Index)(unsafe.Pointer(pIndex)).FaiRowLogEst, pIndex) libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(1), 7, 0x80) if (*Index)(unsafe.Pointer(pIndex)).FpPartIdxWhere == uintptr(0) { (*Table)(unsafe.Pointer(pTable)).FnRowLogEst = *(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiRowLogEst)) *(*U32)(unsafe.Pointer(pTable + 48)) |= U32(TF_HasStat1) } } else { (*Index)(unsafe.Pointer(bp)).FszIdxRow = (*Table)(unsafe.Pointer(pTable)).FszTabRow decodeIntArray(tls, z, 1, uintptr(0), pTable+58, bp) (*Table)(unsafe.Pointer(pTable)).FszTabRow = (*Index)(unsafe.Pointer(bp)).FszIdxRow *(*U32)(unsafe.Pointer(pTable + 48)) |= U32(TF_HasStat1) } return 0 } // If the Index.aSample variable is not NULL, delete the aSample[] array // and its contents. func Xsqlite3DeleteIndexSamples(tls *libc.TLS, db uintptr, pIdx uintptr) { if (*Index)(unsafe.Pointer(pIdx)).FaSample != 0 { var j int32 for j = 0; j < (*Index)(unsafe.Pointer(pIdx)).FnSample; j++ { var p uintptr = (*Index)(unsafe.Pointer(pIdx)).FaSample + uintptr(j)*40 Xsqlite3DbFree(tls, db, (*IndexSample)(unsafe.Pointer(p)).Fp) } Xsqlite3DbFree(tls, db, (*Index)(unsafe.Pointer(pIdx)).FaSample) } if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { (*Index)(unsafe.Pointer(pIdx)).FnSample = 0 (*Index)(unsafe.Pointer(pIdx)).FaSample = uintptr(0) } } func initAvgEq(tls *libc.TLS, pIdx uintptr) { if pIdx != 0 { var aSample uintptr = (*Index)(unsafe.Pointer(pIdx)).FaSample var pFinal uintptr = aSample + uintptr((*Index)(unsafe.Pointer(pIdx)).FnSample-1)*40 var iCol int32 var nCol int32 = 1 if (*Index)(unsafe.Pointer(pIdx)).FnSampleCol > 1 { nCol = (*Index)(unsafe.Pointer(pIdx)).FnSampleCol - 1 *(*TRowcnt)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaAvgEq + uintptr(nCol)*8)) = uint64(1) } for iCol = 0; iCol < nCol; iCol++ { var nSample int32 = (*Index)(unsafe.Pointer(pIdx)).FnSample var i int32 var sumEq TRowcnt = uint64(0) var avgEq TRowcnt = uint64(0) var nRow TRowcnt var nSum100 I64 = int64(0) var nDist100 I64 if !(int32((*Index)(unsafe.Pointer(pIdx)).FaiRowEst) != 0) || iCol >= int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) || *(*TRowcnt)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiRowEst + uintptr(iCol+1)*8)) == uint64(0) { nRow = *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(pFinal)).FanLt + uintptr(iCol)*8)) nDist100 = I64(TRowcnt(int64(100)) * *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(pFinal)).FanDLt + uintptr(iCol)*8))) nSample-- } else { nRow = *(*TRowcnt)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiRowEst)) nDist100 = I64(TRowcnt(int64(100)) * *(*TRowcnt)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiRowEst)) / *(*TRowcnt)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiRowEst + uintptr(iCol+1)*8))) } (*Index)(unsafe.Pointer(pIdx)).FnRowEst0 = nRow for i = 0; i < nSample; i++ { if i == (*Index)(unsafe.Pointer(pIdx)).FnSample-1 || *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(i)*40)).FanDLt + uintptr(iCol)*8)) != *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(i+1)*40)).FanDLt + uintptr(iCol)*8)) { sumEq = sumEq + *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(i)*40)).FanEq + uintptr(iCol)*8)) nSum100 = nSum100 + int64(100) } } if nDist100 > nSum100 && sumEq < nRow { avgEq = TRowcnt(int64(100)) * (nRow - sumEq) / TRowcnt(nDist100-nSum100) } if avgEq == uint64(0) { avgEq = uint64(1) } *(*TRowcnt)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaAvgEq + uintptr(iCol)*8)) = avgEq } } } func findIndexOrPrimaryKey(tls *libc.TLS, db uintptr, zName uintptr, zDb uintptr) uintptr { var pIdx uintptr = Xsqlite3FindIndex(tls, db, zName, zDb) if pIdx == uintptr(0) { var pTab uintptr = Xsqlite3FindTable(tls, db, zName, zDb) if pTab != 0 && !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { pIdx = Xsqlite3PrimaryKeyIndex(tls, pTab) } } return pIdx } func loadStatTbl(tls *libc.TLS, db uintptr, zSql1 uintptr, zSql2 uintptr, zDb uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var zSql uintptr var pPrevIdx uintptr = uintptr(0) var pSample uintptr zSql = Xsqlite3MPrintf(tls, db, zSql1, libc.VaList(bp, zDb)) if !(zSql != 0) { return SQLITE_NOMEM } rc = Xsqlite3_prepare(tls, db, zSql, -1, bp+16, uintptr(0)) Xsqlite3DbFree(tls, db, zSql) if rc != 0 { return rc } for Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) == SQLITE_ROW { var nIdxCol int32 = 1 var zIndex uintptr var pIdx uintptr var nSample int32 var nByte int32 var i int32 var pSpace uintptr zIndex = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 0) if zIndex == uintptr(0) { continue } nSample = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 1) pIdx = findIndexOrPrimaryKey(tls, db, zIndex, zDb) if pIdx == uintptr(0) { continue } if !((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) && int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { nIdxCol = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) } else { nIdxCol = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) } (*Index)(unsafe.Pointer(pIdx)).FnSampleCol = nIdxCol nByte = int32(uint64(unsafe.Sizeof(IndexSample{})) * uint64(nSample)) nByte = int32(uint64(nByte) + uint64(unsafe.Sizeof(TRowcnt(0)))*uint64(nIdxCol)*uint64(3)*uint64(nSample)) nByte = int32(uint64(nByte) + uint64(nIdxCol)*uint64(unsafe.Sizeof(TRowcnt(0)))) (*Index)(unsafe.Pointer(pIdx)).FaSample = Xsqlite3DbMallocZero(tls, db, uint64(nByte)) if (*Index)(unsafe.Pointer(pIdx)).FaSample == uintptr(0) { Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) return SQLITE_NOMEM } pSpace = (*Index)(unsafe.Pointer(pIdx)).FaSample + uintptr(nSample)*40 (*Index)(unsafe.Pointer(pIdx)).FaAvgEq = pSpace pSpace += 8 * uintptr(nIdxCol) *(*U32)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable + 48)) |= U32(TF_HasStat4) for i = 0; i < nSample; i++ { (*IndexSample)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSample + uintptr(i)*40)).FanEq = pSpace pSpace += 8 * uintptr(nIdxCol) (*IndexSample)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSample + uintptr(i)*40)).FanLt = pSpace pSpace += 8 * uintptr(nIdxCol) (*IndexSample)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSample + uintptr(i)*40)).FanDLt = pSpace pSpace += 8 * uintptr(nIdxCol) } } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if rc != 0 { return rc } zSql = Xsqlite3MPrintf(tls, db, zSql2, libc.VaList(bp+8, zDb)) if !(zSql != 0) { return SQLITE_NOMEM } rc = Xsqlite3_prepare(tls, db, zSql, -1, bp+16, uintptr(0)) Xsqlite3DbFree(tls, db, zSql) if rc != 0 { return rc } for Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) == SQLITE_ROW { var zIndex uintptr var pIdx uintptr var nCol int32 = 1 zIndex = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 0) if zIndex == uintptr(0) { continue } pIdx = findIndexOrPrimaryKey(tls, db, zIndex, zDb) if pIdx == uintptr(0) { continue } nCol = (*Index)(unsafe.Pointer(pIdx)).FnSampleCol if pIdx != pPrevIdx { initAvgEq(tls, pPrevIdx) pPrevIdx = pIdx } pSample = (*Index)(unsafe.Pointer(pIdx)).FaSample + uintptr((*Index)(unsafe.Pointer(pIdx)).FnSample)*40 decodeIntArray(tls, Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 1), nCol, (*IndexSample)(unsafe.Pointer(pSample)).FanEq, uintptr(0), uintptr(0)) decodeIntArray(tls, Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 2), nCol, (*IndexSample)(unsafe.Pointer(pSample)).FanLt, uintptr(0), uintptr(0)) decodeIntArray(tls, Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 3), nCol, (*IndexSample)(unsafe.Pointer(pSample)).FanDLt, uintptr(0), uintptr(0)) (*IndexSample)(unsafe.Pointer(pSample)).Fn = Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 4) (*IndexSample)(unsafe.Pointer(pSample)).Fp = Xsqlite3DbMallocZero(tls, db, uint64((*IndexSample)(unsafe.Pointer(pSample)).Fn+2)) if (*IndexSample)(unsafe.Pointer(pSample)).Fp == uintptr(0) { Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) return SQLITE_NOMEM } if (*IndexSample)(unsafe.Pointer(pSample)).Fn != 0 { libc.Xmemcpy(tls, (*IndexSample)(unsafe.Pointer(pSample)).Fp, Xsqlite3_column_blob(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 4), uint64((*IndexSample)(unsafe.Pointer(pSample)).Fn)) } (*Index)(unsafe.Pointer(pIdx)).FnSample++ } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if rc == SQLITE_OK { initAvgEq(tls, pPrevIdx) } return rc } func loadStat4(tls *libc.TLS, db uintptr, zDb uintptr) int32 { var rc int32 = SQLITE_OK var pStat4 uintptr if libc.AssignUintptr(&pStat4, Xsqlite3FindTable(tls, db, ts+12726, zDb)) != uintptr(0) && int32((*Table)(unsafe.Pointer(pStat4)).FeTabType) == TABTYP_NORM { rc = loadStatTbl(tls, db, ts+12881, ts+12935, zDb) } return rc } // Load the content of the sqlite_stat1 and sqlite_stat4 tables. The // contents of sqlite_stat1 are used to populate the Index.aiRowEst[] // arrays. The contents of sqlite_stat4 are used to populate the // Index.aSample[] arrays. // // If the sqlite_stat1 table is not present in the database, SQLITE_ERROR // is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined // during compilation and the sqlite_stat4 table is present, no data is // read from it. // // If SQLITE_ENABLE_STAT4 was defined during compilation and the // sqlite_stat4 table is not present in the database, SQLITE_ERROR is // returned. However, in this case, data is read from the sqlite_stat1 // table (if it is present) before returning. // // If an OOM error occurs, this function always sets db->mallocFailed. // This means if the caller does not care about other errors, the return // code may be ignored. func Xsqlite3AnalysisLoad(tls *libc.TLS, db uintptr, iDb int32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var i uintptr var zSql uintptr var rc int32 = SQLITE_OK var pSchema uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema var pStat1 uintptr for i = (*Hash)(unsafe.Pointer(pSchema + 8)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pTab uintptr = (*HashElem)(unsafe.Pointer(i)).Fdata *(*U32)(unsafe.Pointer(pTab + 48)) &= libc.Uint32FromInt32(libc.CplInt32(TF_HasStat1)) } for i = (*Hash)(unsafe.Pointer(pSchema + 32)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pIdx uintptr = (*HashElem)(unsafe.Pointer(i)).Fdata libc.SetBitFieldPtr16Uint32(pIdx+100, uint32(0), 7, 0x80) Xsqlite3DeleteIndexSamples(tls, db, pIdx) (*Index)(unsafe.Pointer(pIdx)).FaSample = uintptr(0) } (*AnalysisInfo)(unsafe.Pointer(bp + 8)).Fdb = db (*AnalysisInfo)(unsafe.Pointer(bp + 8)).FzDatabase = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName if libc.AssignUintptr(&pStat1, Xsqlite3FindTable(tls, db, ts+12700, (*AnalysisInfo)(unsafe.Pointer(bp+8)).FzDatabase)) != 0 && int32((*Table)(unsafe.Pointer(pStat1)).FeTabType) == TABTYP_NORM { zSql = Xsqlite3MPrintf(tls, db, ts+12987, libc.VaList(bp, (*AnalysisInfo)(unsafe.Pointer(bp+8)).FzDatabase)) if zSql == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_exec(tls, db, zSql, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 }{analysisLoader})), bp+8, uintptr(0)) Xsqlite3DbFree(tls, db, zSql) } } for i = (*Hash)(unsafe.Pointer(pSchema + 32)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pIdx uintptr = (*HashElem)(unsafe.Pointer(i)).Fdata if !(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x80>>7) != 0) { Xsqlite3DefaultRowEst(tls, pIdx) } } if rc == SQLITE_OK { (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) rc = loadStat4(tls, db, (*AnalysisInfo)(unsafe.Pointer(bp+8)).FzDatabase) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable-- (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = func() uint16 { if (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable != 0 { return uint16(0) } return (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue }() } for i = (*Hash)(unsafe.Pointer(pSchema + 32)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pIdx uintptr = (*HashElem)(unsafe.Pointer(i)).Fdata Xsqlite3_free(tls, (*Index)(unsafe.Pointer(pIdx)).FaiRowEst) (*Index)(unsafe.Pointer(pIdx)).FaiRowEst = uintptr(0) } if rc == SQLITE_NOMEM { Xsqlite3OomFault(tls, db) } return rc } func resolveAttachExpr(tls *libc.TLS, pName uintptr, pExpr uintptr) int32 { var rc int32 = SQLITE_OK if pExpr != 0 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_ID { rc = Xsqlite3ResolveExprNames(tls, pName, pExpr) } else { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_STRING) } } return rc } // Return true if zName points to a name that may be used to refer to // database iDb attached to handle db. func Xsqlite3DbIsNamed(tls *libc.TLS, db uintptr, iDb int32, zName uintptr) int32 { return libc.Bool32(Xsqlite3StrICmp(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, zName) == 0 || iDb == 0 && Xsqlite3StrICmp(tls, ts+7793, zName) == 0) } func attachFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { bp := tls.Alloc(72) defer tls.Free(72) var i int32 var rc int32 var db uintptr var zName uintptr var zFile uintptr var aNew uintptr var pNew uintptr var pNewSchema uintptr var pPager uintptr var iDb int32 rc = 0 db = Xsqlite3_context_db_handle(tls, context) *(*uintptr)(unsafe.Pointer(bp + 48)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) pNew = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) _ = NotUsed zFile = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) zName = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if !(zFile == uintptr(0)) { goto __1 } zFile = ts + 1544 __1: ; if !(zName == uintptr(0)) { goto __2 } zName = ts + 1544 __2: ; if !(uint32(int32(*(*uint8)(unsafe.Pointer(db + 192 + 8))&0x4>>2)) != 0) { goto __3 } *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3_vfs_find(tls, ts+5187) if !(*(*uintptr)(unsafe.Pointer(bp + 40)) == uintptr(0)) { goto __5 } return __5: ; rc = Xsqlite3BtreeOpen(tls, *(*uintptr)(unsafe.Pointer(bp + 40)), ts+13028, db, bp+24, 0, SQLITE_OPEN_MAIN_DB) if !(rc == SQLITE_OK) { goto __6 } pNewSchema = Xsqlite3SchemaGet(tls, db, *(*uintptr)(unsafe.Pointer(bp + 24))) if !(pNewSchema != 0) { goto __7 } pNew = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb)*32 if !((*Db)(unsafe.Pointer(pNew)).FpBt != 0) { goto __9 } Xsqlite3BtreeClose(tls, (*Db)(unsafe.Pointer(pNew)).FpBt) __9: ; (*Db)(unsafe.Pointer(pNew)).FpBt = *(*uintptr)(unsafe.Pointer(bp + 24)) (*Db)(unsafe.Pointer(pNew)).FpSchema = pNewSchema goto __8 __7: Xsqlite3BtreeClose(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) rc = SQLITE_NOMEM __8: ; __6: ; if !(rc != 0) { goto __10 } goto attach_error __10: ; goto __4 __3: if !((*Sqlite3)(unsafe.Pointer(db)).FnDb >= *(*int32)(unsafe.Pointer(db + 136 + 7*4))+2) { goto __11 } *(*uintptr)(unsafe.Pointer(bp + 64)) = Xsqlite3MPrintf(tls, db, ts+13031, libc.VaList(bp, *(*int32)(unsafe.Pointer(db + 136 + 7*4)))) goto attach_error __11: ; i = 0 __12: if !(i < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __14 } if !(Xsqlite3DbIsNamed(tls, db, i, zName) != 0) { goto __15 } *(*uintptr)(unsafe.Pointer(bp + 64)) = Xsqlite3MPrintf(tls, db, ts+13068, libc.VaList(bp+8, zName)) goto attach_error __15: ; goto __13 __13: i++ goto __12 goto __14 __14: ; if !((*Sqlite3)(unsafe.Pointer(db)).FaDb == db+696) { goto __16 } aNew = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(Db{}))*uint64(3)) if !(aNew == uintptr(0)) { goto __18 } return __18: ; libc.Xmemcpy(tls, aNew, (*Sqlite3)(unsafe.Pointer(db)).FaDb, uint64(unsafe.Sizeof(Db{}))*uint64(2)) goto __17 __16: aNew = Xsqlite3DbRealloc(tls, db, (*Sqlite3)(unsafe.Pointer(db)).FaDb, uint64(unsafe.Sizeof(Db{}))*uint64((*Sqlite3)(unsafe.Pointer(db)).FnDb+1)) if !(aNew == uintptr(0)) { goto __19 } return __19: ; __17: ; (*Sqlite3)(unsafe.Pointer(db)).FaDb = aNew pNew = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*Sqlite3)(unsafe.Pointer(db)).FnDb)*32 libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Db{}))) *(*uint32)(unsafe.Pointer(bp + 32)) = (*Sqlite3)(unsafe.Pointer(db)).FopenFlags rc = Xsqlite3ParseUri(tls, (*Sqlite3_vfs)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FpVfs)).FzName, zFile, bp+32, bp+40, bp+48, bp+56) if !(rc != SQLITE_OK) { goto __20 } if !(rc == SQLITE_NOMEM) { goto __21 } Xsqlite3OomFault(tls, db) __21: ; Xsqlite3_result_error(tls, context, *(*uintptr)(unsafe.Pointer(bp + 56)), -1) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 56))) return __20: ; *(*uint32)(unsafe.Pointer(bp + 32)) |= uint32(SQLITE_OPEN_MAIN_DB) rc = Xsqlite3BtreeOpen(tls, *(*uintptr)(unsafe.Pointer(bp + 40)), *(*uintptr)(unsafe.Pointer(bp + 48)), db, pNew+8, 0, int32(*(*uint32)(unsafe.Pointer(bp + 32)))) (*Sqlite3)(unsafe.Pointer(db)).FnDb++ (*Db)(unsafe.Pointer(pNew)).FzDbSName = Xsqlite3DbStrDup(tls, db, zName) __4: ; (*Sqlite3)(unsafe.Pointer(db)).FnoSharedCache = U8(0) if !(rc == SQLITE_CONSTRAINT) { goto __22 } rc = SQLITE_ERROR *(*uintptr)(unsafe.Pointer(bp + 64)) = Xsqlite3MPrintf(tls, db, ts+13098, 0) goto __23 __22: if !(rc == SQLITE_OK) { goto __24 } (*Db)(unsafe.Pointer(pNew)).FpSchema = Xsqlite3SchemaGet(tls, db, (*Db)(unsafe.Pointer(pNew)).FpBt) if !!(int32((*Db)(unsafe.Pointer(pNew)).FpSchema) != 0) { goto __25 } rc = SQLITE_NOMEM goto __26 __25: if !((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pNew)).FpSchema)).Ffile_format != 0 && int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pNew)).FpSchema)).Fenc) != int32((*Sqlite3)(unsafe.Pointer(db)).Fenc)) { goto __27 } *(*uintptr)(unsafe.Pointer(bp + 64)) = Xsqlite3MPrintf(tls, db, ts+13127, 0) rc = SQLITE_ERROR __27: ; __26: ; Xsqlite3BtreeEnter(tls, (*Db)(unsafe.Pointer(pNew)).FpBt) pPager = Xsqlite3BtreePager(tls, (*Db)(unsafe.Pointer(pNew)).FpBt) Xsqlite3PagerLockingMode(tls, pPager, int32((*Sqlite3)(unsafe.Pointer(db)).FdfltLockMode)) Xsqlite3BtreeSecureDelete(tls, (*Db)(unsafe.Pointer(pNew)).FpBt, Xsqlite3BtreeSecureDelete(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpBt, -1)) Xsqlite3BtreeSetPagerFlags(tls, (*Db)(unsafe.Pointer(pNew)).FpBt, uint32(uint64(PAGER_SYNCHRONOUS_FULL)|(*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(PAGER_FLAGS_MASK))) Xsqlite3BtreeLeave(tls, (*Db)(unsafe.Pointer(pNew)).FpBt) __24: ; __23: ; (*Db)(unsafe.Pointer(pNew)).Fsafety_level = U8(SQLITE_DEFAULT_SYNCHRONOUS + 1) if !(rc == SQLITE_OK && (*Db)(unsafe.Pointer(pNew)).FzDbSName == uintptr(0)) { goto __28 } rc = SQLITE_NOMEM __28: ; Xsqlite3_free_filename(tls, *(*uintptr)(unsafe.Pointer(bp + 48))) if !(rc == SQLITE_OK) { goto __29 } Xsqlite3BtreeEnterAll(tls, db) (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(0) *(*U32)(unsafe.Pointer(db + 44)) &= libc.Uint32FromInt32(libc.CplInt32(DBFLAG_SchemaKnownOk)) if !!(int32(*(*uint8)(unsafe.Pointer(db + 192 + 8))&0x4>>2) != 0) { goto __30 } rc = Xsqlite3Init(tls, db, bp+64) __30: ; Xsqlite3BtreeLeaveAll(tls, db) __29: ; if !(rc != 0) { goto __31 } if !!(int32(*(*uint8)(unsafe.Pointer(db + 192 + 8))&0x4>>2) != 0) { goto __32 } iDb = (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1 if !((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpBt != 0) { goto __33 } Xsqlite3BtreeClose(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpBt) (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt = uintptr(0) (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema = uintptr(0) __33: ; Xsqlite3ResetAllSchemasOfConnection(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FnDb = iDb if !(rc == SQLITE_NOMEM || rc == SQLITE_IOERR|int32(12)<<8) { goto __34 } Xsqlite3OomFault(tls, db) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 64))) *(*uintptr)(unsafe.Pointer(bp + 64)) = Xsqlite3MPrintf(tls, db, ts+1480, 0) goto __35 __34: if !(*(*uintptr)(unsafe.Pointer(bp + 64)) == uintptr(0)) { goto __36 } *(*uintptr)(unsafe.Pointer(bp + 64)) = Xsqlite3MPrintf(tls, db, ts+13195, libc.VaList(bp+16, zFile)) __36: ; __35: ; __32: ; goto attach_error __31: ; return attach_error: if !(*(*uintptr)(unsafe.Pointer(bp + 64)) != 0) { goto __37 } Xsqlite3_result_error(tls, context, *(*uintptr)(unsafe.Pointer(bp + 64)), -1) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 64))) __37: ; if !(rc != 0) { goto __38 } Xsqlite3_result_error_code(tls, context, rc) __38: } func detachFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { bp := tls.Alloc(152) defer tls.Free(152) var zName uintptr var db uintptr var i int32 var pDb uintptr var pEntry uintptr var pTrig uintptr zName = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) db = Xsqlite3_context_db_handle(tls, context) pDb = uintptr(0) _ = NotUsed if !(zName == uintptr(0)) { goto __1 } zName = ts + 1544 __1: ; i = 0 __2: if !(i < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __4 } pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32 if !((*Db)(unsafe.Pointer(pDb)).FpBt == uintptr(0)) { goto __5 } goto __3 __5: ; if !(Xsqlite3DbIsNamed(tls, db, i, zName) != 0) { goto __6 } goto __4 __6: ; goto __3 __3: i++ goto __2 goto __4 __4: ; if !(i >= (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __7 } Xsqlite3_snprintf(tls, int32(unsafe.Sizeof([128]int8{})), bp+24, ts+13223, libc.VaList(bp, zName)) goto detach_error __7: ; if !(i < 2) { goto __8 } Xsqlite3_snprintf(tls, int32(unsafe.Sizeof([128]int8{})), bp+24, ts+13244, libc.VaList(bp+8, zName)) goto detach_error __8: ; if !(Xsqlite3BtreeTxnState(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) != SQLITE_TXN_NONE || Xsqlite3BtreeIsInBackup(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) != 0) { goto __9 } Xsqlite3_snprintf(tls, int32(unsafe.Sizeof([128]int8{})), bp+24, ts+13270, libc.VaList(bp+16, zName)) goto detach_error __9: ; pEntry = (*Hash)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema + 56)).Ffirst __10: if !(pEntry != 0) { goto __11 } pTrig = (*HashElem)(unsafe.Pointer(pEntry)).Fdata if !((*Trigger)(unsafe.Pointer(pTrig)).FpTabSchema == (*Db)(unsafe.Pointer(pDb)).FpSchema) { goto __12 } (*Trigger)(unsafe.Pointer(pTrig)).FpTabSchema = (*Trigger)(unsafe.Pointer(pTrig)).FpSchema __12: ; pEntry = (*HashElem)(unsafe.Pointer(pEntry)).Fnext goto __10 __11: ; Xsqlite3BtreeClose(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) (*Db)(unsafe.Pointer(pDb)).FpBt = uintptr(0) (*Db)(unsafe.Pointer(pDb)).FpSchema = uintptr(0) Xsqlite3CollapseDatabaseArray(tls, db) return detach_error: Xsqlite3_result_error(tls, context, bp+24, -1) } func codeAttach(tls *libc.TLS, pParse uintptr, type1 int32, pFunc uintptr, pAuthArg uintptr, pFilename uintptr, pDbname uintptr, pKey uintptr) { bp := tls.Alloc(56) defer tls.Free(56) var rc int32 var v uintptr var db uintptr var regArgs int32 var zAuthArg uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !(SQLITE_OK != Xsqlite3ReadSchema(tls, pParse)) { goto __1 } goto attach_end __1: ; if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __2 } goto attach_end __2: ; libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse if !(SQLITE_OK != resolveAttachExpr(tls, bp, pFilename) || SQLITE_OK != resolveAttachExpr(tls, bp, pDbname) || SQLITE_OK != resolveAttachExpr(tls, bp, pKey)) { goto __3 } goto attach_end __3: ; if !(pAuthArg != 0) { goto __4 } if !(int32((*Expr)(unsafe.Pointer(pAuthArg)).Fop) == TK_STRING) { goto __5 } zAuthArg = *(*uintptr)(unsafe.Pointer(pAuthArg + 8)) goto __6 __5: zAuthArg = uintptr(0) __6: ; rc = Xsqlite3AuthCheck(tls, pParse, type1, zAuthArg, uintptr(0), uintptr(0)) if !(rc != SQLITE_OK) { goto __7 } goto attach_end __7: ; __4: ; v = Xsqlite3GetVdbe(tls, pParse) regArgs = Xsqlite3GetTempRange(tls, pParse, 4) Xsqlite3ExprCode(tls, pParse, pFilename, regArgs) Xsqlite3ExprCode(tls, pParse, pDbname, regArgs+1) Xsqlite3ExprCode(tls, pParse, pKey, regArgs+2) if !(v != 0) { goto __8 } Xsqlite3VdbeAddFunctionCall(tls, pParse, 0, regArgs+3-int32((*FuncDef)(unsafe.Pointer(pFunc)).FnArg), regArgs+3, int32((*FuncDef)(unsafe.Pointer(pFunc)).FnArg), pFunc, 0) Xsqlite3VdbeAddOp1(tls, v, OP_Expire, libc.Bool32(type1 == SQLITE_ATTACH)) __8: ; attach_end: Xsqlite3ExprDelete(tls, db, pFilename) Xsqlite3ExprDelete(tls, db, pDbname) Xsqlite3ExprDelete(tls, db, pKey) } // Called by the parser to compile a DETACH statement. // // DETACH pDbname func Xsqlite3Detach(tls *libc.TLS, pParse uintptr, pDbname uintptr) { codeAttach(tls, pParse, SQLITE_DETACH, uintptr(unsafe.Pointer(&detach_func)), pDbname, uintptr(0), uintptr(0), pDbname) } var detach_func = FuncDef{ FnArg: int8(1), FfuncFlags: U32(SQLITE_UTF8), FxSFunc: 0, FzName: ts + 13292} // Called by the parser to compile an ATTACH statement. // // ATTACH p AS pDbname KEY pKey func Xsqlite3Attach(tls *libc.TLS, pParse uintptr, p uintptr, pDbname uintptr, pKey uintptr) { codeAttach(tls, pParse, SQLITE_ATTACH, uintptr(unsafe.Pointer(&attach_func)), p, p, pDbname, pKey) } var attach_func = FuncDef{ FnArg: int8(3), FfuncFlags: U32(SQLITE_UTF8), FxSFunc: 0, FzName: ts + 13306} func fixExprCb(tls *libc.TLS, p uintptr, pExpr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pFix uintptr = *(*uintptr)(unsafe.Pointer(p + 40)) if !(int32((*DbFixer)(unsafe.Pointer(pFix)).FbTemp) != 0) { *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_FromDDL) } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_VARIABLE { if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer((*DbFixer)(unsafe.Pointer(pFix)).FpParse)).Fdb)).Finit.Fbusy != 0 { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_NULL) } else { Xsqlite3ErrorMsg(tls, (*DbFixer)(unsafe.Pointer(pFix)).FpParse, ts+13320, libc.VaList(bp, (*DbFixer)(unsafe.Pointer(pFix)).FzType)) return WRC_Abort } } return WRC_Continue } func fixSelectCb(tls *libc.TLS, p uintptr, pSelect uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var pFix uintptr = *(*uintptr)(unsafe.Pointer(p + 40)) var i int32 var pItem uintptr var db uintptr = (*Parse)(unsafe.Pointer((*DbFixer)(unsafe.Pointer(pFix)).FpParse)).Fdb var iDb int32 = Xsqlite3FindDbName(tls, db, (*DbFixer)(unsafe.Pointer(pFix)).FzDb) var pList uintptr = (*Select)(unsafe.Pointer(pSelect)).FpSrc if pList == uintptr(0) { return WRC_Continue } i = 0 pItem = pList + 8 __1: if !(i < (*SrcList)(unsafe.Pointer(pList)).FnSrc) { goto __3 } { if int32((*DbFixer)(unsafe.Pointer(pFix)).FbTemp) == 0 { if (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase != 0 { if iDb != Xsqlite3FindDbName(tls, db, (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase) { Xsqlite3ErrorMsg(tls, (*DbFixer)(unsafe.Pointer(pFix)).FpParse, ts+13344, libc.VaList(bp, (*DbFixer)(unsafe.Pointer(pFix)).FzType, (*DbFixer)(unsafe.Pointer(pFix)).FpName, (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase)) return WRC_Abort } Xsqlite3DbFree(tls, db, (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase) (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase = uintptr(0) libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 9, 0x200) } (*SrcItem)(unsafe.Pointer(pItem)).FpSchema = (*DbFixer)(unsafe.Pointer(pFix)).FpSchema libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 7, 0x80) } if int32(*(*uint16)(unsafe.Pointer(pList + 8 + uintptr(i)*104 + 60 + 4))&0x400>>10) == 0 && Xsqlite3WalkExpr(tls, pFix+8, *(*uintptr)(unsafe.Pointer(pList + 8 + uintptr(i)*104 + 72))) != 0 { return WRC_Abort } } goto __2 __2: i++ pItem += 104 goto __1 goto __3 __3: ; if (*Select)(unsafe.Pointer(pSelect)).FpWith != 0 { for i = 0; i < (*With)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpWith)).FnCte; i++ { if Xsqlite3WalkSelect(tls, p, (*Cte)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpWith+16+uintptr(i)*48)).FpSelect) != 0 { return WRC_Abort } } } return WRC_Continue } // Initialize a DbFixer structure. This routine must be called prior // to passing the structure to one of the sqliteFixAAAA() routines below. func Xsqlite3FixInit(tls *libc.TLS, pFix uintptr, pParse uintptr, iDb int32, zType uintptr, pName uintptr) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb (*DbFixer)(unsafe.Pointer(pFix)).FpParse = pParse (*DbFixer)(unsafe.Pointer(pFix)).FzDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName (*DbFixer)(unsafe.Pointer(pFix)).FpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema (*DbFixer)(unsafe.Pointer(pFix)).FzType = zType (*DbFixer)(unsafe.Pointer(pFix)).FpName = pName (*DbFixer)(unsafe.Pointer(pFix)).FbTemp = U8(libc.Bool32(iDb == 1)) (*DbFixer)(unsafe.Pointer(pFix)).Fw.FpParse = pParse (*DbFixer)(unsafe.Pointer(pFix)).Fw.FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{fixExprCb})) (*DbFixer)(unsafe.Pointer(pFix)).Fw.FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{fixSelectCb})) (*DbFixer)(unsafe.Pointer(pFix)).Fw.FxSelectCallback2 = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3WalkWinDefnDummyCallback})) (*DbFixer)(unsafe.Pointer(pFix)).Fw.FwalkerDepth = 0 (*DbFixer)(unsafe.Pointer(pFix)).Fw.FeCode = U16(0) *(*uintptr)(unsafe.Pointer(pFix + 8 + 40)) = pFix } // The following set of routines walk through the parse tree and assign // a specific database to all table references where the database name // was left unspecified in the original SQL statement. The pFix structure // must have been initialized by a prior call to sqlite3FixInit(). // // These routines are used to make sure that an index, trigger, or // view in one database does not refer to objects in a different database. // (Exception: indices, triggers, and views in the TEMP database are // allowed to refer to anything.) If a reference is explicitly made // to an object in a different database, an error message is added to // pParse->zErrMsg and these routines return non-zero. If everything // checks out, these routines return 0. func Xsqlite3FixSrcList(tls *libc.TLS, pFix uintptr, pList uintptr) int32 { bp := tls.Alloc(128) defer tls.Free(128) var res int32 = 0 if pList != 0 { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Select{}))) (*Select)(unsafe.Pointer(bp)).FpSrc = pList res = Xsqlite3WalkSelect(tls, pFix+8, bp) } return res } func Xsqlite3FixSelect(tls *libc.TLS, pFix uintptr, pSelect uintptr) int32 { return Xsqlite3WalkSelect(tls, pFix+8, pSelect) } func Xsqlite3FixExpr(tls *libc.TLS, pFix uintptr, pExpr uintptr) int32 { return Xsqlite3WalkExpr(tls, pFix+8, pExpr) } func Xsqlite3FixTriggerStep(tls *libc.TLS, pFix uintptr, pStep uintptr) int32 { for pStep != 0 { if Xsqlite3WalkSelect(tls, pFix+8, (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect) != 0 || Xsqlite3WalkExpr(tls, pFix+8, (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere) != 0 || Xsqlite3WalkExprList(tls, pFix+8, (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList) != 0 || Xsqlite3FixSrcList(tls, pFix, (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom) != 0 { return 1 } { var pUp uintptr for pUp = (*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert; pUp != 0; pUp = (*Upsert)(unsafe.Pointer(pUp)).FpNextUpsert { if Xsqlite3WalkExprList(tls, pFix+8, (*Upsert)(unsafe.Pointer(pUp)).FpUpsertTarget) != 0 || Xsqlite3WalkExpr(tls, pFix+8, (*Upsert)(unsafe.Pointer(pUp)).FpUpsertTargetWhere) != 0 || Xsqlite3WalkExprList(tls, pFix+8, (*Upsert)(unsafe.Pointer(pUp)).FpUpsertSet) != 0 || Xsqlite3WalkExpr(tls, pFix+8, (*Upsert)(unsafe.Pointer(pUp)).FpUpsertWhere) != 0 { return 1 } } } pStep = (*TriggerStep)(unsafe.Pointer(pStep)).FpNext } return 0 } // Set or clear the access authorization function. // // The access authorization function is be called during the compilation // phase to verify that the user has read and/or write access permission on // various fields of the database. The first argument to the auth function // is a copy of the 3rd argument to this routine. The second argument // to the auth function is one of these constants: // // SQLITE_CREATE_INDEX // SQLITE_CREATE_TABLE // SQLITE_CREATE_TEMP_INDEX // SQLITE_CREATE_TEMP_TABLE // SQLITE_CREATE_TEMP_TRIGGER // SQLITE_CREATE_TEMP_VIEW // SQLITE_CREATE_TRIGGER // SQLITE_CREATE_VIEW // SQLITE_DELETE // SQLITE_DROP_INDEX // SQLITE_DROP_TABLE // SQLITE_DROP_TEMP_INDEX // SQLITE_DROP_TEMP_TABLE // SQLITE_DROP_TEMP_TRIGGER // SQLITE_DROP_TEMP_VIEW // SQLITE_DROP_TRIGGER // SQLITE_DROP_VIEW // SQLITE_INSERT // SQLITE_PRAGMA // SQLITE_READ // SQLITE_SELECT // SQLITE_TRANSACTION // SQLITE_UPDATE // // The third and fourth arguments to the auth function are the name of // the table and the column that are being accessed. The auth function // should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If // SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY // means that the SQL statement will never-run - the sqlite3_exec() call // will return with an error. SQLITE_IGNORE means that the SQL statement // should run but attempts to read the specified column will return NULL // and attempts to write the column will be ignored. // // Setting the auth function to NULL disables this hook. The default // setting of the auth function is NULL. func Xsqlite3_set_authorizer(tls *libc.TLS, db uintptr, xAuth uintptr, pArg uintptr) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth (*Sqlite3)(unsafe.Pointer(db)).FpAuthArg = pArg if (*Sqlite3)(unsafe.Pointer(db)).FxAuth != 0 { Xsqlite3ExpirePreparedStatements(tls, db, 1) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } func sqliteAuthBadReturnCode(tls *libc.TLS, pParse uintptr) { Xsqlite3ErrorMsg(tls, pParse, ts+13390, 0) (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_ERROR } // Invoke the authorization callback for permission to read column zCol from // table zTab in database zDb. This function assumes that an authorization // callback has been registered (i.e. that sqlite3.xAuth is not NULL). // // If SQLITE_IGNORE is returned and pExpr is not NULL, then pExpr is changed // to an SQL NULL expression. Otherwise, if pExpr is NULL, then SQLITE_IGNORE // is treated as SQLITE_DENY. In this case an error is left in pParse. func Xsqlite3AuthReadCol(tls *libc.TLS, pParse uintptr, zTab uintptr, zCol uintptr, iDb int32) int32 { bp := tls.Alloc(40) defer tls.Free(40) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var zDb uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName var rc int32 if (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 { return SQLITE_OK } rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxAuth})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpAuthArg, SQLITE_READ, zTab, zCol, zDb, (*Parse)(unsafe.Pointer(pParse)).FzAuthContext) if rc == SQLITE_DENY { var z uintptr = Xsqlite3_mprintf(tls, ts+13413, libc.VaList(bp, zTab, zCol)) if (*Sqlite3)(unsafe.Pointer(db)).FnDb > 2 || iDb != 0 { z = Xsqlite3_mprintf(tls, ts+13419, libc.VaList(bp+16, zDb, z)) } Xsqlite3ErrorMsg(tls, pParse, ts+13425, libc.VaList(bp+32, z)) (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_AUTH } else if rc != SQLITE_IGNORE && rc != SQLITE_OK { sqliteAuthBadReturnCode(tls, pParse) } return rc } // The pExpr should be a TK_COLUMN expression. The table referred to // is in pTabList or else it is the NEW or OLD table of a trigger. // Check to see if it is OK to read this particular column. // // If the auth function returns SQLITE_IGNORE, change the TK_COLUMN // instruction into a TK_NULL. If the auth function returns SQLITE_DENY, // then generate an error. func Xsqlite3AuthRead(tls *libc.TLS, pParse uintptr, pExpr uintptr, pSchema uintptr, pTabList uintptr) { var pTab uintptr = uintptr(0) var zCol uintptr var iSrc int32 var iDb int32 var iCol int32 iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pSchema) if iDb < 0 { return } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_TRIGGER { pTab = (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab } else { for iSrc = 0; iSrc < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc; iSrc++ { if (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*SrcItem)(unsafe.Pointer(pTabList+8+uintptr(iSrc)*104)).FiCursor { pTab = (*SrcItem)(unsafe.Pointer(pTabList + 8 + uintptr(iSrc)*104)).FpTab break } } } iCol = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) if pTab == uintptr(0) { return } if iCol >= 0 { zCol = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24)).FzCnName } else if int32((*Table)(unsafe.Pointer(pTab)).FiPKey) >= 0 { zCol = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr((*Table)(unsafe.Pointer(pTab)).FiPKey)*24)).FzCnName } else { zCol = ts + 9065 } if SQLITE_IGNORE == Xsqlite3AuthReadCol(tls, pParse, (*Table)(unsafe.Pointer(pTab)).FzName, zCol, iDb) { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_NULL) } } // Do an authorization check using the code and arguments given. Return // either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY // is returned, then the error count and error message in pParse are // modified appropriately. func Xsqlite3AuthCheck(tls *libc.TLS, pParse uintptr, code int32, zArg1 uintptr, zArg2 uintptr, zArg3 uintptr) int32 { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var rc int32 if (*Sqlite3)(unsafe.Pointer(db)).FxAuth == uintptr(0) || (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 || int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) != PARSE_MODE_NORMAL { return SQLITE_OK } rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxAuth})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpAuthArg, code, zArg1, zArg2, zArg3, (*Parse)(unsafe.Pointer(pParse)).FzAuthContext) if rc == SQLITE_DENY { Xsqlite3ErrorMsg(tls, pParse, ts+13452, 0) (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_AUTH } else if rc != SQLITE_OK && rc != SQLITE_IGNORE { rc = SQLITE_DENY sqliteAuthBadReturnCode(tls, pParse) } return rc } // Push an authorization context. After this routine is called, the // zArg3 argument to authorization callbacks will be zContext until // popped. Or if pParse==0, this routine is a no-op. func Xsqlite3AuthContextPush(tls *libc.TLS, pParse uintptr, pContext uintptr, zContext uintptr) { (*AuthContext)(unsafe.Pointer(pContext)).FpParse = pParse (*AuthContext)(unsafe.Pointer(pContext)).FzAuthContext = (*Parse)(unsafe.Pointer(pParse)).FzAuthContext (*Parse)(unsafe.Pointer(pParse)).FzAuthContext = zContext } // Pop an authorization context that was previously pushed // by sqlite3AuthContextPush func Xsqlite3AuthContextPop(tls *libc.TLS, pContext uintptr) { if (*AuthContext)(unsafe.Pointer(pContext)).FpParse != 0 { (*Parse)(unsafe.Pointer((*AuthContext)(unsafe.Pointer(pContext)).FpParse)).FzAuthContext = (*AuthContext)(unsafe.Pointer(pContext)).FzAuthContext (*AuthContext)(unsafe.Pointer(pContext)).FpParse = uintptr(0) } } func lockTable(tls *libc.TLS, pParse uintptr, iDb int32, iTab Pgno, isWriteLock U8, zName uintptr) { var pToplevel uintptr var i int32 var nBytes int32 var p uintptr pToplevel = func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }() for i = 0; i < (*Parse)(unsafe.Pointer(pToplevel)).FnTableLock; i++ { p = (*Parse)(unsafe.Pointer(pToplevel)).FaTableLock + uintptr(i)*24 if (*TableLock)(unsafe.Pointer(p)).FiDb == iDb && (*TableLock)(unsafe.Pointer(p)).FiTab == iTab { (*TableLock)(unsafe.Pointer(p)).FisWriteLock = U8(libc.Bool32((*TableLock)(unsafe.Pointer(p)).FisWriteLock != 0 || isWriteLock != 0)) return } } nBytes = int32(uint64(unsafe.Sizeof(TableLock{})) * uint64((*Parse)(unsafe.Pointer(pToplevel)).FnTableLock+1)) (*Parse)(unsafe.Pointer(pToplevel)).FaTableLock = Xsqlite3DbReallocOrFree(tls, (*Parse)(unsafe.Pointer(pToplevel)).Fdb, (*Parse)(unsafe.Pointer(pToplevel)).FaTableLock, uint64(nBytes)) if (*Parse)(unsafe.Pointer(pToplevel)).FaTableLock != 0 { p = (*Parse)(unsafe.Pointer(pToplevel)).FaTableLock + uintptr(libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pToplevel)).FnTableLock, 1))*24 (*TableLock)(unsafe.Pointer(p)).FiDb = iDb (*TableLock)(unsafe.Pointer(p)).FiTab = iTab (*TableLock)(unsafe.Pointer(p)).FisWriteLock = isWriteLock (*TableLock)(unsafe.Pointer(p)).FzLockName = zName } else { (*Parse)(unsafe.Pointer(pToplevel)).FnTableLock = 0 Xsqlite3OomFault(tls, (*Parse)(unsafe.Pointer(pToplevel)).Fdb) } } func Xsqlite3TableLock(tls *libc.TLS, pParse uintptr, iDb int32, iTab Pgno, isWriteLock U8, zName uintptr) { if iDb == 1 { return } if !(Xsqlite3BtreeSharable(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb+uintptr(iDb)*32)).FpBt) != 0) { return } lockTable(tls, pParse, iDb, iTab, isWriteLock, zName) } func codeTableLocks(tls *libc.TLS, pParse uintptr) { var i int32 var pVdbe uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe for i = 0; i < (*Parse)(unsafe.Pointer(pParse)).FnTableLock; i++ { var p uintptr = (*Parse)(unsafe.Pointer(pParse)).FaTableLock + uintptr(i)*24 var p1 int32 = (*TableLock)(unsafe.Pointer(p)).FiDb Xsqlite3VdbeAddOp4(tls, pVdbe, OP_TableLock, p1, int32((*TableLock)(unsafe.Pointer(p)).FiTab), int32((*TableLock)(unsafe.Pointer(p)).FisWriteLock), (*TableLock)(unsafe.Pointer(p)).FzLockName, -1) } } // This routine is called after a single SQL statement has been // parsed and a VDBE program to execute that statement has been // prepared. This routine puts the finishing touches on the // VDBE program and resets the pParse structure for the next // parse. // // Note that if an error occurred, it might be the case that // no VDBE code was generated. func Xsqlite3FinishCoding(tls *libc.TLS, pParse uintptr) { var db uintptr var v uintptr var iDb int32 var i int32 db = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Parse)(unsafe.Pointer(pParse)).Fnested != 0 { return } if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } return } v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if v == uintptr(0) { if (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_DONE return } v = Xsqlite3GetVdbe(tls, pParse) if v == uintptr(0) { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_ERROR } } if v != 0 { if (*Parse)(unsafe.Pointer(pParse)).FbReturning != 0 { var pReturning uintptr = *(*uintptr)(unsafe.Pointer(pParse + 200)) var addrRewind int32 var reg int32 if (*Returning)(unsafe.Pointer(pReturning)).FnRetCol != 0 { Xsqlite3VdbeAddOp0(tls, v, OP_FkCheck) addrRewind = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, (*Returning)(unsafe.Pointer(pReturning)).FiRetCur) reg = (*Returning)(unsafe.Pointer(pReturning)).FiRetReg for i = 0; i < (*Returning)(unsafe.Pointer(pReturning)).FnRetCol; i++ { Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*Returning)(unsafe.Pointer(pReturning)).FiRetCur, i, reg+i) } Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, reg, i) Xsqlite3VdbeAddOp2(tls, v, OP_Next, (*Returning)(unsafe.Pointer(pReturning)).FiRetCur, addrRewind+1) Xsqlite3VdbeJumpHere(tls, v, addrRewind) } } Xsqlite3VdbeAddOp0(tls, v, OP_Halt) Xsqlite3VdbeJumpHere(tls, v, 0) iDb = 0 for __ccgo := true; __ccgo; __ccgo = libc.PreIncInt32(&iDb, 1) < (*Sqlite3)(unsafe.Pointer(db)).FnDb { var pSchema uintptr if libc.Bool32((*Parse)(unsafe.Pointer(pParse)).FcookieMask&(YDbMask(1)<= (*Sqlite3)(unsafe.Pointer(db)).FnDb { if Xsqlite3StrICmp(tls, zDatabase, ts+7793) == 0 { i = 0 } else { return uintptr(0) } } p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema+8, zName) if p == uintptr(0) && Xsqlite3_strnicmp(tls, zName, ts+7733, 7) == 0 { if i == 1 { if Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7760+7) == 0 || Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7779+7) == 0 || Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7235+7) == 0 { p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema+8, ts+7741) } } else { if Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7779+7) == 0 { p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema+8, ts+7235) } } } } else { p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema+8, zName) if p != 0 { return p } p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema+8, zName) if p != 0 { return p } for i = 2; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema+8, zName) if p != 0 { break } } if p == uintptr(0) && Xsqlite3_strnicmp(tls, zName, ts+7733, 7) == 0 { if Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7779+7) == 0 { p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema+8, ts+7235) } else if Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7760+7) == 0 { p = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema+8, ts+7741) } } } return p } // Locate the in-memory structure that describes a particular database // table given the name of that table and (optionally) the name of the // database containing the table. Return NULL if not found. Also leave an // error message in pParse->zErrMsg. // // The difference between this routine and sqlite3FindTable() is that this // routine leaves an error message in pParse->zErrMsg where // sqlite3FindTable() does not. func Xsqlite3LocateTable(tls *libc.TLS, pParse uintptr, flags U32, zName uintptr, zDbase uintptr) uintptr { bp := tls.Alloc(40) defer tls.Free(40) var p uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_SchemaKnownOk) == U32(0) && SQLITE_OK != Xsqlite3ReadSchema(tls, pParse) { return uintptr(0) } p = Xsqlite3FindTable(tls, db, zName, zDbase) if p == uintptr(0) { if int32((*Parse)(unsafe.Pointer(pParse)).FprepFlags)&SQLITE_PREPARE_NO_VTAB == 0 && int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) == 0 { var pMod uintptr = Xsqlite3HashFind(tls, db+576, zName) if pMod == uintptr(0) && Xsqlite3_strnicmp(tls, zName, ts+13467, 7) == 0 { pMod = Xsqlite3PragmaVtabRegister(tls, db, zName) } if pMod != 0 && Xsqlite3VtabEponymousTableInit(tls, pParse, pMod) != 0 { return (*Module)(unsafe.Pointer(pMod)).FpEpoTab } } if flags&U32(LOCATE_NOERR) != 0 { return uintptr(0) } (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) } else if int32((*Table)(unsafe.Pointer(p)).FeTabType) == TABTYP_VTAB && int32((*Parse)(unsafe.Pointer(pParse)).FprepFlags)&SQLITE_PREPARE_NO_VTAB != 0 { p = uintptr(0) } if p == uintptr(0) { var zMsg uintptr if flags&U32(LOCATE_VIEW) != 0 { zMsg = ts + 13475 } else { zMsg = ts + 13488 } if zDbase != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+7997, libc.VaList(bp, zMsg, zDbase, zName)) } else { Xsqlite3ErrorMsg(tls, pParse, ts+8007, libc.VaList(bp+24, zMsg, zName)) } } else { } return p } // Locate the table identified by *p. // // This is a wrapper around sqlite3LocateTable(). The difference between // sqlite3LocateTable() and this function is that this function restricts // the search to schema (p->pSchema) if it is not NULL. p->pSchema may be // non-NULL if it is part of a view or trigger program definition. See // sqlite3FixSrcList() for details. func Xsqlite3LocateTableItem(tls *libc.TLS, pParse uintptr, flags U32, p uintptr) uintptr { var zDb uintptr if (*SrcItem)(unsafe.Pointer(p)).FpSchema != 0 { var iDb int32 = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*SrcItem)(unsafe.Pointer(p)).FpSchema) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb + uintptr(iDb)*32)).FzDbSName } else { zDb = (*SrcItem)(unsafe.Pointer(p)).FzDatabase } return Xsqlite3LocateTable(tls, pParse, flags, (*SrcItem)(unsafe.Pointer(p)).FzName, zDb) } // Return the preferred table name for system tables. Translate legacy // names into the new preferred names, as appropriate. func Xsqlite3PreferredTableName(tls *libc.TLS, zName uintptr) uintptr { if Xsqlite3_strnicmp(tls, zName, ts+7733, 7) == 0 { if Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7235+7) == 0 { return ts + 7779 } if Xsqlite3StrICmp(tls, zName+uintptr(7), ts+7741+7) == 0 { return ts + 7760 } } return zName } // Locate the in-memory structure that describes // a particular index given the name of that index // and the name of the database that contains the index. // Return NULL if not found. // // If zDatabase is 0, all databases are searched for the // table and the first matching index is returned. (No checking // for duplicate index names is done.) The search order is // TEMP first, then MAIN, then any auxiliary databases added // using the ATTACH command. func Xsqlite3FindIndex(tls *libc.TLS, db uintptr, zName uintptr, zDb uintptr) uintptr { var p uintptr = uintptr(0) var i int32 for i = OMIT_TEMPDB; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var j int32 if i < 2 { j = i ^ 1 } else { j = i } var pSchema uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(j)*32)).FpSchema if zDb != 0 && Xsqlite3DbIsNamed(tls, db, j, zDb) == 0 { continue } p = Xsqlite3HashFind(tls, pSchema+32, zName) if p != 0 { break } } return p } // Reclaim the memory used by an index func Xsqlite3FreeIndex(tls *libc.TLS, db uintptr, p uintptr) { Xsqlite3DeleteIndexSamples(tls, db, p) Xsqlite3ExprDelete(tls, db, (*Index)(unsafe.Pointer(p)).FpPartIdxWhere) Xsqlite3ExprListDelete(tls, db, (*Index)(unsafe.Pointer(p)).FaColExpr) Xsqlite3DbFree(tls, db, (*Index)(unsafe.Pointer(p)).FzColAff) if uint32(int32(*(*uint16)(unsafe.Pointer(p + 100))&0x10>>4)) != 0 { Xsqlite3DbFree(tls, db, (*Index)(unsafe.Pointer(p)).FazColl) } Xsqlite3_free(tls, (*Index)(unsafe.Pointer(p)).FaiRowEst) Xsqlite3DbFree(tls, db, p) } // For the index called zIdxName which is found in the database iDb, // unlike that index from its Table then remove the index from // the index hash table and free all memory structures associated // with the index. func Xsqlite3UnlinkAndDeleteIndex(tls *libc.TLS, db uintptr, iDb int32, zIdxName uintptr) { var pIndex uintptr var pHash uintptr pHash = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema + 32 pIndex = Xsqlite3HashInsert(tls, pHash, zIdxName, uintptr(0)) if pIndex != 0 { if (*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FpTable)).FpIndex == pIndex { (*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FpTable)).FpIndex = (*Index)(unsafe.Pointer(pIndex)).FpNext } else { var p uintptr p = (*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FpTable)).FpIndex for p != 0 && (*Index)(unsafe.Pointer(p)).FpNext != pIndex { p = (*Index)(unsafe.Pointer(p)).FpNext } if p != 0 && (*Index)(unsafe.Pointer(p)).FpNext == pIndex { (*Index)(unsafe.Pointer(p)).FpNext = (*Index)(unsafe.Pointer(pIndex)).FpNext } } Xsqlite3FreeIndex(tls, db, pIndex) } *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) } // Look through the list of open database files in db->aDb[] and if // any have been closed, remove them from the list. Reallocate the // db->aDb[] structure to a smaller size, if possible. // // Entry 0 (the "main" database) and entry 1 (the "temp" database) // are never candidates for being collapsed. func Xsqlite3CollapseDatabaseArray(tls *libc.TLS, db uintptr) { var i int32 var j int32 for i = libc.AssignInt32(&j, 2); i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pDb uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32 if (*Db1)(unsafe.Pointer(pDb)).FpBt == uintptr(0) { Xsqlite3DbFree(tls, db, (*Db1)(unsafe.Pointer(pDb)).FzDbSName) (*Db1)(unsafe.Pointer(pDb)).FzDbSName = uintptr(0) continue } if j < i { *(*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(j)*32)) = *(*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)) } j++ } (*Sqlite3)(unsafe.Pointer(db)).FnDb = j if (*Sqlite3)(unsafe.Pointer(db)).FnDb <= 2 && (*Sqlite3)(unsafe.Pointer(db)).FaDb != db+696 { libc.Xmemcpy(tls, db+696, (*Sqlite3)(unsafe.Pointer(db)).FaDb, uint64(2)*uint64(unsafe.Sizeof(Db{}))) Xsqlite3DbFree(tls, db, (*Sqlite3)(unsafe.Pointer(db)).FaDb) (*Sqlite3)(unsafe.Pointer(db)).FaDb = db + 696 } } // Reset the schema for the database at index iDb. Also reset the // TEMP schema. The reset is deferred if db->nSchemaLock is not zero. // Deferred resets may be run by calling with iDb<0. func Xsqlite3ResetOneSchema(tls *libc.TLS, db uintptr, iDb int32) { var i int32 if iDb >= 0 { *(*U16)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema + 114)) |= U16(DB_ResetWanted) *(*U16)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema + 114)) |= U16(DB_ResetWanted) *(*U32)(unsafe.Pointer(db + 44)) &= libc.Uint32FromInt32(libc.CplInt32(DBFLAG_SchemaKnownOk)) } if (*Sqlite3)(unsafe.Pointer(db)).FnSchemaLock == U32(0) { for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { if int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema)).FschemaFlags)&DB_ResetWanted == DB_ResetWanted { Xsqlite3SchemaClear(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema) } } } } // Erase all schema information from all attached databases (including // "main" and "temp") for a single database connection. func Xsqlite3ResetAllSchemasOfConnection(tls *libc.TLS, db uintptr) { var i int32 Xsqlite3BtreeEnterAll(tls, db) for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pDb uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32 if (*Db)(unsafe.Pointer(pDb)).FpSchema != 0 { if (*Sqlite3)(unsafe.Pointer(db)).FnSchemaLock == U32(0) { Xsqlite3SchemaClear(tls, (*Db)(unsafe.Pointer(pDb)).FpSchema) } else { *(*U16)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema + 114)) |= U16(DB_ResetWanted) } } } *(*U32)(unsafe.Pointer(db + 44)) &= libc.Uint32FromInt32(libc.CplInt32(DBFLAG_SchemaChange | DBFLAG_SchemaKnownOk)) Xsqlite3VtabUnlockList(tls, db) Xsqlite3BtreeLeaveAll(tls, db) if (*Sqlite3)(unsafe.Pointer(db)).FnSchemaLock == U32(0) { Xsqlite3CollapseDatabaseArray(tls, db) } } // This routine is called when a commit occurs. func Xsqlite3CommitInternalChanges(tls *libc.TLS, db uintptr) { *(*U32)(unsafe.Pointer(db + 44)) &= libc.Uint32FromInt32(libc.CplInt32(DBFLAG_SchemaChange)) } // Set the expression associated with a column. This is usually // the DEFAULT value, but might also be the expression that computes // the value for a generated column. func Xsqlite3ColumnSetExpr(tls *libc.TLS, pParse uintptr, pTab uintptr, pCol uintptr, pExpr uintptr) { var pList uintptr pList = *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) if int32((*Column)(unsafe.Pointer(pCol)).FiDflt) == 0 || pList == uintptr(0) || (*ExprList)(unsafe.Pointer(pList)).FnExpr < int32((*Column)(unsafe.Pointer(pCol)).FiDflt) { (*Column)(unsafe.Pointer(pCol)).FiDflt = func() uint16 { if pList == uintptr(0) { return uint16(1) } return uint16((*ExprList)(unsafe.Pointer(pList)).FnExpr + 1) }() *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) = Xsqlite3ExprListAppend(tls, pParse, pList, pExpr) } else { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(int32((*Column)(unsafe.Pointer(pCol)).FiDflt)-1)*32)).FpExpr) (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(int32((*Column)(unsafe.Pointer(pCol)).FiDflt)-1)*32)).FpExpr = pExpr } } // Return the expression associated with a column. The expression might be // the DEFAULT clause or the AS clause of a generated column. // Return NULL if the column has no associated expression. func Xsqlite3ColumnExpr(tls *libc.TLS, pTab uintptr, pCol uintptr) uintptr { if int32((*Column)(unsafe.Pointer(pCol)).FiDflt) == 0 { return uintptr(0) } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM) { return uintptr(0) } if *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) == uintptr(0) { return uintptr(0) } if (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 16)))).FnExpr < int32((*Column)(unsafe.Pointer(pCol)).FiDflt) { return uintptr(0) } return (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) + 8 + uintptr(int32((*Column)(unsafe.Pointer(pCol)).FiDflt)-1)*32)).FpExpr } // Set the collating sequence name for a column. func Xsqlite3ColumnSetColl(tls *libc.TLS, db uintptr, pCol uintptr, zColl uintptr) { var nColl I64 var n I64 var zNew uintptr n = I64(Xsqlite3Strlen30(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName) + 1) if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_HASTYPE != 0 { n = n + I64(Xsqlite3Strlen30(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName+uintptr(n))+1) } nColl = I64(Xsqlite3Strlen30(tls, zColl) + 1) zNew = Xsqlite3DbRealloc(tls, db, (*Column)(unsafe.Pointer(pCol)).FzCnName, uint64(nColl+n)) if zNew != 0 { (*Column)(unsafe.Pointer(pCol)).FzCnName = zNew libc.Xmemcpy(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName+uintptr(n), zColl, uint64(nColl)) *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_HASCOLL) } } // Return the collating squence name for a column func Xsqlite3ColumnColl(tls *libc.TLS, pCol uintptr) uintptr { var z uintptr if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_HASCOLL == 0 { return uintptr(0) } z = (*Column)(unsafe.Pointer(pCol)).FzCnName for *(*int8)(unsafe.Pointer(z)) != 0 { z++ } if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_HASTYPE != 0 { for __ccgo := true; __ccgo; __ccgo = *(*int8)(unsafe.Pointer(z)) != 0 { z++ } } return z + uintptr(1) } // Delete memory allocated for the column names of a table or view (the // Table.aCol[] array). func Xsqlite3DeleteColumnNames(tls *libc.TLS, db uintptr, pTable uintptr) { var i int32 var pCol uintptr if libc.AssignUintptr(&pCol, (*Table)(unsafe.Pointer(pTable)).FaCol) != uintptr(0) { i = 0 __1: if !(i < int32((*Table)(unsafe.Pointer(pTable)).FnCol)) { goto __3 } { Xsqlite3DbFree(tls, db, (*Column)(unsafe.Pointer(pCol)).FzCnName) } goto __2 __2: i++ pCol += 24 goto __1 goto __3 __3: ; Xsqlite3DbNNFreeNN(tls, db, (*Table)(unsafe.Pointer(pTable)).FaCol) if int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_NORM { Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(pTable + 64 + 16))) } if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { (*Table)(unsafe.Pointer(pTable)).FaCol = uintptr(0) (*Table)(unsafe.Pointer(pTable)).FnCol = int16(0) if int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_NORM { *(*uintptr)(unsafe.Pointer(pTable + 64 + 16)) = uintptr(0) } } } } func deleteTable(tls *libc.TLS, db uintptr, pTable uintptr) { var pIndex uintptr var pNext uintptr for pIndex = (*Table)(unsafe.Pointer(pTable)).FpIndex; pIndex != 0; pIndex = pNext { pNext = (*Index)(unsafe.Pointer(pIndex)).FpNext if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) && !(int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_VTAB) { var zName uintptr = (*Index)(unsafe.Pointer(pIndex)).FzName Xsqlite3HashInsert(tls, (*Index)(unsafe.Pointer(pIndex)).FpSchema+32, zName, uintptr(0)) } Xsqlite3FreeIndex(tls, db, pIndex) } if int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_NORM { Xsqlite3FkDelete(tls, db, pTable) } else if int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_VTAB { Xsqlite3VtabClear(tls, db, pTable) } else { Xsqlite3SelectDelete(tls, db, *(*uintptr)(unsafe.Pointer(pTable + 64))) } Xsqlite3DeleteColumnNames(tls, db, pTable) Xsqlite3DbFree(tls, db, (*Table)(unsafe.Pointer(pTable)).FzName) Xsqlite3DbFree(tls, db, (*Table)(unsafe.Pointer(pTable)).FzColAff) Xsqlite3ExprListDelete(tls, db, (*Table)(unsafe.Pointer(pTable)).FpCheck) Xsqlite3DbFree(tls, db, pTable) } func Xsqlite3DeleteTable(tls *libc.TLS, db uintptr, pTable uintptr) { if !(pTable != 0) { return } if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) && libc.PreDecUint32(&(*Table)(unsafe.Pointer(pTable)).FnTabRef, 1) > U32(0) { return } deleteTable(tls, db, pTable) } // Unlink the given table from the hash tables and the delete the // table structure with all its indices and foreign keys. func Xsqlite3UnlinkAndDeleteTable(tls *libc.TLS, db uintptr, iDb int32, zTabName uintptr) { var p uintptr var pDb uintptr pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 p = Xsqlite3HashInsert(tls, (*Db)(unsafe.Pointer(pDb)).FpSchema+8, zTabName, uintptr(0)) Xsqlite3DeleteTable(tls, db, p) *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) } // Given a token, return a string that consists of the text of that // token. Space to hold the returned string // is obtained from sqliteMalloc() and must be freed by the calling // function. // // Any quotation marks (ex: "name", 'name', [name], or `name`) that // surround the body of the token are removed. // // Tokens are often just pointers into the original SQL text and so // are not \000 terminated and are not persistent. The returned string // is \000 terminated and is persistent. func Xsqlite3NameFromToken(tls *libc.TLS, db uintptr, pName uintptr) uintptr { var zName uintptr if pName != 0 { zName = Xsqlite3DbStrNDup(tls, db, (*Token)(unsafe.Pointer(pName)).Fz, uint64((*Token)(unsafe.Pointer(pName)).Fn)) Xsqlite3Dequote(tls, zName) } else { zName = uintptr(0) } return zName } // Open the sqlite_schema table stored in database number iDb for // writing. The table is opened using cursor 0. func Xsqlite3OpenSchemaTable(tls *libc.TLS, p uintptr, iDb int32) { var v uintptr = Xsqlite3GetVdbe(tls, p) Xsqlite3TableLock(tls, p, iDb, uint32(SCHEMA_ROOT), uint8(1), ts+7235) Xsqlite3VdbeAddOp4Int(tls, v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5) if (*Parse)(unsafe.Pointer(p)).FnTab == 0 { (*Parse)(unsafe.Pointer(p)).FnTab = 1 } } // Parameter zName points to a nul-terminated buffer containing the name // of a database ("main", "temp" or the name of an attached db). This // function returns the index of the named database in db->aDb[], or // -1 if the named db cannot be found. func Xsqlite3FindDbName(tls *libc.TLS, db uintptr, zName uintptr) int32 { var i int32 = -1 if zName != 0 { var pDb uintptr i = (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1 pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32 __1: if !(i >= 0) { goto __3 } { if 0 == Xsqlite3_stricmp(tls, (*Db)(unsafe.Pointer(pDb)).FzDbSName, zName) { goto __3 } if i == 0 && 0 == Xsqlite3_stricmp(tls, ts+7793, zName) { goto __3 } } goto __2 __2: i-- pDb -= 32 goto __1 goto __3 __3: } return i } // The token *pName contains the name of a database (either "main" or // "temp" or the name of an attached db). This routine returns the // index of the named database in db->aDb[], or -1 if the named db // does not exist. func Xsqlite3FindDb(tls *libc.TLS, db uintptr, pName uintptr) int32 { var i int32 var zName uintptr zName = Xsqlite3NameFromToken(tls, db, pName) i = Xsqlite3FindDbName(tls, db, zName) Xsqlite3DbFree(tls, db, zName) return i } // The table or view or trigger name is passed to this routine via tokens // pName1 and pName2. If the table name was fully qualified, for example: // // CREATE TABLE xxx.yyy (...); // // Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if // the table name is not fully qualified, i.e.: // // CREATE TABLE yyy(...); // // Then pName1 is set to "yyy" and pName2 is "". // // This routine sets the *ppUnqual pointer to point at the token (pName1 or // pName2) that stores the unqualified table name. The index of the // database "xxx" is returned. func Xsqlite3TwoPartName(tls *libc.TLS, pParse uintptr, pName1 uintptr, pName2 uintptr, pUnqual uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var iDb int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Token)(unsafe.Pointer(pName2)).Fn > uint32(0) { if (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+13502, 0) return -1 } *(*uintptr)(unsafe.Pointer(pUnqual)) = pName2 iDb = Xsqlite3FindDb(tls, db, pName1) if iDb < 0 { Xsqlite3ErrorMsg(tls, pParse, ts+13519, libc.VaList(bp, pName1)) return -1 } } else { iDb = int32((*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb) *(*uintptr)(unsafe.Pointer(pUnqual)) = pName1 } return iDb } // True if PRAGMA writable_schema is ON func Xsqlite3WritableSchema(tls *libc.TLS, db uintptr) int32 { return libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_WriteSchema|SQLITE_Defensive) == uint64(SQLITE_WriteSchema)) } // This routine is used to check if the UTF-8 string zName is a legal // unqualified name for a new schema object (table, index, view or // trigger). All names are legal except those that begin with the string // "sqlite_" (in upper, lower or mixed case). This portion of the namespace // is reserved for internal use. // // When parsing the sqlite_schema table, this routine also checks to // make sure the "type", "name", and "tbl_name" columns are consistent // with the SQL. func Xsqlite3CheckObjectName(tls *libc.TLS, pParse uintptr, zName uintptr, zType uintptr, zTblName uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if Xsqlite3WritableSchema(tls, db) != 0 || uint32(int32(*(*uint8)(unsafe.Pointer(db + 192 + 8))&0x2>>1)) != 0 || !(int32(Xsqlite3Config.FbExtraSchemaChecks) != 0) { return SQLITE_OK } if (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 { if Xsqlite3_stricmp(tls, zType, *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).Finit.FazInit))) != 0 || Xsqlite3_stricmp(tls, zName, *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).Finit.FazInit + 1*8))) != 0 || Xsqlite3_stricmp(tls, zTblName, *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).Finit.FazInit + 2*8))) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+1544, 0) return SQLITE_ERROR } } else { if int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0 && 0 == Xsqlite3_strnicmp(tls, zName, ts+7733, 7) || Xsqlite3ReadOnlyShadowTables(tls, db) != 0 && Xsqlite3ShadowTableName(tls, db, zName) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+13539, libc.VaList(bp, zName)) return SQLITE_ERROR } } return SQLITE_OK } // Return the PRIMARY KEY index of a table func Xsqlite3PrimaryKeyIndex(tls *libc.TLS, pTab uintptr) uintptr { var p uintptr for p = (*Table)(unsafe.Pointer(pTab)).FpIndex; p != 0 && !(int32(*(*uint16)(unsafe.Pointer(p + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY); p = (*Index)(unsafe.Pointer(p)).FpNext { } return p } // Convert an table column number into a index column number. That is, // for the column iCol in the table (as defined by the CREATE TABLE statement) // find the (first) offset of that column in index pIdx. Or return -1 // if column iCol is not used in index pIdx. func Xsqlite3TableColumnToIndex(tls *libc.TLS, pIdx uintptr, iCol I16) I16 { var i int32 for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn); i++ { if int32(iCol) == int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) { return I16(i) } } return int16(-1) } // Convert a storage column number into a table column number. // // The storage column number (0,1,2,....) is the index of the value // as it appears in the record on disk. The true column number // is the index (0,1,2,...) of the column in the CREATE TABLE statement. // // The storage column number is less than the table column number if // and only there are VIRTUAL columns to the left. // // If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. func Xsqlite3StorageColumnToTable(tls *libc.TLS, pTab uintptr, iCol I16) I16 { if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasVirtual) != 0 { var i int32 for i = 0; i <= int32(iCol); i++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_VIRTUAL != 0 { iCol++ } } } return iCol } // Convert a table column number into a storage column number. // // The storage column number (0,1,2,....) is the index of the value // as it appears in the record on disk. Or, if the input column is // the N-th virtual column (zero-based) then the storage number is // the number of non-virtual columns in the table plus N. // // The true column number is the index (0,1,2,...) of the column in // the CREATE TABLE statement. // // If the input column is a VIRTUAL column, then it should not appear // in storage. But the value sometimes is cached in registers that // follow the range of registers used to construct storage. This // avoids computing the same VIRTUAL column multiple times, and provides // values for use by OP_Param opcodes in triggers. Hence, if the // input column is a VIRTUAL table, put it after all the other columns. // // In the following, N means "normal column", S means STORED, and // V means VIRTUAL. Suppose the CREATE TABLE has columns like this: // // CREATE TABLE ex(N,S,V,N,S,V,N,S,V); // -- 0 1 2 3 4 5 6 7 8 // // Then the mapping from this function is as follows: // // INPUTS: 0 1 2 3 4 5 6 7 8 // OUTPUTS: 0 1 6 2 3 7 4 5 8 // // So, in other words, this routine shifts all the virtual columns to // the end. // // If SQLITE_OMIT_GENERATED_COLUMNS then there are no virtual columns and // this routine is a no-op macro. If the pTab does not have any virtual // columns, then this routine is no-op that always return iCol. If iCol // is negative (indicating the ROWID column) then this routine return iCol. func Xsqlite3TableColumnToStorage(tls *libc.TLS, pTab uintptr, iCol I16) I16 { var i int32 var n I16 if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasVirtual) == U32(0) || int32(iCol) < 0 { return iCol } i = 0 n = int16(0) for ; i < int32(iCol); i++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0 { n++ } } if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_VIRTUAL != 0 { return I16(int32((*Table)(unsafe.Pointer(pTab)).FnNVCol) + i - int32(n)) } else { return n } return I16(0) } func sqlite3ForceNotReadOnly(tls *libc.TLS, pParse uintptr) { var iReg int32 = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) var v uintptr = Xsqlite3GetVdbe(tls, pParse) if v != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_JournalMode, 0, iReg, -1) Xsqlite3VdbeUsesBtree(tls, v, 0) } } // Begin constructing a new table representation in memory. This is // the first of several action routines that get called in response // to a CREATE TABLE statement. In particular, this routine is called // after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp // flag is true if the table should be stored in the auxiliary database // file instead of in the main database file. This is normally the case // when the "TEMP" or "TEMPORARY" keyword occurs in between // CREATE and TABLE. // // The new table record is initialized and put in pParse->pNewTable. // As more of the CREATE TABLE statement is parsed, additional action // routines will be called to add more information to this record. // At the end of the CREATE TABLE statement, the sqlite3EndTable() routine // is called to complete the construction of the new table record. func Xsqlite3StartTable(tls *libc.TLS, pParse uintptr, pName1 uintptr, pName2 uintptr, isTemp int32, isView int32, isVirtual int32, noErr int32) { bp := tls.Alloc(32) defer tls.Free(32) var pTable uintptr var zName uintptr var db uintptr var v uintptr var iDb int32 var zDb uintptr var zDb1 uintptr var addr1 int32 var fileFormat int32 var reg1 int32 var reg2 int32 var reg3 int32 zName = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 && (*Sqlite3)(unsafe.Pointer(db)).Finit.FnewTnum == Pgno(1)) { goto __1 } iDb = int32((*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb) zName = Xsqlite3DbStrDup(tls, db, func() uintptr { if !(0 != 0) && iDb == 1 { return ts + 7741 } return ts + 7235 }()) *(*uintptr)(unsafe.Pointer(bp + 24)) = pName1 goto __2 __1: iDb = Xsqlite3TwoPartName(tls, pParse, pName1, pName2, bp+24) if !(iDb < 0) { goto __3 } return __3: ; if !(!(0 != 0) && isTemp != 0 && (*Token)(unsafe.Pointer(pName2)).Fn > uint32(0) && iDb != 1) { goto __4 } Xsqlite3ErrorMsg(tls, pParse, ts+13581, 0) return __4: ; if !(!(0 != 0) && isTemp != 0) { goto __5 } iDb = 1 __5: ; zName = Xsqlite3NameFromToken(tls, db, *(*uintptr)(unsafe.Pointer(bp + 24))) if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __6 } Xsqlite3RenameTokenMap(tls, pParse, zName, *(*uintptr)(unsafe.Pointer(bp + 24))) __6: ; __2: ; (*Parse)(unsafe.Pointer(pParse)).FsNameToken = *(*Token)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))) if !(zName == uintptr(0)) { goto __7 } return __7: ; if !(Xsqlite3CheckObjectName(tls, pParse, zName, func() uintptr { if isView != 0 { return ts + 11843 } return ts + 10228 }(), zName) != 0) { goto __8 } goto begin_table_error __8: ; if !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb) == 1) { goto __9 } isTemp = 1 __9: ; zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_INSERT, func() uintptr { if !(0 != 0) && isTemp == 1 { return ts + 7741 } return ts + 7235 }(), uintptr(0), zDb) != 0) { goto __10 } goto begin_table_error __10: ; if !(!(isVirtual != 0) && Xsqlite3AuthCheck(tls, pParse, int32(aCode[isTemp+2*isView]), zName, uintptr(0), zDb) != 0) { goto __11 } goto begin_table_error __11: ; if !!(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) != PARSE_MODE_NORMAL) { goto __12 } zDb1 = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName if !(SQLITE_OK != Xsqlite3ReadSchema(tls, pParse)) { goto __13 } goto begin_table_error __13: ; pTable = Xsqlite3FindTable(tls, db, zName, zDb1) if !(pTable != 0) { goto __14 } if !!(noErr != 0) { goto __15 } Xsqlite3ErrorMsg(tls, pParse, ts+13622, libc.VaList(bp, func() uintptr { if int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_VIEW { return ts + 11843 } return ts + 10228 }(), *(*uintptr)(unsafe.Pointer(bp + 24)))) goto __16 __15: ; Xsqlite3CodeVerifySchema(tls, pParse, iDb) sqlite3ForceNotReadOnly(tls, pParse) __16: ; goto begin_table_error __14: ; if !(Xsqlite3FindIndex(tls, db, zName, zDb1) != uintptr(0)) { goto __17 } Xsqlite3ErrorMsg(tls, pParse, ts+13643, libc.VaList(bp+16, zName)) goto begin_table_error __17: ; __12: ; pTable = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Table{}))) if !(pTable == uintptr(0)) { goto __18 } (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM (*Parse)(unsafe.Pointer(pParse)).FnErr++ goto begin_table_error __18: ; (*Table)(unsafe.Pointer(pTable)).FzName = zName (*Table)(unsafe.Pointer(pTable)).FiPKey = int16(-1) (*Table)(unsafe.Pointer(pTable)).FpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema (*Table)(unsafe.Pointer(pTable)).FnTabRef = U32(1) (*Table)(unsafe.Pointer(pTable)).FnRowLogEst = int16(200) (*Parse)(unsafe.Pointer(pParse)).FpNewTable = pTable if !(!(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) && libc.AssignUintptr(&v, Xsqlite3GetVdbe(tls, pParse)) != uintptr(0)) { goto __19 } Xsqlite3BeginWriteOperation(tls, pParse, 1, iDb) if !(isVirtual != 0) { goto __20 } Xsqlite3VdbeAddOp0(tls, v, OP_VBegin) __20: ; reg1 = libc.AssignPtrInt32(pParse+128, libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1)) reg2 = libc.AssignPtrInt32(pParse+132, libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1)) reg3 = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp3(tls, v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT) Xsqlite3VdbeUsesBtree(tls, v, iDb) addr1 = Xsqlite3VdbeAddOp1(tls, v, OP_If, reg3) if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_LegacyFileFmt) != uint64(0) { fileFormat = 1 } else { fileFormat = SQLITE_MAX_FILE_FORMAT } Xsqlite3VdbeAddOp3(tls, v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, fileFormat) Xsqlite3VdbeAddOp3(tls, v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, int32((*Sqlite3)(unsafe.Pointer(db)).Fenc)) Xsqlite3VdbeJumpHere(tls, v, addr1) if !(isView != 0 || isVirtual != 0) { goto __21 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, reg2) goto __22 __21: ; *(*int32)(unsafe.Pointer(pParse + 200)) = Xsqlite3VdbeAddOp3(tls, v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY) __22: ; Xsqlite3OpenSchemaTable(tls, pParse, iDb) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, 0, reg1) Xsqlite3VdbeAddOp4(tls, v, OP_Blob, 6, reg3, 0, uintptr(unsafe.Pointer(&nullRow)), -1) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, 0, reg3, reg1) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_APPEND)) Xsqlite3VdbeAddOp0(tls, v, OP_Close) __19: ; return begin_table_error: (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) Xsqlite3DbFree(tls, db, zName) return } var aCode = [4]U8{ U8(SQLITE_CREATE_TABLE), U8(SQLITE_CREATE_TEMP_TABLE), U8(SQLITE_CREATE_VIEW), U8(SQLITE_CREATE_TEMP_VIEW), } var nullRow = [6]int8{int8(6), int8(0), int8(0), int8(0), int8(0), int8(0)} func sqlite3DeleteReturning(tls *libc.TLS, db uintptr, pRet uintptr) { var pHash uintptr pHash = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema + 56 Xsqlite3HashInsert(tls, pHash, ts+13678, uintptr(0)) Xsqlite3ExprListDelete(tls, db, (*Returning)(unsafe.Pointer(pRet)).FpReturnEL) Xsqlite3DbFree(tls, db, pRet) } // Add the RETURNING clause to the parse currently underway. // // This routine creates a special TEMP trigger that will fire for each row // of the DML statement. That TEMP trigger contains a single SELECT // statement with a result set that is the argument of the RETURNING clause. // The trigger has the Trigger.bReturning flag and an opcode of // TK_RETURNING instead of TK_SELECT, so that the trigger code generator // knows to handle it specially. The TEMP trigger is automatically // removed at the end of the parse. // // When this routine is called, we do not yet know if the RETURNING clause // is attached to a DELETE, INSERT, or UPDATE, so construct it as a // RETURNING trigger instead. It will then be converted into the appropriate // type on the first call to sqlite3TriggersExist(). func Xsqlite3AddReturning(tls *libc.TLS, pParse uintptr, pList uintptr) { var pRet uintptr var pHash uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+13695, 0) } else { } (*Parse)(unsafe.Pointer(pParse)).FbReturning = U8(1) pRet = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Returning{}))) if pRet == uintptr(0) { Xsqlite3ExprListDelete(tls, db, pList) return } *(*uintptr)(unsafe.Pointer(pParse + 200)) = pRet (*Returning)(unsafe.Pointer(pRet)).FpParse = pParse (*Returning)(unsafe.Pointer(pRet)).FpReturnEL = pList Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{sqlite3DeleteReturning})), pRet) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return } (*Returning)(unsafe.Pointer(pRet)).FretTrig.FzName = ts + 13678 (*Returning)(unsafe.Pointer(pRet)).FretTrig.Fop = U8(TK_RETURNING) (*Returning)(unsafe.Pointer(pRet)).FretTrig.Ftr_tm = U8(TRIGGER_AFTER) (*Returning)(unsafe.Pointer(pRet)).FretTrig.FbReturning = U8(1) (*Returning)(unsafe.Pointer(pRet)).FretTrig.FpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).FpSchema (*Returning)(unsafe.Pointer(pRet)).FretTrig.FpTabSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).FpSchema (*Returning)(unsafe.Pointer(pRet)).FretTrig.Fstep_list = pRet + 88 (*Returning)(unsafe.Pointer(pRet)).FretTStep.Fop = U8(TK_RETURNING) (*Returning)(unsafe.Pointer(pRet)).FretTStep.FpTrig = pRet + 16 (*Returning)(unsafe.Pointer(pRet)).FretTStep.FpExprList = pList pHash = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema + 56 if Xsqlite3HashInsert(tls, pHash, ts+13678, pRet+16) == pRet+16 { Xsqlite3OomFault(tls, db) } } // Add a new column to the table currently being constructed. // // The parser calls this routine once for each column declaration // in a CREATE TABLE statement. sqlite3StartTable() gets called // first to get things going. Then this routine is called for each // column. func Xsqlite3AddColumn(tls *libc.TLS, pParse uintptr, sName Token, sType Token) { bp := tls.Alloc(48) defer tls.Free(48) *(*Token)(unsafe.Pointer(bp + 16)) = sName *(*Token)(unsafe.Pointer(bp + 32)) = sType var p uintptr var i int32 var z uintptr var zType uintptr var pCol uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var hName U8 var aNew uintptr var eType U8 = U8(COLTYPE_CUSTOM) var szEst U8 = U8(1) var affinity int8 = int8(SQLITE_AFF_BLOB) if libc.AssignUintptr(&p, (*Parse)(unsafe.Pointer(pParse)).FpNewTable) == uintptr(0) { return } if int32((*Table)(unsafe.Pointer(p)).FnCol)+1 > *(*int32)(unsafe.Pointer(db + 136 + 2*4)) { Xsqlite3ErrorMsg(tls, pParse, ts+13729, libc.VaList(bp, (*Table)(unsafe.Pointer(p)).FzName)) return } if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { Xsqlite3DequoteToken(tls, bp+16) } if (*Token)(unsafe.Pointer(bp+32)).Fn >= uint32(16) && Xsqlite3_strnicmp(tls, (*Token)(unsafe.Pointer(bp+32)).Fz+uintptr((*Token)(unsafe.Pointer(bp+32)).Fn-uint32(6)), ts+13752, 6) == 0 { *(*uint32)(unsafe.Pointer(bp + 32 + 8)) -= uint32(6) for (*Token)(unsafe.Pointer(bp+32)).Fn > uint32(0) && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(bp+32)).Fz + uintptr((*Token)(unsafe.Pointer(bp+32)).Fn-uint32(1)))))])&0x01 != 0 { (*Token)(unsafe.Pointer(bp+32)).Fn-- } if (*Token)(unsafe.Pointer(bp+32)).Fn >= uint32(9) && Xsqlite3_strnicmp(tls, (*Token)(unsafe.Pointer(bp+32)).Fz+uintptr((*Token)(unsafe.Pointer(bp+32)).Fn-uint32(9)), ts+13759, 9) == 0 { *(*uint32)(unsafe.Pointer(bp + 32 + 8)) -= uint32(9) for (*Token)(unsafe.Pointer(bp+32)).Fn > uint32(0) && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(bp+32)).Fz + uintptr((*Token)(unsafe.Pointer(bp+32)).Fn-uint32(1)))))])&0x01 != 0 { (*Token)(unsafe.Pointer(bp+32)).Fn-- } } } if (*Token)(unsafe.Pointer(bp+32)).Fn >= uint32(3) { Xsqlite3DequoteToken(tls, bp+32) for i = 0; i < SQLITE_N_STDTYPE; i++ { if (*Token)(unsafe.Pointer(bp+32)).Fn == uint32(Xsqlite3StdTypeLen[i]) && Xsqlite3_strnicmp(tls, (*Token)(unsafe.Pointer(bp+32)).Fz, Xsqlite3StdType[i], int32((*Token)(unsafe.Pointer(bp+32)).Fn)) == 0 { (*Token)(unsafe.Pointer(bp + 32)).Fn = uint32(0) eType = U8(i + 1) affinity = Xsqlite3StdTypeAffinity[i] if int32(affinity) <= SQLITE_AFF_TEXT { szEst = U8(5) } break } } } z = Xsqlite3DbMallocRaw(tls, db, uint64(I64((*Token)(unsafe.Pointer(bp+16)).Fn)+int64(1)+I64((*Token)(unsafe.Pointer(bp+32)).Fn)+I64(libc.Bool32((*Token)(unsafe.Pointer(bp+32)).Fn > uint32(0))))) if z == uintptr(0) { return } if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameTokenMap(tls, pParse, z, bp+16) } libc.Xmemcpy(tls, z, (*Token)(unsafe.Pointer(bp+16)).Fz, uint64((*Token)(unsafe.Pointer(bp+16)).Fn)) *(*int8)(unsafe.Pointer(z + uintptr((*Token)(unsafe.Pointer(bp+16)).Fn))) = int8(0) Xsqlite3Dequote(tls, z) hName = Xsqlite3StrIHash(tls, z) for i = 0; i < int32((*Table)(unsafe.Pointer(p)).FnCol); i++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(p)).FaCol+uintptr(i)*24)).FhName) == int32(hName) && Xsqlite3StrICmp(tls, z, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(p)).FaCol+uintptr(i)*24)).FzCnName) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+13769, libc.VaList(bp+8, z)) Xsqlite3DbFree(tls, db, z) return } } aNew = Xsqlite3DbRealloc(tls, db, (*Table)(unsafe.Pointer(p)).FaCol, uint64(I64((*Table)(unsafe.Pointer(p)).FnCol)+int64(1))*uint64(unsafe.Sizeof(Column{}))) if aNew == uintptr(0) { Xsqlite3DbFree(tls, db, z) return } (*Table)(unsafe.Pointer(p)).FaCol = aNew pCol = (*Table)(unsafe.Pointer(p)).FaCol + uintptr((*Table)(unsafe.Pointer(p)).FnCol)*24 libc.Xmemset(tls, pCol, 0, uint64(unsafe.Sizeof(Column{}))) (*Column)(unsafe.Pointer(pCol)).FzCnName = z (*Column)(unsafe.Pointer(pCol)).FhName = hName if (*Token)(unsafe.Pointer(bp+32)).Fn == uint32(0) { (*Column)(unsafe.Pointer(pCol)).Faffinity = affinity libc.SetBitFieldPtr8Uint32(pCol+8, uint32(eType), 4, 0xf0) (*Column)(unsafe.Pointer(pCol)).FszEst = szEst } else { zType = z + uintptr(Xsqlite3Strlen30(tls, z)) + uintptr(1) libc.Xmemcpy(tls, zType, (*Token)(unsafe.Pointer(bp+32)).Fz, uint64((*Token)(unsafe.Pointer(bp+32)).Fn)) *(*int8)(unsafe.Pointer(zType + uintptr((*Token)(unsafe.Pointer(bp+32)).Fn))) = int8(0) Xsqlite3Dequote(tls, zType) (*Column)(unsafe.Pointer(pCol)).Faffinity = Xsqlite3AffinityType(tls, zType, pCol) *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_HASTYPE) } (*Table)(unsafe.Pointer(p)).FnCol++ (*Table)(unsafe.Pointer(p)).FnNVCol++ (*Parse)(unsafe.Pointer(pParse)).FconstraintName.Fn = uint32(0) } // This routine is called by the parser while in the middle of // parsing a CREATE TABLE statement. A "NOT NULL" constraint has // been seen on a column. This routine sets the notNull flag on // the column currently under construction. func Xsqlite3AddNotNull(tls *libc.TLS, pParse uintptr, onError int32) { var p uintptr var pCol uintptr p = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if p == uintptr(0) || int32((*Table)(unsafe.Pointer(p)).FnCol) < 1 { return } pCol = (*Table)(unsafe.Pointer(p)).FaCol + uintptr(int32((*Table)(unsafe.Pointer(p)).FnCol)-1)*24 libc.SetBitFieldPtr8Uint32(pCol+8, uint32(U8(onError)), 0, 0xf) *(*U32)(unsafe.Pointer(p + 48)) |= U32(TF_HasNotNull) if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_UNIQUE != 0 { var pIdx uintptr for pIdx = (*Table)(unsafe.Pointer(p)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn))) == int32((*Table)(unsafe.Pointer(p)).FnCol)-1 { libc.SetBitFieldPtr16Uint32(pIdx+100, uint32(1), 3, 0x8) } } } } // 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 Xsqlite3AffinityType(tls *libc.TLS, zIn uintptr, pCol uintptr) int8 { bp := tls.Alloc(4) defer tls.Free(4) var h U32 = U32(0) var aff int8 = int8(SQLITE_AFF_NUMERIC) var zChar uintptr = uintptr(0) for *(*int8)(unsafe.Pointer(zIn)) != 0 { h = h<<8 + U32(Xsqlite3UpperToLower[int32(*(*int8)(unsafe.Pointer(zIn)))&0xff]) zIn++ if h == U32(int32('c')<<24+int32('h')<<16+int32('a')<<8+'r') { aff = int8(SQLITE_AFF_TEXT) zChar = zIn } else if h == U32(int32('c')<<24+int32('l')<<16+int32('o')<<8+'b') { aff = int8(SQLITE_AFF_TEXT) } else if h == U32(int32('t')<<24+int32('e')<<16+int32('x')<<8+'t') { aff = int8(SQLITE_AFF_TEXT) } else if h == U32(int32('b')<<24+int32('l')<<16+int32('o')<<8+'b') && (int32(aff) == SQLITE_AFF_NUMERIC || int32(aff) == SQLITE_AFF_REAL) { aff = int8(SQLITE_AFF_BLOB) if int32(*(*int8)(unsafe.Pointer(zIn))) == '(' { zChar = zIn } } else if h == U32(int32('r')<<24+int32('e')<<16+int32('a')<<8+'l') && int32(aff) == SQLITE_AFF_NUMERIC { aff = int8(SQLITE_AFF_REAL) } else if h == U32(int32('f')<<24+int32('l')<<16+int32('o')<<8+'a') && int32(aff) == SQLITE_AFF_NUMERIC { aff = int8(SQLITE_AFF_REAL) } else if h == U32(int32('d')<<24+int32('o')<<16+int32('u')<<8+'b') && int32(aff) == SQLITE_AFF_NUMERIC { aff = int8(SQLITE_AFF_REAL) } else if h&U32(0x00FFFFFF) == U32(int32('i')<<16+int32('n')<<8+'t') { aff = int8(SQLITE_AFF_INTEGER) break } } if pCol != 0 { *(*int32)(unsafe.Pointer(bp)) = 0 if int32(aff) < SQLITE_AFF_NUMERIC { if zChar != 0 { for *(*int8)(unsafe.Pointer(zChar)) != 0 { if int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zChar)))])&0x04 != 0 { Xsqlite3GetInt32(tls, zChar, bp) break } zChar++ } } else { *(*int32)(unsafe.Pointer(bp)) = 16 } } *(*int32)(unsafe.Pointer(bp)) = *(*int32)(unsafe.Pointer(bp))/4 + 1 if *(*int32)(unsafe.Pointer(bp)) > 255 { *(*int32)(unsafe.Pointer(bp)) = 255 } (*Column)(unsafe.Pointer(pCol)).FszEst = U8(*(*int32)(unsafe.Pointer(bp))) } return aff } // The expression is the default value for the most recently added column // of the table currently under construction. // // Default value expressions must be constant. Raise an exception if this // is not the case. // // This routine is called by the parser while in the middle of // parsing a CREATE TABLE statement. func Xsqlite3AddDefaultValue(tls *libc.TLS, pParse uintptr, pExpr uintptr, zStart uintptr, zEnd uintptr) { bp := tls.Alloc(80) defer tls.Free(80) var p uintptr var pCol uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb p = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if p != uintptr(0) { var isInit int32 = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 && int32((*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb) != 1) pCol = (*Table)(unsafe.Pointer(p)).FaCol + uintptr(int32((*Table)(unsafe.Pointer(p)).FnCol)-1)*24 if !(Xsqlite3ExprIsConstantOrFunction(tls, pExpr, uint8(isInit)) != 0) { Xsqlite3ErrorMsg(tls, pParse, ts+13795, libc.VaList(bp, (*Column)(unsafe.Pointer(pCol)).FzCnName)) } else if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_GENERATED != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+13840, 0) } else { var pDfltExpr uintptr libc.Xmemset(tls, bp+8, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(bp + 8)).Fop = U8(TK_SPAN) *(*uintptr)(unsafe.Pointer(bp + 8 + 8)) = Xsqlite3DbSpanDup(tls, db, zStart, zEnd) (*Expr)(unsafe.Pointer(bp + 8)).FpLeft = pExpr (*Expr)(unsafe.Pointer(bp + 8)).Fflags = U32(EP_Skip) pDfltExpr = Xsqlite3ExprDup(tls, db, bp+8, EXPRDUP_REDUCE) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 8 + 8))) Xsqlite3ColumnSetExpr(tls, pParse, p, pCol, pDfltExpr) } } if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameExprUnmap(tls, pParse, pExpr) } Xsqlite3ExprDelete(tls, db, pExpr) } func sqlite3StringToId(tls *libc.TLS, p uintptr) { if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_STRING { (*Expr)(unsafe.Pointer(p)).Fop = U8(TK_ID) } else if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_COLLATE && int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(p)).FpLeft)).Fop) == TK_STRING { (*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(p)).FpLeft)).Fop = U8(TK_ID) } } func makeColumnPartOfPrimaryKey(tls *libc.TLS, pParse uintptr, pCol uintptr) { *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_PRIMKEY) if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_GENERATED != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+13881, 0) } } // Designate the PRIMARY KEY for the table. pList is a list of names // of columns that form the primary key. If pList is NULL, then the // most recently added column of the table is the primary key. // // A table can have at most one primary key. If the table already has // a primary key (and this is the second primary key) then create an // error. // // If the PRIMARY KEY is on a single column whose datatype is INTEGER, // then we will try to use that column as the rowid. Set the Table.iPKey // field of the table under construction to be the index of the // INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is // no INTEGER PRIMARY KEY. // // If the key is not an INTEGER PRIMARY KEY, then create a unique // index for the key. No index is created for INTEGER PRIMARY KEYs. func Xsqlite3AddPrimaryKey(tls *libc.TLS, pParse uintptr, pList uintptr, onError int32, autoInc int32, sortOrder int32) { bp := tls.Alloc(8) defer tls.Free(8) var pTab uintptr var pCol uintptr var iCol int32 var i int32 var nTerm int32 var zCName uintptr var pCExpr uintptr var pCExpr1 uintptr pTab = (*Parse)(unsafe.Pointer(pParse)).FpNewTable pCol = uintptr(0) iCol = -1 if !(pTab == uintptr(0)) { goto __1 } goto primary_key_exit __1: ; if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasPrimaryKey) != 0) { goto __2 } Xsqlite3ErrorMsg(tls, pParse, ts+13933, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) goto primary_key_exit __2: ; *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_HasPrimaryKey) if !(pList == uintptr(0)) { goto __3 } iCol = int32((*Table)(unsafe.Pointer(pTab)).FnCol) - 1 pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24 makeColumnPartOfPrimaryKey(tls, pParse, pCol) nTerm = 1 goto __4 __3: nTerm = (*ExprList)(unsafe.Pointer(pList)).FnExpr i = 0 __5: if !(i < nTerm) { goto __7 } pCExpr = Xsqlite3ExprSkipCollate(tls, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr) sqlite3StringToId(tls, pCExpr) if !(int32((*Expr)(unsafe.Pointer(pCExpr)).Fop) == TK_ID) { goto __8 } zCName = *(*uintptr)(unsafe.Pointer(pCExpr + 8)) iCol = 0 __9: if !(iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __11 } if !(Xsqlite3StrICmp(tls, zCName, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FzCnName) == 0) { goto __12 } pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24 makeColumnPartOfPrimaryKey(tls, pParse, pCol) goto __11 __12: ; goto __10 __10: iCol++ goto __9 goto __11 __11: ; __8: ; goto __6 __6: i++ goto __5 goto __7 __7: ; __4: ; if !(nTerm == 1 && pCol != 0 && int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf0>>4) == COLTYPE_INTEGER && sortOrder != SQLITE_SO_DESC) { goto __13 } if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && pList != 0) { goto __15 } pCExpr1 = Xsqlite3ExprSkipCollate(tls, (*ExprList_item)(unsafe.Pointer(pList+8)).FpExpr) Xsqlite3RenameTokenRemap(tls, pParse, pTab+52, pCExpr1) __15: ; (*Table)(unsafe.Pointer(pTab)).FiPKey = I16(iCol) (*Table)(unsafe.Pointer(pTab)).FkeyConf = U8(onError) *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(autoInc * TF_Autoincrement) if !(pList != 0) { goto __16 } (*Parse)(unsafe.Pointer(pParse)).FiPkSortOrder = (*ExprList_item)(unsafe.Pointer(pList + 8)).Ffg.FsortFlags __16: ; Xsqlite3HasExplicitNulls(tls, pParse, pList) goto __14 __13: if !(autoInc != 0) { goto __17 } Xsqlite3ErrorMsg(tls, pParse, ts+13974, 0) goto __18 __17: Xsqlite3CreateIndex(tls, pParse, uintptr(0), uintptr(0), uintptr(0), pList, onError, uintptr(0), uintptr(0), sortOrder, 0, uint8(SQLITE_IDXTYPE_PRIMARYKEY)) pList = uintptr(0) __18: ; __14: ; primary_key_exit: Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pList) return } // Add a new CHECK constraint to the table currently under construction. func Xsqlite3AddCheckConstraint(tls *libc.TLS, pParse uintptr, pCheckExpr uintptr, zStart uintptr, zEnd uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var pTab uintptr = (*Parse)(unsafe.Pointer(pParse)).FpNewTable var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if pTab != 0 && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) == PARSE_MODE_DECLARE_VTAB) && !(Xsqlite3BtreeIsReadonly(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr((*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb)*32)).FpBt) != 0) { (*Table)(unsafe.Pointer(pTab)).FpCheck = Xsqlite3ExprListAppend(tls, pParse, (*Table)(unsafe.Pointer(pTab)).FpCheck, pCheckExpr) if (*Parse)(unsafe.Pointer(pParse)).FconstraintName.Fn != 0 { Xsqlite3ExprListSetName(tls, pParse, (*Table)(unsafe.Pointer(pTab)).FpCheck, pParse+104, 1) } else { for zStart++; int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zStart)))])&0x01 != 0; zStart++ { } for int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zEnd + libc.UintptrFromInt32(-1))))])&0x01 != 0 { zEnd-- } (*Token)(unsafe.Pointer(bp)).Fz = zStart (*Token)(unsafe.Pointer(bp)).Fn = uint32(int32((int64(zEnd) - int64((*Token)(unsafe.Pointer(bp)).Fz)) / 1)) Xsqlite3ExprListSetName(tls, pParse, (*Table)(unsafe.Pointer(pTab)).FpCheck, bp, 1) } } else { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pCheckExpr) } } // Set the collation function of the most recently parsed table column // to the CollSeq given. func Xsqlite3AddCollateType(tls *libc.TLS, pParse uintptr, pToken uintptr) { var p uintptr var i int32 var zColl uintptr var db uintptr if libc.AssignUintptr(&p, (*Parse)(unsafe.Pointer(pParse)).FpNewTable) == uintptr(0) || int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { return } i = int32((*Table)(unsafe.Pointer(p)).FnCol) - 1 db = (*Parse)(unsafe.Pointer(pParse)).Fdb zColl = Xsqlite3NameFromToken(tls, db, pToken) if !(zColl != 0) { return } if Xsqlite3LocateCollSeq(tls, pParse, zColl) != 0 { var pIdx uintptr Xsqlite3ColumnSetColl(tls, db, (*Table)(unsafe.Pointer(p)).FaCol+uintptr(i)*24, zColl) for pIdx = (*Table)(unsafe.Pointer(p)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn))) == i { *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl)) = Xsqlite3ColumnColl(tls, (*Table)(unsafe.Pointer(p)).FaCol+uintptr(i)*24) } } } Xsqlite3DbFree(tls, db, zColl) } // Change the most recently parsed column to be a GENERATED ALWAYS AS // column. func Xsqlite3AddGenerated(tls *libc.TLS, pParse uintptr, pExpr uintptr, pType uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var eType U8 var pTab uintptr var pCol uintptr eType = U8(COLFLAG_VIRTUAL) pTab = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if !(pTab == uintptr(0)) { goto __1 } goto generated_done __1: ; pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(int32((*Table)(unsafe.Pointer(pTab)).FnCol)-1)*24 if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) == PARSE_MODE_DECLARE_VTAB) { goto __2 } Xsqlite3ErrorMsg(tls, pParse, ts+14030, 0) goto generated_done __2: ; if !(int32((*Column)(unsafe.Pointer(pCol)).FiDflt) > 0) { goto __3 } goto generated_error __3: ; if !(pType != 0) { goto __4 } if !((*Token)(unsafe.Pointer(pType)).Fn == uint32(7) && Xsqlite3_strnicmp(tls, ts+14073, (*Token)(unsafe.Pointer(pType)).Fz, 7) == 0) { goto __5 } goto __6 __5: if !((*Token)(unsafe.Pointer(pType)).Fn == uint32(6) && Xsqlite3_strnicmp(tls, ts+14081, (*Token)(unsafe.Pointer(pType)).Fz, 6) == 0) { goto __7 } eType = U8(COLFLAG_STORED) goto __8 __7: goto generated_error __8: ; __6: ; __4: ; if !(int32(eType) == COLFLAG_VIRTUAL) { goto __9 } (*Table)(unsafe.Pointer(pTab)).FnNVCol-- __9: ; *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(int32(eType)) *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(eType) if !(int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_PRIMKEY != 0) { goto __10 } makeColumnPartOfPrimaryKey(tls, pParse, pCol) __10: ; if !(pExpr != 0 && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_ID) { goto __11 } pExpr = Xsqlite3PExpr(tls, pParse, TK_UPLUS, pExpr, uintptr(0)) __11: ; if !(pExpr != 0 && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_RAISE) { goto __12 } (*Expr)(unsafe.Pointer(pExpr)).FaffExpr = (*Column)(unsafe.Pointer(pCol)).Faffinity __12: ; Xsqlite3ColumnSetExpr(tls, pParse, pTab, pCol, pExpr) pExpr = uintptr(0) goto generated_done generated_error: Xsqlite3ErrorMsg(tls, pParse, ts+14088, libc.VaList(bp, (*Column)(unsafe.Pointer(pCol)).FzCnName)) generated_done: Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) } // Generate code that will increment the schema cookie. // // The schema cookie is used to determine when the schema for the // database changes. After each schema change, the cookie value // changes. When a process first reads the schema it records the // cookie. Thereafter, whenever it goes to access the database, // it checks the cookie to make sure the schema has not changed // since it was last read. // // This plan is not completely bullet-proof. It is possible for // the schema to change multiple times and for the cookie to be // set back to prior value. But schema changes are infrequent // and the probability of hitting the same cookie value is only // 1 chance in 2^32. So we're safe enough. // // IMPLEMENTATION-OF: R-34230-56049 SQLite automatically increments // the schema-version whenever the schema changes. func Xsqlite3ChangeCookie(tls *libc.TLS, pParse uintptr, iDb int32) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe Xsqlite3VdbeAddOp3(tls, v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, int32(uint32(1)+uint32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema)).Fschema_cookie))) } func identLength(tls *libc.TLS, z uintptr) int32 { var n int32 n = 0 __1: if !(*(*int8)(unsafe.Pointer(z)) != 0) { goto __3 } { if int32(*(*int8)(unsafe.Pointer(z))) == '"' { n++ } } goto __2 __2: n++ z++ goto __1 goto __3 __3: ; return n + 2 } func identPut(tls *libc.TLS, z uintptr, pIdx uintptr, zSignedIdent uintptr) { var zIdent uintptr = zSignedIdent var i int32 var j int32 var needQuote int32 i = *(*int32)(unsafe.Pointer(pIdx)) for j = 0; *(*uint8)(unsafe.Pointer(zIdent + uintptr(j))) != 0; j++ { if !(int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(zIdent + uintptr(j)))])&0x06 != 0) && int32(*(*uint8)(unsafe.Pointer(zIdent + uintptr(j)))) != '_' { break } } needQuote = libc.Bool32(int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(zIdent))])&0x04 != 0 || Xsqlite3KeywordCode(tls, zIdent, j) != TK_ID || int32(*(*uint8)(unsafe.Pointer(zIdent + uintptr(j)))) != 0 || j == 0) if needQuote != 0 { *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&i, 1)))) = int8('"') } for j = 0; *(*uint8)(unsafe.Pointer(zIdent + uintptr(j))) != 0; j++ { *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&i, 1)))) = int8(*(*uint8)(unsafe.Pointer(zIdent + uintptr(j)))) if int32(*(*uint8)(unsafe.Pointer(zIdent + uintptr(j)))) == '"' { *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&i, 1)))) = int8('"') } } if needQuote != 0 { *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&i, 1)))) = int8('"') } *(*int8)(unsafe.Pointer(z + uintptr(i))) = int8(0) *(*int32)(unsafe.Pointer(pIdx)) = i } func createTableStmt(tls *libc.TLS, db uintptr, p uintptr) uintptr { bp := tls.Alloc(12) defer tls.Free(12) var i int32 var n int32 var zStmt uintptr var zSep uintptr var zSep2 uintptr var zEnd uintptr var pCol uintptr n = 0 pCol = (*Table)(unsafe.Pointer(p)).FaCol i = 0 __1: if !(i < int32((*Table)(unsafe.Pointer(p)).FnCol)) { goto __3 } { n = n + (identLength(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName) + 5) } goto __2 __2: i++ pCol += 24 goto __1 goto __3 __3: ; n = n + identLength(tls, (*Table)(unsafe.Pointer(p)).FzName) if n < 50 { zSep = ts + 1544 zSep2 = ts + 14119 zEnd = ts + 6309 } else { zSep = ts + 14121 zSep2 = ts + 14125 zEnd = ts + 14130 } n = n + (35 + 6*int32((*Table)(unsafe.Pointer(p)).FnCol)) zStmt = Xsqlite3DbMallocRaw(tls, uintptr(0), uint64(n)) if zStmt == uintptr(0) { Xsqlite3OomFault(tls, db) return uintptr(0) } Xsqlite3_snprintf(tls, n, zStmt, ts+14133, 0) *(*int32)(unsafe.Pointer(bp + 8)) = Xsqlite3Strlen30(tls, zStmt) identPut(tls, zStmt, bp+8, (*Table)(unsafe.Pointer(p)).FzName) *(*int8)(unsafe.Pointer(zStmt + uintptr(libc.PostIncInt32(&*(*int32)(unsafe.Pointer(bp + 8)), 1)))) = int8('(') pCol = (*Table)(unsafe.Pointer(p)).FaCol i = 0 __4: if !(i < int32((*Table)(unsafe.Pointer(p)).FnCol)) { goto __6 } { var len int32 var zType uintptr Xsqlite3_snprintf(tls, n-*(*int32)(unsafe.Pointer(bp + 8)), zStmt+uintptr(*(*int32)(unsafe.Pointer(bp + 8))), zSep, 0) *(*int32)(unsafe.Pointer(bp + 8)) += Xsqlite3Strlen30(tls, zStmt+uintptr(*(*int32)(unsafe.Pointer(bp + 8)))) zSep = zSep2 identPut(tls, zStmt, bp+8, (*Column)(unsafe.Pointer(pCol)).FzCnName) zType = azType1[int32((*Column)(unsafe.Pointer(pCol)).Faffinity)-SQLITE_AFF_BLOB] len = Xsqlite3Strlen30(tls, zType) libc.Xmemcpy(tls, zStmt+uintptr(*(*int32)(unsafe.Pointer(bp + 8))), zType, uint64(len)) *(*int32)(unsafe.Pointer(bp + 8)) += len } goto __5 __5: i++ pCol += 24 goto __4 goto __6 __6: ; Xsqlite3_snprintf(tls, n-*(*int32)(unsafe.Pointer(bp + 8)), zStmt+uintptr(*(*int32)(unsafe.Pointer(bp + 8))), ts+4493, libc.VaList(bp, zEnd)) return zStmt } var azType1 = [6]uintptr{ ts + 1544, ts + 14147, ts + 14153, ts + 14158, ts + 14163, ts + 14153, } func resizeIndexObject(tls *libc.TLS, db uintptr, pIdx uintptr, N int32) int32 { var zExtra uintptr var nByte int32 if int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) >= N { return SQLITE_OK } nByte = int32((uint64(unsafe.Sizeof(uintptr(0))) + uint64(unsafe.Sizeof(LogEst(0))) + uint64(unsafe.Sizeof(I16(0))) + uint64(1)) * uint64(N)) zExtra = Xsqlite3DbMallocZero(tls, db, uint64(nByte)) if zExtra == uintptr(0) { return SQLITE_NOMEM } libc.Xmemcpy(tls, zExtra, (*Index)(unsafe.Pointer(pIdx)).FazColl, uint64(unsafe.Sizeof(uintptr(0)))*uint64((*Index)(unsafe.Pointer(pIdx)).FnColumn)) (*Index)(unsafe.Pointer(pIdx)).FazColl = zExtra zExtra += uintptr(uint64(unsafe.Sizeof(uintptr(0))) * uint64(N)) libc.Xmemcpy(tls, zExtra, (*Index)(unsafe.Pointer(pIdx)).FaiRowLogEst, uint64(unsafe.Sizeof(LogEst(0)))*uint64(int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)+1)) (*Index)(unsafe.Pointer(pIdx)).FaiRowLogEst = zExtra zExtra += uintptr(uint64(unsafe.Sizeof(LogEst(0))) * uint64(N)) libc.Xmemcpy(tls, zExtra, (*Index)(unsafe.Pointer(pIdx)).FaiColumn, uint64(unsafe.Sizeof(I16(0)))*uint64((*Index)(unsafe.Pointer(pIdx)).FnColumn)) (*Index)(unsafe.Pointer(pIdx)).FaiColumn = zExtra zExtra += uintptr(uint64(unsafe.Sizeof(I16(0))) * uint64(N)) libc.Xmemcpy(tls, zExtra, (*Index)(unsafe.Pointer(pIdx)).FaSortOrder, uint64((*Index)(unsafe.Pointer(pIdx)).FnColumn)) (*Index)(unsafe.Pointer(pIdx)).FaSortOrder = zExtra (*Index)(unsafe.Pointer(pIdx)).FnColumn = U16(N) libc.SetBitFieldPtr16Uint32(pIdx+100, uint32(1), 4, 0x10) return SQLITE_OK } func estimateTableWidth(tls *libc.TLS, pTab uintptr) { var wTable uint32 = uint32(0) var pTabCol uintptr var i int32 i = int32((*Table)(unsafe.Pointer(pTab)).FnCol) pTabCol = (*Table)(unsafe.Pointer(pTab)).FaCol __1: if !(i > 0) { goto __3 } { wTable = wTable + uint32((*Column)(unsafe.Pointer(pTabCol)).FszEst) } goto __2 __2: i-- pTabCol += 24 goto __1 goto __3 __3: ; if int32((*Table)(unsafe.Pointer(pTab)).FiPKey) < 0 { wTable++ } (*Table)(unsafe.Pointer(pTab)).FszTabRow = Xsqlite3LogEst(tls, uint64(wTable*uint32(4))) } func estimateIndexWidth(tls *libc.TLS, pIdx uintptr) { var wIndex uint32 = uint32(0) var i int32 var aCol uintptr = (*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FaCol for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn); i++ { var x I16 = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2)) wIndex = wIndex + func() uint32 { if int32(x) < 0 { return uint32(1) } return uint32((*Column)(unsafe.Pointer(aCol + uintptr(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2)))*24)).FszEst) }() } (*Index)(unsafe.Pointer(pIdx)).FszIdxRow = Xsqlite3LogEst(tls, uint64(wIndex*uint32(4))) } func hasColumn(tls *libc.TLS, aiCol uintptr, nCol int32, x int32) int32 { for libc.PostDecInt32(&nCol, 1) > 0 { if x == int32(*(*I16)(unsafe.Pointer(libc.PostIncUintptr(&aiCol, 2)))) { return 1 } } return 0 } func isDupColumn(tls *libc.TLS, pIdx uintptr, nKey int32, pPk uintptr, iCol int32) int32 { var i int32 var j int32 j = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(iCol)*2))) for i = 0; i < nKey; i++ { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) == j && Xsqlite3StrICmp(tls, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(i)*8)), *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FazColl + uintptr(iCol)*8))) == 0 { return 1 } } return 0 } func recomputeColumnsNotIndexed(tls *libc.TLS, pIdx uintptr) { var m Bitmask = uint64(0) var j int32 var pTab uintptr = (*Index)(unsafe.Pointer(pIdx)).FpTable for j = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) - 1; j >= 0; j-- { var x int32 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j)*2))) if x >= 0 && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(x)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0 { if x < int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))-1 { m = m | uint64(1)<>1) != 0) { for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_PRIMKEY != 0 && int32(*(*uint8)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(i)*24 + 8))&0xf>>0) == OE_None { libc.SetBitFieldPtr8Uint32((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24+8, uint32(OE_Abort), 0, 0xf) } } *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_HasNotNull) } if *(*int32)(unsafe.Pointer(pParse + 200)) != 0 { Xsqlite3VdbeChangeP3(tls, v, *(*int32)(unsafe.Pointer(pParse + 200)), BTREE_BLOBKEY) } if int32((*Table)(unsafe.Pointer(pTab)).FiPKey) >= 0 { var pList uintptr Xsqlite3TokenInit(tls, bp, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr((*Table)(unsafe.Pointer(pTab)).FiPKey)*24)).FzCnName) pList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), Xsqlite3ExprAlloc(tls, db, TK_ID, bp, 0)) if pList == uintptr(0) { *(*U32)(unsafe.Pointer(pTab + 48)) &= libc.Uint32FromInt32(libc.CplInt32(TF_WithoutRowid)) return } if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameTokenRemap(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8)).FpExpr, pTab+52) } (*ExprList_item)(unsafe.Pointer(pList + 8)).Ffg.FsortFlags = (*Parse)(unsafe.Pointer(pParse)).FiPkSortOrder (*Table)(unsafe.Pointer(pTab)).FiPKey = int16(-1) Xsqlite3CreateIndex(tls, pParse, uintptr(0), uintptr(0), uintptr(0), pList, int32((*Table)(unsafe.Pointer(pTab)).FkeyConf), uintptr(0), uintptr(0), 0, 0, uint8(SQLITE_IDXTYPE_PRIMARYKEY)) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { *(*U32)(unsafe.Pointer(pTab + 48)) &= libc.Uint32FromInt32(libc.CplInt32(TF_WithoutRowid)) return } pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) } else { pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) for i = libc.AssignInt32(&j, 1); i < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol); i++ { if isDupColumn(tls, pPk, j, pPk, i) != 0 { (*Index)(unsafe.Pointer(pPk)).FnColumn-- } else { *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FazColl + uintptr(j)*8)) = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FazColl + uintptr(i)*8)) *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaSortOrder + uintptr(j))) = *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaSortOrder + uintptr(i))) *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(libc.PostIncInt32(&j, 1))*2)) = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2)) } } (*Index)(unsafe.Pointer(pPk)).FnKeyCol = U16(j) } libc.SetBitFieldPtr16Uint32(pPk+100, uint32(1), 5, 0x20) if !(int32(*(*uint8)(unsafe.Pointer(db + 192 + 8))&0x2>>1) != 0) { libc.SetBitFieldPtr16Uint32(pPk+100, uint32(1), 3, 0x8) } nPk = int32(libc.AssignPtrUint16(pPk+96, (*Index)(unsafe.Pointer(pPk)).FnKeyCol)) if v != 0 && (*Index)(unsafe.Pointer(pPk)).Ftnum > Pgno(0) { Xsqlite3VdbeChangeOpcode(tls, v, int32((*Index)(unsafe.Pointer(pPk)).Ftnum), uint8(OP_Goto)) } (*Index)(unsafe.Pointer(pPk)).Ftnum = (*Table)(unsafe.Pointer(pTab)).Ftnum for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { var n int32 if int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { continue } for i = libc.AssignInt32(&n, 0); i < nPk; i++ { if !(isDupColumn(tls, pIdx, int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol), pPk, i) != 0) { n++ } } if n == 0 { (*Index)(unsafe.Pointer(pIdx)).FnColumn = (*Index)(unsafe.Pointer(pIdx)).FnKeyCol continue } if resizeIndexObject(tls, db, pIdx, int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)+n) != 0 { return } i = 0 j = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) for ; i < nPk; i++ { if !(isDupColumn(tls, pIdx, int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol), pPk, i) != 0) { *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j)*2)) = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2)) *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(j)*8)) = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FazColl + uintptr(i)*8)) if *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaSortOrder + uintptr(i))) != 0 { libc.SetBitFieldPtr16Uint32(pIdx+100, uint32(1), 9, 0x200) } j++ } } } nExtra = 0 for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if !(hasColumn(tls, (*Index)(unsafe.Pointer(pPk)).FaiColumn, nPk, i) != 0) && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0 { nExtra++ } } if resizeIndexObject(tls, db, pPk, nPk+nExtra) != 0 { return } i = 0 j = nPk for ; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if !(hasColumn(tls, (*Index)(unsafe.Pointer(pPk)).FaiColumn, j, i) != 0) && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0 { *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(j)*2)) = I16(i) *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FazColl + uintptr(j)*8)) = uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) j++ } } recomputeColumnsNotIndexed(tls, pPk) } // Return true if pTab is a virtual table and zName is a shadow table name // for that virtual table. func Xsqlite3IsShadowTableOf(tls *libc.TLS, db uintptr, pTab uintptr, zName uintptr) int32 { var nName int32 var pMod uintptr if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { return 0 } nName = Xsqlite3Strlen30(tls, (*Table)(unsafe.Pointer(pTab)).FzName) if Xsqlite3_strnicmp(tls, zName, (*Table)(unsafe.Pointer(pTab)).FzName, nName) != 0 { return 0 } if int32(*(*int8)(unsafe.Pointer(zName + uintptr(nName)))) != '_' { return 0 } pMod = Xsqlite3HashFind(tls, db+576, *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 8))))) if pMod == uintptr(0) { return 0 } if (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FiVersion < 3 { return 0 } if (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxShadowName == uintptr(0) { return 0 } return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxShadowName})).f(tls, zName+uintptr(nName)+uintptr(1)) } // Table pTab is a virtual table. If it the virtual table implementation // exists and has an xShadowName method, then loop over all other ordinary // tables within the same schema looking for shadow tables of pTab, and mark // any shadow tables seen using the TF_Shadow flag. func Xsqlite3MarkAllShadowTablesOf(tls *libc.TLS, db uintptr, pTab uintptr) { var nName int32 var pMod uintptr var k uintptr pMod = Xsqlite3HashFind(tls, db+576, *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 8))))) if pMod == uintptr(0) { return } if (*Module)(unsafe.Pointer(pMod)).FpModule == uintptr(0) { return } if (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FiVersion < 3 { return } if (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxShadowName == uintptr(0) { return } nName = Xsqlite3Strlen30(tls, (*Table)(unsafe.Pointer(pTab)).FzName) for k = (*Hash)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FpSchema + 8)).Ffirst; k != 0; k = (*HashElem)(unsafe.Pointer(k)).Fnext { var pOther uintptr = (*HashElem)(unsafe.Pointer(k)).Fdata if !(int32((*Table)(unsafe.Pointer(pOther)).FeTabType) == TABTYP_NORM) { continue } if (*Table)(unsafe.Pointer(pOther)).FtabFlags&U32(TF_Shadow) != 0 { continue } if Xsqlite3_strnicmp(tls, (*Table)(unsafe.Pointer(pOther)).FzName, (*Table)(unsafe.Pointer(pTab)).FzName, nName) == 0 && int32(*(*int8)(unsafe.Pointer((*Table)(unsafe.Pointer(pOther)).FzName + uintptr(nName)))) == '_' && (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxShadowName})).f(tls, (*Table)(unsafe.Pointer(pOther)).FzName+uintptr(nName)+uintptr(1)) != 0 { *(*U32)(unsafe.Pointer(pOther + 48)) |= U32(TF_Shadow) } } } // Return true if zName is a shadow table name in the current database // connection. // // zName is temporarily modified while this routine is running, but is // restored to its original value prior to this routine returning. func Xsqlite3ShadowTableName(tls *libc.TLS, db uintptr, zName uintptr) int32 { var zTail uintptr var pTab uintptr zTail = libc.Xstrrchr(tls, zName, '_') if zTail == uintptr(0) { return 0 } *(*int8)(unsafe.Pointer(zTail)) = int8(0) pTab = Xsqlite3FindTable(tls, db, zName, uintptr(0)) *(*int8)(unsafe.Pointer(zTail)) = int8('_') if pTab == uintptr(0) { return 0 } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { return 0 } return Xsqlite3IsShadowTableOf(tls, db, pTab, zName) } // This routine is called to report the final ")" that terminates // a CREATE TABLE statement. // // The table structure that other action routines have been building // is added to the internal hash tables, assuming no errors have // occurred. // // An entry for the table is made in the schema table on disk, unless // this is a temporary table or db->init.busy==1. When db->init.busy==1 // it means we are reading the sqlite_schema table because we just // connected to the database or because the sqlite_schema table has // recently changed, so the entry for this table already exists in // the sqlite_schema table. We do not want to create it again. // // If the pSelect argument is not NULL, it means that this routine // was called to create a table generated from a // "CREATE TABLE ... AS SELECT ..." statement. The column names of // the new table will match the result set of the SELECT. func Xsqlite3EndTable(tls *libc.TLS, pParse uintptr, pCons uintptr, pEnd uintptr, tabOpts U32, pSelect uintptr) { bp := tls.Alloc(184) defer tls.Free(184) var p uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var iDb int32 var pIdx uintptr if pEnd == uintptr(0) && pSelect == uintptr(0) { return } p = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if p == uintptr(0) { return } if pSelect == uintptr(0) && Xsqlite3ShadowTableName(tls, db, (*Table)(unsafe.Pointer(p)).FzName) != 0 { *(*U32)(unsafe.Pointer(p + 48)) |= U32(TF_Shadow) } if (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 { if pSelect != 0 || !(int32((*Table)(unsafe.Pointer(p)).FeTabType) == TABTYP_NORM) && (*Sqlite3)(unsafe.Pointer(db)).Finit.FnewTnum != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+1544, 0) return } (*Table)(unsafe.Pointer(p)).Ftnum = (*Sqlite3)(unsafe.Pointer(db)).Finit.FnewTnum if (*Table)(unsafe.Pointer(p)).Ftnum == Pgno(1) { *(*U32)(unsafe.Pointer(p + 48)) |= U32(TF_Readonly) } } if tabOpts&U32(TF_Strict) != 0 { var ii int32 *(*U32)(unsafe.Pointer(p + 48)) |= U32(TF_Strict) for ii = 0; ii < int32((*Table)(unsafe.Pointer(p)).FnCol); ii++ { var pCol uintptr = (*Table)(unsafe.Pointer(p)).FaCol + uintptr(ii)*24 if int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf0>>4) == COLTYPE_CUSTOM { if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_HASTYPE != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+14169, libc.VaList(bp, (*Table)(unsafe.Pointer(p)).FzName, (*Column)(unsafe.Pointer(pCol)).FzCnName, Xsqlite3ColumnType(tls, pCol, ts+1544))) } else { Xsqlite3ErrorMsg(tls, pParse, ts+14202, libc.VaList(bp+24, (*Table)(unsafe.Pointer(p)).FzName, (*Column)(unsafe.Pointer(pCol)).FzCnName)) } return } else if int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf0>>4) == COLTYPE_ANY { (*Column)(unsafe.Pointer(pCol)).Faffinity = int8(SQLITE_AFF_BLOB) } if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_PRIMKEY != 0 && int32((*Table)(unsafe.Pointer(p)).FiPKey) != ii && int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf>>0) == OE_None { libc.SetBitFieldPtr8Uint32(pCol+8, uint32(OE_Abort), 0, 0xf) *(*U32)(unsafe.Pointer(p + 48)) |= U32(TF_HasNotNull) } } } if tabOpts&U32(TF_WithoutRowid) != 0 { if (*Table)(unsafe.Pointer(p)).FtabFlags&U32(TF_Autoincrement) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+14229, 0) return } if (*Table)(unsafe.Pointer(p)).FtabFlags&U32(TF_HasPrimaryKey) == U32(0) { Xsqlite3ErrorMsg(tls, pParse, ts+14279, libc.VaList(bp+40, (*Table)(unsafe.Pointer(p)).FzName)) return } *(*U32)(unsafe.Pointer(p + 48)) |= U32(TF_WithoutRowid | TF_NoVisibleRowid) convertToWithoutRowidTable(tls, pParse, p) } iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(p)).FpSchema) if (*Table)(unsafe.Pointer(p)).FpCheck != 0 { Xsqlite3ResolveSelfReference(tls, pParse, p, NC_IsCheck, uintptr(0), (*Table)(unsafe.Pointer(p)).FpCheck) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { Xsqlite3ExprListDelete(tls, db, (*Table)(unsafe.Pointer(p)).FpCheck) (*Table)(unsafe.Pointer(p)).FpCheck = uintptr(0) } else { } } if (*Table)(unsafe.Pointer(p)).FtabFlags&U32(TF_HasGenerated) != 0 { var ii int32 var nNG int32 = 0 for ii = 0; ii < int32((*Table)(unsafe.Pointer(p)).FnCol); ii++ { var colFlags U32 = U32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(p)).FaCol + uintptr(ii)*24)).FcolFlags) if colFlags&U32(COLFLAG_GENERATED) != U32(0) { var pX uintptr = Xsqlite3ColumnExpr(tls, p, (*Table)(unsafe.Pointer(p)).FaCol+uintptr(ii)*24) if Xsqlite3ResolveSelfReference(tls, pParse, p, NC_GenCol, pX, uintptr(0)) != 0 { Xsqlite3ColumnSetExpr(tls, pParse, p, (*Table)(unsafe.Pointer(p)).FaCol+uintptr(ii)*24, Xsqlite3ExprAlloc(tls, db, TK_NULL, uintptr(0), 0)) } } else { nNG++ } } if nNG == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+14311, 0) return } } estimateTableWidth(tls, p) for pIdx = (*Table)(unsafe.Pointer(p)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { estimateIndexWidth(tls, pIdx) } if !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) { var n int32 var v uintptr var zType uintptr var zType2 uintptr var zStmt uintptr v = Xsqlite3GetVdbe(tls, pParse) if v == uintptr(0) { return } Xsqlite3VdbeAddOp1(tls, v, OP_Close, 0) if int32((*Table)(unsafe.Pointer(p)).FeTabType) == TABTYP_NORM { zType = ts + 10228 zType2 = ts + 14355 } else { zType = ts + 11843 zType2 = ts + 14361 } if pSelect != 0 { var regYield int32 var addrTop int32 var regRec int32 var regRowid int32 var addrInsLoop int32 var pSelTab uintptr if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) != PARSE_MODE_NORMAL { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_ERROR (*Parse)(unsafe.Pointer(pParse)).FnErr++ return } regYield = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regRec = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regRowid = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3MayAbort(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_OpenWrite, 1, (*Parse)(unsafe.Pointer(pParse)).FregRoot, iDb) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_P2ISREG)) (*Parse)(unsafe.Pointer(pParse)).FnTab = 2 addrTop = Xsqlite3VdbeCurrentAddr(tls, v) + 1 Xsqlite3VdbeAddOp3(tls, v, OP_InitCoroutine, regYield, 0, addrTop) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } pSelTab = Xsqlite3ResultSetOfSelect(tls, pParse, pSelect, int8(SQLITE_AFF_BLOB)) if pSelTab == uintptr(0) { return } (*Table)(unsafe.Pointer(p)).FnCol = libc.AssignPtrInt16(p+56, (*Table)(unsafe.Pointer(pSelTab)).FnCol) (*Table)(unsafe.Pointer(p)).FaCol = (*Table)(unsafe.Pointer(pSelTab)).FaCol (*Table)(unsafe.Pointer(pSelTab)).FnCol = int16(0) (*Table)(unsafe.Pointer(pSelTab)).FaCol = uintptr(0) Xsqlite3DeleteTable(tls, db, pSelTab) Xsqlite3SelectDestInit(tls, bp+144, SRT_Coroutine, regYield) Xsqlite3Select(tls, pParse, pSelect, bp+144) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } Xsqlite3VdbeEndCoroutine(tls, v, regYield) Xsqlite3VdbeJumpHere(tls, v, addrTop-1) addrInsLoop = Xsqlite3VdbeAddOp1(tls, v, OP_Yield, (*SelectDest)(unsafe.Pointer(bp+144)).FiSDParm) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, (*SelectDest)(unsafe.Pointer(bp+144)).FiSdst, (*SelectDest)(unsafe.Pointer(bp+144)).FnSdst, regRec) Xsqlite3TableAffinity(tls, v, p, 0) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, 1, regRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, 1, regRec, regRowid) Xsqlite3VdbeGoto(tls, v, addrInsLoop) Xsqlite3VdbeJumpHere(tls, v, addrInsLoop) Xsqlite3VdbeAddOp1(tls, v, OP_Close, 1) } if pSelect != 0 { zStmt = createTableStmt(tls, db, p) } else { var pEnd2 uintptr if tabOpts != 0 { pEnd2 = pParse + 288 } else { pEnd2 = pEnd } n = int32((int64((*Token)(unsafe.Pointer(pEnd2)).Fz) - int64((*Parse)(unsafe.Pointer(pParse)).FsNameToken.Fz)) / 1) if int32(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(pEnd2)).Fz))) != ';' { n = int32(uint32(n) + (*Token)(unsafe.Pointer(pEnd2)).Fn) } zStmt = Xsqlite3MPrintf(tls, db, ts+14366, libc.VaList(bp+48, zType2, n, (*Parse)(unsafe.Pointer(pParse)).FsNameToken.Fz)) } Xsqlite3NestedParse(tls, pParse, ts+14381, libc.VaList(bp+72, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, zType, (*Table)(unsafe.Pointer(p)).FzName, (*Table)(unsafe.Pointer(p)).FzName, (*Parse)(unsafe.Pointer(pParse)).FregRoot, zStmt, (*Parse)(unsafe.Pointer(pParse)).FregRowid)) Xsqlite3DbFree(tls, db, zStmt) Xsqlite3ChangeCookie(tls, pParse, iDb) if (*Table)(unsafe.Pointer(p)).FtabFlags&U32(TF_Autoincrement) != U32(0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) != PARSE_MODE_NORMAL) { var pDb uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 if (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).FpSeqTab == uintptr(0) { Xsqlite3NestedParse(tls, pParse, ts+14479, libc.VaList(bp+128, (*Db)(unsafe.Pointer(pDb)).FzDbSName)) } } Xsqlite3VdbeAddParseSchemaOp(tls, v, iDb, Xsqlite3MPrintf(tls, db, ts+14521, libc.VaList(bp+136, (*Table)(unsafe.Pointer(p)).FzName)), uint16(0)) } if (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 { var pOld uintptr var pSchema uintptr = (*Table)(unsafe.Pointer(p)).FpSchema pOld = Xsqlite3HashInsert(tls, pSchema+8, (*Table)(unsafe.Pointer(p)).FzName, p) if pOld != 0 { Xsqlite3OomFault(tls, db) return } (*Parse)(unsafe.Pointer(pParse)).FpNewTable = uintptr(0) *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) if libc.Xstrcmp(tls, (*Table)(unsafe.Pointer(p)).FzName, ts+10750) == 0 { (*Schema)(unsafe.Pointer((*Table)(unsafe.Pointer(p)).FpSchema)).FpSeqTab = p } } if !(pSelect != 0) && int32((*Table)(unsafe.Pointer(p)).FeTabType) == TABTYP_NORM { if (*Token)(unsafe.Pointer(pCons)).Fz == uintptr(0) { pCons = pEnd } *(*int32)(unsafe.Pointer(p + 64)) = 13 + int32((int64((*Token)(unsafe.Pointer(pCons)).Fz)-int64((*Parse)(unsafe.Pointer(pParse)).FsNameToken.Fz))/1) } } // The parser calls this routine in order to create a new VIEW func Xsqlite3CreateView(tls *libc.TLS, pParse uintptr, pBegin uintptr, pName1 uintptr, pName2 uintptr, pCNames uintptr, pSelect uintptr, isTemp int32, noErr int32) { bp := tls.Alloc(120) defer tls.Free(120) var p uintptr var n int32 var z uintptr var iDb int32 var db uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !(int32((*Parse)(unsafe.Pointer(pParse)).FnVar) > 0) { goto __1 } Xsqlite3ErrorMsg(tls, pParse, ts+14555, 0) goto create_view_fail __1: ; Xsqlite3StartTable(tls, pParse, pName1, pName2, isTemp, 1, 0, noErr) p = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if !(p == uintptr(0) || (*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __2 } goto create_view_fail __2: ; *(*U32)(unsafe.Pointer(p + 48)) |= U32(TF_NoVisibleRowid) Xsqlite3TwoPartName(tls, pParse, pName1, pName2, bp) iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(p)).FpSchema) Xsqlite3FixInit(tls, bp+8, pParse, iDb, ts+11843, *(*uintptr)(unsafe.Pointer(bp))) if !(Xsqlite3FixSelect(tls, bp+8, pSelect) != 0) { goto __3 } goto create_view_fail __3: ; *(*U32)(unsafe.Pointer(pSelect + 4)) |= U32(SF_View) if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __4 } *(*uintptr)(unsafe.Pointer(p + 64)) = pSelect pSelect = uintptr(0) goto __5 __4: *(*uintptr)(unsafe.Pointer(p + 64)) = Xsqlite3SelectDup(tls, db, pSelect, EXPRDUP_REDUCE) __5: ; (*Table)(unsafe.Pointer(p)).FpCheck = Xsqlite3ExprListDup(tls, db, pCNames, EXPRDUP_REDUCE) (*Table)(unsafe.Pointer(p)).FeTabType = U8(TABTYP_VIEW) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __6 } goto create_view_fail __6: ; *(*Token)(unsafe.Pointer(bp + 104)) = (*Parse)(unsafe.Pointer(pParse)).FsLastToken if !(int32(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(bp + 104)).Fz))) != ';') { goto __7 } *(*uintptr)(unsafe.Pointer(bp + 104)) += uintptr((*Token)(unsafe.Pointer(bp + 104)).Fn) __7: ; (*Token)(unsafe.Pointer(bp + 104)).Fn = uint32(0) n = int32((int64((*Token)(unsafe.Pointer(bp+104)).Fz) - int64((*Token)(unsafe.Pointer(pBegin)).Fz)) / 1) z = (*Token)(unsafe.Pointer(pBegin)).Fz __8: if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(n-1))))])&0x01 != 0) { goto __9 } n-- goto __8 __9: ; (*Token)(unsafe.Pointer(bp + 104)).Fz = z + uintptr(n-1) (*Token)(unsafe.Pointer(bp + 104)).Fn = uint32(1) Xsqlite3EndTable(tls, pParse, uintptr(0), bp+104, uint32(0), uintptr(0)) create_view_fail: Xsqlite3SelectDelete(tls, db, pSelect) if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __10 } Xsqlite3RenameExprlistUnmap(tls, pParse, pCNames) __10: ; Xsqlite3ExprListDelete(tls, db, pCNames) return } func viewGetColumnNames(tls *libc.TLS, pParse uintptr, pTable uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pSelTab uintptr var pSel uintptr var nErr int32 = 0 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var rc int32 var xAuth Sqlite3_xauth if int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_VTAB { (*Sqlite3)(unsafe.Pointer(db)).FnSchemaLock++ rc = Xsqlite3VtabCallConnect(tls, pParse, pTable) (*Sqlite3)(unsafe.Pointer(db)).FnSchemaLock-- return rc } if int32((*Table)(unsafe.Pointer(pTable)).FnCol) < 0 { Xsqlite3ErrorMsg(tls, pParse, ts+14591, libc.VaList(bp, (*Table)(unsafe.Pointer(pTable)).FzName)) return 1 } pSel = Xsqlite3SelectDup(tls, db, *(*uintptr)(unsafe.Pointer(pTable + 64)), 0) if pSel != 0 { var eParseMode U8 = (*Parse)(unsafe.Pointer(pParse)).FeParseMode var nTab int32 = (*Parse)(unsafe.Pointer(pParse)).FnTab var nSelect int32 = (*Parse)(unsafe.Pointer(pParse)).FnSelect (*Parse)(unsafe.Pointer(pParse)).FeParseMode = U8(PARSE_MODE_NORMAL) Xsqlite3SrcListAssignCursors(tls, pParse, (*Select)(unsafe.Pointer(pSel)).FpSrc) (*Table)(unsafe.Pointer(pTable)).FnCol = int16(-1) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) xAuth = (*Sqlite3)(unsafe.Pointer(db)).FxAuth (*Sqlite3)(unsafe.Pointer(db)).FxAuth = uintptr(0) pSelTab = Xsqlite3ResultSetOfSelect(tls, pParse, pSel, int8(SQLITE_AFF_NONE)) (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth (*Parse)(unsafe.Pointer(pParse)).FnTab = nTab (*Parse)(unsafe.Pointer(pParse)).FnSelect = nSelect if pSelTab == uintptr(0) { (*Table)(unsafe.Pointer(pTable)).FnCol = int16(0) nErr++ } else if (*Table)(unsafe.Pointer(pTable)).FpCheck != 0 { Xsqlite3ColumnsFromExprList(tls, pParse, (*Table)(unsafe.Pointer(pTable)).FpCheck, pTable+54, pTable+8) if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 && int32((*Table)(unsafe.Pointer(pTable)).FnCol) == (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSel)).FpEList)).FnExpr { Xsqlite3SubqueryColumnTypes(tls, pParse, pTable, pSel, int8(SQLITE_AFF_NONE)) } } else { (*Table)(unsafe.Pointer(pTable)).FnCol = (*Table)(unsafe.Pointer(pSelTab)).FnCol (*Table)(unsafe.Pointer(pTable)).FaCol = (*Table)(unsafe.Pointer(pSelTab)).FaCol *(*U32)(unsafe.Pointer(pTable + 48)) |= (*Table)(unsafe.Pointer(pSelTab)).FtabFlags & U32(COLFLAG_NOINSERT) (*Table)(unsafe.Pointer(pSelTab)).FnCol = int16(0) (*Table)(unsafe.Pointer(pSelTab)).FaCol = uintptr(0) } (*Table)(unsafe.Pointer(pTable)).FnNVCol = (*Table)(unsafe.Pointer(pTable)).FnCol Xsqlite3DeleteTable(tls, db, pSelTab) Xsqlite3SelectDelete(tls, db, pSel) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable-- (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = func() uint16 { if (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable != 0 { return uint16(0) } return (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue }() (*Parse)(unsafe.Pointer(pParse)).FeParseMode = eParseMode } else { nErr++ } *(*U16)(unsafe.Pointer((*Table)(unsafe.Pointer(pTable)).FpSchema + 114)) |= U16(DB_UnresetViews) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3DeleteColumnNames(tls, db, pTable) } return nErr } func Xsqlite3ViewGetColumnNames(tls *libc.TLS, pParse uintptr, pTable uintptr) int32 { if !(int32((*Table)(unsafe.Pointer(pTable)).FeTabType) == TABTYP_VTAB) && int32((*Table)(unsafe.Pointer(pTable)).FnCol) > 0 { return 0 } return viewGetColumnNames(tls, pParse, pTable) } func sqliteViewResetAll(tls *libc.TLS, db uintptr, idx int32) { var i uintptr if !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(idx)*32)).FpSchema)).FschemaFlags)&DB_UnresetViews == DB_UnresetViews) { return } for i = (*Hash)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(idx)*32)).FpSchema + 8)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pTab uintptr = (*HashElem)(unsafe.Pointer(i)).Fdata if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW { Xsqlite3DeleteColumnNames(tls, db, pTab) } } *(*U16)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(idx)*32)).FpSchema + 114)) &= libc.Uint16FromInt32(libc.CplInt32(DB_UnresetViews)) } // This function is called by the VDBE to adjust the internal schema // used by SQLite when the btree layer moves a table root page. The // root-page of a table or index in database iDb has changed from iFrom // to iTo. // // Ticket #1728: The symbol table might still contain information // on tables and/or indices that are the process of being deleted. // If you are unlucky, one of those deleted indices or tables might // have the same rootpage number as the real table or index that is // being moved. So we cannot stop searching after the first match // because the first match might be for one of the deleted indices // or tables and not the table/index that is actually being moved. // We must continue looping until all tables and indices with // rootpage==iFrom have been converted to have a rootpage of iTo // in order to be certain that we got the right one. func Xsqlite3RootPageMoved(tls *libc.TLS, db uintptr, iDb int32, iFrom Pgno, iTo Pgno) { var pElem uintptr var pHash uintptr var pDb uintptr pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 pHash = (*Db)(unsafe.Pointer(pDb)).FpSchema + 8 for pElem = (*Hash)(unsafe.Pointer(pHash)).Ffirst; pElem != 0; pElem = (*HashElem)(unsafe.Pointer(pElem)).Fnext { var pTab uintptr = (*HashElem)(unsafe.Pointer(pElem)).Fdata if (*Table)(unsafe.Pointer(pTab)).Ftnum == iFrom { (*Table)(unsafe.Pointer(pTab)).Ftnum = iTo } } pHash = (*Db)(unsafe.Pointer(pDb)).FpSchema + 32 for pElem = (*Hash)(unsafe.Pointer(pHash)).Ffirst; pElem != 0; pElem = (*HashElem)(unsafe.Pointer(pElem)).Fnext { var pIdx uintptr = (*HashElem)(unsafe.Pointer(pElem)).Fdata if (*Index)(unsafe.Pointer(pIdx)).Ftnum == iFrom { (*Index)(unsafe.Pointer(pIdx)).Ftnum = iTo } } } func destroyRootPage(tls *libc.TLS, pParse uintptr, iTable int32, iDb int32) { bp := tls.Alloc(32) defer tls.Free(32) var v uintptr = Xsqlite3GetVdbe(tls, pParse) var r1 int32 = Xsqlite3GetTempReg(tls, pParse) if iTable < 2 { Xsqlite3ErrorMsg(tls, pParse, ts+14621, 0) } Xsqlite3VdbeAddOp3(tls, v, OP_Destroy, iTable, r1, iDb) Xsqlite3MayAbort(tls, pParse) Xsqlite3NestedParse(tls, pParse, ts+14636, libc.VaList(bp, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb+uintptr(iDb)*32)).FzDbSName, iTable, r1, r1)) Xsqlite3ReleaseTempReg(tls, pParse, r1) } func destroyTable(tls *libc.TLS, pParse uintptr, pTab uintptr) { var iTab Pgno = (*Table)(unsafe.Pointer(pTab)).Ftnum var iDestroyed Pgno = Pgno(0) for 1 != 0 { var pIdx uintptr var iLargest Pgno = Pgno(0) if iDestroyed == Pgno(0) || iTab < iDestroyed { iLargest = iTab } for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { var iIdx Pgno = (*Index)(unsafe.Pointer(pIdx)).Ftnum if (iDestroyed == Pgno(0) || iIdx < iDestroyed) && iIdx > iLargest { iLargest = iIdx } } if iLargest == Pgno(0) { return } else { var iDb int32 = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Table)(unsafe.Pointer(pTab)).FpSchema) destroyRootPage(tls, pParse, int32(iLargest), iDb) iDestroyed = iLargest } } } func sqlite3ClearStatTables(tls *libc.TLS, pParse uintptr, iDb int32, zType uintptr, zName uintptr) { bp := tls.Alloc(64) defer tls.Free(64) var i int32 var zDbName uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb + uintptr(iDb)*32)).FzDbSName for i = 1; i <= 4; i++ { Xsqlite3_snprintf(tls, int32(unsafe.Sizeof([24]int8{})), bp+40, ts+14703, libc.VaList(bp, i)) if Xsqlite3FindTable(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, bp+40, zDbName) != 0 { Xsqlite3NestedParse(tls, pParse, ts+12652, libc.VaList(bp+8, zDbName, bp+40, zType, zName)) } } } // Generate code to drop a table. func Xsqlite3CodeDropTable(tls *libc.TLS, pParse uintptr, pTab uintptr, iDb int32, isView int32) { bp := tls.Alloc(32) defer tls.Free(32) var v uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTrigger uintptr var pDb uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 v = Xsqlite3GetVdbe(tls, pParse) Xsqlite3BeginWriteOperation(tls, pParse, 1, iDb) if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { Xsqlite3VdbeAddOp0(tls, v, OP_VBegin) } pTrigger = Xsqlite3TriggerList(tls, pParse, pTab) for pTrigger != 0 { Xsqlite3DropTriggerPtr(tls, pParse, pTrigger) pTrigger = (*Trigger)(unsafe.Pointer(pTrigger)).FpNext } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Autoincrement) != 0 { Xsqlite3NestedParse(tls, pParse, ts+14717, libc.VaList(bp, (*Db)(unsafe.Pointer(pDb)).FzDbSName, (*Table)(unsafe.Pointer(pTab)).FzName)) } Xsqlite3NestedParse(tls, pParse, ts+14762, libc.VaList(bp+16, (*Db)(unsafe.Pointer(pDb)).FzDbSName, (*Table)(unsafe.Pointer(pTab)).FzName)) if !(isView != 0) && !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { destroyTable(tls, pParse, pTab) } if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { Xsqlite3VdbeAddOp4(tls, v, OP_VDestroy, iDb, 0, 0, (*Table)(unsafe.Pointer(pTab)).FzName, 0) Xsqlite3MayAbort(tls, pParse) } Xsqlite3VdbeAddOp4(tls, v, OP_DropTable, iDb, 0, 0, (*Table)(unsafe.Pointer(pTab)).FzName, 0) Xsqlite3ChangeCookie(tls, pParse, iDb) sqliteViewResetAll(tls, db, iDb) } // Return TRUE if shadow tables should be read-only in the current // context. func Xsqlite3ReadOnlyShadowTables(tls *libc.TLS, db uintptr) int32 { if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_Defensive) != uint64(0) && (*Sqlite3)(unsafe.Pointer(db)).FpVtabCtx == uintptr(0) && (*Sqlite3)(unsafe.Pointer(db)).FnVdbeExec == 0 && !((*Sqlite3)(unsafe.Pointer(db)).FnVTrans > 0 && (*Sqlite3)(unsafe.Pointer(db)).FaVTrans == uintptr(0)) { return 1 } return 0 } func tableMayNotBeDropped(tls *libc.TLS, db uintptr, pTab uintptr) int32 { if Xsqlite3_strnicmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName, ts+7733, 7) == 0 { if Xsqlite3_strnicmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName+uintptr(7), ts+14829, 4) == 0 { return 0 } if Xsqlite3_strnicmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName+uintptr(7), ts+8474, 10) == 0 { return 0 } return 1 } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Shadow) != U32(0) && Xsqlite3ReadOnlyShadowTables(tls, db) != 0 { return 1 } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Eponymous) != 0 { return 1 } return 0 } // This routine is called to do the work of a DROP TABLE statement. // pName is the name of the table to be dropped. func Xsqlite3DropTable(tls *libc.TLS, pParse uintptr, pName uintptr, isView int32, noErr int32) { bp := tls.Alloc(24) defer tls.Free(24) var pTab uintptr var v uintptr var db uintptr var iDb int32 var code int32 var zTab uintptr var zDb uintptr var zArg2 uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __1 } goto exit_drop_table __1: ; if !(Xsqlite3ReadSchema(tls, pParse) != 0) { goto __2 } goto exit_drop_table __2: ; if !(noErr != 0) { goto __3 } (*Sqlite3)(unsafe.Pointer(db)).FsuppressErr++ __3: ; pTab = Xsqlite3LocateTableItem(tls, pParse, uint32(isView), pName+8) if !(noErr != 0) { goto __4 } (*Sqlite3)(unsafe.Pointer(db)).FsuppressErr-- __4: ; if !(pTab == uintptr(0)) { goto __5 } if !(noErr != 0) { goto __6 } Xsqlite3CodeVerifyNamedSchema(tls, pParse, (*SrcItem)(unsafe.Pointer(pName+8)).FzDatabase) sqlite3ForceNotReadOnly(tls, pParse) __6: ; goto exit_drop_table __5: ; iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB && Xsqlite3ViewGetColumnNames(tls, pParse, pTab) != 0) { goto __7 } goto exit_drop_table __7: ; zTab = func() uintptr { if !(0 != 0) && iDb == 1 { return ts + 7741 } return ts + 7235 }() zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName zArg2 = uintptr(0) if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_DELETE, zTab, uintptr(0), zDb) != 0) { goto __8 } goto exit_drop_table __8: ; if !(isView != 0) { goto __9 } if !(!(0 != 0) && iDb == 1) { goto __11 } code = SQLITE_DROP_TEMP_VIEW goto __12 __11: code = SQLITE_DROP_VIEW __12: ; goto __10 __9: if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __13 } code = SQLITE_DROP_VTABLE zArg2 = (*Module)(unsafe.Pointer((*VTable)(unsafe.Pointer(Xsqlite3GetVTable(tls, db, pTab))).FpMod)).FzName goto __14 __13: if !(!(0 != 0) && iDb == 1) { goto __15 } code = SQLITE_DROP_TEMP_TABLE goto __16 __15: code = SQLITE_DROP_TABLE __16: ; __14: ; __10: ; if !(Xsqlite3AuthCheck(tls, pParse, code, (*Table)(unsafe.Pointer(pTab)).FzName, zArg2, zDb) != 0) { goto __17 } goto exit_drop_table __17: ; if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_DELETE, (*Table)(unsafe.Pointer(pTab)).FzName, uintptr(0), zDb) != 0) { goto __18 } goto exit_drop_table __18: ; if !(tableMayNotBeDropped(tls, db, pTab) != 0) { goto __19 } Xsqlite3ErrorMsg(tls, pParse, ts+14834, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) goto exit_drop_table __19: ; if !(isView != 0 && !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW)) { goto __20 } Xsqlite3ErrorMsg(tls, pParse, ts+14862, libc.VaList(bp+8, (*Table)(unsafe.Pointer(pTab)).FzName)) goto exit_drop_table __20: ; if !(!(isView != 0) && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __21 } Xsqlite3ErrorMsg(tls, pParse, ts+14896, libc.VaList(bp+16, (*Table)(unsafe.Pointer(pTab)).FzName)) goto exit_drop_table __21: ; v = Xsqlite3GetVdbe(tls, pParse) if !(v != 0) { goto __22 } Xsqlite3BeginWriteOperation(tls, pParse, 1, iDb) if !!(isView != 0) { goto __23 } sqlite3ClearStatTables(tls, pParse, iDb, ts+12844, (*Table)(unsafe.Pointer(pTab)).FzName) Xsqlite3FkDropTable(tls, pParse, pName, pTab) __23: ; Xsqlite3CodeDropTable(tls, pParse, pTab, iDb, isView) __22: ; exit_drop_table: Xsqlite3SrcListDelete(tls, db, pName) } // This routine is called to create a new foreign key on the table // currently under construction. pFromCol determines which columns // in the current table point to the foreign key. If pFromCol==0 then // connect the key to the last column inserted. pTo is the name of // the table referred to (a.k.a the "parent" table). pToCol is a list // of tables in the parent pTo table. flags contains all // information about the conflict resolution algorithms specified // in the ON DELETE, ON UPDATE and ON INSERT clauses. // // An FKey structure is created and added to the table currently // under construction in the pParse->pNewTable field. // // The foreign key is set for IMMEDIATE processing. A subsequent call // to sqlite3DeferForeignKey() might change this to DEFERRED. func Xsqlite3CreateForeignKey(tls *libc.TLS, pParse uintptr, pFromCol uintptr, pTo uintptr, pToCol uintptr, flags int32) { bp := tls.Alloc(24) defer tls.Free(24) var db uintptr var pFKey uintptr var pNextTo uintptr var p uintptr var nByte I64 var i int32 var nCol int32 var z uintptr var iCol int32 var j int32 var n int32 db = (*Parse)(unsafe.Pointer(pParse)).Fdb pFKey = uintptr(0) p = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if !(p == uintptr(0) || int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) == PARSE_MODE_DECLARE_VTAB) { goto __1 } goto fk_end __1: ; if !(pFromCol == uintptr(0)) { goto __2 } iCol = int32((*Table)(unsafe.Pointer(p)).FnCol) - 1 if !(iCol < 0) { goto __4 } goto fk_end __4: ; if !(pToCol != 0 && (*ExprList)(unsafe.Pointer(pToCol)).FnExpr != 1) { goto __5 } Xsqlite3ErrorMsg(tls, pParse, ts+14928, libc.VaList(bp, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(p)).FaCol+uintptr(iCol)*24)).FzCnName, pTo)) goto fk_end __5: ; nCol = 1 goto __3 __2: if !(pToCol != 0 && (*ExprList)(unsafe.Pointer(pToCol)).FnExpr != (*ExprList)(unsafe.Pointer(pFromCol)).FnExpr) { goto __6 } Xsqlite3ErrorMsg(tls, pParse, ts+14991, 0) goto fk_end goto __7 __6: nCol = (*ExprList)(unsafe.Pointer(pFromCol)).FnExpr __7: ; __3: ; nByte = I64(uint64(unsafe.Sizeof(FKey{})) + uint64(nCol-1)*uint64(unsafe.Sizeof(sColMap{})) + uint64((*Token)(unsafe.Pointer(pTo)).Fn) + uint64(1)) if !(pToCol != 0) { goto __8 } i = 0 __9: if !(i < (*ExprList)(unsafe.Pointer(pToCol)).FnExpr) { goto __11 } nByte = nByte + I64(Xsqlite3Strlen30(tls, (*ExprList_item)(unsafe.Pointer(pToCol+8+uintptr(i)*32)).FzEName)+1) goto __10 __10: i++ goto __9 goto __11 __11: ; __8: ; pFKey = Xsqlite3DbMallocZero(tls, db, uint64(nByte)) if !(pFKey == uintptr(0)) { goto __12 } goto fk_end __12: ; (*FKey)(unsafe.Pointer(pFKey)).FpFrom = p (*FKey)(unsafe.Pointer(pFKey)).FpNextFrom = *(*uintptr)(unsafe.Pointer(p + 64 + 8)) z = pFKey + 64 + uintptr(nCol)*16 (*FKey)(unsafe.Pointer(pFKey)).FzTo = z if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __13 } Xsqlite3RenameTokenMap(tls, pParse, z, pTo) __13: ; libc.Xmemcpy(tls, z, (*Token)(unsafe.Pointer(pTo)).Fz, uint64((*Token)(unsafe.Pointer(pTo)).Fn)) *(*int8)(unsafe.Pointer(z + uintptr((*Token)(unsafe.Pointer(pTo)).Fn))) = int8(0) Xsqlite3Dequote(tls, z) z += uintptr((*Token)(unsafe.Pointer(pTo)).Fn + uint32(1)) (*FKey)(unsafe.Pointer(pFKey)).FnCol = nCol if !(pFromCol == uintptr(0)) { goto __14 } (*sColMap)(unsafe.Pointer(pFKey + 64)).FiFrom = int32((*Table)(unsafe.Pointer(p)).FnCol) - 1 goto __15 __14: i = 0 __16: if !(i < nCol) { goto __18 } j = 0 __19: if !(j < int32((*Table)(unsafe.Pointer(p)).FnCol)) { goto __21 } if !(Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(p)).FaCol+uintptr(j)*24)).FzCnName, (*ExprList_item)(unsafe.Pointer(pFromCol+8+uintptr(i)*32)).FzEName) == 0) { goto __22 } (*sColMap)(unsafe.Pointer(pFKey + 64 + uintptr(i)*16)).FiFrom = j goto __21 __22: ; goto __20 __20: j++ goto __19 goto __21 __21: ; if !(j >= int32((*Table)(unsafe.Pointer(p)).FnCol)) { goto __23 } Xsqlite3ErrorMsg(tls, pParse, ts+15085, libc.VaList(bp+16, (*ExprList_item)(unsafe.Pointer(pFromCol+8+uintptr(i)*32)).FzEName)) goto fk_end __23: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __24 } Xsqlite3RenameTokenRemap(tls, pParse, pFKey+64+uintptr(i)*16, (*ExprList_item)(unsafe.Pointer(pFromCol+8+uintptr(i)*32)).FzEName) __24: ; goto __17 __17: i++ goto __16 goto __18 __18: ; __15: ; if !(pToCol != 0) { goto __25 } i = 0 __26: if !(i < nCol) { goto __28 } n = Xsqlite3Strlen30(tls, (*ExprList_item)(unsafe.Pointer(pToCol+8+uintptr(i)*32)).FzEName) (*sColMap)(unsafe.Pointer(pFKey + 64 + uintptr(i)*16)).FzCol = z if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __29 } Xsqlite3RenameTokenRemap(tls, pParse, z, (*ExprList_item)(unsafe.Pointer(pToCol+8+uintptr(i)*32)).FzEName) __29: ; libc.Xmemcpy(tls, z, (*ExprList_item)(unsafe.Pointer(pToCol+8+uintptr(i)*32)).FzEName, uint64(n)) *(*int8)(unsafe.Pointer(z + uintptr(n))) = int8(0) z += uintptr(n + 1) goto __27 __27: i++ goto __26 goto __28 __28: ; __25: ; (*FKey)(unsafe.Pointer(pFKey)).FisDeferred = U8(0) *(*U8)(unsafe.Pointer(pFKey + 45)) = U8(flags & 0xff) *(*U8)(unsafe.Pointer(pFKey + 45 + 1)) = U8(flags >> 8 & 0xff) pNextTo = Xsqlite3HashInsert(tls, (*Table)(unsafe.Pointer(p)).FpSchema+80, (*FKey)(unsafe.Pointer(pFKey)).FzTo, pFKey) if !(pNextTo == pFKey) { goto __30 } Xsqlite3OomFault(tls, db) goto fk_end __30: ; if !(pNextTo != 0) { goto __31 } (*FKey)(unsafe.Pointer(pFKey)).FpNextTo = pNextTo (*FKey)(unsafe.Pointer(pNextTo)).FpPrevTo = pFKey __31: ; *(*uintptr)(unsafe.Pointer(p + 64 + 8)) = pFKey pFKey = uintptr(0) fk_end: Xsqlite3DbFree(tls, db, pFKey) Xsqlite3ExprListDelete(tls, db, pFromCol) Xsqlite3ExprListDelete(tls, db, pToCol) } // This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED // clause is seen as part of a foreign key definition. The isDeferred // parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE. // The behavior of the most recently created foreign key is adjusted // accordingly. func Xsqlite3DeferForeignKey(tls *libc.TLS, pParse uintptr, isDeferred int32) { var pTab uintptr var pFKey uintptr if libc.AssignUintptr(&pTab, (*Parse)(unsafe.Pointer(pParse)).FpNewTable) == uintptr(0) { return } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM) { return } if libc.AssignUintptr(&pFKey, *(*uintptr)(unsafe.Pointer(pTab + 64 + 8))) == uintptr(0) { return } (*FKey)(unsafe.Pointer(pFKey)).FisDeferred = U8(isDeferred) } func sqlite3RefillIndex(tls *libc.TLS, pParse uintptr, pIndex uintptr, memRootPage int32) { bp := tls.Alloc(4) defer tls.Free(4) var pTab uintptr = (*Index)(unsafe.Pointer(pIndex)).FpTable var iTab int32 = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) var iIdx int32 = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) var iSorter int32 var addr1 int32 var addr2 int32 var tnum Pgno var v uintptr var pKey uintptr var regRecord int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var iDb int32 = Xsqlite3SchemaToIndex(tls, db, (*Index)(unsafe.Pointer(pIndex)).FpSchema) if Xsqlite3AuthCheck(tls, pParse, SQLITE_REINDEX, (*Index)(unsafe.Pointer(pIndex)).FzName, uintptr(0), (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) != 0 { return } Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab)).Ftnum, uint8(1), (*Table)(unsafe.Pointer(pTab)).FzName) v = Xsqlite3GetVdbe(tls, pParse) if v == uintptr(0) { return } if memRootPage >= 0 { tnum = Pgno(memRootPage) } else { tnum = (*Index)(unsafe.Pointer(pIndex)).Ftnum } pKey = Xsqlite3KeyInfoOfIndex(tls, pParse, pIndex) iSorter = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) Xsqlite3VdbeAddOp4(tls, v, OP_SorterOpen, iSorter, 0, int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol), Xsqlite3KeyInfoRef(tls, pKey), -8) Xsqlite3OpenTable(tls, pParse, iTab, iDb, pTab, OP_OpenRead) addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, iTab, 0) regRecord = Xsqlite3GetTempReg(tls, pParse) Xsqlite3MultiWrite(tls, pParse) Xsqlite3GenerateIndexKey(tls, pParse, pIndex, iTab, regRecord, 0, bp, uintptr(0), 0) Xsqlite3VdbeAddOp2(tls, v, OP_SorterInsert, iSorter, regRecord) Xsqlite3ResolvePartIdxLabel(tls, pParse, *(*int32)(unsafe.Pointer(bp))) Xsqlite3VdbeAddOp2(tls, v, OP_Next, iTab, addr1+1) Xsqlite3VdbeJumpHere(tls, v, addr1) if memRootPage < 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Clear, int32(tnum), iDb) } Xsqlite3VdbeAddOp4(tls, v, OP_OpenWrite, iIdx, int32(tnum), iDb, pKey, -8) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_BULKCSR|func() int32 { if memRootPage >= 0 { return OPFLAG_P2ISREG } return 0 }())) addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_SorterSort, iSorter, 0) if int32((*Index)(unsafe.Pointer(pIndex)).FonError) != OE_None { var j2 int32 = Xsqlite3VdbeGoto(tls, v, 1) addr2 = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp4Int(tls, v, OP_SorterCompare, iSorter, j2, regRecord, int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol)) Xsqlite3UniqueConstraint(tls, pParse, OE_Abort, pIndex) Xsqlite3VdbeJumpHere(tls, v, j2) } else { Xsqlite3MayAbort(tls, pParse) addr2 = Xsqlite3VdbeCurrentAddr(tls, v) } Xsqlite3VdbeAddOp3(tls, v, OP_SorterData, iSorter, regRecord, iIdx) if !(int32(*(*uint16)(unsafe.Pointer(pIndex + 100))&0x200>>9) != 0) { Xsqlite3VdbeAddOp1(tls, v, OP_SeekEnd, iIdx) } Xsqlite3VdbeAddOp2(tls, v, OP_IdxInsert, iIdx, regRecord) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_USESEEKRESULT)) Xsqlite3ReleaseTempReg(tls, pParse, regRecord) Xsqlite3VdbeAddOp2(tls, v, OP_SorterNext, iSorter, addr2) Xsqlite3VdbeJumpHere(tls, v, addr1) Xsqlite3VdbeAddOp1(tls, v, OP_Close, iTab) Xsqlite3VdbeAddOp1(tls, v, OP_Close, iIdx) Xsqlite3VdbeAddOp1(tls, v, OP_Close, iSorter) } // Allocate heap space to hold an Index object with nCol columns. // // Increase the allocation size to provide an extra nExtra bytes // of 8-byte aligned space after the Index object and return a // pointer to this extra space in *ppExtra. func Xsqlite3AllocateIndexObject(tls *libc.TLS, db uintptr, nCol I16, nExtra int32, ppExtra uintptr) uintptr { var p uintptr var nByte int32 nByte = int32((uint64(unsafe.Sizeof(Index{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7)) + (uint64(unsafe.Sizeof(uintptr(0)))*uint64(nCol)+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7)) + (uint64(unsafe.Sizeof(LogEst(0)))*uint64(int32(nCol)+1)+uint64(unsafe.Sizeof(I16(0)))*uint64(nCol)+uint64(unsafe.Sizeof(U8(0)))*uint64(nCol)+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))) p = Xsqlite3DbMallocZero(tls, db, uint64(nByte+nExtra)) if p != 0 { var pExtra uintptr = p + uintptr((uint64(unsafe.Sizeof(Index{}))+uint64(7))&libc.Uint64FromInt32(libc.CplInt32(7))) (*Index)(unsafe.Pointer(p)).FazColl = pExtra pExtra += uintptr((uint64(unsafe.Sizeof(uintptr(0)))*uint64(nCol) + uint64(7)) & libc.Uint64FromInt32(libc.CplInt32(7))) (*Index)(unsafe.Pointer(p)).FaiRowLogEst = pExtra pExtra += uintptr(uint64(unsafe.Sizeof(LogEst(0))) * uint64(int32(nCol)+1)) (*Index)(unsafe.Pointer(p)).FaiColumn = pExtra pExtra += uintptr(uint64(unsafe.Sizeof(I16(0))) * uint64(nCol)) (*Index)(unsafe.Pointer(p)).FaSortOrder = pExtra (*Index)(unsafe.Pointer(p)).FnColumn = U16(nCol) (*Index)(unsafe.Pointer(p)).FnKeyCol = U16(int32(nCol) - 1) *(*uintptr)(unsafe.Pointer(ppExtra)) = p + uintptr(nByte) } return p } // If expression list pList contains an expression that was parsed with // an explicit "NULLS FIRST" or "NULLS LAST" clause, leave an error in // pParse and return non-zero. Otherwise, return zero. func Xsqlite3HasExplicitNulls(tls *libc.TLS, pParse uintptr, pList uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if pList != 0 { var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { if uint32(int32(*(*uint16)(unsafe.Pointer(pList + 8 + uintptr(i)*32 + 16 + 4))&0x20>>5)) != 0 { var sf U8 = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(i)*32)).Ffg.FsortFlags Xsqlite3ErrorMsg(tls, pParse, ts+15131, libc.VaList(bp, func() uintptr { if int32(sf) == 0 || int32(sf) == 3 { return ts + 15159 } return ts + 15165 }())) return 1 } } } return 0 } // Create a new index for an SQL table. pName1.pName2 is the name of the index // and pTblList is the name of the table that is to be indexed. Both will // be NULL for a primary key or an index that is created to satisfy a // UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable // as the table to be indexed. pParse->pNewTable is a table that is // currently being constructed by a CREATE TABLE statement. // // pList is a list of columns to be indexed. pList will be NULL if this // is a primary key or unique-constraint on the most recent column added // to the table currently under construction. func Xsqlite3CreateIndex(tls *libc.TLS, pParse uintptr, pName1 uintptr, pName2 uintptr, pTblName uintptr, pList uintptr, onError int32, pStart uintptr, pPIWhere uintptr, sortOrder int32, ifNotExist int32, idxType U8) { bp := tls.Alloc(256) defer tls.Free(256) var pTab uintptr var pIndex uintptr var zName uintptr var nName int32 var i int32 var j int32 var sortOrderMask int32 var db uintptr var pDb uintptr var iDb int32 var pListItem uintptr var nExtra int32 var nExtraCol int32 var pPk uintptr var n int32 var pLoop uintptr var zDb uintptr var pCol uintptr var pExpr uintptr var nColl int32 var pCExpr uintptr var requestedSortOrder int32 var zColl uintptr var x int32 var z1 uintptr var z2 uintptr var k int32 var pIdx uintptr var p uintptr var n1 int32 var v uintptr var zStmt uintptr var iMem int32 var pNext uintptr var ppFrom uintptr var pThis uintptr pTab = uintptr(0) pIndex = uintptr(0) zName = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb *(*uintptr)(unsafe.Pointer(bp + 128)) = uintptr(0) nExtra = 0 *(*uintptr)(unsafe.Pointer(bp + 248)) = uintptr(0) pPk = uintptr(0) if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __1 } goto exit_create_index __1: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) == PARSE_MODE_DECLARE_VTAB && int32(idxType) != SQLITE_IDXTYPE_PRIMARYKEY) { goto __2 } goto exit_create_index __2: ; if !(SQLITE_OK != Xsqlite3ReadSchema(tls, pParse)) { goto __3 } goto exit_create_index __3: ; if !(Xsqlite3HasExplicitNulls(tls, pParse, pList) != 0) { goto __4 } goto exit_create_index __4: ; if !(pTblName != uintptr(0)) { goto __5 } iDb = Xsqlite3TwoPartName(tls, pParse, pName1, pName2, bp+128) if !(iDb < 0) { goto __7 } goto exit_create_index __7: ; if !!(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) { goto __8 } pTab = Xsqlite3SrcListLookup(tls, pParse, pTblName) if !((*Token)(unsafe.Pointer(pName2)).Fn == uint32(0) && pTab != 0 && (*Table)(unsafe.Pointer(pTab)).FpSchema == (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema) { goto __9 } iDb = 1 __9: ; __8: ; Xsqlite3FixInit(tls, bp+136, pParse, iDb, ts+15170, *(*uintptr)(unsafe.Pointer(bp + 128))) if !(Xsqlite3FixSrcList(tls, bp+136, pTblName) != 0) { goto __10 } __10: ; pTab = Xsqlite3LocateTableItem(tls, pParse, uint32(0), pTblName+8) if !(pTab == uintptr(0)) { goto __11 } goto exit_create_index __11: ; if !(iDb == 1 && (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema != (*Table)(unsafe.Pointer(pTab)).FpSchema) { goto __12 } Xsqlite3ErrorMsg(tls, pParse, ts+15176, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) goto exit_create_index __12: ; if !!((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __13 } pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) __13: ; goto __6 __5: ; pTab = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if !!(pTab != 0) { goto __14 } goto exit_create_index __14: ; iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) __6: ; pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 if !(Xsqlite3_strnicmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName, ts+7733, 7) == 0 && int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) == 0 && pTblName != uintptr(0)) { goto __15 } Xsqlite3ErrorMsg(tls, pParse, ts+15226, libc.VaList(bp+8, (*Table)(unsafe.Pointer(pTab)).FzName)) goto exit_create_index __15: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __16 } Xsqlite3ErrorMsg(tls, pParse, ts+15254, 0) goto exit_create_index __16: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __17 } Xsqlite3ErrorMsg(tls, pParse, ts+15279, 0) goto exit_create_index __17: ; if !(*(*uintptr)(unsafe.Pointer(bp + 128)) != 0) { goto __18 } zName = Xsqlite3NameFromToken(tls, db, *(*uintptr)(unsafe.Pointer(bp + 128))) if !(zName == uintptr(0)) { goto __20 } goto exit_create_index __20: ; if !(SQLITE_OK != Xsqlite3CheckObjectName(tls, pParse, zName, ts+15170, (*Table)(unsafe.Pointer(pTab)).FzName)) { goto __21 } goto exit_create_index __21: ; if !!(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __22 } if !!(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) { goto __23 } if !(Xsqlite3FindTable(tls, db, zName, (*Db)(unsafe.Pointer(pDb)).FzDbSName) != uintptr(0)) { goto __24 } Xsqlite3ErrorMsg(tls, pParse, ts+15313, libc.VaList(bp+16, zName)) goto exit_create_index __24: ; __23: ; if !(Xsqlite3FindIndex(tls, db, zName, (*Db)(unsafe.Pointer(pDb)).FzDbSName) != uintptr(0)) { goto __25 } if !!(ifNotExist != 0) { goto __26 } Xsqlite3ErrorMsg(tls, pParse, ts+15347, libc.VaList(bp+24, zName)) goto __27 __26: ; Xsqlite3CodeVerifySchema(tls, pParse, iDb) sqlite3ForceNotReadOnly(tls, pParse) __27: ; goto exit_create_index __25: ; __22: ; goto __19 __18: pLoop = (*Table)(unsafe.Pointer(pTab)).FpIndex n = 1 __28: if !(pLoop != 0) { goto __30 } goto __29 __29: pLoop = (*Index)(unsafe.Pointer(pLoop)).FpNext n++ goto __28 goto __30 __30: ; zName = Xsqlite3MPrintf(tls, db, ts+15371, libc.VaList(bp+32, (*Table)(unsafe.Pointer(pTab)).FzName, n)) if !(zName == uintptr(0)) { goto __31 } goto exit_create_index __31: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) != PARSE_MODE_NORMAL) { goto __32 } *(*int8)(unsafe.Pointer(zName + 7))++ __32: ; __19: ; if !!(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __33 } zDb = (*Db)(unsafe.Pointer(pDb)).FzDbSName if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_INSERT, func() uintptr { if !(0 != 0) && iDb == 1 { return ts + 7741 } return ts + 7235 }(), uintptr(0), zDb) != 0) { goto __34 } goto exit_create_index __34: ; i = SQLITE_CREATE_INDEX if !(!(0 != 0) && iDb == 1) { goto __35 } i = SQLITE_CREATE_TEMP_INDEX __35: ; if !(Xsqlite3AuthCheck(tls, pParse, i, zName, (*Table)(unsafe.Pointer(pTab)).FzName, zDb) != 0) { goto __36 } goto exit_create_index __36: ; __33: ; if !(pList == uintptr(0)) { goto __37 } pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(int32((*Table)(unsafe.Pointer(pTab)).FnCol)-1)*24 *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_UNIQUE) Xsqlite3TokenInit(tls, bp+232, (*Column)(unsafe.Pointer(pCol)).FzCnName) pList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), Xsqlite3ExprAlloc(tls, db, TK_ID, bp+232, 0)) if !(pList == uintptr(0)) { goto __39 } goto exit_create_index __39: ; Xsqlite3ExprListSetSortOrder(tls, pList, sortOrder, -1) goto __38 __37: Xsqlite3ExprListCheckLength(tls, pParse, pList, ts+15170) if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __40 } goto exit_create_index __40: ; __38: ; i = 0 __41: if !(i < (*ExprList)(unsafe.Pointer(pList)).FnExpr) { goto __43 } pExpr = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(i)*32)).FpExpr if !(int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLLATE) { goto __44 } nExtra = nExtra + (1 + Xsqlite3Strlen30(tls, *(*uintptr)(unsafe.Pointer(pExpr + 8)))) __44: ; goto __42 __42: i++ goto __41 goto __43 __43: ; nName = Xsqlite3Strlen30(tls, zName) if pPk != 0 { nExtraCol = int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol) } else { nExtraCol = 1 } pIndex = Xsqlite3AllocateIndexObject(tls, db, int16((*ExprList)(unsafe.Pointer(pList)).FnExpr+nExtraCol), nName+nExtra+1, bp+248) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __45 } goto exit_create_index __45: ; (*Index)(unsafe.Pointer(pIndex)).FzName = *(*uintptr)(unsafe.Pointer(bp + 248)) *(*uintptr)(unsafe.Pointer(bp + 248)) += uintptr(nName + 1) libc.Xmemcpy(tls, (*Index)(unsafe.Pointer(pIndex)).FzName, zName, uint64(nName+1)) (*Index)(unsafe.Pointer(pIndex)).FpTable = pTab (*Index)(unsafe.Pointer(pIndex)).FonError = U8(onError) libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(libc.Bool32(onError != OE_None)), 3, 0x8) libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(idxType), 0, 0x3) (*Index)(unsafe.Pointer(pIndex)).FpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema (*Index)(unsafe.Pointer(pIndex)).FnKeyCol = U16((*ExprList)(unsafe.Pointer(pList)).FnExpr) if !(pPIWhere != 0) { goto __46 } Xsqlite3ResolveSelfReference(tls, pParse, pTab, NC_PartIdx, pPIWhere, uintptr(0)) (*Index)(unsafe.Pointer(pIndex)).FpPartIdxWhere = pPIWhere pPIWhere = uintptr(0) __46: ; if !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Ffile_format) >= 4) { goto __47 } sortOrderMask = -1 goto __48 __47: sortOrderMask = 0 __48: ; pListItem = pList + 8 if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __49 } (*Index)(unsafe.Pointer(pIndex)).FaColExpr = pList pList = uintptr(0) __49: ; i = 0 __50: if !(i < int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol)) { goto __52 } sqlite3StringToId(tls, (*ExprList_item)(unsafe.Pointer(pListItem)).FpExpr) Xsqlite3ResolveSelfReference(tls, pParse, pTab, NC_IdxExpr, (*ExprList_item)(unsafe.Pointer(pListItem)).FpExpr, uintptr(0)) if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __53 } goto exit_create_index __53: ; pCExpr = Xsqlite3ExprSkipCollate(tls, (*ExprList_item)(unsafe.Pointer(pListItem)).FpExpr) if !(int32((*Expr)(unsafe.Pointer(pCExpr)).Fop) != TK_COLUMN) { goto __54 } if !(pTab == (*Parse)(unsafe.Pointer(pParse)).FpNewTable) { goto __56 } Xsqlite3ErrorMsg(tls, pParse, ts+15394, 0) goto exit_create_index __56: ; if !((*Index)(unsafe.Pointer(pIndex)).FaColExpr == uintptr(0)) { goto __57 } (*Index)(unsafe.Pointer(pIndex)).FaColExpr = pList pList = uintptr(0) __57: ; j = -2 *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(i)*2)) = int16(-2) libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(0), 3, 0x8) libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(1), 11, 0x800) goto __55 __54: j = int32((*Expr)(unsafe.Pointer(pCExpr)).FiColumn) if !(j < 0) { goto __58 } j = int32((*Table)(unsafe.Pointer(pTab)).FiPKey) goto __59 __58: if !(int32(*(*uint8)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(j)*24 + 8))&0xf>>0) == 0) { goto __60 } libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(0), 3, 0x8) __60: ; if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_VIRTUAL != 0) { goto __61 } libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(1), 10, 0x400) libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(1), 11, 0x800) __61: ; __59: ; *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(i)*2)) = I16(j) __55: ; zColl = uintptr(0) if !(int32((*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pListItem)).FpExpr)).Fop) == TK_COLLATE) { goto __62 } zColl = *(*uintptr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pListItem)).FpExpr + 8)) nColl = Xsqlite3Strlen30(tls, zColl) + 1 libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp + 248)), zColl, uint64(nColl)) zColl = *(*uintptr)(unsafe.Pointer(bp + 248)) *(*uintptr)(unsafe.Pointer(bp + 248)) += uintptr(nColl) nExtra = nExtra - nColl goto __63 __62: if !(j >= 0) { goto __64 } zColl = Xsqlite3ColumnColl(tls, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24) __64: ; __63: ; if !!(zColl != 0) { goto __65 } zColl = uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) __65: ; if !(!(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) && !(Xsqlite3LocateCollSeq(tls, pParse, zColl) != 0)) { goto __66 } goto exit_create_index __66: ; *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FazColl + uintptr(i)*8)) = zColl requestedSortOrder = int32((*ExprList_item)(unsafe.Pointer(pListItem)).Ffg.FsortFlags) & sortOrderMask *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaSortOrder + uintptr(i))) = U8(requestedSortOrder) goto __51 __51: i++ pListItem += 32 goto __50 goto __52 __52: ; if !(pPk != 0) { goto __67 } j = 0 __69: if !(j < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) { goto __71 } x = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(j)*2))) if !(isDupColumn(tls, pIndex, int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol), pPk, j) != 0) { goto __72 } (*Index)(unsafe.Pointer(pIndex)).FnColumn-- goto __73 __72: ; *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(i)*2)) = I16(x) *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FazColl + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FazColl + uintptr(j)*8)) *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaSortOrder + uintptr(i))) = *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaSortOrder + uintptr(j))) i++ __73: ; goto __70 __70: j++ goto __69 goto __71 __71: ; goto __68 __67: *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(i)*2)) = int16(-1) *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FazColl + uintptr(i)*8)) = uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) __68: ; Xsqlite3DefaultRowEst(tls, pIndex) if !((*Parse)(unsafe.Pointer(pParse)).FpNewTable == uintptr(0)) { goto __74 } estimateIndexWidth(tls, pIndex) __74: ; recomputeColumnsNotIndexed(tls, pIndex) if !(pTblName != uintptr(0) && int32((*Index)(unsafe.Pointer(pIndex)).FnColumn) >= int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __75 } libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(1), 5, 0x20) j = 0 __76: if !(j < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __78 } if !(j == int32((*Table)(unsafe.Pointer(pTab)).FiPKey)) { goto __79 } goto __77 __79: ; if !(int32(Xsqlite3TableColumnToIndex(tls, pIndex, int16(j))) >= 0) { goto __80 } goto __77 __80: ; libc.SetBitFieldPtr16Uint32(pIndex+100, uint32(0), 5, 0x20) goto __78 goto __77 __77: j++ goto __76 goto __78 __78: ; __75: ; if !(pTab == (*Parse)(unsafe.Pointer(pParse)).FpNewTable) { goto __81 } pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __82: if !(pIdx != 0) { goto __84 } if !(int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) != int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol)) { goto __85 } goto __83 __85: ; k = 0 __86: if !(k < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)) { goto __88 } if !(int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(k)*2))) != int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(k)*2)))) { goto __89 } goto __88 __89: ; z1 = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(k)*8)) z2 = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FazColl + uintptr(k)*8)) if !(Xsqlite3StrICmp(tls, z1, z2) != 0) { goto __90 } goto __88 __90: ; goto __87 __87: k++ goto __86 goto __88 __88: ; if !(k == int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)) { goto __91 } if !(int32((*Index)(unsafe.Pointer(pIdx)).FonError) != int32((*Index)(unsafe.Pointer(pIndex)).FonError)) { goto __92 } if !!(int32((*Index)(unsafe.Pointer(pIdx)).FonError) == OE_Default || int32((*Index)(unsafe.Pointer(pIndex)).FonError) == OE_Default) { goto __93 } Xsqlite3ErrorMsg(tls, pParse, ts+15455, libc.VaList(bp+48, 0)) __93: ; if !(int32((*Index)(unsafe.Pointer(pIdx)).FonError) == OE_Default) { goto __94 } (*Index)(unsafe.Pointer(pIdx)).FonError = (*Index)(unsafe.Pointer(pIndex)).FonError __94: ; __92: ; if !(int32(idxType) == SQLITE_IDXTYPE_PRIMARYKEY) { goto __95 } libc.SetBitFieldPtr16Uint32(pIdx+100, uint32(idxType), 0, 0x3) __95: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __96 } (*Index)(unsafe.Pointer(pIndex)).FpNext = (*Parse)(unsafe.Pointer(pParse)).FpNewIndex (*Parse)(unsafe.Pointer(pParse)).FpNewIndex = pIndex pIndex = uintptr(0) __96: ; goto exit_create_index __91: ; goto __83 __83: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext goto __82 goto __84 __84: ; __81: ; if !!(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __97 } if !((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0) { goto __98 } if !(pTblName != uintptr(0)) { goto __100 } (*Index)(unsafe.Pointer(pIndex)).Ftnum = (*Sqlite3)(unsafe.Pointer(db)).Finit.FnewTnum if !(Xsqlite3IndexHasDuplicateRootPage(tls, pIndex) != 0) { goto __101 } Xsqlite3ErrorMsg(tls, pParse, ts+15497, 0) (*Parse)(unsafe.Pointer(pParse)).Frc = Xsqlite3CorruptError(tls, 121859) goto exit_create_index __101: ; __100: ; p = Xsqlite3HashInsert(tls, (*Index)(unsafe.Pointer(pIndex)).FpSchema+32, (*Index)(unsafe.Pointer(pIndex)).FzName, pIndex) if !(p != 0) { goto __102 } Xsqlite3OomFault(tls, db) goto exit_create_index __102: ; *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) goto __99 __98: if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) || pTblName != uintptr(0)) { goto __103 } iMem = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) v = Xsqlite3GetVdbe(tls, pParse) if !(v == uintptr(0)) { goto __104 } goto exit_create_index __104: ; Xsqlite3BeginWriteOperation(tls, pParse, 1, iDb) (*Index)(unsafe.Pointer(pIndex)).Ftnum = Pgno(Xsqlite3VdbeAddOp0(tls, v, OP_Noop)) Xsqlite3VdbeAddOp3(tls, v, OP_CreateBtree, iDb, iMem, BTREE_BLOBKEY) if !(pStart != 0) { goto __105 } n1 = int32(uint32(int32((int64((*Parse)(unsafe.Pointer(pParse)).FsLastToken.Fz)-int64((*Token)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 128)))).Fz))/1)) + (*Parse)(unsafe.Pointer(pParse)).FsLastToken.Fn) if !(int32(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 128)))).Fz + uintptr(n1-1)))) == ';') { goto __107 } n1-- __107: ; zStmt = Xsqlite3MPrintf(tls, db, ts+15514, libc.VaList(bp+56, func() uintptr { if onError == OE_None { return ts + 1544 } return ts + 15534 }(), n1, (*Token)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 128)))).Fz)) goto __106 __105: zStmt = uintptr(0) __106: ; Xsqlite3NestedParse(tls, pParse, ts+15542, libc.VaList(bp+80, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, (*Index)(unsafe.Pointer(pIndex)).FzName, (*Table)(unsafe.Pointer(pTab)).FzName, iMem, zStmt)) Xsqlite3DbFree(tls, db, zStmt) if !(pTblName != 0) { goto __108 } sqlite3RefillIndex(tls, pParse, pIndex, iMem) Xsqlite3ChangeCookie(tls, pParse, iDb) Xsqlite3VdbeAddParseSchemaOp(tls, v, iDb, Xsqlite3MPrintf(tls, db, ts+15601, libc.VaList(bp+120, (*Index)(unsafe.Pointer(pIndex)).FzName)), uint16(0)) Xsqlite3VdbeAddOp2(tls, v, OP_Expire, 0, 1) __108: ; Xsqlite3VdbeJumpHere(tls, v, int32((*Index)(unsafe.Pointer(pIndex)).Ftnum)) __103: ; __99: ; __97: ; if !((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 || pTblName == uintptr(0)) { goto __109 } (*Index)(unsafe.Pointer(pIndex)).FpNext = (*Table)(unsafe.Pointer(pTab)).FpIndex (*Table)(unsafe.Pointer(pTab)).FpIndex = pIndex pIndex = uintptr(0) goto __110 __109: if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __111 } (*Parse)(unsafe.Pointer(pParse)).FpNewIndex = pIndex pIndex = uintptr(0) __111: ; __110: ; exit_create_index: if !(pIndex != 0) { goto __112 } Xsqlite3FreeIndex(tls, db, pIndex) __112: ; if !(pTab != 0) { goto __113 } ppFrom = pTab + 16 __114: if !(libc.AssignUintptr(&pThis, *(*uintptr)(unsafe.Pointer(ppFrom))) != uintptr(0)) { goto __116 } if !(int32((*Index)(unsafe.Pointer(pThis)).FonError) != OE_Replace) { goto __117 } goto __115 __117: ; __118: if !(libc.AssignUintptr(&pNext, (*Index)(unsafe.Pointer(pThis)).FpNext) != uintptr(0) && int32((*Index)(unsafe.Pointer(pNext)).FonError) != OE_Replace) { goto __119 } *(*uintptr)(unsafe.Pointer(ppFrom)) = pNext (*Index)(unsafe.Pointer(pThis)).FpNext = (*Index)(unsafe.Pointer(pNext)).FpNext (*Index)(unsafe.Pointer(pNext)).FpNext = pThis ppFrom = pNext + 40 goto __118 __119: ; goto __116 goto __115 __115: ppFrom = pThis + 40 goto __114 goto __116 __116: ; __113: ; Xsqlite3ExprDelete(tls, db, pPIWhere) Xsqlite3ExprListDelete(tls, db, pList) Xsqlite3SrcListDelete(tls, db, pTblName) Xsqlite3DbFree(tls, db, zName) } // Fill the Index.aiRowEst[] array with default information - information // to be used when we have not run the ANALYZE command. // // aiRowEst[0] is supposed to contain the number of elements in the index. // Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the // number of rows in the table that match any particular value of the // first column of the index. aiRowEst[2] is an estimate of the number // of rows that match any particular combination of the first 2 columns // of the index. And so forth. It must always be the case that // // aiRowEst[N]<=aiRowEst[N-1] // aiRowEst[N]>=1 // // Apart from that, we have little to go on besides intuition as to // how aiRowEst[] should be initialized. The numbers generated here // are based on typical values found in actual indices. func Xsqlite3DefaultRowEst(tls *libc.TLS, pIdx uintptr) { var a uintptr = (*Index)(unsafe.Pointer(pIdx)).FaiRowLogEst var x LogEst var nCopy int32 = func() int32 { if int32(uint64(unsafe.Sizeof(aVal))/uint64(unsafe.Sizeof(LogEst(0)))) < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) { return int32(uint64(unsafe.Sizeof(aVal)) / uint64(unsafe.Sizeof(LogEst(0)))) } return int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) }() var i int32 x = (*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FnRowLogEst if int32(x) < 99 { (*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FnRowLogEst = libc.AssignInt16(&x, int16(99)) } if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != uintptr(0) { x = int16(int32(x) - 10) } *(*LogEst)(unsafe.Pointer(a)) = x libc.Xmemcpy(tls, a+1*2, uintptr(unsafe.Pointer(&aVal)), uint64(nCopy)*uint64(unsafe.Sizeof(LogEst(0)))) for i = nCopy + 1; i <= int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol); i++ { *(*LogEst)(unsafe.Pointer(a + uintptr(i)*2)) = int16(23) } if int32((*Index)(unsafe.Pointer(pIdx)).FonError) != OE_None { *(*LogEst)(unsafe.Pointer(a + uintptr((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)*2)) = int16(0) } } var aVal = [5]LogEst{int16(33), int16(32), int16(30), int16(28), int16(26)} // This routine will drop an existing named index. This routine // implements the DROP INDEX statement. func Xsqlite3DropIndex(tls *libc.TLS, pParse uintptr, pName uintptr, ifExists int32) { bp := tls.Alloc(32) defer tls.Free(32) var pIndex uintptr var v uintptr var db uintptr var iDb int32 var code int32 var pTab uintptr var zDb uintptr var zTab uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __1 } goto exit_drop_index __1: ; if !(SQLITE_OK != Xsqlite3ReadSchema(tls, pParse)) { goto __2 } goto exit_drop_index __2: ; pIndex = Xsqlite3FindIndex(tls, db, (*SrcItem)(unsafe.Pointer(pName+8)).FzName, (*SrcItem)(unsafe.Pointer(pName+8)).FzDatabase) if !(pIndex == uintptr(0)) { goto __3 } if !!(ifExists != 0) { goto __4 } Xsqlite3ErrorMsg(tls, pParse, ts+15628, libc.VaList(bp, pName+8)) goto __5 __4: Xsqlite3CodeVerifyNamedSchema(tls, pParse, (*SrcItem)(unsafe.Pointer(pName+8)).FzDatabase) sqlite3ForceNotReadOnly(tls, pParse) __5: ; (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) goto exit_drop_index __3: ; if !(int32(*(*uint16)(unsafe.Pointer(pIndex + 100))&0x3>>0) != SQLITE_IDXTYPE_APPDEF) { goto __6 } Xsqlite3ErrorMsg(tls, pParse, ts+15646, libc.VaList(bp+8, 0)) goto exit_drop_index __6: ; iDb = Xsqlite3SchemaToIndex(tls, db, (*Index)(unsafe.Pointer(pIndex)).FpSchema) code = SQLITE_DROP_INDEX pTab = (*Index)(unsafe.Pointer(pIndex)).FpTable zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName zTab = func() uintptr { if !(0 != 0) && iDb == 1 { return ts + 7741 } return ts + 7235 }() if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_DELETE, zTab, uintptr(0), zDb) != 0) { goto __7 } goto exit_drop_index __7: ; if !(!(0 != 0) && iDb == 1) { goto __8 } code = SQLITE_DROP_TEMP_INDEX __8: ; if !(Xsqlite3AuthCheck(tls, pParse, code, (*Index)(unsafe.Pointer(pIndex)).FzName, (*Table)(unsafe.Pointer(pTab)).FzName, zDb) != 0) { goto __9 } goto exit_drop_index __9: ; v = Xsqlite3GetVdbe(tls, pParse) if !(v != 0) { goto __10 } Xsqlite3BeginWriteOperation(tls, pParse, 1, iDb) Xsqlite3NestedParse(tls, pParse, ts+15719, libc.VaList(bp+16, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, (*Index)(unsafe.Pointer(pIndex)).FzName)) sqlite3ClearStatTables(tls, pParse, iDb, ts+12840, (*Index)(unsafe.Pointer(pIndex)).FzName) Xsqlite3ChangeCookie(tls, pParse, iDb) destroyRootPage(tls, pParse, int32((*Index)(unsafe.Pointer(pIndex)).Ftnum), iDb) Xsqlite3VdbeAddOp4(tls, v, OP_DropIndex, iDb, 0, 0, (*Index)(unsafe.Pointer(pIndex)).FzName, 0) __10: ; exit_drop_index: Xsqlite3SrcListDelete(tls, db, pName) } // pArray is a pointer to an array of objects. Each object in the // array is szEntry bytes in size. This routine uses sqlite3DbRealloc() // to extend the array so that there is space for a new object at the end. // // When this function is called, *pnEntry contains the current size of // the array (in entries - so the allocation is ((*pnEntry) * szEntry) bytes // in total). // // If the realloc() is successful (i.e. if no OOM condition occurs), the // space allocated for the new object is zeroed, *pnEntry updated to // reflect the new size of the array and a pointer to the new allocation // returned. *pIdx is set to the index of the new array entry in this case. // // Otherwise, if the realloc() fails, *pIdx is set to -1, *pnEntry remains // unchanged and a copy of pArray returned. func Xsqlite3ArrayAllocate(tls *libc.TLS, db uintptr, pArray uintptr, szEntry int32, pnEntry uintptr, pIdx uintptr) uintptr { var z uintptr var n Sqlite3_int64 = Sqlite3_int64(libc.AssignPtrInt32(pIdx, *(*int32)(unsafe.Pointer(pnEntry)))) if n&(n-int64(1)) == int64(0) { var sz Sqlite3_int64 if n == int64(0) { sz = int64(1) } else { sz = int64(2) * n } var pNew uintptr = Xsqlite3DbRealloc(tls, db, pArray, uint64(sz*Sqlite3_int64(szEntry))) if pNew == uintptr(0) { *(*int32)(unsafe.Pointer(pIdx)) = -1 return pArray } pArray = pNew } z = pArray libc.Xmemset(tls, z+uintptr(n*Sqlite3_int64(szEntry)), 0, uint64(szEntry)) *(*int32)(unsafe.Pointer(pnEntry))++ return pArray } // Append a new element to the given IdList. Create a new IdList if // need be. // // A new IdList is returned, or NULL if malloc() fails. func Xsqlite3IdListAppend(tls *libc.TLS, pParse uintptr, pList uintptr, pToken uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var i int32 if pList == uintptr(0) { pList = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(IdList{}))) if pList == uintptr(0) { return uintptr(0) } } else { var pNew uintptr pNew = Xsqlite3DbRealloc(tls, db, pList, uint64(unsafe.Sizeof(IdList{}))+uint64((*IdList)(unsafe.Pointer(pList)).FnId)*uint64(unsafe.Sizeof([1]IdList_item{}))) if pNew == uintptr(0) { Xsqlite3IdListDelete(tls, db, pList) return uintptr(0) } pList = pNew } i = libc.PostIncInt32(&(*IdList)(unsafe.Pointer(pList)).FnId, 1) (*IdList_item)(unsafe.Pointer(pList + 8 + uintptr(i)*16)).FzName = Xsqlite3NameFromToken(tls, db, pToken) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && (*IdList_item)(unsafe.Pointer(pList+8+uintptr(i)*16)).FzName != 0 { Xsqlite3RenameTokenMap(tls, pParse, (*IdList_item)(unsafe.Pointer(pList+8+uintptr(i)*16)).FzName, pToken) } return pList } // Delete an IdList. func Xsqlite3IdListDelete(tls *libc.TLS, db uintptr, pList uintptr) { var i int32 if pList == uintptr(0) { return } for i = 0; i < (*IdList)(unsafe.Pointer(pList)).FnId; i++ { Xsqlite3DbFree(tls, db, (*IdList_item)(unsafe.Pointer(pList+8+uintptr(i)*16)).FzName) } Xsqlite3DbNNFreeNN(tls, db, pList) } // Return the index in pList of the identifier named zId. Return -1 // if not found. func Xsqlite3IdListIndex(tls *libc.TLS, pList uintptr, zName uintptr) int32 { var i int32 for i = 0; i < (*IdList)(unsafe.Pointer(pList)).FnId; i++ { if Xsqlite3StrICmp(tls, (*IdList_item)(unsafe.Pointer(pList+8+uintptr(i)*16)).FzName, zName) == 0 { return i } } return -1 } // Expand the space allocated for the given SrcList object by // creating nExtra new slots beginning at iStart. iStart is zero based. // New slots are zeroed. // // For example, suppose a SrcList initially contains two entries: A,B. // To append 3 new entries onto the end, do this: // // sqlite3SrcListEnlarge(db, pSrclist, 3, 2); // // After the call above it would contain: A, B, nil, nil, nil. // If the iStart argument had been 1 instead of 2, then the result // would have been: A, nil, nil, nil, B. To prepend the new slots, // the iStart value would be 0. The result then would // be: nil, nil, nil, A, B. // // If a memory allocation fails or the SrcList becomes too large, leave // the original SrcList unchanged, return NULL, and leave an error message // in pParse. func Xsqlite3SrcListEnlarge(tls *libc.TLS, pParse uintptr, pSrc uintptr, nExtra int32, iStart int32) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var i int32 if U32((*SrcList)(unsafe.Pointer(pSrc)).FnSrc)+U32(nExtra) > (*SrcList)(unsafe.Pointer(pSrc)).FnAlloc { var pNew uintptr var nAlloc Sqlite3_int64 = int64(2)*Sqlite3_int64((*SrcList)(unsafe.Pointer(pSrc)).FnSrc) + Sqlite3_int64(nExtra) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*SrcList)(unsafe.Pointer(pSrc)).FnSrc+nExtra >= SQLITE_MAX_SRCLIST { Xsqlite3ErrorMsg(tls, pParse, ts+15779, libc.VaList(bp, SQLITE_MAX_SRCLIST)) return uintptr(0) } if nAlloc > int64(SQLITE_MAX_SRCLIST) { nAlloc = int64(SQLITE_MAX_SRCLIST) } pNew = Xsqlite3DbRealloc(tls, db, pSrc, uint64(unsafe.Sizeof(SrcList{}))+uint64(nAlloc-int64(1))*uint64(unsafe.Sizeof(SrcItem{}))) if pNew == uintptr(0) { return uintptr(0) } pSrc = pNew (*SrcList)(unsafe.Pointer(pSrc)).FnAlloc = U32(nAlloc) } for i = (*SrcList)(unsafe.Pointer(pSrc)).FnSrc - 1; i >= iStart; i-- { *(*SrcItem)(unsafe.Pointer(pSrc + 8 + uintptr(i+nExtra)*104)) = *(*SrcItem)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104)) } *(*int32)(unsafe.Pointer(pSrc)) += nExtra libc.Xmemset(tls, pSrc+8+uintptr(iStart)*104, 0, uint64(unsafe.Sizeof(SrcItem{}))*uint64(nExtra)) for i = iStart; i < iStart+nExtra; i++ { (*SrcItem)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104)).FiCursor = -1 } return pSrc } // Append a new table name to the given SrcList. Create a new SrcList if // need be. A new entry is created in the SrcList even if pTable is NULL. // // A SrcList is returned, or NULL if there is an OOM error or if the // SrcList grows to large. The returned // SrcList might be the same as the SrcList that was input or it might be // a new one. If an OOM error does occurs, then the prior value of pList // that is input to this routine is automatically freed. // // If pDatabase is not null, it means that the table has an optional // database name prefix. Like this: "database.table". The pDatabase // points to the table name and the pTable points to the database name. // The SrcList.a[].zName field is filled with the table name which might // come from pTable (if pDatabase is NULL) or from pDatabase. // SrcList.a[].zDatabase is filled with the database name from pTable, // or with NULL if no database is specified. // // In other words, if call like this: // // sqlite3SrcListAppend(D,A,B,0); // // Then B is a table name and the database name is unspecified. If called // like this: // // sqlite3SrcListAppend(D,A,B,C); // // Then C is the table name and B is the database name. If C is defined // then so is B. In other words, we never have a case where: // // sqlite3SrcListAppend(D,A,0,C); // // Both pTable and pDatabase are assumed to be quoted. They are dequoted // before being added to the SrcList. func Xsqlite3SrcListAppend(tls *libc.TLS, pParse uintptr, pList uintptr, pTable uintptr, pDatabase uintptr) uintptr { var pItem uintptr var db uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb if pList == uintptr(0) { pList = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(SrcList{}))) if pList == uintptr(0) { return uintptr(0) } (*SrcList)(unsafe.Pointer(pList)).FnAlloc = U32(1) (*SrcList)(unsafe.Pointer(pList)).FnSrc = 1 libc.Xmemset(tls, pList+8, 0, uint64(unsafe.Sizeof(SrcItem{}))) (*SrcItem)(unsafe.Pointer(pList + 8)).FiCursor = -1 } else { var pNew uintptr = Xsqlite3SrcListEnlarge(tls, pParse, pList, 1, (*SrcList)(unsafe.Pointer(pList)).FnSrc) if pNew == uintptr(0) { Xsqlite3SrcListDelete(tls, db, pList) return uintptr(0) } else { pList = pNew } } pItem = pList + 8 + uintptr((*SrcList)(unsafe.Pointer(pList)).FnSrc-1)*104 if pDatabase != 0 && (*Token)(unsafe.Pointer(pDatabase)).Fz == uintptr(0) { pDatabase = uintptr(0) } if pDatabase != 0 { (*SrcItem)(unsafe.Pointer(pItem)).FzName = Xsqlite3NameFromToken(tls, db, pDatabase) (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase = Xsqlite3NameFromToken(tls, db, pTable) } else { (*SrcItem)(unsafe.Pointer(pItem)).FzName = Xsqlite3NameFromToken(tls, db, pTable) (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase = uintptr(0) } return pList } // Assign VdbeCursor index numbers to all tables in a SrcList func Xsqlite3SrcListAssignCursors(tls *libc.TLS, pParse uintptr, pList uintptr) { var i int32 var pItem uintptr if pList != 0 { i = 0 pItem = pList + 8 __1: if !(i < (*SrcList)(unsafe.Pointer(pList)).FnSrc) { goto __3 } { if (*SrcItem)(unsafe.Pointer(pItem)).FiCursor >= 0 { goto __2 } (*SrcItem)(unsafe.Pointer(pItem)).FiCursor = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) if (*SrcItem)(unsafe.Pointer(pItem)).FpSelect != 0 { Xsqlite3SrcListAssignCursors(tls, pParse, (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpSelect)).FpSrc) } } goto __2 __2: i++ pItem += 104 goto __1 goto __3 __3: } } // Delete an entire SrcList including all its substructure. func Xsqlite3SrcListDelete(tls *libc.TLS, db uintptr, pList uintptr) { var i int32 var pItem uintptr if pList == uintptr(0) { return } pItem = pList + 8 i = 0 __1: if !(i < (*SrcList)(unsafe.Pointer(pList)).FnSrc) { goto __3 } { if (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase != 0 { Xsqlite3DbNNFreeNN(tls, db, (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase) } if (*SrcItem)(unsafe.Pointer(pItem)).FzName != 0 { Xsqlite3DbNNFreeNN(tls, db, (*SrcItem)(unsafe.Pointer(pItem)).FzName) } if (*SrcItem)(unsafe.Pointer(pItem)).FzAlias != 0 { Xsqlite3DbNNFreeNN(tls, db, (*SrcItem)(unsafe.Pointer(pItem)).FzAlias) } if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x2>>1)) != 0 { Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(pItem + 88))) } if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x4>>2)) != 0 { Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(pItem + 88))) } Xsqlite3DeleteTable(tls, db, (*SrcItem)(unsafe.Pointer(pItem)).FpTab) if (*SrcItem)(unsafe.Pointer(pItem)).FpSelect != 0 { Xsqlite3SelectDelete(tls, db, (*SrcItem)(unsafe.Pointer(pItem)).FpSelect) } if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x400>>10)) != 0 { Xsqlite3IdListDelete(tls, db, *(*uintptr)(unsafe.Pointer(pItem + 72))) } else if *(*uintptr)(unsafe.Pointer(pItem + 72)) != 0 { Xsqlite3ExprDelete(tls, db, *(*uintptr)(unsafe.Pointer(pItem + 72))) } } goto __2 __2: i++ pItem += 104 goto __1 goto __3 __3: ; Xsqlite3DbNNFreeNN(tls, db, pList) } // This routine is called by the parser to add a new term to the // end of a growing FROM clause. The "p" parameter is the part of // the FROM clause that has already been constructed. "p" is NULL // if this is the first term of the FROM clause. pTable and pDatabase // are the name of the table and database named in the FROM clause term. // pDatabase is NULL if the database name qualifier is missing - the // usual case. If the term has an alias, then pAlias points to the // alias token. If the term is a subquery, then pSubquery is the // SELECT statement that the subquery encodes. The pTable and // pDatabase parameters are NULL for subqueries. The pOn and pUsing // parameters are the content of the ON and USING clauses. // // Return a new SrcList which encodes is the FROM with the new // term added. func Xsqlite3SrcListAppendFromTerm(tls *libc.TLS, pParse uintptr, p uintptr, pTable uintptr, pDatabase uintptr, pAlias uintptr, pSubquery uintptr, pOnUsing uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var pItem uintptr var db uintptr var pToken uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !(!(p != 0) && pOnUsing != uintptr(0) && ((*OnOrUsing)(unsafe.Pointer(pOnUsing)).FpOn != 0 || (*OnOrUsing)(unsafe.Pointer(pOnUsing)).FpUsing != 0)) { goto __1 } Xsqlite3ErrorMsg(tls, pParse, ts+15815, libc.VaList(bp, func() uintptr { if (*OnOrUsing)(unsafe.Pointer(pOnUsing)).FpOn != 0 { return ts + 15851 } return ts + 15854 }())) goto append_from_error __1: ; p = Xsqlite3SrcListAppend(tls, pParse, p, pTable, pDatabase) if !(p == uintptr(0)) { goto __2 } goto append_from_error __2: ; pItem = p + 8 + uintptr((*SrcList)(unsafe.Pointer(p)).FnSrc-1)*104 if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && (*SrcItem)(unsafe.Pointer(pItem)).FzName != 0) { goto __3 } if pDatabase != 0 && (*Token)(unsafe.Pointer(pDatabase)).Fz != 0 { pToken = pDatabase } else { pToken = pTable } Xsqlite3RenameTokenMap(tls, pParse, (*SrcItem)(unsafe.Pointer(pItem)).FzName, pToken) __3: ; if !((*Token)(unsafe.Pointer(pAlias)).Fn != 0) { goto __4 } (*SrcItem)(unsafe.Pointer(pItem)).FzAlias = Xsqlite3NameFromToken(tls, db, pAlias) __4: ; if !(pSubquery != 0) { goto __5 } (*SrcItem)(unsafe.Pointer(pItem)).FpSelect = pSubquery if !((*Select)(unsafe.Pointer(pSubquery)).FselFlags&U32(SF_NestedFrom) != 0) { goto __6 } libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 13, 0x2000) __6: ; __5: ; if !(pOnUsing == uintptr(0)) { goto __7 } *(*uintptr)(unsafe.Pointer(pItem + 72)) = uintptr(0) goto __8 __7: if !((*OnOrUsing)(unsafe.Pointer(pOnUsing)).FpUsing != 0) { goto __9 } libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 10, 0x400) *(*uintptr)(unsafe.Pointer(pItem + 72)) = (*OnOrUsing)(unsafe.Pointer(pOnUsing)).FpUsing goto __10 __9: *(*uintptr)(unsafe.Pointer(pItem + 72)) = (*OnOrUsing)(unsafe.Pointer(pOnUsing)).FpOn __10: ; __8: ; return p append_from_error: ; Xsqlite3ClearOnOrUsing(tls, db, pOnUsing) Xsqlite3SelectDelete(tls, db, pSubquery) return uintptr(0) } // Add an INDEXED BY or NOT INDEXED clause to the most recently added // element of the source-list passed as the second argument. func Xsqlite3SrcListIndexedBy(tls *libc.TLS, pParse uintptr, p uintptr, pIndexedBy uintptr) { if p != 0 && (*Token)(unsafe.Pointer(pIndexedBy)).Fn > uint32(0) { var pItem uintptr pItem = p + 8 + uintptr((*SrcList)(unsafe.Pointer(p)).FnSrc-1)*104 if (*Token)(unsafe.Pointer(pIndexedBy)).Fn == uint32(1) && !(int32((*Token)(unsafe.Pointer(pIndexedBy)).Fz) != 0) { libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 0, 0x1) } else { *(*uintptr)(unsafe.Pointer(pItem + 88)) = Xsqlite3NameFromToken(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pIndexedBy) libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 1, 0x2) } } } // Append the contents of SrcList p2 to SrcList p1 and return the resulting // SrcList. Or, if an error occurs, return NULL. In all cases, p1 and p2 // are deleted by this function. func Xsqlite3SrcListAppendList(tls *libc.TLS, pParse uintptr, p1 uintptr, p2 uintptr) uintptr { if p2 != 0 { var pNew uintptr = Xsqlite3SrcListEnlarge(tls, pParse, p1, (*SrcList)(unsafe.Pointer(p2)).FnSrc, 1) if pNew == uintptr(0) { Xsqlite3SrcListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, p2) } else { p1 = pNew libc.Xmemcpy(tls, p1+8+1*104, p2+8, uint64((*SrcList)(unsafe.Pointer(p2)).FnSrc)*uint64(unsafe.Sizeof(SrcItem{}))) Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, p2) *(*U8)(unsafe.Pointer(p1 + 8 + 60)) |= U8(JT_LTORJ & int32((*SrcItem)(unsafe.Pointer(p1+8+1*104)).Ffg.Fjointype)) } } return p1 } // Add the list of function arguments to the SrcList entry for a // table-valued-function. func Xsqlite3SrcListFuncArgs(tls *libc.TLS, pParse uintptr, p uintptr, pList uintptr) { if p != 0 { var pItem uintptr = p + 8 + uintptr((*SrcList)(unsafe.Pointer(p)).FnSrc-1)*104 *(*uintptr)(unsafe.Pointer(pItem + 88)) = pList libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 2, 0x4) } else { Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pList) } } // When building up a FROM clause in the parser, the join operator // is initially attached to the left operand. But the code generator // expects the join operator to be on the right operand. This routine // Shifts all join operators from left to right for an entire FROM // clause. // // Example: Suppose the join is like this: // // A natural cross join B // // The operator is "natural cross join". The A and B operands are stored // in p->a[0] and p->a[1], respectively. The parser initially stores the // operator with A. This routine shifts that operator over to B. // // Additional changes: // // - All tables to the left of the right-most RIGHT JOIN are tagged with // JT_LTORJ (mnemonic: Left Table Of Right Join) so that the // code generator can easily tell that the table is part of // the left operand of at least one RIGHT JOIN. func Xsqlite3SrcListShiftJoinType(tls *libc.TLS, pParse uintptr, p uintptr) { _ = pParse if p != 0 && (*SrcList)(unsafe.Pointer(p)).FnSrc > 1 { var i int32 = (*SrcList)(unsafe.Pointer(p)).FnSrc - 1 var allFlags U8 = U8(0) for __ccgo := true; __ccgo; __ccgo = libc.PreDecInt32(&i, 1) > 0 { allFlags = U8(int32(allFlags) | int32(libc.AssignPtrUint8(p+8+uintptr(i)*104+60, (*SrcItem)(unsafe.Pointer(p+8+uintptr(i-1)*104)).Ffg.Fjointype))) } (*SrcItem)(unsafe.Pointer(p + 8)).Ffg.Fjointype = U8(0) if int32(allFlags)&JT_RIGHT != 0 { for i = (*SrcList)(unsafe.Pointer(p)).FnSrc - 1; i > 0 && int32((*SrcItem)(unsafe.Pointer(p+8+uintptr(i)*104)).Ffg.Fjointype)&JT_RIGHT == 0; i-- { } i-- for __ccgo1 := true; __ccgo1; __ccgo1 = libc.PreDecInt32(&i, 1) >= 0 { *(*U8)(unsafe.Pointer(p + 8 + uintptr(i)*104 + 60)) |= U8(JT_LTORJ) } } } } // Generate VDBE code for a BEGIN statement. func Xsqlite3BeginTransaction(tls *libc.TLS, pParse uintptr, type1 int32) { var db uintptr var v uintptr var i int32 db = (*Parse)(unsafe.Pointer(pParse)).Fdb if Xsqlite3AuthCheck(tls, pParse, SQLITE_TRANSACTION, ts+15860, uintptr(0), uintptr(0)) != 0 { return } v = Xsqlite3GetVdbe(tls, pParse) if !(v != 0) { return } if type1 != TK_DEFERRED { for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var eTxnType int32 var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 && Xsqlite3BtreeIsReadonly(tls, pBt) != 0 { eTxnType = 0 } else if type1 == TK_EXCLUSIVE { eTxnType = 2 } else { eTxnType = 1 } Xsqlite3VdbeAddOp2(tls, v, OP_Transaction, i, eTxnType) Xsqlite3VdbeUsesBtree(tls, v, i) } } Xsqlite3VdbeAddOp0(tls, v, OP_AutoCommit) } // Generate VDBE code for a COMMIT or ROLLBACK statement. // Code for ROLLBACK is generated if eType==TK_ROLLBACK. Otherwise // code is generated for a COMMIT. func Xsqlite3EndTransaction(tls *libc.TLS, pParse uintptr, eType int32) { var v uintptr var isRollback int32 isRollback = libc.Bool32(eType == TK_ROLLBACK) if Xsqlite3AuthCheck(tls, pParse, SQLITE_TRANSACTION, func() uintptr { if isRollback != 0 { return ts + 15866 } return ts + 15875 }(), uintptr(0), uintptr(0)) != 0 { return } v = Xsqlite3GetVdbe(tls, pParse) if v != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_AutoCommit, 1, isRollback) } } // This function is called by the parser when it parses a command to create, // release or rollback an SQL savepoint. func Xsqlite3Savepoint(tls *libc.TLS, pParse uintptr, op int32, pName uintptr) { var zName uintptr = Xsqlite3NameFromToken(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pName) if zName != 0 { var v uintptr = Xsqlite3GetVdbe(tls, pParse) if !(v != 0) || Xsqlite3AuthCheck(tls, pParse, SQLITE_SAVEPOINT, az[op], zName, uintptr(0)) != 0 { Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, zName) return } Xsqlite3VdbeAddOp4(tls, v, OP_Savepoint, op, 0, 0, zName, -6) } } var az = [3]uintptr{ts + 15860, ts + 15882, ts + 15866} // Make sure the TEMP database is open and available for use. Return // the number of errors. Leave any error messages in the pParse structure. func Xsqlite3OpenTempDatabase(tls *libc.TLS, pParse uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpBt == uintptr(0) && !(int32((*Parse)(unsafe.Pointer(pParse)).Fexplain) != 0) { var rc int32 rc = Xsqlite3BtreeOpen(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, uintptr(0), db, bp, 0, flags) if rc != SQLITE_OK { Xsqlite3ErrorMsg(tls, pParse, ts+15890, 0) (*Parse)(unsafe.Pointer(pParse)).Frc = rc return 1 } (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).FpBt = *(*uintptr)(unsafe.Pointer(bp)) if SQLITE_NOMEM == Xsqlite3BtreeSetPageSize(tls, *(*uintptr)(unsafe.Pointer(bp)), (*Sqlite3)(unsafe.Pointer(db)).FnextPagesize, 0, 0) { Xsqlite3OomFault(tls, db) return 1 } } return 0 } var flags int32 = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE | SQLITE_OPEN_TEMP_DB func sqlite3CodeVerifySchemaAtToplevel(tls *libc.TLS, pToplevel uintptr, iDb int32) { if libc.Bool32((*Parse)(unsafe.Pointer(pToplevel)).FcookieMask&(YDbMask(1)<>0) == SQLITE_IDXTYPE_PRIMARYKEY { return SQLITE_CONSTRAINT | int32(6)<<8 } return SQLITE_CONSTRAINT | int32(8)<<8 }(), onError, zErr, int8(-6), uint8(P5_ConstraintUnique)) } // Code an OP_Halt due to non-unique rowid. func Xsqlite3RowidConstraint(tls *libc.TLS, pParse uintptr, onError int32, pTab uintptr) { bp := tls.Alloc(24) defer tls.Free(24) var zMsg uintptr var rc int32 if int32((*Table)(unsafe.Pointer(pTab)).FiPKey) >= 0 { zMsg = Xsqlite3MPrintf(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, ts+13413, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr((*Table)(unsafe.Pointer(pTab)).FiPKey)*24)).FzCnName)) rc = SQLITE_CONSTRAINT | int32(6)<<8 } else { zMsg = Xsqlite3MPrintf(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, ts+15974, libc.VaList(bp+16, (*Table)(unsafe.Pointer(pTab)).FzName)) rc = SQLITE_CONSTRAINT | int32(10)<<8 } Xsqlite3HaltConstraint(tls, pParse, rc, onError, zMsg, int8(-6), uint8(P5_ConstraintUnique)) } func collationMatch(tls *libc.TLS, zColl uintptr, pIndex uintptr) int32 { var i int32 for i = 0; i < int32((*Index)(unsafe.Pointer(pIndex)).FnColumn); i++ { var z uintptr = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FazColl + uintptr(i)*8)) if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(i)*2))) >= 0 && 0 == Xsqlite3StrICmp(tls, z, zColl) { return 1 } } return 0 } func reindexTable(tls *libc.TLS, pParse uintptr, pTab uintptr, zColl uintptr) { if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { var pIndex uintptr for pIndex = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIndex != 0; pIndex = (*Index)(unsafe.Pointer(pIndex)).FpNext { if zColl == uintptr(0) || collationMatch(tls, zColl, pIndex) != 0 { var iDb int32 = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Table)(unsafe.Pointer(pTab)).FpSchema) Xsqlite3BeginWriteOperation(tls, pParse, 0, iDb) sqlite3RefillIndex(tls, pParse, pIndex, -1) } } } } func reindexDatabases(tls *libc.TLS, pParse uintptr, zColl uintptr) { var pDb uintptr var iDb int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var k uintptr var pTab uintptr iDb = 0 pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb __1: if !(iDb < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __3 } { for k = (*Hash)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema + 8)).Ffirst; k != 0; k = (*HashElem)(unsafe.Pointer(k)).Fnext { pTab = (*HashElem)(unsafe.Pointer(k)).Fdata reindexTable(tls, pParse, pTab, zColl) } } goto __2 __2: iDb++ pDb += 32 goto __1 goto __3 __3: } // Generate code for the REINDEX command. // // REINDEX -- 1 // REINDEX -- 2 // REINDEX ?.? -- 3 // REINDEX ?.? -- 4 // // Form 1 causes all indices in all attached databases to be rebuilt. // Form 2 rebuilds all indices in all databases that use the named // collating function. Forms 3 and 4 rebuild the named index or all // indices associated with the named table. func Xsqlite3Reindex(tls *libc.TLS, pParse uintptr, pName1 uintptr, pName2 uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var pColl uintptr var z uintptr var zDb uintptr var pTab uintptr var pIndex uintptr var iDb int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if SQLITE_OK != Xsqlite3ReadSchema(tls, pParse) { return } if pName1 == uintptr(0) { reindexDatabases(tls, pParse, uintptr(0)) return } else if pName2 == uintptr(0) || (*Token)(unsafe.Pointer(pName2)).Fz == uintptr(0) { var zColl uintptr zColl = Xsqlite3NameFromToken(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pName1) if !(zColl != 0) { return } pColl = Xsqlite3FindCollSeq(tls, db, (*Sqlite3)(unsafe.Pointer(db)).Fenc, zColl, 0) if pColl != 0 { reindexDatabases(tls, pParse, zColl) Xsqlite3DbFree(tls, db, zColl) return } Xsqlite3DbFree(tls, db, zColl) } iDb = Xsqlite3TwoPartName(tls, pParse, pName1, pName2, bp) if iDb < 0 { return } z = Xsqlite3NameFromToken(tls, db, *(*uintptr)(unsafe.Pointer(bp))) if z == uintptr(0) { return } zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName pTab = Xsqlite3FindTable(tls, db, z, zDb) if pTab != 0 { reindexTable(tls, pParse, pTab, uintptr(0)) Xsqlite3DbFree(tls, db, z) return } pIndex = Xsqlite3FindIndex(tls, db, z, zDb) Xsqlite3DbFree(tls, db, z) if pIndex != 0 { Xsqlite3BeginWriteOperation(tls, pParse, 0, iDb) sqlite3RefillIndex(tls, pParse, pIndex, -1) return } Xsqlite3ErrorMsg(tls, pParse, ts+15983, 0) } // Return a KeyInfo structure that is appropriate for the given Index. // // The caller should invoke sqlite3KeyInfoUnref() on the returned object // when it has finished using it. func Xsqlite3KeyInfoOfIndex(tls *libc.TLS, pParse uintptr, pIdx uintptr) uintptr { var i int32 var nCol int32 = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) var nKey int32 = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) var pKey uintptr if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return uintptr(0) } if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x8>>3)) != 0 { pKey = Xsqlite3KeyInfoAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, nKey, nCol-nKey) } else { pKey = Xsqlite3KeyInfoAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, nCol, 0) } if pKey != 0 { for i = 0; i < nCol; i++ { var zColl uintptr = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(i)*8)) *(*uintptr)(unsafe.Pointer(pKey + 32 + uintptr(i)*8)) = func() uintptr { if zColl == uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) { return uintptr(0) } return Xsqlite3LocateCollSeq(tls, pParse, zColl) }() *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKey)).FaSortFlags + uintptr(i))) = *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSortOrder + uintptr(i))) } if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { if int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x100>>8) == 0 { libc.SetBitFieldPtr16Uint32(pIdx+100, uint32(1), 8, 0x100) (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_ERROR | int32(2)<<8 } Xsqlite3KeyInfoUnref(tls, pKey) pKey = uintptr(0) } } return pKey } // Create a new CTE object func Xsqlite3CteNew(tls *libc.TLS, pParse uintptr, pName uintptr, pArglist uintptr, pQuery uintptr, eM10d U8) uintptr { var pNew uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb pNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Cte{}))) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3ExprListDelete(tls, db, pArglist) Xsqlite3SelectDelete(tls, db, pQuery) } else { (*Cte)(unsafe.Pointer(pNew)).FpSelect = pQuery (*Cte)(unsafe.Pointer(pNew)).FpCols = pArglist (*Cte)(unsafe.Pointer(pNew)).FzName = Xsqlite3NameFromToken(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pName) (*Cte)(unsafe.Pointer(pNew)).FeM10d = eM10d } return pNew } func cteClear(tls *libc.TLS, db uintptr, pCte uintptr) { Xsqlite3ExprListDelete(tls, db, (*Cte)(unsafe.Pointer(pCte)).FpCols) Xsqlite3SelectDelete(tls, db, (*Cte)(unsafe.Pointer(pCte)).FpSelect) Xsqlite3DbFree(tls, db, (*Cte)(unsafe.Pointer(pCte)).FzName) } // Free the contents of the CTE object passed as the second argument. func Xsqlite3CteDelete(tls *libc.TLS, db uintptr, pCte uintptr) { cteClear(tls, db, pCte) Xsqlite3DbFree(tls, db, pCte) } // This routine is invoked once per CTE by the parser while parsing a // WITH clause. The CTE described by teh third argument is added to // the WITH clause of the second argument. If the second argument is // NULL, then a new WITH argument is created. func Xsqlite3WithAdd(tls *libc.TLS, pParse uintptr, pWith uintptr, pCte uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pNew uintptr var zName uintptr if pCte == uintptr(0) { return pWith } zName = (*Cte)(unsafe.Pointer(pCte)).FzName if zName != 0 && pWith != 0 { var i int32 for i = 0; i < (*With)(unsafe.Pointer(pWith)).FnCte; i++ { if Xsqlite3StrICmp(tls, zName, (*Cte)(unsafe.Pointer(pWith+16+uintptr(i)*48)).FzName) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+16029, libc.VaList(bp, zName)) } } } if pWith != 0 { var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(With{})) + uint64(unsafe.Sizeof(Cte{}))*uint64((*With)(unsafe.Pointer(pWith)).FnCte)) pNew = Xsqlite3DbRealloc(tls, db, pWith, uint64(nByte)) } else { pNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(With{}))) } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3CteDelete(tls, db, pCte) pNew = pWith } else { *(*Cte)(unsafe.Pointer(pNew + 16 + uintptr(libc.PostIncInt32(&(*With)(unsafe.Pointer(pNew)).FnCte, 1))*48)) = *(*Cte)(unsafe.Pointer(pCte)) Xsqlite3DbFree(tls, db, pCte) } return pNew } // Free the contents of the With object passed as the second argument. func Xsqlite3WithDelete(tls *libc.TLS, db uintptr, pWith uintptr) { if pWith != 0 { var i int32 for i = 0; i < (*With)(unsafe.Pointer(pWith)).FnCte; i++ { cteClear(tls, db, pWith+16+uintptr(i)*48) } Xsqlite3DbFree(tls, db, pWith) } } func callCollNeeded(tls *libc.TLS, db uintptr, enc int32, zName uintptr) { if (*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded != 0 { var zExternal uintptr = Xsqlite3DbStrDup(tls, db, zName) if !(zExternal != 0) { return } (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpCollNeededArg, db, enc, zExternal) Xsqlite3DbFree(tls, db, zExternal) } if (*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded16 != 0 { var zExternal uintptr var pTmp uintptr = Xsqlite3ValueNew(tls, db) Xsqlite3ValueSetStr(tls, pTmp, -1, zName, uint8(SQLITE_UTF8), uintptr(0)) zExternal = Xsqlite3ValueText(tls, pTmp, uint8(SQLITE_UTF16LE)) if zExternal != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded16})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpCollNeededArg, db, int32((*Sqlite3)(unsafe.Pointer(db)).Fenc), zExternal) } Xsqlite3ValueFree(tls, pTmp) } } func synthCollSeq(tls *libc.TLS, db uintptr, pColl uintptr) int32 { var pColl2 uintptr var z uintptr = (*CollSeq)(unsafe.Pointer(pColl)).FzName var i int32 for i = 0; i < 3; i++ { pColl2 = Xsqlite3FindCollSeq(tls, db, aEnc[i], z, 0) if (*CollSeq)(unsafe.Pointer(pColl2)).FxCmp != uintptr(0) { libc.Xmemcpy(tls, pColl, pColl2, uint64(unsafe.Sizeof(CollSeq{}))) (*CollSeq)(unsafe.Pointer(pColl)).FxDel = uintptr(0) return SQLITE_OK } } return SQLITE_ERROR } var aEnc = [3]U8{U8(SQLITE_UTF16BE), U8(SQLITE_UTF16LE), U8(SQLITE_UTF8)} // This routine is called on a collation sequence before it is used to // check that it is defined. An undefined collation sequence exists when // a database is loaded that contains references to collation sequences // that have not been defined by sqlite3_create_collation() etc. // // If required, this routine calls the 'collation needed' callback to // request a definition of the collating sequence. If this doesn't work, // an equivalent collating sequence that uses a text encoding different // from the main database is substituted, if one is available. func Xsqlite3CheckCollSeq(tls *libc.TLS, pParse uintptr, pColl uintptr) int32 { if pColl != 0 && (*CollSeq)(unsafe.Pointer(pColl)).FxCmp == uintptr(0) { var zName uintptr = (*CollSeq)(unsafe.Pointer(pColl)).FzName var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var p uintptr = Xsqlite3GetCollSeq(tls, pParse, (*Sqlite3)(unsafe.Pointer(db)).Fenc, pColl, zName) if !(p != 0) { return SQLITE_ERROR } } return SQLITE_OK } func findCollSeqEntry(tls *libc.TLS, db uintptr, zName uintptr, create int32) uintptr { var pColl uintptr pColl = Xsqlite3HashFind(tls, db+648, zName) if uintptr(0) == pColl && create != 0 { var nName int32 = Xsqlite3Strlen30(tls, zName) + 1 pColl = Xsqlite3DbMallocZero(tls, db, uint64(3)*uint64(unsafe.Sizeof(CollSeq{}))+uint64(nName)) if pColl != 0 { var pDel uintptr = uintptr(0) (*CollSeq)(unsafe.Pointer(pColl)).FzName = pColl + 3*40 (*CollSeq)(unsafe.Pointer(pColl)).Fenc = U8(SQLITE_UTF8) (*CollSeq)(unsafe.Pointer(pColl + 1*40)).FzName = pColl + 3*40 (*CollSeq)(unsafe.Pointer(pColl + 1*40)).Fenc = U8(SQLITE_UTF16LE) (*CollSeq)(unsafe.Pointer(pColl + 2*40)).FzName = pColl + 3*40 (*CollSeq)(unsafe.Pointer(pColl + 2*40)).Fenc = U8(SQLITE_UTF16BE) libc.Xmemcpy(tls, (*CollSeq)(unsafe.Pointer(pColl)).FzName, zName, uint64(nName)) pDel = Xsqlite3HashInsert(tls, db+648, (*CollSeq)(unsafe.Pointer(pColl)).FzName, pColl) if pDel != uintptr(0) { Xsqlite3OomFault(tls, db) Xsqlite3DbFree(tls, db, pDel) pColl = uintptr(0) } } } return pColl } // Parameter zName points to a UTF-8 encoded string nName bytes long. // Return the CollSeq* pointer for the collation sequence named zName // for the encoding 'enc' from the database 'db'. // // If the entry specified is not found and 'create' is true, then create a // new entry. Otherwise return NULL. // // A separate function sqlite3LocateCollSeq() is a wrapper around // this routine. sqlite3LocateCollSeq() invokes the collation factory // if necessary and generates an error message if the collating sequence // cannot be found. // // See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq() func Xsqlite3FindCollSeq(tls *libc.TLS, db uintptr, enc U8, zName uintptr, create int32) uintptr { var pColl uintptr if zName != 0 { pColl = findCollSeqEntry(tls, db, zName, create) if pColl != 0 { pColl += 40 * uintptr(int32(enc)-1) } } else { pColl = (*Sqlite3)(unsafe.Pointer(db)).FpDfltColl } return pColl } // Change the text encoding for a database connection. This means that // the pDfltColl must change as well. func Xsqlite3SetTextEncoding(tls *libc.TLS, db uintptr, enc U8) { (*Sqlite3)(unsafe.Pointer(db)).Fenc = enc (*Sqlite3)(unsafe.Pointer(db)).FpDfltColl = Xsqlite3FindCollSeq(tls, db, enc, uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)), 0) } // This function is responsible for invoking the collation factory callback // or substituting a collation sequence of a different encoding when the // requested collation sequence is not available in the desired encoding. // // If it is not NULL, then pColl must point to the database native encoding // collation sequence with name zName, length nName. // // The return value is either the collation sequence to be used in database // db for collation type name zName, length nName, or NULL, if no collation // sequence can be found. If no collation is found, leave an error message. // // See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() func Xsqlite3GetCollSeq(tls *libc.TLS, pParse uintptr, enc U8, pColl uintptr, zName uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb p = pColl if !(p != 0) { p = Xsqlite3FindCollSeq(tls, db, enc, zName, 0) } if !(p != 0) || !(int32((*CollSeq)(unsafe.Pointer(p)).FxCmp) != 0) { callCollNeeded(tls, db, int32(enc), zName) p = Xsqlite3FindCollSeq(tls, db, enc, zName, 0) } if p != 0 && !(int32((*CollSeq)(unsafe.Pointer(p)).FxCmp) != 0) && synthCollSeq(tls, db, p) != 0 { p = uintptr(0) } if p == uintptr(0) { Xsqlite3ErrorMsg(tls, pParse, ts+16059, libc.VaList(bp, zName)) (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_ERROR | int32(1)<<8 } return p } // This function returns the collation sequence for database native text // encoding identified by the string zName. // // If the requested collation sequence is not available, or not available // in the database native encoding, the collation factory is invoked to // request it. If the collation factory does not supply such a sequence, // and the sequence is available in another text encoding, then that is // returned instead. // // If no versions of the requested collations sequence are available, or // another error occurs, NULL is returned and an error message written into // pParse. // // This routine is a wrapper around sqlite3FindCollSeq(). This routine // invokes the collation factory if the named collation cannot be found // and generates an error message. // // See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() func Xsqlite3LocateCollSeq(tls *libc.TLS, pParse uintptr, zName uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var enc U8 = (*Sqlite3)(unsafe.Pointer(db)).Fenc var initbusy U8 = (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy var pColl uintptr pColl = Xsqlite3FindCollSeq(tls, db, enc, zName, int32(initbusy)) if !(initbusy != 0) && (!(pColl != 0) || !(int32((*CollSeq)(unsafe.Pointer(pColl)).FxCmp) != 0)) { pColl = Xsqlite3GetCollSeq(tls, pParse, enc, pColl, zName) } return pColl } func matchQuality(tls *libc.TLS, p uintptr, nArg int32, enc U8) int32 { var match int32 if int32((*FuncDef)(unsafe.Pointer(p)).FnArg) != nArg { if nArg == -2 { if (*FuncDef)(unsafe.Pointer(p)).FxSFunc == uintptr(0) { return 0 } return FUNC_PERFECT_MATCH } if int32((*FuncDef)(unsafe.Pointer(p)).FnArg) >= 0 { return 0 } } if int32((*FuncDef)(unsafe.Pointer(p)).FnArg) == nArg { match = 4 } else { match = 1 } if U32(enc) == (*FuncDef)(unsafe.Pointer(p)).FfuncFlags&U32(SQLITE_FUNC_ENCMASK) { match = match + 2 } else if U32(enc)&(*FuncDef)(unsafe.Pointer(p)).FfuncFlags&U32(2) != U32(0) { match = match + 1 } return match } // Search a FuncDefHash for a function with the given name. Return // a pointer to the matching FuncDef if found, or 0 if there is no match. func Xsqlite3FunctionSearch(tls *libc.TLS, h int32, zFunc uintptr) uintptr { var p uintptr for p = *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&Xsqlite3BuiltinFunctions)) + uintptr(h)*8)); p != 0; p = *(*uintptr)(unsafe.Pointer(p + 64)) { if Xsqlite3StrICmp(tls, (*FuncDef)(unsafe.Pointer(p)).FzName, zFunc) == 0 { return p } } return uintptr(0) } // Insert a new FuncDef into a FuncDefHash hash table. func Xsqlite3InsertBuiltinFuncs(tls *libc.TLS, aDef uintptr, nDef int32) { var i int32 for i = 0; i < nDef; i++ { var pOther uintptr var zName uintptr = (*FuncDef)(unsafe.Pointer(aDef + uintptr(i)*72)).FzName var nName int32 = Xsqlite3Strlen30(tls, zName) var h int32 = (int32(*(*int8)(unsafe.Pointer(zName))) + nName) % SQLITE_FUNC_HASH_SZ pOther = Xsqlite3FunctionSearch(tls, h, zName) if pOther != 0 { (*FuncDef)(unsafe.Pointer(aDef + uintptr(i)*72)).FpNext = (*FuncDef)(unsafe.Pointer(pOther)).FpNext (*FuncDef)(unsafe.Pointer(pOther)).FpNext = aDef + uintptr(i)*72 } else { (*FuncDef)(unsafe.Pointer(aDef + uintptr(i)*72)).FpNext = uintptr(0) *(*uintptr)(unsafe.Pointer(aDef + uintptr(i)*72 + 64)) = *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&Xsqlite3BuiltinFunctions)) + uintptr(h)*8)) *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&Xsqlite3BuiltinFunctions)) + uintptr(h)*8)) = aDef + uintptr(i)*72 } } } // Locate a user function given a name, a number of arguments and a flag // indicating whether the function prefers UTF-16 over UTF-8. Return a // pointer to the FuncDef structure that defines that function, or return // NULL if the function does not exist. // // If the createFlag argument is true, then a new (blank) FuncDef // structure is created and liked into the "db" structure if a // no matching function previously existed. // // If nArg is -2, then the first valid function found is returned. A // function is valid if xSFunc is non-zero. The nArg==(-2) // case is used to see if zName is a valid function name for some number // of arguments. If nArg is -2, then createFlag must be 0. // // If createFlag is false, then a function with the required name and // number of arguments may be returned even if the eTextRep flag does not // match that requested. func Xsqlite3FindFunction(tls *libc.TLS, db uintptr, zName uintptr, nArg int32, enc U8, createFlag U8) uintptr { var p uintptr var pBest uintptr = uintptr(0) var bestScore int32 = 0 var h int32 var nName int32 nName = Xsqlite3Strlen30(tls, zName) p = Xsqlite3HashFind(tls, db+624, zName) for p != 0 { var score int32 = matchQuality(tls, p, nArg, enc) if score > bestScore { pBest = p bestScore = score } p = (*FuncDef)(unsafe.Pointer(p)).FpNext } if !(createFlag != 0) && (pBest == uintptr(0) || (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_PreferBuiltin) != U32(0)) { bestScore = 0 h = (int32(Xsqlite3UpperToLower[U8(*(*int8)(unsafe.Pointer(zName)))]) + nName) % SQLITE_FUNC_HASH_SZ p = Xsqlite3FunctionSearch(tls, h, zName) for p != 0 { var score int32 = matchQuality(tls, p, nArg, enc) if score > bestScore { pBest = p bestScore = score } p = (*FuncDef)(unsafe.Pointer(p)).FpNext } } if createFlag != 0 && bestScore < FUNC_PERFECT_MATCH && libc.AssignUintptr(&pBest, Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(FuncDef{}))+uint64(nName)+uint64(1))) != uintptr(0) { var pOther uintptr var z uintptr (*FuncDef)(unsafe.Pointer(pBest)).FzName = pBest + 1*72 (*FuncDef)(unsafe.Pointer(pBest)).FnArg = I8(U16(nArg)) (*FuncDef)(unsafe.Pointer(pBest)).FfuncFlags = U32(enc) libc.Xmemcpy(tls, pBest+1*72, zName, uint64(nName+1)) for z = (*FuncDef)(unsafe.Pointer(pBest)).FzName; *(*U8)(unsafe.Pointer(z)) != 0; z++ { *(*U8)(unsafe.Pointer(z)) = Xsqlite3UpperToLower[*(*U8)(unsafe.Pointer(z))] } pOther = Xsqlite3HashInsert(tls, db+624, (*FuncDef)(unsafe.Pointer(pBest)).FzName, pBest) if pOther == pBest { Xsqlite3DbFree(tls, db, pBest) Xsqlite3OomFault(tls, db) return uintptr(0) } else { (*FuncDef)(unsafe.Pointer(pBest)).FpNext = pOther } } if pBest != 0 && ((*FuncDef)(unsafe.Pointer(pBest)).FxSFunc != 0 || createFlag != 0) { return pBest } return uintptr(0) } // Free all resources held by the schema structure. The void* argument points // at a Schema struct. This function does not call sqlite3DbFree(db, ) on the // pointer itself, it just cleans up subsidiary resources (i.e. the contents // of the schema hash tables). // // The Schema.cache_size variable is not cleared. func Xsqlite3SchemaClear(tls *libc.TLS, p uintptr) { bp := tls.Alloc(896) defer tls.Free(896) var pElem uintptr var pSchema uintptr = p libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Sqlite3{}))) *(*Hash)(unsafe.Pointer(bp + 872)) = (*Schema)(unsafe.Pointer(pSchema)).FtblHash *(*Hash)(unsafe.Pointer(bp + 848)) = (*Schema)(unsafe.Pointer(pSchema)).FtrigHash Xsqlite3HashInit(tls, pSchema+56) Xsqlite3HashClear(tls, pSchema+32) for pElem = (*Hash)(unsafe.Pointer(bp + 848)).Ffirst; pElem != 0; pElem = (*HashElem)(unsafe.Pointer(pElem)).Fnext { Xsqlite3DeleteTrigger(tls, bp, (*HashElem)(unsafe.Pointer(pElem)).Fdata) } Xsqlite3HashClear(tls, bp+848) Xsqlite3HashInit(tls, pSchema+8) for pElem = (*Hash)(unsafe.Pointer(bp + 872)).Ffirst; pElem != 0; pElem = (*HashElem)(unsafe.Pointer(pElem)).Fnext { var pTab uintptr = (*HashElem)(unsafe.Pointer(pElem)).Fdata Xsqlite3DeleteTable(tls, bp, pTab) } Xsqlite3HashClear(tls, bp+872) Xsqlite3HashClear(tls, pSchema+80) (*Schema)(unsafe.Pointer(pSchema)).FpSeqTab = uintptr(0) if int32((*Schema)(unsafe.Pointer(pSchema)).FschemaFlags)&DB_SchemaLoaded != 0 { (*Schema)(unsafe.Pointer(pSchema)).FiGeneration++ } *(*U16)(unsafe.Pointer(pSchema + 114)) &= libc.Uint16FromInt32(libc.CplInt32(DB_SchemaLoaded | DB_ResetWanted)) } // Find and return the schema associated with a BTree. Create // a new one if necessary. func Xsqlite3SchemaGet(tls *libc.TLS, db uintptr, pBt uintptr) uintptr { var p uintptr if pBt != 0 { p = Xsqlite3BtreeSchema(tls, pBt, int32(unsafe.Sizeof(Schema{})), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3SchemaClear}))) } else { p = Xsqlite3DbMallocZero(tls, uintptr(0), uint64(unsafe.Sizeof(Schema{}))) } if !(p != 0) { Xsqlite3OomFault(tls, db) } else if 0 == int32((*Schema)(unsafe.Pointer(p)).Ffile_format) { Xsqlite3HashInit(tls, p+8) Xsqlite3HashInit(tls, p+32) Xsqlite3HashInit(tls, p+56) Xsqlite3HashInit(tls, p+80) (*Schema)(unsafe.Pointer(p)).Fenc = U8(SQLITE_UTF8) } return p } // While a SrcList can in general represent multiple tables and subqueries // (as in the FROM clause of a SELECT statement) in this case it contains // the name of a single table, as one might find in an INSERT, DELETE, // or UPDATE statement. Look up that table in the symbol table and // return a pointer. Set an error message and return NULL if the table // name is not found or if any other error occurs. // // The following fields are initialized appropriate in pSrc: // // pSrc->a[0].pTab Pointer to the Table object // pSrc->a[0].pIndex Pointer to the INDEXED BY index, if there is one func Xsqlite3SrcListLookup(tls *libc.TLS, pParse uintptr, pSrc uintptr) uintptr { var pItem uintptr = pSrc + 8 var pTab uintptr pTab = Xsqlite3LocateTableItem(tls, pParse, uint32(0), pItem) Xsqlite3DeleteTable(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*SrcItem)(unsafe.Pointer(pItem)).FpTab) (*SrcItem)(unsafe.Pointer(pItem)).FpTab = pTab if pTab != 0 { (*Table)(unsafe.Pointer(pTab)).FnTabRef++ if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x2>>1)) != 0 && Xsqlite3IndexedByLookup(tls, pParse, pItem) != 0 { pTab = uintptr(0) } } return pTab } // Generate byte-code that will report the number of rows modified // by a DELETE, INSERT, or UPDATE statement. func Xsqlite3CodeChangeCount(tls *libc.TLS, v uintptr, regCounter int32, zColName uintptr) { Xsqlite3VdbeAddOp0(tls, v, OP_FkCheck) Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, regCounter, 1) Xsqlite3VdbeSetNumCols(tls, v, 1) Xsqlite3VdbeSetColName(tls, v, 0, COLNAME_NAME, zColName, uintptr(0)) } func vtabIsReadOnly(tls *libc.TLS, pParse uintptr, pTab uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer((*VTable)(unsafe.Pointer(Xsqlite3GetVTable(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pTab))).FpMod)).FpModule)).FxUpdate == uintptr(0) { return 1 } if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != uintptr(0) && int32((*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 16)))).FeVtabRisk) > libc.Bool32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_TrustedSchema) != uint64(0)) { Xsqlite3ErrorMsg(tls, pParse, ts+16090, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) } return 0 } func tabIsReadOnly(tls *libc.TLS, pParse uintptr, pTab uintptr) int32 { var db uintptr if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { return vtabIsReadOnly(tls, pParse, pTab) } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Readonly|TF_Shadow) == U32(0) { return 0 } db = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Readonly) != U32(0) { return libc.Bool32(Xsqlite3WritableSchema(tls, db) == 0 && int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0) } return Xsqlite3ReadOnlyShadowTables(tls, db) } // Check to make sure the given table is writable. // // If pTab is not writable -> generate an error message and return 1. // If pTab is writable but other errors have occurred -> return 1. // If pTab is writable and no prior errors -> return 0; func Xsqlite3IsReadOnly(tls *libc.TLS, pParse uintptr, pTab uintptr, viewOk int32) int32 { bp := tls.Alloc(16) defer tls.Free(16) if tabIsReadOnly(tls, pParse, pTab) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+16123, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) return 1 } if !(viewOk != 0) && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW { Xsqlite3ErrorMsg(tls, pParse, ts+16152, libc.VaList(bp+8, (*Table)(unsafe.Pointer(pTab)).FzName)) return 1 } return 0 } // Evaluate a view and store its result in an ephemeral table. The // pWhere argument is an optional WHERE clause that restricts the // set of rows in the view that are to be added to the ephemeral table. func Xsqlite3MaterializeView(tls *libc.TLS, pParse uintptr, pView uintptr, pWhere uintptr, pOrderBy uintptr, pLimit uintptr, iCur int32) { bp := tls.Alloc(40) defer tls.Free(40) var pSel uintptr var pFrom uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var iDb int32 = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pView)).FpSchema) pWhere = Xsqlite3ExprDup(tls, db, pWhere, 0) pFrom = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), uintptr(0), uintptr(0)) if pFrom != 0 { (*SrcItem)(unsafe.Pointer(pFrom + 8)).FzName = Xsqlite3DbStrDup(tls, db, (*Table)(unsafe.Pointer(pView)).FzName) (*SrcItem)(unsafe.Pointer(pFrom + 8)).FzDatabase = Xsqlite3DbStrDup(tls, db, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) } pSel = Xsqlite3SelectNew(tls, pParse, uintptr(0), pFrom, pWhere, uintptr(0), uintptr(0), pOrderBy, uint32(SF_IncludeHidden), pLimit) Xsqlite3SelectDestInit(tls, bp, SRT_EphemTab, iCur) Xsqlite3Select(tls, pParse, pSel, bp) Xsqlite3SelectDelete(tls, db, pSel) } // Generate code for a DELETE FROM statement. // // DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL; // \________/ \________________/ // pTabList pWhere func Xsqlite3DeleteFrom(tls *libc.TLS, pParse uintptr, pTabList uintptr, pWhere uintptr, pOrderBy uintptr, pLimit uintptr) { bp := tls.Alloc(88) defer tls.Free(88) var v uintptr var pTab uintptr var i int32 var pWInfo uintptr var pIdx uintptr var iTabCur int32 var nIdx int32 var db uintptr var iDb int32 var memCnt int32 var rcauth int32 var eOnePass int32 var aToOpen uintptr var pPk uintptr var iPk int32 var nPk I16 var iKey int32 var nKey I16 var iEphCur int32 var iRowSet int32 var addrBypass int32 var addrLoop int32 var addrEphOpen int32 var bComplex int32 var isView int32 var pTrigger uintptr var iAddrOnce int32 var pVTab uintptr var count int32 var wcf U16 *(*int32)(unsafe.Pointer(bp + 80)) = 0 *(*int32)(unsafe.Pointer(bp + 84)) = 0 memCnt = 0 aToOpen = uintptr(0) iPk = 0 nPk = int16(1) iEphCur = 0 iRowSet = 0 addrBypass = 0 addrLoop = 0 addrEphOpen = 0 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(AuthContext{}))) db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __1 } goto delete_from_cleanup __1: ; pTab = Xsqlite3SrcListLookup(tls, pParse, pTabList) if !(pTab == uintptr(0)) { goto __2 } goto delete_from_cleanup __2: ; pTrigger = Xsqlite3TriggersExist(tls, pParse, pTab, TK_DELETE, uintptr(0), uintptr(0)) isView = libc.Bool32(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) bComplex = libc.Bool32(pTrigger != 0 || Xsqlite3FkRequired(tls, pParse, pTab, uintptr(0), 0) != 0) if !(Xsqlite3ViewGetColumnNames(tls, pParse, pTab) != 0) { goto __3 } goto delete_from_cleanup __3: ; if !(Xsqlite3IsReadOnly(tls, pParse, pTab, func() int32 { if pTrigger != 0 { return 1 } return 0 }()) != 0) { goto __4 } goto delete_from_cleanup __4: ; iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) rcauth = Xsqlite3AuthCheck(tls, pParse, SQLITE_DELETE, (*Table)(unsafe.Pointer(pTab)).FzName, uintptr(0), (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) if !(rcauth == SQLITE_DENY) { goto __5 } goto delete_from_cleanup __5: ; iTabCur = libc.AssignPtrInt32(pTabList+8+68, libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1)) nIdx = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __6: if !(pIdx != 0) { goto __8 } (*Parse)(unsafe.Pointer(pParse)).FnTab++ goto __7 __7: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext nIdx++ goto __6 goto __8 __8: ; if !(isView != 0) { goto __9 } Xsqlite3AuthContextPush(tls, pParse, bp, (*Table)(unsafe.Pointer(pTab)).FzName) __9: ; v = Xsqlite3GetVdbe(tls, pParse) if !(v == uintptr(0)) { goto __10 } goto delete_from_cleanup __10: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0) { goto __11 } Xsqlite3VdbeCountChanges(tls, v) __11: ; Xsqlite3BeginWriteOperation(tls, pParse, bComplex, iDb) if !(isView != 0) { goto __12 } Xsqlite3MaterializeView(tls, pParse, pTab, pWhere, pOrderBy, pLimit, iTabCur) *(*int32)(unsafe.Pointer(bp + 80)) = libc.AssignPtrInt32(bp+84, iTabCur) pOrderBy = uintptr(0) pLimit = uintptr(0) __12: ; libc.Xmemset(tls, bp+16, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 16)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp + 16)).FpSrcList = pTabList if !(Xsqlite3ResolveExprNames(tls, bp+16, pWhere) != 0) { goto __13 } goto delete_from_cleanup __13: ; if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&(uint64(0x00001)<<32) != uint64(0) && !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FpTriggerTab) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FbReturning) != 0)) { goto __14 } memCnt = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, memCnt) __14: ; if !(rcauth == SQLITE_OK && pWhere == uintptr(0) && !(bComplex != 0) && !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) && (*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback == uintptr(0)) { goto __15 } Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab)).Ftnum, uint8(1), (*Table)(unsafe.Pointer(pTab)).FzName) if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __17 } Xsqlite3VdbeAddOp4(tls, v, OP_Clear, int32((*Table)(unsafe.Pointer(pTab)).Ftnum), iDb, func() int32 { if memCnt != 0 { return memCnt } return -1 }(), (*Table)(unsafe.Pointer(pTab)).FzName, -1) __17: ; pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __18: if !(pIdx != 0) { goto __20 } if !(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY && !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0))) { goto __21 } Xsqlite3VdbeAddOp3(tls, v, OP_Clear, int32((*Index)(unsafe.Pointer(pIdx)).Ftnum), iDb, func() int32 { if memCnt != 0 { return memCnt } return -1 }()) goto __22 __21: Xsqlite3VdbeAddOp2(tls, v, OP_Clear, int32((*Index)(unsafe.Pointer(pIdx)).Ftnum), iDb) __22: ; goto __19 __19: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext goto __18 goto __20 __20: ; goto __16 __15: wcf = U16(WHERE_ONEPASS_DESIRED | WHERE_DUPLICATES_OK) if !((*NameContext)(unsafe.Pointer(bp+16)).FncFlags&NC_Subquery != 0) { goto __23 } bComplex = 1 __23: ; wcf = U16(int32(wcf) | func() int32 { if bComplex != 0 { return 0 } return WHERE_ONEPASS_MULTIROW }()) if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __24 } pPk = uintptr(0) nPk = int16(1) iRowSet = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, iRowSet) goto __25 __24: pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) nPk = I16((*Index)(unsafe.Pointer(pPk)).FnKeyCol) iPk = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += int32(nPk) iEphCur = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) addrEphOpen = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, iEphCur, int32(nPk)) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pPk) __25: ; pWInfo = Xsqlite3WhereBegin(tls, pParse, pTabList, pWhere, uintptr(0), uintptr(0), uintptr(0), wcf, iTabCur+1) if !(pWInfo == uintptr(0)) { goto __26 } goto delete_from_cleanup __26: ; eOnePass = Xsqlite3WhereOkOnePass(tls, pWInfo, bp+72) if !(eOnePass != ONEPASS_SINGLE) { goto __27 } Xsqlite3MultiWrite(tls, pParse) __27: ; if !(Xsqlite3WhereUsesDeferredSeek(tls, pWInfo) != 0) { goto __28 } Xsqlite3VdbeAddOp1(tls, v, OP_FinishSeek, iTabCur) __28: ; if !(memCnt != 0) { goto __29 } Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, memCnt, 1) __29: ; if !(pPk != 0) { goto __30 } i = 0 __32: if !(i < int32(nPk)) { goto __34 } Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iTabCur, int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2))), iPk+i) goto __33 __33: i++ goto __32 goto __34 __34: ; iKey = iPk goto __31 __30: iKey = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iTabCur, -1, iKey) __31: ; if !(eOnePass != ONEPASS_OFF) { goto __35 } nKey = nPk aToOpen = Xsqlite3DbMallocRawNN(tls, db, uint64(nIdx+2)) if !(aToOpen == uintptr(0)) { goto __37 } Xsqlite3WhereEnd(tls, pWInfo) goto delete_from_cleanup __37: ; libc.Xmemset(tls, aToOpen, 1, uint64(nIdx+1)) *(*U8)(unsafe.Pointer(aToOpen + uintptr(nIdx+1))) = U8(0) if !(*(*int32)(unsafe.Pointer(bp + 72)) >= 0) { goto __38 } *(*U8)(unsafe.Pointer(aToOpen + uintptr(*(*int32)(unsafe.Pointer(bp + 72))-iTabCur))) = U8(0) __38: ; if !(*(*int32)(unsafe.Pointer(bp + 72 + 1*4)) >= 0) { goto __39 } *(*U8)(unsafe.Pointer(aToOpen + uintptr(*(*int32)(unsafe.Pointer(bp + 72 + 1*4))-iTabCur))) = U8(0) __39: ; if !(addrEphOpen != 0) { goto __40 } Xsqlite3VdbeChangeToNoop(tls, v, addrEphOpen) __40: ; addrBypass = Xsqlite3VdbeMakeLabel(tls, pParse) goto __36 __35: if !(pPk != 0) { goto __41 } iKey = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) nKey = int16(0) Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, iPk, int32(nPk), iKey, Xsqlite3IndexAffinityStr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pPk), int32(nPk)) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iEphCur, iKey, iPk, int32(nPk)) goto __42 __41: nKey = int16(1) Xsqlite3VdbeAddOp2(tls, v, OP_RowSetAdd, iRowSet, iKey) __42: ; Xsqlite3WhereEnd(tls, pWInfo) __36: ; if !!(isView != 0) { goto __43 } iAddrOnce = 0 if !(eOnePass == ONEPASS_MULTI) { goto __44 } iAddrOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) __44: ; Xsqlite3OpenTableAndIndices(tls, pParse, pTab, OP_OpenWrite, uint8(OPFLAG_FORDELETE), iTabCur, aToOpen, bp+80, bp+84) if !(eOnePass == ONEPASS_MULTI) { goto __45 } Xsqlite3VdbeJumpHereOrPopInst(tls, v, iAddrOnce) __45: ; __43: ; if !(eOnePass != ONEPASS_OFF) { goto __46 } if !(!(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) && *(*U8)(unsafe.Pointer(aToOpen + uintptr(*(*int32)(unsafe.Pointer(bp + 80))-iTabCur))) != 0) { goto __48 } Xsqlite3VdbeAddOp4Int(tls, v, OP_NotFound, *(*int32)(unsafe.Pointer(bp + 80)), addrBypass, iKey, int32(nKey)) __48: ; goto __47 __46: if !(pPk != 0) { goto __49 } addrLoop = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, iEphCur) if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __51 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, iEphCur, 0, iKey) goto __52 __51: Xsqlite3VdbeAddOp2(tls, v, OP_RowData, iEphCur, iKey) __52: ; goto __50 __49: addrLoop = Xsqlite3VdbeAddOp3(tls, v, OP_RowSetRead, iRowSet, 0, iKey) __50: ; __47: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __53 } pVTab = Xsqlite3GetVTable(tls, db, pTab) Xsqlite3VtabMakeWritable(tls, pParse, pTab) Xsqlite3MayAbort(tls, pParse) if !(eOnePass == ONEPASS_SINGLE) { goto __55 } Xsqlite3VdbeAddOp1(tls, v, OP_Close, iTabCur) if !((*Parse)(unsafe.Pointer(pParse)).FpToplevel == uintptr(0)) { goto __56 } (*Parse)(unsafe.Pointer(pParse)).FisMultiWrite = U8(0) __56: ; __55: ; Xsqlite3VdbeAddOp4(tls, v, OP_VUpdate, 0, 1, iKey, pVTab, -11) Xsqlite3VdbeChangeP5(tls, v, uint16(OE_Abort)) goto __54 __53: count = libc.Bool32(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0) Xsqlite3GenerateRowDelete(tls, pParse, pTab, pTrigger, *(*int32)(unsafe.Pointer(bp + 80)), *(*int32)(unsafe.Pointer(bp + 84)), iKey, nKey, uint8(count), uint8(OE_Default), uint8(eOnePass), *(*int32)(unsafe.Pointer(bp + 72 + 1*4))) __54: ; if !(eOnePass != ONEPASS_OFF) { goto __57 } Xsqlite3VdbeResolveLabel(tls, v, addrBypass) Xsqlite3WhereEnd(tls, pWInfo) goto __58 __57: if !(pPk != 0) { goto __59 } Xsqlite3VdbeAddOp2(tls, v, OP_Next, iEphCur, addrLoop+1) Xsqlite3VdbeJumpHere(tls, v, addrLoop) goto __60 __59: Xsqlite3VdbeGoto(tls, v, addrLoop) Xsqlite3VdbeJumpHere(tls, v, addrLoop) __60: ; __58: ; __16: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0 && (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab == uintptr(0)) { goto __61 } Xsqlite3AutoincrementEnd(tls, pParse) __61: ; if !(memCnt != 0) { goto __62 } Xsqlite3CodeChangeCount(tls, v, memCnt, ts+16190) __62: ; delete_from_cleanup: Xsqlite3AuthContextPop(tls, bp) Xsqlite3SrcListDelete(tls, db, pTabList) Xsqlite3ExprDelete(tls, db, pWhere) if !(aToOpen != 0) { goto __63 } Xsqlite3DbNNFreeNN(tls, db, aToOpen) __63: ; return } // This routine generates VDBE code that causes a single row of a // single table to be deleted. Both the original table entry and // all indices are removed. // // Preconditions: // // 1. iDataCur is an open cursor on the btree that is the canonical data // store for the table. (This will be either the table itself, // in the case of a rowid table, or the PRIMARY KEY index in the case // of a WITHOUT ROWID table.) // // 2. Read/write cursors for all indices of pTab must be open as // cursor number iIdxCur+i for the i-th index. // // 3. The primary key for the row to be deleted must be stored in a // sequence of nPk memory cells starting at iPk. If nPk==0 that means // that a search record formed from OP_MakeRecord is contained in the // single memory location iPk. // // eMode: // // Parameter eMode may be passed either ONEPASS_OFF (0), ONEPASS_SINGLE, or // ONEPASS_MULTI. If eMode is not ONEPASS_OFF, then the cursor // iDataCur already points to the row to delete. If eMode is ONEPASS_OFF // then this function must seek iDataCur to the entry identified by iPk // and nPk before reading from it. // // If eMode is ONEPASS_MULTI, then this call is being made as part // of a ONEPASS delete that affects multiple rows. In this case, if // iIdxNoSeek is a valid cursor number (>=0) and is not the same as // iDataCur, then its position should be preserved following the delete // operation. Or, if iIdxNoSeek is not a valid cursor number, the // position of iDataCur should be preserved instead. // // iIdxNoSeek: // // If iIdxNoSeek is a valid cursor number (>=0) not equal to iDataCur, // then it identifies an index cursor (from within array of cursors // starting at iIdxCur) that already points to the index entry to be deleted. // Except, this optimization is disabled if there are BEFORE triggers since // the trigger body might have moved the cursor. func Xsqlite3GenerateRowDelete(tls *libc.TLS, pParse uintptr, pTab uintptr, pTrigger uintptr, iDataCur int32, iIdxCur int32, iPk int32, nPk I16, count U8, onconf U8, eMode U8, iIdxNoSeek int32) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var iOld int32 = 0 var iLabel int32 var opSeek U8 iLabel = Xsqlite3VdbeMakeLabel(tls, pParse) if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { opSeek = uint8(OP_NotExists) } else { opSeek = uint8(OP_NotFound) } if int32(eMode) == ONEPASS_OFF { Xsqlite3VdbeAddOp4Int(tls, v, int32(opSeek), iDataCur, iLabel, iPk, int32(nPk)) } if Xsqlite3FkRequired(tls, pParse, pTab, uintptr(0), 0) != 0 || pTrigger != 0 { var mask U32 var iCol int32 var addrStart int32 mask = Xsqlite3TriggerColmask(tls, pParse, pTrigger, uintptr(0), 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, int32(onconf)) mask = mask | Xsqlite3FkOldmask(tls, pParse, pTab) iOld = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += 1 + int32((*Table)(unsafe.Pointer(pTab)).FnCol) Xsqlite3VdbeAddOp2(tls, v, OP_Copy, iPk, iOld) for iCol = 0; iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol); iCol++ { if mask == 0xffffffff || iCol <= 31 && mask&(uint32(1)<= 0 && iIdxNoSeek != iDataCur { Xsqlite3VdbeAddOp1(tls, v, OP_Delete, iIdxNoSeek) } if int32(eMode) == ONEPASS_MULTI { p5 = U8(int32(p5) | OPFLAG_SAVEPOSITION) } Xsqlite3VdbeChangeP5(tls, v, uint16(p5)) } Xsqlite3FkActions(tls, pParse, pTab, uintptr(0), iOld, uintptr(0), 0) Xsqlite3CodeRowTrigger(tls, pParse, pTrigger, TK_DELETE, uintptr(0), TRIGGER_AFTER, pTab, iOld, int32(onconf), iLabel) Xsqlite3VdbeResolveLabel(tls, v, iLabel) } // This routine generates VDBE code that causes the deletion of all // index entries associated with a single row of a single table, pTab // // Preconditions: // // 1. A read/write cursor "iDataCur" must be open on the canonical storage // btree for the table pTab. (This will be either the table itself // for rowid tables or to the primary key index for WITHOUT ROWID // tables.) // // 2. Read/write cursors for all indices of pTab must be open as // cursor number iIdxCur+i for the i-th index. (The pTab->pIndex // index is the 0-th index.) // // 3. The "iDataCur" cursor must be already be positioned on the row // that is to be deleted. func Xsqlite3GenerateRowIndexDelete(tls *libc.TLS, pParse uintptr, pTab uintptr, iDataCur int32, iIdxCur int32, aRegIdx uintptr, iIdxNoSeek int32) { bp := tls.Alloc(4) defer tls.Free(4) var i int32 var r1 int32 = -1 var pIdx uintptr var pPrior uintptr = uintptr(0) var v uintptr var pPk uintptr v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { pPk = uintptr(0) } else { pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) } i = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __1: if !(pIdx != 0) { goto __3 } { if aRegIdx != uintptr(0) && *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4)) == 0 { goto __2 } if pIdx == pPk { goto __2 } if iIdxCur+i == iIdxNoSeek { goto __2 } r1 = Xsqlite3GenerateIndexKey(tls, pParse, pIdx, iDataCur, 0, 1, bp, pPrior, r1) Xsqlite3VdbeAddOp3(tls, v, OP_IdxDelete, iIdxCur+i, r1, func() int32 { if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x8>>3)) != 0 { return int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) } return int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) }()) Xsqlite3VdbeChangeP5(tls, v, uint16(1)) Xsqlite3ResolvePartIdxLabel(tls, pParse, *(*int32)(unsafe.Pointer(bp))) pPrior = pIdx } goto __2 __2: i++ pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext goto __1 goto __3 __3: } // Generate code that will assemble an index key and stores it in register // regOut. The key with be for index pIdx which is an index on pTab. // iCur is the index of a cursor open on the pTab table and pointing to // the entry that needs indexing. If pTab is a WITHOUT ROWID table, then // iCur must be the cursor of the PRIMARY KEY index. // // Return a register number which is the first in a block of // registers that holds the elements of the index key. The // block of registers has already been deallocated by the time // this routine returns. // // If *piPartIdxLabel is not NULL, fill it in with a label and jump // to that label if pIdx is a partial index that should be skipped. // The label should be resolved using sqlite3ResolvePartIdxLabel(). // A partial index should be skipped if its WHERE clause evaluates // to false or null. If pIdx is not a partial index, *piPartIdxLabel // will be set to zero which is an empty label that is ignored by // sqlite3ResolvePartIdxLabel(). // // The pPrior and regPrior parameters are used to implement a cache to // avoid unnecessary register loads. If pPrior is not NULL, then it is // a pointer to a different index for which an index key has just been // computed into register regPrior. If the current pIdx index is generating // its key into the same sequence of registers and if pPrior and pIdx share // a column in common, then the register corresponding to that column already // holds the correct value and the loading of that register is skipped. // This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK // on a table with multiple indices, and especially with the ROWID or // PRIMARY KEY columns of the index. func Xsqlite3GenerateIndexKey(tls *libc.TLS, pParse uintptr, pIdx uintptr, iDataCur int32, regOut int32, prefixOnly int32, piPartIdxLabel uintptr, pPrior uintptr, regPrior int32) int32 { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var j int32 var regBase int32 var nCol int32 if piPartIdxLabel != 0 { if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != 0 { *(*int32)(unsafe.Pointer(piPartIdxLabel)) = Xsqlite3VdbeMakeLabel(tls, pParse) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = iDataCur + 1 Xsqlite3ExprIfFalseDup(tls, pParse, (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere, *(*int32)(unsafe.Pointer(piPartIdxLabel)), SQLITE_JUMPIFNULL) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = 0 pPrior = uintptr(0) } else { *(*int32)(unsafe.Pointer(piPartIdxLabel)) = 0 } } if prefixOnly != 0 && uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x8>>3)) != 0 { nCol = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) } else { nCol = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) } regBase = Xsqlite3GetTempRange(tls, pParse, nCol) if pPrior != 0 && (regBase != regPrior || (*Index)(unsafe.Pointer(pPrior)).FpPartIdxWhere != 0) { pPrior = uintptr(0) } for j = 0; j < nCol; j++ { if pPrior != 0 && int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPrior)).FaiColumn + uintptr(j)*2))) == int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j)*2))) && int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPrior)).FaiColumn + uintptr(j)*2))) != -2 { continue } Xsqlite3ExprCodeLoadIndexColumn(tls, pParse, pIdx, iDataCur, j, regBase+j) if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j)*2))) >= 0 { Xsqlite3VdbeDeletePriorOpcode(tls, v, uint8(OP_RealAffinity)) } } if regOut != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regBase, nCol, regOut) } Xsqlite3ReleaseTempRange(tls, pParse, regBase, nCol) return regBase } // If a prior call to sqlite3GenerateIndexKey() generated a jump-over label // because it was a partial index, then this routine should be called to // resolve that label. func Xsqlite3ResolvePartIdxLabel(tls *libc.TLS, pParse uintptr, iLabel int32) { if iLabel != 0 { Xsqlite3VdbeResolveLabel(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, iLabel) } } func sqlite3GetFuncCollSeq(tls *libc.TLS, context uintptr) uintptr { var pOp uintptr pOp = (*Vdbe)(unsafe.Pointer((*Sqlite3_context)(unsafe.Pointer(context)).FpVdbe)).FaOp + uintptr((*Sqlite3_context)(unsafe.Pointer(context)).FiOp-1)*24 return *(*uintptr)(unsafe.Pointer(pOp + 16)) } func sqlite3SkipAccumulatorLoad(tls *libc.TLS, context uintptr) { (*Sqlite3_context)(unsafe.Pointer(context)).FisError = -1 (*Sqlite3_context)(unsafe.Pointer(context)).FskipFlag = U8(1) } func minmaxFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var i int32 var mask int32 var iBest int32 var pColl uintptr if Xsqlite3_user_data(tls, context) == uintptr(0) { mask = 0 } else { mask = -1 } pColl = sqlite3GetFuncCollSeq(tls, context) iBest = 0 if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) == SQLITE_NULL { return } for i = 1; i < argc; i++ { if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) == SQLITE_NULL { return } if Xsqlite3MemCompare(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(iBest)*8)), *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8)), pColl)^mask >= 0 { iBest = i } } Xsqlite3_result_value(tls, context, *(*uintptr)(unsafe.Pointer(argv + uintptr(iBest)*8))) } func typeofFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { var i int32 = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) - 1 _ = NotUsed Xsqlite3_result_text(tls, context, azType2[i], -1, uintptr(0)) } var azType2 = [5]uintptr{ts + 7543, ts + 7538, ts + 9357, ts + 9352, ts + 7533} func subtypeFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { _ = argc Xsqlite3_result_int(tls, context, int32(Xsqlite3_value_subtype(tls, *(*uintptr)(unsafe.Pointer(argv))))) } func lengthFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { _ = argc switch Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) { case SQLITE_BLOB: fallthrough case SQLITE_INTEGER: fallthrough case SQLITE_FLOAT: { Xsqlite3_result_int(tls, context, Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv)))) break } case SQLITE_TEXT: { var z uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) var z0 uintptr var c uint8 if z == uintptr(0) { return } z0 = z for int32(libc.AssignUint8(&c, *(*uint8)(unsafe.Pointer(z)))) != 0 { z++ if int32(c) >= 0xc0 { for int32(*(*uint8)(unsafe.Pointer(z)))&0xc0 == 0x80 { z++ z0++ } } } Xsqlite3_result_int(tls, context, int32((int64(z)-int64(z0))/1)) break } default: { Xsqlite3_result_null(tls, context) break } } } func absFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { _ = argc switch Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) { case SQLITE_INTEGER: { var iVal I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) if iVal < int64(0) { if iVal == int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32) { Xsqlite3_result_error(tls, context, ts+16203, -1) return } iVal = -iVal } Xsqlite3_result_int64(tls, context, iVal) break } case SQLITE_NULL: { Xsqlite3_result_null(tls, context) break } default: { var rVal float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) if rVal < float64(0) { rVal = -rVal } Xsqlite3_result_double(tls, context, rVal) break } } } func instrFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var zHaystack uintptr var zNeedle uintptr var nHaystack int32 var nNeedle int32 var typeHaystack int32 var typeNeedle int32 var N int32 var isText int32 var firstChar uint8 var pC1 uintptr var pC2 uintptr N = 1 pC1 = uintptr(0) pC2 = uintptr(0) _ = argc typeHaystack = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) typeNeedle = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if !(typeHaystack == SQLITE_NULL || typeNeedle == SQLITE_NULL) { goto __1 } return __1: ; nHaystack = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) nNeedle = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if !(nNeedle > 0) { goto __2 } if !(typeHaystack == SQLITE_BLOB && typeNeedle == SQLITE_BLOB) { goto __3 } zHaystack = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv))) zNeedle = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) isText = 0 goto __4 __3: if !(typeHaystack != SQLITE_BLOB && typeNeedle != SQLITE_BLOB) { goto __5 } zHaystack = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) zNeedle = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) isText = 1 goto __6 __5: pC1 = Xsqlite3_value_dup(tls, *(*uintptr)(unsafe.Pointer(argv))) zHaystack = Xsqlite3_value_text(tls, pC1) if !(zHaystack == uintptr(0)) { goto __7 } goto endInstrOOM __7: ; nHaystack = Xsqlite3_value_bytes(tls, pC1) pC2 = Xsqlite3_value_dup(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) zNeedle = Xsqlite3_value_text(tls, pC2) if !(zNeedle == uintptr(0)) { goto __8 } goto endInstrOOM __8: ; nNeedle = Xsqlite3_value_bytes(tls, pC2) isText = 1 __6: ; __4: ; if !(zNeedle == uintptr(0) || nHaystack != 0 && zHaystack == uintptr(0)) { goto __9 } goto endInstrOOM __9: ; firstChar = *(*uint8)(unsafe.Pointer(zNeedle)) __10: if !(nNeedle <= nHaystack && (int32(*(*uint8)(unsafe.Pointer(zHaystack))) != int32(firstChar) || libc.Xmemcmp(tls, zHaystack, zNeedle, uint64(nNeedle)) != 0)) { goto __11 } N++ __12: nHaystack-- zHaystack++ goto __13 __13: if isText != 0 && int32(*(*uint8)(unsafe.Pointer(zHaystack)))&0xc0 == 0x80 { goto __12 } goto __14 __14: ; goto __10 __11: ; if !(nNeedle > nHaystack) { goto __15 } N = 0 __15: ; __2: ; Xsqlite3_result_int(tls, context, N) endInstr: Xsqlite3_value_free(tls, pC1) Xsqlite3_value_free(tls, pC2) return endInstrOOM: Xsqlite3_result_error_nomem(tls, context) goto endInstr } func printfFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(56) defer tls.Free(56) var zFormat uintptr var n int32 var db uintptr = Xsqlite3_context_db_handle(tls, context) if argc >= 1 && libc.AssignUintptr(&zFormat, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv)))) != uintptr(0) { (*PrintfArguments)(unsafe.Pointer(bp + 40)).FnArg = argc - 1 (*PrintfArguments)(unsafe.Pointer(bp + 40)).FnUsed = 0 (*PrintfArguments)(unsafe.Pointer(bp + 40)).FapArg = argv + uintptr(1)*8 Xsqlite3StrAccumInit(tls, bp+8, db, uintptr(0), 0, *(*int32)(unsafe.Pointer(db + 136))) (*StrAccum)(unsafe.Pointer(bp + 8)).FprintfFlags = U8(SQLITE_PRINTF_SQLFUNC) Xsqlite3_str_appendf(tls, bp+8, zFormat, libc.VaList(bp, bp+40)) n = int32((*StrAccum)(unsafe.Pointer(bp + 8)).FnChar) Xsqlite3_result_text(tls, context, Xsqlite3StrAccumFinish(tls, bp+8), n, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) } } func substrFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var z uintptr var z2 uintptr var len int32 var p0type int32 var p1 I64 var p2 I64 var negP2 int32 = 0 if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) == SQLITE_NULL || argc == 3 && Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) == SQLITE_NULL { return } p0type = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) p1 = I64(Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8)))) if p0type == SQLITE_BLOB { len = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) z = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv))) if z == uintptr(0) { return } } else { z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if z == uintptr(0) { return } len = 0 if p1 < int64(0) { for z2 = z; *(*uint8)(unsafe.Pointer(z2)) != 0; len++ { { if int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z2, 1)))) >= 0xc0 { for int32(*(*uint8)(unsafe.Pointer(z2)))&0xc0 == 0x80 { z2++ } } } } } } if argc == 3 { p2 = I64(Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8)))) if p2 < int64(0) { p2 = -p2 negP2 = 1 } } else { p2 = I64(*(*int32)(unsafe.Pointer(Xsqlite3_context_db_handle(tls, context) + 136))) } if p1 < int64(0) { p1 = p1 + I64(len) if p1 < int64(0) { p2 = p2 + p1 if p2 < int64(0) { p2 = int64(0) } p1 = int64(0) } } else if p1 > int64(0) { p1-- } else if p2 > int64(0) { p2-- } if negP2 != 0 { p1 = p1 - p2 if p1 < int64(0) { p2 = p2 + p1 p1 = int64(0) } } if p0type != SQLITE_BLOB { for *(*uint8)(unsafe.Pointer(z)) != 0 && p1 != 0 { { if int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1)))) >= 0xc0 { for int32(*(*uint8)(unsafe.Pointer(z)))&0xc0 == 0x80 { z++ } } } p1-- } for z2 = z; *(*uint8)(unsafe.Pointer(z2)) != 0 && p2 != 0; p2-- { { if int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z2, 1)))) >= 0xc0 { for int32(*(*uint8)(unsafe.Pointer(z2)))&0xc0 == 0x80 { z2++ } } } } Xsqlite3_result_text64(tls, context, z, uint64((int64(z2)-int64(z))/1), libc.UintptrFromInt32(-1), uint8(SQLITE_UTF8)) } else { if p1+p2 > I64(len) { p2 = I64(len) - p1 if p2 < int64(0) { p2 = int64(0) } } Xsqlite3_result_blob64(tls, context, z+uintptr(p1), U64(p2), libc.UintptrFromInt32(-1)) } } func roundFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(24) defer tls.Free(24) var n int32 = 0 var zBuf uintptr if argc == 2 { if SQLITE_NULL == Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) { return } n = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if n > 30 { n = 30 } if n < 0 { n = 0 } } if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) == SQLITE_NULL { return } *(*float64)(unsafe.Pointer(bp + 16)) = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) if *(*float64)(unsafe.Pointer(bp + 16)) < -4503599627370496.0 || *(*float64)(unsafe.Pointer(bp + 16)) > +4503599627370496.0 { } else if n == 0 { *(*float64)(unsafe.Pointer(bp + 16)) = float64(libc.Int64FromFloat64(*(*float64)(unsafe.Pointer(bp + 16)) + func() float64 { if *(*float64)(unsafe.Pointer(bp + 16)) < float64(0) { return -0.5 } return +0.5 }())) } else { zBuf = Xsqlite3_mprintf(tls, ts+16220, libc.VaList(bp, n, *(*float64)(unsafe.Pointer(bp + 16)))) if zBuf == uintptr(0) { Xsqlite3_result_error_nomem(tls, context) return } Xsqlite3AtoF(tls, zBuf, bp+16, Xsqlite3Strlen30(tls, zBuf), uint8(SQLITE_UTF8)) Xsqlite3_free(tls, zBuf) } Xsqlite3_result_double(tls, context, *(*float64)(unsafe.Pointer(bp + 16))) } func contextMalloc(tls *libc.TLS, context uintptr, nByte I64) uintptr { var z uintptr var db uintptr = Xsqlite3_context_db_handle(tls, context) if nByte > I64(*(*int32)(unsafe.Pointer(db + 136))) { Xsqlite3_result_error_toobig(tls, context) z = uintptr(0) } else { z = Xsqlite3Malloc(tls, uint64(nByte)) if !(z != 0) { Xsqlite3_result_error_nomem(tls, context) } } return z } func upperFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var z1 uintptr var z2 uintptr var i int32 var n int32 _ = argc z2 = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) n = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) if z2 != 0 { z1 = contextMalloc(tls, context, I64(n)+int64(1)) if z1 != 0 { for i = 0; i < n; i++ { *(*int8)(unsafe.Pointer(z1 + uintptr(i))) = int8(int32(*(*int8)(unsafe.Pointer(z2 + uintptr(i)))) & ^(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z2 + uintptr(i))))]) & 0x20)) } Xsqlite3_result_text(tls, context, z1, n, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } } } func lowerFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var z1 uintptr var z2 uintptr var i int32 var n int32 _ = argc z2 = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) n = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) if z2 != 0 { z1 = contextMalloc(tls, context, I64(n)+int64(1)) if z1 != 0 { for i = 0; i < n; i++ { *(*int8)(unsafe.Pointer(z1 + uintptr(i))) = int8(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(z2 + uintptr(i))))]) } Xsqlite3_result_text(tls, context, z1, n, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } } } func randomFunc(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { bp := tls.Alloc(8) defer tls.Free(8) _ = NotUsed _ = NotUsed2 Xsqlite3_randomness(tls, int32(unsafe.Sizeof(Sqlite_int64(0))), bp) if *(*Sqlite_int64)(unsafe.Pointer(bp)) < int64(0) { *(*Sqlite_int64)(unsafe.Pointer(bp)) = -(*(*Sqlite_int64)(unsafe.Pointer(bp)) & (int64(0xffffffff) | int64(0x7fffffff)<<32)) } Xsqlite3_result_int64(tls, context, *(*Sqlite_int64)(unsafe.Pointer(bp))) } func randomBlob(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var n Sqlite3_int64 var p uintptr _ = argc n = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) if n < int64(1) { n = int64(1) } p = contextMalloc(tls, context, n) if p != 0 { Xsqlite3_randomness(tls, int32(n), p) Xsqlite3_result_blob(tls, context, p, int32(n), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } } func last_insert_rowid(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { var db uintptr = Xsqlite3_context_db_handle(tls, context) _ = NotUsed _ = NotUsed2 Xsqlite3_result_int64(tls, context, Xsqlite3_last_insert_rowid(tls, db)) } func changes(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { var db uintptr = Xsqlite3_context_db_handle(tls, context) _ = NotUsed _ = NotUsed2 Xsqlite3_result_int64(tls, context, Xsqlite3_changes64(tls, db)) } func total_changes(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { var db uintptr = Xsqlite3_context_db_handle(tls, context) _ = NotUsed _ = NotUsed2 Xsqlite3_result_int64(tls, context, Xsqlite3_total_changes64(tls, db)) } type compareInfo = struct { FmatchAll U8 FmatchOne U8 FmatchSet U8 FnoCase U8 } var globInfo = compareInfo{FmatchAll: U8('*'), FmatchOne: U8('?'), FmatchSet: U8('[')} var likeInfoNorm = compareInfo{FmatchAll: U8('%'), FmatchOne: U8('_'), FnoCase: U8(1)} var likeInfoAlt = compareInfo{FmatchAll: U8('%'), FmatchOne: U8('_')} func patternCompare(tls *libc.TLS, zPattern uintptr, zString uintptr, pInfo uintptr, matchOther U32) int32 { bp := tls.Alloc(19) defer tls.Free(19) *(*uintptr)(unsafe.Pointer(bp)) = zPattern *(*uintptr)(unsafe.Pointer(bp + 8)) = zString var c U32 var c2 U32 var matchOne U32 = U32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchOne) var matchAll U32 = U32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchAll) var noCase U8 = (*compareInfo)(unsafe.Pointer(pInfo)).FnoCase var zEscaped uintptr = uintptr(0) for libc.AssignUint32(&c, func() uint32 { if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) < 0x80 { return uint32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp)), 1)))) } return Xsqlite3Utf8Read(tls, bp) }()) != U32(0) { if c == matchAll { for libc.AssignUint32(&c, func() uint32 { if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) < 0x80 { return uint32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp)), 1)))) } return Xsqlite3Utf8Read(tls, bp) }()) == matchAll || c == matchOne && matchOne != U32(0) { if c == matchOne && Xsqlite3Utf8Read(tls, bp+8) == U32(0) { return SQLITE_NOWILDCARDMATCH } } if c == U32(0) { return SQLITE_MATCH } else if c == matchOther { if int32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchSet) == 0 { c = Xsqlite3Utf8Read(tls, bp) if c == U32(0) { return SQLITE_NOWILDCARDMATCH } } else { for *(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))) != 0 { var bMatch int32 = patternCompare(tls, *(*uintptr)(unsafe.Pointer(bp))+libc.UintptrFromInt32(-1), *(*uintptr)(unsafe.Pointer(bp + 8)), pInfo, matchOther) if bMatch != SQLITE_NOMATCH { return bMatch } { if int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp + 8)), 1)))) >= 0xc0 { for int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))))&0xc0 == 0x80 { *(*uintptr)(unsafe.Pointer(bp + 8))++ } } } } return SQLITE_NOWILDCARDMATCH } } if c < U32(0x80) { var bMatch int32 if noCase != 0 { *(*int8)(unsafe.Pointer(bp + 16)) = int8(c & U32(^(int32(Xsqlite3CtypeMap[uint8(c)]) & 0x20))) *(*int8)(unsafe.Pointer(bp + 16 + 1)) = int8(Xsqlite3UpperToLower[uint8(c)]) *(*int8)(unsafe.Pointer(bp + 16 + 2)) = int8(0) } else { *(*int8)(unsafe.Pointer(bp + 16)) = int8(c) *(*int8)(unsafe.Pointer(bp + 16 + 1)) = int8(0) } for 1 != 0 { *(*uintptr)(unsafe.Pointer(bp + 8)) += uintptr(libc.Xstrcspn(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), bp+16)) if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8))))) == 0 { break } *(*uintptr)(unsafe.Pointer(bp + 8))++ bMatch = patternCompare(tls, *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 8)), pInfo, matchOther) if bMatch != SQLITE_NOMATCH { return bMatch } } } else { var bMatch int32 for libc.AssignUint32(&c2, func() uint32 { if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8))))) < 0x80 { return uint32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp + 8)), 1)))) } return Xsqlite3Utf8Read(tls, bp+8) }()) != U32(0) { if c2 != c { continue } bMatch = patternCompare(tls, *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 8)), pInfo, matchOther) if bMatch != SQLITE_NOMATCH { return bMatch } } } return SQLITE_NOWILDCARDMATCH } if c == matchOther { if int32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchSet) == 0 { c = Xsqlite3Utf8Read(tls, bp) if c == U32(0) { return SQLITE_NOMATCH } zEscaped = *(*uintptr)(unsafe.Pointer(bp)) } else { var prior_c U32 = U32(0) var seen int32 = 0 var invert int32 = 0 c = Xsqlite3Utf8Read(tls, bp+8) if c == U32(0) { return SQLITE_NOMATCH } c2 = Xsqlite3Utf8Read(tls, bp) if c2 == U32('^') { invert = 1 c2 = Xsqlite3Utf8Read(tls, bp) } if c2 == U32(']') { if c == U32(']') { seen = 1 } c2 = Xsqlite3Utf8Read(tls, bp) } for c2 != 0 && c2 != U32(']') { if c2 == U32('-') && int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) != ']' && int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) != 0 && prior_c > U32(0) { c2 = Xsqlite3Utf8Read(tls, bp) if c >= prior_c && c <= c2 { seen = 1 } prior_c = U32(0) } else { if c == c2 { seen = 1 } prior_c = c2 } c2 = Xsqlite3Utf8Read(tls, bp) } if c2 == U32(0) || seen^invert == 0 { return SQLITE_NOMATCH } continue } } c2 = func() uint32 { if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8))))) < 0x80 { return uint32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp + 8)), 1)))) } return Xsqlite3Utf8Read(tls, bp+8) }() if c == c2 { continue } if noCase != 0 && int32(Xsqlite3UpperToLower[uint8(c)]) == int32(Xsqlite3UpperToLower[uint8(c2)]) && c < U32(0x80) && c2 < U32(0x80) { continue } if c == matchOne && *(*uintptr)(unsafe.Pointer(bp)) != zEscaped && c2 != U32(0) { continue } return SQLITE_NOMATCH } if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8))))) == 0 { return SQLITE_MATCH } return SQLITE_NOMATCH } // The sqlite3_strglob() interface. Return 0 on a match (like strcmp()) and // non-zero if there is no match. func Xsqlite3_strglob(tls *libc.TLS, zGlobPattern uintptr, zString uintptr) int32 { if zString == uintptr(0) { return libc.Bool32(zGlobPattern != uintptr(0)) } else if zGlobPattern == uintptr(0) { return 1 } else { return patternCompare(tls, zGlobPattern, zString, uintptr(unsafe.Pointer(&globInfo)), uint32('[')) } return int32(0) } // The sqlite3_strlike() interface. Return 0 on a match and non-zero for // a miss - like strcmp(). func Xsqlite3_strlike(tls *libc.TLS, zPattern uintptr, zStr uintptr, esc uint32) int32 { if zStr == uintptr(0) { return libc.Bool32(zPattern != uintptr(0)) } else if zPattern == uintptr(0) { return 1 } else { return patternCompare(tls, zPattern, zStr, uintptr(unsafe.Pointer(&likeInfoNorm)), esc) } return int32(0) } func likeFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(12) defer tls.Free(12) var zA uintptr var zB uintptr var escape U32 var nPat int32 var db uintptr = Xsqlite3_context_db_handle(tls, context) var pInfo uintptr = Xsqlite3_user_data(tls, context) if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) == SQLITE_BLOB || Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) == SQLITE_BLOB { Xsqlite3_result_int(tls, context, 0) return } nPat = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) if nPat > *(*int32)(unsafe.Pointer(db + 136 + 8*4)) { Xsqlite3_result_error(tls, context, ts+16225, -1) return } if argc == 3 { *(*uintptr)(unsafe.Pointer(bp)) = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) if *(*uintptr)(unsafe.Pointer(bp)) == uintptr(0) { return } if Xsqlite3Utf8CharLen(tls, *(*uintptr)(unsafe.Pointer(bp)), -1) != 1 { Xsqlite3_result_error(tls, context, ts+16258, -1) return } escape = Xsqlite3Utf8Read(tls, bp) if escape == U32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchAll) || escape == U32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchOne) { libc.Xmemcpy(tls, bp+8, pInfo, uint64(unsafe.Sizeof(compareInfo{}))) pInfo = bp + 8 if escape == U32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchAll) { (*compareInfo)(unsafe.Pointer(pInfo)).FmatchAll = U8(0) } if escape == U32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchOne) { (*compareInfo)(unsafe.Pointer(pInfo)).FmatchOne = U8(0) } } } else { escape = U32((*compareInfo)(unsafe.Pointer(pInfo)).FmatchSet) } zB = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) zA = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if zA != 0 && zB != 0 { Xsqlite3_result_int(tls, context, libc.Bool32(patternCompare(tls, zB, zA, pInfo, escape) == SQLITE_MATCH)) } } func nullifFunc(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { var pColl uintptr = sqlite3GetFuncCollSeq(tls, context) _ = NotUsed if Xsqlite3MemCompare(tls, *(*uintptr)(unsafe.Pointer(argv)), *(*uintptr)(unsafe.Pointer(argv + 1*8)), pColl) != 0 { Xsqlite3_result_value(tls, context, *(*uintptr)(unsafe.Pointer(argv))) } } func versionFunc(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { _ = NotUsed _ = NotUsed2 Xsqlite3_result_text(tls, context, Xsqlite3_libversion(tls), -1, uintptr(0)) } func sourceidFunc(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { _ = NotUsed _ = NotUsed2 Xsqlite3_result_text(tls, context, Xsqlite3_sourceid(tls), -1, uintptr(0)) } func errlogFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(8) defer tls.Free(8) _ = argc _ = context Xsqlite3_log(tls, Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv))), ts+4493, libc.VaList(bp, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))))) } func compileoptionusedFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var zOptName uintptr _ = argc if libc.AssignUintptr(&zOptName, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv)))) != uintptr(0) { Xsqlite3_result_int(tls, context, Xsqlite3_compileoption_used(tls, zOptName)) } } func compileoptiongetFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var n int32 _ = argc n = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv))) Xsqlite3_result_text(tls, context, Xsqlite3_compileoption_get(tls, n), -1, uintptr(0)) } var hexdigits = [16]int8{ int8('0'), int8('1'), int8('2'), int8('3'), int8('4'), int8('5'), int8('6'), int8('7'), int8('8'), int8('9'), int8('A'), int8('B'), int8('C'), int8('D'), int8('E'), int8('F'), } // Append to pStr text that is the SQL literal representation of the // value contained in pValue. func Xsqlite3QuoteValue(tls *libc.TLS, pStr uintptr, pValue uintptr) { bp := tls.Alloc(40) defer tls.Free(40) switch Xsqlite3_value_type(tls, pValue) { case SQLITE_FLOAT: { var r1 float64 var zVal uintptr r1 = Xsqlite3_value_double(tls, pValue) Xsqlite3_str_appendf(tls, pStr, ts+6277, libc.VaList(bp, r1)) zVal = Xsqlite3_str_value(tls, pStr) if zVal != 0 { Xsqlite3AtoF(tls, zVal, bp+32, int32((*StrAccum)(unsafe.Pointer(pStr)).FnChar), uint8(SQLITE_UTF8)) if r1 != *(*float64)(unsafe.Pointer(bp + 32)) { Xsqlite3_str_reset(tls, pStr) Xsqlite3_str_appendf(tls, pStr, ts+16303, libc.VaList(bp+8, r1)) } } break } case SQLITE_INTEGER: { Xsqlite3_str_appendf(tls, pStr, ts+1324, libc.VaList(bp+16, Xsqlite3_value_int64(tls, pValue))) break } case SQLITE_BLOB: { var zBlob uintptr = Xsqlite3_value_blob(tls, pValue) var nBlob I64 = I64(Xsqlite3_value_bytes(tls, pValue)) Xsqlite3StrAccumEnlarge(tls, pStr, nBlob*int64(2)+int64(4)) if int32((*StrAccum)(unsafe.Pointer(pStr)).FaccError) == 0 { var zText uintptr = (*StrAccum)(unsafe.Pointer(pStr)).FzText var i int32 for i = 0; I64(i) < nBlob; i++ { *(*int8)(unsafe.Pointer(zText + uintptr(i*2+2))) = hexdigits[int32(*(*int8)(unsafe.Pointer(zBlob + uintptr(i))))>>4&0x0F] *(*int8)(unsafe.Pointer(zText + uintptr(i*2+3))) = hexdigits[int32(*(*int8)(unsafe.Pointer(zBlob + uintptr(i))))&0x0F] } *(*int8)(unsafe.Pointer(zText + uintptr(nBlob*int64(2)+int64(2)))) = int8('\'') *(*int8)(unsafe.Pointer(zText + uintptr(nBlob*int64(2)+int64(3)))) = int8(0) *(*int8)(unsafe.Pointer(zText)) = int8('X') *(*int8)(unsafe.Pointer(zText + 1)) = int8('\'') (*StrAccum)(unsafe.Pointer(pStr)).FnChar = U32(nBlob*int64(2) + int64(3)) } break } case SQLITE_TEXT: { var zArg uintptr = Xsqlite3_value_text(tls, pValue) Xsqlite3_str_appendf(tls, pStr, ts+16310, libc.VaList(bp+24, zArg)) break } default: { Xsqlite3_str_append(tls, pStr, ts+1545, 4) break } } } func quoteFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(32) defer tls.Free(32) var db uintptr = Xsqlite3_context_db_handle(tls, context) _ = argc Xsqlite3StrAccumInit(tls, bp, db, uintptr(0), 0, *(*int32)(unsafe.Pointer(db + 136))) Xsqlite3QuoteValue(tls, bp, *(*uintptr)(unsafe.Pointer(argv))) Xsqlite3_result_text(tls, context, Xsqlite3StrAccumFinish(tls, bp), int32((*Sqlite3_str)(unsafe.Pointer(bp)).FnChar), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) if int32((*Sqlite3_str)(unsafe.Pointer(bp)).FaccError) != SQLITE_OK { Xsqlite3_result_null(tls, context) Xsqlite3_result_error_code(tls, context, int32((*Sqlite3_str)(unsafe.Pointer(bp)).FaccError)) } } func unicodeFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) _ = argc if *(*uintptr)(unsafe.Pointer(bp)) != 0 && *(*uint8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))) != 0 { Xsqlite3_result_int(tls, context, int32(Xsqlite3Utf8Read(tls, bp))) } } func charFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var z uintptr var zOut uintptr var i int32 zOut = libc.AssignUintptr(&z, Xsqlite3_malloc64(tls, uint64(argc*4+1))) if z == uintptr(0) { Xsqlite3_result_error_nomem(tls, context) return } for i = 0; i < argc; i++ { var x Sqlite3_int64 var c uint32 x = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) if x < int64(0) || x > int64(0x10ffff) { x = int64(0xfffd) } c = uint32(x & int64(0x1fffff)) if c < uint32(0x00080) { *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = U8(c & uint32(0xFF)) } else if c < uint32(0x00800) { *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0xC0 + int32(U8(c>>6&uint32(0x1F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) } else if c < uint32(0x10000) { *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0xE0 + int32(U8(c>>12&uint32(0x0F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0x80 + int32(U8(c>>6&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) } else { *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0xF0 + int32(U8(c>>18&uint32(0x07)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0x80 + int32(U8(c>>12&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0x80 + int32(U8(c>>6&uint32(0x3F)))) *(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = uint8(0x80 + int32(U8(c&uint32(0x3F)))) } } Xsqlite3_result_text64(tls, context, z, uint64((int64(zOut)-int64(z))/1), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free})), uint8(SQLITE_UTF8)) } func hexFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var i int32 var n int32 var pBlob uintptr var zHex uintptr var z uintptr _ = argc pBlob = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv))) n = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) z = libc.AssignUintptr(&zHex, contextMalloc(tls, context, I64(n)*int64(2)+int64(1))) if zHex != 0 { i = 0 __1: if !(i < n) { goto __3 } { var c uint8 = *(*uint8)(unsafe.Pointer(pBlob)) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = hexdigits[int32(c)>>4&0xf] *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))) = hexdigits[int32(c)&0xf] } goto __2 __2: i++ pBlob++ goto __1 goto __3 __3: ; *(*int8)(unsafe.Pointer(z)) = int8(0) Xsqlite3_result_text(tls, context, zHex, n*2, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } } func strContainsChar(tls *libc.TLS, zStr uintptr, nStr int32, ch U32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var zEnd uintptr = zStr + uintptr(nStr) *(*uintptr)(unsafe.Pointer(bp)) = zStr for *(*uintptr)(unsafe.Pointer(bp)) < zEnd { var tst U32 = func() uint32 { if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) < 0x80 { return uint32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp)), 1)))) } return Xsqlite3Utf8Read(tls, bp) }() if tst == ch { return 1 } } return 0 } func unhexFunc(tls *libc.TLS, pCtx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var zPass uintptr var nPass int32 var nHex int32 var pBlob uintptr var p uintptr var ch U32 var c U8 var d U8 zPass = ts + 1544 nPass = 0 *(*uintptr)(unsafe.Pointer(bp)) = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) nHex = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) pBlob = uintptr(0) p = uintptr(0) if !(argc == 2) { goto __1 } zPass = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) nPass = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) __1: ; if !(!(*(*uintptr)(unsafe.Pointer(bp)) != 0) || !(zPass != 0)) { goto __2 } return __2: ; p = libc.AssignUintptr(&pBlob, contextMalloc(tls, pCtx, int64(nHex/2+1))) if !(pBlob != 0) { goto __3 } __4: if !(int32(libc.AssignUint8(&c, *(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))))) != 0x00) { goto __5 } __6: if !!(int32(Xsqlite3CtypeMap[c])&0x08 != 0) { goto __7 } ch = func() uint32 { if int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) < 0x80 { return uint32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp)), 1)))) } return Xsqlite3Utf8Read(tls, bp) }() if !!(strContainsChar(tls, zPass, nPass, ch) != 0) { goto __8 } goto unhex_null __8: ; c = *(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))) if !(int32(c) == 0x00) { goto __9 } goto unhex_done __9: ; goto __6 __7: ; *(*uintptr)(unsafe.Pointer(bp))++ d = *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&*(*uintptr)(unsafe.Pointer(bp)), 1))) if !!(int32(Xsqlite3CtypeMap[d])&0x08 != 0) { goto __10 } goto unhex_null __10: ; *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&p, 1))) = U8(int32(Xsqlite3HexToInt(tls, int32(c)))<<4 | int32(Xsqlite3HexToInt(tls, int32(d)))) goto __4 __5: ; __3: ; unhex_done: Xsqlite3_result_blob(tls, pCtx, pBlob, int32((int64(p)-int64(pBlob))/1), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) return unhex_null: Xsqlite3_free(tls, pBlob) return } func zeroblobFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var n I64 var rc int32 _ = argc n = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) if n < int64(0) { n = int64(0) } rc = Xsqlite3_result_zeroblob64(tls, context, uint64(n)) if rc != 0 { Xsqlite3_result_error_code(tls, context, rc) } } func replaceFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var zStr uintptr var zPattern uintptr var zRep uintptr var zOut uintptr var nStr int32 var nPattern int32 var nRep int32 var nOut I64 var loopLimit int32 var i int32 var j int32 var cntExpand uint32 var db uintptr = Xsqlite3_context_db_handle(tls, context) _ = argc zStr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if zStr == uintptr(0) { return } nStr = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) zPattern = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if zPattern == uintptr(0) { return } if int32(*(*uint8)(unsafe.Pointer(zPattern))) == 0 { Xsqlite3_result_value(tls, context, *(*uintptr)(unsafe.Pointer(argv))) return } nPattern = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) zRep = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) if zRep == uintptr(0) { return } nRep = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) nOut = I64(nStr + 1) zOut = contextMalloc(tls, context, nOut) if zOut == uintptr(0) { return } loopLimit = nStr - nPattern cntExpand = uint32(0) for i = libc.AssignInt32(&j, 0); i <= loopLimit; i++ { if int32(*(*uint8)(unsafe.Pointer(zStr + uintptr(i)))) != int32(*(*uint8)(unsafe.Pointer(zPattern))) || libc.Xmemcmp(tls, zStr+uintptr(i), zPattern, uint64(nPattern)) != 0 { *(*uint8)(unsafe.Pointer(zOut + uintptr(libc.PostIncInt32(&j, 1)))) = *(*uint8)(unsafe.Pointer(zStr + uintptr(i))) } else { if nRep > nPattern { nOut = nOut + I64(nRep-nPattern) if nOut-int64(1) > I64(*(*int32)(unsafe.Pointer(db + 136))) { Xsqlite3_result_error_toobig(tls, context) Xsqlite3_free(tls, zOut) return } cntExpand++ if cntExpand&(cntExpand-uint32(1)) == uint32(0) { var zOld uintptr zOld = zOut zOut = Xsqlite3Realloc(tls, zOut, uint64(I64(int32(nOut))+(nOut-I64(nStr)-int64(1)))) if zOut == uintptr(0) { Xsqlite3_result_error_nomem(tls, context) Xsqlite3_free(tls, zOld) return } } } libc.Xmemcpy(tls, zOut+uintptr(j), zRep, uint64(nRep)) j = j + nRep i = i + (nPattern - 1) } } libc.Xmemcpy(tls, zOut+uintptr(j), zStr+uintptr(i), uint64(nStr-i)) j = j + (nStr - i) *(*uint8)(unsafe.Pointer(zOut + uintptr(j))) = uint8(0) Xsqlite3_result_text(tls, context, zOut, j, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } func trimFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var zIn uintptr var zCharSet uintptr var nIn uint32 var flags int32 var i int32 var aLen uintptr = uintptr(0) var azChar uintptr = uintptr(0) var nChar int32 if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) == SQLITE_NULL { return } zIn = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if zIn == uintptr(0) { return } nIn = uint32(Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv)))) if argc == 1 { nChar = 1 aLen = uintptr(unsafe.Pointer(&lenOne)) azChar = uintptr(unsafe.Pointer(&azOne)) zCharSet = uintptr(0) } else if libc.AssignUintptr(&zCharSet, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8)))) == uintptr(0) { return } else { var z uintptr z = zCharSet nChar = 0 for ; *(*uint8)(unsafe.Pointer(z)) != 0; nChar++ { { if int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1)))) >= 0xc0 { for int32(*(*uint8)(unsafe.Pointer(z)))&0xc0 == 0x80 { z++ } } } } if nChar > 0 { azChar = contextMalloc(tls, context, int64(uint64(I64(nChar))*(uint64(unsafe.Sizeof(uintptr(0)))+uint64(unsafe.Sizeof(uint32(0)))))) if azChar == uintptr(0) { return } aLen = azChar + uintptr(nChar)*8 z = zCharSet nChar = 0 for ; *(*uint8)(unsafe.Pointer(z)) != 0; nChar++ { *(*uintptr)(unsafe.Pointer(azChar + uintptr(nChar)*8)) = z { if int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1)))) >= 0xc0 { for int32(*(*uint8)(unsafe.Pointer(z)))&0xc0 == 0x80 { z++ } } } *(*uint32)(unsafe.Pointer(aLen + uintptr(nChar)*4)) = uint32((int64(z) - int64(*(*uintptr)(unsafe.Pointer(azChar + uintptr(nChar)*8)))) / 1) } } } if nChar > 0 { flags = int32(Xsqlite3_user_data(tls, context)) if flags&1 != 0 { for nIn > uint32(0) { var len uint32 = uint32(0) for i = 0; i < nChar; i++ { len = *(*uint32)(unsafe.Pointer(aLen + uintptr(i)*4)) if len <= nIn && libc.Xmemcmp(tls, zIn, *(*uintptr)(unsafe.Pointer(azChar + uintptr(i)*8)), uint64(len)) == 0 { break } } if i >= nChar { break } zIn += uintptr(len) nIn = nIn - len } } if flags&2 != 0 { for nIn > uint32(0) { var len uint32 = uint32(0) for i = 0; i < nChar; i++ { len = *(*uint32)(unsafe.Pointer(aLen + uintptr(i)*4)) if len <= nIn && libc.Xmemcmp(tls, zIn+uintptr(nIn-len), *(*uintptr)(unsafe.Pointer(azChar + uintptr(i)*8)), uint64(len)) == 0 { break } } if i >= nChar { break } nIn = nIn - len } } if zCharSet != 0 { Xsqlite3_free(tls, azChar) } } Xsqlite3_result_text(tls, context, zIn, int32(nIn), libc.UintptrFromInt32(-1)) } var lenOne = [1]uint32{uint32(1)} var azOne = [1]uintptr{ts + 12272} func soundexFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var zIn uintptr var i int32 var j int32 zIn = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if zIn == uintptr(0) { zIn = ts + 1544 } for i = 0; *(*U8)(unsafe.Pointer(zIn + uintptr(i))) != 0 && !(int32(Xsqlite3CtypeMap[*(*U8)(unsafe.Pointer(zIn + uintptr(i)))])&0x02 != 0); i++ { } if *(*U8)(unsafe.Pointer(zIn + uintptr(i))) != 0 { var prevcode U8 = iCode[int32(*(*U8)(unsafe.Pointer(zIn + uintptr(i))))&0x7f] *(*int8)(unsafe.Pointer(bp)) = int8(int32(*(*U8)(unsafe.Pointer(zIn + uintptr(i)))) & ^(int32(Xsqlite3CtypeMap[*(*U8)(unsafe.Pointer(zIn + uintptr(i)))]) & 0x20)) for j = 1; j < 4 && *(*U8)(unsafe.Pointer(zIn + uintptr(i))) != 0; i++ { var code int32 = int32(iCode[int32(*(*U8)(unsafe.Pointer(zIn + uintptr(i))))&0x7f]) if code > 0 { if code != int32(prevcode) { prevcode = U8(code) *(*int8)(unsafe.Pointer(bp + uintptr(libc.PostIncInt32(&j, 1)))) = int8(code + '0') } } else { prevcode = U8(0) } } for j < 4 { *(*int8)(unsafe.Pointer(bp + uintptr(libc.PostIncInt32(&j, 1)))) = int8('0') } *(*int8)(unsafe.Pointer(bp + uintptr(j))) = int8(0) Xsqlite3_result_text(tls, context, bp, 4, libc.UintptrFromInt32(-1)) } else { Xsqlite3_result_text(tls, context, ts+16313, 4, uintptr(0)) } } var iCode = [128]uint8{ uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(1), uint8(2), uint8(3), uint8(0), uint8(1), uint8(2), uint8(0), uint8(0), uint8(2), uint8(2), uint8(4), uint8(5), uint8(5), uint8(0), uint8(1), uint8(2), uint8(6), uint8(2), uint8(3), uint8(0), uint8(1), uint8(0), uint8(2), uint8(0), uint8(2), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(1), uint8(2), uint8(3), uint8(0), uint8(1), uint8(2), uint8(0), uint8(0), uint8(2), uint8(2), uint8(4), uint8(5), uint8(5), uint8(0), uint8(1), uint8(2), uint8(6), uint8(2), uint8(3), uint8(0), uint8(1), uint8(0), uint8(2), uint8(0), uint8(2), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), } func loadExt(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var zFile uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) var zProc uintptr var db uintptr = Xsqlite3_context_db_handle(tls, context) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_LoadExtFunc) == uint64(0) { Xsqlite3_result_error(tls, context, ts+13452, -1) return } if argc == 2 { zProc = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) } else { zProc = uintptr(0) } if zFile != 0 && Xsqlite3_load_extension(tls, db, zFile, zProc, bp) != 0 { Xsqlite3_result_error(tls, context, *(*uintptr)(unsafe.Pointer(bp)), -1) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) } } // An instance of the following structure holds the context of a // sum() or avg() aggregate computation. type SumCtx1 = struct { FrSum float64 FiSum I64 Fcnt I64 Foverflow U8 Fapprox U8 F__ccgo_pad1 [6]byte } // An instance of the following structure holds the context of a // sum() or avg() aggregate computation. type SumCtx = SumCtx1 func sumStep(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr var type1 int32 _ = argc p = Xsqlite3_aggregate_context(tls, context, int32(unsafe.Sizeof(SumCtx{}))) type1 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) if p != 0 && type1 != SQLITE_NULL { (*SumCtx)(unsafe.Pointer(p)).Fcnt++ if type1 == SQLITE_INTEGER { var v I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) *(*float64)(unsafe.Pointer(p)) += float64(v) if int32((*SumCtx)(unsafe.Pointer(p)).Fapprox)|int32((*SumCtx)(unsafe.Pointer(p)).Foverflow) == 0 && Xsqlite3AddInt64(tls, p+8, v) != 0 { (*SumCtx)(unsafe.Pointer(p)).Fapprox = libc.AssignPtrUint8(p+24, U8(1)) } } else { *(*float64)(unsafe.Pointer(p)) += Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) (*SumCtx)(unsafe.Pointer(p)).Fapprox = U8(1) } } } func sumInverse(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr var type1 int32 _ = argc p = Xsqlite3_aggregate_context(tls, context, int32(unsafe.Sizeof(SumCtx{}))) type1 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) if p != 0 && type1 != SQLITE_NULL { (*SumCtx)(unsafe.Pointer(p)).Fcnt-- if type1 == SQLITE_INTEGER && int32((*SumCtx)(unsafe.Pointer(p)).Fapprox) == 0 { var v I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) *(*float64)(unsafe.Pointer(p)) -= float64(v) *(*I64)(unsafe.Pointer(p + 8)) -= v } else { *(*float64)(unsafe.Pointer(p)) -= Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) } } } func sumFinalize(tls *libc.TLS, context uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, context, 0) if p != 0 && (*SumCtx)(unsafe.Pointer(p)).Fcnt > int64(0) { if (*SumCtx)(unsafe.Pointer(p)).Foverflow != 0 { Xsqlite3_result_error(tls, context, ts+16203, -1) } else if (*SumCtx)(unsafe.Pointer(p)).Fapprox != 0 { Xsqlite3_result_double(tls, context, (*SumCtx)(unsafe.Pointer(p)).FrSum) } else { Xsqlite3_result_int64(tls, context, (*SumCtx)(unsafe.Pointer(p)).FiSum) } } } func avgFinalize(tls *libc.TLS, context uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, context, 0) if p != 0 && (*SumCtx)(unsafe.Pointer(p)).Fcnt > int64(0) { Xsqlite3_result_double(tls, context, (*SumCtx)(unsafe.Pointer(p)).FrSum/float64((*SumCtx)(unsafe.Pointer(p)).Fcnt)) } } func totalFinalize(tls *libc.TLS, context uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, context, 0) Xsqlite3_result_double(tls, context, func() float64 { if p != 0 { return (*SumCtx)(unsafe.Pointer(p)).FrSum } return float64(0) }()) } // The following structure keeps track of state information for the // count() aggregate function. type CountCtx1 = struct{ Fn I64 } // The following structure keeps track of state information for the // count() aggregate function. type CountCtx = CountCtx1 func countStep(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, context, int32(unsafe.Sizeof(CountCtx{}))) if (argc == 0 || SQLITE_NULL != Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv)))) && p != 0 { (*CountCtx)(unsafe.Pointer(p)).Fn++ } } func countFinalize(tls *libc.TLS, context uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, context, 0) Xsqlite3_result_int64(tls, context, func() int64 { if p != 0 { return (*CountCtx)(unsafe.Pointer(p)).Fn } return int64(0) }()) } func countInverse(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, ctx, int32(unsafe.Sizeof(CountCtx{}))) if (argc == 0 || SQLITE_NULL != Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv)))) && p != 0 { (*CountCtx)(unsafe.Pointer(p)).Fn-- } } func minmaxStep(tls *libc.TLS, context uintptr, NotUsed int32, argv uintptr) { var pArg uintptr = *(*uintptr)(unsafe.Pointer(argv)) var pBest uintptr _ = NotUsed pBest = Xsqlite3_aggregate_context(tls, context, int32(unsafe.Sizeof(Mem{}))) if !(pBest != 0) { return } if Xsqlite3_value_type(tls, pArg) == SQLITE_NULL { if (*Mem)(unsafe.Pointer(pBest)).Fflags != 0 { sqlite3SkipAccumulatorLoad(tls, context) } } else if (*Mem)(unsafe.Pointer(pBest)).Fflags != 0 { var max int32 var cmp int32 var pColl uintptr = sqlite3GetFuncCollSeq(tls, context) max = libc.Bool32(Xsqlite3_user_data(tls, context) != uintptr(0)) cmp = Xsqlite3MemCompare(tls, pBest, pArg, pColl) if max != 0 && cmp < 0 || !(max != 0) && cmp > 0 { Xsqlite3VdbeMemCopy(tls, pBest, pArg) } else { sqlite3SkipAccumulatorLoad(tls, context) } } else { (*Mem)(unsafe.Pointer(pBest)).Fdb = Xsqlite3_context_db_handle(tls, context) Xsqlite3VdbeMemCopy(tls, pBest, pArg) } } func minMaxValueFinalize(tls *libc.TLS, context uintptr, bValue int32) { var pRes uintptr pRes = Xsqlite3_aggregate_context(tls, context, 0) if pRes != 0 { if (*Sqlite3_value)(unsafe.Pointer(pRes)).Fflags != 0 { Xsqlite3_result_value(tls, context, pRes) } if bValue == 0 { Xsqlite3VdbeMemRelease(tls, pRes) } } } func minMaxValue(tls *libc.TLS, context uintptr) { minMaxValueFinalize(tls, context, 1) } func minMaxFinalize(tls *libc.TLS, context uintptr) { minMaxValueFinalize(tls, context, 0) } // group_concat(EXPR, ?SEPARATOR?) // // The SEPARATOR goes before the EXPR string. This is tragic. The // groupConcatInverse() implementation would have been easier if the // SEPARATOR were appended after EXPR. And the order is undocumented, // so we could change it, in theory. But the old behavior has been // around for so long that we dare not, for fear of breaking something. type GroupConcatCtx = struct { Fstr StrAccum FnAccum int32 FnFirstSepLength int32 FpnSepLengths uintptr } func groupConcatStep(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var zVal uintptr var pGCC uintptr var zSep uintptr var nVal int32 var nSep int32 if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) == SQLITE_NULL { return } pGCC = Xsqlite3_aggregate_context(tls, context, int32(unsafe.Sizeof(GroupConcatCtx{}))) if pGCC != 0 { var db uintptr = Xsqlite3_context_db_handle(tls, context) var firstTerm int32 = libc.Bool32((*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FmxAlloc == U32(0)) (*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FmxAlloc = U32(*(*int32)(unsafe.Pointer(db + 136))) if argc == 1 { if !(firstTerm != 0) { Xsqlite3_str_appendchar(tls, pGCC, 1, int8(',')) } else { (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnFirstSepLength = 1 } } else if !(firstTerm != 0) { zSep = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) nSep = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if zSep != 0 { Xsqlite3_str_append(tls, pGCC, zSep, nSep) } else { nSep = 0 } if nSep != (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnFirstSepLength || (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths != uintptr(0) { var pnsl uintptr = (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths if pnsl == uintptr(0) { pnsl = Xsqlite3_malloc64(tls, uint64((*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnAccum+1)*uint64(unsafe.Sizeof(int32(0)))) if pnsl != uintptr(0) { var i int32 = 0 var nA int32 = (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnAccum - 1 for i < nA { *(*int32)(unsafe.Pointer(pnsl + uintptr(libc.PostIncInt32(&i, 1))*4)) = (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnFirstSepLength } } } else { pnsl = Xsqlite3_realloc64(tls, pnsl, uint64((*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnAccum)*uint64(unsafe.Sizeof(int32(0)))) } if pnsl != uintptr(0) { if (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnAccum > 0 { *(*int32)(unsafe.Pointer(pnsl + uintptr((*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnAccum-1)*4)) = nSep } (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths = pnsl } else { Xsqlite3StrAccumSetError(tls, pGCC, uint8(SQLITE_NOMEM)) } } } else { (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnFirstSepLength = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) } *(*int32)(unsafe.Pointer(pGCC + 32)) += 1 zVal = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) nVal = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) if zVal != 0 { Xsqlite3_str_append(tls, pGCC, zVal, nVal) } } } func groupConcatInverse(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var pGCC uintptr _ = argc if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv))) == SQLITE_NULL { return } pGCC = Xsqlite3_aggregate_context(tls, context, int32(unsafe.Sizeof(GroupConcatCtx{}))) if pGCC != 0 { var nVS int32 Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) nVS = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) *(*int32)(unsafe.Pointer(pGCC + 32)) -= 1 if (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths != uintptr(0) { if (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnAccum > 0 { nVS = nVS + *(*int32)(unsafe.Pointer((*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths)) libc.Xmemmove(tls, (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths, (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths+uintptr(1)*4, uint64((*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnAccum-1)*uint64(unsafe.Sizeof(int32(0)))) } } else { nVS = nVS + (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FnFirstSepLength } if nVS >= int32((*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FnChar) { (*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FnChar = U32(0) } else { *(*U32)(unsafe.Pointer(pGCC + 24)) -= U32(nVS) libc.Xmemmove(tls, (*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FzText, (*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FzText+uintptr(nVS), uint64((*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FnChar)) } if (*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FnChar == U32(0) { (*GroupConcatCtx)(unsafe.Pointer(pGCC)).Fstr.FmxAlloc = U32(0) Xsqlite3_free(tls, (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths) (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths = uintptr(0) } } } func groupConcatFinalize(tls *libc.TLS, context uintptr) { var pGCC uintptr = Xsqlite3_aggregate_context(tls, context, 0) if pGCC != 0 { Xsqlite3ResultStrAccum(tls, context, pGCC) Xsqlite3_free(tls, (*GroupConcatCtx)(unsafe.Pointer(pGCC)).FpnSepLengths) } } func groupConcatValue(tls *libc.TLS, context uintptr) { var pGCC uintptr = Xsqlite3_aggregate_context(tls, context, 0) if pGCC != 0 { var pAccum uintptr = pGCC if int32((*StrAccum)(unsafe.Pointer(pAccum)).FaccError) == SQLITE_TOOBIG { Xsqlite3_result_error_toobig(tls, context) } else if int32((*StrAccum)(unsafe.Pointer(pAccum)).FaccError) == SQLITE_NOMEM { Xsqlite3_result_error_nomem(tls, context) } else { var zText uintptr = Xsqlite3_str_value(tls, pAccum) Xsqlite3_result_text(tls, context, zText, int32((*StrAccum)(unsafe.Pointer(pAccum)).FnChar), libc.UintptrFromInt32(-1)) } } } // This routine does per-connection function registration. Most // of the built-in functions above are part of the global function set. // This routine only deals with those that are not global. func Xsqlite3RegisterPerConnectionBuiltinFunctions(tls *libc.TLS, db uintptr) { var rc int32 = Xsqlite3_overload_function(tls, db, ts+16318, 2) if rc == SQLITE_NOMEM { Xsqlite3OomFault(tls, db) } } // Re-register the built-in LIKE functions. The caseSensitive // parameter determines whether or not the LIKE operator is case // sensitive. func Xsqlite3RegisterLikeFunctions(tls *libc.TLS, db uintptr, caseSensitive int32) { var pInfo uintptr var flags int32 if caseSensitive != 0 { pInfo = uintptr(unsafe.Pointer(&likeInfoAlt)) flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE } else { pInfo = uintptr(unsafe.Pointer(&likeInfoNorm)) flags = SQLITE_FUNC_LIKE } Xsqlite3CreateFunc(tls, db, ts+16324, 2, SQLITE_UTF8, pInfo, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{likeFunc})), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0)) Xsqlite3CreateFunc(tls, db, ts+16324, 3, SQLITE_UTF8, pInfo, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{likeFunc})), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0)) *(*U32)(unsafe.Pointer(Xsqlite3FindFunction(tls, db, ts+16324, 2, uint8(SQLITE_UTF8), uint8(0)) + 4)) |= U32(flags) *(*U32)(unsafe.Pointer(Xsqlite3FindFunction(tls, db, ts+16324, 3, uint8(SQLITE_UTF8), uint8(0)) + 4)) |= U32(flags) } // pExpr points to an expression which implements a function. If // it is appropriate to apply the LIKE optimization to that function // then set aWc[0] through aWc[2] to the wildcard characters and the // escape character and then return TRUE. If the function is not a // LIKE-style function then return FALSE. // // The expression "a LIKE b ESCAPE c" is only considered a valid LIKE // operator if c is a string literal that is exactly one byte in length. // That one byte is stored in aWc[3]. aWc[3] is set to zero if there is // no ESCAPE clause. // // *pIsNocase is set to true if uppercase and lowercase are equivalent for // the function (default for LIKE). If the function makes the distinction // between uppercase and lowercase (as does GLOB) then *pIsNocase is set to // false. func Xsqlite3IsLikeFunction(tls *libc.TLS, db uintptr, pExpr uintptr, pIsNocase uintptr, aWc uintptr) int32 { var pDef uintptr var nExpr int32 if !(int32(*(*uintptr)(unsafe.Pointer(pExpr + 32))) != 0) { return 0 } nExpr = (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FnExpr pDef = Xsqlite3FindFunction(tls, db, *(*uintptr)(unsafe.Pointer(pExpr + 8)), nExpr, uint8(SQLITE_UTF8), uint8(0)) if pDef == uintptr(0) || (*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_LIKE) == U32(0) { return 0 } libc.Xmemcpy(tls, aWc, (*FuncDef)(unsafe.Pointer(pDef)).FpUserData, uint64(3)) if nExpr < 3 { *(*int8)(unsafe.Pointer(aWc + 3)) = int8(0) } else { var pEscape uintptr = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)) + 8 + 2*32)).FpExpr var zEscape uintptr if int32((*Expr)(unsafe.Pointer(pEscape)).Fop) != TK_STRING { return 0 } zEscape = *(*uintptr)(unsafe.Pointer(pEscape + 8)) if int32(*(*int8)(unsafe.Pointer(zEscape))) == 0 || int32(*(*int8)(unsafe.Pointer(zEscape + 1))) != 0 { return 0 } if int32(*(*int8)(unsafe.Pointer(zEscape))) == int32(*(*int8)(unsafe.Pointer(aWc))) { return 0 } if int32(*(*int8)(unsafe.Pointer(zEscape))) == int32(*(*int8)(unsafe.Pointer(aWc + 1))) { return 0 } *(*int8)(unsafe.Pointer(aWc + 3)) = *(*int8)(unsafe.Pointer(zEscape)) } *(*int32)(unsafe.Pointer(pIsNocase)) = libc.Bool32((*FuncDef)(unsafe.Pointer(pDef)).FfuncFlags&U32(SQLITE_FUNC_CASE) == U32(0)) return 1 } func ceilingFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { switch Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) { case SQLITE_INTEGER: { Xsqlite3_result_int64(tls, context, Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv)))) break } case SQLITE_FLOAT: { var x uintptr = Xsqlite3_user_data(tls, context) Xsqlite3_result_double(tls, context, (*struct { f func(*libc.TLS, float64) float64 })(unsafe.Pointer(&struct{ uintptr }{x})).f(tls, Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))))) break } default: { break } } } func xCeil(tls *libc.TLS, x float64) float64 { return libc.Xceil(tls, x) } func xFloor(tls *libc.TLS, x float64) float64 { return libc.Xfloor(tls, x) } func logFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var x float64 var b float64 var ans float64 switch Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) { case SQLITE_INTEGER: fallthrough case SQLITE_FLOAT: x = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) if x <= 0.0 { return } break default: return } if argc == 2 { switch Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) { case SQLITE_INTEGER: fallthrough case SQLITE_FLOAT: b = libc.Xlog(tls, x) if b <= 0.0 { return } x = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if x <= 0.0 { return } break fallthrough default: return } ans = libc.Xlog(tls, x) / b } else { switch int32(Xsqlite3_user_data(tls, context)) { case 1: ans = libc.Xlog10(tls, x) break fallthrough case 2: ans = libc.Xlog2(tls, x) break fallthrough default: ans = libc.Xlog(tls, x) break } } Xsqlite3_result_double(tls, context, ans) } func degToRad(tls *libc.TLS, x float64) float64 { return x * (float64(3.14159265358979323846) / 180.0) } func radToDeg(tls *libc.TLS, x float64) float64 { return x * (float64(180.0) / 3.14159265358979323846) } func math1Func(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var type0 int32 var v0 float64 var ans float64 var x uintptr type0 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) if type0 != SQLITE_INTEGER && type0 != SQLITE_FLOAT { return } v0 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) x = Xsqlite3_user_data(tls, context) ans = (*struct { f func(*libc.TLS, float64) float64 })(unsafe.Pointer(&struct{ uintptr }{x})).f(tls, v0) Xsqlite3_result_double(tls, context, ans) } func math2Func(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var type0 int32 var type1 int32 var v0 float64 var v1 float64 var ans float64 var x uintptr type0 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) if type0 != SQLITE_INTEGER && type0 != SQLITE_FLOAT { return } type1 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if type1 != SQLITE_INTEGER && type1 != SQLITE_FLOAT { return } v0 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) v1 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) x = Xsqlite3_user_data(tls, context) ans = (*struct { f func(*libc.TLS, float64, float64) float64 })(unsafe.Pointer(&struct{ uintptr }{x})).f(tls, v0, v1) Xsqlite3_result_double(tls, context, ans) } func piFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { _ = argv Xsqlite3_result_double(tls, context, 3.14159265358979323846) } func signFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var type0 int32 var x float64 _ = argc type0 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) if type0 != SQLITE_INTEGER && type0 != SQLITE_FLOAT { return } x = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) Xsqlite3_result_int(tls, context, func() int32 { if x < 0.0 { return -1 } return func() int32 { if x > 0.0 { return +1 } return 0 }() }()) } // All of the FuncDef structures in the aBuiltinFunc[] array above // to the global function hash table. This occurs at start-time (as // a consequence of calling sqlite3_initialize()). // // After this routine runs func Xsqlite3RegisterBuiltinFunctions(tls *libc.TLS) { Xsqlite3AlterFunctions(tls) Xsqlite3WindowFunctions(tls) Xsqlite3RegisterDateTimeFunctions(tls) Xsqlite3RegisterJsonFunctions(tls) Xsqlite3InsertBuiltinFuncs(tls, uintptr(unsafe.Pointer(&aBuiltinFunc)), int32(uint64(unsafe.Sizeof(aBuiltinFunc))/uint64(unsafe.Sizeof(FuncDef{})))) } var aBuiltinFunc = [103]FuncDef{ {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INTERNAL | SQLITE_FUNC_TEST | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FpUserData: uintptr(int64(INLINEFUNC_implies_nonnull_row)), FxSFunc: 0, FzName: ts + 16329}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INTERNAL | SQLITE_FUNC_TEST | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FpUserData: uintptr(int64(INLINEFUNC_expr_compare)), FxSFunc: 0, FzName: ts + 16349}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INTERNAL | SQLITE_FUNC_TEST | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FpUserData: uintptr(int64(INLINEFUNC_expr_implies_expr)), FxSFunc: 0, FzName: ts + 16362}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INTERNAL | SQLITE_FUNC_TEST | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FpUserData: uintptr(int64(INLINEFUNC_affinity)), FxSFunc: 0, FzName: ts + 16380}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16389}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_DIRECTONLY | SQLITE_FUNC_UNSAFE), FxSFunc: 0, FzName: ts + 16397}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_DIRECTONLY | SQLITE_FUNC_UNSAFE), FxSFunc: 0, FzName: ts + 16397}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 16412}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 16438}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | SQLITE_FUNC_UNLIKELY), FpUserData: uintptr(int64(INLINEFUNC_unlikely)), FxSFunc: 0, FzName: ts + 16463}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | SQLITE_FUNC_UNLIKELY), FpUserData: uintptr(int64(INLINEFUNC_unlikely)), FxSFunc: 0, FzName: ts + 16472}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | SQLITE_FUNC_UNLIKELY), FpUserData: uintptr(int64(INLINEFUNC_unlikely)), FxSFunc: 0, FzName: ts + 16483}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FpUserData: uintptr(int64(INLINEFUNC_sqlite_offset)), FxSFunc: 0, FzName: ts + 16490}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(1)), FxSFunc: 0, FzName: ts + 16504}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(1)), FxSFunc: 0, FzName: ts + 16504}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(2)), FxSFunc: 0, FzName: ts + 16510}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(2)), FxSFunc: 0, FzName: ts + 16510}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(3)), FxSFunc: 0, FzName: ts + 16516}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(3)), FxSFunc: 0, FzName: ts + 16516}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 1*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16521}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 1*SQLITE_FUNC_NEEDCOLL), FzName: ts + 16521}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 1*SQLITE_FUNC_NEEDCOLL | SQLITE_FUNC_MINMAX | SQLITE_FUNC_ANYORDER), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FzName: ts + 16521}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 1*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(1)), FxSFunc: 0, FzName: ts + 16525}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 1*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(1)), FzName: ts + 16525}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 1*SQLITE_FUNC_NEEDCOLL | SQLITE_FUNC_MINMAX | SQLITE_FUNC_ANYORDER), FpUserData: uintptr(int64(1)), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FzName: ts + 16525}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | SQLITE_FUNC_TYPEOF), FxSFunc: 0, FzName: ts + 16529}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | SQLITE_FUNC_TYPEOF), FxSFunc: 0, FzName: ts + 16536}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | SQLITE_FUNC_LENGTH), FxSFunc: 0, FzName: ts + 16544}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16551}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16557}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16564}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16571}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16579}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16584}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16588}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16588}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16594}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16600}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16606}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16610}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16610}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FxSFunc: 0, FzName: ts + 16616}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16623}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16630}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 1*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16641}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 16648}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_SLOCHNG | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 16663}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16680}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16691}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16697}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16715}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16723}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16737}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16745}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16754}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16754}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16761}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16761}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 16771}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 16775}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 16781}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | SQLITE_FUNC_COUNT | SQLITE_FUNC_ANYORDER), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 16785}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | SQLITE_FUNC_ANYORDER), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 16785}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 16791}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 16791}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE), FpUserData: 0, FxSFunc: 0, FzName: ts + 16804}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | SQLITE_FUNC_LIKE), FpUserData: 0, FxSFunc: 0, FzName: ts + 16324}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | SQLITE_FUNC_LIKE), FpUserData: 0, FxSFunc: 0, FzName: ts + 16324}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FzName: ts + 7938}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FzName: ts + 7938}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16809}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16814}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16822}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16828}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16834}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(1)), FxSFunc: 0, FzName: ts + 16837}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(1)), FxSFunc: 0, FzName: ts + 16841}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FpUserData: uintptr(int64(2)), FxSFunc: 0, FzName: ts + 16847}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16837}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16852}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16856}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16860}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16866}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16870}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16875}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16880}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16885}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16891}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16895}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16899}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16903}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16908}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16913}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16918}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16924}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16930}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16936}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16941}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: 0, FxSFunc: 0, FzName: ts + 16949}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16957}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_FUNC_CONSTANT | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL), FxSFunc: 0, FzName: ts + 16960}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FxSFunc: 0, FzName: ts + 7938}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_INLINE | SQLITE_FUNC_CONSTANT | 0), FpUserData: uintptr(int64(INLINEFUNC_iif)), FxSFunc: 0, FzName: ts + 16965}} // A foreign key constraint requires that the key columns in the parent // table are collectively subject to a UNIQUE or PRIMARY KEY constraint. // Given that pParent is the parent table for foreign key constraint pFKey, // search the schema for a unique index on the parent key columns. // // If successful, zero is returned. If the parent key is an INTEGER PRIMARY // KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx // is set to point to the unique index. // // If the parent key consists of a single column (the foreign key constraint // is not a composite foreign key), output variable *paiCol is set to NULL. // Otherwise, it is set to point to an allocated array of size N, where // N is the number of columns in the parent key. The first element of the // array is the index of the child table column that is mapped by the FK // constraint to the parent table column stored in the left-most column // of index *ppIdx. The second element of the array is the index of the // child table column that corresponds to the second left-most column of // *ppIdx, and so on. // // If the required index cannot be found, either because: // // 1. The named parent key columns do not exist, or // // 2. The named parent key columns do exist, but are not subject to a // UNIQUE or PRIMARY KEY constraint, or // // 3. No parent key columns were provided explicitly as part of the // foreign key definition, and the parent table does not have a // PRIMARY KEY, or // // 4. No parent key columns were provided explicitly as part of the // foreign key definition, and the PRIMARY KEY of the parent table // consists of a different number of columns to the child key in // the child table. // // then non-zero is returned, and a "foreign key mismatch" error loaded // into pParse. If an OOM error occurs, non-zero is returned and the // pParse->db->mallocFailed flag is set. func Xsqlite3FkLocateIndex(tls *libc.TLS, pParse uintptr, pParent uintptr, pFKey uintptr, ppIdx uintptr, paiCol uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pIdx uintptr = uintptr(0) var aiCol uintptr = uintptr(0) var nCol int32 = (*FKey)(unsafe.Pointer(pFKey)).FnCol var zKey uintptr = (*sColMap)(unsafe.Pointer(pFKey + 64)).FzCol if nCol == 1 { if int32((*Table)(unsafe.Pointer(pParent)).FiPKey) >= 0 { if !(zKey != 0) { return 0 } if !(Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pParent)).FaCol+uintptr((*Table)(unsafe.Pointer(pParent)).FiPKey)*24)).FzCnName, zKey) != 0) { return 0 } } } else if paiCol != 0 { aiCol = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(nCol)*uint64(unsafe.Sizeof(int32(0)))) if !(aiCol != 0) { return 1 } *(*uintptr)(unsafe.Pointer(paiCol)) = aiCol } for pIdx = (*Table)(unsafe.Pointer(pParent)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { if int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) == nCol && int32((*Index)(unsafe.Pointer(pIdx)).FonError) != OE_None && (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere == uintptr(0) { if zKey == uintptr(0) { if int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { if aiCol != 0 { var i int32 for i = 0; i < nCol; i++ { *(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)) = (*sColMap)(unsafe.Pointer(pFKey + 64 + uintptr(i)*16)).FiFrom } } break } } else { var i int32 var j int32 for i = 0; i < nCol; i++ { var iCol I16 = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2)) var zDfltColl uintptr var zIdxCol uintptr if int32(iCol) < 0 { break } zDfltColl = Xsqlite3ColumnColl(tls, (*Table)(unsafe.Pointer(pParent)).FaCol+uintptr(iCol)*24) if !(zDfltColl != 0) { zDfltColl = uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) } if Xsqlite3StrICmp(tls, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(i)*8)), zDfltColl) != 0 { break } zIdxCol = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pParent)).FaCol + uintptr(iCol)*24)).FzCnName for j = 0; j < nCol; j++ { if Xsqlite3StrICmp(tls, (*sColMap)(unsafe.Pointer(pFKey+64+uintptr(j)*16)).FzCol, zIdxCol) == 0 { if aiCol != 0 { *(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)) = (*sColMap)(unsafe.Pointer(pFKey + 64 + uintptr(j)*16)).FiFrom } break } } if j == nCol { break } } if i == nCol { break } } } } if !(pIdx != 0) { if !(int32((*Parse)(unsafe.Pointer(pParse)).FdisableTriggers) != 0) { Xsqlite3ErrorMsg(tls, pParse, ts+16969, libc.VaList(bp, (*Table)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpFrom)).FzName, (*FKey)(unsafe.Pointer(pFKey)).FzTo)) } Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, aiCol) return 1 } *(*uintptr)(unsafe.Pointer(ppIdx)) = pIdx return 0 } func fkLookupParent(tls *libc.TLS, pParse uintptr, iDb int32, pTab uintptr, pIdx uintptr, pFKey uintptr, aiCol uintptr, regData int32, nIncr int32, isIgnore int32) { var i int32 var v uintptr = Xsqlite3GetVdbe(tls, pParse) var iCur int32 = (*Parse)(unsafe.Pointer(pParse)).FnTab - 1 var iOk int32 = Xsqlite3VdbeMakeLabel(tls, pParse) if nIncr < 0 { Xsqlite3VdbeAddOp2(tls, v, OP_FkIfZero, int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred), iOk) } for i = 0; i < (*FKey)(unsafe.Pointer(pFKey)).FnCol; i++ { var iReg int32 = int32(Xsqlite3TableColumnToStorage(tls, (*FKey)(unsafe.Pointer(pFKey)).FpFrom, int16(*(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4))))) + regData + 1 Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, iReg, iOk) } if isIgnore == 0 { if pIdx == uintptr(0) { var iMustBeInt int32 var regTemp int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, int32(Xsqlite3TableColumnToStorage(tls, (*FKey)(unsafe.Pointer(pFKey)).FpFrom, int16(*(*int32)(unsafe.Pointer(aiCol)))))+1+regData, regTemp) iMustBeInt = Xsqlite3VdbeAddOp2(tls, v, OP_MustBeInt, regTemp, 0) if pTab == (*FKey)(unsafe.Pointer(pFKey)).FpFrom && nIncr == 1 { Xsqlite3VdbeAddOp3(tls, v, OP_Eq, regData, iOk, regTemp) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NOTNULL)) } Xsqlite3OpenTable(tls, pParse, iCur, iDb, pTab, OP_OpenRead) Xsqlite3VdbeAddOp3(tls, v, OP_NotExists, iCur, 0, regTemp) Xsqlite3VdbeGoto(tls, v, iOk) Xsqlite3VdbeJumpHere(tls, v, Xsqlite3VdbeCurrentAddr(tls, v)-2) Xsqlite3VdbeJumpHere(tls, v, iMustBeInt) Xsqlite3ReleaseTempReg(tls, pParse, regTemp) } else { var nCol int32 = (*FKey)(unsafe.Pointer(pFKey)).FnCol var regTemp int32 = Xsqlite3GetTempRange(tls, pParse, nCol) Xsqlite3VdbeAddOp3(tls, v, OP_OpenRead, iCur, int32((*Index)(unsafe.Pointer(pIdx)).Ftnum), iDb) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pIdx) for i = 0; i < nCol; i++ { Xsqlite3VdbeAddOp2(tls, v, OP_Copy, int32(Xsqlite3TableColumnToStorage(tls, (*FKey)(unsafe.Pointer(pFKey)).FpFrom, int16(*(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)))))+1+regData, regTemp+i) } if pTab == (*FKey)(unsafe.Pointer(pFKey)).FpFrom && nIncr == 1 { var iJump int32 = Xsqlite3VdbeCurrentAddr(tls, v) + nCol + 1 for i = 0; i < nCol; i++ { var iChild int32 = int32(Xsqlite3TableColumnToStorage(tls, (*FKey)(unsafe.Pointer(pFKey)).FpFrom, int16(*(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4))))) + 1 + regData var iParent int32 = 1 + regData iParent = iParent + int32(Xsqlite3TableColumnToStorage(tls, (*Index)(unsafe.Pointer(pIdx)).FpTable, *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2)))) if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { iParent = regData } Xsqlite3VdbeAddOp3(tls, v, OP_Ne, iChild, iJump, iParent) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_JUMPIFNULL)) } Xsqlite3VdbeGoto(tls, v, iOk) } Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, regTemp, nCol, 0, Xsqlite3IndexAffinityStr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pIdx), nCol) Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, iCur, iOk, regTemp, nCol) Xsqlite3ReleaseTempRange(tls, pParse, regTemp, nCol) } } if !(int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred) != 0) && !((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_DeferFKs) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FpToplevel) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FisMultiWrite) != 0) { Xsqlite3HaltConstraint(tls, pParse, SQLITE_CONSTRAINT|int32(3)<<8, OE_Abort, uintptr(0), int8(-1), uint8(P5_ConstraintFK)) } else { if nIncr > 0 && int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred) == 0 { Xsqlite3MayAbort(tls, pParse) } Xsqlite3VdbeAddOp2(tls, v, OP_FkCounter, int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred), nIncr) } Xsqlite3VdbeResolveLabel(tls, v, iOk) Xsqlite3VdbeAddOp1(tls, v, OP_Close, iCur) } func exprTableRegister(tls *libc.TLS, pParse uintptr, pTab uintptr, regBase int32, iCol I16) uintptr { var pExpr uintptr var pCol uintptr var zColl uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb pExpr = Xsqlite3Expr(tls, db, TK_REGISTER, uintptr(0)) if pExpr != 0 { if int32(iCol) >= 0 && int32(iCol) != int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24 (*Expr)(unsafe.Pointer(pExpr)).FiTable = regBase + int32(Xsqlite3TableColumnToStorage(tls, pTab, iCol)) + 1 (*Expr)(unsafe.Pointer(pExpr)).FaffExpr = (*Column)(unsafe.Pointer(pCol)).Faffinity zColl = Xsqlite3ColumnColl(tls, pCol) if zColl == uintptr(0) { zColl = (*CollSeq)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FpDfltColl)).FzName } pExpr = Xsqlite3ExprAddCollateString(tls, pParse, pExpr, zColl) } else { (*Expr)(unsafe.Pointer(pExpr)).FiTable = regBase (*Expr)(unsafe.Pointer(pExpr)).FaffExpr = int8(SQLITE_AFF_INTEGER) } } return pExpr } func exprTableColumn(tls *libc.TLS, db uintptr, pTab uintptr, iCursor int32, iCol I16) uintptr { var pExpr uintptr = Xsqlite3Expr(tls, db, TK_COLUMN, uintptr(0)) if pExpr != 0 { *(*uintptr)(unsafe.Pointer(pExpr + 64)) = pTab (*Expr)(unsafe.Pointer(pExpr)).FiTable = iCursor (*Expr)(unsafe.Pointer(pExpr)).FiColumn = iCol } return pExpr } func fkScanChildren(tls *libc.TLS, pParse uintptr, pSrc uintptr, pTab uintptr, pIdx uintptr, pFKey uintptr, aiCol uintptr, regData int32, nIncr int32) { bp := tls.Alloc(56) defer tls.Free(56) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var i int32 var pWhere uintptr = uintptr(0) var pWInfo uintptr var iFkIfZero int32 = 0 var v uintptr = Xsqlite3GetVdbe(tls, pParse) if nIncr < 0 { iFkIfZero = Xsqlite3VdbeAddOp2(tls, v, OP_FkIfZero, int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred), 0) } for i = 0; i < (*FKey)(unsafe.Pointer(pFKey)).FnCol; i++ { var pLeft uintptr var pRight uintptr var pEq uintptr var iCol I16 var zCol uintptr if pIdx != 0 { iCol = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2)) } else { iCol = int16(-1) } pLeft = exprTableRegister(tls, pParse, pTab, regData, iCol) if aiCol != 0 { iCol = int16(*(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4))) } else { iCol = int16((*sColMap)(unsafe.Pointer(pFKey + 64)).FiFrom) } zCol = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpFrom)).FaCol + uintptr(iCol)*24)).FzCnName pRight = Xsqlite3Expr(tls, db, TK_ID, zCol) pEq = Xsqlite3PExpr(tls, pParse, TK_EQ, pLeft, pRight) pWhere = Xsqlite3ExprAnd(tls, pParse, pWhere, pEq) } if pTab == (*FKey)(unsafe.Pointer(pFKey)).FpFrom && nIncr > 0 { var pNe uintptr var pLeft uintptr var pRight uintptr if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { pLeft = exprTableRegister(tls, pParse, pTab, regData, int16(-1)) pRight = exprTableColumn(tls, db, pTab, (*SrcItem)(unsafe.Pointer(pSrc+8)).FiCursor, int16(-1)) pNe = Xsqlite3PExpr(tls, pParse, TK_NE, pLeft, pRight) } else { var pEq uintptr var pAll uintptr = uintptr(0) for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol); i++ { var iCol I16 = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2)) pLeft = exprTableRegister(tls, pParse, pTab, regData, iCol) pRight = Xsqlite3Expr(tls, db, TK_ID, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24)).FzCnName) pEq = Xsqlite3PExpr(tls, pParse, TK_IS, pLeft, pRight) pAll = Xsqlite3ExprAnd(tls, pParse, pAll, pEq) } pNe = Xsqlite3PExpr(tls, pParse, TK_NOT, pAll, uintptr(0)) } pWhere = Xsqlite3ExprAnd(tls, pParse, pWhere, pNe) } libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp)).FpSrcList = pSrc (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse Xsqlite3ResolveExprNames(tls, bp, pWhere) if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 { pWInfo = Xsqlite3WhereBegin(tls, pParse, pSrc, pWhere, uintptr(0), uintptr(0), uintptr(0), uint16(0), 0) Xsqlite3VdbeAddOp2(tls, v, OP_FkCounter, int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred), nIncr) if pWInfo != 0 { Xsqlite3WhereEnd(tls, pWInfo) } } Xsqlite3ExprDelete(tls, db, pWhere) if iFkIfZero != 0 { Xsqlite3VdbeJumpHereOrPopInst(tls, v, iFkIfZero) } } // This function returns a linked list of FKey objects (connected by // FKey.pNextTo) holding all children of table pTab. For example, // given the following schema: // // CREATE TABLE t1(a PRIMARY KEY); // CREATE TABLE t2(b REFERENCES t1(a); // // Calling this function with table "t1" as an argument returns a pointer // to the FKey structure representing the foreign key constraint on table // "t2". Calling this function with "t2" as the argument would return a // NULL pointer (as there are no FK constraints for which t2 is the parent // table). func Xsqlite3FkReferences(tls *libc.TLS, pTab uintptr) uintptr { return Xsqlite3HashFind(tls, (*Table)(unsafe.Pointer(pTab)).FpSchema+80, (*Table)(unsafe.Pointer(pTab)).FzName) } func fkTriggerDelete(tls *libc.TLS, dbMem uintptr, p uintptr) { if p != 0 { var pStep uintptr = (*Trigger)(unsafe.Pointer(p)).Fstep_list Xsqlite3ExprDelete(tls, dbMem, (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere) Xsqlite3ExprListDelete(tls, dbMem, (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList) Xsqlite3SelectDelete(tls, dbMem, (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect) Xsqlite3ExprDelete(tls, dbMem, (*Trigger)(unsafe.Pointer(p)).FpWhen) Xsqlite3DbFree(tls, dbMem, p) } } // Clear the apTrigger[] cache of CASCADE triggers for all foreign keys // in a particular database. This needs to happen when the schema // changes. func Xsqlite3FkClearTriggerCache(tls *libc.TLS, db uintptr, iDb int32) { var k uintptr var pHash uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema + 8 for k = (*Hash)(unsafe.Pointer(pHash)).Ffirst; k != 0; k = (*HashElem)(unsafe.Pointer(k)).Fnext { var pTab uintptr = (*HashElem)(unsafe.Pointer(k)).Fdata var pFKey uintptr if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM) { continue } for pFKey = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)); pFKey != 0; pFKey = (*FKey)(unsafe.Pointer(pFKey)).FpNextFrom { fkTriggerDelete(tls, db, *(*uintptr)(unsafe.Pointer(pFKey + 48))) *(*uintptr)(unsafe.Pointer(pFKey + 48)) = uintptr(0) fkTriggerDelete(tls, db, *(*uintptr)(unsafe.Pointer(pFKey + 48 + 1*8))) *(*uintptr)(unsafe.Pointer(pFKey + 48 + 1*8)) = uintptr(0) } } } // This function is called to generate code that runs when table pTab is // being dropped from the database. The SrcList passed as the second argument // to this function contains a single entry guaranteed to resolve to // table pTab. // // Normally, no code is required. However, if either // // (a) The table is the parent table of a FK constraint, or // (b) The table is the child table of a deferred FK constraint and it is // determined at runtime that there are outstanding deferred FK // constraint violations in the database, // // then the equivalent of "DELETE FROM " is executed before dropping // the table from the database. Triggers are disabled while running this // DELETE, but foreign key actions are not. func Xsqlite3FkDropTable(tls *libc.TLS, pParse uintptr, pName uintptr, pTab uintptr) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ForeignKeys) != 0 && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM { var iSkip int32 = 0 var v uintptr = Xsqlite3GetVdbe(tls, pParse) if Xsqlite3FkReferences(tls, pTab) == uintptr(0) { var p uintptr for p = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)); p != 0; p = (*FKey)(unsafe.Pointer(p)).FpNextFrom { if (*FKey)(unsafe.Pointer(p)).FisDeferred != 0 || (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DeferFKs) != 0 { break } } if !(p != 0) { return } iSkip = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_FkIfZero, 1, iSkip) } (*Parse)(unsafe.Pointer(pParse)).FdisableTriggers = U8(1) Xsqlite3DeleteFrom(tls, pParse, Xsqlite3SrcListDup(tls, db, pName, 0), uintptr(0), uintptr(0), uintptr(0)) (*Parse)(unsafe.Pointer(pParse)).FdisableTriggers = U8(0) if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DeferFKs) == uint64(0) { Xsqlite3VdbeAddOp2(tls, v, OP_FkIfZero, 0, Xsqlite3VdbeCurrentAddr(tls, v)+2) Xsqlite3HaltConstraint(tls, pParse, SQLITE_CONSTRAINT|int32(3)<<8, OE_Abort, uintptr(0), int8(-1), uint8(P5_ConstraintFK)) } if iSkip != 0 { Xsqlite3VdbeResolveLabel(tls, v, iSkip) } } } func fkChildIsModified(tls *libc.TLS, pTab uintptr, p uintptr, aChange uintptr, bChngRowid int32) int32 { var i int32 for i = 0; i < (*FKey)(unsafe.Pointer(p)).FnCol; i++ { var iChildKey int32 = (*sColMap)(unsafe.Pointer(p + 64 + uintptr(i)*16)).FiFrom if *(*int32)(unsafe.Pointer(aChange + uintptr(iChildKey)*4)) >= 0 { return 1 } if iChildKey == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) && bChngRowid != 0 { return 1 } } return 0 } func fkParentIsModified(tls *libc.TLS, pTab uintptr, p uintptr, aChange uintptr, bChngRowid int32) int32 { var i int32 for i = 0; i < (*FKey)(unsafe.Pointer(p)).FnCol; i++ { var zKey uintptr = (*sColMap)(unsafe.Pointer(p + 64 + uintptr(i)*16)).FzCol var iKey int32 for iKey = 0; iKey < int32((*Table)(unsafe.Pointer(pTab)).FnCol); iKey++ { if *(*int32)(unsafe.Pointer(aChange + uintptr(iKey)*4)) >= 0 || iKey == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) && bChngRowid != 0 { var pCol uintptr = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iKey)*24 if zKey != 0 { if 0 == Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName, zKey) { return 1 } } else if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_PRIMKEY != 0 { return 1 } } } } return 0 } func isSetNullAction(tls *libc.TLS, pParse uintptr, pFKey uintptr) int32 { var pTop uintptr = func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }() if (*Parse)(unsafe.Pointer(pTop)).FpTriggerPrg != 0 { var p uintptr = (*TriggerPrg)(unsafe.Pointer((*Parse)(unsafe.Pointer(pTop)).FpTriggerPrg)).FpTrigger if p == *(*uintptr)(unsafe.Pointer(pFKey + 48)) && int32(*(*U8)(unsafe.Pointer(pFKey + 45))) == OE_SetNull || p == *(*uintptr)(unsafe.Pointer(pFKey + 48 + 1*8)) && int32(*(*U8)(unsafe.Pointer(pFKey + 45 + 1))) == OE_SetNull { return 1 } } return 0 } // This function is called when inserting, deleting or updating a row of // table pTab to generate VDBE code to perform foreign key constraint // processing for the operation. // // For a DELETE operation, parameter regOld is passed the index of the // first register in an array of (pTab->nCol+1) registers containing the // rowid of the row being deleted, followed by each of the column values // of the row being deleted, from left to right. Parameter regNew is passed // zero in this case. // // For an INSERT operation, regOld is passed zero and regNew is passed the // first register of an array of (pTab->nCol+1) registers containing the new // row data. // // For an UPDATE operation, this function is called twice. Once before // the original record is deleted from the table using the calling convention // described for DELETE. Then again after the original record is deleted // but before the new record is inserted using the INSERT convention. func Xsqlite3FkCheck(tls *libc.TLS, pParse uintptr, pTab uintptr, regOld int32, regNew int32, aChange uintptr, bChngRowid int32) { bp := tls.Alloc(40) defer tls.Free(40) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pFKey uintptr var iDb int32 var zDb uintptr var isIgnoreErrors int32 = int32((*Parse)(unsafe.Pointer(pParse)).FdisableTriggers) if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ForeignKeys) == uint64(0) { return } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM) { return } iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName for pFKey = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)); pFKey != 0; pFKey = (*FKey)(unsafe.Pointer(pFKey)).FpNextFrom { var pTo uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var aiCol uintptr var i int32 var bIgnore int32 = 0 if aChange != 0 && Xsqlite3_stricmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName, (*FKey)(unsafe.Pointer(pFKey)).FzTo) != 0 && fkChildIsModified(tls, pTab, pFKey, aChange, bChngRowid) == 0 { continue } if (*Parse)(unsafe.Pointer(pParse)).FdisableTriggers != 0 { pTo = Xsqlite3FindTable(tls, db, (*FKey)(unsafe.Pointer(pFKey)).FzTo, zDb) } else { pTo = Xsqlite3LocateTable(tls, pParse, uint32(0), (*FKey)(unsafe.Pointer(pFKey)).FzTo, zDb) } if !(pTo != 0) || Xsqlite3FkLocateIndex(tls, pParse, pTo, pFKey, bp, bp+8) != 0 { if !(isIgnoreErrors != 0) || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return } if pTo == uintptr(0) { var v uintptr = Xsqlite3GetVdbe(tls, pParse) var iJump int32 = Xsqlite3VdbeCurrentAddr(tls, v) + (*FKey)(unsafe.Pointer(pFKey)).FnCol + 1 for i = 0; i < (*FKey)(unsafe.Pointer(pFKey)).FnCol; i++ { var iFromCol int32 var iReg int32 iFromCol = (*sColMap)(unsafe.Pointer(pFKey + 64 + uintptr(i)*16)).FiFrom iReg = int32(Xsqlite3TableColumnToStorage(tls, (*FKey)(unsafe.Pointer(pFKey)).FpFrom, int16(iFromCol))) + regOld + 1 Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, iReg, iJump) } Xsqlite3VdbeAddOp2(tls, v, OP_FkCounter, int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred), -1) } continue } if *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { aiCol = *(*uintptr)(unsafe.Pointer(bp + 8)) } else { *(*int32)(unsafe.Pointer(bp + 16)) = (*sColMap)(unsafe.Pointer(pFKey + 64)).FiFrom aiCol = bp + 16 } for i = 0; i < (*FKey)(unsafe.Pointer(pFKey)).FnCol; i++ { if *(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)) == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { *(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)) = -1 } if (*Sqlite3)(unsafe.Pointer(db)).FxAuth != 0 { var rcauth int32 var zCol uintptr = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTo)).FaCol + uintptr(func() int32 { if *(*uintptr)(unsafe.Pointer(bp)) != 0 { return int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaiColumn + uintptr(i)*2))) } return int32((*Table)(unsafe.Pointer(pTo)).FiPKey) }())*24)).FzCnName rcauth = Xsqlite3AuthReadCol(tls, pParse, (*Table)(unsafe.Pointer(pTo)).FzName, zCol, iDb) bIgnore = libc.Bool32(rcauth == SQLITE_IGNORE) } } Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTo)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pTo)).FzName) (*Parse)(unsafe.Pointer(pParse)).FnTab++ if regOld != 0 { fkLookupParent(tls, pParse, iDb, pTo, *(*uintptr)(unsafe.Pointer(bp)), pFKey, aiCol, regOld, -1, bIgnore) } if regNew != 0 && !(isSetNullAction(tls, pParse, pFKey) != 0) { fkLookupParent(tls, pParse, iDb, pTo, *(*uintptr)(unsafe.Pointer(bp)), pFKey, aiCol, regNew, +1, bIgnore) } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 8))) } for pFKey = Xsqlite3FkReferences(tls, pTab); pFKey != 0; pFKey = (*FKey)(unsafe.Pointer(pFKey)).FpNextTo { *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) var pSrc uintptr *(*uintptr)(unsafe.Pointer(bp + 32)) = uintptr(0) if aChange != 0 && fkParentIsModified(tls, pTab, pFKey, aChange, bChngRowid) == 0 { continue } if !(int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred) != 0) && !((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DeferFKs) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FpToplevel) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FisMultiWrite) != 0) { continue } if Xsqlite3FkLocateIndex(tls, pParse, pTab, pFKey, bp+24, bp+32) != 0 { if !(isIgnoreErrors != 0) || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return } continue } pSrc = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), uintptr(0), uintptr(0)) if pSrc != 0 { var pItem uintptr = pSrc + 8 (*SrcItem)(unsafe.Pointer(pItem)).FpTab = (*FKey)(unsafe.Pointer(pFKey)).FpFrom (*SrcItem)(unsafe.Pointer(pItem)).FzName = (*Table)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpFrom)).FzName (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpTab)).FnTabRef++ (*SrcItem)(unsafe.Pointer(pItem)).FiCursor = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) if regNew != 0 { fkScanChildren(tls, pParse, pSrc, pTab, *(*uintptr)(unsafe.Pointer(bp + 24)), pFKey, *(*uintptr)(unsafe.Pointer(bp + 32)), regNew, -1) } if regOld != 0 { var eAction int32 = int32(*(*U8)(unsafe.Pointer(pFKey + 45 + uintptr(libc.Bool32(aChange != uintptr(0)))))) fkScanChildren(tls, pParse, pSrc, pTab, *(*uintptr)(unsafe.Pointer(bp + 24)), pFKey, *(*uintptr)(unsafe.Pointer(bp + 32)), regOld, 1) if !(int32((*FKey)(unsafe.Pointer(pFKey)).FisDeferred) != 0) && eAction != OE_Cascade && eAction != OE_SetNull { Xsqlite3MayAbort(tls, pParse) } } (*SrcItem)(unsafe.Pointer(pItem)).FzName = uintptr(0) Xsqlite3SrcListDelete(tls, db, pSrc) } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 32))) } } // This function is called before generating code to update or delete a // row contained in table pTab. func Xsqlite3FkOldmask(tls *libc.TLS, pParse uintptr, pTab uintptr) U32 { bp := tls.Alloc(8) defer tls.Free(8) var mask U32 = U32(0) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_ForeignKeys) != 0 && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM { var p uintptr var i int32 for p = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)); p != 0; p = (*FKey)(unsafe.Pointer(p)).FpNextFrom { for i = 0; i < (*FKey)(unsafe.Pointer(p)).FnCol; i++ { mask = mask | func() uint32 { if (*sColMap)(unsafe.Pointer(p+64+uintptr(i)*16)).FiFrom > 31 { return 0xffffffff } return U32(1) << (*sColMap)(unsafe.Pointer(p+64+uintptr(i)*16)).FiFrom }() } } for p = Xsqlite3FkReferences(tls, pTab); p != 0; p = (*FKey)(unsafe.Pointer(p)).FpNextTo { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) Xsqlite3FkLocateIndex(tls, pParse, pTab, p, bp, uintptr(0)) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { for i = 0; i < int32((*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnKeyCol); i++ { mask = mask | func() uint32 { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaiColumn + uintptr(i)*2))) > 31 { return 0xffffffff } return U32(1) << int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaiColumn + uintptr(i)*2))) }() } } } } return mask } // This function is called before generating code to update or delete a // row contained in table pTab. If the operation is a DELETE, then // parameter aChange is passed a NULL value. For an UPDATE, aChange points // to an array of size N, where N is the number of columns in table pTab. // If the i'th column is not modified by the UPDATE, then the corresponding // entry in the aChange[] array is set to -1. If the column is modified, // the value is 0 or greater. Parameter chngRowid is set to true if the // UPDATE statement modifies the rowid fields of the table. // // If any foreign key processing will be required, this function returns // non-zero. If there is no foreign key related processing, this function // returns zero. // // For an UPDATE, this function returns 2 if: // // - There are any FKs for which pTab is the child and the parent table // and any FK processing at all is required (even of a different FK), or // // - the UPDATE modifies one or more parent keys for which the action is // not "NO ACTION" (i.e. is CASCADE, SET DEFAULT or SET NULL). // // Or, assuming some other foreign key processing is required, 1. func Xsqlite3FkRequired(tls *libc.TLS, pParse uintptr, pTab uintptr, aChange uintptr, chngRowid int32) int32 { var eRet int32 = 1 var bHaveFK int32 = 0 if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_ForeignKeys) != 0 && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM { if !(aChange != 0) { bHaveFK = libc.Bool32(Xsqlite3FkReferences(tls, pTab) != 0 || *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)) != 0) } else { var p uintptr for p = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)); p != 0; p = (*FKey)(unsafe.Pointer(p)).FpNextFrom { if fkChildIsModified(tls, pTab, p, aChange, chngRowid) != 0 { if 0 == Xsqlite3_stricmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName, (*FKey)(unsafe.Pointer(p)).FzTo) { eRet = 2 } bHaveFK = 1 } } for p = Xsqlite3FkReferences(tls, pTab); p != 0; p = (*FKey)(unsafe.Pointer(p)).FpNextTo { if fkParentIsModified(tls, pTab, p, aChange, chngRowid) != 0 { if int32(*(*U8)(unsafe.Pointer(p + 45 + 1))) != OE_None { return 2 } bHaveFK = 1 } } } } if bHaveFK != 0 { return eRet } return 0 } func fkActionTrigger(tls *libc.TLS, pParse uintptr, pTab uintptr, pFKey uintptr, pChanges uintptr) uintptr { bp := tls.Alloc(112) defer tls.Free(112) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var action int32 var pTrigger uintptr var iAction int32 = libc.Bool32(pChanges != uintptr(0)) action = int32(*(*U8)(unsafe.Pointer(pFKey + 45 + uintptr(iAction)))) if action == OE_Restrict && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_DeferFKs) != 0 { return uintptr(0) } pTrigger = *(*uintptr)(unsafe.Pointer(pFKey + 48 + uintptr(iAction)*8)) if action != OE_None && !(pTrigger != 0) { var zFrom uintptr var nFrom int32 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var pStep uintptr = uintptr(0) var pWhere uintptr = uintptr(0) var pList uintptr = uintptr(0) var pSelect uintptr = uintptr(0) var i int32 var pWhen uintptr = uintptr(0) if Xsqlite3FkLocateIndex(tls, pParse, pTab, pFKey, bp, bp+8) != 0 { return uintptr(0) } for i = 0; i < (*FKey)(unsafe.Pointer(pFKey)).FnCol; i++ { *(*Token)(unsafe.Pointer(bp + 48)) = Token{Fz: ts + 7804, Fn: uint32(3)} *(*Token)(unsafe.Pointer(bp + 64)) = Token{Fz: ts + 7800, Fn: uint32(3)} var iFromCol int32 var pEq uintptr if *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { iFromCol = *(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)) + uintptr(i)*4)) } else { iFromCol = (*sColMap)(unsafe.Pointer(pFKey + 64)).FiFrom } Xsqlite3TokenInit(tls, bp+16, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(func() int32 { if *(*uintptr)(unsafe.Pointer(bp)) != 0 { return int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaiColumn + uintptr(i)*2))) } return int32((*Table)(unsafe.Pointer(pTab)).FiPKey) }())*24)).FzCnName) Xsqlite3TokenInit(tls, bp+32, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpFrom)).FaCol+uintptr(iFromCol)*24)).FzCnName) pEq = Xsqlite3PExpr(tls, pParse, TK_EQ, Xsqlite3PExpr(tls, pParse, TK_DOT, Xsqlite3ExprAlloc(tls, db, TK_ID, bp+48, 0), Xsqlite3ExprAlloc(tls, db, TK_ID, bp+16, 0)), Xsqlite3ExprAlloc(tls, db, TK_ID, bp+32, 0)) pWhere = Xsqlite3ExprAnd(tls, pParse, pWhere, pEq) if pChanges != 0 { pEq = Xsqlite3PExpr(tls, pParse, TK_IS, Xsqlite3PExpr(tls, pParse, TK_DOT, Xsqlite3ExprAlloc(tls, db, TK_ID, bp+48, 0), Xsqlite3ExprAlloc(tls, db, TK_ID, bp+16, 0)), Xsqlite3PExpr(tls, pParse, TK_DOT, Xsqlite3ExprAlloc(tls, db, TK_ID, bp+64, 0), Xsqlite3ExprAlloc(tls, db, TK_ID, bp+16, 0))) pWhen = Xsqlite3ExprAnd(tls, pParse, pWhen, pEq) } if action != OE_Restrict && (action != OE_Cascade || pChanges != 0) { var pNew uintptr if action == OE_Cascade { pNew = Xsqlite3PExpr(tls, pParse, TK_DOT, Xsqlite3ExprAlloc(tls, db, TK_ID, bp+64, 0), Xsqlite3ExprAlloc(tls, db, TK_ID, bp+16, 0)) } else if action == OE_SetDflt { var pCol uintptr = (*Table)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpFrom)).FaCol + uintptr(iFromCol)*24 var pDflt uintptr if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_GENERATED != 0 { pDflt = uintptr(0) } else { pDflt = Xsqlite3ColumnExpr(tls, (*FKey)(unsafe.Pointer(pFKey)).FpFrom, pCol) } if pDflt != 0 { pNew = Xsqlite3ExprDup(tls, db, pDflt, 0) } else { pNew = Xsqlite3ExprAlloc(tls, db, TK_NULL, uintptr(0), 0) } } else { pNew = Xsqlite3ExprAlloc(tls, db, TK_NULL, uintptr(0), 0) } pList = Xsqlite3ExprListAppend(tls, pParse, pList, pNew) Xsqlite3ExprListSetName(tls, pParse, pList, bp+32, 0) } } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 8))) zFrom = (*Table)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpFrom)).FzName nFrom = Xsqlite3Strlen30(tls, zFrom) if action == OE_Restrict { var iDb int32 = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) var pRaise uintptr (*Token)(unsafe.Pointer(bp + 96)).Fz = zFrom (*Token)(unsafe.Pointer(bp + 96)).Fn = uint32(nFrom) (*Token)(unsafe.Pointer(bp + 80)).Fz = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName (*Token)(unsafe.Pointer(bp + 80)).Fn = uint32(Xsqlite3Strlen30(tls, (*Token)(unsafe.Pointer(bp+80)).Fz)) pRaise = Xsqlite3Expr(tls, db, TK_RAISE, ts+6488) if pRaise != 0 { (*Expr)(unsafe.Pointer(pRaise)).FaffExpr = int8(OE_Abort) } pSelect = Xsqlite3SelectNew(tls, pParse, Xsqlite3ExprListAppend(tls, pParse, uintptr(0), pRaise), Xsqlite3SrcListAppend(tls, pParse, uintptr(0), bp+80, bp+96), pWhere, uintptr(0), uintptr(0), uintptr(0), uint32(0), uintptr(0)) pWhere = uintptr(0) } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) pTrigger = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Trigger{}))+uint64(unsafe.Sizeof(TriggerStep{}))+uint64(nFrom)+uint64(1)) if pTrigger != 0 { pStep = libc.AssignPtrUintptr(pTrigger+56, pTrigger+1*72) (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget = pStep + 1*96 libc.Xmemcpy(tls, (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget, zFrom, uint64(nFrom)) (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere = Xsqlite3ExprDup(tls, db, pWhere, EXPRDUP_REDUCE) (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList = Xsqlite3ExprListDup(tls, db, pList, EXPRDUP_REDUCE) (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect = Xsqlite3SelectDup(tls, db, pSelect, EXPRDUP_REDUCE) if pWhen != 0 { pWhen = Xsqlite3PExpr(tls, pParse, TK_NOT, pWhen, uintptr(0)) (*Trigger)(unsafe.Pointer(pTrigger)).FpWhen = Xsqlite3ExprDup(tls, db, pWhen, EXPRDUP_REDUCE) } } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable-- (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = func() uint16 { if (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable != 0 { return uint16(0) } return (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue }() Xsqlite3ExprDelete(tls, db, pWhere) Xsqlite3ExprDelete(tls, db, pWhen) Xsqlite3ExprListDelete(tls, db, pList) Xsqlite3SelectDelete(tls, db, pSelect) if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 1 { fkTriggerDelete(tls, db, pTrigger) return uintptr(0) } { switch action { case OE_Restrict: (*TriggerStep)(unsafe.Pointer(pStep)).Fop = U8(TK_SELECT) break fallthrough case OE_Cascade: if !(pChanges != 0) { (*TriggerStep)(unsafe.Pointer(pStep)).Fop = U8(TK_DELETE) break } fallthrough default: (*TriggerStep)(unsafe.Pointer(pStep)).Fop = U8(TK_UPDATE) } } (*TriggerStep)(unsafe.Pointer(pStep)).FpTrig = pTrigger (*Trigger)(unsafe.Pointer(pTrigger)).FpSchema = (*Table)(unsafe.Pointer(pTab)).FpSchema (*Trigger)(unsafe.Pointer(pTrigger)).FpTabSchema = (*Table)(unsafe.Pointer(pTab)).FpSchema *(*uintptr)(unsafe.Pointer(pFKey + 48 + uintptr(iAction)*8)) = pTrigger (*Trigger)(unsafe.Pointer(pTrigger)).Fop = func() uint8 { if pChanges != 0 { return uint8(TK_UPDATE) } return uint8(TK_DELETE) }() } return pTrigger } // This function is called when deleting or updating a row to implement // any required CASCADE, SET NULL or SET DEFAULT actions. func Xsqlite3FkActions(tls *libc.TLS, pParse uintptr, pTab uintptr, pChanges uintptr, regOld int32, aChange uintptr, bChngRowid int32) { if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_ForeignKeys) != 0 { var pFKey uintptr for pFKey = Xsqlite3FkReferences(tls, pTab); pFKey != 0; pFKey = (*FKey)(unsafe.Pointer(pFKey)).FpNextTo { if aChange == uintptr(0) || fkParentIsModified(tls, pTab, pFKey, aChange, bChngRowid) != 0 { var pAct uintptr = fkActionTrigger(tls, pParse, pTab, pFKey, pChanges) if pAct != 0 { Xsqlite3CodeRowTriggerDirect(tls, pParse, pAct, pTab, regOld, OE_Abort, 0) } } } } } // Free all memory associated with foreign key definitions attached to // table pTab. Remove the deleted foreign keys from the Schema.fkeyHash // hash table. func Xsqlite3FkDelete(tls *libc.TLS, db uintptr, pTab uintptr) { var pFKey uintptr var pNext uintptr for pFKey = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)); pFKey != 0; pFKey = pNext { if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { if (*FKey)(unsafe.Pointer(pFKey)).FpPrevTo != 0 { (*FKey)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpPrevTo)).FpNextTo = (*FKey)(unsafe.Pointer(pFKey)).FpNextTo } else { var p uintptr = (*FKey)(unsafe.Pointer(pFKey)).FpNextTo var z uintptr = func() uintptr { if p != 0 { return (*FKey)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpNextTo)).FzTo } return (*FKey)(unsafe.Pointer(pFKey)).FzTo }() Xsqlite3HashInsert(tls, (*Table)(unsafe.Pointer(pTab)).FpSchema+80, z, p) } if (*FKey)(unsafe.Pointer(pFKey)).FpNextTo != 0 { (*FKey)(unsafe.Pointer((*FKey)(unsafe.Pointer(pFKey)).FpNextTo)).FpPrevTo = (*FKey)(unsafe.Pointer(pFKey)).FpPrevTo } } fkTriggerDelete(tls, db, *(*uintptr)(unsafe.Pointer(pFKey + 48))) fkTriggerDelete(tls, db, *(*uintptr)(unsafe.Pointer(pFKey + 48 + 1*8))) pNext = (*FKey)(unsafe.Pointer(pFKey)).FpNextFrom Xsqlite3DbFree(tls, db, pFKey) } } // Generate code that will // // (1) acquire a lock for table pTab then // (2) open pTab as cursor iCur. // // If pTab is a WITHOUT ROWID table, then it is the PRIMARY KEY index // for that table that is actually opened. func Xsqlite3OpenTable(tls *libc.TLS, pParse uintptr, iCur int32, iDb int32, pTab uintptr, opcode int32) { var v uintptr v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab)).Ftnum, func() uint8 { if opcode == OP_OpenWrite { return uint8(1) } return uint8(0) }(), (*Table)(unsafe.Pointer(pTab)).FzName) if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { Xsqlite3VdbeAddOp4Int(tls, v, opcode, iCur, int32((*Table)(unsafe.Pointer(pTab)).Ftnum), iDb, int32((*Table)(unsafe.Pointer(pTab)).FnNVCol)) } else { var pPk uintptr = Xsqlite3PrimaryKeyIndex(tls, pTab) Xsqlite3VdbeAddOp3(tls, v, opcode, iCur, int32((*Index)(unsafe.Pointer(pPk)).Ftnum), iDb) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pPk) } } // Return a pointer to the column affinity string associated with index // pIdx. A column affinity string has one character for each column in // the table, according to the affinity of the column: // // Character Column affinity // ------------------------------ // 'A' BLOB // 'B' TEXT // 'C' NUMERIC // 'D' INTEGER // 'F' REAL // // An extra 'D' is appended to the end of the string to cover the // rowid that appears as the last column in every index. // // Memory for the buffer containing the column index affinity string // is managed along with the rest of the Index structure. It will be // released when sqlite3DeleteIndex() is called. func Xsqlite3IndexAffinityStr(tls *libc.TLS, db uintptr, pIdx uintptr) uintptr { if !(int32((*Index)(unsafe.Pointer(pIdx)).FzColAff) != 0) { var n int32 var pTab uintptr = (*Index)(unsafe.Pointer(pIdx)).FpTable (*Index)(unsafe.Pointer(pIdx)).FzColAff = Xsqlite3DbMallocRaw(tls, uintptr(0), uint64(int32((*Index)(unsafe.Pointer(pIdx)).FnColumn)+1)) if !(int32((*Index)(unsafe.Pointer(pIdx)).FzColAff) != 0) { Xsqlite3OomFault(tls, db) return uintptr(0) } for n = 0; n < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn); n++ { var x I16 = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(n)*2)) var aff int8 if int32(x) >= 0 { aff = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(x)*24)).Faffinity } else if int32(x) == -1 { aff = int8(SQLITE_AFF_INTEGER) } else { aff = Xsqlite3ExprAffinity(tls, (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr+8+uintptr(n)*32)).FpExpr) } if int32(aff) < SQLITE_AFF_BLOB { aff = int8(SQLITE_AFF_BLOB) } if int32(aff) > SQLITE_AFF_NUMERIC { aff = int8(SQLITE_AFF_NUMERIC) } *(*int8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FzColAff + uintptr(n))) = aff } *(*int8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FzColAff + uintptr(n))) = int8(0) } return (*Index)(unsafe.Pointer(pIdx)).FzColAff } // Compute an affinity string for a table. Space is obtained // from sqlite3DbMalloc(). The caller is responsible for freeing // the space when done. func Xsqlite3TableAffinityStr(tls *libc.TLS, db uintptr, pTab uintptr) uintptr { var zColAff uintptr zColAff = Xsqlite3DbMallocRaw(tls, db, uint64(int32((*Table)(unsafe.Pointer(pTab)).FnCol)+1)) if zColAff != 0 { var i int32 var j int32 for i = libc.AssignInt32(&j, 0); i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0 { *(*int8)(unsafe.Pointer(zColAff + uintptr(libc.PostIncInt32(&j, 1)))) = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(i)*24)).Faffinity } } for __ccgo := true; __ccgo; __ccgo = j >= 0 && int32(*(*int8)(unsafe.Pointer(zColAff + uintptr(j)))) <= SQLITE_AFF_BLOB { *(*int8)(unsafe.Pointer(zColAff + uintptr(libc.PostDecInt32(&j, 1)))) = int8(0) } } return zColAff } // Make changes to the evolving bytecode to do affinity transformations // of values that are about to be gathered into a row for table pTab. // // For ordinary (legacy, non-strict) tables: // ----------------------------------------- // // Compute the affinity string for table pTab, if it has not already been // computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. // // If the affinity string is empty (because it was all SQLITE_AFF_BLOB entries // which were then optimized out) then this routine becomes a no-op. // // Otherwise if iReg>0 then code an OP_Affinity opcode that will set the // affinities for register iReg and following. Or if iReg==0, // then just set the P4 operand of the previous opcode (which should be // an OP_MakeRecord) to the affinity string. // // A column affinity string has one character per column: // // Character Column affinity // --------- --------------- // 'A' BLOB // 'B' TEXT // 'C' NUMERIC // 'D' INTEGER // 'E' REAL // // For STRICT tables: // ------------------ // // Generate an appropropriate OP_TypeCheck opcode that will verify the // datatypes against the column definitions in pTab. If iReg==0, that // means an OP_MakeRecord opcode has already been generated and should be // the last opcode generated. The new OP_TypeCheck needs to be inserted // before the OP_MakeRecord. The new OP_TypeCheck should use the same // register set as the OP_MakeRecord. If iReg>0 then register iReg is // the first of a series of registers that will form the new record. // Apply the type checking to that array of registers. func Xsqlite3TableAffinity(tls *libc.TLS, v uintptr, pTab uintptr, iReg int32) { var i int32 var zColAff uintptr if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Strict) != 0 { if iReg == 0 { var pPrev uintptr Xsqlite3VdbeAppendP4(tls, v, pTab, -5) pPrev = Xsqlite3VdbeGetLastOp(tls, v) (*VdbeOp)(unsafe.Pointer(pPrev)).Fopcode = U8(OP_TypeCheck) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, (*VdbeOp)(unsafe.Pointer(pPrev)).Fp1, (*VdbeOp)(unsafe.Pointer(pPrev)).Fp2, (*VdbeOp)(unsafe.Pointer(pPrev)).Fp3) } else { Xsqlite3VdbeAddOp2(tls, v, OP_TypeCheck, iReg, int32((*Table)(unsafe.Pointer(pTab)).FnNVCol)) Xsqlite3VdbeAppendP4(tls, v, pTab, -5) } return } zColAff = (*Table)(unsafe.Pointer(pTab)).FzColAff if zColAff == uintptr(0) { zColAff = Xsqlite3TableAffinityStr(tls, uintptr(0), pTab) if !(zColAff != 0) { Xsqlite3OomFault(tls, Xsqlite3VdbeDb(tls, v)) return } (*Table)(unsafe.Pointer(pTab)).FzColAff = zColAff } i = int32(libc.Xstrlen(tls, zColAff) & uint64(0x3fffffff)) if i != 0 { if iReg != 0 { Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, iReg, i, 0, zColAff, i) } else { Xsqlite3VdbeChangeP4(tls, v, -1, zColAff, i) } } } func readsTable(tls *libc.TLS, p uintptr, iDb int32, pTab uintptr) int32 { var v uintptr = Xsqlite3GetVdbe(tls, p) var i int32 var iEnd int32 = Xsqlite3VdbeCurrentAddr(tls, v) var pVTab uintptr if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { pVTab = Xsqlite3GetVTable(tls, (*Parse)(unsafe.Pointer(p)).Fdb, pTab) } else { pVTab = uintptr(0) } for i = 1; i < iEnd; i++ { var pOp uintptr = Xsqlite3VdbeGetOp(tls, v, i) if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_OpenRead && (*VdbeOp)(unsafe.Pointer(pOp)).Fp3 == iDb { var pIndex uintptr var tnum Pgno = Pgno((*VdbeOp)(unsafe.Pointer(pOp)).Fp2) if tnum == (*Table)(unsafe.Pointer(pTab)).Ftnum { return 1 } for pIndex = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIndex != 0; pIndex = (*Index)(unsafe.Pointer(pIndex)).FpNext { if tnum == (*Index)(unsafe.Pointer(pIndex)).Ftnum { return 1 } } } if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_VOpen && *(*uintptr)(unsafe.Pointer(pOp + 16)) == pVTab { return 1 } } return 0 } func exprColumnFlagUnion(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN && int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) >= 0 { *(*U16)(unsafe.Pointer(pWalker + 36)) |= U16(int32((*Column)(unsafe.Pointer((*Table1)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pWalker + 40)))).FaCol + uintptr((*Expr)(unsafe.Pointer(pExpr)).FiColumn)*24)).FcolFlags)) } return WRC_Continue } // All regular columns for table pTab have been puts into registers // starting with iRegStore. The registers that correspond to STORED // or VIRTUAL columns have not yet been initialized. This routine goes // back and computes the values for those columns based on the previously // computed normal columns. func Xsqlite3ComputeGeneratedColumns(tls *libc.TLS, pParse uintptr, iRegStore int32, pTab uintptr) { bp := tls.Alloc(56) defer tls.Free(56) var i int32 var pRedo uintptr var eProgress int32 var pOp uintptr Xsqlite3TableAffinity(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, pTab, iRegStore) if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasStored) != U32(0) { pOp = Xsqlite3VdbeGetLastOp(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe) if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Affinity { var ii int32 var jj int32 var zP4 uintptr = *(*uintptr)(unsafe.Pointer(pOp + 16)) for ii = libc.AssignInt32(&jj, 0); *(*int8)(unsafe.Pointer(zP4 + uintptr(jj))) != 0; ii++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(ii)*24)).FcolFlags)&COLFLAG_VIRTUAL != 0 { continue } if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(ii)*24)).FcolFlags)&COLFLAG_STORED != 0 { *(*int8)(unsafe.Pointer(zP4 + uintptr(jj))) = int8(SQLITE_AFF_NONE) } jj++ } } else if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_TypeCheck { (*VdbeOp)(unsafe.Pointer(pOp)).Fp3 = 1 } } for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_GENERATED != 0 { *(*U16)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(i)*24 + 16)) |= U16(COLFLAG_NOTAVAIL) } } *(*uintptr)(unsafe.Pointer(bp + 8 + 40)) = pTab (*Walker)(unsafe.Pointer(bp + 8)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{exprColumnFlagUnion})) (*Walker)(unsafe.Pointer(bp + 8)).FxSelectCallback = uintptr(0) (*Walker)(unsafe.Pointer(bp + 8)).FxSelectCallback2 = uintptr(0) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = -iRegStore for __ccgo := true; __ccgo; __ccgo = pRedo != 0 && eProgress != 0 { eProgress = 0 pRedo = uintptr(0) for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { var pCol uintptr = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(i)*24 if int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_NOTAVAIL != 0 { var x int32 *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_BUSY) (*Walker)(unsafe.Pointer(bp + 8)).FeCode = U16(0) Xsqlite3WalkExpr(tls, bp+8, Xsqlite3ColumnExpr(tls, pTab, pCol)) *(*U16)(unsafe.Pointer(pCol + 16)) &= libc.Uint16FromInt32(libc.CplInt32(COLFLAG_BUSY)) if int32((*Walker)(unsafe.Pointer(bp+8)).FeCode)&COLFLAG_NOTAVAIL != 0 { pRedo = pCol continue } eProgress = 1 x = int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(i))) + iRegStore Xsqlite3ExprCodeGeneratedColumn(tls, pParse, pTab, pCol, x) *(*U16)(unsafe.Pointer(pCol + 16)) &= libc.Uint16FromInt32(libc.CplInt32(COLFLAG_NOTAVAIL)) } } } if pRedo != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+9322, libc.VaList(bp, (*Column)(unsafe.Pointer(pRedo)).FzCnName)) } (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = 0 } func autoIncBegin(tls *libc.TLS, pParse uintptr, iDb int32, pTab uintptr) int32 { var memId int32 = 0 if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Autoincrement) != U32(0) && (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmDbFlags&U32(DBFLAG_Vacuum) == U32(0) { var pToplevel uintptr = func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }() var pInfo uintptr var pSeqTab uintptr = (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb + uintptr(iDb)*32)).FpSchema)).FpSeqTab if pSeqTab == uintptr(0) || !((*Table)(unsafe.Pointer(pSeqTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) || int32((*Table)(unsafe.Pointer(pSeqTab)).FeTabType) == TABTYP_VTAB || int32((*Table)(unsafe.Pointer(pSeqTab)).FnCol) != 2 { (*Parse)(unsafe.Pointer(pParse)).FnErr++ (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_CORRUPT | int32(2)<<8 return 0 } pInfo = (*Parse)(unsafe.Pointer(pToplevel)).FpAinc for pInfo != 0 && (*AutoincInfo)(unsafe.Pointer(pInfo)).FpTab != pTab { pInfo = (*AutoincInfo)(unsafe.Pointer(pInfo)).FpNext } if pInfo == uintptr(0) { pInfo = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(AutoincInfo{}))) Xsqlite3ParserAddCleanup(tls, pToplevel, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3DbFree})), pInfo) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { return 0 } (*AutoincInfo)(unsafe.Pointer(pInfo)).FpNext = (*Parse)(unsafe.Pointer(pToplevel)).FpAinc (*Parse)(unsafe.Pointer(pToplevel)).FpAinc = pInfo (*AutoincInfo)(unsafe.Pointer(pInfo)).FpTab = pTab (*AutoincInfo)(unsafe.Pointer(pInfo)).FiDb = iDb (*Parse)(unsafe.Pointer(pToplevel)).FnMem++ (*AutoincInfo)(unsafe.Pointer(pInfo)).FregCtr = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pToplevel)).FnMem, 1) *(*int32)(unsafe.Pointer(pToplevel + 56)) += 2 } memId = (*AutoincInfo)(unsafe.Pointer(pInfo)).FregCtr } return memId } // This routine generates code that will initialize all of the // register used by the autoincrement tracker. func Xsqlite3AutoincrementBegin(tls *libc.TLS, pParse uintptr) { var p uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pDb uintptr var memId int32 var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe for p = (*Parse)(unsafe.Pointer(pParse)).FpAinc; p != 0; p = (*AutoincInfo)(unsafe.Pointer(p)).FpNext { var aOp uintptr pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*AutoincInfo)(unsafe.Pointer(p)).FiDb)*32 memId = (*AutoincInfo)(unsafe.Pointer(p)).FregCtr Xsqlite3OpenTable(tls, pParse, 0, (*AutoincInfo)(unsafe.Pointer(p)).FiDb, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).FpSeqTab, OP_OpenRead) Xsqlite3VdbeLoadString(tls, v, memId-1, (*Table)(unsafe.Pointer((*AutoincInfo)(unsafe.Pointer(p)).FpTab)).FzName) aOp = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(autoInc))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&autoInc)), iLn1) if aOp == uintptr(0) { break } (*VdbeOp)(unsafe.Pointer(aOp)).Fp2 = memId (*VdbeOp)(unsafe.Pointer(aOp)).Fp3 = memId + 2 (*VdbeOp)(unsafe.Pointer(aOp + 2*24)).Fp3 = memId (*VdbeOp)(unsafe.Pointer(aOp + 3*24)).Fp1 = memId - 1 (*VdbeOp)(unsafe.Pointer(aOp + 3*24)).Fp3 = memId (*VdbeOp)(unsafe.Pointer(aOp + 3*24)).Fp5 = U16(SQLITE_JUMPIFNULL) (*VdbeOp)(unsafe.Pointer(aOp + 4*24)).Fp2 = memId + 1 (*VdbeOp)(unsafe.Pointer(aOp + 5*24)).Fp3 = memId (*VdbeOp)(unsafe.Pointer(aOp + 6*24)).Fp1 = memId (*VdbeOp)(unsafe.Pointer(aOp + 7*24)).Fp2 = memId + 2 (*VdbeOp)(unsafe.Pointer(aOp + 7*24)).Fp1 = memId (*VdbeOp)(unsafe.Pointer(aOp + 10*24)).Fp2 = memId if (*Parse)(unsafe.Pointer(pParse)).FnTab == 0 { (*Parse)(unsafe.Pointer(pParse)).FnTab = 1 } } } var iLn1 int32 = 0 var autoInc = [12]VdbeOpList{ {Fopcode: U8(OP_Null)}, {Fopcode: U8(OP_Rewind), Fp2: int8(10)}, {Fopcode: U8(OP_Column)}, {Fopcode: U8(OP_Ne), Fp2: int8(9)}, {Fopcode: U8(OP_Rowid)}, {Fopcode: U8(OP_Column), Fp2: int8(1)}, {Fopcode: U8(OP_AddImm)}, {Fopcode: U8(OP_Copy)}, {Fopcode: U8(OP_Goto), Fp2: int8(11)}, {Fopcode: U8(OP_Next), Fp2: int8(2)}, {Fopcode: U8(OP_Integer)}, {Fopcode: U8(OP_Close)}, } func autoIncStep(tls *libc.TLS, pParse uintptr, memId int32, regRowid int32) { if memId > 0 { Xsqlite3VdbeAddOp2(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, OP_MemMax, memId, regRowid) } } func autoIncrementEnd(tls *libc.TLS, pParse uintptr) { var p uintptr var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb for p = (*Parse)(unsafe.Pointer(pParse)).FpAinc; p != 0; p = (*AutoincInfo)(unsafe.Pointer(p)).FpNext { var aOp uintptr var pDb uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr((*AutoincInfo)(unsafe.Pointer(p)).FiDb)*32 var iRec int32 var memId int32 = (*AutoincInfo)(unsafe.Pointer(p)).FregCtr iRec = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_Le, memId+2, Xsqlite3VdbeCurrentAddr(tls, v)+7, memId) Xsqlite3OpenTable(tls, pParse, 0, (*AutoincInfo)(unsafe.Pointer(p)).FiDb, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).FpSeqTab, OP_OpenWrite) aOp = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(autoIncEnd))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&autoIncEnd)), iLn2) if aOp == uintptr(0) { break } (*VdbeOp)(unsafe.Pointer(aOp)).Fp1 = memId + 1 (*VdbeOp)(unsafe.Pointer(aOp + 1*24)).Fp2 = memId + 1 (*VdbeOp)(unsafe.Pointer(aOp + 2*24)).Fp1 = memId - 1 (*VdbeOp)(unsafe.Pointer(aOp + 2*24)).Fp3 = iRec (*VdbeOp)(unsafe.Pointer(aOp + 3*24)).Fp2 = iRec (*VdbeOp)(unsafe.Pointer(aOp + 3*24)).Fp3 = memId + 1 (*VdbeOp)(unsafe.Pointer(aOp + 3*24)).Fp5 = U16(OPFLAG_APPEND) Xsqlite3ReleaseTempReg(tls, pParse, iRec) } } var iLn2 int32 = 0 var autoIncEnd = [5]VdbeOpList{ {Fopcode: U8(OP_NotNull), Fp2: int8(2)}, {Fopcode: U8(OP_NewRowid)}, {Fopcode: U8(OP_MakeRecord), Fp2: int8(2)}, {Fopcode: U8(OP_Insert)}, {Fopcode: U8(OP_Close)}, } func Xsqlite3AutoincrementEnd(tls *libc.TLS, pParse uintptr) { if (*Parse)(unsafe.Pointer(pParse)).FpAinc != 0 { autoIncrementEnd(tls, pParse) } } // This routine is called to handle SQL of the following forms: // // insert into TABLE (IDLIST) values(EXPRLIST),(EXPRLIST),... // insert into TABLE (IDLIST) select // insert into TABLE (IDLIST) default values // // The IDLIST following the table name is always optional. If omitted, // then a list of all (non-hidden) columns for the table is substituted. // The IDLIST appears in the pColumn parameter. pColumn is NULL if IDLIST // is omitted. // // For the pSelect parameter holds the values to be inserted for the // first two forms shown above. A VALUES clause is really just short-hand // for a SELECT statement that omits the FROM clause and everything else // that follows. If the pSelect parameter is NULL, that means that the // DEFAULT VALUES form of the INSERT statement is intended. // // The code generated follows one of four templates. For a simple // insert with data coming from a single-row VALUES clause, the code executes // once straight down through. Pseudo-code follows (we call this // the "1st template"): // // open write cursor to
and its indices // put VALUES clause expressions into registers // write the resulting record into
// cleanup // // The three remaining templates assume the statement is of the form // // INSERT INTO
SELECT ... // // If the SELECT clause is of the restricted form "SELECT * FROM " - // in other words if the SELECT pulls all columns from a single table // and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and // if and are distinct tables but have identical // schemas, including all the same indices, then a special optimization // is invoked that copies raw records from over to . // See the xferOptimization() function for the implementation of this // template. This is the 2nd template. // // open a write cursor to
// open read cursor on // transfer all records in over to
// close cursors // foreach index on
// open a write cursor on the
index // open a read cursor on the corresponding index // transfer all records from the read to the write cursors // close cursors // end foreach // // The 3rd template is for when the second template does not apply // and the SELECT clause does not read from
at any time. // The generated code follows this template: // // X <- A // goto B // A: setup for the SELECT // loop over the rows in the SELECT // load values into registers R..R+n // yield X // end loop // cleanup after the SELECT // end-coroutine X // B: open write cursor to
and its indices // C: yield X, at EOF goto D // insert the select result into
from R..R+n // goto C // D: cleanup // // The 4th template is used if the insert statement takes its // values from a SELECT but the data is being inserted into a table // that is also read as part of the SELECT. In the third form, // we have to use an intermediate table to store the results of // the select. The template is like this: // // X <- A // goto B // A: setup for the SELECT // loop over the tables in the SELECT // load value into register R..R+n // yield X // end loop // cleanup after the SELECT // end co-routine R // B: open temp table // L: yield X, at EOF goto M // insert row from R..R+n into temp table // goto L // M: open write cursor to
and its indices // rewind temp table // C: loop over rows of intermediate table // transfer values form intermediate table into
// end loop // D: cleanup func Xsqlite3Insert(tls *libc.TLS, pParse uintptr, pTabList uintptr, pSelect uintptr, pColumn uintptr, onError int32, pUpsert uintptr) { bp := tls.Alloc(188) defer tls.Free(188) var db uintptr var pTab uintptr var i int32 var j int32 var v uintptr var pIdx uintptr var nColumn int32 var nHidden int32 var ipkColumn int32 var endOfLoop int32 var srcTab int32 var addrInsTop int32 var addrCont int32 var iDb int32 var useTempTable U8 var appendFlag U8 var withoutRowid U8 var bIdListInOrder U8 var pList uintptr var iRegStore int32 var regFromSelect int32 var regAutoinc int32 var regRowCount int32 var regIns int32 var regRowid int32 var regData int32 var aRegIdx uintptr var isView int32 var pTrigger uintptr var regRec int32 var regTempRowid int32 var addrL int32 var regYield int32 var addrTop int32 var rc int32 var nIdx int32 var pNx uintptr var pX uintptr var y int32 var k int32 var colFlags U32 var addr1 int32 var regCols int32 var pIpk uintptr var addr11 int32 var pVTab uintptr var bUseSeek int32 nHidden = 0 *(*int32)(unsafe.Pointer(bp + 176)) = 0 *(*int32)(unsafe.Pointer(bp + 180)) = 0 ipkColumn = -1 srcTab = 0 addrInsTop = 0 addrCont = 0 useTempTable = U8(0) appendFlag = U8(0) pList = uintptr(0) regFromSelect = 0 regAutoinc = 0 regRowCount = 0 aRegIdx = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __1 } goto insert_cleanup __1: ; (*SelectDest)(unsafe.Pointer(bp + 80)).FiSDParm = 0 if !(pSelect != 0 && (*Select)(unsafe.Pointer(pSelect)).FselFlags&U32(SF_Values) != U32(0) && (*Select)(unsafe.Pointer(pSelect)).FpPrior == uintptr(0)) { goto __2 } pList = (*Select)(unsafe.Pointer(pSelect)).FpEList (*Select)(unsafe.Pointer(pSelect)).FpEList = uintptr(0) Xsqlite3SelectDelete(tls, db, pSelect) pSelect = uintptr(0) __2: ; pTab = Xsqlite3SrcListLookup(tls, pParse, pTabList) if !(pTab == uintptr(0)) { goto __3 } goto insert_cleanup __3: ; iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_INSERT, (*Table)(unsafe.Pointer(pTab)).FzName, uintptr(0), (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) != 0) { goto __4 } goto insert_cleanup __4: ; withoutRowid = libc.BoolUint8(!((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0))) pTrigger = Xsqlite3TriggersExist(tls, pParse, pTab, TK_INSERT, uintptr(0), bp+72) isView = libc.Bool32(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) if !(Xsqlite3ViewGetColumnNames(tls, pParse, pTab) != 0) { goto __5 } goto insert_cleanup __5: ; if !(Xsqlite3IsReadOnly(tls, pParse, pTab, *(*int32)(unsafe.Pointer(bp + 72))) != 0) { goto __6 } goto insert_cleanup __6: ; v = Xsqlite3GetVdbe(tls, pParse) if !(v == uintptr(0)) { goto __7 } goto insert_cleanup __7: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0) { goto __8 } Xsqlite3VdbeCountChanges(tls, v) __8: ; Xsqlite3BeginWriteOperation(tls, pParse, libc.Bool32(pSelect != 0 || pTrigger != 0), iDb) if !(pColumn == uintptr(0) && pSelect != uintptr(0) && pTrigger == uintptr(0) && xferOptimization(tls, pParse, pTab, pSelect, onError, iDb) != 0) { goto __9 } goto insert_end __9: ; regAutoinc = autoIncBegin(tls, pParse, iDb, pTab) regRowid = libc.AssignInt32(®Ins, (*Parse)(unsafe.Pointer(pParse)).FnMem+1) *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Table)(unsafe.Pointer(pTab)).FnCol) + 1 if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __10 } regRowid++ (*Parse)(unsafe.Pointer(pParse)).FnMem++ __10: ; regData = regRowid + 1 bIdListInOrder = U8(libc.Bool32((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_OOOHidden|TF_HasStored) == U32(0))) if !(pColumn != 0) { goto __11 } (*IdList)(unsafe.Pointer(pColumn)).FeU4 = U8(EU4_IDX) i = 0 __12: if !(i < (*IdList)(unsafe.Pointer(pColumn)).FnId) { goto __14 } *(*int32)(unsafe.Pointer(pColumn + 8 + uintptr(i)*16 + 8)) = -1 goto __13 __13: i++ goto __12 goto __14 __14: ; i = 0 __15: if !(i < (*IdList)(unsafe.Pointer(pColumn)).FnId) { goto __17 } j = 0 __18: if !(j < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __20 } if !(Xsqlite3StrICmp(tls, (*IdList_item)(unsafe.Pointer(pColumn+8+uintptr(i)*16)).FzName, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FzCnName) == 0) { goto __21 } *(*int32)(unsafe.Pointer(pColumn + 8 + uintptr(i)*16 + 8)) = j if !(i != j) { goto __22 } bIdListInOrder = U8(0) __22: ; if !(j == int32((*Table)(unsafe.Pointer(pTab)).FiPKey)) { goto __23 } ipkColumn = i __23: ; if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&(COLFLAG_STORED|COLFLAG_VIRTUAL) != 0) { goto __24 } Xsqlite3ErrorMsg(tls, pParse, ts+17014, libc.VaList(bp, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FzCnName)) goto insert_cleanup __24: ; goto __20 __21: ; goto __19 __19: j++ goto __18 goto __20 __20: ; if !(j >= int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __25 } if !(Xsqlite3IsRowid(tls, (*IdList_item)(unsafe.Pointer(pColumn+8+uintptr(i)*16)).FzName) != 0 && !(withoutRowid != 0)) { goto __26 } ipkColumn = i bIdListInOrder = U8(0) goto __27 __26: Xsqlite3ErrorMsg(tls, pParse, ts+17055, libc.VaList(bp+8, pTabList+8, (*IdList_item)(unsafe.Pointer(pColumn+8+uintptr(i)*16)).FzName)) (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) goto insert_cleanup __27: ; __25: ; goto __16 __16: i++ goto __15 goto __17 __17: ; __11: ; if !(pSelect != 0) { goto __28 } regYield = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) addrTop = Xsqlite3VdbeCurrentAddr(tls, v) + 1 Xsqlite3VdbeAddOp3(tls, v, OP_InitCoroutine, regYield, 0, addrTop) Xsqlite3SelectDestInit(tls, bp+80, SRT_Coroutine, regYield) (*SelectDest)(unsafe.Pointer(bp + 80)).FiSdst = func() int32 { if bIdListInOrder != 0 { return regData } return 0 }() (*SelectDest)(unsafe.Pointer(bp + 80)).FnSdst = int32((*Table)(unsafe.Pointer(pTab)).FnCol) rc = Xsqlite3Select(tls, pParse, pSelect, bp+80) regFromSelect = (*SelectDest)(unsafe.Pointer(bp + 80)).FiSdst if !(rc != 0 || (*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __30 } goto insert_cleanup __30: ; Xsqlite3VdbeEndCoroutine(tls, v, regYield) Xsqlite3VdbeJumpHere(tls, v, addrTop-1) nColumn = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpEList)).FnExpr if !(pTrigger != 0 || readsTable(tls, pParse, iDb, pTab) != 0) { goto __31 } useTempTable = U8(1) __31: ; if !(useTempTable != 0) { goto __32 } srcTab = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) regRec = Xsqlite3GetTempReg(tls, pParse) regTempRowid = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, srcTab, nColumn) addrL = Xsqlite3VdbeAddOp1(tls, v, OP_Yield, (*SelectDest)(unsafe.Pointer(bp+80)).FiSDParm) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regFromSelect, nColumn, regRec) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, srcTab, regTempRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, srcTab, regRec, regTempRowid) Xsqlite3VdbeGoto(tls, v, addrL) Xsqlite3VdbeJumpHere(tls, v, addrL) Xsqlite3ReleaseTempReg(tls, pParse, regRec) Xsqlite3ReleaseTempReg(tls, pParse, regTempRowid) __32: ; goto __29 __28: libc.Xmemset(tls, bp+120, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 120)).FpParse = pParse srcTab = -1 if !(pList != 0) { goto __33 } nColumn = (*ExprList)(unsafe.Pointer(pList)).FnExpr if !(Xsqlite3ResolveExprListNames(tls, bp+120, pList) != 0) { goto __35 } goto insert_cleanup __35: ; goto __34 __33: nColumn = 0 __34: ; __29: ; if !(pColumn == uintptr(0) && nColumn > 0) { goto __36 } ipkColumn = int32((*Table)(unsafe.Pointer(pTab)).FiPKey) if !(ipkColumn >= 0 && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated) != U32(0)) { goto __37 } i = ipkColumn - 1 __38: if !(i >= 0) { goto __40 } if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_GENERATED != 0) { goto __41 } ipkColumn-- __41: ; goto __39 __39: i-- goto __38 goto __40 __40: ; __37: ; if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated|TF_HasHidden) != U32(0)) { goto __42 } i = 0 __43: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __45 } if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_NOINSERT != 0) { goto __46 } nHidden++ __46: ; goto __44 __44: i++ goto __43 goto __45 __45: ; __42: ; if !(nColumn != int32((*Table)(unsafe.Pointer(pTab)).FnCol)-nHidden) { goto __47 } Xsqlite3ErrorMsg(tls, pParse, ts+17087, libc.VaList(bp+24, pTabList+8, int32((*Table)(unsafe.Pointer(pTab)).FnCol)-nHidden, nColumn)) goto insert_cleanup __47: ; __36: ; if !(pColumn != uintptr(0) && nColumn != (*IdList)(unsafe.Pointer(pColumn)).FnId) { goto __48 } Xsqlite3ErrorMsg(tls, pParse, ts+17139, libc.VaList(bp+48, nColumn, (*IdList)(unsafe.Pointer(pColumn)).FnId)) goto insert_cleanup __48: ; if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&(uint64(0x00001)<<32) != uint64(0) && !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FpTriggerTab) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FbReturning) != 0)) { goto __49 } regRowCount = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regRowCount) __49: ; if !!(isView != 0) { goto __50 } nIdx = Xsqlite3OpenTableAndIndices(tls, pParse, pTab, OP_OpenWrite, uint8(0), -1, uintptr(0), bp+176, bp+180) aRegIdx = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(int32(0)))*uint64(nIdx+2)) if !(aRegIdx == uintptr(0)) { goto __51 } goto insert_cleanup __51: ; i = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __52: if !(i < nIdx) { goto __54 } *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4)) = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) goto __53 __53: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext i++ goto __52 goto __54 __54: ; *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4)) = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) __50: ; if !(pUpsert != 0) { goto __55 } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __56 } Xsqlite3ErrorMsg(tls, pParse, ts+17164, libc.VaList(bp+64, (*Table)(unsafe.Pointer(pTab)).FzName)) goto insert_cleanup __56: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __57 } Xsqlite3ErrorMsg(tls, pParse, ts+17210, 0) goto insert_cleanup __57: ; if !(Xsqlite3HasExplicitNulls(tls, pParse, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget) != 0) { goto __58 } goto insert_cleanup __58: ; (*SrcItem)(unsafe.Pointer(pTabList + 8)).FiCursor = *(*int32)(unsafe.Pointer(bp + 176)) pNx = pUpsert __59: (*Upsert)(unsafe.Pointer(pNx)).FpUpsertSrc = pTabList (*Upsert)(unsafe.Pointer(pNx)).FregData = regData (*Upsert)(unsafe.Pointer(pNx)).FiDataCur = *(*int32)(unsafe.Pointer(bp + 176)) (*Upsert)(unsafe.Pointer(pNx)).FiIdxCur = *(*int32)(unsafe.Pointer(bp + 180)) if !((*Upsert)(unsafe.Pointer(pNx)).FpUpsertTarget != 0) { goto __62 } if !(Xsqlite3UpsertAnalyzeTarget(tls, pParse, pTabList, pNx) != 0) { goto __63 } goto insert_cleanup __63: ; __62: ; pNx = (*Upsert)(unsafe.Pointer(pNx)).FpNextUpsert goto __60 __60: if pNx != uintptr(0) { goto __59 } goto __61 __61: ; __55: ; if !(useTempTable != 0) { goto __64 } addrInsTop = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, srcTab) addrCont = Xsqlite3VdbeCurrentAddr(tls, v) goto __65 __64: if !(pSelect != 0) { goto __66 } addrInsTop = libc.AssignInt32(&addrCont, Xsqlite3VdbeAddOp1(tls, v, OP_Yield, (*SelectDest)(unsafe.Pointer(bp+80)).FiSDParm)) if !(ipkColumn >= 0) { goto __67 } Xsqlite3VdbeAddOp2(tls, v, OP_Copy, regFromSelect+ipkColumn, regRowid) __67: ; __66: ; __65: ; nHidden = 0 iRegStore = regData i = 0 __68: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __70 } if !(i == int32((*Table)(unsafe.Pointer(pTab)).FiPKey)) { goto __71 } Xsqlite3VdbeAddOp1(tls, v, OP_SoftNull, iRegStore) goto __69 __71: ; if !(libc.AssignUint32(&colFlags, U32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags))&U32(COLFLAG_NOINSERT) != U32(0)) { goto __72 } nHidden++ if !(colFlags&U32(COLFLAG_VIRTUAL) != U32(0)) { goto __73 } iRegStore-- goto __69 goto __74 __73: if !(colFlags&U32(COLFLAG_STORED) != U32(0)) { goto __75 } if !(*(*int32)(unsafe.Pointer(bp + 72))&TRIGGER_BEFORE != 0) { goto __77 } Xsqlite3VdbeAddOp1(tls, v, OP_SoftNull, iRegStore) __77: ; goto __69 goto __76 __75: if !(pColumn == uintptr(0)) { goto __78 } Xsqlite3ExprCodeFactorable(tls, pParse, Xsqlite3ColumnExpr(tls, pTab, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24), iRegStore) goto __69 __78: ; __76: ; __74: ; __72: ; if !(pColumn != 0) { goto __79 } j = 0 __81: if !(j < (*IdList)(unsafe.Pointer(pColumn)).FnId && *(*int32)(unsafe.Pointer(pColumn + 8 + uintptr(j)*16 + 8)) != i) { goto __83 } goto __82 __82: j++ goto __81 goto __83 __83: ; if !(j >= (*IdList)(unsafe.Pointer(pColumn)).FnId) { goto __84 } Xsqlite3ExprCodeFactorable(tls, pParse, Xsqlite3ColumnExpr(tls, pTab, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24), iRegStore) goto __69 __84: ; k = j goto __80 __79: if !(nColumn == 0) { goto __85 } Xsqlite3ExprCodeFactorable(tls, pParse, Xsqlite3ColumnExpr(tls, pTab, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24), iRegStore) goto __69 goto __86 __85: k = i - nHidden __86: ; __80: ; if !(useTempTable != 0) { goto __87 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, srcTab, k, iRegStore) goto __88 __87: if !(pSelect != 0) { goto __89 } if !(regFromSelect != regData) { goto __91 } Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, regFromSelect+k, iRegStore) __91: ; goto __90 __89: pX = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(k)*32)).FpExpr y = Xsqlite3ExprCodeTarget(tls, pParse, pX, iRegStore) if !(y != iRegStore) { goto __92 } Xsqlite3VdbeAddOp2(tls, v, func() int32 { if (*Expr)(unsafe.Pointer(pX)).Fflags&U32(EP_Subquery) != U32(0) { return OP_Copy } return OP_SCopy }(), y, iRegStore) __92: ; __90: ; __88: ; goto __69 __69: i++ iRegStore++ goto __68 goto __70 __70: ; endOfLoop = Xsqlite3VdbeMakeLabel(tls, pParse) if !(*(*int32)(unsafe.Pointer(bp + 72))&TRIGGER_BEFORE != 0) { goto __93 } regCols = Xsqlite3GetTempRange(tls, pParse, int32((*Table)(unsafe.Pointer(pTab)).FnCol)+1) if !(ipkColumn < 0) { goto __94 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, -1, regCols) goto __95 __94: ; if !(useTempTable != 0) { goto __96 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, srcTab, ipkColumn, regCols) goto __97 __96: ; Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(ipkColumn)*32)).FpExpr, regCols) __97: ; addr1 = Xsqlite3VdbeAddOp1(tls, v, OP_NotNull, regCols) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, -1, regCols) Xsqlite3VdbeJumpHere(tls, v, addr1) Xsqlite3VdbeAddOp1(tls, v, OP_MustBeInt, regCols) __95: ; Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regRowid+1, regCols+1, int32((*Table)(unsafe.Pointer(pTab)).FnNVCol)-1) if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated) != 0) { goto __98 } Xsqlite3ComputeGeneratedColumns(tls, pParse, regCols+1, pTab) __98: ; if !!(isView != 0) { goto __99 } Xsqlite3TableAffinity(tls, v, pTab, regCols+1) __99: ; Xsqlite3CodeRowTrigger(tls, pParse, pTrigger, TK_INSERT, uintptr(0), TRIGGER_BEFORE, pTab, regCols-int32((*Table)(unsafe.Pointer(pTab)).FnCol)-1, onError, endOfLoop) Xsqlite3ReleaseTempRange(tls, pParse, regCols, int32((*Table)(unsafe.Pointer(pTab)).FnCol)+1) __93: ; if !!(isView != 0) { goto __100 } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __101 } Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regIns) __101: ; if !(ipkColumn >= 0) { goto __102 } if !(useTempTable != 0) { goto __104 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, srcTab, ipkColumn, regRowid) goto __105 __104: if !(pSelect != 0) { goto __106 } goto __107 __106: pIpk = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(ipkColumn)*32)).FpExpr if !(int32((*Expr)(unsafe.Pointer(pIpk)).Fop) == TK_NULL && !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB)) { goto __108 } Xsqlite3VdbeAddOp3(tls, v, OP_NewRowid, *(*int32)(unsafe.Pointer(bp + 176)), regRowid, regAutoinc) appendFlag = U8(1) goto __109 __108: Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(ipkColumn)*32)).FpExpr, regRowid) __109: ; __107: ; __105: ; if !!(appendFlag != 0) { goto __110 } if !!(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __111 } addr11 = Xsqlite3VdbeAddOp1(tls, v, OP_NotNull, regRowid) Xsqlite3VdbeAddOp3(tls, v, OP_NewRowid, *(*int32)(unsafe.Pointer(bp + 176)), regRowid, regAutoinc) Xsqlite3VdbeJumpHere(tls, v, addr11) goto __112 __111: addr11 = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regRowid, addr11+2) __112: ; Xsqlite3VdbeAddOp1(tls, v, OP_MustBeInt, regRowid) __110: ; goto __103 __102: if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB || withoutRowid != 0) { goto __113 } Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regRowid) goto __114 __113: Xsqlite3VdbeAddOp3(tls, v, OP_NewRowid, *(*int32)(unsafe.Pointer(bp + 176)), regRowid, regAutoinc) appendFlag = U8(1) __114: ; __103: ; autoIncStep(tls, pParse, regAutoinc, regRowid) if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated) != 0) { goto __115 } Xsqlite3ComputeGeneratedColumns(tls, pParse, regRowid+1, pTab) __115: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __116 } pVTab = Xsqlite3GetVTable(tls, db, pTab) Xsqlite3VtabMakeWritable(tls, pParse, pTab) Xsqlite3VdbeAddOp4(tls, v, OP_VUpdate, 1, int32((*Table)(unsafe.Pointer(pTab)).FnCol)+2, regIns, pVTab, -11) Xsqlite3VdbeChangeP5(tls, v, func() uint16 { if onError == OE_Default { return uint16(OE_Abort) } return uint16(onError) }()) Xsqlite3MayAbort(tls, pParse) goto __117 __116: *(*int32)(unsafe.Pointer(bp + 184)) = 0 Xsqlite3GenerateConstraintChecks(tls, pParse, pTab, aRegIdx, *(*int32)(unsafe.Pointer(bp + 176)), *(*int32)(unsafe.Pointer(bp + 180)), regIns, 0, uint8(libc.Bool32(ipkColumn >= 0)), uint8(onError), endOfLoop, bp+184, uintptr(0), pUpsert) if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ForeignKeys) != 0) { goto __118 } Xsqlite3FkCheck(tls, pParse, pTab, 0, regIns, uintptr(0), 0) __118: ; bUseSeek = libc.Bool32(*(*int32)(unsafe.Pointer(bp + 184)) == 0 || !(Xsqlite3VdbeHasSubProgram(tls, v) != 0)) Xsqlite3CompleteInsertion(tls, pParse, pTab, *(*int32)(unsafe.Pointer(bp + 176)), *(*int32)(unsafe.Pointer(bp + 180)), regIns, aRegIdx, 0, int32(appendFlag), bUseSeek) __117: ; __100: ; if !(regRowCount != 0) { goto __119 } Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, regRowCount, 1) __119: ; if !(pTrigger != 0) { goto __120 } Xsqlite3CodeRowTrigger(tls, pParse, pTrigger, TK_INSERT, uintptr(0), TRIGGER_AFTER, pTab, regData-2-int32((*Table)(unsafe.Pointer(pTab)).FnCol), onError, endOfLoop) __120: ; Xsqlite3VdbeResolveLabel(tls, v, endOfLoop) if !(useTempTable != 0) { goto __121 } Xsqlite3VdbeAddOp2(tls, v, OP_Next, srcTab, addrCont) Xsqlite3VdbeJumpHere(tls, v, addrInsTop) Xsqlite3VdbeAddOp1(tls, v, OP_Close, srcTab) goto __122 __121: if !(pSelect != 0) { goto __123 } Xsqlite3VdbeGoto(tls, v, addrCont) Xsqlite3VdbeJumpHere(tls, v, addrInsTop) __123: ; __122: ; insert_end: if !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0 && (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab == uintptr(0)) { goto __124 } Xsqlite3AutoincrementEnd(tls, pParse) __124: ; if !(regRowCount != 0) { goto __125 } Xsqlite3CodeChangeCount(tls, v, regRowCount, ts+17231) __125: ; insert_cleanup: Xsqlite3SrcListDelete(tls, db, pTabList) Xsqlite3ExprListDelete(tls, db, pList) Xsqlite3UpsertDelete(tls, db, pUpsert) Xsqlite3SelectDelete(tls, db, pSelect) Xsqlite3IdListDelete(tls, db, pColumn) if !(aRegIdx != 0) { goto __126 } Xsqlite3DbNNFreeNN(tls, db, aRegIdx) __126: } func checkConstraintExprNode(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN { if int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) >= 0 { if *(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pWalker + 40)) + uintptr((*Expr)(unsafe.Pointer(pExpr)).FiColumn)*4)) >= 0 { *(*U16)(unsafe.Pointer(pWalker + 36)) |= U16(CKCNSTRNT_COLUMN) } } else { *(*U16)(unsafe.Pointer(pWalker + 36)) |= U16(CKCNSTRNT_ROWID) } } return WRC_Continue } // pExpr is a CHECK constraint on a row that is being UPDATE-ed. The // only columns that are modified by the UPDATE are those for which // aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. // // Return true if CHECK constraint pExpr uses any of the // changing columns (or the rowid if it is changing). In other words, // return true if this CHECK constraint must be validated for // the new row in the UPDATE statement. // // 2018-09-15: pExpr might also be an expression for an index-on-expressions. // The operation of this routine is the same - return true if an only if // the expression uses one or more of columns identified by the second and // third arguments. func Xsqlite3ExprReferencesUpdatedColumn(tls *libc.TLS, pExpr uintptr, aiChng uintptr, chngRowid int32) int32 { bp := tls.Alloc(48) defer tls.Free(48) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FeCode = U16(0) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{checkConstraintExprNode})) *(*uintptr)(unsafe.Pointer(bp + 40)) = aiChng Xsqlite3WalkExpr(tls, bp, pExpr) if !(chngRowid != 0) { *(*U16)(unsafe.Pointer(bp + 36)) &= libc.Uint16FromInt32(libc.CplInt32(CKCNSTRNT_ROWID)) } return libc.Bool32(int32((*Walker)(unsafe.Pointer(bp)).FeCode) != 0) } // The sqlite3GenerateConstraintChecks() routine usually wants to visit // the indexes of a table in the order provided in the Table->pIndex list. // However, sometimes (rarely - when there is an upsert) it wants to visit // the indexes in a different order. The following data structures accomplish // this. // // The IndexIterator object is used to walk through all of the indexes // of a table in either Index.pNext order, or in some other order established // by an array of IndexListTerm objects. type IndexListTerm1 = struct { Fp uintptr Fix int32 F__ccgo_pad1 [4]byte } // The sqlite3GenerateConstraintChecks() routine usually wants to visit // the indexes of a table in the order provided in the Table->pIndex list. // However, sometimes (rarely - when there is an upsert) it wants to visit // the indexes in a different order. The following data structures accomplish // this. // // The IndexIterator object is used to walk through all of the indexes // of a table in either Index.pNext order, or in some other order established // by an array of IndexListTerm objects. type IndexListTerm = IndexListTerm1 type IndexIterator1 = struct { FeType int32 Fi int32 Fu struct { Flx struct{ FpIdx uintptr } F__ccgo_pad1 [8]byte } } type IndexIterator = IndexIterator1 func indexIteratorFirst(tls *libc.TLS, pIter uintptr, pIx uintptr) uintptr { if (*IndexIterator)(unsafe.Pointer(pIter)).FeType != 0 { *(*int32)(unsafe.Pointer(pIx)) = (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pIter + 8 + 8)))).Fix return (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pIter + 8 + 8)))).Fp } else { *(*int32)(unsafe.Pointer(pIx)) = 0 return *(*uintptr)(unsafe.Pointer(pIter + 8)) } return uintptr(0) } func indexIteratorNext(tls *libc.TLS, pIter uintptr, pIx uintptr) uintptr { if (*IndexIterator)(unsafe.Pointer(pIter)).FeType != 0 { var i int32 = libc.PreIncInt32(&(*IndexIterator)(unsafe.Pointer(pIter)).Fi, 1) if i >= *(*int32)(unsafe.Pointer(pIter + 8)) { *(*int32)(unsafe.Pointer(pIx)) = i return uintptr(0) } *(*int32)(unsafe.Pointer(pIx)) = (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pIter + 8 + 8)) + uintptr(i)*16)).Fix return (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pIter + 8 + 8)) + uintptr(i)*16)).Fp } else { *(*int32)(unsafe.Pointer(pIx))++ *(*uintptr)(unsafe.Pointer(pIter + 8)) = (*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pIter + 8)))).FpNext return *(*uintptr)(unsafe.Pointer(pIter + 8)) } return uintptr(0) } // Generate code to do constraint checks prior to an INSERT or an UPDATE // on table pTab. // // The regNewData parameter is the first register in a range that contains // the data to be inserted or the data after the update. There will be // pTab->nCol+1 registers in this range. The first register (the one // that regNewData points to) will contain the new rowid, or NULL in the // case of a WITHOUT ROWID table. The second register in the range will // contain the content of the first table column. The third register will // contain the content of the second table column. And so forth. // // The regOldData parameter is similar to regNewData except that it contains // the data prior to an UPDATE rather than afterwards. regOldData is zero // for an INSERT. This routine can distinguish between UPDATE and INSERT by // checking regOldData for zero. // // For an UPDATE, the pkChng boolean is true if the true primary key (the // rowid for a normal table or the PRIMARY KEY for a WITHOUT ROWID table) // might be modified by the UPDATE. If pkChng is false, then the key of // the iDataCur content table is guaranteed to be unchanged by the UPDATE. // // For an INSERT, the pkChng boolean indicates whether or not the rowid // was explicitly specified as part of the INSERT statement. If pkChng // is zero, it means that the either rowid is computed automatically or // that the table is a WITHOUT ROWID table and has no rowid. On an INSERT, // pkChng will only be true if the INSERT statement provides an integer // value for either the rowid column or its INTEGER PRIMARY KEY alias. // // The code generated by this routine will store new index entries into // registers identified by aRegIdx[]. No index entry is created for // indices where aRegIdx[i]==0. The order of indices in aRegIdx[] is // the same as the order of indices on the linked list of indices // at pTab->pIndex. // // (2019-05-07) The generated code also creates a new record for the // main table, if pTab is a rowid table, and stores that record in the // register identified by aRegIdx[nIdx] - in other words in the first // entry of aRegIdx[] past the last index. It is important that the // record be generated during constraint checks to avoid affinity changes // to the register content that occur after constraint checks but before // the new record is inserted. // // The caller must have already opened writeable cursors on the main // table and all applicable indices (that is to say, all indices for which // aRegIdx[] is not zero). iDataCur is the cursor for the main table when // inserting or updating a rowid table, or the cursor for the PRIMARY KEY // index when operating on a WITHOUT ROWID table. iIdxCur is the cursor // for the first index in the pTab->pIndex list. Cursors for other indices // are at iIdxCur+N for the N-th element of the pTab->pIndex list. // // This routine also generates code to check constraints. NOT NULL, // CHECK, and UNIQUE constraints are all checked. If a constraint fails, // then the appropriate action is performed. There are five possible // actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. // // Constraint type Action What Happens // --------------- ---------- ---------------------------------------- // any ROLLBACK The current transaction is rolled back and // sqlite3_step() returns immediately with a // return code of SQLITE_CONSTRAINT. // // any ABORT Back out changes from the current command // only (do not do a complete rollback) then // cause sqlite3_step() to return immediately // with SQLITE_CONSTRAINT. // // any FAIL Sqlite3_step() returns immediately with a // return code of SQLITE_CONSTRAINT. The // transaction is not rolled back and any // changes to prior rows are retained. // // any IGNORE The attempt in insert or update the current // row is skipped, without throwing an error. // Processing continues with the next row. // (There is an immediate jump to ignoreDest.) // // NOT NULL REPLACE The NULL value is replace by the default // value for that column. If the default value // is NULL, the action is the same as ABORT. // // UNIQUE REPLACE The other row that conflicts with the row // being inserted is removed. // // CHECK REPLACE Illegal. The results in an exception. // // Which action to take is determined by the overrideError parameter. // Or if overrideError==OE_Default, then the pParse->onError parameter // is used. Or if pParse->onError==OE_Default then the onError value // for the constraint is used. func Xsqlite3GenerateConstraintChecks(tls *libc.TLS, pParse uintptr, pTab uintptr, aRegIdx uintptr, iDataCur int32, iIdxCur int32, regNewData int32, regOldData int32, pkChng U8, overrideError U8, ignoreDest int32, pbMayReplace uintptr, aiChng uintptr, pUpsert uintptr) { bp := tls.Alloc(72) defer tls.Free(72) var v uintptr var pIdx uintptr var pPk uintptr = uintptr(0) var db uintptr var i int32 var nCol int32 var onError int32 var seenReplace int32 = 0 var nPkField int32 var pUpsertClause uintptr = uintptr(0) var isUpdate U8 var bAffinityDone U8 = U8(0) var upsertIpkReturn int32 = 0 var upsertIpkDelay int32 = 0 var ipkTop int32 = 0 var ipkBottom int32 = 0 var regTrigCnt int32 var addrRecheck int32 = 0 var lblRecheckOk int32 = 0 var pTrigger uintptr var nReplaceTrig int32 = 0 isUpdate = U8(libc.Bool32(regOldData != 0)) db = (*Parse)(unsafe.Pointer(pParse)).Fdb v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe nCol = int32((*Table)(unsafe.Pointer(pTab)).FnCol) if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { pPk = uintptr(0) nPkField = 1 } else { pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) nPkField = int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol) } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasNotNull) != 0 { var b2ndPass int32 = 0 var nSeenReplace int32 = 0 var nGenerated int32 = 0 for 1 != 0 { for i = 0; i < nCol; i++ { var iReg int32 var pCol uintptr = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(i)*24 var isGenerated int32 onError = int32(*(*uint8)(unsafe.Pointer(pCol + 8)) & 0xf >> 0) if onError == OE_None { continue } if i == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { continue } isGenerated = int32((*Column)(unsafe.Pointer(pCol)).FcolFlags) & COLFLAG_GENERATED if isGenerated != 0 && !(b2ndPass != 0) { nGenerated++ continue } if aiChng != 0 && *(*int32)(unsafe.Pointer(aiChng + uintptr(i)*4)) < 0 && !(isGenerated != 0) { continue } if int32(overrideError) != OE_Default { onError = int32(overrideError) } else if onError == OE_Default { onError = OE_Abort } if onError == OE_Replace { if b2ndPass != 0 || int32((*Column)(unsafe.Pointer(pCol)).FiDflt) == 0 { onError = OE_Abort } else { } } else if b2ndPass != 0 && !(isGenerated != 0) { continue } iReg = int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(i))) + regNewData + 1 { switch onError { case OE_Replace: { var addr1 int32 = Xsqlite3VdbeAddOp1(tls, v, OP_NotNull, iReg) nSeenReplace++ Xsqlite3ExprCodeCopy(tls, pParse, Xsqlite3ColumnExpr(tls, pTab, pCol), iReg) Xsqlite3VdbeJumpHere(tls, v, addr1) break } fallthrough case OE_Abort: Xsqlite3MayAbort(tls, pParse) fallthrough case OE_Rollback: fallthrough case OE_Fail: { var zMsg uintptr = Xsqlite3MPrintf(tls, db, ts+13413, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName, (*Column)(unsafe.Pointer(pCol)).FzCnName)) Xsqlite3VdbeAddOp3(tls, v, OP_HaltIfNull, SQLITE_CONSTRAINT|int32(5)<<8, onError, iReg) Xsqlite3VdbeAppendP4(tls, v, zMsg, -6) Xsqlite3VdbeChangeP5(tls, v, uint16(P5_ConstraintNotNull)) break } fallthrough default: { Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, iReg, ignoreDest) break } } } } if nGenerated == 0 && nSeenReplace == 0 { break } if b2ndPass != 0 { break } b2ndPass = 1 if nSeenReplace > 0 && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated) != U32(0) { Xsqlite3ComputeGeneratedColumns(tls, pParse, regNewData+1, pTab) } } } if (*Table)(unsafe.Pointer(pTab)).FpCheck != 0 && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_IgnoreChecks) == uint64(0) { var pCheck uintptr = (*Table)(unsafe.Pointer(pTab)).FpCheck (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = -(regNewData + 1) if int32(overrideError) != OE_Default { onError = int32(overrideError) } else { onError = OE_Abort } for i = 0; i < (*ExprList)(unsafe.Pointer(pCheck)).FnExpr; i++ { var allOk int32 var pCopy uintptr var pExpr uintptr = (*ExprList_item)(unsafe.Pointer(pCheck + 8 + uintptr(i)*32)).FpExpr if aiChng != 0 && !(Xsqlite3ExprReferencesUpdatedColumn(tls, pExpr, aiChng, int32(pkChng)) != 0) { continue } if int32(bAffinityDone) == 0 { Xsqlite3TableAffinity(tls, v, pTab, regNewData+1) bAffinityDone = U8(1) } allOk = Xsqlite3VdbeMakeLabel(tls, pParse) pCopy = Xsqlite3ExprDup(tls, db, pExpr, 0) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { Xsqlite3ExprIfTrue(tls, pParse, pCopy, allOk, SQLITE_JUMPIFNULL) } Xsqlite3ExprDelete(tls, db, pCopy) if onError == OE_Ignore { Xsqlite3VdbeGoto(tls, v, ignoreDest) } else { var zName uintptr = (*ExprList_item)(unsafe.Pointer(pCheck + 8 + uintptr(i)*32)).FzEName if onError == OE_Replace { onError = OE_Abort } Xsqlite3HaltConstraint(tls, pParse, SQLITE_CONSTRAINT|int32(1)<<8, onError, zName, int8(P4_TRANSIENT), uint8(P5_ConstraintCheck)) } Xsqlite3VdbeResolveLabel(tls, v, allOk) } (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = 0 } (*IndexIterator)(unsafe.Pointer(bp + 16)).FeType = 0 (*IndexIterator)(unsafe.Pointer(bp + 16)).Fi = 0 *(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16 + 8)) = (*Table)(unsafe.Pointer(pTab)).FpIndex if pUpsert != 0 { if (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget == uintptr(0) { if int32((*Upsert)(unsafe.Pointer(pUpsert)).FisDoUpdate) == 0 { overrideError = U8(OE_Ignore) pUpsert = uintptr(0) } else { overrideError = U8(OE_Update) } } else if (*Table)(unsafe.Pointer(pTab)).FpIndex != uintptr(0) { var nIdx int32 var jj int32 var nByte U64 var pTerm uintptr var bUsed uintptr nIdx = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __1: if !(pIdx != 0) { goto __3 } { } goto __2 __2: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext nIdx++ goto __1 goto __3 __3: ; (*IndexIterator)(unsafe.Pointer(bp + 16)).FeType = 1 *(*int32)(unsafe.Pointer(bp + 16 + 8)) = nIdx nByte = (uint64(unsafe.Sizeof(IndexListTerm{}))+uint64(1))*uint64(nIdx) + uint64(nIdx) *(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) = Xsqlite3DbMallocZero(tls, db, nByte) if *(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) == uintptr(0) { return } bUsed = *(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) + uintptr(nIdx)*16 (*Upsert)(unsafe.Pointer(pUpsert)).FpToFree = *(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) i = 0 pTerm = pUpsert for ; pTerm != 0; pTerm = (*Upsert)(unsafe.Pointer(pTerm)).FpNextUpsert { if (*Upsert)(unsafe.Pointer(pTerm)).FpUpsertTarget == uintptr(0) { break } if (*Upsert)(unsafe.Pointer(pTerm)).FpUpsertIdx == uintptr(0) { continue } jj = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex for pIdx != uintptr(0) && pIdx != (*Upsert)(unsafe.Pointer(pTerm)).FpUpsertIdx { pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext jj++ } if *(*U8)(unsafe.Pointer(bUsed + uintptr(jj))) != 0 { continue } *(*U8)(unsafe.Pointer(bUsed + uintptr(jj))) = U8(1) (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) + uintptr(i)*16)).Fp = pIdx (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) + uintptr(i)*16)).Fix = jj i++ } jj = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __4: if !(pIdx != 0) { goto __6 } { if *(*U8)(unsafe.Pointer(bUsed + uintptr(jj))) != 0 { goto __5 } (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) + uintptr(i)*16)).Fp = pIdx (*IndexListTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16 + 8 + 8)) + uintptr(i)*16)).Fix = jj i++ } goto __5 __5: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext jj++ goto __4 goto __6 __6: } } if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_RecTriggers|SQLITE_ForeignKeys) == uint64(0) { pTrigger = uintptr(0) regTrigCnt = 0 } else { if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_RecTriggers) != 0 { pTrigger = Xsqlite3TriggersExist(tls, pParse, pTab, TK_DELETE, uintptr(0), uintptr(0)) regTrigCnt = libc.Bool32(pTrigger != uintptr(0) || Xsqlite3FkRequired(tls, pParse, pTab, uintptr(0), 0) != 0) } else { pTrigger = uintptr(0) regTrigCnt = Xsqlite3FkRequired(tls, pParse, pTab, uintptr(0), 0) } if regTrigCnt != 0 { regTrigCnt = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regTrigCnt) lblRecheckOk = Xsqlite3VdbeMakeLabel(tls, pParse) addrRecheck = lblRecheckOk } } if pkChng != 0 && pPk == uintptr(0) { var addrRowidOk int32 = Xsqlite3VdbeMakeLabel(tls, pParse) onError = int32((*Table)(unsafe.Pointer(pTab)).FkeyConf) if int32(overrideError) != OE_Default { onError = int32(overrideError) } else if onError == OE_Default { onError = OE_Abort } if pUpsert != 0 { pUpsertClause = Xsqlite3UpsertOfIndex(tls, pUpsert, uintptr(0)) if pUpsertClause != uintptr(0) { if int32((*Upsert)(unsafe.Pointer(pUpsertClause)).FisDoUpdate) == 0 { onError = OE_Ignore } else { onError = OE_Update } } if pUpsertClause != pUpsert { upsertIpkDelay = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) } } if onError == OE_Replace && onError != int32(overrideError) && (*Table)(unsafe.Pointer(pTab)).FpIndex != 0 && !(upsertIpkDelay != 0) { ipkTop = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) + 1 } if isUpdate != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Eq, regNewData, addrRowidOk, regOldData) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NOTNULL)) } Xsqlite3VdbeAddOp3(tls, v, OP_NotExists, iDataCur, addrRowidOk, regNewData) switch onError { default: { onError = OE_Abort } fallthrough case OE_Rollback: fallthrough case OE_Abort: fallthrough case OE_Fail: { Xsqlite3RowidConstraint(tls, pParse, onError, pTab) break } fallthrough case OE_Replace: { if regTrigCnt != 0 { Xsqlite3MultiWrite(tls, pParse) Xsqlite3GenerateRowDelete(tls, pParse, pTab, pTrigger, iDataCur, iIdxCur, regNewData, int16(1), uint8(0), uint8(OE_Replace), uint8(1), -1) Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, regTrigCnt, 1) nReplaceTrig++ } else { Xsqlite3VdbeAddOp2(tls, v, OP_Delete, iDataCur, OPFLAG_ISNOOP) Xsqlite3VdbeAppendP4(tls, v, pTab, -5) if (*Table)(unsafe.Pointer(pTab)).FpIndex != 0 { Xsqlite3MultiWrite(tls, pParse) Xsqlite3GenerateRowIndexDelete(tls, pParse, pTab, iDataCur, iIdxCur, uintptr(0), -1) } } seenReplace = 1 break } fallthrough case OE_Update: { Xsqlite3UpsertDoUpdate(tls, pParse, pUpsert, pTab, uintptr(0), iDataCur) } fallthrough case OE_Ignore: { Xsqlite3VdbeGoto(tls, v, ignoreDest) break } } Xsqlite3VdbeResolveLabel(tls, v, addrRowidOk) if pUpsert != 0 && pUpsertClause != pUpsert { upsertIpkReturn = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) } else if ipkTop != 0 { ipkBottom = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) Xsqlite3VdbeJumpHere(tls, v, ipkTop-1) } } for pIdx = indexIteratorFirst(tls, bp+16, bp+40); pIdx != 0; pIdx = indexIteratorNext(tls, bp+16, bp+40) { var regIdx int32 var regR int32 var iThisCur int32 var addrUniqueOk int32 var addrConflictCk int32 if *(*int32)(unsafe.Pointer(aRegIdx + uintptr(*(*int32)(unsafe.Pointer(bp + 40)))*4)) == 0 { continue } if pUpsert != 0 { pUpsertClause = Xsqlite3UpsertOfIndex(tls, pUpsert, pIdx) if upsertIpkDelay != 0 && pUpsertClause == pUpsert { Xsqlite3VdbeJumpHere(tls, v, upsertIpkDelay) } } addrUniqueOk = Xsqlite3VdbeMakeLabel(tls, pParse) if int32(bAffinityDone) == 0 { Xsqlite3TableAffinity(tls, v, pTab, regNewData+1) bAffinityDone = U8(1) } iThisCur = iIdxCur + *(*int32)(unsafe.Pointer(bp + 40)) if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, *(*int32)(unsafe.Pointer(aRegIdx + uintptr(*(*int32)(unsafe.Pointer(bp + 40)))*4))) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = -(regNewData + 1) Xsqlite3ExprIfFalseDup(tls, pParse, (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere, addrUniqueOk, SQLITE_JUMPIFNULL) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = 0 } regIdx = *(*int32)(unsafe.Pointer(aRegIdx + uintptr(*(*int32)(unsafe.Pointer(bp + 40)))*4)) + 1 for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn); i++ { var iField int32 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) var x int32 if iField == -2 { (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = -(regNewData + 1) Xsqlite3ExprCodeCopy(tls, pParse, (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr+8+uintptr(i)*32)).FpExpr, regIdx+i) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = 0 } else if iField == -1 || iField == int32((*Table)(unsafe.Pointer(pTab)).FiPKey) { x = regNewData Xsqlite3VdbeAddOp2(tls, v, OP_IntCopy, x, regIdx+i) } else { x = int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(iField))) + regNewData + 1 Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, x, regIdx+i) } } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regIdx, int32((*Index)(unsafe.Pointer(pIdx)).FnColumn), *(*int32)(unsafe.Pointer(aRegIdx + uintptr(*(*int32)(unsafe.Pointer(bp + 40)))*4))) if isUpdate != 0 && pPk == pIdx && int32(pkChng) == 0 { Xsqlite3VdbeResolveLabel(tls, v, addrUniqueOk) continue } onError = int32((*Index)(unsafe.Pointer(pIdx)).FonError) if onError == OE_None { Xsqlite3VdbeResolveLabel(tls, v, addrUniqueOk) continue } if int32(overrideError) != OE_Default { onError = int32(overrideError) } else if onError == OE_Default { onError = OE_Abort } if pUpsertClause != 0 { if int32((*Upsert)(unsafe.Pointer(pUpsertClause)).FisDoUpdate) == 0 { onError = OE_Ignore } else { onError = OE_Update } } addrConflictCk = Xsqlite3VdbeAddOp4Int(tls, v, OP_NoConflict, iThisCur, addrUniqueOk, regIdx, int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)) if pIdx == pPk { regR = regIdx } else { regR = Xsqlite3GetTempRange(tls, pParse, nPkField) } if isUpdate != 0 || onError == OE_Replace { if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { Xsqlite3VdbeAddOp2(tls, v, OP_IdxRowid, iThisCur, regR) if isUpdate != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Eq, regR, addrUniqueOk, regOldData) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NOTNULL)) } } else { var x int32 if pIdx != pPk { for i = 0; i < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol); i++ { x = int32(Xsqlite3TableColumnToIndex(tls, pIdx, *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2)))) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iThisCur, x, regR+i) } } if isUpdate != 0 { var addrJump int32 = Xsqlite3VdbeCurrentAddr(tls, v) + int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol) var op int32 = OP_Ne var regCmp int32 = func() int32 { if int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { return regIdx } return regR }() for i = 0; i < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol); i++ { var p4 uintptr = Xsqlite3LocateCollSeq(tls, pParse, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FazColl + uintptr(i)*8))) x = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2))) if i == int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)-1 { addrJump = addrUniqueOk op = OP_Eq } x = int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(x))) Xsqlite3VdbeAddOp4(tls, v, op, regOldData+1+x, addrJump, regCmp+i, p4, -2) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NOTNULL)) } } } } switch onError { case OE_Rollback: fallthrough case OE_Abort: fallthrough case OE_Fail: { Xsqlite3UniqueConstraint(tls, pParse, onError, pIdx) break } case OE_Update: { Xsqlite3UpsertDoUpdate(tls, pParse, pUpsert, pTab, pIdx, iIdxCur+*(*int32)(unsafe.Pointer(bp + 40))) } fallthrough case OE_Ignore: { Xsqlite3VdbeGoto(tls, v, ignoreDest) break } default: { var nConflictCk int32 nConflictCk = Xsqlite3VdbeCurrentAddr(tls, v) - addrConflictCk if regTrigCnt != 0 { Xsqlite3MultiWrite(tls, pParse) nReplaceTrig++ } if pTrigger != 0 && isUpdate != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_CursorLock, iDataCur) } Xsqlite3GenerateRowDelete(tls, pParse, pTab, pTrigger, iDataCur, iIdxCur, regR, int16(nPkField), uint8(0), uint8(OE_Replace), func() uint8 { if pIdx == pPk { return uint8(ONEPASS_SINGLE) } return uint8(ONEPASS_OFF) }(), iThisCur) if pTrigger != 0 && isUpdate != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_CursorUnlock, iDataCur) } if regTrigCnt != 0 { var addrBypass int32 Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, regTrigCnt, 1) addrBypass = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) Xsqlite3VdbeResolveLabel(tls, v, lblRecheckOk) lblRecheckOk = Xsqlite3VdbeMakeLabel(tls, pParse) if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regIdx-1, lblRecheckOk) } for nConflictCk > 0 { *(*VdbeOp)(unsafe.Pointer(bp + 48)) = *(*VdbeOp)(unsafe.Pointer(Xsqlite3VdbeGetOp(tls, v, addrConflictCk))) if int32((*VdbeOp)(unsafe.Pointer(bp+48)).Fopcode) != OP_IdxRowid { var p2 int32 var zP4 uintptr if int32(Xsqlite3OpcodeProperty[(*VdbeOp)(unsafe.Pointer(bp+48)).Fopcode])&OPFLG_JUMP != 0 { p2 = lblRecheckOk } else { p2 = (*VdbeOp)(unsafe.Pointer(bp + 48)).Fp2 } if int32((*VdbeOp)(unsafe.Pointer(bp+48)).Fp4type) == -3 { zP4 = uintptr(int64(*(*int32)(unsafe.Pointer(bp + 48 + 16)))) } else { zP4 = *(*uintptr)(unsafe.Pointer(bp + 48 + 16)) } Xsqlite3VdbeAddOp4(tls, v, int32((*VdbeOp)(unsafe.Pointer(bp+48)).Fopcode), (*VdbeOp)(unsafe.Pointer(bp+48)).Fp1, p2, (*VdbeOp)(unsafe.Pointer(bp+48)).Fp3, zP4, int32((*VdbeOp)(unsafe.Pointer(bp+48)).Fp4type)) Xsqlite3VdbeChangeP5(tls, v, (*VdbeOp)(unsafe.Pointer(bp+48)).Fp5) } nConflictCk-- addrConflictCk++ } Xsqlite3UniqueConstraint(tls, pParse, OE_Abort, pIdx) Xsqlite3VdbeJumpHere(tls, v, addrBypass) } seenReplace = 1 break } } Xsqlite3VdbeResolveLabel(tls, v, addrUniqueOk) if regR != regIdx { Xsqlite3ReleaseTempRange(tls, pParse, regR, nPkField) } if pUpsertClause != 0 && upsertIpkReturn != 0 && Xsqlite3UpsertNextIsIPK(tls, pUpsertClause) != 0 { Xsqlite3VdbeGoto(tls, v, upsertIpkDelay+1) Xsqlite3VdbeJumpHere(tls, v, upsertIpkReturn) upsertIpkReturn = 0 } } if ipkTop != 0 { Xsqlite3VdbeGoto(tls, v, ipkTop) Xsqlite3VdbeJumpHere(tls, v, ipkBottom) } if nReplaceTrig != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_IfNot, regTrigCnt, lblRecheckOk) if !(pPk != 0) { if isUpdate != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Eq, regNewData, addrRecheck, regOldData) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NOTNULL)) } Xsqlite3VdbeAddOp3(tls, v, OP_NotExists, iDataCur, addrRecheck, regNewData) Xsqlite3RowidConstraint(tls, pParse, OE_Abort, pTab) } else { Xsqlite3VdbeGoto(tls, v, addrRecheck) } Xsqlite3VdbeResolveLabel(tls, v, lblRecheckOk) } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { var regRec int32 = *(*int32)(unsafe.Pointer(aRegIdx + uintptr(*(*int32)(unsafe.Pointer(bp + 40)))*4)) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regNewData+1, int32((*Table)(unsafe.Pointer(pTab)).FnNVCol), regRec) if !(bAffinityDone != 0) { Xsqlite3TableAffinity(tls, v, pTab, 0) } } *(*int32)(unsafe.Pointer(pbMayReplace)) = seenReplace } func codeWithoutRowidPreupdate(tls *libc.TLS, pParse uintptr, pTab uintptr, iCur int32, regData int32) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var r int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, r) Xsqlite3VdbeAddOp4(tls, v, OP_Insert, iCur, regData, r, pTab, -5) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_ISNOOP)) Xsqlite3ReleaseTempReg(tls, pParse, r) } // This routine generates code to finish the INSERT or UPDATE operation // that was started by a prior call to sqlite3GenerateConstraintChecks. // A consecutive range of registers starting at regNewData contains the // rowid and the content to be inserted. // // The arguments to this routine should be the same as the first six // arguments to sqlite3GenerateConstraintChecks. func Xsqlite3CompleteInsertion(tls *libc.TLS, pParse uintptr, pTab uintptr, iDataCur int32, iIdxCur int32, regNewData int32, aRegIdx uintptr, update_flags int32, appendBias int32, useSeekResult int32) { var v uintptr var pIdx uintptr var pik_flags U8 var i int32 v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe i = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __1: if !(pIdx != 0) { goto __3 } { if *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4)) == 0 { goto __2 } if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4)), Xsqlite3VdbeCurrentAddr(tls, v)+2) } pik_flags = func() uint8 { if useSeekResult != 0 { return uint8(OPFLAG_USESEEKRESULT) } return uint8(0) }() if int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY && !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { pik_flags = U8(int32(pik_flags) | OPFLAG_NCHANGE) pik_flags = U8(int32(pik_flags) | update_flags&OPFLAG_SAVEPOSITION) if update_flags == 0 { codeWithoutRowidPreupdate(tls, pParse, pTab, iIdxCur+i, *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4))) } } Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iIdxCur+i, *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4)), *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4))+1, func() int32 { if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x8>>3)) != 0 { return int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) } return int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) }()) Xsqlite3VdbeChangeP5(tls, v, uint16(pik_flags)) } goto __2 __2: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext i++ goto __1 goto __3 __3: ; if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { return } if (*Parse)(unsafe.Pointer(pParse)).Fnested != 0 { pik_flags = U8(0) } else { pik_flags = U8(OPFLAG_NCHANGE) pik_flags = U8(int32(pik_flags) | func() int32 { if update_flags != 0 { return update_flags } return OPFLAG_LASTROWID }()) } if appendBias != 0 { pik_flags = U8(int32(pik_flags) | OPFLAG_APPEND) } if useSeekResult != 0 { pik_flags = U8(int32(pik_flags) | OPFLAG_USESEEKRESULT) } Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iDataCur, *(*int32)(unsafe.Pointer(aRegIdx + uintptr(i)*4)), regNewData) if !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0) { Xsqlite3VdbeAppendP4(tls, v, pTab, -5) } Xsqlite3VdbeChangeP5(tls, v, uint16(pik_flags)) } // Allocate cursors for the pTab table and all its indices and generate // code to open and initialized those cursors. // // The cursor for the object that contains the complete data (normally // the table itself, but the PRIMARY KEY index in the case of a WITHOUT // ROWID table) is returned in *piDataCur. The first index cursor is // returned in *piIdxCur. The number of indices is returned. // // Use iBase as the first cursor (either the *piDataCur for rowid tables // or the first index for WITHOUT ROWID tables) if it is non-negative. // If iBase is negative, then allocate the next available cursor. // // For a rowid table, *piDataCur will be exactly one less than *piIdxCur. // For a WITHOUT ROWID table, *piDataCur will be somewhere in the range // of *piIdxCurs, depending on where the PRIMARY KEY index appears on the // pTab->pIndex list. // // If pTab is a virtual table, then this routine is a no-op and the // *piDataCur and *piIdxCur values are left uninitialized. func Xsqlite3OpenTableAndIndices(tls *libc.TLS, pParse uintptr, pTab uintptr, op int32, p5 U8, iBase int32, aToOpen uintptr, piDataCur uintptr, piIdxCur uintptr) int32 { var i int32 var iDb int32 var iDataCur int32 var pIdx uintptr var v uintptr if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { *(*int32)(unsafe.Pointer(piDataCur)) = libc.AssignPtrInt32(piIdxCur, -999) return 0 } iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Table)(unsafe.Pointer(pTab)).FpSchema) v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if iBase < 0 { iBase = (*Parse)(unsafe.Pointer(pParse)).FnTab } iDataCur = libc.PostIncInt32(&iBase, 1) if piDataCur != 0 { *(*int32)(unsafe.Pointer(piDataCur)) = iDataCur } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) && (aToOpen == uintptr(0) || *(*U8)(unsafe.Pointer(aToOpen)) != 0) { Xsqlite3OpenTable(tls, pParse, iDataCur, iDb, pTab, op) } else { Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab)).Ftnum, uint8(libc.Bool32(op == OP_OpenWrite)), (*Table)(unsafe.Pointer(pTab)).FzName) } if piIdxCur != 0 { *(*int32)(unsafe.Pointer(piIdxCur)) = iBase } i = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __1: if !(pIdx != 0) { goto __3 } { var iIdxCur int32 = libc.PostIncInt32(&iBase, 1) if int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY && !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { if piDataCur != 0 { *(*int32)(unsafe.Pointer(piDataCur)) = iIdxCur } p5 = U8(0) } if aToOpen == uintptr(0) || *(*U8)(unsafe.Pointer(aToOpen + uintptr(i+1))) != 0 { Xsqlite3VdbeAddOp3(tls, v, op, iIdxCur, int32((*Index)(unsafe.Pointer(pIdx)).Ftnum), iDb) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pIdx) Xsqlite3VdbeChangeP5(tls, v, uint16(p5)) } } goto __2 __2: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext i++ goto __1 goto __3 __3: ; if iBase > (*Parse)(unsafe.Pointer(pParse)).FnTab { (*Parse)(unsafe.Pointer(pParse)).FnTab = iBase } return i } func xferCompatibleIndex(tls *libc.TLS, pDest uintptr, pSrc uintptr) int32 { var i int32 if int32((*Index)(unsafe.Pointer(pDest)).FnKeyCol) != int32((*Index)(unsafe.Pointer(pSrc)).FnKeyCol) || int32((*Index)(unsafe.Pointer(pDest)).FnColumn) != int32((*Index)(unsafe.Pointer(pSrc)).FnColumn) { return 0 } if int32((*Index)(unsafe.Pointer(pDest)).FonError) != int32((*Index)(unsafe.Pointer(pSrc)).FonError) { return 0 } for i = 0; i < int32((*Index)(unsafe.Pointer(pSrc)).FnKeyCol); i++ { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pSrc)).FaiColumn + uintptr(i)*2))) != int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pDest)).FaiColumn + uintptr(i)*2))) { return 0 } if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pSrc)).FaiColumn + uintptr(i)*2))) == -2 { if Xsqlite3ExprCompare(tls, uintptr(0), (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pSrc)).FaColExpr+8+uintptr(i)*32)).FpExpr, (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pDest)).FaColExpr+8+uintptr(i)*32)).FpExpr, -1) != 0 { return 0 } } if int32(*(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pSrc)).FaSortOrder + uintptr(i)))) != int32(*(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pDest)).FaSortOrder + uintptr(i)))) { return 0 } if Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pSrc)).FazColl + uintptr(i)*8)), *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pDest)).FazColl + uintptr(i)*8))) != 0 { return 0 } } if Xsqlite3ExprCompare(tls, uintptr(0), (*Index)(unsafe.Pointer(pSrc)).FpPartIdxWhere, (*Index)(unsafe.Pointer(pDest)).FpPartIdxWhere, -1) != 0 { return 0 } return 1 } func xferOptimization(tls *libc.TLS, pParse uintptr, pDest uintptr, pSelect uintptr, onError int32, iDbDest int32) int32 { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pEList uintptr var pSrc uintptr var pSrcIdx uintptr var pDestIdx uintptr var pItem uintptr var i int32 var iDbSrc int32 var iSrc int32 var iDest int32 var addr1 int32 var addr2 int32 var emptyDestTest int32 = 0 var emptySrcTest int32 = 0 var v uintptr var regAutoinc int32 var destHasUniqueIdx int32 = 0 var regData int32 var regRowid int32 if (*Parse)(unsafe.Pointer(pParse)).FpWith != 0 || (*Select)(unsafe.Pointer(pSelect)).FpWith != 0 { return 0 } if int32((*Table)(unsafe.Pointer(pDest)).FeTabType) == TABTYP_VTAB { return 0 } if onError == OE_Default { if int32((*Table)(unsafe.Pointer(pDest)).FiPKey) >= 0 { onError = int32((*Table)(unsafe.Pointer(pDest)).FkeyConf) } if onError == OE_Default { onError = OE_Abort } } if (*SrcList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpSrc)).FnSrc != 1 { return 0 } if (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpSrc+8)).FpSelect != 0 { return 0 } if (*Select)(unsafe.Pointer(pSelect)).FpWhere != 0 { return 0 } if (*Select)(unsafe.Pointer(pSelect)).FpOrderBy != 0 { return 0 } if (*Select)(unsafe.Pointer(pSelect)).FpGroupBy != 0 { return 0 } if (*Select)(unsafe.Pointer(pSelect)).FpLimit != 0 { return 0 } if (*Select)(unsafe.Pointer(pSelect)).FpPrior != 0 { return 0 } if (*Select)(unsafe.Pointer(pSelect)).FselFlags&U32(SF_Distinct) != 0 { return 0 } pEList = (*Select)(unsafe.Pointer(pSelect)).FpEList if (*ExprList)(unsafe.Pointer(pEList)).FnExpr != 1 { return 0 } if int32((*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pEList+8)).FpExpr)).Fop) != TK_ASTERISK { return 0 } pItem = (*Select)(unsafe.Pointer(pSelect)).FpSrc + 8 pSrc = Xsqlite3LocateTableItem(tls, pParse, uint32(0), pItem) if pSrc == uintptr(0) { return 0 } if (*Table)(unsafe.Pointer(pSrc)).Ftnum == (*Table)(unsafe.Pointer(pDest)).Ftnum && (*Table)(unsafe.Pointer(pSrc)).FpSchema == (*Table)(unsafe.Pointer(pDest)).FpSchema { return 0 } if libc.Bool32((*Table)(unsafe.Pointer(pDest)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) != libc.Bool32((*Table)(unsafe.Pointer(pSrc)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { return 0 } if !(int32((*Table)(unsafe.Pointer(pSrc)).FeTabType) == TABTYP_NORM) { return 0 } if int32((*Table)(unsafe.Pointer(pDest)).FnCol) != int32((*Table)(unsafe.Pointer(pSrc)).FnCol) { return 0 } if int32((*Table)(unsafe.Pointer(pDest)).FiPKey) != int32((*Table)(unsafe.Pointer(pSrc)).FiPKey) { return 0 } if (*Table)(unsafe.Pointer(pDest)).FtabFlags&U32(TF_Strict) != U32(0) && (*Table)(unsafe.Pointer(pSrc)).FtabFlags&U32(TF_Strict) == U32(0) { return 0 } for i = 0; i < int32((*Table)(unsafe.Pointer(pDest)).FnCol); i++ { var pDestCol uintptr = (*Table)(unsafe.Pointer(pDest)).FaCol + uintptr(i)*24 var pSrcCol uintptr = (*Table)(unsafe.Pointer(pSrc)).FaCol + uintptr(i)*24 if int32((*Column)(unsafe.Pointer(pDestCol)).FcolFlags)&COLFLAG_GENERATED != int32((*Column)(unsafe.Pointer(pSrcCol)).FcolFlags)&COLFLAG_GENERATED { return 0 } if int32((*Column)(unsafe.Pointer(pDestCol)).FcolFlags)&COLFLAG_GENERATED != 0 { if Xsqlite3ExprCompare(tls, uintptr(0), Xsqlite3ColumnExpr(tls, pSrc, pSrcCol), Xsqlite3ColumnExpr(tls, pDest, pDestCol), -1) != 0 { return 0 } } if int32((*Column)(unsafe.Pointer(pDestCol)).Faffinity) != int32((*Column)(unsafe.Pointer(pSrcCol)).Faffinity) { return 0 } if Xsqlite3_stricmp(tls, Xsqlite3ColumnColl(tls, pDestCol), Xsqlite3ColumnColl(tls, pSrcCol)) != 0 { return 0 } if uint32(int32(*(*uint8)(unsafe.Pointer(pDestCol + 8))&0xf>>0)) != 0 && !(int32(*(*uint8)(unsafe.Pointer(pSrcCol + 8))&0xf>>0) != 0) { return 0 } if int32((*Column)(unsafe.Pointer(pDestCol)).FcolFlags)&COLFLAG_GENERATED == 0 && i > 0 { var pDestExpr uintptr = Xsqlite3ColumnExpr(tls, pDest, pDestCol) var pSrcExpr uintptr = Xsqlite3ColumnExpr(tls, pSrc, pSrcCol) if libc.Bool32(pDestExpr == uintptr(0)) != libc.Bool32(pSrcExpr == uintptr(0)) || pDestExpr != uintptr(0) && libc.Xstrcmp(tls, *(*uintptr)(unsafe.Pointer(pDestExpr + 8)), *(*uintptr)(unsafe.Pointer(pSrcExpr + 8))) != 0 { return 0 } } } for pDestIdx = (*Table)(unsafe.Pointer(pDest)).FpIndex; pDestIdx != 0; pDestIdx = (*Index)(unsafe.Pointer(pDestIdx)).FpNext { if int32((*Index)(unsafe.Pointer(pDestIdx)).FonError) != OE_None { destHasUniqueIdx = 1 } for pSrcIdx = (*Table)(unsafe.Pointer(pSrc)).FpIndex; pSrcIdx != 0; pSrcIdx = (*Index)(unsafe.Pointer(pSrcIdx)).FpNext { if xferCompatibleIndex(tls, pDestIdx, pSrcIdx) != 0 { break } } if pSrcIdx == uintptr(0) { return 0 } if (*Index)(unsafe.Pointer(pSrcIdx)).Ftnum == (*Index)(unsafe.Pointer(pDestIdx)).Ftnum && (*Table)(unsafe.Pointer(pSrc)).FpSchema == (*Table)(unsafe.Pointer(pDest)).FpSchema && Xsqlite3FaultSim(tls, 411) == SQLITE_OK { return 0 } } if (*Table)(unsafe.Pointer(pDest)).FpCheck != 0 && Xsqlite3ExprListCompare(tls, (*Table)(unsafe.Pointer(pSrc)).FpCheck, (*Table)(unsafe.Pointer(pDest)).FpCheck, -1) != 0 { return 0 } if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ForeignKeys) != uint64(0) && *(*uintptr)(unsafe.Pointer(pDest + 64 + 8)) != uintptr(0) { return 0 } if (*Sqlite3)(unsafe.Pointer(db)).Fflags&(uint64(0x00001)<<32) != uint64(0) { return 0 } iDbSrc = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pSrc)).FpSchema) v = Xsqlite3GetVdbe(tls, pParse) Xsqlite3CodeVerifySchema(tls, pParse, iDbSrc) iSrc = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) iDest = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) regAutoinc = autoIncBegin(tls, pParse, iDbDest, pDest) regData = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regData) regRowid = Xsqlite3GetTempReg(tls, pParse) Xsqlite3OpenTable(tls, pParse, iDest, iDbDest, pDest, OP_OpenWrite) if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_Vacuum) == U32(0) && (int32((*Table)(unsafe.Pointer(pDest)).FiPKey) < 0 && (*Table)(unsafe.Pointer(pDest)).FpIndex != uintptr(0) || destHasUniqueIdx != 0 || onError != OE_Abort && onError != OE_Rollback) { addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, iDest, 0) emptyDestTest = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) Xsqlite3VdbeJumpHere(tls, v, addr1) } if (*Table)(unsafe.Pointer(pSrc)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { var insFlags U8 Xsqlite3OpenTable(tls, pParse, iSrc, iDbSrc, pSrc, OP_OpenRead) emptySrcTest = Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, iSrc, 0) if int32((*Table)(unsafe.Pointer(pDest)).FiPKey) >= 0 { addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iSrc, regRowid) if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_Vacuum) == U32(0) { addr2 = Xsqlite3VdbeAddOp3(tls, v, OP_NotExists, iDest, 0, regRowid) Xsqlite3RowidConstraint(tls, pParse, onError, pDest) Xsqlite3VdbeJumpHere(tls, v, addr2) } autoIncStep(tls, pParse, regAutoinc, regRowid) } else if (*Table)(unsafe.Pointer(pDest)).FpIndex == uintptr(0) && !((*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_VacuumInto) != 0) { addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, iDest, regRowid) } else { addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iSrc, regRowid) } if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_Vacuum) != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_SeekEnd, iDest) insFlags = U8(OPFLAG_APPEND | OPFLAG_USESEEKRESULT | OPFLAG_PREFORMAT) } else { insFlags = U8(OPFLAG_NCHANGE | OPFLAG_LASTROWID | OPFLAG_APPEND | OPFLAG_PREFORMAT) } if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_Vacuum) == U32(0) { Xsqlite3VdbeAddOp3(tls, v, OP_RowData, iSrc, regData, 1) insFlags = libc.Uint8FromInt32(int32(insFlags) & libc.CplInt32(OPFLAG_PREFORMAT)) } else { Xsqlite3VdbeAddOp3(tls, v, OP_RowCell, iDest, iSrc, regRowid) } Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iDest, regData, regRowid) if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_Vacuum) == U32(0) { Xsqlite3VdbeChangeP4(tls, v, -1, pDest, -5) } Xsqlite3VdbeChangeP5(tls, v, uint16(insFlags)) Xsqlite3VdbeAddOp2(tls, v, OP_Next, iSrc, addr1) Xsqlite3VdbeAddOp2(tls, v, OP_Close, iSrc, 0) Xsqlite3VdbeAddOp2(tls, v, OP_Close, iDest, 0) } else { Xsqlite3TableLock(tls, pParse, iDbDest, (*Table)(unsafe.Pointer(pDest)).Ftnum, uint8(1), (*Table)(unsafe.Pointer(pDest)).FzName) Xsqlite3TableLock(tls, pParse, iDbSrc, (*Table)(unsafe.Pointer(pSrc)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pSrc)).FzName) } for pDestIdx = (*Table)(unsafe.Pointer(pDest)).FpIndex; pDestIdx != 0; pDestIdx = (*Index)(unsafe.Pointer(pDestIdx)).FpNext { var idxInsFlags U8 = U8(0) for pSrcIdx = (*Table)(unsafe.Pointer(pSrc)).FpIndex; pSrcIdx != 0; pSrcIdx = (*Index)(unsafe.Pointer(pSrcIdx)).FpNext { if xferCompatibleIndex(tls, pDestIdx, pSrcIdx) != 0 { break } } Xsqlite3VdbeAddOp3(tls, v, OP_OpenRead, iSrc, int32((*Index)(unsafe.Pointer(pSrcIdx)).Ftnum), iDbSrc) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pSrcIdx) Xsqlite3VdbeAddOp3(tls, v, OP_OpenWrite, iDest, int32((*Index)(unsafe.Pointer(pDestIdx)).Ftnum), iDbDest) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pDestIdx) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_BULKCSR)) addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, iSrc, 0) if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_Vacuum) != 0 { for i = 0; i < int32((*Index)(unsafe.Pointer(pSrcIdx)).FnColumn); i++ { var zColl uintptr = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pSrcIdx)).FazColl + uintptr(i)*8)) if Xsqlite3_stricmp(tls, uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)), zColl) != 0 { break } } if i == int32((*Index)(unsafe.Pointer(pSrcIdx)).FnColumn) { idxInsFlags = U8(OPFLAG_USESEEKRESULT | OPFLAG_PREFORMAT) Xsqlite3VdbeAddOp1(tls, v, OP_SeekEnd, iDest) Xsqlite3VdbeAddOp2(tls, v, OP_RowCell, iDest, iSrc) } } else if !((*Table)(unsafe.Pointer(pSrc)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) && int32(*(*uint16)(unsafe.Pointer(pDestIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { idxInsFlags = U8(int32(idxInsFlags) | OPFLAG_NCHANGE) } if int32(idxInsFlags) != OPFLAG_USESEEKRESULT|OPFLAG_PREFORMAT { Xsqlite3VdbeAddOp3(tls, v, OP_RowData, iSrc, regData, 1) if (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_Vacuum) == U32(0) && !((*Table)(unsafe.Pointer(pDest)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) && int32(*(*uint16)(unsafe.Pointer(pDestIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { codeWithoutRowidPreupdate(tls, pParse, pDest, iDest, regData) } } Xsqlite3VdbeAddOp2(tls, v, OP_IdxInsert, iDest, regData) Xsqlite3VdbeChangeP5(tls, v, uint16(int32(idxInsFlags)|OPFLAG_APPEND)) Xsqlite3VdbeAddOp2(tls, v, OP_Next, iSrc, addr1+1) Xsqlite3VdbeJumpHere(tls, v, addr1) Xsqlite3VdbeAddOp2(tls, v, OP_Close, iSrc, 0) Xsqlite3VdbeAddOp2(tls, v, OP_Close, iDest, 0) } if emptySrcTest != 0 { Xsqlite3VdbeJumpHere(tls, v, emptySrcTest) } Xsqlite3ReleaseTempReg(tls, pParse, regRowid) Xsqlite3ReleaseTempReg(tls, pParse, regData) if emptyDestTest != 0 { Xsqlite3AutoincrementEnd(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Halt, SQLITE_OK, 0) Xsqlite3VdbeJumpHere(tls, v, emptyDestTest) Xsqlite3VdbeAddOp2(tls, v, OP_Close, iDest, 0) return 0 } else { return 1 } return int32(0) } // Execute SQL code. Return one of the SQLITE_ success/failure // codes. Also write an error message into memory obtained from // malloc() and make *pzErrMsg point to that message. // // If the SQL is a query, then for each row in the query result // the xCallback() function is called. pArg becomes the first // argument to xCallback(). If xCallback=NULL then no callback // is invoked, even for queries. func Xsqlite3_exec(tls *libc.TLS, db uintptr, zSql uintptr, xCallback Sqlite3_callback, pArg uintptr, pzErrMsg uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 var azCols uintptr var callbackIsInit int32 var i int32 var nCol int32 var azVals uintptr rc = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) azCols = uintptr(0) if !!(Xsqlite3SafetyCheckOk(tls, db) != 0) { goto __1 } return Xsqlite3MisuseError(tls, 131931) __1: ; if !(zSql == uintptr(0)) { goto __2 } zSql = ts + 1544 __2: ; Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) Xsqlite3Error(tls, db, SQLITE_OK) __3: if !(rc == SQLITE_OK && *(*int8)(unsafe.Pointer(zSql)) != 0) { goto __4 } nCol = 0 azVals = uintptr(0) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = Xsqlite3_prepare_v2(tls, db, zSql, -1, bp, bp+8) if !(rc != SQLITE_OK) { goto __5 } goto __3 __5: ; if !!(*(*uintptr)(unsafe.Pointer(bp)) != 0) { goto __6 } zSql = *(*uintptr)(unsafe.Pointer(bp + 8)) goto __3 __6: ; callbackIsInit = 0 __7: if !(1 != 0) { goto __8 } rc = Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) if !(xCallback != 0 && (SQLITE_ROW == rc || SQLITE_DONE == rc && !(callbackIsInit != 0) && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_NullCallback) != 0)) { goto __9 } if !!(callbackIsInit != 0) { goto __10 } nCol = Xsqlite3_column_count(tls, *(*uintptr)(unsafe.Pointer(bp))) azCols = Xsqlite3DbMallocRaw(tls, db, uint64(2*nCol+1)*uint64(unsafe.Sizeof(uintptr(0)))) if !(azCols == uintptr(0)) { goto __11 } goto exec_out __11: ; i = 0 __12: if !(i < nCol) { goto __14 } *(*uintptr)(unsafe.Pointer(azCols + uintptr(i)*8)) = Xsqlite3_column_name(tls, *(*uintptr)(unsafe.Pointer(bp)), i) goto __13 __13: i++ goto __12 goto __14 __14: ; callbackIsInit = 1 __10: ; if !(rc == SQLITE_ROW) { goto __15 } azVals = azCols + uintptr(nCol)*8 i = 0 __16: if !(i < nCol) { goto __18 } *(*uintptr)(unsafe.Pointer(azVals + uintptr(i)*8)) = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp)), i) if !(!(int32(*(*uintptr)(unsafe.Pointer(azVals + uintptr(i)*8))) != 0) && Xsqlite3_column_type(tls, *(*uintptr)(unsafe.Pointer(bp)), i) != SQLITE_NULL) { goto __19 } Xsqlite3OomFault(tls, db) goto exec_out __19: ; goto __17 __17: i++ goto __16 goto __18 __18: ; *(*uintptr)(unsafe.Pointer(azVals + uintptr(i)*8)) = uintptr(0) __15: ; if !((*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xCallback})).f(tls, pArg, nCol, azVals, azCols) != 0) { goto __20 } rc = SQLITE_ABORT Xsqlite3VdbeFinalize(tls, *(*uintptr)(unsafe.Pointer(bp))) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) Xsqlite3Error(tls, db, SQLITE_ABORT) goto exec_out __20: ; __9: ; if !(rc != SQLITE_ROW) { goto __21 } rc = Xsqlite3VdbeFinalize(tls, *(*uintptr)(unsafe.Pointer(bp))) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) zSql = *(*uintptr)(unsafe.Pointer(bp + 8)) __22: if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zSql)))])&0x01 != 0) { goto __23 } zSql++ goto __22 __23: ; goto __8 __21: ; goto __7 __8: ; Xsqlite3DbFree(tls, db, azCols) azCols = uintptr(0) goto __3 __4: ; exec_out: if !(*(*uintptr)(unsafe.Pointer(bp)) != 0) { goto __24 } Xsqlite3VdbeFinalize(tls, *(*uintptr)(unsafe.Pointer(bp))) __24: ; Xsqlite3DbFree(tls, db, azCols) rc = Xsqlite3ApiExit(tls, db, rc) if !(rc != SQLITE_OK && pzErrMsg != 0) { goto __25 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3DbStrDup(tls, uintptr(0), Xsqlite3_errmsg(tls, db)) if !(*(*uintptr)(unsafe.Pointer(pzErrMsg)) == uintptr(0)) { goto __27 } rc = SQLITE_NOMEM Xsqlite3Error(tls, db, SQLITE_NOMEM) __27: ; goto __26 __25: if !(pzErrMsg != 0) { goto __28 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = uintptr(0) __28: ; __26: ; Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // This is the function signature used for all extension entry points. It // is also defined in the file "loadext.c". type Sqlite3_loadext_entry = uintptr var sqlite3Apis = Sqlite3_api_routines{ Faggregate_context: 0, Faggregate_count: 0, Fbind_blob: 0, Fbind_double: 0, Fbind_int: 0, Fbind_int64: 0, Fbind_null: 0, Fbind_parameter_count: 0, Fbind_parameter_index: 0, Fbind_parameter_name: 0, Fbind_text: 0, Fbind_text16: 0, Fbind_value: 0, Fbusy_handler: 0, Fbusy_timeout: 0, Fchanges: 0, Fclose: 0, Fcollation_needed: 0, Fcollation_needed16: 0, Fcolumn_blob: 0, Fcolumn_bytes: 0, Fcolumn_bytes16: 0, Fcolumn_count: 0, Fcolumn_database_name: 0, Fcolumn_database_name16: 0, Fcolumn_decltype: 0, Fcolumn_decltype16: 0, Fcolumn_double: 0, Fcolumn_int: 0, Fcolumn_int64: 0, Fcolumn_name: 0, Fcolumn_name16: 0, Fcolumn_origin_name: 0, Fcolumn_origin_name16: 0, Fcolumn_table_name: 0, Fcolumn_table_name16: 0, Fcolumn_text: 0, Fcolumn_text16: 0, Fcolumn_type: 0, Fcolumn_value: 0, Fcommit_hook: 0, Fcomplete: 0, Fcomplete16: 0, Fcreate_collation: 0, Fcreate_collation16: 0, Fcreate_function: 0, Fcreate_function16: 0, Fcreate_module: 0, Fdata_count: 0, Fdb_handle: 0, Fdeclare_vtab: 0, Fenable_shared_cache: 0, Ferrcode: 0, Ferrmsg: 0, Ferrmsg16: 0, Fexec: 0, Fexpired: 0, Ffinalize: 0, Ffree: 0, Ffree_table: 0, Fget_autocommit: 0, Fget_auxdata: 0, Fget_table: 0, Finterruptx: 0, Flast_insert_rowid: 0, Flibversion: 0, Flibversion_number: 0, Fmalloc: 0, Fmprintf: 0, Fopen: 0, Fopen16: 0, Fprepare: 0, Fprepare16: 0, Fprofile: 0, Fprogress_handler: 0, Frealloc: 0, Freset: 0, Fresult_blob: 0, Fresult_double: 0, Fresult_error: 0, Fresult_error16: 0, Fresult_int: 0, Fresult_int64: 0, Fresult_null: 0, Fresult_text: 0, Fresult_text16: 0, Fresult_text16be: 0, Fresult_text16le: 0, Fresult_value: 0, Frollback_hook: 0, Fset_authorizer: 0, Fset_auxdata: 0, Fxsnprintf: 0, Fstep: 0, Ftable_column_metadata: 0, Fthread_cleanup: 0, Ftotal_changes: 0, Ftrace: 0, Ftransfer_bindings: 0, Fupdate_hook: 0, Fuser_data: 0, Fvalue_blob: 0, Fvalue_bytes: 0, Fvalue_bytes16: 0, Fvalue_double: 0, Fvalue_int: 0, Fvalue_int64: 0, Fvalue_numeric_type: 0, Fvalue_text: 0, Fvalue_text16: 0, Fvalue_text16be: 0, Fvalue_text16le: 0, Fvalue_type: 0, Fvmprintf: 0, Foverload_function: 0, Fprepare_v2: 0, Fprepare16_v2: 0, Fclear_bindings: 0, Fcreate_module_v2: 0, Fbind_zeroblob: 0, Fblob_bytes: 0, Fblob_close: 0, Fblob_open: 0, Fblob_read: 0, Fblob_write: 0, Fcreate_collation_v2: 0, Ffile_control: 0, Fmemory_highwater: 0, Fmemory_used: 0, Fmutex_alloc: 0, Fmutex_enter: 0, Fmutex_free: 0, Fmutex_leave: 0, Fmutex_try: 0, Fopen_v2: 0, Frelease_memory: 0, Fresult_error_nomem: 0, Fresult_error_toobig: 0, Fsleep: 0, Fsoft_heap_limit: 0, Fvfs_find: 0, Fvfs_register: 0, Fvfs_unregister: 0, Fxthreadsafe: 0, Fresult_zeroblob: 0, Fresult_error_code: 0, Ftest_control: 0, Frandomness: 0, Fcontext_db_handle: 0, Fextended_result_codes: 0, Flimit: 0, Fnext_stmt: 0, Fsql: 0, Fstatus: 0, Fbackup_finish: 0, Fbackup_init: 0, Fbackup_pagecount: 0, Fbackup_remaining: 0, Fbackup_step: 0, Fcompileoption_get: 0, Fcompileoption_used: 0, Fcreate_function_v2: 0, Fdb_config: 0, Fdb_mutex: 0, Fdb_status: 0, Fextended_errcode: 0, Flog: 0, Fsoft_heap_limit64: 0, Fsourceid: 0, Fstmt_status: 0, Fstrnicmp: 0, Funlock_notify: 0, Fwal_autocheckpoint: 0, Fwal_checkpoint: 0, Fwal_hook: 0, Fblob_reopen: 0, Fvtab_config: 0, Fvtab_on_conflict: 0, Fclose_v2: 0, Fdb_filename: 0, Fdb_readonly: 0, Fdb_release_memory: 0, Ferrstr: 0, Fstmt_busy: 0, Fstmt_readonly: 0, Fstricmp: 0, Furi_boolean: 0, Furi_int64: 0, Furi_parameter: 0, Fxvsnprintf: 0, Fwal_checkpoint_v2: 0, Fauto_extension: 0, Fbind_blob64: 0, Fbind_text64: 0, Fcancel_auto_extension: 0, Fload_extension: 0, Fmalloc64: 0, Fmsize: 0, Frealloc64: 0, Freset_auto_extension: 0, Fresult_blob64: 0, Fresult_text64: 0, Fstrglob: 0, Fvalue_dup: 0, Fvalue_free: 0, Fresult_zeroblob64: 0, Fbind_zeroblob64: 0, Fvalue_subtype: 0, Fresult_subtype: 0, Fstatus64: 0, Fstrlike: 0, Fdb_cacheflush: 0, Fsystem_errno: 0, Ftrace_v2: 0, Fexpanded_sql: 0, Fset_last_insert_rowid: 0, Fprepare_v3: 0, Fprepare16_v3: 0, Fbind_pointer: 0, Fresult_pointer: 0, Fvalue_pointer: 0, Fvtab_nochange: 0, Fvalue_nochange: 0, Fvtab_collation: 0, Fkeyword_count: 0, Fkeyword_name: 0, Fkeyword_check: 0, Fstr_new: 0, Fstr_finish: 0, Fstr_appendf: 0, Fstr_vappendf: 0, Fstr_append: 0, Fstr_appendall: 0, Fstr_appendchar: 0, Fstr_reset: 0, Fstr_errcode: 0, Fstr_length: 0, Fstr_value: 0, Fcreate_window_function: 0, Fstmt_isexplain: 0, Fvalue_frombind: 0, Fdrop_modules: 0, Fhard_heap_limit64: 0, Furi_key: 0, Ffilename_database: 0, Ffilename_journal: 0, Ffilename_wal: 0, Fcreate_filename: 0, Ffree_filename: 0, Fdatabase_file_object: 0, Ftxn_state: 0, Fchanges64: 0, Ftotal_changes64: 0, Fautovacuum_pages: 0, Ferror_offset: 0, Fvtab_rhs_value: 0, Fvtab_distinct: 0, Fvtab_in: 0, Fvtab_in_first: 0, Fvtab_in_next: 0, Fdeserialize: 0, Fserialize: 0, Fdb_name: 0, Fvalue_encoding: 0, Fis_interrupted: 0, } func sqlite3LoadExtension(tls *libc.TLS, db uintptr, zFile uintptr, zProc uintptr, pzErrMsg uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var pVfs uintptr var handle uintptr var xInit Sqlite3_loadext_entry var zEntry uintptr var zAltEntry uintptr var aHandle uintptr var nMsg U64 var ii int32 var rc int32 var zAltFile uintptr var iFile int32 var iEntry int32 var c int32 var ncFile int32 pVfs = (*Sqlite3)(unsafe.Pointer(db)).FpVfs *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) zAltEntry = uintptr(0) nMsg = libc.Xstrlen(tls, zFile) if !(pzErrMsg != 0) { goto __1 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = uintptr(0) __1: ; if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_LoadExtension) == uint64(0)) { goto __2 } if !(pzErrMsg != 0) { goto __3 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+13452, 0) __3: ; return SQLITE_ERROR __2: ; if zProc != 0 { zEntry = zProc } else { zEntry = ts + 17245 } if !(nMsg > uint64(FILENAME_MAX)) { goto __4 } goto extension_not_found __4: ; handle = Xsqlite3OsDlOpen(tls, pVfs, zFile) ii = 0 __5: if !(ii < int32(uint64(unsafe.Sizeof(azEndings))/uint64(unsafe.Sizeof(uintptr(0)))) && handle == uintptr(0)) { goto __7 } zAltFile = Xsqlite3_mprintf(tls, ts+13413, libc.VaList(bp, zFile, azEndings[ii])) if !(zAltFile == uintptr(0)) { goto __8 } return SQLITE_NOMEM __8: ; handle = Xsqlite3OsDlOpen(tls, pVfs, zAltFile) Xsqlite3_free(tls, zAltFile) goto __6 __6: ii++ goto __5 goto __7 __7: ; if !(handle == uintptr(0)) { goto __9 } goto extension_not_found __9: ; xInit = Xsqlite3OsDlSym(tls, pVfs, handle, zEntry) if !(xInit == uintptr(0) && zProc == uintptr(0)) { goto __10 } ncFile = Xsqlite3Strlen30(tls, zFile) zAltEntry = Xsqlite3_malloc64(tls, uint64(ncFile+30)) if !(zAltEntry == uintptr(0)) { goto __11 } Xsqlite3OsDlClose(tls, pVfs, handle) return SQLITE_NOMEM __11: ; libc.Xmemcpy(tls, zAltEntry, ts+17268, uint64(8)) iFile = ncFile - 1 __12: if !(iFile >= 0 && !(int32(*(*int8)(unsafe.Pointer(zFile + uintptr(iFile)))) == '/' || int32(*(*int8)(unsafe.Pointer(zFile + uintptr(iFile)))) == '\\')) { goto __14 } goto __13 __13: iFile-- goto __12 goto __14 __14: ; iFile++ if !(Xsqlite3_strnicmp(tls, zFile+uintptr(iFile), ts+17277, 3) == 0) { goto __15 } iFile = iFile + 3 __15: ; iEntry = 8 __16: if !(libc.AssignInt32(&c, int32(*(*int8)(unsafe.Pointer(zFile + uintptr(iFile))))) != 0 && c != '.') { goto __18 } if !(int32(Xsqlite3CtypeMap[uint8(c)])&0x02 != 0) { goto __19 } *(*int8)(unsafe.Pointer(zAltEntry + uintptr(libc.PostIncInt32(&iEntry, 1)))) = int8(Xsqlite3UpperToLower[uint32(c)]) __19: ; goto __17 __17: iFile++ goto __16 goto __18 __18: ; libc.Xmemcpy(tls, zAltEntry+uintptr(iEntry), ts+17281, uint64(6)) zEntry = zAltEntry xInit = Xsqlite3OsDlSym(tls, pVfs, handle, zEntry) __10: ; if !(xInit == uintptr(0)) { goto __20 } if !(pzErrMsg != 0) { goto __21 } nMsg = nMsg + (libc.Xstrlen(tls, zEntry) + uint64(300)) *(*uintptr)(unsafe.Pointer(pzErrMsg)) = libc.AssignPtrUintptr(bp+56, Xsqlite3_malloc64(tls, nMsg)) if !(*(*uintptr)(unsafe.Pointer(bp + 56)) != 0) { goto __22 } Xsqlite3_snprintf(tls, int32(nMsg), *(*uintptr)(unsafe.Pointer(bp + 56)), ts+17287, libc.VaList(bp+16, zEntry, zFile)) Xsqlite3OsDlError(tls, pVfs, int32(nMsg-uint64(1)), *(*uintptr)(unsafe.Pointer(bp + 56))) __22: ; __21: ; Xsqlite3OsDlClose(tls, pVfs, handle) Xsqlite3_free(tls, zAltEntry) return SQLITE_ERROR __20: ; Xsqlite3_free(tls, zAltEntry) rc = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xInit})).f(tls, db, bp+56, uintptr(unsafe.Pointer(&sqlite3Apis))) if !(rc != 0) { goto __23 } if !(rc == SQLITE_OK|int32(1)<<8) { goto __24 } return SQLITE_OK __24: ; if !(pzErrMsg != 0) { goto __25 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+17330, libc.VaList(bp+32, *(*uintptr)(unsafe.Pointer(bp + 56)))) __25: ; Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 56))) Xsqlite3OsDlClose(tls, pVfs, handle) return SQLITE_ERROR __23: ; aHandle = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(handle))*uint64((*Sqlite3)(unsafe.Pointer(db)).FnExtension+1)) if !(aHandle == uintptr(0)) { goto __26 } return SQLITE_NOMEM __26: ; if !((*Sqlite3)(unsafe.Pointer(db)).FnExtension > 0) { goto __27 } libc.Xmemcpy(tls, aHandle, (*Sqlite3)(unsafe.Pointer(db)).FaExtension, uint64(unsafe.Sizeof(handle))*uint64((*Sqlite3)(unsafe.Pointer(db)).FnExtension)) __27: ; Xsqlite3DbFree(tls, db, (*Sqlite3)(unsafe.Pointer(db)).FaExtension) (*Sqlite3)(unsafe.Pointer(db)).FaExtension = aHandle *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaExtension + uintptr(libc.PostIncInt32(&(*Sqlite3)(unsafe.Pointer(db)).FnExtension, 1))*8)) = handle return SQLITE_OK extension_not_found: if !(pzErrMsg != 0) { goto __28 } nMsg = nMsg + uint64(300) *(*uintptr)(unsafe.Pointer(pzErrMsg)) = libc.AssignPtrUintptr(bp+56, Xsqlite3_malloc64(tls, nMsg)) if !(*(*uintptr)(unsafe.Pointer(bp + 56)) != 0) { goto __29 } Xsqlite3_snprintf(tls, int32(nMsg), *(*uintptr)(unsafe.Pointer(bp + 56)), ts+17362, libc.VaList(bp+40, FILENAME_MAX, zFile)) Xsqlite3OsDlError(tls, pVfs, int32(nMsg-uint64(1)), *(*uintptr)(unsafe.Pointer(bp + 56))) __29: ; __28: ; return SQLITE_ERROR } var azEndings = [1]uintptr{ ts + 17399, } func Xsqlite3_load_extension(tls *libc.TLS, db uintptr, zFile uintptr, zProc uintptr, pzErrMsg uintptr) int32 { var rc int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) rc = sqlite3LoadExtension(tls, db, zFile, zProc, pzErrMsg) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Call this routine when the database connection is closing in order // to clean up loaded extensions func Xsqlite3CloseExtensions(tls *libc.TLS, db uintptr) { var i int32 for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnExtension; i++ { Xsqlite3OsDlClose(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaExtension + uintptr(i)*8))) } Xsqlite3DbFree(tls, db, (*Sqlite3)(unsafe.Pointer(db)).FaExtension) } // Enable or disable extension loading. Extension loading is disabled by // default so as not to open security holes in older applications. func Xsqlite3_enable_load_extension(tls *libc.TLS, db uintptr, onoff int32) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if onoff != 0 { *(*U64)(unsafe.Pointer(db + 48)) |= uint64(SQLITE_LoadExtension | SQLITE_LoadExtFunc) } else { *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_LoadExtension | SQLITE_LoadExtFunc)) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } type sqlite3AutoExtList = struct { FnExt U32 F__ccgo_pad1 [4]byte FaExt uintptr } // The following object holds the list of automatically loaded // extensions. // // This list is shared across threads. The SQLITE_MUTEX_STATIC_MAIN // mutex must be held while accessing this list. type Sqlite3AutoExtList = sqlite3AutoExtList var sqlite3Autoext = sqlite3AutoExtList{} // Register a statically linked extension that is automatically // loaded by every new database connection. func Xsqlite3_auto_extension(tls *libc.TLS, xInit uintptr) int32 { var rc int32 = SQLITE_OK rc = Xsqlite3_initialize(tls) if rc != 0 { return rc } else { var i U32 var mutex uintptr = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, mutex) for i = U32(0); i < sqlite3Autoext.FnExt; i++ { if *(*uintptr)(unsafe.Pointer(sqlite3Autoext.FaExt + uintptr(i)*8)) == xInit { break } } if i == sqlite3Autoext.FnExt { var nByte U64 = uint64(sqlite3Autoext.FnExt+U32(1)) * uint64(unsafe.Sizeof(uintptr(0))) var aNew uintptr aNew = Xsqlite3_realloc64(tls, sqlite3Autoext.FaExt, nByte) if aNew == uintptr(0) { rc = SQLITE_NOMEM } else { sqlite3Autoext.FaExt = aNew *(*uintptr)(unsafe.Pointer(sqlite3Autoext.FaExt + uintptr(sqlite3Autoext.FnExt)*8)) = xInit sqlite3Autoext.FnExt++ } } Xsqlite3_mutex_leave(tls, mutex) return rc } return int32(0) } // Cancel a prior call to sqlite3_auto_extension. Remove xInit from the // set of routines that is invoked for each new database connection, if it // is currently on the list. If xInit is not on the list, then this // routine is a no-op. // // Return 1 if xInit was found on the list and removed. Return 0 if xInit // was not on the list. func Xsqlite3_cancel_auto_extension(tls *libc.TLS, xInit uintptr) int32 { var mutex uintptr = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) var i int32 var n int32 = 0 Xsqlite3_mutex_enter(tls, mutex) for i = int32(sqlite3Autoext.FnExt) - 1; i >= 0; i-- { if *(*uintptr)(unsafe.Pointer(sqlite3Autoext.FaExt + uintptr(i)*8)) == xInit { sqlite3Autoext.FnExt-- *(*uintptr)(unsafe.Pointer(sqlite3Autoext.FaExt + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer(sqlite3Autoext.FaExt + uintptr(sqlite3Autoext.FnExt)*8)) n++ break } } Xsqlite3_mutex_leave(tls, mutex) return n } // Reset the automatic extension loading mechanism. func Xsqlite3_reset_auto_extension(tls *libc.TLS) { if Xsqlite3_initialize(tls) == SQLITE_OK { var mutex uintptr = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, mutex) Xsqlite3_free(tls, sqlite3Autoext.FaExt) sqlite3Autoext.FaExt = uintptr(0) sqlite3Autoext.FnExt = U32(0) Xsqlite3_mutex_leave(tls, mutex) } } // Load all automatic extensions. // // If anything goes wrong, set an error in the database connection. func Xsqlite3AutoLoadExtensions(tls *libc.TLS, db uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var i U32 var go1 int32 = 1 var rc int32 var xInit Sqlite3_loadext_entry if sqlite3Autoext.FnExt == U32(0) { return } for i = U32(0); go1 != 0; i++ { var mutex uintptr = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) var pThunk uintptr = uintptr(unsafe.Pointer(&sqlite3Apis)) Xsqlite3_mutex_enter(tls, mutex) if i >= sqlite3Autoext.FnExt { xInit = uintptr(0) go1 = 0 } else { xInit = *(*uintptr)(unsafe.Pointer(sqlite3Autoext.FaExt + uintptr(i)*8)) } Xsqlite3_mutex_leave(tls, mutex) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) if xInit != 0 && libc.AssignInt32(&rc, (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xInit})).f(tls, db, bp+8, pThunk)) != 0 { Xsqlite3ErrorWithMsg(tls, db, rc, ts+17403, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(bp + 8)))) go1 = 0 } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } } var pragCName = [57]uintptr{ ts + 6409, ts + 17442, ts + 10228, ts + 17446, ts + 17451, ts + 17454, ts + 17464, ts + 17474, ts + 17480, ts + 17484, ts + 17489, ts + 17494, ts + 17502, ts + 17513, ts + 17516, ts + 17523, ts + 17484, ts + 17489, ts + 17530, ts + 17535, ts + 17538, ts + 17545, ts + 17480, ts + 17484, ts + 17551, ts + 17556, ts + 17561, ts + 17484, ts + 17565, ts + 17489, ts + 17573, ts + 17577, ts + 17582, ts + 12844, ts + 12840, ts + 17588, ts + 17593, ts + 17598, ts + 17442, ts + 17484, ts + 17603, ts + 17610, ts + 17617, ts + 10228, ts + 17625, ts + 6412, ts + 17631, ts + 17442, ts + 17484, ts + 17636, ts + 17641, ts + 16837, ts + 17646, ts + 17659, ts + 17668, ts + 17675, ts + 17686, } // Definitions of all built-in pragmas type PragmaName1 = struct { FzName uintptr FePragTyp U8 FmPragFlg U8 FiPragCName U8 FnPragCName U8 F__ccgo_pad1 [4]byte FiArg U64 } // Definitions of all built-in pragmas type PragmaName = PragmaName1 var aPragmaName = [67]PragmaName{ {FzName: ts + 17694, FePragTyp: U8(PragTyp_ANALYSIS_LIMIT), FmPragFlg: U8(PragFlg_Result0)}, {FzName: ts + 17709, FePragTyp: U8(PragTyp_HEADER_VALUE), FmPragFlg: U8(PragFlg_NoColumns1 | PragFlg_Result0), FiArg: uint64(BTREE_APPLICATION_ID)}, {FzName: ts + 17724, FePragTyp: U8(PragTyp_AUTO_VACUUM), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq | PragFlg_NoColumns1)}, {FzName: ts + 17736, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_AutoIndex)}, {FzName: ts + 17752, FePragTyp: U8(PragTyp_BUSY_TIMEOUT), FmPragFlg: U8(PragFlg_Result0), FiPragCName: U8(56), FnPragCName: U8(1)}, {FzName: ts + 17675, FePragTyp: U8(PragTyp_CACHE_SIZE), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq | PragFlg_NoColumns1)}, {FzName: ts + 17765, FePragTyp: U8(PragTyp_CACHE_SPILL), FmPragFlg: U8(PragFlg_Result0 | PragFlg_SchemaReq | PragFlg_NoColumns1)}, {FzName: ts + 17777, FePragTyp: U8(PragTyp_CASE_SENSITIVE_LIKE), FmPragFlg: U8(PragFlg_NoColumns)}, {FzName: ts + 17797, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_CellSizeCk)}, {FzName: ts + 17813, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_CkptFullFSync)}, {FzName: ts + 17834, FePragTyp: U8(PragTyp_COLLATION_LIST), FmPragFlg: U8(PragFlg_Result0), FiPragCName: U8(38), FnPragCName: U8(2)}, {FzName: ts + 17849, FePragTyp: U8(PragTyp_COMPILE_OPTIONS), FmPragFlg: U8(PragFlg_Result0)}, {FzName: ts + 17865, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(0x00001) << 32}, {FzName: ts + 17879, FePragTyp: U8(PragTyp_DATA_STORE_DIRECTORY), FmPragFlg: U8(PragFlg_NoColumns1)}, {FzName: ts + 17900, FePragTyp: U8(PragTyp_HEADER_VALUE), FmPragFlg: U8(PragFlg_ReadOnly | PragFlg_Result0), FiArg: uint64(BTREE_DATA_VERSION)}, {FzName: ts + 17913, FePragTyp: U8(PragTyp_DATABASE_LIST), FmPragFlg: U8(PragFlg_Result0), FiPragCName: U8(47), FnPragCName: U8(3)}, {FzName: ts + 17927, FePragTyp: U8(PragTyp_DEFAULT_CACHE_SIZE), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq | PragFlg_NoColumns1), FiPragCName: U8(55), FnPragCName: U8(1)}, {FzName: ts + 17946, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_DeferFKs)}, {FzName: ts + 17965, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_NullCallback)}, {FzName: ts + 17988, FePragTyp: U8(PragTyp_ENCODING), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1)}, {FzName: ts + 17997, FePragTyp: U8(PragTyp_FOREIGN_KEY_CHECK), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_Result1 | PragFlg_SchemaOpt), FiPragCName: U8(43), FnPragCName: U8(4)}, {FzName: ts + 18015, FePragTyp: U8(PragTyp_FOREIGN_KEY_LIST), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt), FnPragCName: U8(8)}, {FzName: ts + 18032, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_ForeignKeys)}, {FzName: ts + 18045, FePragTyp: U8(PragTyp_HEADER_VALUE), FmPragFlg: U8(PragFlg_ReadOnly | PragFlg_Result0)}, {FzName: ts + 18060, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_FullColNames)}, {FzName: ts + 18078, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_FullFSync)}, {FzName: ts + 18088, FePragTyp: U8(PragTyp_FUNCTION_LIST), FmPragFlg: U8(PragFlg_Result0), FiPragCName: U8(27), FnPragCName: U8(6)}, {FzName: ts + 18102, FePragTyp: U8(PragTyp_HARD_HEAP_LIMIT), FmPragFlg: U8(PragFlg_Result0)}, {FzName: ts + 18118, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_IgnoreChecks)}, {FzName: ts + 18143, FePragTyp: U8(PragTyp_INCREMENTAL_VACUUM), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_NoColumns)}, {FzName: ts + 18162, FePragTyp: U8(PragTyp_INDEX_INFO), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt), FiPragCName: U8(21), FnPragCName: U8(3)}, {FzName: ts + 18173, FePragTyp: U8(PragTyp_INDEX_LIST), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt), FiPragCName: U8(38), FnPragCName: U8(5)}, {FzName: ts + 18184, FePragTyp: U8(PragTyp_INDEX_INFO), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt), FiPragCName: U8(21), FnPragCName: U8(6), FiArg: uint64(1)}, {FzName: ts + 18196, FePragTyp: U8(PragTyp_INTEGRITY_CHECK), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_Result1 | PragFlg_SchemaOpt)}, {FzName: ts + 18212, FePragTyp: U8(PragTyp_JOURNAL_MODE), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq)}, {FzName: ts + 18225, FePragTyp: U8(PragTyp_JOURNAL_SIZE_LIMIT), FmPragFlg: U8(PragFlg_Result0 | PragFlg_SchemaReq)}, {FzName: ts + 18244, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_LegacyAlter)}, {FzName: ts + 18263, FePragTyp: U8(PragTyp_LOCKING_MODE), FmPragFlg: U8(PragFlg_Result0 | PragFlg_SchemaReq)}, {FzName: ts + 18276, FePragTyp: U8(PragTyp_PAGE_COUNT), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq)}, {FzName: ts + 18291, FePragTyp: U8(PragTyp_MMAP_SIZE)}, {FzName: ts + 18301, FePragTyp: U8(PragTyp_MODULE_LIST), FmPragFlg: U8(PragFlg_Result0), FiPragCName: U8(9), FnPragCName: U8(1)}, {FzName: ts + 18313, FePragTyp: U8(PragTyp_OPTIMIZE), FmPragFlg: U8(PragFlg_Result1 | PragFlg_NeedSchema)}, {FzName: ts + 18322, FePragTyp: U8(PragTyp_PAGE_COUNT), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq)}, {FzName: ts + 18333, FePragTyp: U8(PragTyp_PAGE_SIZE), FmPragFlg: U8(PragFlg_Result0 | PragFlg_SchemaReq | PragFlg_NoColumns1)}, {FzName: ts + 18343, FePragTyp: U8(PragTyp_PRAGMA_LIST), FmPragFlg: U8(PragFlg_Result0), FiPragCName: U8(9), FnPragCName: U8(1)}, {FzName: ts + 18355, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_QueryOnly)}, {FzName: ts + 18366, FePragTyp: U8(PragTyp_INTEGRITY_CHECK), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_Result1 | PragFlg_SchemaOpt)}, {FzName: ts + 18378, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_ReadUncommit)}, {FzName: ts + 18395, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_RecTriggers)}, {FzName: ts + 18414, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_ReverseOrder)}, {FzName: ts + 18440, FePragTyp: U8(PragTyp_HEADER_VALUE), FmPragFlg: U8(PragFlg_NoColumns1 | PragFlg_Result0), FiArg: uint64(BTREE_SCHEMA_VERSION)}, {FzName: ts + 18455, FePragTyp: U8(PragTyp_SECURE_DELETE), FmPragFlg: U8(PragFlg_Result0)}, {FzName: ts + 18469, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_ShortColNames)}, {FzName: ts + 18488, FePragTyp: U8(PragTyp_SHRINK_MEMORY), FmPragFlg: U8(PragFlg_NoColumns)}, {FzName: ts + 18502, FePragTyp: U8(PragTyp_SOFT_HEAP_LIMIT), FmPragFlg: U8(PragFlg_Result0)}, {FzName: ts + 18518, FePragTyp: U8(PragTyp_SYNCHRONOUS), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq | PragFlg_NoColumns1)}, {FzName: ts + 18530, FePragTyp: U8(PragTyp_TABLE_INFO), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt), FiPragCName: U8(8), FnPragCName: U8(6)}, {FzName: ts + 18541, FePragTyp: U8(PragTyp_TABLE_LIST), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result1), FiPragCName: U8(15), FnPragCName: U8(6)}, {FzName: ts + 18552, FePragTyp: U8(PragTyp_TABLE_INFO), FmPragFlg: U8(PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt), FiPragCName: U8(8), FnPragCName: U8(7), FiArg: uint64(1)}, {FzName: ts + 18564, FePragTyp: U8(PragTyp_TEMP_STORE), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1)}, {FzName: ts + 18575, FePragTyp: U8(PragTyp_TEMP_STORE_DIRECTORY), FmPragFlg: U8(PragFlg_NoColumns1)}, {FzName: ts + 18596, FePragTyp: U8(PragTyp_THREADS), FmPragFlg: U8(PragFlg_Result0)}, {FzName: ts + 18604, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_TrustedSchema)}, {FzName: ts + 18619, FePragTyp: U8(PragTyp_HEADER_VALUE), FmPragFlg: U8(PragFlg_NoColumns1 | PragFlg_Result0), FiArg: uint64(BTREE_USER_VERSION)}, {FzName: ts + 18632, FePragTyp: U8(PragTyp_WAL_AUTOCHECKPOINT)}, {FzName: ts + 18651, FePragTyp: U8(PragTyp_WAL_CHECKPOINT), FmPragFlg: U8(PragFlg_NeedSchema), FiPragCName: U8(50), FnPragCName: U8(3)}, {FzName: ts + 18666, FePragTyp: U8(PragTyp_FLAG), FmPragFlg: U8(PragFlg_Result0 | PragFlg_NoColumns1), FiArg: uint64(SQLITE_WriteSchema | SQLITE_NoSchemaError)}, } func getSafetyLevel(tls *libc.TLS, z uintptr, omitFull int32, dflt U8) U8 { var i int32 var n int32 if int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z)))])&0x04 != 0 { return U8(Xsqlite3Atoi(tls, z)) } n = Xsqlite3Strlen30(tls, z) for i = 0; i < int32(uint64(unsafe.Sizeof(iLength))/uint64(unsafe.Sizeof(U8(0)))); i++ { if int32(iLength[i]) == n && Xsqlite3_strnicmp(tls, uintptr(unsafe.Pointer(&zText))+uintptr(iOffset[i]), z, n) == 0 && (!(omitFull != 0) || int32(iValue[i]) <= 1) { return iValue[i] } } return dflt } var zText = *(*[25]int8)(unsafe.Pointer(ts + 18682)) var iOffset = [8]U8{U8(0), U8(1), U8(2), U8(4), U8(9), U8(12), U8(15), U8(20)} var iLength = [8]U8{U8(2), U8(2), U8(3), U8(5), U8(3), U8(4), U8(5), U8(4)} var iValue = [8]U8{U8(1), U8(0), U8(0), U8(0), U8(1), U8(1), U8(3), U8(2)} // Interpret the given string as a boolean value. func Xsqlite3GetBoolean(tls *libc.TLS, z uintptr, dflt U8) U8 { return U8(libc.Bool32(int32(getSafetyLevel(tls, z, 1, dflt)) != 0)) } func getLockingMode(tls *libc.TLS, z uintptr) int32 { if z != 0 { if 0 == Xsqlite3StrICmp(tls, z, ts+5017) { return PAGER_LOCKINGMODE_EXCLUSIVE } if 0 == Xsqlite3StrICmp(tls, z, ts+18707) { return PAGER_LOCKINGMODE_NORMAL } } return -1 } func getAutoVacuum(tls *libc.TLS, z uintptr) int32 { var i int32 if 0 == Xsqlite3StrICmp(tls, z, ts+9378) { return BTREE_AUTOVACUUM_NONE } if 0 == Xsqlite3StrICmp(tls, z, ts+18714) { return BTREE_AUTOVACUUM_FULL } if 0 == Xsqlite3StrICmp(tls, z, ts+18719) { return BTREE_AUTOVACUUM_INCR } i = Xsqlite3Atoi(tls, z) return int32(func() uint8 { if i >= 0 && i <= 2 { return uint8(i) } return uint8(0) }()) } func getTempStore(tls *libc.TLS, z uintptr) int32 { if int32(*(*int8)(unsafe.Pointer(z))) >= '0' && int32(*(*int8)(unsafe.Pointer(z))) <= '2' { return int32(*(*int8)(unsafe.Pointer(z))) - '0' } else if Xsqlite3StrICmp(tls, z, ts+17636) == 0 { return 1 } else if Xsqlite3StrICmp(tls, z, ts+18731) == 0 { return 2 } else { return 0 } return int32(0) } func invalidateTempStorage(tls *libc.TLS, pParse uintptr) int32 { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpBt != uintptr(0) { if !(int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) != 0) || Xsqlite3BtreeTxnState(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpBt) != SQLITE_TXN_NONE { Xsqlite3ErrorMsg(tls, pParse, ts+18738, 0) return SQLITE_ERROR } Xsqlite3BtreeClose(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpBt) (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).FpBt = uintptr(0) Xsqlite3ResetAllSchemasOfConnection(tls, db) } return SQLITE_OK } func changeTempStorage(tls *libc.TLS, pParse uintptr, zStorageType uintptr) int32 { var ts int32 = getTempStore(tls, zStorageType) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if int32((*Sqlite3)(unsafe.Pointer(db)).Ftemp_store) == ts { return SQLITE_OK } if invalidateTempStorage(tls, pParse) != SQLITE_OK { return SQLITE_ERROR } (*Sqlite3)(unsafe.Pointer(db)).Ftemp_store = U8(ts) return SQLITE_OK } func setPragmaResultColumnNames(tls *libc.TLS, v uintptr, pPragma uintptr) { var n U8 = (*PragmaName)(unsafe.Pointer(pPragma)).FnPragCName Xsqlite3VdbeSetNumCols(tls, v, func() int32 { if int32(n) == 0 { return 1 } return int32(n) }()) if int32(n) == 0 { Xsqlite3VdbeSetColName(tls, v, 0, COLNAME_NAME, (*PragmaName)(unsafe.Pointer(pPragma)).FzName, uintptr(0)) } else { var i int32 var j int32 i = 0 j = int32((*PragmaName)(unsafe.Pointer(pPragma)).FiPragCName) __1: if !(i < int32(n)) { goto __3 } { Xsqlite3VdbeSetColName(tls, v, i, COLNAME_NAME, pragCName[j], uintptr(0)) } goto __2 __2: i++ j++ goto __1 goto __3 __3: } } func returnSingleInt(tls *libc.TLS, v uintptr, value I64) { bp := tls.Alloc(8) defer tls.Free(8) *(*I64)(unsafe.Pointer(bp)) = value Xsqlite3VdbeAddOp4Dup8(tls, v, OP_Int64, 0, 1, 0, bp, -13) Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, 1, 1) } func returnSingleText(tls *libc.TLS, v uintptr, zValue uintptr) { if zValue != 0 { Xsqlite3VdbeLoadString(tls, v, 1, zValue) Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, 1, 1) } } func setAllPagerFlags(tls *libc.TLS, db uintptr) { if (*Sqlite3)(unsafe.Pointer(db)).FautoCommit != 0 { var pDb uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaDb var n int32 = (*Sqlite3)(unsafe.Pointer(db)).FnDb for libc.PostDecInt32(&n, 1) > 0 { if (*Db)(unsafe.Pointer(pDb)).FpBt != 0 { Xsqlite3BtreeSetPagerFlags(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, uint32(U64((*Db)(unsafe.Pointer(pDb)).Fsafety_level)|(*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(PAGER_FLAGS_MASK))) } pDb += 32 } } } func actionName(tls *libc.TLS, action U8) uintptr { var zName uintptr switch int32(action) { case OE_SetNull: zName = ts + 18800 break case OE_SetDflt: zName = ts + 18809 break case OE_Cascade: zName = ts + 18821 break case OE_Restrict: zName = ts + 18829 break default: zName = ts + 18838 break } return zName } // Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants // defined in pager.h. This function returns the associated lowercase // journal-mode name. func Xsqlite3JournalModename(tls *libc.TLS, eMode int32) uintptr { if eMode == int32(uint64(unsafe.Sizeof(azModeName))/uint64(unsafe.Sizeof(uintptr(0)))) { return uintptr(0) } return azModeName[eMode] } var azModeName = [6]uintptr{ ts + 18848, ts + 18855, ts + 18863, ts + 18867, ts + 18731, ts + 18876, } func pragmaLocate(tls *libc.TLS, zName uintptr) uintptr { var upr int32 var lwr int32 var mid int32 = 0 var rc int32 lwr = 0 upr = int32(uint64(unsafe.Sizeof(aPragmaName))/uint64(unsafe.Sizeof(PragmaName{}))) - 1 for lwr <= upr { mid = (lwr + upr) / 2 rc = Xsqlite3_stricmp(tls, zName, aPragmaName[mid].FzName) if rc == 0 { break } if rc < 0 { upr = mid - 1 } else { lwr = mid + 1 } } if lwr > upr { return uintptr(0) } return uintptr(unsafe.Pointer(&aPragmaName)) + uintptr(mid)*24 } func pragmaFunclistLine(tls *libc.TLS, v uintptr, p uintptr, isBuiltin int32, showInternFuncs int32) { bp := tls.Alloc(48) defer tls.Free(48) var mask U32 = U32(SQLITE_DETERMINISTIC | SQLITE_DIRECTONLY | SQLITE_SUBTYPE | SQLITE_INNOCUOUS | SQLITE_FUNC_INTERNAL) if showInternFuncs != 0 { mask = 0xffffffff } for ; p != 0; p = (*FuncDef)(unsafe.Pointer(p)).FpNext { var zType uintptr if (*FuncDef)(unsafe.Pointer(p)).FxSFunc == uintptr(0) { continue } if (*FuncDef)(unsafe.Pointer(p)).FfuncFlags&U32(SQLITE_FUNC_INTERNAL) != U32(0) && showInternFuncs == 0 { continue } if (*FuncDef)(unsafe.Pointer(p)).FxValue != uintptr(0) { zType = ts + 18880 } else if (*FuncDef)(unsafe.Pointer(p)).FxFinalize != uintptr(0) { zType = ts + 18882 } else { zType = ts + 8869 } Xsqlite3VdbeMultiLoad(tls, v, 1, ts+18884, libc.VaList(bp, (*FuncDef)(unsafe.Pointer(p)).FzName, isBuiltin, zType, azEnc[(*FuncDef)(unsafe.Pointer(p)).FfuncFlags&U32(SQLITE_FUNC_ENCMASK)], int32((*FuncDef)(unsafe.Pointer(p)).FnArg), (*FuncDef)(unsafe.Pointer(p)).FfuncFlags&mask^U32(SQLITE_INNOCUOUS))) } } var azEnc = [4]uintptr{uintptr(0), ts + 18891, ts + 18896, ts + 18904} func integrityCheckResultRow(tls *libc.TLS, v uintptr) int32 { var addr int32 Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, 3, 1) addr = Xsqlite3VdbeAddOp3(tls, v, OP_IfPos, 1, Xsqlite3VdbeCurrentAddr(tls, v)+2, 1) Xsqlite3VdbeAddOp0(tls, v, OP_Halt) return addr } // Process a pragma statement. // // Pragmas are of this form: // // PRAGMA [schema.]id [= value] // // The identifier might also be a string. The value is a string, and // identifier, or a number. If minusFlag is true, then the value is // a number that was preceded by a minus sign. // // If the left side is "database.id" then pId1 is the database name // and pId2 is the id. If the left side is just "id" then pId1 is the // id and pId2 is any empty string. func Xsqlite3Pragma(tls *libc.TLS, pParse uintptr, pId1 uintptr, pId2 uintptr, pValue uintptr, minusFlag int32) { bp := tls.Alloc(680) defer tls.Free(680) var zLeft uintptr var zRight uintptr var zDb uintptr var iDb int32 var rc int32 var db uintptr var pDb uintptr var v uintptr var pPragma uintptr var size int32 var aOp uintptr var size1 int32 var pBt uintptr var ii int32 var pBt1 uintptr var b int32 var iReg int32 var ii1 int32 var pPager uintptr var zRet uintptr var eMode int32 var zMode uintptr var n int32 var eMode1 int32 var ii2 int32 var pPager1 uintptr var aOp1 uintptr var iAddr int32 var eAuto int32 var pBt2 uintptr var addr int32 var size2 int32 var ii3 int32 var iLevel int32 var mask U64 var isHidden int32 var pColExpr uintptr var i int32 var k int32 var nHidden int32 var pCol uintptr var pPk uintptr var pTab uintptr var zSql uintptr var pTab1 uintptr var pTab2 uintptr var zType uintptr var k1 uintptr var pHash uintptr var initNCol int32 var ii4 int32 var cnum I16 var iIdxDb int32 var i1 int32 var mx int32 var pIdx uintptr var pTab3 uintptr var iTabDb int32 var pIdx1 uintptr var pTab4 uintptr var i2 int32 var i3 int32 var pColl uintptr var i4 int32 var p uintptr var i5 int32 var j uintptr var p1 uintptr var showInternFunc int32 var pMod uintptr var j1 uintptr var i6 int32 var j2 int32 var iTabDb1 int32 var i7 int32 var pFK uintptr var pTab5 uintptr var iCol int32 var jmp int32 var pFK1 uintptr var pTab6 uintptr var pParent uintptr var i8 int32 var j3 int32 var k2 uintptr var x1 int32 var regResult int32 var regRow int32 var addrTop int32 var addrOk int32 var pTab7 uintptr var pIdx3 uintptr var nIdx int32 var pTab8 uintptr var pIdx4 uintptr var a1 int32 var zErr uintptr var jmp2 int32 var zErr1 uintptr var pCol1 uintptr var labelError int32 var labelOk int32 var p11 int32 var p3 int32 var p4 int32 var doTypeCheck int32 var addrCkFault int32 var addrCkOk int32 var zErr2 uintptr var k3 int32 var pCheck uintptr var jmp7 int32 var jmp6 int32 var iCol1 int32 var uniqOk int32 var jmp61 int32 var jmp21 int32 var jmp4 int32 var jmp5 int32 var label6 int32 var kk int32 var ckUniq int32 var pTab9 uintptr var pIdx5 uintptr var pPk1 uintptr var pPrior uintptr var loopTop int32 var r1 int32 var bStrict int32 var r2 int32 var mxCol int32 var x2 uintptr var pTbls uintptr var aRoot uintptr var cnt int32 var mxIdx int32 var aOp2 uintptr var i9 int32 var j4 int32 var addr1 int32 var pObjTab uintptr var isQuick int32 var enc U8 var pEnc uintptr var aOp3 uintptr var aOp4 uintptr var iCookie int32 var i10 int32 var zOpt uintptr var iBt int32 var eMode2 int32 var r11 int32 var iDbLast int32 var iTabCur int32 var k4 uintptr var pSchema uintptr var pTab10 uintptr var pIdx6 uintptr var szThreshold LogEst var zSubSql uintptr var opMask U32 var iPrior Sqlite3_int64 zLeft = uintptr(0) zRight = uintptr(0) zDb = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb v = Xsqlite3GetVdbe(tls, pParse) if !(v == uintptr(0)) { goto __1 } return __1: ; Xsqlite3VdbeRunOnlyOnce(tls, v) (*Parse)(unsafe.Pointer(pParse)).FnMem = 2 iDb = Xsqlite3TwoPartName(tls, pParse, pId1, pId2, bp+488) if !(iDb < 0) { goto __2 } return __2: ; pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 if !(iDb == 1 && Xsqlite3OpenTempDatabase(tls, pParse) != 0) { goto __3 } return __3: ; zLeft = Xsqlite3NameFromToken(tls, db, *(*uintptr)(unsafe.Pointer(bp + 488))) if !!(zLeft != 0) { goto __4 } return __4: ; if !(minusFlag != 0) { goto __5 } zRight = Xsqlite3MPrintf(tls, db, ts+18912, libc.VaList(bp, pValue)) goto __6 __5: zRight = Xsqlite3NameFromToken(tls, db, pValue) __6: ; if (*Token)(unsafe.Pointer(pId2)).Fn > uint32(0) { zDb = (*Db)(unsafe.Pointer(pDb)).FzDbSName } else { zDb = uintptr(0) } if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) != 0) { goto __7 } goto pragma_out __7: ; *(*uintptr)(unsafe.Pointer(bp + 496)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 496 + 1*8)) = zLeft *(*uintptr)(unsafe.Pointer(bp + 496 + 2*8)) = zRight *(*uintptr)(unsafe.Pointer(bp + 496 + 3*8)) = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FnBusy = 0 rc = Xsqlite3_file_control(tls, db, zDb, SQLITE_FCNTL_PRAGMA, bp+496) if !(rc == SQLITE_OK) { goto __8 } Xsqlite3VdbeSetNumCols(tls, v, 1) Xsqlite3VdbeSetColName(tls, v, 0, COLNAME_NAME, *(*uintptr)(unsafe.Pointer(bp + 496)), libc.UintptrFromInt32(-1)) returnSingleText(tls, v, *(*uintptr)(unsafe.Pointer(bp + 496))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 496))) goto pragma_out __8: ; if !(rc != SQLITE_NOTFOUND) { goto __9 } if !(*(*uintptr)(unsafe.Pointer(bp + 496)) != 0) { goto __10 } Xsqlite3ErrorMsg(tls, pParse, ts+4493, libc.VaList(bp+8, *(*uintptr)(unsafe.Pointer(bp + 496)))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 496))) __10: ; (*Parse)(unsafe.Pointer(pParse)).FnErr++ (*Parse)(unsafe.Pointer(pParse)).Frc = rc goto pragma_out __9: ; pPragma = pragmaLocate(tls, zLeft) if !(pPragma == uintptr(0)) { goto __11 } goto pragma_out __11: ; if !(int32((*PragmaName)(unsafe.Pointer(pPragma)).FmPragFlg)&PragFlg_NeedSchema != 0) { goto __12 } if !(Xsqlite3ReadSchema(tls, pParse) != 0) { goto __13 } goto pragma_out __13: ; __12: ; if !(int32((*PragmaName)(unsafe.Pointer(pPragma)).FmPragFlg)&PragFlg_NoColumns == 0 && (int32((*PragmaName)(unsafe.Pointer(pPragma)).FmPragFlg)&PragFlg_NoColumns1 == 0 || zRight == uintptr(0))) { goto __14 } setPragmaResultColumnNames(tls, v, pPragma) __14: ; switch int32((*PragmaName)(unsafe.Pointer(pPragma)).FePragTyp) { case PragTyp_DEFAULT_CACHE_SIZE: goto __16 case PragTyp_PAGE_SIZE: goto __17 case PragTyp_SECURE_DELETE: goto __18 case PragTyp_PAGE_COUNT: goto __19 case PragTyp_LOCKING_MODE: goto __20 case PragTyp_JOURNAL_MODE: goto __21 case PragTyp_JOURNAL_SIZE_LIMIT: goto __22 case PragTyp_AUTO_VACUUM: goto __23 case PragTyp_INCREMENTAL_VACUUM: goto __24 case PragTyp_CACHE_SIZE: goto __25 case PragTyp_CACHE_SPILL: goto __26 case PragTyp_MMAP_SIZE: goto __27 case PragTyp_TEMP_STORE: goto __28 case PragTyp_TEMP_STORE_DIRECTORY: goto __29 case PragTyp_DATA_STORE_DIRECTORY: goto __30 case PragTyp_SYNCHRONOUS: goto __31 case PragTyp_FLAG: goto __32 case PragTyp_TABLE_INFO: goto __33 case PragTyp_TABLE_LIST: goto __34 case PragTyp_INDEX_INFO: goto __35 case PragTyp_INDEX_LIST: goto __36 case PragTyp_DATABASE_LIST: goto __37 case PragTyp_COLLATION_LIST: goto __38 case PragTyp_FUNCTION_LIST: goto __39 case PragTyp_MODULE_LIST: goto __40 case PragTyp_PRAGMA_LIST: goto __41 case PragTyp_FOREIGN_KEY_LIST: goto __42 case PragTyp_FOREIGN_KEY_CHECK: goto __43 case PragTyp_CASE_SENSITIVE_LIKE: goto __44 case PragTyp_INTEGRITY_CHECK: goto __45 case PragTyp_ENCODING: goto __46 case PragTyp_HEADER_VALUE: goto __47 case PragTyp_COMPILE_OPTIONS: goto __48 case PragTyp_WAL_CHECKPOINT: goto __49 case PragTyp_WAL_AUTOCHECKPOINT: goto __50 case PragTyp_SHRINK_MEMORY: goto __51 case PragTyp_OPTIMIZE: goto __52 default: goto __53 case PragTyp_SOFT_HEAP_LIMIT: goto __54 case PragTyp_HARD_HEAP_LIMIT: goto __55 case PragTyp_THREADS: goto __56 case PragTyp_ANALYSIS_LIMIT: goto __57 } goto __15 __16: Xsqlite3VdbeUsesBtree(tls, v, iDb) if !!(zRight != 0) { goto __58 } *(*int32)(unsafe.Pointer(pParse + 56)) += 2 aOp = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(getCacheSize))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&getCacheSize)), iLn3) if !(0 != 0) { goto __60 } goto __15 __60: ; (*VdbeOp)(unsafe.Pointer(aOp)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp + 1*24)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp + 6*24)).Fp1 = -2000 goto __59 __58: size = Xsqlite3AbsInt32(tls, Xsqlite3Atoi(tls, zRight)) Xsqlite3BeginWriteOperation(tls, pParse, 0, iDb) Xsqlite3VdbeAddOp3(tls, v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, size) (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size = size Xsqlite3BtreeSetCacheSize(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size) __59: ; goto __15 __17: pBt = (*Db)(unsafe.Pointer(pDb)).FpBt if !!(zRight != 0) { goto __61 } if pBt != 0 { size1 = Xsqlite3BtreeGetPageSize(tls, pBt) } else { size1 = 0 } returnSingleInt(tls, v, int64(size1)) goto __62 __61: (*Sqlite3)(unsafe.Pointer(db)).FnextPagesize = Xsqlite3Atoi(tls, zRight) if !(SQLITE_NOMEM == Xsqlite3BtreeSetPageSize(tls, pBt, (*Sqlite3)(unsafe.Pointer(db)).FnextPagesize, 0, 0)) { goto __63 } Xsqlite3OomFault(tls, db) __63: ; __62: ; goto __15 __18: pBt1 = (*Db)(unsafe.Pointer(pDb)).FpBt b = -1 if !(zRight != 0) { goto __64 } if !(Xsqlite3_stricmp(tls, zRight, ts+18916) == 0) { goto __65 } b = 2 goto __66 __65: b = int32(Xsqlite3GetBoolean(tls, zRight, uint8(0))) __66: ; __64: ; if !((*Token)(unsafe.Pointer(pId2)).Fn == uint32(0) && b >= 0) { goto __67 } ii = 0 __68: if !(ii < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __70 } Xsqlite3BtreeSecureDelete(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii)*32)).FpBt, b) goto __69 __69: ii++ goto __68 goto __70 __70: ; __67: ; b = Xsqlite3BtreeSecureDelete(tls, pBt1, b) returnSingleInt(tls, v, int64(b)) goto __15 __19: *(*I64)(unsafe.Pointer(bp + 528)) = int64(0) Xsqlite3CodeVerifySchema(tls, pParse, iDb) iReg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) if !(int32(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(zLeft)))]) == 'p') { goto __71 } Xsqlite3VdbeAddOp2(tls, v, OP_Pagecount, iDb, iReg) goto __72 __71: if !(zRight != 0 && Xsqlite3DecOrHexToI64(tls, zRight, bp+528) == 0) { goto __73 } if !(*(*I64)(unsafe.Pointer(bp + 528)) < int64(0)) { goto __75 } *(*I64)(unsafe.Pointer(bp + 528)) = int64(0) goto __76 __75: if !(*(*I64)(unsafe.Pointer(bp + 528)) > int64(0xfffffffe)) { goto __77 } *(*I64)(unsafe.Pointer(bp + 528)) = int64(0xfffffffe) __77: ; __76: ; goto __74 __73: *(*I64)(unsafe.Pointer(bp + 528)) = int64(0) __74: ; Xsqlite3VdbeAddOp3(tls, v, OP_MaxPgcnt, iDb, iReg, int32(*(*I64)(unsafe.Pointer(bp + 528)))) __72: ; Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, iReg, 1) goto __15 __20: zRet = ts + 18707 eMode = getLockingMode(tls, zRight) if !((*Token)(unsafe.Pointer(pId2)).Fn == uint32(0) && eMode == -1) { goto __78 } eMode = int32((*Sqlite3)(unsafe.Pointer(db)).FdfltLockMode) goto __79 __78: if !((*Token)(unsafe.Pointer(pId2)).Fn == uint32(0)) { goto __80 } ii1 = 2 __81: if !(ii1 < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __83 } pPager = Xsqlite3BtreePager(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii1)*32)).FpBt) Xsqlite3PagerLockingMode(tls, pPager, eMode) goto __82 __82: ii1++ goto __81 goto __83 __83: ; (*Sqlite3)(unsafe.Pointer(db)).FdfltLockMode = U8(eMode) __80: ; pPager = Xsqlite3BtreePager(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) eMode = Xsqlite3PagerLockingMode(tls, pPager, eMode) __79: ; if !(eMode == PAGER_LOCKINGMODE_EXCLUSIVE) { goto __84 } zRet = ts + 5017 __84: ; returnSingleText(tls, v, zRet) goto __15 __21: if !(zRight == uintptr(0)) { goto __85 } eMode1 = -1 goto __86 __85: n = Xsqlite3Strlen30(tls, zRight) eMode1 = 0 __87: if !(libc.AssignUintptr(&zMode, Xsqlite3JournalModename(tls, eMode1)) != uintptr(0)) { goto __89 } if !(Xsqlite3_strnicmp(tls, zRight, zMode, n) == 0) { goto __90 } goto __89 __90: ; goto __88 __88: eMode1++ goto __87 goto __89 __89: ; if !!(zMode != 0) { goto __91 } eMode1 = -1 __91: ; if !(eMode1 == PAGER_JOURNALMODE_OFF && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_Defensive) != uint64(0)) { goto __92 } eMode1 = -1 __92: ; __86: ; if !(eMode1 == -1 && (*Token)(unsafe.Pointer(pId2)).Fn == uint32(0)) { goto __93 } iDb = 0 (*Token)(unsafe.Pointer(pId2)).Fn = uint32(1) __93: ; ii2 = (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1 __94: if !(ii2 >= 0) { goto __96 } if !((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii2)*32)).FpBt != 0 && (ii2 == iDb || (*Token)(unsafe.Pointer(pId2)).Fn == uint32(0))) { goto __97 } Xsqlite3VdbeUsesBtree(tls, v, ii2) Xsqlite3VdbeAddOp3(tls, v, OP_JournalMode, ii2, 1, eMode1) __97: ; goto __95 __95: ii2-- goto __94 goto __96 __96: ; Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, 1, 1) goto __15 __22: pPager1 = Xsqlite3BtreePager(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) *(*I64)(unsafe.Pointer(bp + 536)) = int64(-2) if !(zRight != 0) { goto __98 } Xsqlite3DecOrHexToI64(tls, zRight, bp+536) if !(*(*I64)(unsafe.Pointer(bp + 536)) < int64(-1)) { goto __99 } *(*I64)(unsafe.Pointer(bp + 536)) = int64(-1) __99: ; __98: ; *(*I64)(unsafe.Pointer(bp + 536)) = Xsqlite3PagerJournalSizeLimit(tls, pPager1, *(*I64)(unsafe.Pointer(bp + 536))) returnSingleInt(tls, v, *(*I64)(unsafe.Pointer(bp + 536))) goto __15 __23: pBt2 = (*Db)(unsafe.Pointer(pDb)).FpBt if !!(zRight != 0) { goto __100 } returnSingleInt(tls, v, int64(Xsqlite3BtreeGetAutoVacuum(tls, pBt2))) goto __101 __100: eAuto = getAutoVacuum(tls, zRight) (*Sqlite3)(unsafe.Pointer(db)).FnextAutovac = int8(U8(eAuto)) rc = Xsqlite3BtreeSetAutoVacuum(tls, pBt2, eAuto) if !(rc == SQLITE_OK && (eAuto == 1 || eAuto == 2)) { goto __102 } iAddr = Xsqlite3VdbeCurrentAddr(tls, v) aOp1 = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(setMeta6))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&setMeta6)), iLn4) if !(0 != 0) { goto __103 } goto __15 __103: ; (*VdbeOp)(unsafe.Pointer(aOp1)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp1 + 1*24)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp1 + 2*24)).Fp2 = iAddr + 4 (*VdbeOp)(unsafe.Pointer(aOp1 + 4*24)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp1 + 4*24)).Fp3 = eAuto - 1 Xsqlite3VdbeUsesBtree(tls, v, iDb) __102: ; __101: ; goto __15 __24: *(*int32)(unsafe.Pointer(bp + 544)) = 0 if !(zRight == uintptr(0) || !(Xsqlite3GetInt32(tls, zRight, bp+544) != 0) || *(*int32)(unsafe.Pointer(bp + 544)) <= 0) { goto __104 } *(*int32)(unsafe.Pointer(bp + 544)) = 0x7fffffff __104: ; Xsqlite3BeginWriteOperation(tls, pParse, 0, iDb) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, *(*int32)(unsafe.Pointer(bp + 544)), 1) addr = Xsqlite3VdbeAddOp1(tls, v, OP_IncrVacuum, iDb) Xsqlite3VdbeAddOp1(tls, v, OP_ResultRow, 1) Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, 1, -1) Xsqlite3VdbeAddOp2(tls, v, OP_IfPos, 1, addr) Xsqlite3VdbeJumpHere(tls, v, addr) goto __15 __25: ; if !!(zRight != 0) { goto __105 } returnSingleInt(tls, v, int64((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size)) goto __106 __105: size2 = Xsqlite3Atoi(tls, zRight) (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size = size2 Xsqlite3BtreeSetCacheSize(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size) __106: ; goto __15 __26: ; if !!(zRight != 0) { goto __107 } returnSingleInt(tls, v, func() int64 { if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_CacheSpill) == uint64(0) { return int64(0) } return int64(Xsqlite3BtreeSetSpillSize(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, 0)) }()) goto __108 __107: *(*int32)(unsafe.Pointer(bp + 548)) = 1 if !(Xsqlite3GetInt32(tls, zRight, bp+548) != 0) { goto __109 } Xsqlite3BtreeSetSpillSize(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, *(*int32)(unsafe.Pointer(bp + 548))) __109: ; if !(Xsqlite3GetBoolean(tls, zRight, uint8(libc.Bool32(*(*int32)(unsafe.Pointer(bp + 548)) != 0))) != 0) { goto __110 } *(*U64)(unsafe.Pointer(db + 48)) |= uint64(SQLITE_CacheSpill) goto __111 __110: *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_CacheSpill)) __111: ; setAllPagerFlags(tls, db) __108: ; goto __15 __27: ; if !(zRight != 0) { goto __112 } Xsqlite3DecOrHexToI64(tls, zRight, bp+552) if !(*(*Sqlite3_int64)(unsafe.Pointer(bp + 552)) < int64(0)) { goto __113 } *(*Sqlite3_int64)(unsafe.Pointer(bp + 552)) = Xsqlite3Config.FszMmap __113: ; if !((*Token)(unsafe.Pointer(pId2)).Fn == uint32(0)) { goto __114 } (*Sqlite3)(unsafe.Pointer(db)).FszMmap = *(*Sqlite3_int64)(unsafe.Pointer(bp + 552)) __114: ; ii3 = (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1 __115: if !(ii3 >= 0) { goto __117 } if !((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii3)*32)).FpBt != 0 && (ii3 == iDb || (*Token)(unsafe.Pointer(pId2)).Fn == uint32(0))) { goto __118 } Xsqlite3BtreeSetMmapLimit(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii3)*32)).FpBt, *(*Sqlite3_int64)(unsafe.Pointer(bp + 552))) __118: ; goto __116 __116: ii3-- goto __115 goto __117 __117: ; __112: ; *(*Sqlite3_int64)(unsafe.Pointer(bp + 552)) = int64(-1) rc = Xsqlite3_file_control(tls, db, zDb, SQLITE_FCNTL_MMAP_SIZE, bp+552) if !(rc == SQLITE_OK) { goto __119 } returnSingleInt(tls, v, *(*Sqlite3_int64)(unsafe.Pointer(bp + 552))) goto __120 __119: if !(rc != SQLITE_NOTFOUND) { goto __121 } (*Parse)(unsafe.Pointer(pParse)).FnErr++ (*Parse)(unsafe.Pointer(pParse)).Frc = rc __121: ; __120: ; goto __15 __28: if !!(zRight != 0) { goto __122 } returnSingleInt(tls, v, int64((*Sqlite3)(unsafe.Pointer(db)).Ftemp_store)) goto __123 __122: changeTempStorage(tls, pParse, zRight) __123: ; goto __15 __29: Xsqlite3_mutex_enter(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) if !!(zRight != 0) { goto __124 } returnSingleText(tls, v, Xsqlite3_temp_directory) goto __125 __124: if !(*(*int8)(unsafe.Pointer(zRight)) != 0) { goto __126 } rc = Xsqlite3OsAccess(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, zRight, SQLITE_ACCESS_READWRITE, bp+560) if !(rc != SQLITE_OK || *(*int32)(unsafe.Pointer(bp + 560)) == 0) { goto __127 } Xsqlite3ErrorMsg(tls, pParse, ts+18921, 0) Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) goto pragma_out __127: ; __126: ; if !(SQLITE_TEMP_STORE == 0 || SQLITE_TEMP_STORE == 1 && int32((*Sqlite3)(unsafe.Pointer(db)).Ftemp_store) <= 1 || SQLITE_TEMP_STORE == 2 && int32((*Sqlite3)(unsafe.Pointer(db)).Ftemp_store) == 1) { goto __128 } invalidateTempStorage(tls, pParse) __128: ; Xsqlite3_free(tls, Xsqlite3_temp_directory) if !(*(*int8)(unsafe.Pointer(zRight)) != 0) { goto __129 } Xsqlite3_temp_directory = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+16, zRight)) goto __130 __129: Xsqlite3_temp_directory = uintptr(0) __130: ; __125: ; Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) goto __15 __30: Xsqlite3_mutex_enter(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) if !!(zRight != 0) { goto __131 } returnSingleText(tls, v, Xsqlite3_data_directory) goto __132 __131: if !(*(*int8)(unsafe.Pointer(zRight)) != 0) { goto __133 } rc = Xsqlite3OsAccess(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, zRight, SQLITE_ACCESS_READWRITE, bp+564) if !(rc != SQLITE_OK || *(*int32)(unsafe.Pointer(bp + 564)) == 0) { goto __134 } Xsqlite3ErrorMsg(tls, pParse, ts+18921, 0) Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) goto pragma_out __134: ; __133: ; Xsqlite3_free(tls, Xsqlite3_data_directory) if !(*(*int8)(unsafe.Pointer(zRight)) != 0) { goto __135 } Xsqlite3_data_directory = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+24, zRight)) goto __136 __135: Xsqlite3_data_directory = uintptr(0) __136: ; __132: ; Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_VFS1)) goto __15 __31: if !!(zRight != 0) { goto __137 } returnSingleInt(tls, v, int64(int32((*Db)(unsafe.Pointer(pDb)).Fsafety_level)-1)) goto __138 __137: if !!(int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) != 0) { goto __139 } Xsqlite3ErrorMsg(tls, pParse, ts+18946, 0) goto __140 __139: if !(iDb != 1) { goto __141 } iLevel = (int32(getSafetyLevel(tls, zRight, 0, uint8(1))) + 1) & PAGER_SYNCHRONOUS_MASK if !(iLevel == 0) { goto __142 } iLevel = 1 __142: ; (*Db)(unsafe.Pointer(pDb)).Fsafety_level = U8(iLevel) (*Db)(unsafe.Pointer(pDb)).FbSyncSet = U8(1) setAllPagerFlags(tls, db) __141: ; __140: ; __138: ; goto __15 __32: if !(zRight == uintptr(0)) { goto __143 } setPragmaResultColumnNames(tls, v, pPragma) returnSingleInt(tls, v, int64(libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&(*PragmaName)(unsafe.Pointer(pPragma)).FiArg != uint64(0)))) goto __144 __143: mask = (*PragmaName)(unsafe.Pointer(pPragma)).FiArg if !(int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) == 0) { goto __145 } mask = mask & libc.Uint64FromInt32(libc.CplInt32(SQLITE_ForeignKeys)) __145: ; if !(Xsqlite3GetBoolean(tls, zRight, uint8(0)) != 0) { goto __146 } *(*U64)(unsafe.Pointer(db + 48)) |= mask goto __147 __146: *(*U64)(unsafe.Pointer(db + 48)) &= ^mask if !(mask == uint64(SQLITE_DeferFKs)) { goto __148 } (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons = int64(0) __148: ; if !(mask&uint64(SQLITE_WriteSchema) != uint64(0) && Xsqlite3_stricmp(tls, zRight, ts+18999) == 0) { goto __149 } Xsqlite3ResetAllSchemasOfConnection(tls, db) __149: ; __147: ; Xsqlite3VdbeAddOp0(tls, v, OP_Expire) setAllPagerFlags(tls, db) __144: ; goto __15 __33: if !(zRight != 0) { goto __150 } Xsqlite3CodeVerifyNamedSchema(tls, pParse, zDb) pTab = Xsqlite3LocateTable(tls, pParse, uint32(LOCATE_NOERR), zRight, zDb) if !(pTab != 0) { goto __151 } nHidden = 0 pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) (*Parse)(unsafe.Pointer(pParse)).FnMem = 7 Xsqlite3ViewGetColumnNames(tls, pParse, pTab) i = 0 pCol = (*Table)(unsafe.Pointer(pTab)).FaCol __152: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __154 } isHidden = 0 if !(int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_NOINSERT != 0) { goto __155 } if !((*PragmaName)(unsafe.Pointer(pPragma)).FiArg == uint64(0)) { goto __156 } nHidden++ goto __153 __156: ; if !(int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_VIRTUAL != 0) { goto __157 } isHidden = 2 goto __158 __157: if !(int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_STORED != 0) { goto __159 } isHidden = 3 goto __160 __159: ; isHidden = 1 __160: ; __158: ; __155: ; if !(int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_PRIMKEY == 0) { goto __161 } k = 0 goto __162 __161: if !(pPk == uintptr(0)) { goto __163 } k = 1 goto __164 __163: k = 1 __165: if !(k <= int32((*Table)(unsafe.Pointer(pTab)).FnCol) && int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(k-1)*2))) != i) { goto __167 } goto __166 __166: k++ goto __165 goto __167 __167: ; __164: ; __162: ; pColExpr = Xsqlite3ColumnExpr(tls, pTab, pCol) Xsqlite3VdbeMultiLoad(tls, v, 1, func() uintptr { if (*PragmaName)(unsafe.Pointer(pPragma)).FiArg != 0 { return ts + 19005 } return ts + 19013 }(), libc.VaList(bp+32, i-nHidden, (*Column)(unsafe.Pointer(pCol)).FzCnName, Xsqlite3ColumnType(tls, pCol, ts+1544), func() int32 { if uint32(int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf>>0)) != 0 { return 1 } return 0 }(), func() uintptr { if isHidden >= 2 || pColExpr == uintptr(0) { return uintptr(0) } return *(*uintptr)(unsafe.Pointer(pColExpr + 8)) }(), k, isHidden)) goto __153 __153: i++ pCol += 24 goto __152 goto __154 __154: ; __151: ; __150: ; goto __15 __34: (*Parse)(unsafe.Pointer(pParse)).FnMem = 6 Xsqlite3CodeVerifyNamedSchema(tls, pParse, zDb) ii4 = 0 __168: if !(ii4 < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __170 } if !(zDb != 0 && Xsqlite3_stricmp(tls, zDb, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii4)*32)).FzDbSName) != 0) { goto __171 } goto __169 __171: ; pHash = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii4)*32)).FpSchema + 8 initNCol = int32((*Hash)(unsafe.Pointer(pHash)).Fcount) __172: if !(libc.PostDecInt32(&initNCol, 1) != 0) { goto __173 } k1 = (*Hash)(unsafe.Pointer(pHash)).Ffirst __174: if !(1 != 0) { goto __176 } if !(k1 == uintptr(0)) { goto __177 } initNCol = 0 goto __176 __177: ; pTab1 = (*HashElem)(unsafe.Pointer(k1)).Fdata if !(int32((*Table)(unsafe.Pointer(pTab1)).FnCol) == 0) { goto __178 } zSql = Xsqlite3MPrintf(tls, db, ts+19020, libc.VaList(bp+88, (*Table)(unsafe.Pointer(pTab1)).FzName)) if !(zSql != 0) { goto __179 } *(*uintptr)(unsafe.Pointer(bp + 568)) = uintptr(0) Xsqlite3_prepare(tls, db, zSql, -1, bp+568, uintptr(0)) Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 568))) Xsqlite3DbFree(tls, db, zSql) __179: ; if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __180 } Xsqlite3ErrorMsg(tls, (*Sqlite3)(unsafe.Pointer(db)).FpParse, ts+1480, 0) (*Parse)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FpParse)).Frc = SQLITE_NOMEM __180: ; pHash = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii4)*32)).FpSchema + 8 goto __176 __178: ; goto __175 __175: k1 = (*HashElem)(unsafe.Pointer(k1)).Fnext goto __174 goto __176 __176: ; goto __172 __173: ; k1 = (*Hash)(unsafe.Pointer(pHash)).Ffirst __181: if !(k1 != 0) { goto __183 } pTab2 = (*HashElem)(unsafe.Pointer(k1)).Fdata if !(zRight != 0 && Xsqlite3_stricmp(tls, zRight, (*Table)(unsafe.Pointer(pTab2)).FzName) != 0) { goto __184 } goto __182 __184: ; if !(int32((*Table)(unsafe.Pointer(pTab2)).FeTabType) == TABTYP_VIEW) { goto __185 } zType = ts + 11843 goto __186 __185: if !(int32((*Table)(unsafe.Pointer(pTab2)).FeTabType) == TABTYP_VTAB) { goto __187 } zType = ts + 14073 goto __188 __187: if !((*Table)(unsafe.Pointer(pTab2)).FtabFlags&U32(TF_Shadow) != 0) { goto __189 } zType = ts + 19036 goto __190 __189: zType = ts + 10228 __190: ; __188: ; __186: ; Xsqlite3VdbeMultiLoad(tls, v, 1, ts+19043, libc.VaList(bp+96, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(ii4)*32)).FzDbSName, Xsqlite3PreferredTableName(tls, (*Table)(unsafe.Pointer(pTab2)).FzName), zType, int32((*Table)(unsafe.Pointer(pTab2)).FnCol), libc.Bool32((*Table)(unsafe.Pointer(pTab2)).FtabFlags&U32(TF_WithoutRowid) != U32(0)), libc.Bool32((*Table)(unsafe.Pointer(pTab2)).FtabFlags&U32(TF_Strict) != U32(0)))) goto __182 __182: k1 = (*HashElem)(unsafe.Pointer(k1)).Fnext goto __181 goto __183 __183: ; goto __169 __169: ii4++ goto __168 goto __170 __170: ; goto __15 __35: if !(zRight != 0) { goto __191 } pIdx = Xsqlite3FindIndex(tls, db, zRight, zDb) if !(pIdx == uintptr(0)) { goto __192 } pTab3 = Xsqlite3LocateTable(tls, pParse, uint32(LOCATE_NOERR), zRight, zDb) if !(pTab3 != 0 && !((*Table)(unsafe.Pointer(pTab3)).FtabFlags&U32(TF_WithoutRowid) == U32(0))) { goto __193 } pIdx = Xsqlite3PrimaryKeyIndex(tls, pTab3) __193: ; __192: ; if !(pIdx != 0) { goto __194 } iIdxDb = Xsqlite3SchemaToIndex(tls, db, (*Index)(unsafe.Pointer(pIdx)).FpSchema) if !((*PragmaName)(unsafe.Pointer(pPragma)).FiArg != 0) { goto __195 } mx = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) (*Parse)(unsafe.Pointer(pParse)).FnMem = 6 goto __196 __195: mx = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) (*Parse)(unsafe.Pointer(pParse)).FnMem = 3 __196: ; pTab3 = (*Index)(unsafe.Pointer(pIdx)).FpTable Xsqlite3CodeVerifySchema(tls, pParse, iIdxDb) i1 = 0 __197: if !(i1 < mx) { goto __199 } cnum = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i1)*2)) Xsqlite3VdbeMultiLoad(tls, v, 1, ts+19050, libc.VaList(bp+144, i1, int32(cnum), func() uintptr { if int32(cnum) < 0 { return uintptr(0) } return (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab3)).FaCol + uintptr(cnum)*24)).FzCnName }())) if !((*PragmaName)(unsafe.Pointer(pPragma)).FiArg != 0) { goto __200 } Xsqlite3VdbeMultiLoad(tls, v, 4, ts+19055, libc.VaList(bp+168, int32(*(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSortOrder + uintptr(i1)))), *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(i1)*8)), libc.Bool32(i1 < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)))) __200: ; Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, 1, (*Parse)(unsafe.Pointer(pParse)).FnMem) goto __198 __198: i1++ goto __197 goto __199 __199: ; __194: ; __191: ; goto __15 __36: if !(zRight != 0) { goto __201 } pTab4 = Xsqlite3FindTable(tls, db, zRight, zDb) if !(pTab4 != 0) { goto __202 } iTabDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab4)).FpSchema) (*Parse)(unsafe.Pointer(pParse)).FnMem = 5 Xsqlite3CodeVerifySchema(tls, pParse, iTabDb) pIdx1 = (*Table)(unsafe.Pointer(pTab4)).FpIndex i2 = 0 __203: if !(pIdx1 != 0) { goto __205 } *(*[3]uintptr)(unsafe.Pointer(bp + 576)) = [3]uintptr{ts + 19060, ts + 19062, ts + 17513} Xsqlite3VdbeMultiLoad(tls, v, 1, ts+19064, libc.VaList(bp+192, i2, (*Index)(unsafe.Pointer(pIdx1)).FzName, libc.Bool32(int32((*Index)(unsafe.Pointer(pIdx1)).FonError) != OE_None), *(*uintptr)(unsafe.Pointer(bp + 576 + uintptr(uint32(int32(*(*uint16)(unsafe.Pointer(pIdx1 + 100))&0x3>>0)))*8)), libc.Bool32((*Index)(unsafe.Pointer(pIdx1)).FpPartIdxWhere != uintptr(0)))) goto __204 __204: pIdx1 = (*Index)(unsafe.Pointer(pIdx1)).FpNext i2++ goto __203 goto __205 __205: ; __202: ; __201: ; goto __15 __37: (*Parse)(unsafe.Pointer(pParse)).FnMem = 3 i3 = 0 __206: if !(i3 < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __208 } if !((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i3)*32)).FpBt == uintptr(0)) { goto __209 } goto __207 __209: ; Xsqlite3VdbeMultiLoad(tls, v, 1, ts+19070, libc.VaList(bp+232, i3, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i3)*32)).FzDbSName, Xsqlite3BtreeGetFilename(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i3)*32)).FpBt))) goto __207 __207: i3++ goto __206 goto __208 __208: ; goto __15 __38: i4 = 0 (*Parse)(unsafe.Pointer(pParse)).FnMem = 2 p = (*Hash)(unsafe.Pointer(db + 648)).Ffirst __210: if !(p != 0) { goto __212 } pColl = (*HashElem)(unsafe.Pointer(p)).Fdata Xsqlite3VdbeMultiLoad(tls, v, 1, ts+19074, libc.VaList(bp+256, libc.PostIncInt32(&i4, 1), (*CollSeq)(unsafe.Pointer(pColl)).FzName)) goto __211 __211: p = (*HashElem)(unsafe.Pointer(p)).Fnext goto __210 goto __212 __212: ; goto __15 __39: showInternFunc = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_InternalFunc) != U32(0)) (*Parse)(unsafe.Pointer(pParse)).FnMem = 6 i5 = 0 __213: if !(i5 < SQLITE_FUNC_HASH_SZ) { goto __215 } p1 = *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&Xsqlite3BuiltinFunctions)) + uintptr(i5)*8)) __216: if !(p1 != 0) { goto __218 } pragmaFunclistLine(tls, v, p1, 1, showInternFunc) goto __217 __217: p1 = *(*uintptr)(unsafe.Pointer(p1 + 64)) goto __216 goto __218 __218: ; goto __214 __214: i5++ goto __213 goto __215 __215: ; j = (*Hash)(unsafe.Pointer(db + 624)).Ffirst __219: if !(j != 0) { goto __221 } p1 = (*HashElem)(unsafe.Pointer(j)).Fdata pragmaFunclistLine(tls, v, p1, 0, showInternFunc) goto __220 __220: j = (*HashElem)(unsafe.Pointer(j)).Fnext goto __219 goto __221 __221: ; goto __15 __40: (*Parse)(unsafe.Pointer(pParse)).FnMem = 1 j1 = (*Hash)(unsafe.Pointer(db + 576)).Ffirst __222: if !(j1 != 0) { goto __224 } pMod = (*HashElem)(unsafe.Pointer(j1)).Fdata Xsqlite3VdbeMultiLoad(tls, v, 1, ts+8869, libc.VaList(bp+272, (*Module)(unsafe.Pointer(pMod)).FzName)) goto __223 __223: j1 = (*HashElem)(unsafe.Pointer(j1)).Fnext goto __222 goto __224 __224: ; goto __15 __41: i6 = 0 __225: if !(i6 < int32(uint64(unsafe.Sizeof(aPragmaName))/uint64(unsafe.Sizeof(PragmaName{})))) { goto __227 } Xsqlite3VdbeMultiLoad(tls, v, 1, ts+8869, libc.VaList(bp+280, aPragmaName[i6].FzName)) goto __226 __226: i6++ goto __225 goto __227 __227: ; goto __15 __42: if !(zRight != 0) { goto __228 } pTab5 = Xsqlite3FindTable(tls, db, zRight, zDb) if !(pTab5 != 0 && int32((*Table)(unsafe.Pointer(pTab5)).FeTabType) == TABTYP_NORM) { goto __229 } pFK = *(*uintptr)(unsafe.Pointer(pTab5 + 64 + 8)) if !(pFK != 0) { goto __230 } iTabDb1 = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab5)).FpSchema) i7 = 0 (*Parse)(unsafe.Pointer(pParse)).FnMem = 8 Xsqlite3CodeVerifySchema(tls, pParse, iTabDb1) __231: if !(pFK != 0) { goto __232 } j2 = 0 __233: if !(j2 < (*FKey)(unsafe.Pointer(pFK)).FnCol) { goto __235 } Xsqlite3VdbeMultiLoad(tls, v, 1, ts+19077, libc.VaList(bp+288, i7, j2, (*FKey)(unsafe.Pointer(pFK)).FzTo, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab5)).FaCol+uintptr((*sColMap)(unsafe.Pointer(pFK+64+uintptr(j2)*16)).FiFrom)*24)).FzCnName, (*sColMap)(unsafe.Pointer(pFK+64+uintptr(j2)*16)).FzCol, actionName(tls, *(*U8)(unsafe.Pointer(pFK + 45 + 1))), actionName(tls, *(*U8)(unsafe.Pointer(pFK + 45))), ts+19086)) goto __234 __234: j2++ goto __233 goto __235 __235: ; i7++ pFK = (*FKey)(unsafe.Pointer(pFK)).FpNextFrom goto __231 __232: ; __230: ; __229: ; __228: ; goto __15 __43: regResult = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += 4 regRow = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) k2 = (*Hash)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema + 8)).Ffirst __236: if !(k2 != 0) { goto __237 } if !(zRight != 0) { goto __238 } pTab6 = Xsqlite3LocateTable(tls, pParse, uint32(0), zRight, zDb) k2 = uintptr(0) goto __239 __238: pTab6 = (*HashElem)(unsafe.Pointer(k2)).Fdata k2 = (*HashElem)(unsafe.Pointer(k2)).Fnext __239: ; if !(pTab6 == uintptr(0) || !(int32((*Table)(unsafe.Pointer(pTab6)).FeTabType) == TABTYP_NORM) || *(*uintptr)(unsafe.Pointer(pTab6 + 64 + 8)) == uintptr(0)) { goto __240 } goto __236 __240: ; iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab6)).FpSchema) zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName Xsqlite3CodeVerifySchema(tls, pParse, iDb) Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab6)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pTab6)).FzName) if !(int32((*Table)(unsafe.Pointer(pTab6)).FnCol)+regRow > (*Parse)(unsafe.Pointer(pParse)).FnMem) { goto __241 } (*Parse)(unsafe.Pointer(pParse)).FnMem = int32((*Table)(unsafe.Pointer(pTab6)).FnCol) + regRow __241: ; Xsqlite3OpenTable(tls, pParse, 0, iDb, pTab6, OP_OpenRead) Xsqlite3VdbeLoadString(tls, v, regResult, (*Table)(unsafe.Pointer(pTab6)).FzName) i8 = 1 pFK1 = *(*uintptr)(unsafe.Pointer(pTab6 + 64 + 8)) __242: if !(pFK1 != 0) { goto __244 } pParent = Xsqlite3FindTable(tls, db, (*FKey)(unsafe.Pointer(pFK1)).FzTo, zDb) if !(pParent == uintptr(0)) { goto __245 } goto __243 __245: ; *(*uintptr)(unsafe.Pointer(bp + 600)) = uintptr(0) Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pParent)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pParent)).FzName) x1 = Xsqlite3FkLocateIndex(tls, pParse, pParent, pFK1, bp+600, uintptr(0)) if !(x1 == 0) { goto __246 } if !(*(*uintptr)(unsafe.Pointer(bp + 600)) == uintptr(0)) { goto __248 } Xsqlite3OpenTable(tls, pParse, i8, iDb, pParent, OP_OpenRead) goto __249 __248: Xsqlite3VdbeAddOp3(tls, v, OP_OpenRead, i8, int32((*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 600)))).Ftnum), iDb) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 600))) __249: ; goto __247 __246: k2 = uintptr(0) goto __244 __247: ; goto __243 __243: i8++ pFK1 = (*FKey)(unsafe.Pointer(pFK1)).FpNextFrom goto __242 goto __244 __244: ; if !(pFK1 != 0) { goto __250 } goto __237 __250: ; if !((*Parse)(unsafe.Pointer(pParse)).FnTab < i8) { goto __251 } (*Parse)(unsafe.Pointer(pParse)).FnTab = i8 __251: ; addrTop = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, 0) i8 = 1 pFK1 = *(*uintptr)(unsafe.Pointer(pTab6 + 64 + 8)) __252: if !(pFK1 != 0) { goto __254 } pParent = Xsqlite3FindTable(tls, db, (*FKey)(unsafe.Pointer(pFK1)).FzTo, zDb) *(*uintptr)(unsafe.Pointer(bp + 600)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 608)) = uintptr(0) if !(pParent != 0) { goto __255 } x1 = Xsqlite3FkLocateIndex(tls, pParse, pParent, pFK1, bp+600, bp+608) __255: ; addrOk = Xsqlite3VdbeMakeLabel(tls, pParse) if !(regRow+(*FKey)(unsafe.Pointer(pFK1)).FnCol > (*Parse)(unsafe.Pointer(pParse)).FnMem) { goto __256 } (*Parse)(unsafe.Pointer(pParse)).FnMem = regRow + (*FKey)(unsafe.Pointer(pFK1)).FnCol __256: ; j3 = 0 __257: if !(j3 < (*FKey)(unsafe.Pointer(pFK1)).FnCol) { goto __259 } if *(*uintptr)(unsafe.Pointer(bp + 608)) != 0 { iCol = *(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 608)) + uintptr(j3)*4)) } else { iCol = (*sColMap)(unsafe.Pointer(pFK1 + 64 + uintptr(j3)*16)).FiFrom } Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab6, 0, iCol, regRow+j3) Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regRow+j3, addrOk) goto __258 __258: j3++ goto __257 goto __259 __259: ; if !(*(*uintptr)(unsafe.Pointer(bp + 600)) != 0) { goto __260 } Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, regRow, (*FKey)(unsafe.Pointer(pFK1)).FnCol, 0, Xsqlite3IndexAffinityStr(tls, db, *(*uintptr)(unsafe.Pointer(bp + 600))), (*FKey)(unsafe.Pointer(pFK1)).FnCol) Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, i8, addrOk, regRow, (*FKey)(unsafe.Pointer(pFK1)).FnCol) goto __261 __260: if !(pParent != 0) { goto __262 } jmp = Xsqlite3VdbeCurrentAddr(tls, v) + 2 Xsqlite3VdbeAddOp3(tls, v, OP_SeekRowid, i8, jmp, regRow) Xsqlite3VdbeGoto(tls, v, addrOk) __262: ; __261: ; if !((*Table)(unsafe.Pointer(pTab6)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __263 } Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, 0, regResult+1) goto __264 __263: Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regResult+1) __264: ; Xsqlite3VdbeMultiLoad(tls, v, regResult+2, ts+19091, libc.VaList(bp+352, (*FKey)(unsafe.Pointer(pFK1)).FzTo, i8-1)) Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, regResult, 4) Xsqlite3VdbeResolveLabel(tls, v, addrOk) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 608))) goto __253 __253: i8++ pFK1 = (*FKey)(unsafe.Pointer(pFK1)).FpNextFrom goto __252 goto __254 __254: ; Xsqlite3VdbeAddOp2(tls, v, OP_Next, 0, addrTop+1) Xsqlite3VdbeJumpHere(tls, v, addrTop) goto __236 __237: ; goto __15 __44: if !(zRight != 0) { goto __265 } Xsqlite3RegisterLikeFunctions(tls, db, int32(Xsqlite3GetBoolean(tls, zRight, uint8(0)))) __265: ; goto __15 __45: pObjTab = uintptr(0) isQuick = libc.Bool32(int32(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(zLeft)))]) == 'q') if !((*Token)(unsafe.Pointer(pId2)).Fz == uintptr(0)) { goto __266 } iDb = -1 __266: ; (*Parse)(unsafe.Pointer(pParse)).FnMem = 6 *(*int32)(unsafe.Pointer(bp + 616)) = SQLITE_INTEGRITY_CHECK_ERROR_MAX if !(zRight != 0) { goto __267 } if !(Xsqlite3GetInt32(tls, zRight, bp+616) != 0) { goto __268 } if !(*(*int32)(unsafe.Pointer(bp + 616)) <= 0) { goto __270 } *(*int32)(unsafe.Pointer(bp + 616)) = SQLITE_INTEGRITY_CHECK_ERROR_MAX __270: ; goto __269 __268: pObjTab = Xsqlite3LocateTable(tls, pParse, uint32(0), zRight, func() uintptr { if iDb >= 0 { return (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName } return uintptr(0) }()) __269: ; __267: ; Xsqlite3VdbeAddOp2(tls, v, OP_Integer, *(*int32)(unsafe.Pointer(bp + 616))-1, 1) i9 = 0 __271: if !(i9 < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __273 } cnt = 0 mxIdx = 0 if !(0 != 0 && i9 == 1) { goto __274 } goto __272 __274: ; if !(iDb >= 0 && i9 != iDb) { goto __275 } goto __272 __275: ; Xsqlite3CodeVerifySchema(tls, pParse, i9) pTbls = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i9)*32)).FpSchema + 8 cnt = 0 x2 = (*Hash)(unsafe.Pointer(pTbls)).Ffirst __276: if !(x2 != 0) { goto __278 } pTab7 = (*HashElem)(unsafe.Pointer(x2)).Fdata if !(pObjTab != 0 && pObjTab != pTab7) { goto __279 } goto __277 __279: ; if !((*Table)(unsafe.Pointer(pTab7)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __280 } cnt++ __280: ; nIdx = 0 pIdx3 = (*Table)(unsafe.Pointer(pTab7)).FpIndex __281: if !(pIdx3 != 0) { goto __283 } cnt++ goto __282 __282: pIdx3 = (*Index)(unsafe.Pointer(pIdx3)).FpNext nIdx++ goto __281 goto __283 __283: ; if !(nIdx > mxIdx) { goto __284 } mxIdx = nIdx __284: ; goto __277 __277: x2 = (*HashElem)(unsafe.Pointer(x2)).Fnext goto __276 goto __278 __278: ; if !(cnt == 0) { goto __285 } goto __272 __285: ; if !(pObjTab != 0) { goto __286 } cnt++ __286: ; aRoot = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(int32(0)))*uint64(cnt+1)) if !(aRoot == uintptr(0)) { goto __287 } goto __273 __287: ; cnt = 0 if !(pObjTab != 0) { goto __288 } *(*int32)(unsafe.Pointer(aRoot + uintptr(libc.PreIncInt32(&cnt, 1))*4)) = 0 __288: ; x2 = (*Hash)(unsafe.Pointer(pTbls)).Ffirst __289: if !(x2 != 0) { goto __291 } pTab8 = (*HashElem)(unsafe.Pointer(x2)).Fdata if !(pObjTab != 0 && pObjTab != pTab8) { goto __292 } goto __290 __292: ; if !((*Table)(unsafe.Pointer(pTab8)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __293 } *(*int32)(unsafe.Pointer(aRoot + uintptr(libc.PreIncInt32(&cnt, 1))*4)) = int32((*Table)(unsafe.Pointer(pTab8)).Ftnum) __293: ; pIdx4 = (*Table)(unsafe.Pointer(pTab8)).FpIndex __294: if !(pIdx4 != 0) { goto __296 } *(*int32)(unsafe.Pointer(aRoot + uintptr(libc.PreIncInt32(&cnt, 1))*4)) = int32((*Index)(unsafe.Pointer(pIdx4)).Ftnum) goto __295 __295: pIdx4 = (*Index)(unsafe.Pointer(pIdx4)).FpNext goto __294 goto __296 __296: ; goto __290 __290: x2 = (*HashElem)(unsafe.Pointer(x2)).Fnext goto __289 goto __291 __291: ; *(*int32)(unsafe.Pointer(aRoot)) = cnt (*Parse)(unsafe.Pointer(pParse)).FnMem = func() int32 { if (*Parse)(unsafe.Pointer(pParse)).FnMem > 8+mxIdx { return (*Parse)(unsafe.Pointer(pParse)).FnMem } return 8 + mxIdx }() Xsqlite3ClearTempRegCache(tls, pParse) Xsqlite3VdbeAddOp4(tls, v, OP_IntegrityCk, 2, cnt, 1, aRoot, -14) Xsqlite3VdbeChangeP5(tls, v, uint16(U8(i9))) addr1 = Xsqlite3VdbeAddOp1(tls, v, OP_IsNull, 2) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, 3, 0, Xsqlite3MPrintf(tls, db, ts+19095, libc.VaList(bp+368, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i9)*32)).FzDbSName)), -6) Xsqlite3VdbeAddOp3(tls, v, OP_Concat, 2, 3, 3) integrityCheckResultRow(tls, v) Xsqlite3VdbeJumpHere(tls, v, addr1) x2 = (*Hash)(unsafe.Pointer(pTbls)).Ffirst __297: if !(x2 != 0) { goto __299 } pTab9 = (*HashElem)(unsafe.Pointer(x2)).Fdata pPrior = uintptr(0) r1 = -1 if !!(int32((*Table)(unsafe.Pointer(pTab9)).FeTabType) == TABTYP_NORM) { goto __300 } goto __298 __300: ; if !(pObjTab != 0 && pObjTab != pTab9) { goto __301 } goto __298 __301: ; if !(isQuick != 0 || (*Table)(unsafe.Pointer(pTab9)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __302 } pPk1 = uintptr(0) r2 = 0 goto __303 __302: pPk1 = Xsqlite3PrimaryKeyIndex(tls, pTab9) r2 = Xsqlite3GetTempRange(tls, pParse, int32((*Index)(unsafe.Pointer(pPk1)).FnKeyCol)) Xsqlite3VdbeAddOp3(tls, v, OP_Null, 1, r2, r2+int32((*Index)(unsafe.Pointer(pPk1)).FnKeyCol)-1) __303: ; Xsqlite3OpenTableAndIndices(tls, pParse, pTab9, OP_OpenRead, uint8(0), 1, uintptr(0), bp+620, bp+624) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, 7) j4 = 0 pIdx5 = (*Table)(unsafe.Pointer(pTab9)).FpIndex __304: if !(pIdx5 != 0) { goto __306 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, 8+j4) goto __305 __305: pIdx5 = (*Index)(unsafe.Pointer(pIdx5)).FpNext j4++ goto __304 goto __306 __306: ; Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, *(*int32)(unsafe.Pointer(bp + 620)), 0) loopTop = Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, 7, 1) if !((*Table)(unsafe.Pointer(pTab9)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __307 } mxCol = -1 j4 = 0 __309: if !(j4 < int32((*Table)(unsafe.Pointer(pTab9)).FnCol)) { goto __311 } if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab9)).FaCol+uintptr(j4)*24)).FcolFlags)&COLFLAG_VIRTUAL == 0) { goto __312 } mxCol++ __312: ; goto __310 __310: j4++ goto __309 goto __311 __311: ; if !(mxCol == int32((*Table)(unsafe.Pointer(pTab9)).FiPKey)) { goto __313 } mxCol-- __313: ; goto __308 __307: mxCol = int32((*Index)(unsafe.Pointer(Xsqlite3PrimaryKeyIndex(tls, pTab9))).FnColumn) - 1 __308: ; if !(mxCol >= 0) { goto __314 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, *(*int32)(unsafe.Pointer(bp + 620)), mxCol, 3) Xsqlite3VdbeTypeofColumn(tls, v, 3) __314: ; if !!(isQuick != 0) { goto __315 } if !(pPk1 != 0) { goto __316 } a1 = Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxGT, *(*int32)(unsafe.Pointer(bp + 620)), 0, r2, int32((*Index)(unsafe.Pointer(pPk1)).FnKeyCol)) Xsqlite3VdbeAddOp1(tls, v, OP_IsNull, r2) zErr = Xsqlite3MPrintf(tls, db, ts+19119, libc.VaList(bp+376, (*Table)(unsafe.Pointer(pTab9)).FzName)) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, 3, 0, zErr, -6) integrityCheckResultRow(tls, v) Xsqlite3VdbeJumpHere(tls, v, a1) Xsqlite3VdbeJumpHere(tls, v, a1+1) j4 = 0 __317: if !(j4 < int32((*Index)(unsafe.Pointer(pPk1)).FnKeyCol)) { goto __319 } Xsqlite3ExprCodeLoadIndexColumn(tls, pParse, pPk1, *(*int32)(unsafe.Pointer(bp + 620)), j4, r2+j4) goto __318 __318: j4++ goto __317 goto __319 __319: ; __316: ; __315: ; bStrict = libc.Bool32((*Table)(unsafe.Pointer(pTab9)).FtabFlags&U32(TF_Strict) != U32(0)) j4 = 0 __320: if !(j4 < int32((*Table)(unsafe.Pointer(pTab9)).FnCol)) { goto __322 } pCol1 = (*Table)(unsafe.Pointer(pTab9)).FaCol + uintptr(j4)*24 if !(j4 == int32((*Table)(unsafe.Pointer(pTab9)).FiPKey)) { goto __323 } goto __321 __323: ; if !(bStrict != 0) { goto __324 } doTypeCheck = libc.Bool32(int32(*(*uint8)(unsafe.Pointer(pCol1 + 8))&0xf0>>4) > COLTYPE_ANY) goto __325 __324: doTypeCheck = libc.Bool32(int32((*Column)(unsafe.Pointer(pCol1)).Faffinity) > SQLITE_AFF_BLOB) __325: ; if !(int32(*(*uint8)(unsafe.Pointer(pCol1 + 8))&0xf>>0) == 0 && !(doTypeCheck != 0)) { goto __326 } goto __321 __326: ; p4 = SQLITE_NULL if !(int32((*Column)(unsafe.Pointer(pCol1)).FcolFlags)&COLFLAG_VIRTUAL != 0) { goto __327 } Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab9, *(*int32)(unsafe.Pointer(bp + 620)), j4, 3) p11 = -1 p3 = 3 goto __328 __327: if !((*Column)(unsafe.Pointer(pCol1)).FiDflt != 0) { goto __329 } *(*uintptr)(unsafe.Pointer(bp + 632)) = uintptr(0) Xsqlite3ValueFromExpr(tls, db, Xsqlite3ColumnExpr(tls, pTab9, pCol1), (*Sqlite3)(unsafe.Pointer(db)).Fenc, uint8((*Column)(unsafe.Pointer(pCol1)).Faffinity), bp+632) if !(*(*uintptr)(unsafe.Pointer(bp + 632)) != 0) { goto __330 } p4 = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp + 632))) Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp + 632))) __330: ; __329: ; p11 = *(*int32)(unsafe.Pointer(bp + 620)) if !!((*Table)(unsafe.Pointer(pTab9)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __331 } p3 = int32(Xsqlite3TableColumnToIndex(tls, Xsqlite3PrimaryKeyIndex(tls, pTab9), int16(j4))) goto __332 __331: p3 = int32(Xsqlite3TableColumnToStorage(tls, pTab9, int16(j4))) __332: ; __328: ; labelError = Xsqlite3VdbeMakeLabel(tls, pParse) labelOk = Xsqlite3VdbeMakeLabel(tls, pParse) if !(uint32(int32(*(*uint8)(unsafe.Pointer(pCol1 + 8))&0xf>>0)) != 0) { goto __333 } jmp2 = Xsqlite3VdbeAddOp4Int(tls, v, OP_IsType, p11, labelOk, p3, p4) Xsqlite3VdbeChangeP5(tls, v, uint16(0x0f)) zErr1 = Xsqlite3MPrintf(tls, db, ts+19155, libc.VaList(bp+384, (*Table)(unsafe.Pointer(pTab9)).FzName, (*Column)(unsafe.Pointer(pCol1)).FzCnName)) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, 3, 0, zErr1, -6) if !(doTypeCheck != 0) { goto __334 } Xsqlite3VdbeGoto(tls, v, labelError) Xsqlite3VdbeJumpHere(tls, v, jmp2) goto __335 __334: ; __335: ; __333: ; if !(bStrict != 0 && doTypeCheck != 0) { goto __336 } Xsqlite3VdbeAddOp4Int(tls, v, OP_IsType, p11, labelOk, p3, p4) Xsqlite3VdbeChangeP5(tls, v, uint16(aStdTypeMask[(int32(*(*uint8)(unsafe.Pointer(pCol1 + 8))&0xf0>>4)-1)&0xf<<28>>28])) zErr1 = Xsqlite3MPrintf(tls, db, ts+19175, libc.VaList(bp+400, Xsqlite3StdType[(int32(*(*uint8)(unsafe.Pointer(pCol1 + 8))&0xf0>>4)-1)&0xf<<28>>28], (*Table)(unsafe.Pointer(pTab9)).FzName, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab9)).FaCol+uintptr(j4)*24)).FzCnName)) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, 3, 0, zErr1, -6) goto __337 __336: if !(!(bStrict != 0) && int32((*Column)(unsafe.Pointer(pCol1)).Faffinity) == SQLITE_AFF_TEXT) { goto __338 } Xsqlite3VdbeAddOp4Int(tls, v, OP_IsType, p11, labelOk, p3, p4) Xsqlite3VdbeChangeP5(tls, v, uint16(0x1c)) zErr1 = Xsqlite3MPrintf(tls, db, ts+19197, libc.VaList(bp+424, (*Table)(unsafe.Pointer(pTab9)).FzName, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab9)).FaCol+uintptr(j4)*24)).FzCnName)) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, 3, 0, zErr1, -6) goto __339 __338: if !(!(bStrict != 0) && int32((*Column)(unsafe.Pointer(pCol1)).Faffinity) >= SQLITE_AFF_NUMERIC) { goto __340 } Xsqlite3VdbeAddOp4Int(tls, v, OP_IsType, p11, labelOk, p3, p4) Xsqlite3VdbeChangeP5(tls, v, uint16(0x1b)) if !(p11 >= 0) { goto __341 } Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab9, *(*int32)(unsafe.Pointer(bp + 620)), j4, 3) __341: ; Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, 3, 1, 0, ts+19220, -1) Xsqlite3VdbeAddOp4Int(tls, v, OP_IsType, -1, labelOk, 3, p4) Xsqlite3VdbeChangeP5(tls, v, uint16(0x1c)) zErr1 = Xsqlite3MPrintf(tls, db, ts+19222, libc.VaList(bp+440, (*Table)(unsafe.Pointer(pTab9)).FzName, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab9)).FaCol+uintptr(j4)*24)).FzCnName)) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, 3, 0, zErr1, -6) __340: ; __339: ; __337: ; Xsqlite3VdbeResolveLabel(tls, v, labelError) integrityCheckResultRow(tls, v) Xsqlite3VdbeResolveLabel(tls, v, labelOk) goto __321 __321: j4++ goto __320 goto __322 __322: ; if !((*Table)(unsafe.Pointer(pTab9)).FpCheck != 0 && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_IgnoreChecks) == uint64(0)) { goto __342 } pCheck = Xsqlite3ExprListDup(tls, db, (*Table)(unsafe.Pointer(pTab9)).FpCheck, 0) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0) { goto __343 } addrCkFault = Xsqlite3VdbeMakeLabel(tls, pParse) addrCkOk = Xsqlite3VdbeMakeLabel(tls, pParse) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = *(*int32)(unsafe.Pointer(bp + 620)) + 1 k3 = (*ExprList)(unsafe.Pointer(pCheck)).FnExpr - 1 __344: if !(k3 > 0) { goto __346 } Xsqlite3ExprIfFalse(tls, pParse, (*ExprList_item)(unsafe.Pointer(pCheck+8+uintptr(k3)*32)).FpExpr, addrCkFault, 0) goto __345 __345: k3-- goto __344 goto __346 __346: ; Xsqlite3ExprIfTrue(tls, pParse, (*ExprList_item)(unsafe.Pointer(pCheck+8)).FpExpr, addrCkOk, SQLITE_JUMPIFNULL) Xsqlite3VdbeResolveLabel(tls, v, addrCkFault) (*Parse)(unsafe.Pointer(pParse)).FiSelfTab = 0 zErr2 = Xsqlite3MPrintf(tls, db, ts+19242, libc.VaList(bp+456, (*Table)(unsafe.Pointer(pTab9)).FzName)) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, 3, 0, zErr2, -6) integrityCheckResultRow(tls, v) Xsqlite3VdbeResolveLabel(tls, v, addrCkOk) __343: ; Xsqlite3ExprListDelete(tls, db, pCheck) __342: ; if !!(isQuick != 0) { goto __347 } j4 = 0 pIdx5 = (*Table)(unsafe.Pointer(pTab9)).FpIndex __348: if !(pIdx5 != 0) { goto __350 } ckUniq = Xsqlite3VdbeMakeLabel(tls, pParse) if !(pPk1 == pIdx5) { goto __351 } goto __349 __351: ; r1 = Xsqlite3GenerateIndexKey(tls, pParse, pIdx5, *(*int32)(unsafe.Pointer(bp + 620)), 0, 0, bp+640, pPrior, r1) pPrior = pIdx5 Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, 8+j4, 1) jmp21 = Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, *(*int32)(unsafe.Pointer(bp + 624))+j4, ckUniq, r1, int32((*Index)(unsafe.Pointer(pIdx5)).FnColumn)) Xsqlite3VdbeLoadString(tls, v, 3, ts+19272) Xsqlite3VdbeAddOp3(tls, v, OP_Concat, 7, 3, 3) Xsqlite3VdbeLoadString(tls, v, 4, ts+19277) Xsqlite3VdbeAddOp3(tls, v, OP_Concat, 4, 3, 3) jmp5 = Xsqlite3VdbeLoadString(tls, v, 4, (*Index)(unsafe.Pointer(pIdx5)).FzName) Xsqlite3VdbeAddOp3(tls, v, OP_Concat, 4, 3, 3) jmp4 = integrityCheckResultRow(tls, v) Xsqlite3VdbeJumpHere(tls, v, jmp21) if !((*Table)(unsafe.Pointer(pTab9)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __352 } Xsqlite3VdbeAddOp2(tls, v, OP_IdxRowid, *(*int32)(unsafe.Pointer(bp + 624))+j4, 3) jmp7 = Xsqlite3VdbeAddOp3(tls, v, OP_Eq, 3, 0, r1+int32((*Index)(unsafe.Pointer(pIdx5)).FnColumn)-1) Xsqlite3VdbeLoadString(tls, v, 3, ts+19298) Xsqlite3VdbeAddOp3(tls, v, OP_Concat, 7, 3, 3) Xsqlite3VdbeLoadString(tls, v, 4, ts+19334) Xsqlite3VdbeGoto(tls, v, jmp5-1) Xsqlite3VdbeJumpHere(tls, v, jmp7) __352: ; label6 = 0 kk = 0 __353: if !(kk < int32((*Index)(unsafe.Pointer(pIdx5)).FnKeyCol)) { goto __355 } if !(*(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx5)).FazColl + uintptr(kk)*8)) == uintptr(unsafe.Pointer(&Xsqlite3StrBINARY))) { goto __356 } goto __354 __356: ; if !(label6 == 0) { goto __357 } label6 = Xsqlite3VdbeMakeLabel(tls, pParse) __357: ; Xsqlite3VdbeAddOp3(tls, v, OP_Column, *(*int32)(unsafe.Pointer(bp + 624))+j4, kk, 3) Xsqlite3VdbeAddOp3(tls, v, OP_Ne, 3, label6, r1+kk) goto __354 __354: kk++ goto __353 goto __355 __355: ; if !(label6 != 0) { goto __358 } jmp6 = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) Xsqlite3VdbeResolveLabel(tls, v, label6) Xsqlite3VdbeLoadString(tls, v, 3, ts+19272) Xsqlite3VdbeAddOp3(tls, v, OP_Concat, 7, 3, 3) Xsqlite3VdbeLoadString(tls, v, 4, ts+19345) Xsqlite3VdbeGoto(tls, v, jmp5-1) Xsqlite3VdbeJumpHere(tls, v, jmp6) __358: ; if !(int32((*Index)(unsafe.Pointer(pIdx5)).FonError) != OE_None) { goto __359 } uniqOk = Xsqlite3VdbeMakeLabel(tls, pParse) kk = 0 __360: if !(kk < int32((*Index)(unsafe.Pointer(pIdx5)).FnKeyCol)) { goto __362 } iCol1 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx5)).FaiColumn + uintptr(kk)*2))) if !(iCol1 >= 0 && uint32(int32(*(*uint8)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab9)).FaCol + uintptr(iCol1)*24 + 8))&0xf>>0)) != 0) { goto __363 } goto __361 __363: ; Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, r1+kk, uniqOk) goto __361 __361: kk++ goto __360 goto __362 __362: ; jmp61 = Xsqlite3VdbeAddOp1(tls, v, OP_Next, *(*int32)(unsafe.Pointer(bp + 624))+j4) Xsqlite3VdbeGoto(tls, v, uniqOk) Xsqlite3VdbeJumpHere(tls, v, jmp61) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxGT, *(*int32)(unsafe.Pointer(bp + 624))+j4, uniqOk, r1, int32((*Index)(unsafe.Pointer(pIdx5)).FnKeyCol)) Xsqlite3VdbeLoadString(tls, v, 3, ts+19372) Xsqlite3VdbeGoto(tls, v, jmp5) Xsqlite3VdbeResolveLabel(tls, v, uniqOk) __359: ; Xsqlite3VdbeJumpHere(tls, v, jmp4) Xsqlite3ResolvePartIdxLabel(tls, pParse, *(*int32)(unsafe.Pointer(bp + 640))) goto __349 __349: pIdx5 = (*Index)(unsafe.Pointer(pIdx5)).FpNext j4++ goto __348 goto __350 __350: ; __347: ; Xsqlite3VdbeAddOp2(tls, v, OP_Next, *(*int32)(unsafe.Pointer(bp + 620)), loopTop) Xsqlite3VdbeJumpHere(tls, v, loopTop-1) if !!(isQuick != 0) { goto __364 } Xsqlite3VdbeLoadString(tls, v, 2, ts+19399) j4 = 0 pIdx5 = (*Table)(unsafe.Pointer(pTab9)).FpIndex __365: if !(pIdx5 != 0) { goto __367 } if !(pPk1 == pIdx5) { goto __368 } goto __366 __368: ; Xsqlite3VdbeAddOp2(tls, v, OP_Count, *(*int32)(unsafe.Pointer(bp + 624))+j4, 3) addr1 = Xsqlite3VdbeAddOp3(tls, v, OP_Eq, 8+j4, 0, 3) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NOTNULL)) Xsqlite3VdbeLoadString(tls, v, 4, (*Index)(unsafe.Pointer(pIdx5)).FzName) Xsqlite3VdbeAddOp3(tls, v, OP_Concat, 4, 2, 3) integrityCheckResultRow(tls, v) Xsqlite3VdbeJumpHere(tls, v, addr1) goto __366 __366: pIdx5 = (*Index)(unsafe.Pointer(pIdx5)).FpNext j4++ goto __365 goto __367 __367: ; if !(pPk1 != 0) { goto __369 } Xsqlite3ReleaseTempRange(tls, pParse, r2, int32((*Index)(unsafe.Pointer(pPk1)).FnKeyCol)) __369: ; __364: ; goto __298 __298: x2 = (*HashElem)(unsafe.Pointer(x2)).Fnext goto __297 goto __299 __299: ; goto __272 __272: i9++ goto __271 goto __273 __273: ; aOp2 = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(endCode))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&endCode)), iLn5) if !(aOp2 != 0) { goto __370 } (*VdbeOp)(unsafe.Pointer(aOp2)).Fp2 = 1 - *(*int32)(unsafe.Pointer(bp + 616)) (*VdbeOp)(unsafe.Pointer(aOp2 + 2*24)).Fp4type = int8(-1) *(*uintptr)(unsafe.Pointer(aOp2 + 2*24 + 16)) = ts + 19428 (*VdbeOp)(unsafe.Pointer(aOp2 + 5*24)).Fp4type = int8(-1) *(*uintptr)(unsafe.Pointer(aOp2 + 5*24 + 16)) = Xsqlite3ErrStr(tls, SQLITE_CORRUPT) __370: ; Xsqlite3VdbeChangeP3(tls, v, 0, Xsqlite3VdbeCurrentAddr(tls, v)-2) goto __15 __46: if !!(zRight != 0) { goto __371 } if !(Xsqlite3ReadSchema(tls, pParse) != 0) { goto __373 } goto pragma_out __373: ; returnSingleText(tls, v, encnames1[(*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fenc].FzName) goto __372 __371: if !((*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_EncodingFixed) == U32(0)) { goto __374 } pEnc = uintptr(unsafe.Pointer(&encnames1)) __375: if !((*EncName)(unsafe.Pointer(pEnc)).FzName != 0) { goto __377 } if !(0 == Xsqlite3StrICmp(tls, zRight, (*EncName)(unsafe.Pointer(pEnc)).FzName)) { goto __378 } if (*EncName)(unsafe.Pointer(pEnc)).Fenc != 0 { enc = (*EncName)(unsafe.Pointer(pEnc)).Fenc } else { enc = uint8(SQLITE_UTF16LE) } (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema)).Fenc = enc Xsqlite3SetTextEncoding(tls, db, enc) goto __377 __378: ; goto __376 __376: pEnc += 16 goto __375 goto __377 __377: ; if !!(int32((*EncName)(unsafe.Pointer(pEnc)).FzName) != 0) { goto __379 } Xsqlite3ErrorMsg(tls, pParse, ts+19431, libc.VaList(bp+464, zRight)) __379: ; __374: ; __372: ; goto __15 __47: iCookie = int32((*PragmaName)(unsafe.Pointer(pPragma)).FiArg) Xsqlite3VdbeUsesBtree(tls, v, iDb) if !(zRight != 0 && int32((*PragmaName)(unsafe.Pointer(pPragma)).FmPragFlg)&PragFlg_ReadOnly == 0) { goto __380 } aOp3 = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(setCookie))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&setCookie)), 0) if !(0 != 0) { goto __382 } goto __15 __382: ; (*VdbeOp)(unsafe.Pointer(aOp3)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp3 + 1*24)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp3 + 1*24)).Fp2 = iCookie (*VdbeOp)(unsafe.Pointer(aOp3 + 1*24)).Fp3 = Xsqlite3Atoi(tls, zRight) (*VdbeOp)(unsafe.Pointer(aOp3 + 1*24)).Fp5 = U16(1) if !(iCookie == BTREE_SCHEMA_VERSION && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_Defensive) != uint64(0)) { goto __383 } (*VdbeOp)(unsafe.Pointer(aOp3 + 1*24)).Fopcode = U8(OP_Noop) __383: ; goto __381 __380: ; aOp4 = Xsqlite3VdbeAddOpList(tls, v, int32(uint64(unsafe.Sizeof(readCookie))/uint64(unsafe.Sizeof(VdbeOpList{}))), uintptr(unsafe.Pointer(&readCookie)), 0) if !(0 != 0) { goto __384 } goto __15 __384: ; (*VdbeOp)(unsafe.Pointer(aOp4)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp4 + 1*24)).Fp1 = iDb (*VdbeOp)(unsafe.Pointer(aOp4 + 1*24)).Fp3 = iCookie Xsqlite3VdbeReusable(tls, v) __381: ; goto __15 __48: i10 = 0 (*Parse)(unsafe.Pointer(pParse)).FnMem = 1 __385: if !(libc.AssignUintptr(&zOpt, Xsqlite3_compileoption_get(tls, libc.PostIncInt32(&i10, 1))) != uintptr(0)) { goto __386 } Xsqlite3VdbeLoadString(tls, v, 1, zOpt) Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, 1, 1) goto __385 __386: ; Xsqlite3VdbeReusable(tls, v) goto __15 __49: iBt = func() int32 { if (*Token)(unsafe.Pointer(pId2)).Fz != 0 { return iDb } return SQLITE_MAX_ATTACHED + 2 }() eMode2 = SQLITE_CHECKPOINT_PASSIVE if !(zRight != 0) { goto __387 } if !(Xsqlite3StrICmp(tls, zRight, ts+18714) == 0) { goto __388 } eMode2 = SQLITE_CHECKPOINT_FULL goto __389 __388: if !(Xsqlite3StrICmp(tls, zRight, ts+19456) == 0) { goto __390 } eMode2 = SQLITE_CHECKPOINT_RESTART goto __391 __390: if !(Xsqlite3StrICmp(tls, zRight, ts+18867) == 0) { goto __392 } eMode2 = SQLITE_CHECKPOINT_TRUNCATE __392: ; __391: ; __389: ; __387: ; (*Parse)(unsafe.Pointer(pParse)).FnMem = 3 Xsqlite3VdbeAddOp3(tls, v, OP_Checkpoint, iBt, eMode2, 1) Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, 1, 3) goto __15 __50: if !(zRight != 0) { goto __393 } Xsqlite3_wal_autocheckpoint(tls, db, Xsqlite3Atoi(tls, zRight)) __393: ; returnSingleInt(tls, v, func() int64 { if (*Sqlite3)(unsafe.Pointer(db)).FxWalCallback == *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32) int32 }{Xsqlite3WalDefaultHook})) { return int64(int32((*Sqlite3)(unsafe.Pointer(db)).FpWalArg)) } return int64(0) }()) goto __15 __51: Xsqlite3_db_release_memory(tls, db) goto __15 __52: if !(zRight != 0) { goto __394 } opMask = U32(Xsqlite3Atoi(tls, zRight)) if !(opMask&U32(0x02) == U32(0)) { goto __396 } goto __15 __396: ; goto __395 __394: opMask = U32(0xfffe) __395: ; iTabCur = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) iDbLast = func() int32 { if zDb != 0 { return iDb } return (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1 }() __397: if !(iDb <= iDbLast) { goto __399 } if !(iDb == 1) { goto __400 } goto __398 __400: ; Xsqlite3CodeVerifySchema(tls, pParse, iDb) pSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema k4 = (*Hash)(unsafe.Pointer(pSchema + 8)).Ffirst __401: if !(k4 != 0) { goto __403 } pTab10 = (*HashElem)(unsafe.Pointer(k4)).Fdata if !((*Table)(unsafe.Pointer(pTab10)).FtabFlags&U32(TF_StatsUsed) == U32(0)) { goto __404 } goto __402 __404: ; szThreshold = LogEst(int32((*Table)(unsafe.Pointer(pTab10)).FnRowLogEst) + 46) pIdx6 = (*Table)(unsafe.Pointer(pTab10)).FpIndex __405: if !(pIdx6 != 0) { goto __407 } if !!(int32(*(*uint16)(unsafe.Pointer(pIdx6 + 100))&0x80>>7) != 0) { goto __408 } szThreshold = int16(0) goto __407 __408: ; goto __406 __406: pIdx6 = (*Index)(unsafe.Pointer(pIdx6)).FpNext goto __405 goto __407 __407: ; if !(szThreshold != 0) { goto __409 } Xsqlite3OpenTable(tls, pParse, iTabCur, iDb, pTab10, OP_OpenRead) Xsqlite3VdbeAddOp3(tls, v, OP_IfSmaller, iTabCur, int32(U32(Xsqlite3VdbeCurrentAddr(tls, v)+2)+opMask&U32(1)), int32(szThreshold)) __409: ; zSubSql = Xsqlite3MPrintf(tls, db, ts+19464, libc.VaList(bp+472, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, (*Table)(unsafe.Pointer(pTab10)).FzName)) if !(opMask&U32(0x01) != 0) { goto __410 } r11 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, r11, 0, zSubSql, -6) Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, r11, 1) goto __411 __410: Xsqlite3VdbeAddOp4(tls, v, OP_SqlExec, 0, 0, 0, zSubSql, -6) __411: ; goto __402 __402: k4 = (*HashElem)(unsafe.Pointer(k4)).Fnext goto __401 goto __403 __403: ; goto __398 __398: iDb++ goto __397 goto __399 __399: ; Xsqlite3VdbeAddOp0(tls, v, OP_Expire) goto __15 __53: ; if !(zRight != 0) { goto __412 } Xsqlite3_busy_timeout(tls, db, Xsqlite3Atoi(tls, zRight)) __412: ; returnSingleInt(tls, v, int64((*Sqlite3)(unsafe.Pointer(db)).FbusyTimeout)) goto __15 __54: if !(zRight != 0 && Xsqlite3DecOrHexToI64(tls, zRight, bp+648) == SQLITE_OK) { goto __413 } Xsqlite3_soft_heap_limit64(tls, *(*Sqlite3_int64)(unsafe.Pointer(bp + 648))) __413: ; returnSingleInt(tls, v, Xsqlite3_soft_heap_limit64(tls, int64(-1))) goto __15 __55: if !(zRight != 0 && Xsqlite3DecOrHexToI64(tls, zRight, bp+656) == SQLITE_OK) { goto __414 } iPrior = Xsqlite3_hard_heap_limit64(tls, int64(-1)) if !(*(*Sqlite3_int64)(unsafe.Pointer(bp + 656)) > int64(0) && (iPrior == int64(0) || iPrior > *(*Sqlite3_int64)(unsafe.Pointer(bp + 656)))) { goto __415 } Xsqlite3_hard_heap_limit64(tls, *(*Sqlite3_int64)(unsafe.Pointer(bp + 656))) __415: ; __414: ; returnSingleInt(tls, v, Xsqlite3_hard_heap_limit64(tls, int64(-1))) goto __15 __56: if !(zRight != 0 && Xsqlite3DecOrHexToI64(tls, zRight, bp+664) == SQLITE_OK && *(*Sqlite3_int64)(unsafe.Pointer(bp + 664)) >= int64(0)) { goto __416 } Xsqlite3_limit(tls, db, SQLITE_LIMIT_WORKER_THREADS, int32(*(*Sqlite3_int64)(unsafe.Pointer(bp + 664))&int64(0x7fffffff))) __416: ; returnSingleInt(tls, v, int64(Xsqlite3_limit(tls, db, SQLITE_LIMIT_WORKER_THREADS, -1))) goto __15 __57: if !(zRight != 0 && Xsqlite3DecOrHexToI64(tls, zRight, bp+672) == SQLITE_OK && *(*Sqlite3_int64)(unsafe.Pointer(bp + 672)) >= int64(0)) { goto __417 } (*Sqlite3)(unsafe.Pointer(db)).FnAnalysisLimit = int32(*(*Sqlite3_int64)(unsafe.Pointer(bp + 672)) & int64(0x7fffffff)) __417: ; returnSingleInt(tls, v, int64((*Sqlite3)(unsafe.Pointer(db)).FnAnalysisLimit)) goto __15 __15: ; if !(int32((*PragmaName)(unsafe.Pointer(pPragma)).FmPragFlg)&PragFlg_NoColumns1 != 0 && zRight != 0) { goto __418 } __418: ; pragma_out: Xsqlite3DbFree(tls, db, zLeft) Xsqlite3DbFree(tls, db, zRight) } type EncName = struct { FzName uintptr Fenc U8 F__ccgo_pad1 [7]byte } var iLn3 int32 = 0 var getCacheSize = [9]VdbeOpList{ {Fopcode: U8(OP_Transaction)}, {Fopcode: U8(OP_ReadCookie), Fp2: int8(1), Fp3: int8(BTREE_DEFAULT_CACHE_SIZE)}, {Fopcode: U8(OP_IfPos), Fp1: int8(1), Fp2: int8(8)}, {Fopcode: U8(OP_Integer), Fp2: int8(2)}, {Fopcode: U8(OP_Subtract), Fp1: int8(1), Fp2: int8(2), Fp3: int8(1)}, {Fopcode: U8(OP_IfPos), Fp1: int8(1), Fp2: int8(8)}, {Fopcode: U8(OP_Integer), Fp2: int8(1)}, {Fopcode: U8(OP_Noop)}, {Fopcode: U8(OP_ResultRow), Fp1: int8(1), Fp2: int8(1)}, } var iLn4 int32 = 0 var setMeta6 = [5]VdbeOpList{ {Fopcode: U8(OP_Transaction), Fp2: int8(1)}, {Fopcode: U8(OP_ReadCookie), Fp2: int8(1), Fp3: int8(BTREE_LARGEST_ROOT_PAGE)}, {Fopcode: U8(OP_If), Fp1: int8(1)}, {Fopcode: U8(OP_Halt), Fp2: int8(OE_Abort)}, {Fopcode: U8(OP_SetCookie), Fp2: int8(BTREE_INCR_VACUUM)}, } var aStdTypeMask = [6]uint8{ uint8(0x1f), uint8(0x18), uint8(0x11), uint8(0x11), uint8(0x13), uint8(0x14), } var iLn5 int32 = 0 var endCode = [7]VdbeOpList{ {Fopcode: U8(OP_AddImm), Fp1: int8(1)}, {Fopcode: U8(OP_IfNotZero), Fp1: int8(1), Fp2: int8(4)}, {Fopcode: U8(OP_String8), Fp2: int8(3)}, {Fopcode: U8(OP_ResultRow), Fp1: int8(3), Fp2: int8(1)}, {Fopcode: U8(OP_Halt)}, {Fopcode: U8(OP_String8), Fp2: int8(3)}, {Fopcode: U8(OP_Goto), Fp2: int8(3)}, } var encnames1 = [9]EncName{ {FzName: ts + 19482, Fenc: U8(SQLITE_UTF8)}, {FzName: ts + 19487, Fenc: U8(SQLITE_UTF8)}, {FzName: ts + 19493, Fenc: U8(SQLITE_UTF16LE)}, {FzName: ts + 19502, Fenc: U8(SQLITE_UTF16BE)}, {FzName: ts + 19511, Fenc: U8(SQLITE_UTF16LE)}, {FzName: ts + 19519, Fenc: U8(SQLITE_UTF16BE)}, {FzName: ts + 19527}, {FzName: ts + 19534}, {}, } var setCookie = [2]VdbeOpList{ {Fopcode: U8(OP_Transaction), Fp2: int8(1)}, {Fopcode: U8(OP_SetCookie)}, } var readCookie = [3]VdbeOpList{ {Fopcode: U8(OP_Transaction)}, {Fopcode: U8(OP_ReadCookie), Fp2: int8(1)}, {Fopcode: U8(OP_ResultRow), Fp1: int8(1), Fp2: int8(1)}, } // **************************************************************************** // // Implementation of an eponymous virtual table that runs a pragma. type PragmaVtab1 = struct { Fbase Sqlite3_vtab Fdb uintptr FpName uintptr FnHidden U8 FiHidden U8 F__ccgo_pad1 [6]byte } // **************************************************************************** // // Implementation of an eponymous virtual table that runs a pragma. type PragmaVtab = PragmaVtab1 type PragmaVtabCursor1 = struct { Fbase Sqlite3_vtab_cursor FpPragma uintptr FiRowid Sqlite_int64 FazArg [2]uintptr } type PragmaVtabCursor = PragmaVtabCursor1 func pragmaVtabConnect(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { bp := tls.Alloc(264) defer tls.Free(264) var pPragma uintptr = pAux var pTab uintptr = uintptr(0) var rc int32 var i int32 var j int32 var cSep int8 = int8('(') _ = argc _ = argv Xsqlite3StrAccumInit(tls, bp+32, uintptr(0), bp+64, int32(unsafe.Sizeof([200]int8{})), 0) Xsqlite3_str_appendall(tls, bp+32, ts+19540) i = 0 j = int32((*PragmaName)(unsafe.Pointer(pPragma)).FiPragCName) __1: if !(i < int32((*PragmaName)(unsafe.Pointer(pPragma)).FnPragCName)) { goto __3 } { Xsqlite3_str_appendf(tls, bp+32, ts+19555, libc.VaList(bp, int32(cSep), pragCName[j])) cSep = int8(',') } goto __2 __2: i++ j++ goto __1 goto __3 __3: ; if i == 0 { Xsqlite3_str_appendf(tls, bp+32, ts+19562, libc.VaList(bp+16, (*PragmaName)(unsafe.Pointer(pPragma)).FzName)) i++ } j = 0 if int32((*PragmaName)(unsafe.Pointer(pPragma)).FmPragFlg)&PragFlg_Result1 != 0 { Xsqlite3_str_appendall(tls, bp+32, ts+19568) j++ } if int32((*PragmaName)(unsafe.Pointer(pPragma)).FmPragFlg)&(PragFlg_SchemaOpt|PragFlg_SchemaReq) != 0 { Xsqlite3_str_appendall(tls, bp+32, ts+19580) j++ } Xsqlite3_str_append(tls, bp+32, ts+6309, 1) Xsqlite3StrAccumFinish(tls, bp+32) rc = Xsqlite3_declare_vtab(tls, db, bp+64) if rc == SQLITE_OK { pTab = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(PragmaVtab{}))) if pTab == uintptr(0) { rc = SQLITE_NOMEM } else { libc.Xmemset(tls, pTab, 0, uint64(unsafe.Sizeof(PragmaVtab{}))) (*PragmaVtab)(unsafe.Pointer(pTab)).FpName = pPragma (*PragmaVtab)(unsafe.Pointer(pTab)).Fdb = db (*PragmaVtab)(unsafe.Pointer(pTab)).FiHidden = U8(i) (*PragmaVtab)(unsafe.Pointer(pTab)).FnHidden = U8(j) } } else { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+24, Xsqlite3_errmsg(tls, db))) } *(*uintptr)(unsafe.Pointer(ppVtab)) = pTab return rc } func pragmaVtabDisconnect(tls *libc.TLS, pVtab uintptr) int32 { var pTab uintptr = pVtab Xsqlite3_free(tls, pTab) return SQLITE_OK } func pragmaVtabBestIndex(tls *libc.TLS, tab uintptr, pIdxInfo uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pTab uintptr = tab var pConstraint uintptr var i int32 var j int32 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = float64(1) if int32((*PragmaVtab)(unsafe.Pointer(pTab)).FnHidden) == 0 { return SQLITE_OK } pConstraint = (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint *(*int32)(unsafe.Pointer(bp)) = 0 *(*int32)(unsafe.Pointer(bp + 1*4)) = 0 i = 0 __1: if !(i < (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint) { goto __3 } { if int32((*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).Fusable) == 0 { goto __2 } if int32((*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).Fop) != SQLITE_INDEX_CONSTRAINT_EQ { goto __2 } if (*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).FiColumn < int32((*PragmaVtab)(unsafe.Pointer(pTab)).FiHidden) { goto __2 } j = (*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).FiColumn - int32((*PragmaVtab)(unsafe.Pointer(pTab)).FiHidden) *(*int32)(unsafe.Pointer(bp + uintptr(j)*4)) = i + 1 } goto __2 __2: i++ pConstraint += 12 goto __1 goto __3 __3: ; if *(*int32)(unsafe.Pointer(bp)) == 0 { (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = float64(2147483647) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = int64(2147483647) return SQLITE_OK } j = *(*int32)(unsafe.Pointer(bp)) - 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(j)*8)).FargvIndex = 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(j)*8)).Fomit = uint8(1) if *(*int32)(unsafe.Pointer(bp + 1*4)) == 0 { return SQLITE_OK } (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = float64(20) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = int64(20) j = *(*int32)(unsafe.Pointer(bp + 1*4)) - 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(j)*8)).FargvIndex = 2 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(j)*8)).Fomit = uint8(1) return SQLITE_OK } func pragmaVtabOpen(tls *libc.TLS, pVtab uintptr, ppCursor uintptr) int32 { var pCsr uintptr pCsr = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(PragmaVtabCursor{}))) if pCsr == uintptr(0) { return SQLITE_NOMEM } libc.Xmemset(tls, pCsr, 0, uint64(unsafe.Sizeof(PragmaVtabCursor{}))) (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab = pVtab *(*uintptr)(unsafe.Pointer(ppCursor)) = pCsr return SQLITE_OK } func pragmaVtabCursorClear(tls *libc.TLS, pCsr uintptr) { var i int32 Xsqlite3_finalize(tls, (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FpPragma) (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FpPragma = uintptr(0) for i = 0; i < int32(uint64(unsafe.Sizeof([2]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0)))); i++ { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(pCsr + 24 + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer(pCsr + 24 + uintptr(i)*8)) = uintptr(0) } } func pragmaVtabClose(tls *libc.TLS, cur uintptr) int32 { var pCsr uintptr = cur pragmaVtabCursorClear(tls, pCsr) Xsqlite3_free(tls, pCsr) return SQLITE_OK } func pragmaVtabNext(tls *libc.TLS, pVtabCursor uintptr) int32 { var pCsr uintptr = pVtabCursor var rc int32 = SQLITE_OK (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FiRowid++ if SQLITE_ROW != Xsqlite3_step(tls, (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FpPragma) { rc = Xsqlite3_finalize(tls, (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FpPragma) (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FpPragma = uintptr(0) pragmaVtabCursorClear(tls, pCsr) } return rc } func pragmaVtabFilter(tls *libc.TLS, pVtabCursor uintptr, idxNum int32, idxStr uintptr, argc int32, argv uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var pCsr uintptr = pVtabCursor var pTab uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pVtabCursor)).FpVtab var rc int32 var i int32 var j int32 var zSql uintptr _ = idxNum _ = idxStr pragmaVtabCursorClear(tls, pCsr) if int32((*PragmaName)(unsafe.Pointer((*PragmaVtab)(unsafe.Pointer(pTab)).FpName)).FmPragFlg)&PragFlg_Result1 != 0 { j = 0 } else { j = 1 } i = 0 __1: if !(i < argc) { goto __3 } { var zText uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) if zText != 0 { *(*uintptr)(unsafe.Pointer(pCsr + 24 + uintptr(j)*8)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, zText)) if *(*uintptr)(unsafe.Pointer(pCsr + 24 + uintptr(j)*8)) == uintptr(0) { return SQLITE_NOMEM } } } goto __2 __2: i++ j++ goto __1 goto __3 __3: ; Xsqlite3StrAccumInit(tls, bp+32, uintptr(0), uintptr(0), 0, *(*int32)(unsafe.Pointer((*PragmaVtab)(unsafe.Pointer(pTab)).Fdb + 136 + 1*4))) Xsqlite3_str_appendall(tls, bp+32, ts+19595) if *(*uintptr)(unsafe.Pointer(pCsr + 24 + 1*8)) != 0 { Xsqlite3_str_appendf(tls, bp+32, ts+19603, libc.VaList(bp+8, *(*uintptr)(unsafe.Pointer(pCsr + 24 + 1*8)))) } Xsqlite3_str_appendall(tls, bp+32, (*PragmaName)(unsafe.Pointer((*PragmaVtab)(unsafe.Pointer(pTab)).FpName)).FzName) if *(*uintptr)(unsafe.Pointer(pCsr + 24)) != 0 { Xsqlite3_str_appendf(tls, bp+32, ts+19607, libc.VaList(bp+16, *(*uintptr)(unsafe.Pointer(pCsr + 24)))) } zSql = Xsqlite3StrAccumFinish(tls, bp+32) if zSql == uintptr(0) { return SQLITE_NOMEM } rc = Xsqlite3_prepare_v2(tls, (*PragmaVtab)(unsafe.Pointer(pTab)).Fdb, zSql, -1, pCsr+8, uintptr(0)) Xsqlite3_free(tls, zSql) if rc != SQLITE_OK { (*PragmaVtab)(unsafe.Pointer(pTab)).Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+24, Xsqlite3_errmsg(tls, (*PragmaVtab)(unsafe.Pointer(pTab)).Fdb))) return rc } return pragmaVtabNext(tls, pVtabCursor) } func pragmaVtabEof(tls *libc.TLS, pVtabCursor uintptr) int32 { var pCsr uintptr = pVtabCursor return libc.Bool32((*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FpPragma == uintptr(0)) } func pragmaVtabColumn(tls *libc.TLS, pVtabCursor uintptr, ctx uintptr, i int32) int32 { var pCsr uintptr = pVtabCursor var pTab uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pVtabCursor)).FpVtab if i < int32((*PragmaVtab)(unsafe.Pointer(pTab)).FiHidden) { Xsqlite3_result_value(tls, ctx, Xsqlite3_column_value(tls, (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FpPragma, i)) } else { Xsqlite3_result_text(tls, ctx, *(*uintptr)(unsafe.Pointer(pCsr + 24 + uintptr(i-int32((*PragmaVtab)(unsafe.Pointer(pTab)).FiHidden))*8)), -1, libc.UintptrFromInt32(-1)) } return SQLITE_OK } func pragmaVtabRowid(tls *libc.TLS, pVtabCursor uintptr, p uintptr) int32 { var pCsr uintptr = pVtabCursor *(*Sqlite_int64)(unsafe.Pointer(p)) = (*PragmaVtabCursor)(unsafe.Pointer(pCsr)).FiRowid return SQLITE_OK } var pragmaVtabModule = Sqlite3_module{ FxConnect: 0, FxBestIndex: 0, FxDisconnect: 0, FxOpen: 0, FxClose: 0, FxFilter: 0, FxNext: 0, FxEof: 0, FxColumn: 0, FxRowid: 0, } // Check to see if zTabName is really the name of a pragma. If it is, // then register an eponymous virtual table for that pragma and return // a pointer to the Module object for the new virtual table. func Xsqlite3PragmaVtabRegister(tls *libc.TLS, db uintptr, zName uintptr) uintptr { var pName uintptr pName = pragmaLocate(tls, zName+uintptr(7)) if pName == uintptr(0) { return uintptr(0) } if int32((*PragmaName)(unsafe.Pointer(pName)).FmPragFlg)&(PragFlg_Result0|PragFlg_Result1) == 0 { return uintptr(0) } return Xsqlite3VtabCreateModule(tls, db, zName, uintptr(unsafe.Pointer(&pragmaVtabModule)), pName, uintptr(0)) } func corruptSchema(tls *libc.TLS, pData uintptr, azObj uintptr, zExtra uintptr) { bp := tls.Alloc(56) defer tls.Free(56) var db uintptr = (*InitData)(unsafe.Pointer(pData)).Fdb if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*InitData)(unsafe.Pointer(pData)).Frc = SQLITE_NOMEM } else if *(*uintptr)(unsafe.Pointer((*InitData)(unsafe.Pointer(pData)).FpzErrMsg)) != uintptr(0) { } else if (*InitData)(unsafe.Pointer(pData)).FmInitFlags&U32(INITFLAG_AlterMask) != 0 { *(*uintptr)(unsafe.Pointer((*InitData)(unsafe.Pointer(pData)).FpzErrMsg)) = Xsqlite3MPrintf(tls, db, ts+19611, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(azObj)), *(*uintptr)(unsafe.Pointer(azObj + 1*8)), azAlterType[(*InitData)(unsafe.Pointer(pData)).FmInitFlags&U32(INITFLAG_AlterMask)-U32(1)], zExtra)) (*InitData)(unsafe.Pointer(pData)).Frc = SQLITE_ERROR } else if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_WriteSchema) != 0 { (*InitData)(unsafe.Pointer(pData)).Frc = Xsqlite3CorruptError(tls, 137249) } else { var z uintptr var zObj uintptr if *(*uintptr)(unsafe.Pointer(azObj + 1*8)) != 0 { zObj = *(*uintptr)(unsafe.Pointer(azObj + 1*8)) } else { zObj = ts + 6360 } z = Xsqlite3MPrintf(tls, db, ts+19639, libc.VaList(bp+32, zObj)) if zExtra != 0 && *(*int8)(unsafe.Pointer(zExtra)) != 0 { z = Xsqlite3MPrintf(tls, db, ts+19670, libc.VaList(bp+40, z, zExtra)) } *(*uintptr)(unsafe.Pointer((*InitData)(unsafe.Pointer(pData)).FpzErrMsg)) = z (*InitData)(unsafe.Pointer(pData)).Frc = Xsqlite3CorruptError(tls, 137256) } } var azAlterType = [3]uintptr{ ts + 19678, ts + 19685, ts + 19697, } // Check to see if any sibling index (another index on the same table) // of pIndex has the same root page number, and if it does, return true. // This would indicate a corrupt schema. func Xsqlite3IndexHasDuplicateRootPage(tls *libc.TLS, pIndex uintptr) int32 { var p uintptr for p = (*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FpTable)).FpIndex; p != 0; p = (*Index)(unsafe.Pointer(p)).FpNext { if (*Index)(unsafe.Pointer(p)).Ftnum == (*Index)(unsafe.Pointer(pIndex)).Ftnum && p != pIndex { return 1 } } return 0 } // This is the callback routine for the code that initializes the // database. See sqlite3Init() below for additional information. // This routine is also called from the OP_ParseSchema opcode of the VDBE. // // Each callback contains the following information: // // argv[0] = type of object: "table", "index", "trigger", or "view". // argv[1] = name of thing being created // argv[2] = associated table if an index or trigger // argv[3] = root page number for table or index. 0 for trigger or view. // argv[4] = SQL text for the CREATE statement. func Xsqlite3InitCallback(tls *libc.TLS, pInit uintptr, argc int32, argv uintptr, NotUsed uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pData uintptr = pInit var db uintptr = (*InitData)(unsafe.Pointer(pData)).Fdb var iDb int32 = (*InitData)(unsafe.Pointer(pData)).FiDb _ = NotUsed _ = argc *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_EncodingFixed) if argv == uintptr(0) { return 0 } (*InitData)(unsafe.Pointer(pData)).FnInitRow++ if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { corruptSchema(tls, pData, argv, uintptr(0)) return 1 } if *(*uintptr)(unsafe.Pointer(argv + 3*8)) == uintptr(0) { corruptSchema(tls, pData, argv, uintptr(0)) } else if *(*uintptr)(unsafe.Pointer(argv + 4*8)) != 0 && 'c' == int32(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(argv + 4*8)))))]) && 'r' == int32(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(argv + 4*8)) + 1)))]) { var rc int32 var saved_iDb U8 = (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(iDb) if Xsqlite3GetUInt32(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8)), db+192) == 0 || (*Sqlite3)(unsafe.Pointer(db)).Finit.FnewTnum > (*InitData)(unsafe.Pointer(pData)).FmxPage && (*InitData)(unsafe.Pointer(pData)).FmxPage > Pgno(0) { if Xsqlite3Config.FbExtraSchemaChecks != 0 { corruptSchema(tls, pData, argv, ts+15497) } } libc.SetBitFieldPtr8Uint32(db+192+8, uint32(0), 0, 0x1) (*Sqlite3)(unsafe.Pointer(db)).Finit.FazInit = argv *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) sqlite3Prepare(tls, db, *(*uintptr)(unsafe.Pointer(argv + 4*8)), -1, uint32(0), uintptr(0), bp, uintptr(0)) rc = (*Sqlite3)(unsafe.Pointer(db)).FerrCode (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = saved_iDb if SQLITE_OK != rc { if uint32(int32(*(*uint8)(unsafe.Pointer(db + 192 + 8))&0x1>>0)) != 0 { } else { if rc > (*InitData)(unsafe.Pointer(pData)).Frc { (*InitData)(unsafe.Pointer(pData)).Frc = rc } if rc == SQLITE_NOMEM { Xsqlite3OomFault(tls, db) } else if rc != SQLITE_INTERRUPT && rc&0xFF != SQLITE_LOCKED { corruptSchema(tls, pData, argv, Xsqlite3_errmsg(tls, db)) } } } (*Sqlite3)(unsafe.Pointer(db)).Finit.FazInit = uintptr(unsafe.Pointer(&Xsqlite3StdType)) Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) } else if *(*uintptr)(unsafe.Pointer(argv + 1*8)) == uintptr(0) || *(*uintptr)(unsafe.Pointer(argv + 4*8)) != uintptr(0) && int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(argv + 4*8))))) != 0 { corruptSchema(tls, pData, argv, uintptr(0)) } else { var pIndex uintptr pIndex = Xsqlite3FindIndex(tls, db, *(*uintptr)(unsafe.Pointer(argv + 1*8)), (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) if pIndex == uintptr(0) { corruptSchema(tls, pData, argv, ts+19708) } else if Xsqlite3GetUInt32(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8)), pIndex+88) == 0 || (*Index)(unsafe.Pointer(pIndex)).Ftnum < Pgno(2) || (*Index)(unsafe.Pointer(pIndex)).Ftnum > (*InitData)(unsafe.Pointer(pData)).FmxPage || Xsqlite3IndexHasDuplicateRootPage(tls, pIndex) != 0 { if Xsqlite3Config.FbExtraSchemaChecks != 0 { corruptSchema(tls, pData, argv, ts+15497) } } } return 0 } // Attempt to read the database schema and initialize internal // data structures for a single database file. The index of the // database file is given by iDb. iDb==0 is used for the main // database. iDb==1 should never be used. iDb>=2 is used for // auxiliary databases. Return one of the SQLITE_ error codes to // indicate success or failure. func Xsqlite3InitOne(tls *libc.TLS, db uintptr, iDb int32, pzErrMsg uintptr, mFlags U32) int32 { bp := tls.Alloc(124) defer tls.Free(124) var rc int32 var i int32 var size int32 var pDb uintptr var zSchemaTabName uintptr var openedTransaction int32 var mask int32 var encoding U8 var xAuth Sqlite3_xauth var zSql uintptr openedTransaction = 0 mask = int32((*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_EncodingFixed) | libc.Uint32FromInt32(libc.CplInt32(DBFLAG_EncodingFixed))) (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy = U8(1) *(*uintptr)(unsafe.Pointer(bp + 16)) = ts + 10228 *(*uintptr)(unsafe.Pointer(bp + 16 + 1*8)) = libc.AssignUintptr(&zSchemaTabName, func() uintptr { if !(0 != 0) && iDb == 1 { return ts + 7741 } return ts + 7235 }()) *(*uintptr)(unsafe.Pointer(bp + 16 + 2*8)) = *(*uintptr)(unsafe.Pointer(bp + 16 + 1*8)) *(*uintptr)(unsafe.Pointer(bp + 16 + 3*8)) = ts + 9290 *(*uintptr)(unsafe.Pointer(bp + 16 + 4*8)) = ts + 19721 *(*uintptr)(unsafe.Pointer(bp + 16 + 5*8)) = uintptr(0) (*InitData)(unsafe.Pointer(bp + 64)).Fdb = db (*InitData)(unsafe.Pointer(bp + 64)).FiDb = iDb (*InitData)(unsafe.Pointer(bp + 64)).Frc = SQLITE_OK (*InitData)(unsafe.Pointer(bp + 64)).FpzErrMsg = pzErrMsg (*InitData)(unsafe.Pointer(bp + 64)).FmInitFlags = mFlags (*InitData)(unsafe.Pointer(bp + 64)).FnInitRow = U32(0) (*InitData)(unsafe.Pointer(bp + 64)).FmxPage = Pgno(0) Xsqlite3InitCallback(tls, bp+64, 5, bp+16, uintptr(0)) *(*U32)(unsafe.Pointer(db + 44)) &= U32(mask) if !((*InitData)(unsafe.Pointer(bp+64)).Frc != 0) { goto __1 } rc = (*InitData)(unsafe.Pointer(bp + 64)).Frc goto error_out __1: ; pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 if !((*Db)(unsafe.Pointer(pDb)).FpBt == uintptr(0)) { goto __2 } *(*U16)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema + 114)) |= U16(DB_SchemaLoaded) rc = SQLITE_OK goto error_out __2: ; Xsqlite3BtreeEnter(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) if !(Xsqlite3BtreeTxnState(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) == SQLITE_TXN_NONE) { goto __3 } rc = Xsqlite3BtreeBeginTrans(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, 0, uintptr(0)) if !(rc != SQLITE_OK) { goto __4 } Xsqlite3SetString(tls, pzErrMsg, db, Xsqlite3ErrStr(tls, rc)) goto initone_error_out __4: ; openedTransaction = 1 __3: ; i = 0 __5: if !(i < int32(uint64(unsafe.Sizeof([5]int32{}))/uint64(unsafe.Sizeof(int32(0))))) { goto __7 } Xsqlite3BtreeGetMeta(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, i+1, bp+104+uintptr(i)*4) goto __6 __6: i++ goto __5 goto __7 __7: ; if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ResetDatabase) != uint64(0)) { goto __8 } libc.Xmemset(tls, bp+104, 0, uint64(unsafe.Sizeof([5]int32{}))) __8: ; (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fschema_cookie = *(*int32)(unsafe.Pointer(bp + 104)) if !(*(*int32)(unsafe.Pointer(bp + 104 + 4*4)) != 0) { goto __9 } if !(iDb == 0 && (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_EncodingFixed) == U32(0)) { goto __10 } encoding = U8(int32(U8(*(*int32)(unsafe.Pointer(bp + 104 + 4*4)))) & 3) if !(int32(encoding) == 0) { goto __12 } encoding = U8(SQLITE_UTF8) __12: ; if !((*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive > 0 && int32(encoding) != int32((*Sqlite3)(unsafe.Pointer(db)).Fenc)) { goto __13 } rc = SQLITE_LOCKED goto initone_error_out goto __14 __13: Xsqlite3SetTextEncoding(tls, db, encoding) __14: ; goto __11 __10: if !(*(*int32)(unsafe.Pointer(bp + 104 + 4*4))&3 != int32((*Sqlite3)(unsafe.Pointer(db)).Fenc)) { goto __15 } Xsqlite3SetString(tls, pzErrMsg, db, ts+13127) rc = SQLITE_ERROR goto initone_error_out __15: ; __11: ; __9: ; (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fenc = (*Sqlite3)(unsafe.Pointer(db)).Fenc if !((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size == 0) { goto __16 } size = Xsqlite3AbsInt32(tls, *(*int32)(unsafe.Pointer(bp + 104 + 2*4))) if !(size == 0) { goto __17 } size = -2000 __17: ; (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size = size Xsqlite3BtreeSetCacheSize(tls, (*Db)(unsafe.Pointer(pDb)).FpBt, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Fcache_size) __16: ; (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Ffile_format = U8(*(*int32)(unsafe.Pointer(bp + 104 + 1*4))) if !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Ffile_format) == 0) { goto __18 } (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Ffile_format = U8(1) __18: ; if !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer(pDb)).FpSchema)).Ffile_format) > SQLITE_MAX_FILE_FORMAT) { goto __19 } Xsqlite3SetString(tls, pzErrMsg, db, ts+19793) rc = SQLITE_ERROR goto initone_error_out __19: ; if !(iDb == 0 && *(*int32)(unsafe.Pointer(bp + 104 + 1*4)) >= 4) { goto __20 } *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_LegacyFileFmt)) __20: ; (*InitData)(unsafe.Pointer(bp + 64)).FmxPage = Xsqlite3BtreeLastPage(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) zSql = Xsqlite3MPrintf(tls, db, ts+19817, libc.VaList(bp, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, zSchemaTabName)) xAuth = (*Sqlite3)(unsafe.Pointer(db)).FxAuth (*Sqlite3)(unsafe.Pointer(db)).FxAuth = uintptr(0) rc = Xsqlite3_exec(tls, db, zSql, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 }{Xsqlite3InitCallback})), bp+64, uintptr(0)) (*Sqlite3)(unsafe.Pointer(db)).FxAuth = xAuth if !(rc == SQLITE_OK) { goto __21 } rc = (*InitData)(unsafe.Pointer(bp + 64)).Frc __21: ; Xsqlite3DbFree(tls, db, zSql) if !(rc == SQLITE_OK) { goto __22 } Xsqlite3AnalysisLoad(tls, db, iDb) __22: ; if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __23 } rc = SQLITE_NOMEM Xsqlite3ResetAllSchemasOfConnection(tls, db) pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32 goto __24 __23: if !(rc == SQLITE_OK || (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_NoSchemaError) != 0 && rc != SQLITE_NOMEM) { goto __25 } *(*U16)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema + 114)) |= U16(DB_SchemaLoaded) rc = SQLITE_OK __25: ; __24: ; initone_error_out: if !(openedTransaction != 0) { goto __26 } Xsqlite3BtreeCommit(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) __26: ; Xsqlite3BtreeLeave(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) error_out: if !(rc != 0) { goto __27 } if !(rc == SQLITE_NOMEM || rc == SQLITE_IOERR|int32(12)<<8) { goto __28 } Xsqlite3OomFault(tls, db) __28: ; Xsqlite3ResetOneSchema(tls, db, iDb) __27: ; (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy = U8(0) return rc } // Initialize all database files - the main database file, the file // used to store temporary tables, and any additional database files // created using ATTACH statements. Return a success code. If an // error occurs, write an error message into *pzErrMsg. // // After a database is initialized, the DB_SchemaLoaded bit is set // bit is set in the flags field of the Db structure. func Xsqlite3Init(tls *libc.TLS, db uintptr, pzErrMsg uintptr) int32 { var i int32 var rc int32 var commit_internal int32 = libc.BoolInt32(!((*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_SchemaChange) != 0)) (*Sqlite3)(unsafe.Pointer(db)).Fenc = (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema)).Fenc if !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema)).FschemaFlags)&DB_SchemaLoaded == DB_SchemaLoaded) { rc = Xsqlite3InitOne(tls, db, 0, pzErrMsg, uint32(0)) if rc != 0 { return rc } } for i = (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1; i > 0; i-- { if !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema)).FschemaFlags)&DB_SchemaLoaded == DB_SchemaLoaded) { rc = Xsqlite3InitOne(tls, db, i, pzErrMsg, uint32(0)) if rc != 0 { return rc } } } if commit_internal != 0 { Xsqlite3CommitInternalChanges(tls, db) } return SQLITE_OK } // This routine is a no-op if the database schema is already initialized. // Otherwise, the schema is loaded. An error code is returned. func Xsqlite3ReadSchema(tls *libc.TLS, pParse uintptr) int32 { var rc int32 = SQLITE_OK var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) { rc = Xsqlite3Init(tls, db, pParse+8) if rc != SQLITE_OK { (*Parse)(unsafe.Pointer(pParse)).Frc = rc (*Parse)(unsafe.Pointer(pParse)).FnErr++ } else if (*Sqlite3)(unsafe.Pointer(db)).FnoSharedCache != 0 { *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaKnownOk) } } return rc } func schemaIsValid(tls *libc.TLS, pParse uintptr) { bp := tls.Alloc(4) defer tls.Free(4) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var iDb int32 var rc int32 for iDb = 0; iDb < (*Sqlite3)(unsafe.Pointer(db)).FnDb; iDb++ { var openedTransaction int32 = 0 var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt if pBt == uintptr(0) { continue } if Xsqlite3BtreeTxnState(tls, pBt) == SQLITE_TXN_NONE { rc = Xsqlite3BtreeBeginTrans(tls, pBt, 0, uintptr(0)) if rc == SQLITE_NOMEM || rc == SQLITE_IOERR|int32(12)<<8 { Xsqlite3OomFault(tls, db) (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } if rc != SQLITE_OK { return } openedTransaction = 1 } Xsqlite3BtreeGetMeta(tls, pBt, BTREE_SCHEMA_VERSION, bp) if *(*int32)(unsafe.Pointer(bp)) != (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema)).Fschema_cookie { if int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema)).FschemaFlags)&DB_SchemaLoaded == DB_SchemaLoaded { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_SCHEMA } Xsqlite3ResetOneSchema(tls, db, iDb) } if openedTransaction != 0 { Xsqlite3BtreeCommit(tls, pBt) } } } // Convert a schema pointer into the iDb index that indicates // which database file in db->aDb[] the schema refers to. // // If the same database is attached more than once, the first // attached database is returned. func Xsqlite3SchemaToIndex(tls *libc.TLS, db uintptr, pSchema uintptr) int32 { var i int32 = -32768 if pSchema != 0 { for i = 0; 1 != 0; i++ { if (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpSchema == pSchema { break } } } return i } // Free all memory allocations in the pParse object func Xsqlite3ParseObjectReset(tls *libc.TLS, pParse uintptr) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Parse)(unsafe.Pointer(pParse)).FaTableLock != 0 { Xsqlite3DbNNFreeNN(tls, db, (*Parse)(unsafe.Pointer(pParse)).FaTableLock) } for (*Parse)(unsafe.Pointer(pParse)).FpCleanup != 0 { var pCleanup uintptr = (*Parse)(unsafe.Pointer(pParse)).FpCleanup (*Parse)(unsafe.Pointer(pParse)).FpCleanup = (*ParseCleanup)(unsafe.Pointer(pCleanup)).FpNext (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*ParseCleanup)(unsafe.Pointer(pCleanup)).FxCleanup})).f(tls, db, (*ParseCleanup)(unsafe.Pointer(pCleanup)).FpPtr) Xsqlite3DbNNFreeNN(tls, db, pCleanup) } if (*Parse)(unsafe.Pointer(pParse)).FaLabel != 0 { Xsqlite3DbNNFreeNN(tls, db, (*Parse)(unsafe.Pointer(pParse)).FaLabel) } if (*Parse)(unsafe.Pointer(pParse)).FpConstExpr != 0 { Xsqlite3ExprListDelete(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpConstExpr) } *(*U32)(unsafe.Pointer(db + 440)) -= U32((*Parse)(unsafe.Pointer(pParse)).FdisableLookaside) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = func() uint16 { if (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable != 0 { return uint16(0) } return (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue }() (*Sqlite3)(unsafe.Pointer(db)).FpParse = (*Parse)(unsafe.Pointer(pParse)).FpOuterParse (*Parse)(unsafe.Pointer(pParse)).Fdb = uintptr(0) (*Parse)(unsafe.Pointer(pParse)).FdisableLookaside = U8(0) } // Add a new cleanup operation to a Parser. The cleanup should happen when // the parser object is destroyed. But, beware: the cleanup might happen // immediately. // // Use this mechanism for uncommon cleanups. There is a higher setup // cost for this mechansim (an extra malloc), so it should not be used // for common cleanups that happen on most calls. But for less // common cleanups, we save a single NULL-pointer comparison in // sqlite3ParseObjectReset(), which reduces the total CPU cycle count. // // If a memory allocation error occurs, then the cleanup happens immediately. // When either SQLITE_DEBUG or SQLITE_COVERAGE_TEST are defined, the // pParse->earlyCleanup flag is set in that case. Calling code show verify // that test cases exist for which this happens, to guard against possible // use-after-free errors following an OOM. The preferred way to do this is // to immediately follow the call to this routine with: // // testcase( pParse->earlyCleanup ); // // This routine returns a copy of its pPtr input (the third parameter) // except if an early cleanup occurs, in which case it returns NULL. So // another way to check for early cleanup is to check the return value. // Or, stop using the pPtr parameter with this call and use only its // return value thereafter. Something like this: // // pObj = sqlite3ParserAddCleanup(pParse, destructor, pObj); func Xsqlite3ParserAddCleanup(tls *libc.TLS, pParse uintptr, xCleanup uintptr, pPtr uintptr) uintptr { var pCleanup uintptr = Xsqlite3DbMallocRaw(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(ParseCleanup{}))) if pCleanup != 0 { (*ParseCleanup)(unsafe.Pointer(pCleanup)).FpNext = (*Parse)(unsafe.Pointer(pParse)).FpCleanup (*Parse)(unsafe.Pointer(pParse)).FpCleanup = pCleanup (*ParseCleanup)(unsafe.Pointer(pCleanup)).FpPtr = pPtr (*ParseCleanup)(unsafe.Pointer(pCleanup)).FxCleanup = xCleanup } else { (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xCleanup})).f(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pPtr) pPtr = uintptr(0) } return pPtr } // Turn bulk memory into a valid Parse object and link that Parse object // into database connection db. // // Call sqlite3ParseObjectReset() to undo this operation. // // Caution: Do not confuse this routine with sqlite3ParseObjectInit() which // is generated by Lemon. func Xsqlite3ParseObjectInit(tls *libc.TLS, pParse uintptr, db uintptr) { libc.Xmemset(tls, pParse+uintptr(uint64(uintptr(0)+8)), 0, uint64(uintptr(0)+228)-uint64(uintptr(0)+8)) libc.Xmemset(tls, pParse+uintptr(uint64(uintptr(0)+288)), 0, uint64(unsafe.Sizeof(Parse{}))-uint64(uintptr(0)+288)) (*Parse)(unsafe.Pointer(pParse)).FpOuterParse = (*Sqlite3)(unsafe.Pointer(db)).FpParse (*Sqlite3)(unsafe.Pointer(db)).FpParse = pParse (*Parse)(unsafe.Pointer(pParse)).Fdb = db if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+1480, 0) } } func sqlite3Prepare(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, prepFlags U32, pReprepare uintptr, ppStmt uintptr, pzTail uintptr) int32 { bp := tls.Alloc(440) defer tls.Free(440) var rc int32 var i int32 var zDb uintptr var pBt uintptr var zSqlCopy uintptr var mxLen int32 var pT uintptr rc = SQLITE_OK libc.Xmemset(tls, bp+16+uintptr(uint64(uintptr(0)+8)), 0, uint64(uintptr(0)+228)-uint64(uintptr(0)+8)) libc.Xmemset(tls, bp+16+uintptr(uint64(uintptr(0)+288)), 0, uint64(unsafe.Sizeof(Parse{}))-uint64(uintptr(0)+288)) (*Parse)(unsafe.Pointer(bp + 16)).FpOuterParse = (*Sqlite3)(unsafe.Pointer(db)).FpParse (*Sqlite3)(unsafe.Pointer(db)).FpParse = bp + 16 (*Parse)(unsafe.Pointer(bp + 16)).Fdb = db (*Parse)(unsafe.Pointer(bp + 16)).FpReprepare = pReprepare if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __1 } Xsqlite3ErrorMsg(tls, bp+16, ts+1480, 0) __1: ; if !(prepFlags&U32(SQLITE_PREPARE_PERSISTENT) != 0) { goto __2 } (*Parse)(unsafe.Pointer(bp+16)).FdisableLookaside++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) __2: ; (*Parse)(unsafe.Pointer(bp + 16)).FprepFlags = U8(prepFlags & U32(0xff)) if !!(int32((*Sqlite3)(unsafe.Pointer(db)).FnoSharedCache) != 0) { goto __3 } i = 0 __4: if !(i < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __6 } pBt = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if !(pBt != 0) { goto __7 } rc = Xsqlite3BtreeSchemaLocked(tls, pBt) if !(rc != 0) { goto __8 } zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FzDbSName Xsqlite3ErrorWithMsg(tls, db, rc, ts+19851, libc.VaList(bp, zDb)) goto end_prepare __8: ; __7: ; goto __5 __5: i++ goto __4 goto __6 __6: ; __3: ; if !((*Sqlite3)(unsafe.Pointer(db)).FpDisconnect != 0) { goto __9 } Xsqlite3VtabUnlockList(tls, db) __9: ; if !(nBytes >= 0 && (nBytes == 0 || int32(*(*int8)(unsafe.Pointer(zSql + uintptr(nBytes-1)))) != 0)) { goto __10 } mxLen = *(*int32)(unsafe.Pointer(db + 136 + 1*4)) if !(nBytes > mxLen) { goto __12 } Xsqlite3ErrorWithMsg(tls, db, SQLITE_TOOBIG, ts+19881, 0) rc = Xsqlite3ApiExit(tls, db, SQLITE_TOOBIG) goto end_prepare __12: ; zSqlCopy = Xsqlite3DbStrNDup(tls, db, zSql, uint64(nBytes)) if !(zSqlCopy != 0) { goto __13 } Xsqlite3RunParser(tls, bp+16, zSqlCopy) (*Parse)(unsafe.Pointer(bp + 16)).FzTail = zSql + uintptr((int64((*Parse)(unsafe.Pointer(bp+16)).FzTail)-int64(zSqlCopy))/1) Xsqlite3DbFree(tls, db, zSqlCopy) goto __14 __13: (*Parse)(unsafe.Pointer(bp + 16)).FzTail = zSql + uintptr(nBytes) __14: ; goto __11 __10: Xsqlite3RunParser(tls, bp+16, zSql) __11: ; if !(pzTail != 0) { goto __15 } *(*uintptr)(unsafe.Pointer(pzTail)) = (*Parse)(unsafe.Pointer(bp + 16)).FzTail __15: ; if !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) == 0) { goto __16 } Xsqlite3VdbeSetSql(tls, (*Parse)(unsafe.Pointer(bp+16)).FpVdbe, zSql, int32((int64((*Parse)(unsafe.Pointer(bp+16)).FzTail)-int64(zSql))/1), uint8(prepFlags)) __16: ; if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __17 } (*Parse)(unsafe.Pointer(bp + 16)).Frc = SQLITE_NOMEM (*Parse)(unsafe.Pointer(bp + 16)).FcheckSchema = U8(0) __17: ; if !((*Parse)(unsafe.Pointer(bp+16)).Frc != SQLITE_OK && (*Parse)(unsafe.Pointer(bp+16)).Frc != SQLITE_DONE) { goto __18 } if !((*Parse)(unsafe.Pointer(bp+16)).FcheckSchema != 0 && int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) == 0) { goto __20 } schemaIsValid(tls, bp+16) __20: ; if !((*Parse)(unsafe.Pointer(bp+16)).FpVdbe != 0) { goto __21 } Xsqlite3VdbeFinalize(tls, (*Parse)(unsafe.Pointer(bp+16)).FpVdbe) __21: ; rc = (*Parse)(unsafe.Pointer(bp + 16)).Frc if !((*Parse)(unsafe.Pointer(bp+16)).FzErrMsg != 0) { goto __22 } Xsqlite3ErrorWithMsg(tls, db, rc, ts+4493, libc.VaList(bp+8, (*Parse)(unsafe.Pointer(bp+16)).FzErrMsg)) Xsqlite3DbFree(tls, db, (*Parse)(unsafe.Pointer(bp+16)).FzErrMsg) goto __23 __22: Xsqlite3Error(tls, db, rc) __23: ; goto __19 __18: ; *(*uintptr)(unsafe.Pointer(ppStmt)) = (*Parse)(unsafe.Pointer(bp + 16)).FpVdbe rc = SQLITE_OK Xsqlite3ErrorClear(tls, db) __19: ; __24: if !((*Parse)(unsafe.Pointer(bp+16)).FpTriggerPrg != 0) { goto __25 } pT = (*Parse)(unsafe.Pointer(bp + 16)).FpTriggerPrg (*Parse)(unsafe.Pointer(bp + 16)).FpTriggerPrg = (*TriggerPrg)(unsafe.Pointer(pT)).FpNext Xsqlite3DbFree(tls, db, pT) goto __24 __25: ; end_prepare: Xsqlite3ParseObjectReset(tls, bp+16) return rc } func sqlite3LockAndPrepare(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, prepFlags U32, pOld uintptr, ppStmt uintptr, pzTail uintptr) int32 { var rc int32 var cnt int32 = 0 *(*uintptr)(unsafe.Pointer(ppStmt)) = uintptr(0) if !(Xsqlite3SafetyCheckOk(tls, db) != 0) || zSql == uintptr(0) { return Xsqlite3MisuseError(tls, 138048) } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) Xsqlite3BtreeEnterAll(tls, db) for __ccgo := true; __ccgo; __ccgo = rc == SQLITE_ERROR|int32(2)<<8 && libc.PostIncInt32(&cnt, 1) < SQLITE_MAX_PREPARE_RETRY || rc == SQLITE_SCHEMA && func() int32 { Xsqlite3ResetOneSchema(tls, db, -1); return libc.PostIncInt32(&cnt, 1) }() == 0 { rc = sqlite3Prepare(tls, db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail) if rc == SQLITE_OK || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { break } } Xsqlite3BtreeLeaveAll(tls, db) rc = Xsqlite3ApiExit(tls, db, rc) (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FnBusy = 0 Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Rerun the compilation of a statement after a schema change. // // If the statement is successfully recompiled, return SQLITE_OK. Otherwise, // if the statement cannot be recompiled because another connection has // locked the sqlite3_schema table, return SQLITE_LOCKED. If any other error // occurs, return SQLITE_SCHEMA. func Xsqlite3Reprepare(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var zSql uintptr var db uintptr var prepFlags U8 zSql = Xsqlite3_sql(tls, p) db = Xsqlite3VdbeDb(tls, p) prepFlags = Xsqlite3VdbePrepareFlags(tls, p) rc = sqlite3LockAndPrepare(tls, db, zSql, -1, uint32(prepFlags), p, bp, uintptr(0)) if rc != 0 { if rc == SQLITE_NOMEM { Xsqlite3OomFault(tls, db) } return rc } else { } Xsqlite3VdbeSwap(tls, *(*uintptr)(unsafe.Pointer(bp)), p) Xsqlite3TransferBindings(tls, *(*uintptr)(unsafe.Pointer(bp)), p) Xsqlite3VdbeResetStepResult(tls, *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3VdbeFinalize(tls, *(*uintptr)(unsafe.Pointer(bp))) return SQLITE_OK } // Two versions of the official API. Legacy and new use. In the legacy // version, the original SQL text is not saved in the prepared statement // and so if a schema change occurs, SQLITE_SCHEMA is returned by // sqlite3_step(). In the new version, the original SQL text is retained // and the statement is automatically recompiled if an schema change // occurs. func Xsqlite3_prepare(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, ppStmt uintptr, pzTail uintptr) int32 { var rc int32 rc = sqlite3LockAndPrepare(tls, db, zSql, nBytes, uint32(0), uintptr(0), ppStmt, pzTail) return rc } func Xsqlite3_prepare_v2(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, ppStmt uintptr, pzTail uintptr) int32 { var rc int32 rc = sqlite3LockAndPrepare(tls, db, zSql, nBytes, uint32(SQLITE_PREPARE_SAVESQL), uintptr(0), ppStmt, pzTail) return rc } func Xsqlite3_prepare_v3(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, prepFlags uint32, ppStmt uintptr, pzTail uintptr) int32 { var rc int32 rc = sqlite3LockAndPrepare(tls, db, zSql, nBytes, uint32(SQLITE_PREPARE_SAVESQL)|prepFlags&uint32(SQLITE_PREPARE_MASK), uintptr(0), ppStmt, pzTail) return rc } func sqlite3Prepare16(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, prepFlags U32, ppStmt uintptr, pzTail uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var zSql8 uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 = SQLITE_OK *(*uintptr)(unsafe.Pointer(ppStmt)) = uintptr(0) if !(Xsqlite3SafetyCheckOk(tls, db) != 0) || zSql == uintptr(0) { return Xsqlite3MisuseError(tls, 138196) } if nBytes >= 0 { var sz int32 var z uintptr = zSql for sz = 0; sz < nBytes && (int32(*(*int8)(unsafe.Pointer(z + uintptr(sz)))) != 0 || int32(*(*int8)(unsafe.Pointer(z + uintptr(sz+1)))) != 0); sz = sz + 2 { } nBytes = sz } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) zSql8 = Xsqlite3Utf16to8(tls, db, zSql, nBytes, uint8(SQLITE_UTF16LE)) if zSql8 != 0 { rc = sqlite3LockAndPrepare(tls, db, zSql8, -1, prepFlags, uintptr(0), ppStmt, bp) } if *(*uintptr)(unsafe.Pointer(bp)) != 0 && pzTail != 0 { var chars_parsed int32 = Xsqlite3Utf8CharLen(tls, zSql8, int32((int64(*(*uintptr)(unsafe.Pointer(bp)))-int64(zSql8))/1)) *(*uintptr)(unsafe.Pointer(pzTail)) = zSql + uintptr(Xsqlite3Utf16ByteLen(tls, zSql, chars_parsed)) } Xsqlite3DbFree(tls, db, zSql8) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Two versions of the official API. Legacy and new use. In the legacy // version, the original SQL text is not saved in the prepared statement // and so if a schema change occurs, SQLITE_SCHEMA is returned by // sqlite3_step(). In the new version, the original SQL text is retained // and the statement is automatically recompiled if an schema change // occurs. func Xsqlite3_prepare16(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, ppStmt uintptr, pzTail uintptr) int32 { var rc int32 rc = sqlite3Prepare16(tls, db, zSql, nBytes, uint32(0), ppStmt, pzTail) return rc } func Xsqlite3_prepare16_v2(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, ppStmt uintptr, pzTail uintptr) int32 { var rc int32 rc = sqlite3Prepare16(tls, db, zSql, nBytes, uint32(SQLITE_PREPARE_SAVESQL), ppStmt, pzTail) return rc } func Xsqlite3_prepare16_v3(tls *libc.TLS, db uintptr, zSql uintptr, nBytes int32, prepFlags uint32, ppStmt uintptr, pzTail uintptr) int32 { var rc int32 rc = sqlite3Prepare16(tls, db, zSql, nBytes, uint32(SQLITE_PREPARE_SAVESQL)|prepFlags&uint32(SQLITE_PREPARE_MASK), ppStmt, pzTail) return rc } // An instance of the following object is used to record information about // how to process the DISTINCT keyword, to simplify passing that information // into the selectInnerLoop() routine. type DistinctCtx1 = struct { FisTnct U8 FeTnctType U8 F__ccgo_pad1 [2]byte FtabTnct int32 FaddrTnct int32 } // An instance of the following object is used to record information about // how to process the DISTINCT keyword, to simplify passing that information // into the selectInnerLoop() routine. type DistinctCtx = DistinctCtx1 // An instance of the following object is used to record information about // the ORDER BY (or GROUP BY) clause of query is being coded. // // The aDefer[] array is used by the sorter-references optimization. For // example, assuming there is no index that can be used for the ORDER BY, // for the query: // // SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10; // // it may be more efficient to add just the "a" values to the sorter, and // retrieve the associated "bigblob" values directly from table t1 as the // 10 smallest "a" values are extracted from the sorter. // // When the sorter-reference optimization is used, there is one entry in the // aDefer[] array for each database table that may be read as values are // extracted from the sorter. type SortCtx1 = struct { FpOrderBy uintptr FnOBSat int32 FiECursor int32 FregReturn int32 FlabelBkOut int32 FaddrSortIndex int32 FlabelDone int32 FlabelOBLopt int32 FsortFlags U8 F__ccgo_pad1 [3]byte FpDeferredRowLoad uintptr } // An instance of the following object is used to record information about // the ORDER BY (or GROUP BY) clause of query is being coded. // // The aDefer[] array is used by the sorter-references optimization. For // example, assuming there is no index that can be used for the ORDER BY, // for the query: // // SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10; // // it may be more efficient to add just the "a" values to the sorter, and // retrieve the associated "bigblob" values directly from table t1 as the // 10 smallest "a" values are extracted from the sorter. // // When the sorter-reference optimization is used, there is one entry in the // aDefer[] array for each database table that may be read as values are // extracted from the sorter. type SortCtx = SortCtx1 type RowLoadInfo1 = struct { FregResult int32 FecelFlags U8 F__ccgo_pad1 [3]byte } func clearSelect(tls *libc.TLS, db uintptr, p uintptr, bFree int32) { for p != 0 { var pPrior uintptr = (*Select)(unsafe.Pointer(p)).FpPrior Xsqlite3ExprListDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpEList) Xsqlite3SrcListDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpSrc) Xsqlite3ExprDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpWhere) Xsqlite3ExprListDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpGroupBy) Xsqlite3ExprDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpHaving) Xsqlite3ExprListDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpOrderBy) Xsqlite3ExprDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpLimit) if (*Select)(unsafe.Pointer(p)).FpWith != 0 { Xsqlite3WithDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpWith) } if (*Select)(unsafe.Pointer(p)).FpWinDefn != 0 { Xsqlite3WindowListDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpWinDefn) } for (*Select)(unsafe.Pointer(p)).FpWin != 0 { Xsqlite3WindowUnlinkFromSelect(tls, (*Select)(unsafe.Pointer(p)).FpWin) } if bFree != 0 { Xsqlite3DbNNFreeNN(tls, db, p) } p = pPrior bFree = 1 } } // Initialize a SelectDest structure. func Xsqlite3SelectDestInit(tls *libc.TLS, pDest uintptr, eDest int32, iParm int32) { (*SelectDest)(unsafe.Pointer(pDest)).FeDest = U8(eDest) (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm = iParm (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm2 = 0 (*SelectDest)(unsafe.Pointer(pDest)).FzAffSdst = uintptr(0) (*SelectDest)(unsafe.Pointer(pDest)).FiSdst = 0 (*SelectDest)(unsafe.Pointer(pDest)).FnSdst = 0 } // Allocate a new Select structure and return a pointer to that // structure. func Xsqlite3SelectNew(tls *libc.TLS, pParse uintptr, pEList uintptr, pSrc uintptr, pWhere uintptr, pGroupBy uintptr, pHaving uintptr, pOrderBy uintptr, selFlags U32, pLimit uintptr) uintptr { bp := tls.Alloc(128) defer tls.Free(128) var pNew uintptr var pAllocated uintptr pAllocated = libc.AssignUintptr(&pNew, Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Select{})))) if pNew == uintptr(0) { pNew = bp } if pEList == uintptr(0) { pEList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), Xsqlite3Expr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_ASTERISK, uintptr(0))) } (*Select)(unsafe.Pointer(pNew)).FpEList = pEList (*Select)(unsafe.Pointer(pNew)).Fop = U8(TK_SELECT) (*Select)(unsafe.Pointer(pNew)).FselFlags = selFlags (*Select)(unsafe.Pointer(pNew)).FiLimit = 0 (*Select)(unsafe.Pointer(pNew)).FiOffset = 0 (*Select)(unsafe.Pointer(pNew)).FselId = U32(libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnSelect, 1)) *(*int32)(unsafe.Pointer(pNew + 20)) = -1 *(*int32)(unsafe.Pointer(pNew + 20 + 1*4)) = -1 (*Select)(unsafe.Pointer(pNew)).FnSelectRow = int16(0) if pSrc == uintptr(0) { pSrc = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(SrcList{}))) } (*Select)(unsafe.Pointer(pNew)).FpSrc = pSrc (*Select)(unsafe.Pointer(pNew)).FpWhere = pWhere (*Select)(unsafe.Pointer(pNew)).FpGroupBy = pGroupBy (*Select)(unsafe.Pointer(pNew)).FpHaving = pHaving (*Select)(unsafe.Pointer(pNew)).FpOrderBy = pOrderBy (*Select)(unsafe.Pointer(pNew)).FpPrior = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpNext = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpLimit = pLimit (*Select)(unsafe.Pointer(pNew)).FpWith = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpWin = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpWinDefn = uintptr(0) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { clearSelect(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pNew, libc.Bool32(pNew != bp)) pAllocated = uintptr(0) } else { } return pAllocated } // Delete the given Select structure and all of its substructures. func Xsqlite3SelectDelete(tls *libc.TLS, db uintptr, p uintptr) { if p != 0 { clearSelect(tls, db, p, 1) } } func findRightmost(tls *libc.TLS, p uintptr) uintptr { for (*Select)(unsafe.Pointer(p)).FpNext != 0 { p = (*Select)(unsafe.Pointer(p)).FpNext } return p } // Given 1 to 3 identifiers preceding the JOIN keyword, determine the // type of join. Return an integer constant that expresses that type // in terms of the following bit values: // // JT_INNER // JT_CROSS // JT_OUTER // JT_NATURAL // JT_LEFT // JT_RIGHT // // A full outer join is the combination of JT_LEFT and JT_RIGHT. // // If an illegal or unsupported join type is seen, then still return // a join type, but put an error in the pParse structure. // // These are the valid join types: // // pA pB pC Return Value // ------- ----- ----- ------------ // CROSS - - JT_CROSS // INNER - - JT_INNER // LEFT - - JT_LEFT|JT_OUTER // LEFT OUTER - JT_LEFT|JT_OUTER // RIGHT - - JT_RIGHT|JT_OUTER // RIGHT OUTER - JT_RIGHT|JT_OUTER // FULL - - JT_LEFT|JT_RIGHT|JT_OUTER // FULL OUTER - JT_LEFT|JT_RIGHT|JT_OUTER // NATURAL INNER - JT_NATURAL|JT_INNER // NATURAL LEFT - JT_NATURAL|JT_LEFT|JT_OUTER // NATURAL LEFT OUTER JT_NATURAL|JT_LEFT|JT_OUTER // NATURAL RIGHT - JT_NATURAL|JT_RIGHT|JT_OUTER // NATURAL RIGHT OUTER JT_NATURAL|JT_RIGHT|JT_OUTER // NATURAL FULL - JT_NATURAL|JT_LEFT|JT_RIGHT // NATURAL FULL OUTER JT_NATRUAL|JT_LEFT|JT_RIGHT // // To preserve historical compatibly, SQLite also accepts a variety // of other non-standard and in many cases non-sensical join types. // This routine makes as much sense at it can from the nonsense join // type and returns a result. Examples of accepted nonsense join types // include but are not limited to: // // INNER CROSS JOIN -> same as JOIN // NATURAL CROSS JOIN -> same as NATURAL JOIN // OUTER LEFT JOIN -> same as LEFT JOIN // LEFT NATURAL JOIN -> same as NATURAL LEFT JOIN // LEFT RIGHT JOIN -> same as FULL JOIN // RIGHT OUTER FULL JOIN -> same as FULL JOIN // CROSS CROSS CROSS JOIN -> same as JOIN // // The only restrictions on the join type name are: // // - "INNER" cannot appear together with "OUTER", "LEFT", "RIGHT", // or "FULL". // // - "CROSS" cannot appear together with "OUTER", "LEFT", "RIGHT, // or "FULL". // // - If "OUTER" is present then there must also be one of // "LEFT", "RIGHT", or "FULL" func Xsqlite3JoinType(tls *libc.TLS, pParse uintptr, pA uintptr, pB uintptr, pC uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var jointype int32 = 0 var p uintptr var i int32 var j int32 *(*uintptr)(unsafe.Pointer(bp + 40)) = pA *(*uintptr)(unsafe.Pointer(bp + 40 + 1*8)) = pB *(*uintptr)(unsafe.Pointer(bp + 40 + 2*8)) = pC for i = 0; i < 3 && *(*uintptr)(unsafe.Pointer(bp + 40 + uintptr(i)*8)) != 0; i++ { p = *(*uintptr)(unsafe.Pointer(bp + 40 + uintptr(i)*8)) for j = 0; j < int32(uint64(unsafe.Sizeof(aKeyword))/uint64(unsafe.Sizeof(struct { Fi U8 FnChar U8 Fcode U8 }{}))); j++ { if (*Token)(unsafe.Pointer(p)).Fn == uint32(aKeyword[j].FnChar) && Xsqlite3_strnicmp(tls, (*Token)(unsafe.Pointer(p)).Fz, uintptr(unsafe.Pointer(&zKeyText))+uintptr(aKeyword[j].Fi), int32((*Token)(unsafe.Pointer(p)).Fn)) == 0 { jointype = jointype | int32(aKeyword[j].Fcode) break } } if j >= int32(uint64(unsafe.Sizeof(aKeyword))/uint64(unsafe.Sizeof(struct { Fi U8 FnChar U8 Fcode U8 }{}))) { jointype = jointype | JT_ERROR break } } if jointype&(JT_INNER|JT_OUTER) == JT_INNER|JT_OUTER || jointype&JT_ERROR != 0 || jointype&(JT_OUTER|JT_LEFT|JT_RIGHT) == JT_OUTER { var zSp1 uintptr = ts + 12272 var zSp2 uintptr = ts + 12272 if pB == uintptr(0) { zSp1++ } if pC == uintptr(0) { zSp2++ } Xsqlite3ErrorMsg(tls, pParse, ts+19900, libc.VaList(bp, pA, zSp1, pB, zSp2, pC)) jointype = JT_INNER } return jointype } var zKeyText = *(*[34]int8)(unsafe.Pointer(ts + 19930)) var aKeyword = [7]struct { Fi U8 FnChar U8 Fcode U8 }{ {FnChar: U8(7), Fcode: U8(JT_NATURAL)}, {Fi: U8(6), FnChar: U8(4), Fcode: U8(JT_LEFT | JT_OUTER)}, {Fi: U8(10), FnChar: U8(5), Fcode: U8(JT_OUTER)}, {Fi: U8(14), FnChar: U8(5), Fcode: U8(JT_RIGHT | JT_OUTER)}, {Fi: U8(19), FnChar: U8(4), Fcode: U8(JT_LEFT | JT_RIGHT | JT_OUTER)}, {Fi: U8(23), FnChar: U8(5), Fcode: U8(JT_INNER)}, {Fi: U8(28), FnChar: U8(5), Fcode: U8(JT_INNER | JT_CROSS)}, } // Return the index of a column in a table. Return -1 if the column // is not contained in the table. func Xsqlite3ColumnIndex(tls *libc.TLS, pTab uintptr, zCol uintptr) int32 { var i int32 var h U8 = Xsqlite3StrIHash(tls, zCol) var pCol uintptr pCol = (*Table)(unsafe.Pointer(pTab)).FaCol i = 0 __1: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __3 } { if int32((*Column)(unsafe.Pointer(pCol)).FhName) == int32(h) && Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName, zCol) == 0 { return i } } goto __2 __2: pCol += 24 i++ goto __1 goto __3 __3: ; return -1 } // Mark a subquery result column as having been used. func Xsqlite3SrcItemColumnUsed(tls *libc.TLS, pItem uintptr, iCol int32) { if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x2000>>13)) != 0 { var pResults uintptr pResults = (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpSelect)).FpEList libc.SetBitFieldPtr16Uint32(pResults+8+uintptr(iCol)*32+16+4, uint32(1), 6, 0x40) } } func tableAndColumnIndex(tls *libc.TLS, pSrc uintptr, iStart int32, iEnd int32, zCol uintptr, piTab uintptr, piCol uintptr, bIgnoreHidden int32) int32 { var i int32 var iCol int32 for i = iStart; i <= iEnd; i++ { iCol = Xsqlite3ColumnIndex(tls, (*SrcItem)(unsafe.Pointer(pSrc+8+uintptr(i)*104)).FpTab, zCol) if iCol >= 0 && (bIgnoreHidden == 0 || libc.Bool32(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pSrc+8+uintptr(i)*104)).FpTab)).FaCol+uintptr(iCol)*24)).FcolFlags)&COLFLAG_HIDDEN != 0) == 0) { if piTab != 0 { Xsqlite3SrcItemColumnUsed(tls, pSrc+8+uintptr(i)*104, iCol) *(*int32)(unsafe.Pointer(piTab)) = i *(*int32)(unsafe.Pointer(piCol)) = iCol } return 1 } } return 0 } // Set the EP_OuterON property on all terms of the given expression. // And set the Expr.w.iJoin to iTable for every term in the // expression. // // The EP_OuterON property is used on terms of an expression to tell // the OUTER JOIN processing logic that this term is part of the // join restriction specified in the ON or USING clause and not a part // of the more general WHERE clause. These terms are moved over to the // WHERE clause during join processing but we need to remember that they // originated in the ON or USING clause. // // The Expr.w.iJoin tells the WHERE clause processing that the // expression depends on table w.iJoin even if that table is not // explicitly mentioned in the expression. That information is needed // for cases like this: // // SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5 // // The where clause needs to defer the handling of the t1.x=5 // term until after the t2 loop of the join. In that way, a // NULL t2 row will be inserted whenever t1.x!=5. If we do not // defer the handling of t1.x=5, it will be processed immediately // after the t1 loop and rows with t1.x!=5 will never appear in // the output, which is incorrect. func Xsqlite3SetJoinExpr(tls *libc.TLS, p uintptr, iTable int32, joinFlag U32) { for p != 0 { *(*U32)(unsafe.Pointer(p + 4)) |= joinFlag *(*int32)(unsafe.Pointer(p + 52)) = iTable if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_FUNCTION { if *(*uintptr)(unsafe.Pointer(p + 32)) != 0 { var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32)))).FnExpr; i++ { Xsqlite3SetJoinExpr(tls, (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32))+8+uintptr(i)*32)).FpExpr, iTable, joinFlag) } } } Xsqlite3SetJoinExpr(tls, (*Expr)(unsafe.Pointer(p)).FpLeft, iTable, joinFlag) p = (*Expr)(unsafe.Pointer(p)).FpRight } } func unsetJoinExpr(tls *libc.TLS, p uintptr, iTable int32, nullable int32) { for p != 0 { if iTable < 0 || (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_OuterON) != U32(0) && *(*int32)(unsafe.Pointer(p + 52)) == iTable { *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_OuterON | EP_InnerON)) if iTable >= 0 { *(*U32)(unsafe.Pointer(p + 4)) |= U32(EP_InnerON) } } if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(p)).FiTable == iTable && !(nullable != 0) { *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_CanBeNull)) } if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_FUNCTION { if *(*uintptr)(unsafe.Pointer(p + 32)) != 0 { var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32)))).FnExpr; i++ { unsetJoinExpr(tls, (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 32))+8+uintptr(i)*32)).FpExpr, iTable, nullable) } } } unsetJoinExpr(tls, (*Expr)(unsafe.Pointer(p)).FpLeft, iTable, nullable) p = (*Expr)(unsafe.Pointer(p)).FpRight } } func sqlite3ProcessJoin(tls *libc.TLS, pParse uintptr, p uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var pSrc uintptr var i int32 var j int32 var pLeft uintptr var pRight uintptr pSrc = (*Select)(unsafe.Pointer(p)).FpSrc pLeft = pSrc + 8 pRight = pLeft + 1*104 i = 0 __1: if !(i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc-1) { goto __3 } { var pRightTab uintptr = (*SrcItem)(unsafe.Pointer(pRight)).FpTab var joinType U32 if (*SrcItem)(unsafe.Pointer(pLeft)).FpTab == uintptr(0) || pRightTab == uintptr(0) { goto __2 } if int32((*SrcItem)(unsafe.Pointer(pRight)).Ffg.Fjointype)&JT_OUTER != 0 { joinType = uint32(EP_OuterON) } else { joinType = uint32(EP_InnerON) } if int32((*SrcItem)(unsafe.Pointer(pRight)).Ffg.Fjointype)&JT_NATURAL != 0 { var pUsing uintptr = uintptr(0) if uint32(int32(*(*uint16)(unsafe.Pointer(pRight + 60 + 4))&0x400>>10)) != 0 || *(*uintptr)(unsafe.Pointer(pRight + 72)) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+19964, libc.VaList(bp, 0)) return 1 } for j = 0; j < int32((*Table)(unsafe.Pointer(pRightTab)).FnCol); j++ { var zName uintptr if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pRightTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_HIDDEN != 0 { continue } zName = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pRightTab)).FaCol + uintptr(j)*24)).FzCnName if tableAndColumnIndex(tls, pSrc, 0, i, zName, uintptr(0), uintptr(0), 1) != 0 { pUsing = Xsqlite3IdListAppend(tls, pParse, pUsing, uintptr(0)) if pUsing != 0 { (*IdList_item)(unsafe.Pointer(pUsing + 8 + uintptr((*IdList)(unsafe.Pointer(pUsing)).FnId-1)*16)).FzName = Xsqlite3DbStrDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, zName) } } } if pUsing != 0 { libc.SetBitFieldPtr16Uint32(pRight+60+4, uint32(1), 10, 0x400) libc.SetBitFieldPtr16Uint32(pRight+60+4, uint32(1), 12, 0x1000) *(*uintptr)(unsafe.Pointer(pRight + 72)) = pUsing } if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return 1 } } if uint32(int32(*(*uint16)(unsafe.Pointer(pRight + 60 + 4))&0x400>>10)) != 0 { var pList uintptr = *(*uintptr)(unsafe.Pointer(pRight + 72)) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb for j = 0; j < (*IdList)(unsafe.Pointer(pList)).FnId; j++ { var zName uintptr var iRightCol int32 var pE1 uintptr var pE2 uintptr var pEq uintptr zName = (*IdList_item)(unsafe.Pointer(pList + 8 + uintptr(j)*16)).FzName iRightCol = Xsqlite3ColumnIndex(tls, pRightTab, zName) if iRightCol < 0 || tableAndColumnIndex(tls, pSrc, 0, i, zName, bp+24, bp+28, int32(*(*uint16)(unsafe.Pointer(pRight + 60 + 4))&0x1000>>12)) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+20014, libc.VaList(bp+8, zName)) return 1 } pE1 = Xsqlite3CreateColumnExpr(tls, db, pSrc, *(*int32)(unsafe.Pointer(bp + 24)), *(*int32)(unsafe.Pointer(bp + 28))) Xsqlite3SrcItemColumnUsed(tls, pSrc+8+uintptr(*(*int32)(unsafe.Pointer(bp + 24)))*104, *(*int32)(unsafe.Pointer(bp + 28))) if int32((*SrcItem)(unsafe.Pointer(pSrc+8)).Ffg.Fjointype)&JT_LTORJ != 0 { var pFuncArgs uintptr = uintptr(0) for tableAndColumnIndex(tls, pSrc, *(*int32)(unsafe.Pointer(bp + 24))+1, i, zName, bp+24, bp+28, int32(*(*uint16)(unsafe.Pointer(pRight + 60 + 4))&0x1000>>12)) != 0 { if int32(*(*uint16)(unsafe.Pointer(pSrc + 8 + uintptr(*(*int32)(unsafe.Pointer(bp + 24)))*104 + 60 + 4))&0x400>>10) == 0 || Xsqlite3IdListIndex(tls, *(*uintptr)(unsafe.Pointer(pSrc + 8 + uintptr(*(*int32)(unsafe.Pointer(bp + 24)))*104 + 72)), zName) < 0 { Xsqlite3ErrorMsg(tls, pParse, ts+20078, libc.VaList(bp+16, zName)) break } pFuncArgs = Xsqlite3ExprListAppend(tls, pParse, pFuncArgs, pE1) pE1 = Xsqlite3CreateColumnExpr(tls, db, pSrc, *(*int32)(unsafe.Pointer(bp + 24)), *(*int32)(unsafe.Pointer(bp + 28))) Xsqlite3SrcItemColumnUsed(tls, pSrc+8+uintptr(*(*int32)(unsafe.Pointer(bp + 24)))*104, *(*int32)(unsafe.Pointer(bp + 28))) } if pFuncArgs != 0 { pFuncArgs = Xsqlite3ExprListAppend(tls, pParse, pFuncArgs, pE1) pE1 = Xsqlite3ExprFunction(tls, pParse, pFuncArgs, uintptr(unsafe.Pointer(&tkCoalesce)), 0) } } pE2 = Xsqlite3CreateColumnExpr(tls, db, pSrc, i+1, iRightCol) Xsqlite3SrcItemColumnUsed(tls, pRight, iRightCol) pEq = Xsqlite3PExpr(tls, pParse, TK_EQ, pE1, pE2) if pEq != 0 { *(*U32)(unsafe.Pointer(pEq + 4)) |= joinType *(*int32)(unsafe.Pointer(pEq + 52)) = (*Expr)(unsafe.Pointer(pE2)).FiTable } (*Select)(unsafe.Pointer(p)).FpWhere = Xsqlite3ExprAnd(tls, pParse, (*Select)(unsafe.Pointer(p)).FpWhere, pEq) } } else if *(*uintptr)(unsafe.Pointer(pRight + 72)) != 0 { Xsqlite3SetJoinExpr(tls, *(*uintptr)(unsafe.Pointer(pRight + 72)), (*SrcItem)(unsafe.Pointer(pRight)).FiCursor, joinType) (*Select)(unsafe.Pointer(p)).FpWhere = Xsqlite3ExprAnd(tls, pParse, (*Select)(unsafe.Pointer(p)).FpWhere, *(*uintptr)(unsafe.Pointer(pRight + 72))) *(*uintptr)(unsafe.Pointer(pRight + 72)) = uintptr(0) libc.SetBitFieldPtr16Uint32(pRight+60+4, uint32(1), 11, 0x800) } } goto __2 __2: i++ pRight += 104 pLeft += 104 goto __1 goto __3 __3: ; return 0 } var tkCoalesce = Token{Fz: ts + 7938, Fn: uint32(8)} // An instance of this object holds information (beyond pParse and pSelect) // needed to load the next result row that is to be added to the sorter. type RowLoadInfo = RowLoadInfo1 func innerLoopLoadRow(tls *libc.TLS, pParse uintptr, pSelect uintptr, pInfo uintptr) { Xsqlite3ExprCodeExprList(tls, pParse, (*Select)(unsafe.Pointer(pSelect)).FpEList, (*RowLoadInfo)(unsafe.Pointer(pInfo)).FregResult, 0, (*RowLoadInfo)(unsafe.Pointer(pInfo)).FecelFlags) } func makeSorterRecord(tls *libc.TLS, pParse uintptr, pSort uintptr, pSelect uintptr, regBase int32, nBase int32) int32 { var nOBSat int32 = (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var regOut int32 = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) if (*SortCtx)(unsafe.Pointer(pSort)).FpDeferredRowLoad != 0 { innerLoopLoadRow(tls, pParse, pSelect, (*SortCtx)(unsafe.Pointer(pSort)).FpDeferredRowLoad) } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut) return regOut } func pushOntoSorter(tls *libc.TLS, pParse uintptr, pSort uintptr, pSelect uintptr, regData int32, regOrigData int32, nData int32, nPrefixReg int32) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var bSeq int32 = libc.Bool32(int32((*SortCtx)(unsafe.Pointer(pSort)).FsortFlags)&SORTFLAG_UseSorter == 0) var nExpr int32 = (*ExprList)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy)).FnExpr var nBase int32 = nExpr + bSeq + nData var regBase int32 var regRecord int32 = 0 var nOBSat int32 = (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat var op int32 var iLimit int32 var iSkip int32 = 0 if nPrefixReg != 0 { regBase = regData - nPrefixReg } else { regBase = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nBase } if (*Select)(unsafe.Pointer(pSelect)).FiOffset != 0 { iLimit = (*Select)(unsafe.Pointer(pSelect)).FiOffset + 1 } else { iLimit = (*Select)(unsafe.Pointer(pSelect)).FiLimit } (*SortCtx)(unsafe.Pointer(pSort)).FlabelDone = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3ExprCodeExprList(tls, pParse, (*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy, regBase, regOrigData, uint8(SQLITE_ECEL_DUP|func() int32 { if regOrigData != 0 { return SQLITE_ECEL_REF } return 0 }())) if bSeq != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Sequence, (*SortCtx)(unsafe.Pointer(pSort)).FiECursor, regBase+nExpr) } if nPrefixReg == 0 && nData > 0 { Xsqlite3ExprCodeMove(tls, pParse, regData, regBase+nExpr+bSeq, nData) } if nOBSat > 0 { var regPrevKey int32 var addrFirst int32 var addrJmp int32 var pOp uintptr var nKey int32 var pKI uintptr regRecord = makeSorterRecord(tls, pParse, pSort, pSelect, regBase, nBase) regPrevKey = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat nKey = nExpr - (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat + bSeq if bSeq != 0 { addrFirst = Xsqlite3VdbeAddOp1(tls, v, OP_IfNot, regBase+nExpr) } else { addrFirst = Xsqlite3VdbeAddOp1(tls, v, OP_SequenceTest, (*SortCtx)(unsafe.Pointer(pSort)).FiECursor) } Xsqlite3VdbeAddOp3(tls, v, OP_Compare, regPrevKey, regBase, (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat) pOp = Xsqlite3VdbeGetOp(tls, v, (*SortCtx)(unsafe.Pointer(pSort)).FaddrSortIndex) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { return } (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 = nKey + nData pKI = *(*uintptr)(unsafe.Pointer(pOp + 16)) libc.Xmemset(tls, (*KeyInfo)(unsafe.Pointer(pKI)).FaSortFlags, 0, uint64((*KeyInfo)(unsafe.Pointer(pKI)).FnKeyField)) Xsqlite3VdbeChangeP4(tls, v, -1, pKI, -8) *(*uintptr)(unsafe.Pointer(pOp + 16)) = Xsqlite3KeyInfoFromExprList(tls, pParse, (*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy, nOBSat, int32((*KeyInfo)(unsafe.Pointer(pKI)).FnAllField)-int32((*KeyInfo)(unsafe.Pointer(pKI)).FnKeyField)-1) pOp = uintptr(0) addrJmp = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp3(tls, v, OP_Jump, addrJmp+1, 0, addrJmp+1) (*SortCtx)(unsafe.Pointer(pSort)).FlabelBkOut = Xsqlite3VdbeMakeLabel(tls, pParse) (*SortCtx)(unsafe.Pointer(pSort)).FregReturn = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*SortCtx)(unsafe.Pointer(pSort)).FregReturn, (*SortCtx)(unsafe.Pointer(pSort)).FlabelBkOut) Xsqlite3VdbeAddOp1(tls, v, OP_ResetSorter, (*SortCtx)(unsafe.Pointer(pSort)).FiECursor) if iLimit != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_IfNot, iLimit, (*SortCtx)(unsafe.Pointer(pSort)).FlabelDone) } Xsqlite3VdbeJumpHere(tls, v, addrFirst) Xsqlite3ExprCodeMove(tls, pParse, regBase, regPrevKey, (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat) Xsqlite3VdbeJumpHere(tls, v, addrJmp) } if iLimit != 0 { var iCsr int32 = (*SortCtx)(unsafe.Pointer(pSort)).FiECursor Xsqlite3VdbeAddOp2(tls, v, OP_IfNotZero, iLimit, Xsqlite3VdbeCurrentAddr(tls, v)+4) Xsqlite3VdbeAddOp2(tls, v, OP_Last, iCsr, 0) iSkip = Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxLE, iCsr, 0, regBase+nOBSat, nExpr-nOBSat) Xsqlite3VdbeAddOp1(tls, v, OP_Delete, iCsr) } if regRecord == 0 { regRecord = makeSorterRecord(tls, pParse, pSort, pSelect, regBase, nBase) } if int32((*SortCtx)(unsafe.Pointer(pSort)).FsortFlags)&SORTFLAG_UseSorter != 0 { op = OP_SorterInsert } else { op = OP_IdxInsert } Xsqlite3VdbeAddOp4Int(tls, v, op, (*SortCtx)(unsafe.Pointer(pSort)).FiECursor, regRecord, regBase+nOBSat, nBase-nOBSat) if iSkip != 0 { Xsqlite3VdbeChangeP2(tls, v, iSkip, func() int32 { if (*SortCtx)(unsafe.Pointer(pSort)).FlabelOBLopt != 0 { return (*SortCtx)(unsafe.Pointer(pSort)).FlabelOBLopt } return Xsqlite3VdbeCurrentAddr(tls, v) }()) } } func codeOffset(tls *libc.TLS, v uintptr, iOffset int32, iContinue int32) { if iOffset > 0 { Xsqlite3VdbeAddOp3(tls, v, OP_IfPos, iOffset, iContinue, 1) } } func codeDistinct(tls *libc.TLS, pParse uintptr, eTnctType int32, iTab int32, addrRepeat int32, pEList uintptr, regElem int32) int32 { var iRet int32 = 0 var nResultCol int32 = (*ExprList)(unsafe.Pointer(pEList)).FnExpr var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe switch eTnctType { case WHERE_DISTINCT_ORDERED: { var i int32 var iJump int32 var regPrev int32 iRet = libc.AssignInt32(®Prev, (*Parse)(unsafe.Pointer(pParse)).FnMem+1) *(*int32)(unsafe.Pointer(pParse + 56)) += nResultCol iJump = Xsqlite3VdbeCurrentAddr(tls, v) + nResultCol for i = 0; i < nResultCol; i++ { var pColl uintptr = Xsqlite3ExprCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(i)*32)).FpExpr) if i < nResultCol-1 { Xsqlite3VdbeAddOp3(tls, v, OP_Ne, regElem+i, iJump, regPrev+i) } else { Xsqlite3VdbeAddOp3(tls, v, OP_Eq, regElem+i, addrRepeat, regPrev+i) } Xsqlite3VdbeChangeP4(tls, v, -1, pColl, -2) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NULLEQ)) } Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regElem, regPrev, nResultCol-1) break } case WHERE_DISTINCT_UNIQUE: { break } default: { var r1 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, iTab, addrRepeat, regElem, nResultCol) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regElem, nResultCol, r1) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iTab, r1, regElem, nResultCol) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_USESEEKRESULT)) Xsqlite3ReleaseTempReg(tls, pParse, r1) iRet = iTab break } } return iRet } func fixDistinctOpenEph(tls *libc.TLS, pParse uintptr, eTnctType int32, iVal int32, iOpenEphAddr int32) { if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 && (eTnctType == WHERE_DISTINCT_UNIQUE || eTnctType == WHERE_DISTINCT_ORDERED) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe Xsqlite3VdbeChangeToNoop(tls, v, iOpenEphAddr) if int32((*VdbeOp)(unsafe.Pointer(Xsqlite3VdbeGetOp(tls, v, iOpenEphAddr+1))).Fopcode) == OP_Explain { Xsqlite3VdbeChangeToNoop(tls, v, iOpenEphAddr+1) } if eTnctType == WHERE_DISTINCT_ORDERED { var pOp uintptr = Xsqlite3VdbeGetOp(tls, v, iOpenEphAddr) (*VdbeOp)(unsafe.Pointer(pOp)).Fopcode = U8(OP_Null) (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = 1 (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 = iVal } } } func selectInnerLoop(tls *libc.TLS, pParse uintptr, p uintptr, srcTab int32, pSort uintptr, pDistinct uintptr, pDest uintptr, iContinue int32, iBreak int32) { bp := tls.Alloc(8) defer tls.Free(8) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var i int32 var hasDistinct int32 var eDest int32 = int32((*SelectDest)(unsafe.Pointer(pDest)).FeDest) var iParm int32 = (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm var nResultCol int32 var nPrefixReg int32 = 0 var regResult int32 var regOrig int32 if pDistinct != 0 { hasDistinct = int32((*DistinctCtx)(unsafe.Pointer(pDistinct)).FeTnctType) } else { hasDistinct = WHERE_DISTINCT_NOOP } if pSort != 0 && (*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy == uintptr(0) { pSort = uintptr(0) } if pSort == uintptr(0) && !(hasDistinct != 0) { codeOffset(tls, v, (*Select)(unsafe.Pointer(p)).FiOffset, iContinue) } nResultCol = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr if (*SelectDest)(unsafe.Pointer(pDest)).FiSdst == 0 { if pSort != 0 { nPrefixReg = (*ExprList)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy)).FnExpr if !(int32((*SortCtx)(unsafe.Pointer(pSort)).FsortFlags)&SORTFLAG_UseSorter != 0) { nPrefixReg++ } *(*int32)(unsafe.Pointer(pParse + 56)) += nPrefixReg } (*SelectDest)(unsafe.Pointer(pDest)).FiSdst = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nResultCol } else if (*SelectDest)(unsafe.Pointer(pDest)).FiSdst+nResultCol > (*Parse)(unsafe.Pointer(pParse)).FnMem { *(*int32)(unsafe.Pointer(pParse + 56)) += nResultCol } (*SelectDest)(unsafe.Pointer(pDest)).FnSdst = nResultCol regOrig = libc.AssignInt32(®Result, (*SelectDest)(unsafe.Pointer(pDest)).FiSdst) if srcTab >= 0 { for i = 0; i < nResultCol; i++ { Xsqlite3VdbeAddOp3(tls, v, OP_Column, srcTab, i, regResult+i) } } else if eDest != SRT_Exists { var ecelFlags U8 var pEList uintptr if eDest == SRT_Mem || eDest == SRT_Output || eDest == SRT_Coroutine { ecelFlags = U8(SQLITE_ECEL_DUP) } else { ecelFlags = U8(0) } if pSort != 0 && hasDistinct == 0 && eDest != SRT_EphemTab && eDest != SRT_Table { ecelFlags = U8(int32(ecelFlags) | (SQLITE_ECEL_OMITREF | SQLITE_ECEL_REF)) for i = (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat; i < (*ExprList)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy)).FnExpr; i++ { var j int32 if libc.AssignInt32(&j, int32(*(*U16)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy + 8 + uintptr(i)*32 + 24)))) > 0 { *(*U16)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList + 8 + uintptr(j-1)*32 + 24)) = U16(i + 1 - (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat) } } pEList = (*Select)(unsafe.Pointer(p)).FpEList for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { if int32(*(*U16)(unsafe.Pointer(pEList + 8 + uintptr(i)*32 + 24))) > 0 { nResultCol-- regOrig = 0 } } } (*RowLoadInfo)(unsafe.Pointer(bp)).FregResult = regResult (*RowLoadInfo)(unsafe.Pointer(bp)).FecelFlags = ecelFlags if (*Select)(unsafe.Pointer(p)).FiLimit != 0 && int32(ecelFlags)&SQLITE_ECEL_OMITREF != 0 && nPrefixReg > 0 { (*SortCtx)(unsafe.Pointer(pSort)).FpDeferredRowLoad = bp regOrig = 0 } else { innerLoopLoadRow(tls, pParse, p, bp) } } if hasDistinct != 0 { var eType int32 = int32((*DistinctCtx)(unsafe.Pointer(pDistinct)).FeTnctType) var iTab int32 = (*DistinctCtx)(unsafe.Pointer(pDistinct)).FtabTnct iTab = codeDistinct(tls, pParse, eType, iTab, iContinue, (*Select)(unsafe.Pointer(p)).FpEList, regResult) fixDistinctOpenEph(tls, pParse, eType, iTab, (*DistinctCtx)(unsafe.Pointer(pDistinct)).FaddrTnct) if pSort == uintptr(0) { codeOffset(tls, v, (*Select)(unsafe.Pointer(p)).FiOffset, iContinue) } } switch eDest { case SRT_Union: { var r1 int32 r1 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regResult, nResultCol, r1) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iParm, r1, regResult, nResultCol) Xsqlite3ReleaseTempReg(tls, pParse, r1) break } case SRT_Except: { Xsqlite3VdbeAddOp3(tls, v, OP_IdxDelete, iParm, regResult, nResultCol) break } case SRT_Fifo: fallthrough case SRT_DistFifo: fallthrough case SRT_Table: fallthrough case SRT_EphemTab: { var r1 int32 = Xsqlite3GetTempRange(tls, pParse, nPrefixReg+1) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg) if eDest == SRT_DistFifo { var addr int32 = Xsqlite3VdbeCurrentAddr(tls, v) + 4 Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, iParm+1, addr, r1, 0) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iParm+1, r1, regResult, nResultCol) } if pSort != 0 { pushOntoSorter(tls, pParse, pSort, p, r1+nPrefixReg, regOrig, 1, nPrefixReg) } else { var r2 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, iParm, r2) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iParm, r1, r2) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_APPEND)) Xsqlite3ReleaseTempReg(tls, pParse, r2) } Xsqlite3ReleaseTempRange(tls, pParse, r1, nPrefixReg+1) break } case SRT_Upfrom: { if pSort != 0 { pushOntoSorter(tls, pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg) } else { var i2 int32 = (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm2 var r1 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regResult, iBreak) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regResult+libc.Bool32(i2 < 0), nResultCol-libc.Bool32(i2 < 0), r1) if i2 < 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iParm, r1, regResult) } else { Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iParm, r1, regResult, i2) } } break } case SRT_Set: { if pSort != 0 { pushOntoSorter(tls, pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg) } else { var r1 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, regResult, nResultCol, r1, (*SelectDest)(unsafe.Pointer(pDest)).FzAffSdst, nResultCol) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iParm, r1, regResult, nResultCol) Xsqlite3ReleaseTempReg(tls, pParse, r1) } break } case SRT_Exists: { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, iParm) break } case SRT_Mem: { if pSort != 0 { pushOntoSorter(tls, pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg) } else { } break } case SRT_Coroutine: fallthrough case SRT_Output: { if pSort != 0 { pushOntoSorter(tls, pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg) } else if eDest == SRT_Coroutine { Xsqlite3VdbeAddOp1(tls, v, OP_Yield, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm) } else { Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, regResult, nResultCol) } break } case SRT_DistQueue: fallthrough case SRT_Queue: { var nKey int32 var r1 int32 var r2 int32 var r3 int32 var addrTest int32 = 0 var pSO uintptr pSO = (*SelectDest)(unsafe.Pointer(pDest)).FpOrderBy nKey = (*ExprList)(unsafe.Pointer(pSO)).FnExpr r1 = Xsqlite3GetTempReg(tls, pParse) r2 = Xsqlite3GetTempRange(tls, pParse, nKey+2) r3 = r2 + nKey + 1 if eDest == SRT_DistQueue { addrTest = Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, iParm+1, 0, regResult, nResultCol) } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regResult, nResultCol, r3) if eDest == SRT_DistQueue { Xsqlite3VdbeAddOp2(tls, v, OP_IdxInsert, iParm+1, r3) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_USESEEKRESULT)) } for i = 0; i < nKey; i++ { Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, regResult+int32(*(*U16)(unsafe.Pointer(pSO + 8 + uintptr(i)*32 + 24)))-1, r2+i) } Xsqlite3VdbeAddOp2(tls, v, OP_Sequence, iParm, r2+nKey) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, r2, nKey+2, r1) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iParm, r1, r2, nKey+2) if addrTest != 0 { Xsqlite3VdbeJumpHere(tls, v, addrTest) } Xsqlite3ReleaseTempReg(tls, pParse, r1) Xsqlite3ReleaseTempRange(tls, pParse, r2, nKey+2) break } default: { break } } if pSort == uintptr(0) && (*Select)(unsafe.Pointer(p)).FiLimit != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_DecrJumpZero, (*Select)(unsafe.Pointer(p)).FiLimit, iBreak) } } // Allocate a KeyInfo object sufficient for an index of N key columns and // X extra columns. func Xsqlite3KeyInfoAlloc(tls *libc.TLS, db uintptr, N int32, X int32) uintptr { var nExtra int32 = int32(uint64(N+X)*(uint64(unsafe.Sizeof(uintptr(0)))+uint64(1)) - uint64(unsafe.Sizeof(uintptr(0)))) var p uintptr = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(KeyInfo{}))+uint64(nExtra)) if p != 0 { (*KeyInfo)(unsafe.Pointer(p)).FaSortFlags = p + 32 + uintptr(N+X)*8 (*KeyInfo)(unsafe.Pointer(p)).FnKeyField = U16(N) (*KeyInfo)(unsafe.Pointer(p)).FnAllField = U16(N + X) (*KeyInfo)(unsafe.Pointer(p)).Fenc = (*Sqlite3)(unsafe.Pointer(db)).Fenc (*KeyInfo)(unsafe.Pointer(p)).Fdb = db (*KeyInfo)(unsafe.Pointer(p)).FnRef = U32(1) libc.Xmemset(tls, p+1*40, 0, uint64(nExtra)) } else { return Xsqlite3OomFault(tls, db) } return p } // Deallocate a KeyInfo object func Xsqlite3KeyInfoUnref(tls *libc.TLS, p uintptr) { if p != 0 { (*KeyInfo)(unsafe.Pointer(p)).FnRef-- if (*KeyInfo)(unsafe.Pointer(p)).FnRef == U32(0) { Xsqlite3DbNNFreeNN(tls, (*KeyInfo)(unsafe.Pointer(p)).Fdb, p) } } } // Make a new pointer to a KeyInfo object func Xsqlite3KeyInfoRef(tls *libc.TLS, p uintptr) uintptr { if p != 0 { (*KeyInfo)(unsafe.Pointer(p)).FnRef++ } return p } // Given an expression list, generate a KeyInfo structure that records // the collating sequence for each expression in that expression list. // // If the ExprList is an ORDER BY or GROUP BY clause then the resulting // KeyInfo structure is appropriate for initializing a virtual index to // implement that clause. If the ExprList is the result set of a SELECT // then the KeyInfo structure is appropriate for initializing a virtual // index to implement a DISTINCT test. // // Space to hold the KeyInfo structure is obtained from malloc. The calling // function is responsible for seeing that this structure is eventually // freed. func Xsqlite3KeyInfoFromExprList(tls *libc.TLS, pParse uintptr, pList uintptr, iStart int32, nExtra int32) uintptr { var nExpr int32 var pInfo uintptr var pItem uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var i int32 nExpr = (*ExprList)(unsafe.Pointer(pList)).FnExpr pInfo = Xsqlite3KeyInfoAlloc(tls, db, nExpr-iStart, nExtra+1) if pInfo != 0 { i = iStart pItem = pList + 8 + uintptr(iStart)*32 __1: if !(i < nExpr) { goto __3 } { *(*uintptr)(unsafe.Pointer(pInfo + 32 + uintptr(i-iStart)*8)) = Xsqlite3ExprNNCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr) *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pInfo)).FaSortFlags + uintptr(i-iStart))) = (*ExprList_item)(unsafe.Pointer(pItem)).Ffg.FsortFlags } goto __2 __2: i++ pItem += 32 goto __1 goto __3 __3: } return pInfo } // Name of the connection operator, used for error messages. func Xsqlite3SelectOpName(tls *libc.TLS, id int32) uintptr { var z uintptr switch id { case TK_ALL: z = ts + 20115 break case TK_INTERSECT: z = ts + 20125 break case TK_EXCEPT: z = ts + 20135 break default: z = ts + 20142 break } return z } func explainTempTable(tls *libc.TLS, pParse uintptr, zUsage uintptr) { bp := tls.Alloc(8) defer tls.Free(8) Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+20148, libc.VaList(bp, zUsage)) } func generateSortTail(tls *libc.TLS, pParse uintptr, p uintptr, pSort uintptr, nColumn int32, pDest uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var addrBreak int32 = (*SortCtx)(unsafe.Pointer(pSort)).FlabelDone var addrContinue int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var addr int32 var addrOnce int32 = 0 var iTab int32 var pOrderBy uintptr = (*SortCtx)(unsafe.Pointer(pSort)).FpOrderBy var eDest int32 = int32((*SelectDest)(unsafe.Pointer(pDest)).FeDest) var iParm int32 = (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm var regRow int32 var regRowid int32 var iCol int32 var nKey int32 var iSortTab int32 var i int32 var bSeq int32 var nRefKey int32 = 0 var aOutEx uintptr = (*Select)(unsafe.Pointer(p)).FpEList + 8 Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+20171, libc.VaList(bp, func() uintptr { if (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat > 0 { return ts + 20202 } return ts + 1544 }())) if (*SortCtx)(unsafe.Pointer(pSort)).FlabelBkOut != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*SortCtx)(unsafe.Pointer(pSort)).FregReturn, (*SortCtx)(unsafe.Pointer(pSort)).FlabelBkOut) Xsqlite3VdbeGoto(tls, v, addrBreak) Xsqlite3VdbeResolveLabel(tls, v, (*SortCtx)(unsafe.Pointer(pSort)).FlabelBkOut) } iTab = (*SortCtx)(unsafe.Pointer(pSort)).FiECursor if eDest == SRT_Output || eDest == SRT_Coroutine || eDest == SRT_Mem { if eDest == SRT_Mem && (*Select)(unsafe.Pointer(p)).FiOffset != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*SelectDest)(unsafe.Pointer(pDest)).FiSdst) } regRowid = 0 regRow = (*SelectDest)(unsafe.Pointer(pDest)).FiSdst } else { regRowid = Xsqlite3GetTempReg(tls, pParse) if eDest == SRT_EphemTab || eDest == SRT_Table { regRow = Xsqlite3GetTempReg(tls, pParse) nColumn = 0 } else { regRow = Xsqlite3GetTempRange(tls, pParse, nColumn) } } nKey = (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr - (*SortCtx)(unsafe.Pointer(pSort)).FnOBSat if int32((*SortCtx)(unsafe.Pointer(pSort)).FsortFlags)&SORTFLAG_UseSorter != 0 { var regSortOut int32 = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) iSortTab = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) if (*SortCtx)(unsafe.Pointer(pSort)).FlabelBkOut != 0 { addrOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) } Xsqlite3VdbeAddOp3(tls, v, OP_OpenPseudo, iSortTab, regSortOut, nKey+1+nColumn+nRefKey) if addrOnce != 0 { Xsqlite3VdbeJumpHere(tls, v, addrOnce) } addr = 1 + Xsqlite3VdbeAddOp2(tls, v, OP_SorterSort, iTab, addrBreak) Xsqlite3VdbeAddOp3(tls, v, OP_SorterData, iTab, regSortOut, iSortTab) bSeq = 0 } else { addr = 1 + Xsqlite3VdbeAddOp2(tls, v, OP_Sort, iTab, addrBreak) codeOffset(tls, v, (*Select)(unsafe.Pointer(p)).FiOffset, addrContinue) iSortTab = iTab bSeq = 1 if (*Select)(unsafe.Pointer(p)).FiOffset > 0 { Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, (*Select)(unsafe.Pointer(p)).FiLimit, -1) } } i = 0 iCol = nKey + bSeq - 1 for ; i < nColumn; i++ { if int32(*(*U16)(unsafe.Pointer(aOutEx + uintptr(i)*32 + 24))) == 0 { iCol++ } } for i = nColumn - 1; i >= 0; i-- { { var iRead int32 if *(*U16)(unsafe.Pointer(aOutEx + uintptr(i)*32 + 24)) != 0 { iRead = int32(*(*U16)(unsafe.Pointer(aOutEx + uintptr(i)*32 + 24))) - 1 } else { iRead = libc.PostDecInt32(&iCol, 1) } Xsqlite3VdbeAddOp3(tls, v, OP_Column, iSortTab, iRead, regRow+i) } } switch eDest { case SRT_Table: fallthrough case SRT_EphemTab: { Xsqlite3VdbeAddOp3(tls, v, OP_Column, iSortTab, nKey+bSeq, regRow) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, iParm, regRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iParm, regRow, regRowid) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_APPEND)) break } case SRT_Set: { Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, regRow, nColumn, regRowid, (*SelectDest)(unsafe.Pointer(pDest)).FzAffSdst, nColumn) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iParm, regRowid, regRow, nColumn) break } case SRT_Mem: { break } case SRT_Upfrom: { var i2 int32 = (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm2 var r1 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regRow+libc.Bool32(i2 < 0), nColumn-libc.Bool32(i2 < 0), r1) if i2 < 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iParm, r1, regRow) } else { Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iParm, r1, regRow, i2) } break } default: { if eDest == SRT_Output { Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, (*SelectDest)(unsafe.Pointer(pDest)).FiSdst, nColumn) } else { Xsqlite3VdbeAddOp1(tls, v, OP_Yield, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm) } break } } if regRowid != 0 { if eDest == SRT_Set { Xsqlite3ReleaseTempRange(tls, pParse, regRow, nColumn) } else { Xsqlite3ReleaseTempReg(tls, pParse, regRow) } Xsqlite3ReleaseTempReg(tls, pParse, regRowid) } Xsqlite3VdbeResolveLabel(tls, v, addrContinue) if int32((*SortCtx)(unsafe.Pointer(pSort)).FsortFlags)&SORTFLAG_UseSorter != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_SorterNext, iTab, addr) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Next, iTab, addr) } if (*SortCtx)(unsafe.Pointer(pSort)).FregReturn != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_Return, (*SortCtx)(unsafe.Pointer(pSort)).FregReturn) } Xsqlite3VdbeResolveLabel(tls, v, addrBreak) } func columnTypeImpl(tls *libc.TLS, pNC uintptr, pExpr uintptr, pzOrigDb uintptr, pzOrigTab uintptr, pzOrigCol uintptr) uintptr { bp := tls.Alloc(136) defer tls.Free(136) var zType uintptr = uintptr(0) var j int32 *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 72)) = uintptr(0) switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { case TK_COLUMN: { var pTab uintptr = uintptr(0) var pS uintptr = uintptr(0) var iCol int32 = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) for pNC != 0 && !(pTab != 0) { var pTabList uintptr = (*NameContext)(unsafe.Pointer(pNC)).FpSrcList for j = 0; j < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc && (*SrcItem)(unsafe.Pointer(pTabList+8+uintptr(j)*104)).FiCursor != (*Expr)(unsafe.Pointer(pExpr)).FiTable; j++ { } if j < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc { pTab = (*SrcItem)(unsafe.Pointer(pTabList + 8 + uintptr(j)*104)).FpTab pS = (*SrcItem)(unsafe.Pointer(pTabList + 8 + uintptr(j)*104)).FpSelect } else { pNC = (*NameContext)(unsafe.Pointer(pNC)).FpNext } } if pTab == uintptr(0) { break } if pS != 0 { if iCol < (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pS)).FpEList)).FnExpr && iCol >= 0 { var p uintptr = (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(pS)).FpEList + 8 + uintptr(iCol)*32)).FpExpr (*NameContext)(unsafe.Pointer(bp)).FpSrcList = (*Select)(unsafe.Pointer(pS)).FpSrc (*NameContext)(unsafe.Pointer(bp)).FpNext = pNC (*NameContext)(unsafe.Pointer(bp)).FpParse = (*NameContext)(unsafe.Pointer(pNC)).FpParse zType = columnTypeImpl(tls, bp, p, bp+56, bp+64, bp+72) } } else { if iCol < 0 { iCol = int32((*Table)(unsafe.Pointer(pTab)).FiPKey) } if iCol < 0 { zType = ts + 1109 *(*uintptr)(unsafe.Pointer(bp + 72)) = ts + 17625 } else { *(*uintptr)(unsafe.Pointer(bp + 72)) = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24)).FzCnName zType = Xsqlite3ColumnType(tls, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24, uintptr(0)) } *(*uintptr)(unsafe.Pointer(bp + 64)) = (*Table)(unsafe.Pointer(pTab)).FzName if (*NameContext)(unsafe.Pointer(pNC)).FpParse != 0 && (*Table)(unsafe.Pointer(pTab)).FpSchema != 0 { var iDb int32 = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer((*NameContext)(unsafe.Pointer(pNC)).FpParse)).Fdb, (*Table)(unsafe.Pointer(pTab)).FpSchema) *(*uintptr)(unsafe.Pointer(bp + 56)) = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer((*NameContext)(unsafe.Pointer(pNC)).FpParse)).Fdb)).FaDb + uintptr(iDb)*32)).FzDbSName } } break } case TK_SELECT: { var pS uintptr var p uintptr pS = *(*uintptr)(unsafe.Pointer(pExpr + 32)) p = (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(pS)).FpEList + 8)).FpExpr (*NameContext)(unsafe.Pointer(bp + 80)).FpSrcList = (*Select)(unsafe.Pointer(pS)).FpSrc (*NameContext)(unsafe.Pointer(bp + 80)).FpNext = pNC (*NameContext)(unsafe.Pointer(bp + 80)).FpParse = (*NameContext)(unsafe.Pointer(pNC)).FpParse zType = columnTypeImpl(tls, bp+80, p, bp+56, bp+64, bp+72) break } } if pzOrigDb != 0 { *(*uintptr)(unsafe.Pointer(pzOrigDb)) = *(*uintptr)(unsafe.Pointer(bp + 56)) *(*uintptr)(unsafe.Pointer(pzOrigTab)) = *(*uintptr)(unsafe.Pointer(bp + 64)) *(*uintptr)(unsafe.Pointer(pzOrigCol)) = *(*uintptr)(unsafe.Pointer(bp + 72)) } return zType } func generateColumnTypes(tls *libc.TLS, pParse uintptr, pTabList uintptr, pEList uintptr) { bp := tls.Alloc(80) defer tls.Free(80) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var i int32 (*NameContext)(unsafe.Pointer(bp)).FpSrcList = pTabList (*NameContext)(unsafe.Pointer(bp)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp)).FpNext = uintptr(0) for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { var p uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FpExpr var zType uintptr *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 72)) = uintptr(0) zType = columnTypeImpl(tls, bp, p, bp+56, bp+64, bp+72) Xsqlite3VdbeSetColName(tls, v, i, COLNAME_DATABASE, *(*uintptr)(unsafe.Pointer(bp + 56)), libc.UintptrFromInt32(-1)) Xsqlite3VdbeSetColName(tls, v, i, COLNAME_TABLE, *(*uintptr)(unsafe.Pointer(bp + 64)), libc.UintptrFromInt32(-1)) Xsqlite3VdbeSetColName(tls, v, i, COLNAME_COLUMN, *(*uintptr)(unsafe.Pointer(bp + 72)), libc.UintptrFromInt32(-1)) Xsqlite3VdbeSetColName(tls, v, i, COLNAME_DECLTYPE, zType, libc.UintptrFromInt32(-1)) } } // Compute the column names for a SELECT statement. // // The only guarantee that SQLite makes about column names is that if the // column has an AS clause assigning it a name, that will be the name used. // That is the only documented guarantee. However, countless applications // developed over the years have made baseless assumptions about column names // and will break if those assumptions changes. Hence, use extreme caution // when modifying this routine to avoid breaking legacy. // // See Also: sqlite3ColumnsFromExprList() // // The PRAGMA short_column_names and PRAGMA full_column_names settings are // deprecated. The default setting is short=ON, full=OFF. 99.9% of all // applications should operate this way. Nevertheless, we need to support the // other modes for legacy: // // short=OFF, full=OFF: Column name is the text of the expression has it // originally appears in the SELECT statement. In // other words, the zSpan of the result expression. // // short=ON, full=OFF: (This is the default setting). If the result // refers directly to a table column, then the // result column name is just the table column // name: COLUMN. Otherwise use zSpan. // // full=ON, short=ANY: If the result refers directly to a table column, // then the result column name with the table name // prefix, ex: TABLE.COLUMN. Otherwise use zSpan. func Xsqlite3GenerateColumnNames(tls *libc.TLS, pParse uintptr, pSelect uintptr) { bp := tls.Alloc(24) defer tls.Free(24) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var i int32 var pTab uintptr var pTabList uintptr var pEList uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var fullName int32 var srcName int32 if (*Parse)(unsafe.Pointer(pParse)).Fexplain != 0 { return } if (*Parse)(unsafe.Pointer(pParse)).FcolNamesSet != 0 { return } for (*Select)(unsafe.Pointer(pSelect)).FpPrior != 0 { pSelect = (*Select)(unsafe.Pointer(pSelect)).FpPrior } pTabList = (*Select)(unsafe.Pointer(pSelect)).FpSrc pEList = (*Select)(unsafe.Pointer(pSelect)).FpEList (*Parse)(unsafe.Pointer(pParse)).FcolNamesSet = U8(1) fullName = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_FullColNames) != uint64(0)) srcName = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ShortColNames) != uint64(0) || fullName != 0) Xsqlite3VdbeSetNumCols(tls, v, (*ExprList)(unsafe.Pointer(pEList)).FnExpr) for i = 0; i < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; i++ { var p uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FpExpr if (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(i)*32)).FzEName != 0 && int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(i)*32 + 16 + 4))&0x3>>0) == ENAME_NAME { var zName uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FzEName Xsqlite3VdbeSetColName(tls, v, i, COLNAME_NAME, zName, libc.UintptrFromInt32(-1)) } else if srcName != 0 && int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_COLUMN { var zCol uintptr var iCol int32 = int32((*Expr)(unsafe.Pointer(p)).FiColumn) pTab = *(*uintptr)(unsafe.Pointer(p + 64)) if iCol < 0 { iCol = int32((*Table)(unsafe.Pointer(pTab)).FiPKey) } if iCol < 0 { zCol = ts + 17625 } else { zCol = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24)).FzCnName } if fullName != 0 { var zName uintptr = uintptr(0) zName = Xsqlite3MPrintf(tls, db, ts+13413, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName, zCol)) Xsqlite3VdbeSetColName(tls, v, i, COLNAME_NAME, zName, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) } else { Xsqlite3VdbeSetColName(tls, v, i, COLNAME_NAME, zCol, libc.UintptrFromInt32(-1)) } } else { var z uintptr = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(i)*32)).FzEName if z == uintptr(0) { z = Xsqlite3MPrintf(tls, db, ts+20217, libc.VaList(bp+16, i+1)) } else { z = Xsqlite3DbStrDup(tls, db, z) } Xsqlite3VdbeSetColName(tls, v, i, COLNAME_NAME, z, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3OomClear}))) } } generateColumnTypes(tls, pParse, pTabList, pEList) } // Given an expression list (which is really the list of expressions // that form the result set of a SELECT statement) compute appropriate // column names for a table that would hold the expression list. // // All column names will be unique. // // Only the column names are computed. Column.zType, Column.zColl, // and other fields of Column are zeroed. // // Return SQLITE_OK on success. If a memory allocation error occurs, // store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM. // // The only guarantee that SQLite makes about column names is that if the // column has an AS clause assigning it a name, that will be the name used. // That is the only documented guarantee. However, countless applications // developed over the years have made baseless assumptions about column names // and will break if those assumptions changes. Hence, use extreme caution // when modifying this routine to avoid breaking legacy. // // See Also: sqlite3GenerateColumnNames() func Xsqlite3ColumnsFromExprList(tls *libc.TLS, pParse uintptr, pEList uintptr, pnCol uintptr, paCol uintptr) int32 { bp := tls.Alloc(60) defer tls.Free(60) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var i int32 var j int32 var aCol uintptr var pCol uintptr var nCol int32 var zName uintptr var nName int32 var pTab uintptr Xsqlite3HashInit(tls, bp+32) if pEList != 0 { nCol = (*ExprList)(unsafe.Pointer(pEList)).FnExpr aCol = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Column{}))*uint64(nCol)) if nCol > 32767 { nCol = 32767 } } else { nCol = 0 aCol = uintptr(0) } *(*I16)(unsafe.Pointer(pnCol)) = I16(nCol) *(*uintptr)(unsafe.Pointer(paCol)) = aCol i = 0 pCol = aCol __1: if !(i < nCol && !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0)) { goto __3 } { var pX uintptr = pEList + 8 + uintptr(i)*32 var pCollide uintptr if libc.AssignUintptr(&zName, (*ExprList_item)(unsafe.Pointer(pX)).FzEName) != uintptr(0) && int32(*(*uint16)(unsafe.Pointer(pX + 16 + 4))&0x3>>0) == ENAME_NAME { } else { var pColExpr uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, (*ExprList_item)(unsafe.Pointer(pX)).FpExpr) for pColExpr != uintptr(0) && int32((*Expr)(unsafe.Pointer(pColExpr)).Fop) == TK_DOT { pColExpr = (*Expr)(unsafe.Pointer(pColExpr)).FpRight } if int32((*Expr)(unsafe.Pointer(pColExpr)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pColExpr)).Fflags&U32(EP_WinFunc|EP_Subrtn) == U32(0) && *(*uintptr)(unsafe.Pointer(pColExpr + 64)) != uintptr(0) { var iCol int32 = int32((*Expr)(unsafe.Pointer(pColExpr)).FiColumn) pTab = *(*uintptr)(unsafe.Pointer(pColExpr + 64)) if iCol < 0 { iCol = int32((*Table)(unsafe.Pointer(pTab)).FiPKey) } if iCol >= 0 { zName = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24)).FzCnName } else { zName = ts + 17625 } } else if int32((*Expr)(unsafe.Pointer(pColExpr)).Fop) == TK_ID { zName = *(*uintptr)(unsafe.Pointer(pColExpr + 8)) } else { } } if zName != 0 && !(Xsqlite3IsTrueOrFalse(tls, zName) != 0) { zName = Xsqlite3DbStrDup(tls, db, zName) } else { zName = Xsqlite3MPrintf(tls, db, ts+20217, libc.VaList(bp, i+1)) } *(*U32)(unsafe.Pointer(bp + 56)) = U32(0) for zName != 0 && libc.AssignUintptr(&pCollide, Xsqlite3HashFind(tls, bp+32, zName)) != uintptr(0) { if uint32(int32(*(*uint16)(unsafe.Pointer(pCollide + 16 + 4))&0x80>>7)) != 0 { *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_NOEXPAND) } nName = Xsqlite3Strlen30(tls, zName) if nName > 0 { for j = nName - 1; j > 0 && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zName + uintptr(j))))])&0x04 != 0; j-- { } if int32(*(*int8)(unsafe.Pointer(zName + uintptr(j)))) == ':' { nName = j } } zName = Xsqlite3MPrintf(tls, db, ts+20226, libc.VaList(bp+8, nName, zName, libc.PreIncUint32(&*(*U32)(unsafe.Pointer(bp + 56)), 1))) Xsqlite3ProgressCheck(tls, pParse) if *(*U32)(unsafe.Pointer(bp + 56)) > U32(3) { Xsqlite3_randomness(tls, int32(unsafe.Sizeof(U32(0))), bp+56) } } (*Column)(unsafe.Pointer(pCol)).FzCnName = zName (*Column)(unsafe.Pointer(pCol)).FhName = Xsqlite3StrIHash(tls, zName) if uint32(int32(*(*uint16)(unsafe.Pointer(pX + 16 + 4))&0x100>>8)) != 0 { *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_NOEXPAND) } if zName != 0 && Xsqlite3HashInsert(tls, bp+32, zName, pX) == pX { Xsqlite3OomFault(tls, db) } } goto __2 __2: i++ pCol += 24 goto __1 goto __3 __3: ; Xsqlite3HashClear(tls, bp+32) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { for j = 0; j < i; j++ { Xsqlite3DbFree(tls, db, (*Column)(unsafe.Pointer(aCol+uintptr(j)*24)).FzCnName) } Xsqlite3DbFree(tls, db, aCol) *(*uintptr)(unsafe.Pointer(paCol)) = uintptr(0) *(*I16)(unsafe.Pointer(pnCol)) = int16(0) return (*Parse)(unsafe.Pointer(pParse)).Frc } return SQLITE_OK } // pTab is a transient Table object that represents a subquery of some // kind (maybe a parenthesized subquery in the FROM clause of a larger // query, or a VIEW, or a CTE). This routine computes type information // for that Table object based on the Select object that implements the // subquery. For the purposes of this routine, "type infomation" means: // // - The datatype name, as it might appear in a CREATE TABLE statement // - Which collating sequence to use for the column // - The affinity of the column func Xsqlite3SubqueryColumnTypes(tls *libc.TLS, pParse uintptr, pTab uintptr, pSelect uintptr, aff int8) { bp := tls.Alloc(56) defer tls.Free(56) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pCol uintptr var pColl uintptr var i int32 var j int32 var p uintptr var a uintptr if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return } for (*Select)(unsafe.Pointer(pSelect)).FpPrior != 0 { pSelect = (*Select)(unsafe.Pointer(pSelect)).FpPrior } a = (*Select)(unsafe.Pointer(pSelect)).FpEList + 8 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp)).FpSrcList = (*Select)(unsafe.Pointer(pSelect)).FpSrc i = 0 pCol = (*Table)(unsafe.Pointer(pTab)).FaCol __1: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __3 } { var zType uintptr var n I64 *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(int32((*Column)(unsafe.Pointer(pCol)).FcolFlags) & COLFLAG_NOINSERT) p = (*ExprList_item)(unsafe.Pointer(a + uintptr(i)*32)).FpExpr (*Column)(unsafe.Pointer(pCol)).Faffinity = Xsqlite3ExprAffinity(tls, p) if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) <= SQLITE_AFF_NONE { (*Column)(unsafe.Pointer(pCol)).Faffinity = aff } if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) >= SQLITE_AFF_TEXT && (*Select)(unsafe.Pointer(pSelect)).FpNext != 0 { var m int32 = 0 var pS2 uintptr m = 0 pS2 = (*Select)(unsafe.Pointer(pSelect)).FpNext for ; pS2 != 0; pS2 = (*Select)(unsafe.Pointer(pS2)).FpNext { m = m | Xsqlite3ExprDataType(tls, (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(pS2)).FpEList+8+uintptr(i)*32)).FpExpr) } if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) == SQLITE_AFF_TEXT && m&0x01 != 0 { (*Column)(unsafe.Pointer(pCol)).Faffinity = int8(SQLITE_AFF_BLOB) } else if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) >= SQLITE_AFF_NUMERIC && m&0x02 != 0 { (*Column)(unsafe.Pointer(pCol)).Faffinity = int8(SQLITE_AFF_BLOB) } if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) >= SQLITE_AFF_NUMERIC && int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_CAST { (*Column)(unsafe.Pointer(pCol)).Faffinity = int8(SQLITE_AFF_FLEXNUM) } } zType = columnTypeImpl(tls, bp, p, uintptr(0), uintptr(0), uintptr(0)) if zType == uintptr(0) || int32((*Column)(unsafe.Pointer(pCol)).Faffinity) != int32(Xsqlite3AffinityType(tls, zType, uintptr(0))) { if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) == SQLITE_AFF_NUMERIC || int32((*Column)(unsafe.Pointer(pCol)).Faffinity) == SQLITE_AFF_FLEXNUM { zType = ts + 20234 } else { zType = uintptr(0) for j = 1; j < SQLITE_N_STDTYPE; j++ { if int32(Xsqlite3StdTypeAffinity[j]) == int32((*Column)(unsafe.Pointer(pCol)).Faffinity) { zType = Xsqlite3StdType[j] break } } } } if zType != 0 { var m I64 = I64(Xsqlite3Strlen30(tls, zType)) n = I64(Xsqlite3Strlen30(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName)) (*Column)(unsafe.Pointer(pCol)).FzCnName = Xsqlite3DbReallocOrFree(tls, db, (*Column)(unsafe.Pointer(pCol)).FzCnName, uint64(n+m+int64(2))) if (*Column)(unsafe.Pointer(pCol)).FzCnName != 0 { libc.Xmemcpy(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName+uintptr(n+int64(1)), zType, uint64(m+int64(1))) *(*U16)(unsafe.Pointer(pCol + 16)) |= U16(COLFLAG_HASTYPE) } else { *(*U16)(unsafe.Pointer(pCol + 16)) &= libc.Uint16FromInt32(libc.CplInt32(COLFLAG_HASTYPE | COLFLAG_HASCOLL)) } } pColl = Xsqlite3ExprCollSeq(tls, pParse, p) if pColl != 0 { Xsqlite3ColumnSetColl(tls, db, pCol, (*CollSeq)(unsafe.Pointer(pColl)).FzName) } } goto __2 __2: i++ pCol += 24 goto __1 goto __3 __3: ; (*Table)(unsafe.Pointer(pTab)).FszTabRow = int16(1) } // Given a SELECT statement, generate a Table structure that describes // the result set of that SELECT. func Xsqlite3ResultSetOfSelect(tls *libc.TLS, pParse uintptr, pSelect uintptr, aff int8) uintptr { var pTab uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var savedFlags U64 savedFlags = (*Sqlite3)(unsafe.Pointer(db)).Fflags *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_FullColNames)) *(*U64)(unsafe.Pointer(db + 48)) |= uint64(SQLITE_ShortColNames) Xsqlite3SelectPrep(tls, pParse, pSelect, uintptr(0)) (*Sqlite3)(unsafe.Pointer(db)).Fflags = savedFlags if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return uintptr(0) } for (*Select)(unsafe.Pointer(pSelect)).FpPrior != 0 { pSelect = (*Select)(unsafe.Pointer(pSelect)).FpPrior } pTab = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Table{}))) if pTab == uintptr(0) { return uintptr(0) } (*Table)(unsafe.Pointer(pTab)).FnTabRef = U32(1) (*Table)(unsafe.Pointer(pTab)).FzName = uintptr(0) (*Table)(unsafe.Pointer(pTab)).FnRowLogEst = int16(200) Xsqlite3ColumnsFromExprList(tls, pParse, (*Select)(unsafe.Pointer(pSelect)).FpEList, pTab+54, pTab+8) Xsqlite3SubqueryColumnTypes(tls, pParse, pTab, pSelect, aff) (*Table)(unsafe.Pointer(pTab)).FiPKey = int16(-1) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3DeleteTable(tls, db, pTab) return uintptr(0) } return pTab } // Get a VDBE for the given parser context. Create a new one if necessary. // If an error occurs, return NULL and leave a message in pParse. func Xsqlite3GetVdbe(tls *libc.TLS, pParse uintptr) uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpVdbe != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpVdbe } if (*Parse)(unsafe.Pointer(pParse)).FpToplevel == uintptr(0) && (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FdbOptFlags&U32(SQLITE_FactorOutConst) == U32(0) { (*Parse)(unsafe.Pointer(pParse)).FokConstFactor = U8(1) } return Xsqlite3VdbeCreate(tls, pParse) } func computeLimitRegisters(tls *libc.TLS, pParse uintptr, p uintptr, iBreak int32) { bp := tls.Alloc(4) defer tls.Free(4) var v uintptr = uintptr(0) var iLimit int32 = 0 var iOffset int32 var pLimit uintptr = (*Select)(unsafe.Pointer(p)).FpLimit if (*Select)(unsafe.Pointer(p)).FiLimit != 0 { return } if pLimit != 0 { (*Select)(unsafe.Pointer(p)).FiLimit = libc.AssignInt32(&iLimit, libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1)) v = Xsqlite3GetVdbe(tls, pParse) if Xsqlite3ExprIsInteger(tls, (*Expr)(unsafe.Pointer(pLimit)).FpLeft, bp) != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, *(*int32)(unsafe.Pointer(bp)), iLimit) if *(*int32)(unsafe.Pointer(bp)) == 0 { Xsqlite3VdbeGoto(tls, v, iBreak) } else if *(*int32)(unsafe.Pointer(bp)) >= 0 && int32((*Select)(unsafe.Pointer(p)).FnSelectRow) > int32(Xsqlite3LogEst(tls, U64(*(*int32)(unsafe.Pointer(bp))))) { (*Select)(unsafe.Pointer(p)).FnSelectRow = Xsqlite3LogEst(tls, U64(*(*int32)(unsafe.Pointer(bp)))) *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_FixedLimit) } } else { Xsqlite3ExprCode(tls, pParse, (*Expr)(unsafe.Pointer(pLimit)).FpLeft, iLimit) Xsqlite3VdbeAddOp1(tls, v, OP_MustBeInt, iLimit) Xsqlite3VdbeAddOp2(tls, v, OP_IfNot, iLimit, iBreak) } if (*Expr)(unsafe.Pointer(pLimit)).FpRight != 0 { (*Select)(unsafe.Pointer(p)).FiOffset = libc.AssignInt32(&iOffset, libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1)) (*Parse)(unsafe.Pointer(pParse)).FnMem++ Xsqlite3ExprCode(tls, pParse, (*Expr)(unsafe.Pointer(pLimit)).FpRight, iOffset) Xsqlite3VdbeAddOp1(tls, v, OP_MustBeInt, iOffset) Xsqlite3VdbeAddOp3(tls, v, OP_OffsetLimit, iLimit, iOffset+1, iOffset) } } } func multiSelectCollSeq(tls *libc.TLS, pParse uintptr, p uintptr, iCol int32) uintptr { var pRet uintptr if (*Select)(unsafe.Pointer(p)).FpPrior != 0 { pRet = multiSelectCollSeq(tls, pParse, (*Select)(unsafe.Pointer(p)).FpPrior, iCol) } else { pRet = uintptr(0) } if pRet == uintptr(0) && iCol < (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr { pRet = Xsqlite3ExprCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList+8+uintptr(iCol)*32)).FpExpr) } return pRet } func multiSelectOrderByKeyInfo(tls *libc.TLS, pParse uintptr, p uintptr, nExtra int32) uintptr { var pOrderBy uintptr = (*Select)(unsafe.Pointer(p)).FpOrderBy var nOrderBy int32 if pOrderBy != uintptr(0) { nOrderBy = (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr } else { nOrderBy = 0 } var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pRet uintptr = Xsqlite3KeyInfoAlloc(tls, db, nOrderBy+nExtra, 1) if pRet != 0 { var i int32 for i = 0; i < nOrderBy; i++ { var pItem uintptr = pOrderBy + 8 + uintptr(i)*32 var pTerm uintptr = (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr var pColl uintptr if (*Expr)(unsafe.Pointer(pTerm)).Fflags&U32(EP_Collate) != 0 { pColl = Xsqlite3ExprCollSeq(tls, pParse, pTerm) } else { pColl = multiSelectCollSeq(tls, pParse, p, int32(*(*U16)(unsafe.Pointer(pItem + 24)))-1) if pColl == uintptr(0) { pColl = (*Sqlite3)(unsafe.Pointer(db)).FpDfltColl } (*ExprList_item)(unsafe.Pointer(pOrderBy + 8 + uintptr(i)*32)).FpExpr = Xsqlite3ExprAddCollateString(tls, pParse, pTerm, (*CollSeq)(unsafe.Pointer(pColl)).FzName) } *(*uintptr)(unsafe.Pointer(pRet + 32 + uintptr(i)*8)) = pColl *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pRet)).FaSortFlags + uintptr(i))) = (*ExprList_item)(unsafe.Pointer(pOrderBy + 8 + uintptr(i)*32)).Ffg.FsortFlags } } return pRet } func generateWithRecursiveQuery(tls *libc.TLS, pParse uintptr, p uintptr, pDest uintptr) { bp := tls.Alloc(40) defer tls.Free(40) var pSrc uintptr var nCol int32 var v uintptr var pSetup uintptr var pFirstRec uintptr var addrTop int32 var addrCont int32 var addrBreak int32 var iCurrent int32 var regCurrent int32 var iQueue int32 var iDistinct int32 var eDest int32 var i int32 var rc int32 var pOrderBy uintptr var pLimit uintptr var regLimit int32 var regOffset int32 var pKeyInfo uintptr pSrc = (*Select)(unsafe.Pointer(p)).FpSrc nCol = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe iCurrent = 0 iDistinct = 0 eDest = SRT_Fifo if !((*Select)(unsafe.Pointer(p)).FpWin != 0) { goto __1 } Xsqlite3ErrorMsg(tls, pParse, ts+20238, 0) return __1: ; if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_RECURSIVE, uintptr(0), uintptr(0), uintptr(0)) != 0) { goto __2 } return __2: ; addrBreak = Xsqlite3VdbeMakeLabel(tls, pParse) (*Select)(unsafe.Pointer(p)).FnSelectRow = int16(320) computeLimitRegisters(tls, pParse, p, addrBreak) pLimit = (*Select)(unsafe.Pointer(p)).FpLimit regLimit = (*Select)(unsafe.Pointer(p)).FiLimit regOffset = (*Select)(unsafe.Pointer(p)).FiOffset (*Select)(unsafe.Pointer(p)).FpLimit = uintptr(0) (*Select)(unsafe.Pointer(p)).FiLimit = libc.AssignPtrInt32(p+12, 0) pOrderBy = (*Select)(unsafe.Pointer(p)).FpOrderBy i = 0 __3: if !(i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc) { goto __5 } if !(uint32(int32(*(*uint16)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 60 + 4))&0x40>>6)) != 0) { goto __6 } iCurrent = (*SrcItem)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104)).FiCursor goto __5 __6: ; goto __4 __4: i++ goto __3 goto __5 __5: ; iQueue = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) if !(int32((*Select)(unsafe.Pointer(p)).Fop) == TK_UNION) { goto __7 } if pOrderBy != 0 { eDest = SRT_DistQueue } else { eDest = SRT_DistFifo } iDistinct = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) goto __8 __7: if pOrderBy != 0 { eDest = SRT_Queue } else { eDest = SRT_Fifo } __8: ; Xsqlite3SelectDestInit(tls, bp, eDest, iQueue) regCurrent = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp3(tls, v, OP_OpenPseudo, iCurrent, regCurrent, nCol) if !(pOrderBy != 0) { goto __9 } pKeyInfo = multiSelectOrderByKeyInfo(tls, pParse, p, 1) Xsqlite3VdbeAddOp4(tls, v, OP_OpenEphemeral, iQueue, (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr+2, 0, pKeyInfo, -8) (*SelectDest)(unsafe.Pointer(bp)).FpOrderBy = pOrderBy goto __10 __9: Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, iQueue, nCol) __10: ; if !(iDistinct != 0) { goto __11 } *(*int32)(unsafe.Pointer(p + 20)) = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, iDistinct, 0) *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_UsesEphemeral) __11: ; (*Select)(unsafe.Pointer(p)).FpOrderBy = uintptr(0) pFirstRec = p __12: if !(pFirstRec != uintptr(0)) { goto __14 } if !((*Select)(unsafe.Pointer(pFirstRec)).FselFlags&U32(SF_Aggregate) != 0) { goto __15 } Xsqlite3ErrorMsg(tls, pParse, ts+20287, 0) goto end_of_recursive_query __15: ; (*Select)(unsafe.Pointer(pFirstRec)).Fop = U8(TK_ALL) if !((*Select)(unsafe.Pointer((*Select)(unsafe.Pointer(pFirstRec)).FpPrior)).FselFlags&U32(SF_Recursive) == U32(0)) { goto __16 } goto __14 __16: ; goto __13 __13: pFirstRec = (*Select)(unsafe.Pointer(pFirstRec)).FpPrior goto __12 goto __14 __14: ; pSetup = (*Select)(unsafe.Pointer(pFirstRec)).FpPrior (*Select)(unsafe.Pointer(pSetup)).FpNext = uintptr(0) Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20329, 0) rc = Xsqlite3Select(tls, pParse, pSetup, bp) (*Select)(unsafe.Pointer(pSetup)).FpNext = p if !(rc != 0) { goto __17 } goto end_of_recursive_query __17: ; addrTop = Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, iQueue, addrBreak) Xsqlite3VdbeAddOp1(tls, v, OP_NullRow, iCurrent) if !(pOrderBy != 0) { goto __18 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, iQueue, (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr+1, regCurrent) goto __19 __18: Xsqlite3VdbeAddOp2(tls, v, OP_RowData, iQueue, regCurrent) __19: ; Xsqlite3VdbeAddOp1(tls, v, OP_Delete, iQueue) addrCont = Xsqlite3VdbeMakeLabel(tls, pParse) codeOffset(tls, v, regOffset, addrCont) selectInnerLoop(tls, pParse, p, iCurrent, uintptr(0), uintptr(0), pDest, addrCont, addrBreak) if !(regLimit != 0) { goto __20 } Xsqlite3VdbeAddOp2(tls, v, OP_DecrJumpZero, regLimit, addrBreak) __20: ; Xsqlite3VdbeResolveLabel(tls, v, addrCont) (*Select)(unsafe.Pointer(pFirstRec)).FpPrior = uintptr(0) Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20335, 0) Xsqlite3Select(tls, pParse, p, bp) (*Select)(unsafe.Pointer(pFirstRec)).FpPrior = pSetup Xsqlite3VdbeGoto(tls, v, addrTop) Xsqlite3VdbeResolveLabel(tls, v, addrBreak) end_of_recursive_query: Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Select)(unsafe.Pointer(p)).FpOrderBy) (*Select)(unsafe.Pointer(p)).FpOrderBy = pOrderBy (*Select)(unsafe.Pointer(p)).FpLimit = pLimit return } func multiSelectValues(tls *libc.TLS, pParse uintptr, p uintptr, pDest uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var nRow int32 = 1 var rc int32 = 0 var bShowAll int32 = libc.Bool32((*Select)(unsafe.Pointer(p)).FpLimit == uintptr(0)) for __ccgo := true; __ccgo; __ccgo = 1 != 0 { if (*Select)(unsafe.Pointer(p)).FpWin != 0 { return -1 } if (*Select)(unsafe.Pointer(p)).FpPrior == uintptr(0) { break } p = (*Select)(unsafe.Pointer(p)).FpPrior nRow = nRow + bShowAll } Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+20350, libc.VaList(bp, nRow, func() uintptr { if nRow == 1 { return ts + 1544 } return ts + 20373 }())) for p != 0 { selectInnerLoop(tls, pParse, p, -1, uintptr(0), uintptr(0), pDest, 1, 1) if !(bShowAll != 0) { break } (*Select)(unsafe.Pointer(p)).FnSelectRow = LogEst(nRow) p = (*Select)(unsafe.Pointer(p)).FpNext } return rc } func hasAnchor(tls *libc.TLS, p uintptr) int32 { for p != 0 && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Recursive) != U32(0) { p = (*Select)(unsafe.Pointer(p)).FpPrior } return libc.Bool32(p != uintptr(0)) } func multiSelect(tls *libc.TLS, pParse uintptr, p uintptr, pDest uintptr) int32 { bp := tls.Alloc(144) defer tls.Free(144) var rc int32 var pPrior uintptr var v uintptr var pDelete uintptr var db uintptr var addr int32 var iCont int32 var iBreak int32 var iStart int32 var unionTab int32 var op U8 var priorOp int32 var pLimit uintptr var addr1 int32 var tab1 int32 var tab2 int32 var iCont1 int32 var iBreak1 int32 var iStart1 int32 var pLimit1 uintptr var addr2 int32 var r1 int32 var addr3 int32 var i int32 var pKeyInfo uintptr var pLoop uintptr var apColl uintptr var nCol int32 rc = SQLITE_OK pDelete = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb pPrior = (*Select)(unsafe.Pointer(p)).FpPrior *(*SelectDest)(unsafe.Pointer(bp + 16)) = *(*SelectDest)(unsafe.Pointer(pDest)) v = Xsqlite3GetVdbe(tls, pParse) if !(int32((*SelectDest)(unsafe.Pointer(bp+16)).FeDest) == SRT_EphemTab) { goto __1 } Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, (*SelectDest)(unsafe.Pointer(bp+16)).FiSDParm, (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr) (*SelectDest)(unsafe.Pointer(bp + 16)).FeDest = U8(SRT_Table) __1: ; if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_MultiValue) != 0) { goto __2 } rc = multiSelectValues(tls, pParse, p, bp+16) if !(rc >= 0) { goto __3 } goto multi_select_end __3: ; rc = SQLITE_OK __2: ; if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Recursive) != U32(0) && hasAnchor(tls, p) != 0) { goto __4 } generateWithRecursiveQuery(tls, pParse, p, bp+16) goto __5 __4: if !((*Select)(unsafe.Pointer(p)).FpOrderBy != 0) { goto __6 } return multiSelectOrderBy(tls, pParse, p, pDest) goto __7 __6: if !((*Select)(unsafe.Pointer(pPrior)).FpPrior == uintptr(0)) { goto __8 } Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20375, 0) Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20390, 0) __8: ; switch int32((*Select)(unsafe.Pointer(p)).Fop) { case TK_ALL: goto __10 case TK_EXCEPT: goto __11 case TK_UNION: goto __12 default: goto __13 } goto __9 __10: addr = 0 *(*int32)(unsafe.Pointer(bp + 56)) = 0 (*Select)(unsafe.Pointer(pPrior)).FiLimit = (*Select)(unsafe.Pointer(p)).FiLimit (*Select)(unsafe.Pointer(pPrior)).FiOffset = (*Select)(unsafe.Pointer(p)).FiOffset (*Select)(unsafe.Pointer(pPrior)).FpLimit = (*Select)(unsafe.Pointer(p)).FpLimit rc = Xsqlite3Select(tls, pParse, pPrior, bp+16) (*Select)(unsafe.Pointer(pPrior)).FpLimit = uintptr(0) if !(rc != 0) { goto __14 } goto multi_select_end __14: ; (*Select)(unsafe.Pointer(p)).FpPrior = uintptr(0) (*Select)(unsafe.Pointer(p)).FiLimit = (*Select)(unsafe.Pointer(pPrior)).FiLimit (*Select)(unsafe.Pointer(p)).FiOffset = (*Select)(unsafe.Pointer(pPrior)).FiOffset if !((*Select)(unsafe.Pointer(p)).FiLimit != 0) { goto __15 } addr = Xsqlite3VdbeAddOp1(tls, v, OP_IfNot, (*Select)(unsafe.Pointer(p)).FiLimit) if !((*Select)(unsafe.Pointer(p)).FiOffset != 0) { goto __16 } Xsqlite3VdbeAddOp3(tls, v, OP_OffsetLimit, (*Select)(unsafe.Pointer(p)).FiLimit, (*Select)(unsafe.Pointer(p)).FiOffset+1, (*Select)(unsafe.Pointer(p)).FiOffset) __16: ; __15: ; Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20115, 0) rc = Xsqlite3Select(tls, pParse, p, bp+16) pDelete = (*Select)(unsafe.Pointer(p)).FpPrior (*Select)(unsafe.Pointer(p)).FpPrior = pPrior (*Select)(unsafe.Pointer(p)).FnSelectRow = Xsqlite3LogEstAdd(tls, (*Select)(unsafe.Pointer(p)).FnSelectRow, (*Select)(unsafe.Pointer(pPrior)).FnSelectRow) if !((*Select)(unsafe.Pointer(p)).FpLimit != 0 && Xsqlite3ExprIsInteger(tls, (*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpLimit)).FpLeft, bp+56) != 0 && *(*int32)(unsafe.Pointer(bp + 56)) > 0 && int32((*Select)(unsafe.Pointer(p)).FnSelectRow) > int32(Xsqlite3LogEst(tls, U64(*(*int32)(unsafe.Pointer(bp + 56)))))) { goto __17 } (*Select)(unsafe.Pointer(p)).FnSelectRow = Xsqlite3LogEst(tls, U64(*(*int32)(unsafe.Pointer(bp + 56)))) __17: ; if !(addr != 0) { goto __18 } Xsqlite3VdbeJumpHere(tls, v, addr) __18: ; goto __9 __11: __12: op = U8(0) priorOp = SRT_Union if !(int32((*SelectDest)(unsafe.Pointer(bp+16)).FeDest) == priorOp) { goto __19 } unionTab = (*SelectDest)(unsafe.Pointer(bp + 16)).FiSDParm goto __20 __19: unionTab = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) addr1 = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, unionTab, 0) *(*int32)(unsafe.Pointer(p + 20)) = addr1 *(*U32)(unsafe.Pointer(findRightmost(tls, p) + 4)) |= U32(SF_UsesEphemeral) __20: ; Xsqlite3SelectDestInit(tls, bp+64, priorOp, unionTab) rc = Xsqlite3Select(tls, pParse, pPrior, bp+64) if !(rc != 0) { goto __21 } goto multi_select_end __21: ; if !(int32((*Select)(unsafe.Pointer(p)).Fop) == TK_EXCEPT) { goto __22 } op = U8(SRT_Except) goto __23 __22: ; op = U8(SRT_Union) __23: ; (*Select)(unsafe.Pointer(p)).FpPrior = uintptr(0) pLimit = (*Select)(unsafe.Pointer(p)).FpLimit (*Select)(unsafe.Pointer(p)).FpLimit = uintptr(0) (*SelectDest)(unsafe.Pointer(bp + 64)).FeDest = op Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20409, libc.VaList(bp, Xsqlite3SelectOpName(tls, int32((*Select)(unsafe.Pointer(p)).Fop)))) rc = Xsqlite3Select(tls, pParse, p, bp+64) pDelete = (*Select)(unsafe.Pointer(p)).FpPrior (*Select)(unsafe.Pointer(p)).FpPrior = pPrior (*Select)(unsafe.Pointer(p)).FpOrderBy = uintptr(0) if !(int32((*Select)(unsafe.Pointer(p)).Fop) == TK_UNION) { goto __24 } (*Select)(unsafe.Pointer(p)).FnSelectRow = Xsqlite3LogEstAdd(tls, (*Select)(unsafe.Pointer(p)).FnSelectRow, (*Select)(unsafe.Pointer(pPrior)).FnSelectRow) __24: ; Xsqlite3ExprDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpLimit) (*Select)(unsafe.Pointer(p)).FpLimit = pLimit (*Select)(unsafe.Pointer(p)).FiLimit = 0 (*Select)(unsafe.Pointer(p)).FiOffset = 0 if !(int32((*SelectDest)(unsafe.Pointer(bp+16)).FeDest) != priorOp && int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0) { goto __25 } iBreak = Xsqlite3VdbeMakeLabel(tls, pParse) iCont = Xsqlite3VdbeMakeLabel(tls, pParse) computeLimitRegisters(tls, pParse, p, iBreak) Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, unionTab, iBreak) iStart = Xsqlite3VdbeCurrentAddr(tls, v) selectInnerLoop(tls, pParse, p, unionTab, uintptr(0), uintptr(0), bp+16, iCont, iBreak) Xsqlite3VdbeResolveLabel(tls, v, iCont) Xsqlite3VdbeAddOp2(tls, v, OP_Next, unionTab, iStart) Xsqlite3VdbeResolveLabel(tls, v, iBreak) Xsqlite3VdbeAddOp2(tls, v, OP_Close, unionTab, 0) __25: ; goto __9 __13: ; tab1 = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) tab2 = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) addr2 = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, tab1, 0) *(*int32)(unsafe.Pointer(p + 20)) = addr2 *(*U32)(unsafe.Pointer(findRightmost(tls, p) + 4)) |= U32(SF_UsesEphemeral) Xsqlite3SelectDestInit(tls, bp+104, SRT_Union, tab1) rc = Xsqlite3Select(tls, pParse, pPrior, bp+104) if !(rc != 0) { goto __26 } goto multi_select_end __26: ; addr2 = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, tab2, 0) *(*int32)(unsafe.Pointer(p + 20 + 1*4)) = addr2 (*Select)(unsafe.Pointer(p)).FpPrior = uintptr(0) pLimit1 = (*Select)(unsafe.Pointer(p)).FpLimit (*Select)(unsafe.Pointer(p)).FpLimit = uintptr(0) (*SelectDest)(unsafe.Pointer(bp + 104)).FiSDParm = tab2 Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20409, libc.VaList(bp+8, Xsqlite3SelectOpName(tls, int32((*Select)(unsafe.Pointer(p)).Fop)))) rc = Xsqlite3Select(tls, pParse, p, bp+104) pDelete = (*Select)(unsafe.Pointer(p)).FpPrior (*Select)(unsafe.Pointer(p)).FpPrior = pPrior if !(int32((*Select)(unsafe.Pointer(p)).FnSelectRow) > int32((*Select)(unsafe.Pointer(pPrior)).FnSelectRow)) { goto __27 } (*Select)(unsafe.Pointer(p)).FnSelectRow = (*Select)(unsafe.Pointer(pPrior)).FnSelectRow __27: ; Xsqlite3ExprDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpLimit) (*Select)(unsafe.Pointer(p)).FpLimit = pLimit1 if !(rc != 0) { goto __28 } goto __9 __28: ; iBreak1 = Xsqlite3VdbeMakeLabel(tls, pParse) iCont1 = Xsqlite3VdbeMakeLabel(tls, pParse) computeLimitRegisters(tls, pParse, p, iBreak1) Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, tab1, iBreak1) r1 = Xsqlite3GetTempReg(tls, pParse) iStart1 = Xsqlite3VdbeAddOp2(tls, v, OP_RowData, tab1, r1) Xsqlite3VdbeAddOp4Int(tls, v, OP_NotFound, tab2, iCont1, r1, 0) Xsqlite3ReleaseTempReg(tls, pParse, r1) selectInnerLoop(tls, pParse, p, tab1, uintptr(0), uintptr(0), bp+16, iCont1, iBreak1) Xsqlite3VdbeResolveLabel(tls, v, iCont1) Xsqlite3VdbeAddOp2(tls, v, OP_Next, tab1, iStart1) Xsqlite3VdbeResolveLabel(tls, v, iBreak1) Xsqlite3VdbeAddOp2(tls, v, OP_Close, tab2, 0) Xsqlite3VdbeAddOp2(tls, v, OP_Close, tab1, 0) goto __9 __9: ; if !((*Select)(unsafe.Pointer(p)).FpNext == uintptr(0)) { goto __29 } Xsqlite3VdbeExplainPop(tls, pParse) __29: ; __7: ; __5: ; if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __30 } goto multi_select_end __30: ; if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_UsesEphemeral) != 0) { goto __31 } nCol = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr pKeyInfo = Xsqlite3KeyInfoAlloc(tls, db, nCol, 1) if !!(pKeyInfo != 0) { goto __32 } rc = SQLITE_NOMEM goto multi_select_end __32: ; i = 0 apColl = pKeyInfo + 32 __33: if !(i < nCol) { goto __35 } *(*uintptr)(unsafe.Pointer(apColl)) = multiSelectCollSeq(tls, pParse, p, i) if !(uintptr(0) == *(*uintptr)(unsafe.Pointer(apColl))) { goto __36 } *(*uintptr)(unsafe.Pointer(apColl)) = (*Sqlite3)(unsafe.Pointer(db)).FpDfltColl __36: ; goto __34 __34: i++ apColl += 8 goto __33 goto __35 __35: ; pLoop = p __37: if !(pLoop != 0) { goto __39 } i = 0 __40: if !(i < 2) { goto __42 } addr3 = *(*int32)(unsafe.Pointer(pLoop + 20 + uintptr(i)*4)) if !(addr3 < 0) { goto __43 } goto __42 __43: ; Xsqlite3VdbeChangeP2(tls, v, addr3, nCol) Xsqlite3VdbeChangeP4(tls, v, addr3, Xsqlite3KeyInfoRef(tls, pKeyInfo), -8) *(*int32)(unsafe.Pointer(pLoop + 20 + uintptr(i)*4)) = -1 goto __41 __41: i++ goto __40 goto __42 __42: ; goto __38 __38: pLoop = (*Select)(unsafe.Pointer(pLoop)).FpPrior goto __37 goto __39 __39: ; Xsqlite3KeyInfoUnref(tls, pKeyInfo) __31: ; multi_select_end: (*SelectDest)(unsafe.Pointer(pDest)).FiSdst = (*SelectDest)(unsafe.Pointer(bp + 16)).FiSdst (*SelectDest)(unsafe.Pointer(pDest)).FnSdst = (*SelectDest)(unsafe.Pointer(bp + 16)).FnSdst if !(pDelete != 0) { goto __44 } Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3SelectDelete})), pDelete) __44: ; return rc } // Error message for when two or more terms of a compound select have different // size result sets. func Xsqlite3SelectWrongNumTermsError(tls *libc.TLS, pParse uintptr, p uintptr) { bp := tls.Alloc(8) defer tls.Free(8) if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Values) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+20430, 0) } else { Xsqlite3ErrorMsg(tls, pParse, ts+20476, libc.VaList(bp, Xsqlite3SelectOpName(tls, int32((*Select)(unsafe.Pointer(p)).Fop)))) } } func generateOutputSubroutine(tls *libc.TLS, pParse uintptr, p uintptr, pIn uintptr, pDest uintptr, regReturn int32, regPrev int32, pKeyInfo uintptr, iBreak int32) int32 { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var iContinue int32 var addr int32 addr = Xsqlite3VdbeCurrentAddr(tls, v) iContinue = Xsqlite3VdbeMakeLabel(tls, pParse) if regPrev != 0 { var addr1 int32 var addr2 int32 addr1 = Xsqlite3VdbeAddOp1(tls, v, OP_IfNot, regPrev) addr2 = Xsqlite3VdbeAddOp4(tls, v, OP_Compare, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, regPrev+1, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst, Xsqlite3KeyInfoRef(tls, pKeyInfo), -8) Xsqlite3VdbeAddOp3(tls, v, OP_Jump, addr2+2, iContinue, addr2+2) Xsqlite3VdbeJumpHere(tls, v, addr1) Xsqlite3VdbeAddOp3(tls, v, OP_Copy, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, regPrev+1, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst-1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, regPrev) } if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { return 0 } codeOffset(tls, v, (*Select)(unsafe.Pointer(p)).FiOffset, iContinue) switch int32((*SelectDest)(unsafe.Pointer(pDest)).FeDest) { case SRT_EphemTab: { var r1 int32 = Xsqlite3GetTempReg(tls, pParse) var r2 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst, r1) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm, r2) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm, r1, r2) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_APPEND)) Xsqlite3ReleaseTempReg(tls, pParse, r2) Xsqlite3ReleaseTempReg(tls, pParse, r1) break } case SRT_Set: { var r1 int32 r1 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst, r1, (*SelectDest)(unsafe.Pointer(pDest)).FzAffSdst, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm, r1, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst) Xsqlite3ReleaseTempReg(tls, pParse, r1) break } case SRT_Mem: { Xsqlite3ExprCodeMove(tls, pParse, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst) break } case SRT_Coroutine: { if (*SelectDest)(unsafe.Pointer(pDest)).FiSdst == 0 { (*SelectDest)(unsafe.Pointer(pDest)).FiSdst = Xsqlite3GetTempRange(tls, pParse, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst) (*SelectDest)(unsafe.Pointer(pDest)).FnSdst = (*SelectDest)(unsafe.Pointer(pIn)).FnSdst } Xsqlite3ExprCodeMove(tls, pParse, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, (*SelectDest)(unsafe.Pointer(pDest)).FiSdst, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst) Xsqlite3VdbeAddOp1(tls, v, OP_Yield, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm) break } default: { Xsqlite3VdbeAddOp2(tls, v, OP_ResultRow, (*SelectDest)(unsafe.Pointer(pIn)).FiSdst, (*SelectDest)(unsafe.Pointer(pIn)).FnSdst) break } } if (*Select)(unsafe.Pointer(p)).FiLimit != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_DecrJumpZero, (*Select)(unsafe.Pointer(p)).FiLimit, iBreak) } Xsqlite3VdbeResolveLabel(tls, v, iContinue) Xsqlite3VdbeAddOp1(tls, v, OP_Return, regReturn) return addr } func multiSelectOrderBy(tls *libc.TLS, pParse uintptr, p uintptr, pDest uintptr) int32 { bp := tls.Alloc(88) defer tls.Free(88) var i int32 var j int32 var pPrior uintptr var pSplit uintptr var nSelect int32 var v uintptr var regAddrA int32 var regAddrB int32 var addrSelectA int32 var addrSelectB int32 var regOutA int32 var regOutB int32 var addrOutA int32 var addrOutB int32 = 0 var addrEofA int32 var addrEofA_noB int32 var addrEofB int32 var addrAltB int32 var addrAeqB int32 var addrAgtB int32 var regLimitA int32 var regLimitB int32 var regPrev int32 var savedLimit int32 var savedOffset int32 var labelCmpr int32 var labelEnd int32 var addr1 int32 var op int32 var pKeyDup uintptr = uintptr(0) var pKeyMerge uintptr var db uintptr var pOrderBy uintptr var nOrderBy int32 var aPermute uintptr db = (*Parse)(unsafe.Pointer(pParse)).Fdb v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe labelEnd = Xsqlite3VdbeMakeLabel(tls, pParse) labelCmpr = Xsqlite3VdbeMakeLabel(tls, pParse) op = int32((*Select)(unsafe.Pointer(p)).Fop) pOrderBy = (*Select)(unsafe.Pointer(p)).FpOrderBy nOrderBy = (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr if op != TK_ALL { for i = 1; int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 && i <= (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr; i++ { var pItem uintptr j = 0 pItem = pOrderBy + 8 __1: if !(j < nOrderBy) { goto __3 } { if int32(*(*U16)(unsafe.Pointer(pItem + 24))) == i { goto __3 } } goto __2 __2: j++ pItem += 32 goto __1 goto __3 __3: ; if j == nOrderBy { var pNew uintptr = Xsqlite3Expr(tls, db, TK_INTEGER, uintptr(0)) if pNew == uintptr(0) { return SQLITE_NOMEM } *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_IntValue) *(*int32)(unsafe.Pointer(pNew + 8)) = i (*Select)(unsafe.Pointer(p)).FpOrderBy = libc.AssignUintptr(&pOrderBy, Xsqlite3ExprListAppend(tls, pParse, pOrderBy, pNew)) if pOrderBy != 0 { *(*U16)(unsafe.Pointer(pOrderBy + 8 + uintptr(libc.PostIncInt32(&nOrderBy, 1))*32 + 24)) = U16(i) } } } } aPermute = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(U32(0)))*uint64(nOrderBy+1)) if aPermute != 0 { var pItem uintptr *(*U32)(unsafe.Pointer(aPermute)) = U32(nOrderBy) i = 1 pItem = pOrderBy + 8 __4: if !(i <= nOrderBy) { goto __6 } { *(*U32)(unsafe.Pointer(aPermute + uintptr(i)*4)) = U32(int32(*(*U16)(unsafe.Pointer(pItem + 24))) - 1) } goto __5 __5: i++ pItem += 32 goto __4 goto __6 __6: ; pKeyMerge = multiSelectOrderByKeyInfo(tls, pParse, p, 1) } else { pKeyMerge = uintptr(0) } if op == TK_ALL { regPrev = 0 } else { var nExpr int32 = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr regPrev = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nExpr + 1 Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regPrev) pKeyDup = Xsqlite3KeyInfoAlloc(tls, db, nExpr, 1) if pKeyDup != 0 { for i = 0; i < nExpr; i++ { *(*uintptr)(unsafe.Pointer(pKeyDup + 32 + uintptr(i)*8)) = multiSelectCollSeq(tls, pParse, p, i) *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKeyDup)).FaSortFlags + uintptr(i))) = U8(0) } } } nSelect = 1 if (op == TK_ALL || op == TK_UNION) && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_BalancedMerge) == U32(0) { for pSplit = p; (*Select)(unsafe.Pointer(pSplit)).FpPrior != uintptr(0) && int32((*Select)(unsafe.Pointer(pSplit)).Fop) == op; pSplit = (*Select)(unsafe.Pointer(pSplit)).FpPrior { nSelect++ } } if nSelect <= 3 { pSplit = p } else { pSplit = p for i = 2; i < nSelect; i = i + 2 { pSplit = (*Select)(unsafe.Pointer(pSplit)).FpPrior } } pPrior = (*Select)(unsafe.Pointer(pSplit)).FpPrior (*Select)(unsafe.Pointer(pSplit)).FpPrior = uintptr(0) (*Select)(unsafe.Pointer(pPrior)).FpNext = uintptr(0) (*Select)(unsafe.Pointer(pPrior)).FpOrderBy = Xsqlite3ExprListDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pOrderBy, 0) Xsqlite3ResolveOrderGroupBy(tls, pParse, p, (*Select)(unsafe.Pointer(p)).FpOrderBy, ts+8575) Xsqlite3ResolveOrderGroupBy(tls, pParse, pPrior, (*Select)(unsafe.Pointer(pPrior)).FpOrderBy, ts+8575) computeLimitRegisters(tls, pParse, p, labelEnd) if (*Select)(unsafe.Pointer(p)).FiLimit != 0 && op == TK_ALL { regLimitA = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regLimitB = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Copy, func() int32 { if (*Select)(unsafe.Pointer(p)).FiOffset != 0 { return (*Select)(unsafe.Pointer(p)).FiOffset + 1 } return (*Select)(unsafe.Pointer(p)).FiLimit }(), regLimitA) Xsqlite3VdbeAddOp2(tls, v, OP_Copy, regLimitA, regLimitB) } else { regLimitA = libc.AssignInt32(®LimitB, 0) } Xsqlite3ExprDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpLimit) (*Select)(unsafe.Pointer(p)).FpLimit = uintptr(0) regAddrA = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regAddrB = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regOutA = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regOutB = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3SelectDestInit(tls, bp+8, SRT_Coroutine, regAddrA) Xsqlite3SelectDestInit(tls, bp+48, SRT_Coroutine, regAddrB) Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20558, libc.VaList(bp, Xsqlite3SelectOpName(tls, int32((*Select)(unsafe.Pointer(p)).Fop)))) addrSelectA = Xsqlite3VdbeCurrentAddr(tls, v) + 1 addr1 = Xsqlite3VdbeAddOp3(tls, v, OP_InitCoroutine, regAddrA, 0, addrSelectA) (*Select)(unsafe.Pointer(pPrior)).FiLimit = regLimitA Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20569, 0) Xsqlite3Select(tls, pParse, pPrior, bp+8) Xsqlite3VdbeEndCoroutine(tls, v, regAddrA) Xsqlite3VdbeJumpHere(tls, v, addr1) addrSelectB = Xsqlite3VdbeCurrentAddr(tls, v) + 1 addr1 = Xsqlite3VdbeAddOp3(tls, v, OP_InitCoroutine, regAddrB, 0, addrSelectB) savedLimit = (*Select)(unsafe.Pointer(p)).FiLimit savedOffset = (*Select)(unsafe.Pointer(p)).FiOffset (*Select)(unsafe.Pointer(p)).FiLimit = regLimitB (*Select)(unsafe.Pointer(p)).FiOffset = 0 Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+20574, 0) Xsqlite3Select(tls, pParse, p, bp+48) (*Select)(unsafe.Pointer(p)).FiLimit = savedLimit (*Select)(unsafe.Pointer(p)).FiOffset = savedOffset Xsqlite3VdbeEndCoroutine(tls, v, regAddrB) addrOutA = generateOutputSubroutine(tls, pParse, p, bp+8, pDest, regOutA, regPrev, pKeyDup, labelEnd) if op == TK_ALL || op == TK_UNION { addrOutB = generateOutputSubroutine(tls, pParse, p, bp+48, pDest, regOutB, regPrev, pKeyDup, labelEnd) } Xsqlite3KeyInfoUnref(tls, pKeyDup) if op == TK_EXCEPT || op == TK_INTERSECT { addrEofA_noB = libc.AssignInt32(&addrEofA, labelEnd) } else { addrEofA = Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regOutB, addrOutB) addrEofA_noB = Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regAddrB, labelEnd) Xsqlite3VdbeGoto(tls, v, addrEofA) (*Select)(unsafe.Pointer(p)).FnSelectRow = Xsqlite3LogEstAdd(tls, (*Select)(unsafe.Pointer(p)).FnSelectRow, (*Select)(unsafe.Pointer(pPrior)).FnSelectRow) } if op == TK_INTERSECT { addrEofB = addrEofA if int32((*Select)(unsafe.Pointer(p)).FnSelectRow) > int32((*Select)(unsafe.Pointer(pPrior)).FnSelectRow) { (*Select)(unsafe.Pointer(p)).FnSelectRow = (*Select)(unsafe.Pointer(pPrior)).FnSelectRow } } else { addrEofB = Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regOutA, addrOutA) Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regAddrA, labelEnd) Xsqlite3VdbeGoto(tls, v, addrEofB) } addrAltB = Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regOutA, addrOutA) Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regAddrA, addrEofA) Xsqlite3VdbeGoto(tls, v, labelCmpr) if op == TK_ALL { addrAeqB = addrAltB } else if op == TK_INTERSECT { addrAeqB = addrAltB addrAltB++ } else { addrAeqB = Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regAddrA, addrEofA) Xsqlite3VdbeGoto(tls, v, labelCmpr) } addrAgtB = Xsqlite3VdbeCurrentAddr(tls, v) if op == TK_ALL || op == TK_UNION { Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regOutB, addrOutB) } Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regAddrB, addrEofB) Xsqlite3VdbeGoto(tls, v, labelCmpr) Xsqlite3VdbeJumpHere(tls, v, addr1) Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regAddrA, addrEofA_noB) Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regAddrB, addrEofB) Xsqlite3VdbeResolveLabel(tls, v, labelCmpr) Xsqlite3VdbeAddOp4(tls, v, OP_Permutation, 0, 0, 0, aPermute, -14) Xsqlite3VdbeAddOp4(tls, v, OP_Compare, (*SelectDest)(unsafe.Pointer(bp+8)).FiSdst, (*SelectDest)(unsafe.Pointer(bp+48)).FiSdst, nOrderBy, pKeyMerge, -8) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_PERMUTE)) Xsqlite3VdbeAddOp3(tls, v, OP_Jump, addrAltB, addrAeqB, addrAgtB) Xsqlite3VdbeResolveLabel(tls, v, labelEnd) if (*Select)(unsafe.Pointer(pSplit)).FpPrior != 0 { Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3SelectDelete})), (*Select)(unsafe.Pointer(pSplit)).FpPrior) } (*Select)(unsafe.Pointer(pSplit)).FpPrior = pPrior (*Select)(unsafe.Pointer(pPrior)).FpNext = pSplit Xsqlite3ExprListDelete(tls, db, (*Select)(unsafe.Pointer(pPrior)).FpOrderBy) (*Select)(unsafe.Pointer(pPrior)).FpOrderBy = uintptr(0) Xsqlite3VdbeExplainPop(tls, pParse) return libc.Bool32((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) } // An instance of the SubstContext object describes an substitution edit // to be performed on a parse tree. // // All references to columns in table iTable are to be replaced by corresponding // expressions in pEList. // // ## About "isOuterJoin": // // The isOuterJoin column indicates that the replacement will occur into a // position in the parent that NULL-able due to an OUTER JOIN. Either the // target slot in the parent is the right operand of a LEFT JOIN, or one of // the left operands of a RIGHT JOIN. In either case, we need to potentially // bypass the substituted expression with OP_IfNullRow. // // Suppose the original expression is an integer constant. Even though the table // has the nullRow flag set, because the expression is an integer constant, // it will not be NULLed out. So instead, we insert an OP_IfNullRow opcode // that checks to see if the nullRow flag is set on the table. If the nullRow // flag is set, then the value in the register is set to NULL and the original // expression is bypassed. If the nullRow flag is not set, then the original // expression runs to populate the register. // // Example where this is needed: // // CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); // CREATE TABLE t2(x INT UNIQUE); // // SELECT a,b,m,x FROM t1 LEFT JOIN (SELECT 59 AS m,x FROM t2) ON b=x; // // When the subquery on the right side of the LEFT JOIN is flattened, we // have to add OP_IfNullRow in front of the OP_Integer that implements the // "m" value of the subquery so that a NULL will be loaded instead of 59 // when processing a non-matched row of the left. type SubstContext1 = struct { FpParse uintptr FiTable int32 FiNewTable int32 FisOuterJoin int32 F__ccgo_pad1 [4]byte FpEList uintptr FpCList uintptr } // An instance of the SubstContext object describes an substitution edit // to be performed on a parse tree. // // All references to columns in table iTable are to be replaced by corresponding // expressions in pEList. // // ## About "isOuterJoin": // // The isOuterJoin column indicates that the replacement will occur into a // position in the parent that NULL-able due to an OUTER JOIN. Either the // target slot in the parent is the right operand of a LEFT JOIN, or one of // the left operands of a RIGHT JOIN. In either case, we need to potentially // bypass the substituted expression with OP_IfNullRow. // // Suppose the original expression is an integer constant. Even though the table // has the nullRow flag set, because the expression is an integer constant, // it will not be NULLed out. So instead, we insert an OP_IfNullRow opcode // that checks to see if the nullRow flag is set on the table. If the nullRow // flag is set, then the value in the register is set to NULL and the original // expression is bypassed. If the nullRow flag is not set, then the original // expression runs to populate the register. // // Example where this is needed: // // CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); // CREATE TABLE t2(x INT UNIQUE); // // SELECT a,b,m,x FROM t1 LEFT JOIN (SELECT 59 AS m,x FROM t2) ON b=x; // // When the subquery on the right side of the LEFT JOIN is flattened, we // have to add OP_IfNullRow in front of the OP_Integer that implements the // "m" value of the subquery so that a NULL will be loaded instead of 59 // when processing a non-matched row of the left. type SubstContext = SubstContext1 func substExpr(tls *libc.TLS, pSubst uintptr, pExpr uintptr) uintptr { bp := tls.Alloc(72) defer tls.Free(72) if pExpr == uintptr(0) { return uintptr(0) } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0) && *(*int32)(unsafe.Pointer(pExpr + 52)) == (*SubstContext)(unsafe.Pointer(pSubst)).FiTable { *(*int32)(unsafe.Pointer(pExpr + 52)) = (*SubstContext)(unsafe.Pointer(pSubst)).FiNewTable } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*SubstContext)(unsafe.Pointer(pSubst)).FiTable && !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_FixedCol) != U32(0)) { { var pNew uintptr var iColumn int32 = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) var pCopy uintptr = (*ExprList_item)(unsafe.Pointer((*SubstContext)(unsafe.Pointer(pSubst)).FpEList + 8 + uintptr(iColumn)*32)).FpExpr if Xsqlite3ExprIsVector(tls, pCopy) != 0 { Xsqlite3VectorErrorMsg(tls, (*SubstContext)(unsafe.Pointer(pSubst)).FpParse, pCopy) } else { var db uintptr = (*Parse)(unsafe.Pointer((*SubstContext)(unsafe.Pointer(pSubst)).FpParse)).Fdb if (*SubstContext)(unsafe.Pointer(pSubst)).FisOuterJoin != 0 && (int32((*Expr)(unsafe.Pointer(pCopy)).Fop) != TK_COLUMN || (*Expr)(unsafe.Pointer(pCopy)).FiTable != (*SubstContext)(unsafe.Pointer(pSubst)).FiNewTable) { libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(bp)).Fop = U8(TK_IF_NULL_ROW) (*Expr)(unsafe.Pointer(bp)).FpLeft = pCopy (*Expr)(unsafe.Pointer(bp)).FiTable = (*SubstContext)(unsafe.Pointer(pSubst)).FiNewTable (*Expr)(unsafe.Pointer(bp)).FiColumn = int16(-99) (*Expr)(unsafe.Pointer(bp)).Fflags = U32(EP_IfNullRow) pCopy = bp } pNew = Xsqlite3ExprDup(tls, db, pCopy, 0) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3ExprDelete(tls, db, pNew) return pExpr } if (*SubstContext)(unsafe.Pointer(pSubst)).FisOuterJoin != 0 { *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(EP_CanBeNull) } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0) { Xsqlite3SetJoinExpr(tls, pNew, *(*int32)(unsafe.Pointer(pExpr + 52)), (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_InnerON)) } Xsqlite3ExprDelete(tls, db, pExpr) pExpr = pNew if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_TRUEFALSE { *(*int32)(unsafe.Pointer(pExpr + 8)) = Xsqlite3ExprTruthValue(tls, pExpr) (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_INTEGER) *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_IntValue) } { var pNat uintptr = Xsqlite3ExprCollSeq(tls, (*SubstContext)(unsafe.Pointer(pSubst)).FpParse, pExpr) var pColl uintptr = Xsqlite3ExprCollSeq(tls, (*SubstContext)(unsafe.Pointer(pSubst)).FpParse, (*ExprList_item)(unsafe.Pointer((*SubstContext)(unsafe.Pointer(pSubst)).FpCList+8+uintptr(iColumn)*32)).FpExpr) if pNat != pColl || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLUMN && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLLATE { pExpr = Xsqlite3ExprAddCollateString(tls, (*SubstContext)(unsafe.Pointer(pSubst)).FpParse, pExpr, func() uintptr { if pColl != 0 { return (*CollSeq)(unsafe.Pointer(pColl)).FzName } return ts + 1089 }()) } } *(*U32)(unsafe.Pointer(pExpr + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_Collate)) } } } else { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_IF_NULL_ROW && (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*SubstContext)(unsafe.Pointer(pSubst)).FiTable { (*Expr)(unsafe.Pointer(pExpr)).FiTable = (*SubstContext)(unsafe.Pointer(pSubst)).FiNewTable } (*Expr)(unsafe.Pointer(pExpr)).FpLeft = substExpr(tls, pSubst, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) (*Expr)(unsafe.Pointer(pExpr)).FpRight = substExpr(tls, pSubst, (*Expr)(unsafe.Pointer(pExpr)).FpRight) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { substSelect(tls, pSubst, *(*uintptr)(unsafe.Pointer(pExpr + 32)), 1) } else { substExprList(tls, pSubst, *(*uintptr)(unsafe.Pointer(pExpr + 32))) } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { var pWin uintptr = *(*uintptr)(unsafe.Pointer(pExpr + 64)) (*Window)(unsafe.Pointer(pWin)).FpFilter = substExpr(tls, pSubst, (*Window)(unsafe.Pointer(pWin)).FpFilter) substExprList(tls, pSubst, (*Window)(unsafe.Pointer(pWin)).FpPartition) substExprList(tls, pSubst, (*Window)(unsafe.Pointer(pWin)).FpOrderBy) } } return pExpr } func substExprList(tls *libc.TLS, pSubst uintptr, pList uintptr) { var i int32 if pList == uintptr(0) { return } for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(i)*32)).FpExpr = substExpr(tls, pSubst, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr) } } func substSelect(tls *libc.TLS, pSubst uintptr, p uintptr, doPrior int32) { var pSrc uintptr var pItem uintptr var i int32 if !(p != 0) { return } for __ccgo := true; __ccgo; __ccgo = doPrior != 0 && libc.AssignUintptr(&p, (*Select)(unsafe.Pointer(p)).FpPrior) != uintptr(0) { substExprList(tls, pSubst, (*Select)(unsafe.Pointer(p)).FpEList) substExprList(tls, pSubst, (*Select)(unsafe.Pointer(p)).FpGroupBy) substExprList(tls, pSubst, (*Select)(unsafe.Pointer(p)).FpOrderBy) (*Select)(unsafe.Pointer(p)).FpHaving = substExpr(tls, pSubst, (*Select)(unsafe.Pointer(p)).FpHaving) (*Select)(unsafe.Pointer(p)).FpWhere = substExpr(tls, pSubst, (*Select)(unsafe.Pointer(p)).FpWhere) pSrc = (*Select)(unsafe.Pointer(p)).FpSrc i = (*SrcList)(unsafe.Pointer(pSrc)).FnSrc pItem = pSrc + 8 __1: if !(i > 0) { goto __3 } { substSelect(tls, pSubst, (*SrcItem)(unsafe.Pointer(pItem)).FpSelect, 1) if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x4>>2)) != 0 { substExprList(tls, pSubst, *(*uintptr)(unsafe.Pointer(pItem + 88))) } } goto __2 __2: i-- pItem += 104 goto __1 goto __3 __3: } } func recomputeColumnsUsedExpr(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var pItem uintptr if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLUMN { return WRC_Continue } pItem = *(*uintptr)(unsafe.Pointer(pWalker + 40)) if (*SrcItem)(unsafe.Pointer(pItem)).FiCursor != (*Expr)(unsafe.Pointer(pExpr)).FiTable { return WRC_Continue } if int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) < 0 { return WRC_Continue } *(*Bitmask)(unsafe.Pointer(pItem + 80)) |= Xsqlite3ExprColUsed(tls, pExpr) return WRC_Continue } func recomputeColumnsUsed(tls *libc.TLS, pSelect uintptr, pSrcItem uintptr) { bp := tls.Alloc(48) defer tls.Free(48) if (*SrcItem)(unsafe.Pointer(pSrcItem)).FpTab == uintptr(0) { return } libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{recomputeColumnsUsedExpr})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkNoop})) *(*uintptr)(unsafe.Pointer(bp + 40)) = pSrcItem (*SrcItem)(unsafe.Pointer(pSrcItem)).FcolUsed = uint64(0) Xsqlite3WalkSelect(tls, bp, pSelect) } func srclistRenumberCursors(tls *libc.TLS, pParse uintptr, aCsrMap uintptr, pSrc uintptr, iExcept int32) { var i int32 var pItem uintptr i = 0 pItem = pSrc + 8 __1: if !(i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc) { goto __3 } { if i != iExcept { var p uintptr if !(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x40>>6) != 0) || *(*int32)(unsafe.Pointer(aCsrMap + uintptr((*SrcItem)(unsafe.Pointer(pItem)).FiCursor+1)*4)) == 0 { *(*int32)(unsafe.Pointer(aCsrMap + uintptr((*SrcItem)(unsafe.Pointer(pItem)).FiCursor+1)*4)) = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) } (*SrcItem)(unsafe.Pointer(pItem)).FiCursor = *(*int32)(unsafe.Pointer(aCsrMap + uintptr((*SrcItem)(unsafe.Pointer(pItem)).FiCursor+1)*4)) for p = (*SrcItem)(unsafe.Pointer(pItem)).FpSelect; p != 0; p = (*Select)(unsafe.Pointer(p)).FpPrior { srclistRenumberCursors(tls, pParse, aCsrMap, (*Select)(unsafe.Pointer(p)).FpSrc, -1) } } } goto __2 __2: i++ pItem += 104 goto __1 goto __3 __3: } func renumberCursorDoMapping(tls *libc.TLS, pWalker uintptr, piCursor uintptr) { var aCsrMap uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var iCsr int32 = *(*int32)(unsafe.Pointer(piCursor)) if iCsr < *(*int32)(unsafe.Pointer(aCsrMap)) && *(*int32)(unsafe.Pointer(aCsrMap + uintptr(iCsr+1)*4)) > 0 { *(*int32)(unsafe.Pointer(piCursor)) = *(*int32)(unsafe.Pointer(aCsrMap + uintptr(iCsr+1)*4)) } } func renumberCursorsCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var op int32 = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) if op == TK_COLUMN || op == TK_IF_NULL_ROW { renumberCursorDoMapping(tls, pWalker, pExpr+44) } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0) { renumberCursorDoMapping(tls, pWalker, pExpr+52) } return WRC_Continue } func renumberCursors(tls *libc.TLS, pParse uintptr, p uintptr, iExcept int32, aCsrMap uintptr) { bp := tls.Alloc(48) defer tls.Free(48) srclistRenumberCursors(tls, pParse, aCsrMap, (*Select)(unsafe.Pointer(p)).FpSrc, iExcept) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) *(*uintptr)(unsafe.Pointer(bp + 40)) = aCsrMap (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{renumberCursorsCb})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkNoop})) Xsqlite3WalkSelect(tls, bp, p) } func findLeftmostExprlist(tls *libc.TLS, pSel uintptr) uintptr { for (*Select)(unsafe.Pointer(pSel)).FpPrior != 0 { pSel = (*Select)(unsafe.Pointer(pSel)).FpPrior } return (*Select)(unsafe.Pointer(pSel)).FpEList } func compoundHasDifferentAffinities(tls *libc.TLS, p uintptr) int32 { var ii int32 var pList uintptr pList = (*Select)(unsafe.Pointer(p)).FpEList for ii = 0; ii < (*ExprList)(unsafe.Pointer(pList)).FnExpr; ii++ { var aff int8 var pSub1 uintptr aff = Xsqlite3ExprAffinity(tls, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(ii)*32)).FpExpr) for pSub1 = (*Select)(unsafe.Pointer(p)).FpPrior; pSub1 != 0; pSub1 = (*Select)(unsafe.Pointer(pSub1)).FpPrior { if int32(Xsqlite3ExprAffinity(tls, (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(pSub1)).FpEList+8+uintptr(ii)*32)).FpExpr)) != int32(aff) { return 1 } } } return 0 } func flattenSubquery(tls *libc.TLS, pParse uintptr, p uintptr, iFrom int32, isAgg int32) int32 { bp := tls.Alloc(88) defer tls.Free(88) var zSavedAuthContext uintptr = (*Parse)(unsafe.Pointer(pParse)).FzAuthContext var pParent uintptr var pSub uintptr var pSub1 uintptr var pSrc uintptr var pSubSrc uintptr var iParent int32 var iNewParent int32 = -1 var isOuterJoin int32 = 0 var i int32 var pWhere uintptr var pSubitem uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var aCsrMap uintptr = uintptr(0) if (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_QueryFlattener) != U32(0) { return 0 } pSrc = (*Select)(unsafe.Pointer(p)).FpSrc pSubitem = pSrc + 8 + uintptr(iFrom)*104 iParent = (*SrcItem)(unsafe.Pointer(pSubitem)).FiCursor pSub = (*SrcItem)(unsafe.Pointer(pSubitem)).FpSelect if (*Select)(unsafe.Pointer(p)).FpWin != 0 || (*Select)(unsafe.Pointer(pSub)).FpWin != 0 { return 0 } pSubSrc = (*Select)(unsafe.Pointer(pSub)).FpSrc if (*Select)(unsafe.Pointer(pSub)).FpLimit != 0 && (*Select)(unsafe.Pointer(p)).FpLimit != 0 { return 0 } if (*Select)(unsafe.Pointer(pSub)).FpLimit != 0 && (*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(pSub)).FpLimit)).FpRight != 0 { return 0 } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Compound) != U32(0) && (*Select)(unsafe.Pointer(pSub)).FpLimit != 0 { return 0 } if (*SrcList)(unsafe.Pointer(pSubSrc)).FnSrc == 0 { return 0 } if (*Select)(unsafe.Pointer(pSub)).FselFlags&U32(SF_Distinct) != 0 { return 0 } if (*Select)(unsafe.Pointer(pSub)).FpLimit != 0 && ((*SrcList)(unsafe.Pointer(pSrc)).FnSrc > 1 || isAgg != 0) { return 0 } if (*Select)(unsafe.Pointer(p)).FpOrderBy != 0 && (*Select)(unsafe.Pointer(pSub)).FpOrderBy != 0 { return 0 } if isAgg != 0 && (*Select)(unsafe.Pointer(pSub)).FpOrderBy != 0 { return 0 } if (*Select)(unsafe.Pointer(pSub)).FpLimit != 0 && (*Select)(unsafe.Pointer(p)).FpWhere != 0 { return 0 } if (*Select)(unsafe.Pointer(pSub)).FpLimit != 0 && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct) != U32(0) { return 0 } if (*Select)(unsafe.Pointer(pSub)).FselFlags&U32(SF_Recursive) != 0 { return 0 } if int32((*SrcItem)(unsafe.Pointer(pSubitem)).Ffg.Fjointype)&(JT_OUTER|JT_LTORJ) != 0 { if (*SrcList)(unsafe.Pointer(pSubSrc)).FnSrc > 1 || int32((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pSubSrc+8)).FpTab)).FeTabType) == TABTYP_VTAB || (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct) != U32(0) || int32((*SrcItem)(unsafe.Pointer(pSubitem)).Ffg.Fjointype)&JT_RIGHT != 0 { return 0 } isOuterJoin = 1 } if iFrom > 0 && int32((*SrcItem)(unsafe.Pointer(pSubSrc+8)).Ffg.Fjointype)&JT_LTORJ != 0 { return 0 } if uint32(int32(*(*uint16)(unsafe.Pointer(pSubitem + 60 + 4))&0x100>>8)) != 0 && int32((*CteUse)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pSubitem + 96)))).FeM10d) == M10d_Yes { return 0 } if (*Select)(unsafe.Pointer(pSub)).FpPrior != 0 { var ii int32 if (*Select)(unsafe.Pointer(pSub)).FpOrderBy != 0 { return 0 } if isAgg != 0 || (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct) != U32(0) || isOuterJoin > 0 { return 0 } for pSub1 = pSub; pSub1 != 0; pSub1 = (*Select)(unsafe.Pointer(pSub1)).FpPrior { if (*Select)(unsafe.Pointer(pSub1)).FselFlags&U32(SF_Distinct|SF_Aggregate) != U32(0) || (*Select)(unsafe.Pointer(pSub1)).FpPrior != 0 && int32((*Select)(unsafe.Pointer(pSub1)).Fop) != TK_ALL || (*SrcList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSub1)).FpSrc)).FnSrc < 1 || (*Select)(unsafe.Pointer(pSub1)).FpWin != 0 { return 0 } if iFrom > 0 && int32((*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(pSub1)).FpSrc+8)).Ffg.Fjointype)&JT_LTORJ != 0 { return 0 } } if (*Select)(unsafe.Pointer(p)).FpOrderBy != 0 { for ii = 0; ii < (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpOrderBy)).FnExpr; ii++ { if int32(*(*U16)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpOrderBy + 8 + uintptr(ii)*32 + 24))) == 0 { return 0 } } } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Recursive) != 0 { return 0 } if compoundHasDifferentAffinities(tls, pSub) != 0 { return 0 } if (*SrcList)(unsafe.Pointer(pSrc)).FnSrc > 1 { if (*Parse)(unsafe.Pointer(pParse)).FnSelect > 500 { return 0 } if (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_FlttnUnionAll) != U32(0) { return 0 } aCsrMap = Xsqlite3DbMallocZero(tls, db, uint64(I64((*Parse)(unsafe.Pointer(pParse)).FnTab)+int64(1))*uint64(unsafe.Sizeof(int32(0)))) if aCsrMap != 0 { *(*int32)(unsafe.Pointer(aCsrMap)) = (*Parse)(unsafe.Pointer(pParse)).FnTab } } } (*Parse)(unsafe.Pointer(pParse)).FzAuthContext = (*SrcItem)(unsafe.Pointer(pSubitem)).FzName Xsqlite3AuthCheck(tls, pParse, SQLITE_SELECT, uintptr(0), uintptr(0), uintptr(0)) (*Parse)(unsafe.Pointer(pParse)).FzAuthContext = zSavedAuthContext pSub1 = (*SrcItem)(unsafe.Pointer(pSubitem)).FpSelect Xsqlite3DbFree(tls, db, (*SrcItem)(unsafe.Pointer(pSubitem)).FzDatabase) Xsqlite3DbFree(tls, db, (*SrcItem)(unsafe.Pointer(pSubitem)).FzName) Xsqlite3DbFree(tls, db, (*SrcItem)(unsafe.Pointer(pSubitem)).FzAlias) (*SrcItem)(unsafe.Pointer(pSubitem)).FzDatabase = uintptr(0) (*SrcItem)(unsafe.Pointer(pSubitem)).FzName = uintptr(0) (*SrcItem)(unsafe.Pointer(pSubitem)).FzAlias = uintptr(0) (*SrcItem)(unsafe.Pointer(pSubitem)).FpSelect = uintptr(0) for pSub = (*Select)(unsafe.Pointer(pSub)).FpPrior; pSub != 0; pSub = (*Select)(unsafe.Pointer(pSub)).FpPrior { var pNew uintptr var pOrderBy uintptr = (*Select)(unsafe.Pointer(p)).FpOrderBy var pLimit uintptr = (*Select)(unsafe.Pointer(p)).FpLimit var pPrior uintptr = (*Select)(unsafe.Pointer(p)).FpPrior var pItemTab uintptr = (*SrcItem)(unsafe.Pointer(pSubitem)).FpTab (*SrcItem)(unsafe.Pointer(pSubitem)).FpTab = uintptr(0) (*Select)(unsafe.Pointer(p)).FpOrderBy = uintptr(0) (*Select)(unsafe.Pointer(p)).FpPrior = uintptr(0) (*Select)(unsafe.Pointer(p)).FpLimit = uintptr(0) pNew = Xsqlite3SelectDup(tls, db, p, 0) (*Select)(unsafe.Pointer(p)).FpLimit = pLimit (*Select)(unsafe.Pointer(p)).FpOrderBy = pOrderBy (*Select)(unsafe.Pointer(p)).Fop = U8(TK_ALL) (*SrcItem)(unsafe.Pointer(pSubitem)).FpTab = pItemTab if pNew == uintptr(0) { (*Select)(unsafe.Pointer(p)).FpPrior = pPrior } else { (*Select)(unsafe.Pointer(pNew)).FselId = U32(libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnSelect, 1)) if aCsrMap != 0 && int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 { renumberCursors(tls, pParse, pNew, iFrom, aCsrMap) } (*Select)(unsafe.Pointer(pNew)).FpPrior = pPrior if pPrior != 0 { (*Select)(unsafe.Pointer(pPrior)).FpNext = pNew } (*Select)(unsafe.Pointer(pNew)).FpNext = p (*Select)(unsafe.Pointer(p)).FpPrior = pNew } } Xsqlite3DbFree(tls, db, aCsrMap) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*SrcItem)(unsafe.Pointer(pSubitem)).FpSelect = pSub1 return 1 } if (*SrcItem)(unsafe.Pointer(pSubitem)).FpTab != uintptr(0) { var pTabToDel uintptr = (*SrcItem)(unsafe.Pointer(pSubitem)).FpTab if (*Table)(unsafe.Pointer(pTabToDel)).FnTabRef == U32(1) { var pToplevel uintptr = func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }() Xsqlite3ParserAddCleanup(tls, pToplevel, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3DeleteTable})), pTabToDel) } else { (*Table)(unsafe.Pointer(pTabToDel)).FnTabRef-- } (*SrcItem)(unsafe.Pointer(pSubitem)).FpTab = uintptr(0) } pSub = pSub1 pParent = p __1: if !(pParent != 0) { goto __3 } { var nSubSrc int32 var jointype U8 = U8(0) var ltorj U8 = U8(int32((*SrcItem)(unsafe.Pointer(pSrc+8+uintptr(iFrom)*104)).Ffg.Fjointype) & JT_LTORJ) pSubSrc = (*Select)(unsafe.Pointer(pSub)).FpSrc nSubSrc = (*SrcList)(unsafe.Pointer(pSubSrc)).FnSrc pSrc = (*Select)(unsafe.Pointer(pParent)).FpSrc if pParent == p { jointype = (*SrcItem)(unsafe.Pointer(pSubitem)).Ffg.Fjointype } if nSubSrc > 1 { pSrc = Xsqlite3SrcListEnlarge(tls, pParse, pSrc, nSubSrc-1, iFrom+1) if pSrc == uintptr(0) { goto __3 } (*Select)(unsafe.Pointer(pParent)).FpSrc = pSrc } for i = 0; i < nSubSrc; i++ { var pItem uintptr = pSrc + 8 + uintptr(i+iFrom)*104 if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x400>>10)) != 0 { Xsqlite3IdListDelete(tls, db, *(*uintptr)(unsafe.Pointer(pItem + 72))) } *(*SrcItem)(unsafe.Pointer(pItem)) = *(*SrcItem)(unsafe.Pointer(pSubSrc + 8 + uintptr(i)*104)) *(*U8)(unsafe.Pointer(pItem + 60)) |= U8(int32(ltorj)) iNewParent = (*SrcItem)(unsafe.Pointer(pSubSrc + 8 + uintptr(i)*104)).FiCursor libc.Xmemset(tls, pSubSrc+8+uintptr(i)*104, 0, uint64(unsafe.Sizeof(SrcItem{}))) } *(*U8)(unsafe.Pointer(pSrc + 8 + uintptr(iFrom)*104 + 60)) &= U8(JT_LTORJ) *(*U8)(unsafe.Pointer(pSrc + 8 + uintptr(iFrom)*104 + 60)) |= U8(int32(jointype) | int32(ltorj)) if (*Select)(unsafe.Pointer(pSub)).FpOrderBy != 0 && (*Select)(unsafe.Pointer(pParent)).FselFlags&U32(SF_NoopOrderBy) == U32(0) { var pOrderBy uintptr = (*Select)(unsafe.Pointer(pSub)).FpOrderBy for i = 0; i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr; i++ { *(*U16)(unsafe.Pointer(pOrderBy + 8 + uintptr(i)*32 + 24)) = U16(0) } (*Select)(unsafe.Pointer(pParent)).FpOrderBy = pOrderBy (*Select)(unsafe.Pointer(pSub)).FpOrderBy = uintptr(0) } pWhere = (*Select)(unsafe.Pointer(pSub)).FpWhere (*Select)(unsafe.Pointer(pSub)).FpWhere = uintptr(0) if isOuterJoin > 0 { Xsqlite3SetJoinExpr(tls, pWhere, iNewParent, uint32(EP_OuterON)) } if pWhere != 0 { if (*Select)(unsafe.Pointer(pParent)).FpWhere != 0 { (*Select)(unsafe.Pointer(pParent)).FpWhere = Xsqlite3PExpr(tls, pParse, TK_AND, pWhere, (*Select)(unsafe.Pointer(pParent)).FpWhere) } else { (*Select)(unsafe.Pointer(pParent)).FpWhere = pWhere } } if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 { (*SubstContext)(unsafe.Pointer(bp)).FpParse = pParse (*SubstContext)(unsafe.Pointer(bp)).FiTable = iParent (*SubstContext)(unsafe.Pointer(bp)).FiNewTable = iNewParent (*SubstContext)(unsafe.Pointer(bp)).FisOuterJoin = isOuterJoin (*SubstContext)(unsafe.Pointer(bp)).FpEList = (*Select)(unsafe.Pointer(pSub)).FpEList (*SubstContext)(unsafe.Pointer(bp)).FpCList = findLeftmostExprlist(tls, pSub) substSelect(tls, bp, pParent, 0) } *(*U32)(unsafe.Pointer(pParent + 4)) |= (*Select)(unsafe.Pointer(pSub)).FselFlags & U32(SF_Compound) if (*Select)(unsafe.Pointer(pSub)).FpLimit != 0 { (*Select)(unsafe.Pointer(pParent)).FpLimit = (*Select)(unsafe.Pointer(pSub)).FpLimit (*Select)(unsafe.Pointer(pSub)).FpLimit = uintptr(0) } for i = 0; i < nSubSrc; i++ { recomputeColumnsUsed(tls, pParent, pSrc+8+uintptr(i+iFrom)*104) } } goto __2 __2: pParent = (*Select)(unsafe.Pointer(pParent)).FpPrior pSub = (*Select)(unsafe.Pointer(pSub)).FpPrior goto __1 goto __3 __3: ; Xsqlite3AggInfoPersistWalkerInit(tls, bp+40, pParse) Xsqlite3WalkSelect(tls, bp+40, pSub1) Xsqlite3SelectDelete(tls, db, pSub1) return 1 } // A structure to keep track of all of the column values that are fixed to // a known value due to WHERE clause constraints of the form COLUMN=VALUE. type WhereConst = WhereConst1 func constInsert(tls *libc.TLS, pConst uintptr, pColumn uintptr, pValue uintptr, pExpr uintptr) { var i int32 if (*Expr)(unsafe.Pointer(pColumn)).Fflags&U32(EP_FixedCol) != U32(0) { return } if int32(Xsqlite3ExprAffinity(tls, pValue)) != 0 { return } if !(Xsqlite3IsBinary(tls, Xsqlite3ExprCompareCollSeq(tls, (*WhereConst)(unsafe.Pointer(pConst)).FpParse, pExpr)) != 0) { return } for i = 0; i < (*WhereConst)(unsafe.Pointer(pConst)).FnConst; i++ { var pE2 uintptr = *(*uintptr)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FapExpr + uintptr(i*2)*8)) if (*Expr)(unsafe.Pointer(pE2)).FiTable == (*Expr)(unsafe.Pointer(pColumn)).FiTable && int32((*Expr)(unsafe.Pointer(pE2)).FiColumn) == int32((*Expr)(unsafe.Pointer(pColumn)).FiColumn) { return } } if int32(Xsqlite3ExprAffinity(tls, pColumn)) == SQLITE_AFF_BLOB { (*WhereConst)(unsafe.Pointer(pConst)).FbHasAffBlob = 1 } (*WhereConst)(unsafe.Pointer(pConst)).FnConst++ (*WhereConst)(unsafe.Pointer(pConst)).FapExpr = Xsqlite3DbReallocOrFree(tls, (*Parse)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FpParse)).Fdb, (*WhereConst)(unsafe.Pointer(pConst)).FapExpr, uint64((*WhereConst)(unsafe.Pointer(pConst)).FnConst*2)*uint64(unsafe.Sizeof(uintptr(0)))) if (*WhereConst)(unsafe.Pointer(pConst)).FapExpr == uintptr(0) { (*WhereConst)(unsafe.Pointer(pConst)).FnConst = 0 } else { *(*uintptr)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FapExpr + uintptr((*WhereConst)(unsafe.Pointer(pConst)).FnConst*2-2)*8)) = pColumn *(*uintptr)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FapExpr + uintptr((*WhereConst)(unsafe.Pointer(pConst)).FnConst*2-1)*8)) = pValue } } func findConstInWhere(tls *libc.TLS, pConst uintptr, pExpr uintptr) { var pRight uintptr var pLeft uintptr if pExpr == uintptr(0) { return } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&(*WhereConst)(unsafe.Pointer(pConst)).FmExcludeOn != U32(0) { return } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AND { findConstInWhere(tls, pConst, (*Expr)(unsafe.Pointer(pExpr)).FpRight) findConstInWhere(tls, pConst, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) return } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_EQ { return } pRight = (*Expr)(unsafe.Pointer(pExpr)).FpRight pLeft = (*Expr)(unsafe.Pointer(pExpr)).FpLeft if int32((*Expr)(unsafe.Pointer(pRight)).Fop) == TK_COLUMN && Xsqlite3ExprIsConstant(tls, pLeft) != 0 { constInsert(tls, pConst, pRight, pLeft, pExpr) } if int32((*Expr)(unsafe.Pointer(pLeft)).Fop) == TK_COLUMN && Xsqlite3ExprIsConstant(tls, pRight) != 0 { constInsert(tls, pConst, pLeft, pRight, pExpr) } } func propagateConstantExprRewriteOne(tls *libc.TLS, pConst uintptr, pExpr uintptr, bIgnoreAffBlob int32) int32 { var i int32 if *(*U8)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FpOomFault)) != 0 { return WRC_Prune } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLUMN { return WRC_Continue } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&(U32(EP_FixedCol)|(*WhereConst)(unsafe.Pointer(pConst)).FmExcludeOn) != U32(0) { return WRC_Continue } for i = 0; i < (*WhereConst)(unsafe.Pointer(pConst)).FnConst; i++ { var pColumn uintptr = *(*uintptr)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FapExpr + uintptr(i*2)*8)) if pColumn == pExpr { continue } if (*Expr)(unsafe.Pointer(pColumn)).FiTable != (*Expr)(unsafe.Pointer(pExpr)).FiTable { continue } if int32((*Expr)(unsafe.Pointer(pColumn)).FiColumn) != int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) { continue } if bIgnoreAffBlob != 0 && int32(Xsqlite3ExprAffinity(tls, pColumn)) == SQLITE_AFF_BLOB { break } (*WhereConst)(unsafe.Pointer(pConst)).FnChng++ *(*U32)(unsafe.Pointer(pExpr + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_Leaf)) *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_FixedCol) (*Expr)(unsafe.Pointer(pExpr)).FpLeft = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FpParse)).Fdb, *(*uintptr)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FapExpr + uintptr(i*2+1)*8)), 0) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FpParse)).Fdb)).FmallocFailed != 0 { return WRC_Prune } break } return WRC_Prune } func propagateConstantExprRewrite(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var pConst uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) if (*WhereConst)(unsafe.Pointer(pConst)).FbHasAffBlob != 0 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) >= TK_EQ && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) <= TK_GE || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_IS { propagateConstantExprRewriteOne(tls, pConst, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, 0) if *(*U8)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(pConst)).FpOomFault)) != 0 { return WRC_Prune } if int32(Xsqlite3ExprAffinity(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft)) != SQLITE_AFF_TEXT { propagateConstantExprRewriteOne(tls, pConst, (*Expr)(unsafe.Pointer(pExpr)).FpRight, 0) } } } return propagateConstantExprRewriteOne(tls, pConst, pExpr, (*WhereConst)(unsafe.Pointer(pConst)).FbHasAffBlob) } func propagateConstants(tls *libc.TLS, pParse uintptr, p uintptr) int32 { bp := tls.Alloc(88) defer tls.Free(88) var nChng int32 = 0 (*WhereConst)(unsafe.Pointer(bp)).FpParse = pParse (*WhereConst)(unsafe.Pointer(bp)).FpOomFault = (*Parse)(unsafe.Pointer(pParse)).Fdb + 103 for __ccgo := true; __ccgo; __ccgo = (*WhereConst)(unsafe.Pointer(bp)).FnChng != 0 { (*WhereConst)(unsafe.Pointer(bp)).FnConst = 0 (*WhereConst)(unsafe.Pointer(bp)).FnChng = 0 (*WhereConst)(unsafe.Pointer(bp)).FapExpr = uintptr(0) (*WhereConst)(unsafe.Pointer(bp)).FbHasAffBlob = 0 if (*Select)(unsafe.Pointer(p)).FpSrc != uintptr(0) && (*SrcList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc)).FnSrc > 0 && int32((*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc+8)).Ffg.Fjointype)&JT_LTORJ != 0 { (*WhereConst)(unsafe.Pointer(bp)).FmExcludeOn = U32(EP_InnerON | EP_OuterON) } else { (*WhereConst)(unsafe.Pointer(bp)).FmExcludeOn = U32(EP_OuterON) } findConstInWhere(tls, bp, (*Select)(unsafe.Pointer(p)).FpWhere) if (*WhereConst)(unsafe.Pointer(bp)).FnConst != 0 { libc.Xmemset(tls, bp+40, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp + 40)).FpParse = pParse (*Walker)(unsafe.Pointer(bp + 40)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{propagateConstantExprRewrite})) (*Walker)(unsafe.Pointer(bp + 40)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkNoop})) (*Walker)(unsafe.Pointer(bp + 40)).FxSelectCallback2 = uintptr(0) (*Walker)(unsafe.Pointer(bp + 40)).FwalkerDepth = 0 *(*uintptr)(unsafe.Pointer(bp + 40 + 40)) = bp Xsqlite3WalkExpr(tls, bp+40, (*Select)(unsafe.Pointer(p)).FpWhere) Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer((*WhereConst)(unsafe.Pointer(bp)).FpParse)).Fdb, (*WhereConst)(unsafe.Pointer(bp)).FapExpr) nChng = nChng + (*WhereConst)(unsafe.Pointer(bp)).FnChng } } return nChng } func pushDownWindowCheck(tls *libc.TLS, pParse uintptr, pSubq uintptr, pExpr uintptr) int32 { return Xsqlite3ExprIsConstantOrGroupBy(tls, pParse, pExpr, (*Window)(unsafe.Pointer((*Select)(unsafe.Pointer(pSubq)).FpWin)).FpPartition) } func pushDownWhereTerms(tls *libc.TLS, pParse uintptr, pSubq uintptr, pWhere uintptr, pSrc uintptr) int32 { bp := tls.Alloc(40) defer tls.Free(40) var pNew uintptr var nChng int32 = 0 if pWhere == uintptr(0) { return 0 } if (*Select)(unsafe.Pointer(pSubq)).FselFlags&U32(SF_Recursive|SF_MultiPart) != 0 { return 0 } if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&(JT_LTORJ|JT_RIGHT) != 0 { return 0 } if (*Select)(unsafe.Pointer(pSubq)).FpPrior != 0 { var pSel uintptr var notUnionAll int32 = 0 for pSel = pSubq; pSel != 0; pSel = (*Select)(unsafe.Pointer(pSel)).FpPrior { var op U8 = (*Select)(unsafe.Pointer(pSel)).Fop if int32(op) != TK_ALL && int32(op) != TK_SELECT { notUnionAll = 1 } if (*Select)(unsafe.Pointer(pSel)).FpWin != 0 { return 0 } } if compoundHasDifferentAffinities(tls, pSubq) != 0 { return 0 } if notUnionAll != 0 { for pSel = pSubq; pSel != 0; pSel = (*Select)(unsafe.Pointer(pSel)).FpPrior { var ii int32 var pList uintptr = (*Select)(unsafe.Pointer(pSel)).FpEList for ii = 0; ii < (*ExprList)(unsafe.Pointer(pList)).FnExpr; ii++ { var pColl uintptr = Xsqlite3ExprCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(ii)*32)).FpExpr) if !(Xsqlite3IsBinary(tls, pColl) != 0) { return 0 } } } } } else { if (*Select)(unsafe.Pointer(pSubq)).FpWin != 0 && (*Window)(unsafe.Pointer((*Select)(unsafe.Pointer(pSubq)).FpWin)).FpPartition == uintptr(0) { return 0 } } if (*Select)(unsafe.Pointer(pSubq)).FpLimit != uintptr(0) { return 0 } for int32((*Expr)(unsafe.Pointer(pWhere)).Fop) == TK_AND { nChng = nChng + pushDownWhereTerms(tls, pParse, pSubq, (*Expr)(unsafe.Pointer(pWhere)).FpRight, pSrc) pWhere = (*Expr)(unsafe.Pointer(pWhere)).FpLeft } if Xsqlite3ExprIsTableConstraint(tls, pWhere, pSrc) != 0 { nChng++ *(*U32)(unsafe.Pointer(pSubq + 4)) |= U32(SF_PushDown) for pSubq != 0 { pNew = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pWhere, 0) unsetJoinExpr(tls, pNew, -1, 1) (*SubstContext)(unsafe.Pointer(bp)).FpParse = pParse (*SubstContext)(unsafe.Pointer(bp)).FiTable = (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor (*SubstContext)(unsafe.Pointer(bp)).FiNewTable = (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor (*SubstContext)(unsafe.Pointer(bp)).FisOuterJoin = 0 (*SubstContext)(unsafe.Pointer(bp)).FpEList = (*Select)(unsafe.Pointer(pSubq)).FpEList (*SubstContext)(unsafe.Pointer(bp)).FpCList = findLeftmostExprlist(tls, pSubq) pNew = substExpr(tls, bp, pNew) if (*Select)(unsafe.Pointer(pSubq)).FpWin != 0 && 0 == pushDownWindowCheck(tls, pParse, pSubq, pNew) { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pNew) nChng-- break } if (*Select)(unsafe.Pointer(pSubq)).FselFlags&U32(SF_Aggregate) != 0 { (*Select)(unsafe.Pointer(pSubq)).FpHaving = Xsqlite3ExprAnd(tls, pParse, (*Select)(unsafe.Pointer(pSubq)).FpHaving, pNew) } else { (*Select)(unsafe.Pointer(pSubq)).FpWhere = Xsqlite3ExprAnd(tls, pParse, (*Select)(unsafe.Pointer(pSubq)).FpWhere, pNew) } pSubq = (*Select)(unsafe.Pointer(pSubq)).FpPrior } } return nChng } func minMaxQuery(tls *libc.TLS, db uintptr, pFunc uintptr, ppMinMax uintptr) U8 { var eRet int32 = WHERE_ORDERBY_NORMAL var pEList uintptr var zFunc uintptr var pOrderBy uintptr var sortFlags U8 = U8(0) pEList = *(*uintptr)(unsafe.Pointer(pFunc + 32)) if pEList == uintptr(0) || (*ExprList)(unsafe.Pointer(pEList)).FnExpr != 1 || (*Expr)(unsafe.Pointer(pFunc)).Fflags&U32(EP_WinFunc) != U32(0) || (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_MinMaxOpt) != U32(0) { return U8(eRet) } zFunc = *(*uintptr)(unsafe.Pointer(pFunc + 8)) if Xsqlite3StrICmp(tls, zFunc, ts+16521) == 0 { eRet = WHERE_ORDERBY_MIN if Xsqlite3ExprCanBeNull(tls, (*ExprList_item)(unsafe.Pointer(pEList+8)).FpExpr) != 0 { sortFlags = U8(KEYINFO_ORDER_BIGNULL) } } else if Xsqlite3StrICmp(tls, zFunc, ts+16525) == 0 { eRet = WHERE_ORDERBY_MAX sortFlags = U8(KEYINFO_ORDER_DESC) } else { return U8(eRet) } *(*uintptr)(unsafe.Pointer(ppMinMax)) = libc.AssignUintptr(&pOrderBy, Xsqlite3ExprListDup(tls, db, pEList, 0)) if pOrderBy != 0 { (*ExprList_item)(unsafe.Pointer(pOrderBy + 8)).Ffg.FsortFlags = sortFlags } return U8(eRet) } func isSimpleCount(tls *libc.TLS, p uintptr, pAggInfo uintptr) uintptr { var pTab uintptr var pExpr uintptr if (*Select)(unsafe.Pointer(p)).FpWhere != 0 || (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr != 1 || (*SrcList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc)).FnSrc != 1 || (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc+8)).FpSelect != 0 || (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc != 1 || (*Select)(unsafe.Pointer(p)).FpHaving != 0 { return uintptr(0) } pTab = (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FpTab if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM) { return uintptr(0) } pExpr = (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList + 8)).FpExpr if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_AGG_FUNCTION { return uintptr(0) } if (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo != pAggInfo { return uintptr(0) } if (*FuncDef)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FpFunc)).FfuncFlags&U32(SQLITE_FUNC_COUNT) == U32(0) { return uintptr(0) } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Distinct|EP_WinFunc) != U32(0) { return uintptr(0) } return pTab } // If the source-list item passed as an argument was augmented with an // INDEXED BY clause, then try to locate the specified index. If there // was such a clause and the named index cannot be found, return // SQLITE_ERROR and leave an error in pParse. Otherwise, populate // pFrom->pIndex and return SQLITE_OK. func Xsqlite3IndexedByLookup(tls *libc.TLS, pParse uintptr, pFrom uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pTab uintptr = (*SrcItem)(unsafe.Pointer(pFrom)).FpTab var zIndexedBy uintptr = *(*uintptr)(unsafe.Pointer(pFrom + 88)) var pIdx uintptr for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0 && Xsqlite3StrICmp(tls, (*Index)(unsafe.Pointer(pIdx)).FzName, zIndexedBy) != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { } if !(pIdx != 0) { Xsqlite3ErrorMsg(tls, pParse, ts+20580, libc.VaList(bp, zIndexedBy, 0)) (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) return SQLITE_ERROR } *(*uintptr)(unsafe.Pointer(pFrom + 96)) = pIdx return SQLITE_OK } func convertCompoundSelectToSubquery(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var i int32 var pNew uintptr var pX uintptr var db uintptr var a uintptr var pNewSrc uintptr var pParse uintptr if (*Select)(unsafe.Pointer(p)).FpPrior == uintptr(0) { return WRC_Continue } if (*Select)(unsafe.Pointer(p)).FpOrderBy == uintptr(0) { return WRC_Continue } for pX = p; pX != 0 && (int32((*Select)(unsafe.Pointer(pX)).Fop) == TK_ALL || int32((*Select)(unsafe.Pointer(pX)).Fop) == TK_SELECT); pX = (*Select)(unsafe.Pointer(pX)).FpPrior { } if pX == uintptr(0) { return WRC_Continue } a = (*Select)(unsafe.Pointer(p)).FpOrderBy + 8 if *(*U16)(unsafe.Pointer(a + 24)) != 0 { return WRC_Continue } for i = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpOrderBy)).FnExpr - 1; i >= 0; i-- { if (*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(a+uintptr(i)*32)).FpExpr)).Fflags&U32(EP_Collate) != 0 { break } } if i < 0 { return WRC_Continue } pParse = (*Walker)(unsafe.Pointer(pWalker)).FpParse db = (*Parse)(unsafe.Pointer(pParse)).Fdb pNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Select{}))) if pNew == uintptr(0) { return WRC_Abort } libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Token{}))) pNewSrc = Xsqlite3SrcListAppendFromTerm(tls, pParse, uintptr(0), uintptr(0), uintptr(0), bp, pNew, uintptr(0)) if pNewSrc == uintptr(0) { return WRC_Abort } *(*Select)(unsafe.Pointer(pNew)) = *(*Select)(unsafe.Pointer(p)) (*Select)(unsafe.Pointer(p)).FpSrc = pNewSrc (*Select)(unsafe.Pointer(p)).FpEList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), Xsqlite3Expr(tls, db, TK_ASTERISK, uintptr(0))) (*Select)(unsafe.Pointer(p)).Fop = U8(TK_SELECT) (*Select)(unsafe.Pointer(p)).FpWhere = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpGroupBy = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpHaving = uintptr(0) (*Select)(unsafe.Pointer(pNew)).FpOrderBy = uintptr(0) (*Select)(unsafe.Pointer(p)).FpPrior = uintptr(0) (*Select)(unsafe.Pointer(p)).FpNext = uintptr(0) (*Select)(unsafe.Pointer(p)).FpWith = uintptr(0) (*Select)(unsafe.Pointer(p)).FpWinDefn = uintptr(0) *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_Compound)) *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_Converted) (*Select)(unsafe.Pointer((*Select)(unsafe.Pointer(pNew)).FpPrior)).FpNext = pNew (*Select)(unsafe.Pointer(pNew)).FpLimit = uintptr(0) return WRC_Continue } func cannotBeFunction(tls *libc.TLS, pParse uintptr, pFrom uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x4>>2)) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+20598, libc.VaList(bp, (*SrcItem)(unsafe.Pointer(pFrom)).FzName)) return 1 } return 0 } func searchWith(tls *libc.TLS, pWith uintptr, pItem uintptr, ppContext uintptr) uintptr { var zName uintptr = (*SrcItem)(unsafe.Pointer(pItem)).FzName var p uintptr for p = pWith; p != 0; p = (*With)(unsafe.Pointer(p)).FpOuter { var i int32 for i = 0; i < (*With)(unsafe.Pointer(p)).FnCte; i++ { if Xsqlite3StrICmp(tls, zName, (*Cte)(unsafe.Pointer(p+16+uintptr(i)*48)).FzName) == 0 { *(*uintptr)(unsafe.Pointer(ppContext)) = p return p + 16 + uintptr(i)*48 } } if (*With)(unsafe.Pointer(p)).FbView != 0 { break } } return uintptr(0) } // The code generator maintains a stack of active WITH clauses // with the inner-most WITH clause being at the top of the stack. // // This routine pushes the WITH clause passed as the second argument // onto the top of the stack. If argument bFree is true, then this // WITH clause will never be popped from the stack but should instead // be freed along with the Parse object. In other cases, when // bFree==0, the With object will be freed along with the SELECT // statement with which it is associated. // // This routine returns a copy of pWith. Or, if bFree is true and // the pWith object is destroyed immediately due to an OOM condition, // then this routine return NULL. // // If bFree is true, do not continue to use the pWith pointer after // calling this routine, Instead, use only the return value. func Xsqlite3WithPush(tls *libc.TLS, pParse uintptr, pWith uintptr, bFree U8) uintptr { if pWith != 0 { if bFree != 0 { pWith = Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3WithDelete})), pWith) if pWith == uintptr(0) { return uintptr(0) } } if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 { (*With)(unsafe.Pointer(pWith)).FpOuter = (*Parse)(unsafe.Pointer(pParse)).FpWith (*Parse)(unsafe.Pointer(pParse)).FpWith = pWith } } return pWith } func resolveFromTermToCte(tls *libc.TLS, pParse uintptr, pWalker uintptr, pFrom uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var pCte uintptr if (*Parse)(unsafe.Pointer(pParse)).FpWith == uintptr(0) { return 0 } if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return 0 } if (*SrcItem)(unsafe.Pointer(pFrom)).FzDatabase != uintptr(0) { return 0 } if uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x200>>9)) != 0 { return 0 } pCte = searchWith(tls, (*Parse)(unsafe.Pointer(pParse)).FpWith, pFrom, bp+48) if pCte != 0 { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTab uintptr var pEList uintptr var pSel uintptr var pLeft uintptr var pRecTerm uintptr var bMayRecursive int32 var pSavedWith uintptr var iRecTab int32 = -1 var pCteUse uintptr if (*Cte)(unsafe.Pointer(pCte)).FzCteErr != 0 { Xsqlite3ErrorMsg(tls, pParse, (*Cte)(unsafe.Pointer(pCte)).FzCteErr, libc.VaList(bp, (*Cte)(unsafe.Pointer(pCte)).FzName)) return 2 } if cannotBeFunction(tls, pParse, pFrom) != 0 { return 2 } pTab = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Table{}))) if pTab == uintptr(0) { return 2 } pCteUse = (*Cte)(unsafe.Pointer(pCte)).FpUse if pCteUse == uintptr(0) { (*Cte)(unsafe.Pointer(pCte)).FpUse = libc.AssignUintptr(&pCteUse, Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(CteUse{})))) if pCteUse == uintptr(0) || Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3DbFree})), pCteUse) == uintptr(0) { Xsqlite3DbFree(tls, db, pTab) return 2 } (*CteUse)(unsafe.Pointer(pCteUse)).FeM10d = (*Cte)(unsafe.Pointer(pCte)).FeM10d } (*SrcItem)(unsafe.Pointer(pFrom)).FpTab = pTab (*Table)(unsafe.Pointer(pTab)).FnTabRef = U32(1) (*Table)(unsafe.Pointer(pTab)).FzName = Xsqlite3DbStrDup(tls, db, (*Cte)(unsafe.Pointer(pCte)).FzName) (*Table)(unsafe.Pointer(pTab)).FiPKey = int16(-1) (*Table)(unsafe.Pointer(pTab)).FnRowLogEst = int16(200) *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_Ephemeral | TF_NoVisibleRowid) (*SrcItem)(unsafe.Pointer(pFrom)).FpSelect = Xsqlite3SelectDup(tls, db, (*Cte)(unsafe.Pointer(pCte)).FpSelect, 0) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return 2 } *(*U32)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pFrom)).FpSelect + 4)) |= U32(SF_CopyCte) if uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x2>>1)) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+20621, libc.VaList(bp+8, *(*uintptr)(unsafe.Pointer(pFrom + 88)))) return 2 } libc.SetBitFieldPtr16Uint32(pFrom+60+4, uint32(1), 8, 0x100) *(*uintptr)(unsafe.Pointer(pFrom + 96)) = pCteUse (*CteUse)(unsafe.Pointer(pCteUse)).FnUse++ pRecTerm = libc.AssignUintptr(&pSel, (*SrcItem)(unsafe.Pointer(pFrom)).FpSelect) bMayRecursive = libc.Bool32(int32((*Select)(unsafe.Pointer(pSel)).Fop) == TK_ALL || int32((*Select)(unsafe.Pointer(pSel)).Fop) == TK_UNION) for bMayRecursive != 0 && int32((*Select)(unsafe.Pointer(pRecTerm)).Fop) == int32((*Select)(unsafe.Pointer(pSel)).Fop) { var i int32 var pSrc uintptr = (*Select)(unsafe.Pointer(pRecTerm)).FpSrc for i = 0; i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc; i++ { var pItem uintptr = pSrc + 8 + uintptr(i)*104 if (*SrcItem)(unsafe.Pointer(pItem)).FzDatabase == uintptr(0) && (*SrcItem)(unsafe.Pointer(pItem)).FzName != uintptr(0) && 0 == Xsqlite3StrICmp(tls, (*SrcItem)(unsafe.Pointer(pItem)).FzName, (*Cte)(unsafe.Pointer(pCte)).FzName) { (*SrcItem)(unsafe.Pointer(pItem)).FpTab = pTab (*Table)(unsafe.Pointer(pTab)).FnTabRef++ libc.SetBitFieldPtr16Uint32(pItem+60+4, uint32(1), 6, 0x40) if (*Select)(unsafe.Pointer(pRecTerm)).FselFlags&U32(SF_Recursive) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+20641, libc.VaList(bp+16, (*Cte)(unsafe.Pointer(pCte)).FzName)) return 2 } *(*U32)(unsafe.Pointer(pRecTerm + 4)) |= U32(SF_Recursive) if iRecTab < 0 { iRecTab = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) } (*SrcItem)(unsafe.Pointer(pItem)).FiCursor = iRecTab } } if (*Select)(unsafe.Pointer(pRecTerm)).FselFlags&U32(SF_Recursive) == U32(0) { break } pRecTerm = (*Select)(unsafe.Pointer(pRecTerm)).FpPrior } (*Cte)(unsafe.Pointer(pCte)).FzCteErr = ts + 20684 pSavedWith = (*Parse)(unsafe.Pointer(pParse)).FpWith (*Parse)(unsafe.Pointer(pParse)).FpWith = *(*uintptr)(unsafe.Pointer(bp + 48)) if (*Select)(unsafe.Pointer(pSel)).FselFlags&U32(SF_Recursive) != 0 { var rc int32 (*Select)(unsafe.Pointer(pRecTerm)).FpWith = (*Select)(unsafe.Pointer(pSel)).FpWith rc = Xsqlite3WalkSelect(tls, pWalker, pRecTerm) (*Select)(unsafe.Pointer(pRecTerm)).FpWith = uintptr(0) if rc != 0 { (*Parse)(unsafe.Pointer(pParse)).FpWith = pSavedWith return 2 } } else { if Xsqlite3WalkSelect(tls, pWalker, pSel) != 0 { (*Parse)(unsafe.Pointer(pParse)).FpWith = pSavedWith return 2 } } (*Parse)(unsafe.Pointer(pParse)).FpWith = *(*uintptr)(unsafe.Pointer(bp + 48)) for pLeft = pSel; (*Select)(unsafe.Pointer(pLeft)).FpPrior != 0; pLeft = (*Select)(unsafe.Pointer(pLeft)).FpPrior { } pEList = (*Select)(unsafe.Pointer(pLeft)).FpEList if (*Cte)(unsafe.Pointer(pCte)).FpCols != 0 { if pEList != 0 && (*ExprList)(unsafe.Pointer(pEList)).FnExpr != (*ExprList)(unsafe.Pointer((*Cte)(unsafe.Pointer(pCte)).FpCols)).FnExpr { Xsqlite3ErrorMsg(tls, pParse, ts+20707, libc.VaList(bp+24, (*Cte)(unsafe.Pointer(pCte)).FzName, (*ExprList)(unsafe.Pointer(pEList)).FnExpr, (*ExprList)(unsafe.Pointer((*Cte)(unsafe.Pointer(pCte)).FpCols)).FnExpr)) (*Parse)(unsafe.Pointer(pParse)).FpWith = pSavedWith return 2 } pEList = (*Cte)(unsafe.Pointer(pCte)).FpCols } Xsqlite3ColumnsFromExprList(tls, pParse, pEList, pTab+54, pTab+8) if bMayRecursive != 0 { if (*Select)(unsafe.Pointer(pSel)).FselFlags&U32(SF_Recursive) != 0 { (*Cte)(unsafe.Pointer(pCte)).FzCteErr = ts + 20745 } else { (*Cte)(unsafe.Pointer(pCte)).FzCteErr = ts + 20779 } Xsqlite3WalkSelect(tls, pWalker, pSel) } (*Cte)(unsafe.Pointer(pCte)).FzCteErr = uintptr(0) (*Parse)(unsafe.Pointer(pParse)).FpWith = pSavedWith return 1 } return 0 } // If the SELECT passed as the second argument has an associated WITH // clause, pop it from the stack stored as part of the Parse object. // // This function is used as the xSelectCallback2() callback by // sqlite3SelectExpand() when walking a SELECT tree to resolve table // names and other FROM clause elements. func Xsqlite3SelectPopWith(tls *libc.TLS, pWalker uintptr, p uintptr) { var pParse uintptr = (*Walker)(unsafe.Pointer(pWalker)).FpParse if (*Parse)(unsafe.Pointer(pParse)).FpWith != 0 && (*Select)(unsafe.Pointer(p)).FpPrior == uintptr(0) { var pWith uintptr = (*Select)(unsafe.Pointer(findRightmost(tls, p))).FpWith if pWith != uintptr(0) { (*Parse)(unsafe.Pointer(pParse)).FpWith = (*With)(unsafe.Pointer(pWith)).FpOuter } } } // The SrcItem structure passed as the second argument represents a // sub-query in the FROM clause of a SELECT statement. This function // allocates and populates the SrcItem.pTab object. If successful, // SQLITE_OK is returned. Otherwise, if an OOM error is encountered, // SQLITE_NOMEM. func Xsqlite3ExpandSubquery(tls *libc.TLS, pParse uintptr, pFrom uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pSel uintptr = (*SrcItem)(unsafe.Pointer(pFrom)).FpSelect var pTab uintptr (*SrcItem)(unsafe.Pointer(pFrom)).FpTab = libc.AssignUintptr(&pTab, Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Table{})))) if pTab == uintptr(0) { return SQLITE_NOMEM } (*Table)(unsafe.Pointer(pTab)).FnTabRef = U32(1) if (*SrcItem)(unsafe.Pointer(pFrom)).FzAlias != 0 { (*Table)(unsafe.Pointer(pTab)).FzName = Xsqlite3DbStrDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*SrcItem)(unsafe.Pointer(pFrom)).FzAlias) } else { (*Table)(unsafe.Pointer(pTab)).FzName = Xsqlite3MPrintf(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, ts+20817, libc.VaList(bp, pFrom)) } for (*Select)(unsafe.Pointer(pSel)).FpPrior != 0 { pSel = (*Select)(unsafe.Pointer(pSel)).FpPrior } Xsqlite3ColumnsFromExprList(tls, pParse, (*Select)(unsafe.Pointer(pSel)).FpEList, pTab+54, pTab+8) (*Table)(unsafe.Pointer(pTab)).FiPKey = int16(-1) (*Table)(unsafe.Pointer(pTab)).FnRowLogEst = int16(200) *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_Ephemeral | TF_NoVisibleRowid) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return SQLITE_ERROR } return SQLITE_OK } func inAnyUsingClause(tls *libc.TLS, zName uintptr, pBase uintptr, N int32) int32 { for N > 0 { N-- pBase += 104 if int32(*(*uint16)(unsafe.Pointer(pBase + 60 + 4))&0x400>>10) == 0 { continue } if *(*uintptr)(unsafe.Pointer(pBase + 72)) == uintptr(0) { continue } if Xsqlite3IdListIndex(tls, *(*uintptr)(unsafe.Pointer(pBase + 72)), zName) >= 0 { return 1 } } return 0 } func selectExpander(tls *libc.TLS, pWalker uintptr, p uintptr) int32 { bp := tls.Alloc(80) defer tls.Free(80) var pParse uintptr = (*Walker)(unsafe.Pointer(pWalker)).FpParse var i int32 var j int32 var k int32 var rc int32 var pTabList uintptr var pEList uintptr var pFrom uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pE uintptr var pRight uintptr var pExpr uintptr var selFlags U16 = U16((*Select)(unsafe.Pointer(p)).FselFlags) var elistFlags U32 = U32(0) *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_Expanded) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return WRC_Abort } if int32(selFlags)&SF_Expanded != 0 { return WRC_Prune } if (*Walker)(unsafe.Pointer(pWalker)).FeCode != 0 { (*Select)(unsafe.Pointer(p)).FselId = U32(libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnSelect, 1)) } pTabList = (*Select)(unsafe.Pointer(p)).FpSrc pEList = (*Select)(unsafe.Pointer(p)).FpEList if (*Parse)(unsafe.Pointer(pParse)).FpWith != 0 && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_View) != 0 { if (*Select)(unsafe.Pointer(p)).FpWith == uintptr(0) { (*Select)(unsafe.Pointer(p)).FpWith = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(With{}))) if (*Select)(unsafe.Pointer(p)).FpWith == uintptr(0) { return WRC_Abort } } (*With)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpWith)).FbView = 1 } Xsqlite3WithPush(tls, pParse, (*Select)(unsafe.Pointer(p)).FpWith, uint8(0)) Xsqlite3SrcListAssignCursors(tls, pParse, pTabList) i = 0 pFrom = pTabList + 8 __1: if !(i < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc) { goto __3 } { var pTab uintptr if (*SrcItem)(unsafe.Pointer(pFrom)).FpTab != 0 { goto __2 } if (*SrcItem)(unsafe.Pointer(pFrom)).FzName == uintptr(0) { var pSel uintptr = (*SrcItem)(unsafe.Pointer(pFrom)).FpSelect if Xsqlite3WalkSelect(tls, pWalker, pSel) != 0 { return WRC_Abort } if Xsqlite3ExpandSubquery(tls, pParse, pFrom) != 0 { return WRC_Abort } } else if libc.AssignInt32(&rc, resolveFromTermToCte(tls, pParse, pWalker, pFrom)) != 0 { if rc > 1 { return WRC_Abort } pTab = (*SrcItem)(unsafe.Pointer(pFrom)).FpTab } else { (*SrcItem)(unsafe.Pointer(pFrom)).FpTab = libc.AssignUintptr(&pTab, Xsqlite3LocateTableItem(tls, pParse, uint32(0), pFrom)) if pTab == uintptr(0) { return WRC_Abort } if (*Table)(unsafe.Pointer(pTab)).FnTabRef >= U32(0xffff) { Xsqlite3ErrorMsg(tls, pParse, ts+20821, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) (*SrcItem)(unsafe.Pointer(pFrom)).FpTab = uintptr(0) return WRC_Abort } (*Table)(unsafe.Pointer(pTab)).FnTabRef++ if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) && cannotBeFunction(tls, pParse, pFrom) != 0 { return WRC_Abort } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_NORM) { var nCol I16 var eCodeOrig U8 = U8((*Walker)(unsafe.Pointer(pWalker)).FeCode) if Xsqlite3ViewGetColumnNames(tls, pParse, pTab) != 0 { return WRC_Abort } if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW { if (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_EnableView) == uint64(0) && (*Table)(unsafe.Pointer(pTab)).FpSchema != (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema { Xsqlite3ErrorMsg(tls, pParse, ts+20860, libc.VaList(bp+8, (*Table)(unsafe.Pointer(pTab)).FzName)) } (*SrcItem)(unsafe.Pointer(pFrom)).FpSelect = Xsqlite3SelectDup(tls, db, *(*uintptr)(unsafe.Pointer(pTab + 64)), 0) } else if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB && uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x80>>7)) != 0 && *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) != uintptr(0) && int32((*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 16)))).FeVtabRisk) > libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_TrustedSchema) != uint64(0)) { Xsqlite3ErrorMsg(tls, pParse, ts+16090, libc.VaList(bp+16, (*Table)(unsafe.Pointer(pTab)).FzName)) } nCol = (*Table)(unsafe.Pointer(pTab)).FnCol (*Table)(unsafe.Pointer(pTab)).FnCol = int16(-1) (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(1) Xsqlite3WalkSelect(tls, pWalker, (*SrcItem)(unsafe.Pointer(pFrom)).FpSelect) (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(eCodeOrig) (*Table)(unsafe.Pointer(pTab)).FnCol = nCol } } if uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x2>>1)) != 0 && Xsqlite3IndexedByLookup(tls, pParse, pFrom) != 0 { return WRC_Abort } } goto __2 __2: i++ pFrom += 104 goto __1 goto __3 __3: ; if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 || sqlite3ProcessJoin(tls, pParse, p) != 0 { return WRC_Abort } for k = 0; k < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; k++ { pE = (*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(k)*32)).FpExpr if int32((*Expr)(unsafe.Pointer(pE)).Fop) == TK_ASTERISK { break } if int32((*Expr)(unsafe.Pointer(pE)).Fop) == TK_DOT && int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pE)).FpRight)).Fop) == TK_ASTERISK { break } elistFlags = elistFlags | (*Expr)(unsafe.Pointer(pE)).Fflags } if k < (*ExprList)(unsafe.Pointer(pEList)).FnExpr { var a uintptr = pEList + 8 var pNew uintptr = uintptr(0) var flags int32 = int32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags) var longNames int32 = libc.Bool32(flags&SQLITE_FullColNames != 0 && flags&SQLITE_ShortColNames == 0) for k = 0; k < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; k++ { pE = (*ExprList_item)(unsafe.Pointer(a + uintptr(k)*32)).FpExpr elistFlags = elistFlags | (*Expr)(unsafe.Pointer(pE)).Fflags pRight = (*Expr)(unsafe.Pointer(pE)).FpRight if int32((*Expr)(unsafe.Pointer(pE)).Fop) != TK_ASTERISK && (int32((*Expr)(unsafe.Pointer(pE)).Fop) != TK_DOT || int32((*Expr)(unsafe.Pointer(pRight)).Fop) != TK_ASTERISK) { pNew = Xsqlite3ExprListAppend(tls, pParse, pNew, (*ExprList_item)(unsafe.Pointer(a+uintptr(k)*32)).FpExpr) if pNew != 0 { (*ExprList_item)(unsafe.Pointer(pNew + 8 + uintptr((*ExprList)(unsafe.Pointer(pNew)).FnExpr-1)*32)).FzEName = (*ExprList_item)(unsafe.Pointer(a + uintptr(k)*32)).FzEName libc.SetBitFieldPtr16Uint32(pNew+8+uintptr((*ExprList)(unsafe.Pointer(pNew)).FnExpr-1)*32+16+4, uint32(int32(*(*uint16)(unsafe.Pointer(a + uintptr(k)*32 + 16 + 4))&0x3>>0)), 0, 0x3) (*ExprList_item)(unsafe.Pointer(a + uintptr(k)*32)).FzEName = uintptr(0) } (*ExprList_item)(unsafe.Pointer(a + uintptr(k)*32)).FpExpr = uintptr(0) } else { var tableSeen int32 = 0 var zTName uintptr = uintptr(0) if int32((*Expr)(unsafe.Pointer(pE)).Fop) == TK_DOT { zTName = *(*uintptr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pE)).FpLeft + 8)) } i = 0 pFrom = pTabList + 8 __4: if !(i < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc) { goto __6 } { var pTab uintptr = (*SrcItem)(unsafe.Pointer(pFrom)).FpTab var pNestedFrom uintptr var zTabName uintptr var zSchemaName uintptr = uintptr(0) var iDb int32 var pUsing uintptr if libc.AssignUintptr(&zTabName, (*SrcItem)(unsafe.Pointer(pFrom)).FzAlias) == uintptr(0) { zTabName = (*Table)(unsafe.Pointer(pTab)).FzName } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { goto __6 } if uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x2000>>13)) != 0 { pNestedFrom = (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pFrom)).FpSelect)).FpEList } else { if zTName != 0 && Xsqlite3StrICmp(tls, zTName, zTabName) != 0 { goto __5 } pNestedFrom = uintptr(0) iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) if iDb >= 0 { zSchemaName = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName } else { zSchemaName = ts + 7798 } } if i+1 < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc && uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 1*104 + 60 + 4))&0x400>>10)) != 0 && int32(selFlags)&SF_NestedFrom != 0 { var ii int32 pUsing = *(*uintptr)(unsafe.Pointer(pFrom + 1*104 + 72)) for ii = 0; ii < (*IdList)(unsafe.Pointer(pUsing)).FnId; ii++ { var zUName uintptr = (*IdList_item)(unsafe.Pointer(pUsing + 8 + uintptr(ii)*16)).FzName pRight = Xsqlite3Expr(tls, db, TK_ID, zUName) pNew = Xsqlite3ExprListAppend(tls, pParse, pNew, pRight) if pNew != 0 { var pX uintptr = pNew + 8 + uintptr((*ExprList)(unsafe.Pointer(pNew)).FnExpr-1)*32 (*ExprList_item)(unsafe.Pointer(pX)).FzEName = Xsqlite3MPrintf(tls, db, ts+20891, libc.VaList(bp+24, zUName)) libc.SetBitFieldPtr16Uint32(pX+16+4, uint32(ENAME_TAB), 0, 0x3) libc.SetBitFieldPtr16Uint32(pX+16+4, uint32(1), 7, 0x80) } } } else { pUsing = uintptr(0) } for j = 0; j < int32((*Table)(unsafe.Pointer(pTab)).FnCol); j++ { var zName uintptr = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(j)*24)).FzCnName var pX uintptr if zTName != 0 && pNestedFrom != 0 && Xsqlite3MatchEName(tls, pNestedFrom+8+uintptr(j)*32, uintptr(0), zTName, uintptr(0)) == 0 { continue } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_IncludeHidden) == U32(0) && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_HIDDEN != 0 { continue } if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_NOEXPAND != 0 && zTName == uintptr(0) && int32(selFlags)&SF_NestedFrom == 0 { continue } tableSeen = 1 if i > 0 && zTName == uintptr(0) && int32(selFlags)&SF_NestedFrom == 0 { if uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x400>>10)) != 0 && Xsqlite3IdListIndex(tls, *(*uintptr)(unsafe.Pointer(pFrom + 72)), zName) >= 0 { continue } } pRight = Xsqlite3Expr(tls, db, TK_ID, zName) if (*SrcList)(unsafe.Pointer(pTabList)).FnSrc > 1 && (int32((*SrcItem)(unsafe.Pointer(pFrom)).Ffg.Fjointype)&JT_LTORJ == 0 || int32(selFlags)&SF_NestedFrom != 0 || !(inAnyUsingClause(tls, zName, pFrom, (*SrcList)(unsafe.Pointer(pTabList)).FnSrc-i-1) != 0)) || int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { var pLeft uintptr pLeft = Xsqlite3Expr(tls, db, TK_ID, zTabName) pExpr = Xsqlite3PExpr(tls, pParse, TK_DOT, pLeft, pRight) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && (*Expr)(unsafe.Pointer(pE)).FpLeft != 0 { Xsqlite3RenameTokenRemap(tls, pParse, pLeft, (*Expr)(unsafe.Pointer(pE)).FpLeft) } if zSchemaName != 0 { pLeft = Xsqlite3Expr(tls, db, TK_ID, zSchemaName) pExpr = Xsqlite3PExpr(tls, pParse, TK_DOT, pLeft, pExpr) } } else { pExpr = pRight } pNew = Xsqlite3ExprListAppend(tls, pParse, pNew, pExpr) if pNew == uintptr(0) { break } pX = pNew + 8 + uintptr((*ExprList)(unsafe.Pointer(pNew)).FnExpr-1)*32 if int32(selFlags)&SF_NestedFrom != 0 && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { if pNestedFrom != 0 { (*ExprList_item)(unsafe.Pointer(pX)).FzEName = Xsqlite3DbStrDup(tls, db, (*ExprList_item)(unsafe.Pointer(pNestedFrom+8+uintptr(j)*32)).FzEName) } else { (*ExprList_item)(unsafe.Pointer(pX)).FzEName = Xsqlite3MPrintf(tls, db, ts+20896, libc.VaList(bp+32, zSchemaName, zTabName, zName)) } libc.SetBitFieldPtr16Uint32(pX+16+4, uint32(ENAME_TAB), 0, 0x3) if uint32(int32(*(*uint16)(unsafe.Pointer(pFrom + 60 + 4))&0x400>>10)) != 0 && Xsqlite3IdListIndex(tls, *(*uintptr)(unsafe.Pointer(pFrom + 72)), zName) >= 0 || pUsing != 0 && Xsqlite3IdListIndex(tls, pUsing, zName) >= 0 || int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_NOEXPAND != 0 { libc.SetBitFieldPtr16Uint32(pX+16+4, uint32(1), 8, 0x100) } } else if longNames != 0 { (*ExprList_item)(unsafe.Pointer(pX)).FzEName = Xsqlite3MPrintf(tls, db, ts+13413, libc.VaList(bp+56, zTabName, zName)) libc.SetBitFieldPtr16Uint32(pX+16+4, uint32(ENAME_NAME), 0, 0x3) } else { (*ExprList_item)(unsafe.Pointer(pX)).FzEName = Xsqlite3DbStrDup(tls, db, zName) libc.SetBitFieldPtr16Uint32(pX+16+4, uint32(ENAME_NAME), 0, 0x3) } } } goto __5 __5: i++ pFrom += 104 goto __4 goto __6 __6: ; if !(tableSeen != 0) { if zTName != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+20905, libc.VaList(bp+72, zTName)) } else { Xsqlite3ErrorMsg(tls, pParse, ts+20923, 0) } } } } Xsqlite3ExprListDelete(tls, db, pEList) (*Select)(unsafe.Pointer(p)).FpEList = pNew } if (*Select)(unsafe.Pointer(p)).FpEList != 0 { if (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr > *(*int32)(unsafe.Pointer(db + 136 + 2*4)) { Xsqlite3ErrorMsg(tls, pParse, ts+20943, 0) return WRC_Abort } if elistFlags&U32(EP_HasFunc|EP_Subquery) != U32(0) { *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_ComplexResult) } } return WRC_Continue } func sqlite3SelectExpand(tls *libc.TLS, pParse uintptr, pSelect uintptr) { bp := tls.Alloc(48) defer tls.Free(48) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3ExprWalkNoop})) (*Walker)(unsafe.Pointer(bp)).FpParse = pParse if (*Parse)(unsafe.Pointer(pParse)).FhasCompound != 0 { (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{convertCompoundSelectToSubquery})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = uintptr(0) Xsqlite3WalkSelect(tls, bp, pSelect) } (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{selectExpander})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3SelectPopWith})) (*Walker)(unsafe.Pointer(bp)).FeCode = U16(0) Xsqlite3WalkSelect(tls, bp, pSelect) } func selectAddSubqueryTypeInfo(tls *libc.TLS, pWalker uintptr, p uintptr) { var pParse uintptr var i int32 var pTabList uintptr var pFrom uintptr if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_HasTypeInfo) != 0 { return } *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_HasTypeInfo) pParse = (*Walker)(unsafe.Pointer(pWalker)).FpParse pTabList = (*Select)(unsafe.Pointer(p)).FpSrc i = 0 pFrom = pTabList + 8 __1: if !(i < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc) { goto __3 } { var pTab uintptr = (*SrcItem)(unsafe.Pointer(pFrom)).FpTab if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Ephemeral) != U32(0) { var pSel uintptr = (*SrcItem)(unsafe.Pointer(pFrom)).FpSelect if pSel != 0 { Xsqlite3SubqueryColumnTypes(tls, pParse, pTab, pSel, int8(SQLITE_AFF_NONE)) } } } goto __2 __2: i++ pFrom += 104 goto __1 goto __3 __3: } func sqlite3SelectAddTypeInfo(tls *libc.TLS, pParse uintptr, pSelect uintptr) { bp := tls.Alloc(48) defer tls.Free(48) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkNoop})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{selectAddSubqueryTypeInfo})) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3ExprWalkNoop})) (*Walker)(unsafe.Pointer(bp)).FpParse = pParse Xsqlite3WalkSelect(tls, bp, pSelect) } // This routine sets up a SELECT statement for processing. The // following is accomplished: // // - VDBE Cursor numbers are assigned to all FROM-clause terms. // - Ephemeral Table objects are created for all FROM-clause subqueries. // - ON and USING clauses are shifted into WHERE statements // - Wildcards "*" and "TABLE.*" in result sets are expanded. // - Identifiers in expression are matched to tables. // // This routine acts recursively on all subqueries within the SELECT. func Xsqlite3SelectPrep(tls *libc.TLS, pParse uintptr, p uintptr, pOuterNC uintptr) { if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { return } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_HasTypeInfo) != 0 { return } sqlite3SelectExpand(tls, pParse, p) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } Xsqlite3ResolveSelectNames(tls, pParse, p, pOuterNC) if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } sqlite3SelectAddTypeInfo(tls, pParse, p) } func analyzeAggFuncArgs(tls *libc.TLS, pAggInfo uintptr, pNC uintptr) { var i int32 *(*int32)(unsafe.Pointer(pNC + 40)) |= NC_InAggFunc for i = 0; i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc; i++ { var pExpr uintptr = (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc + uintptr(i)*24)).FpFExpr Xsqlite3ExprAnalyzeAggList(tls, pNC, *(*uintptr)(unsafe.Pointer(pExpr + 32))) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0) { Xsqlite3ExprAnalyzeAggregates(tls, pNC, (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 64)))).FpFilter) } } *(*int32)(unsafe.Pointer(pNC + 40)) &= libc.CplInt32(NC_InAggFunc) } func optimizeAggregateUseOfIndexedExpr(tls *libc.TLS, pParse uintptr, pSelect uintptr, pAggInfo uintptr, pNC uintptr) { (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn = (*AggInfo)(unsafe.Pointer(pAggInfo)).FnAccumulator if int32((*AggInfo)(unsafe.Pointer(pAggInfo)).FnSortingColumn) > 0 { if (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn == 0 { (*AggInfo)(unsafe.Pointer(pAggInfo)).FnSortingColumn = U16((*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpGroupBy)).FnExpr) } else { (*AggInfo)(unsafe.Pointer(pAggInfo)).FnSortingColumn = U16(int32((*AggInfo_col)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol+uintptr((*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn-1)*24)).FiSorterColumn) + 1) } } analyzeAggFuncArgs(tls, pAggInfo, pNC) _ = pSelect _ = pParse } func aggregateIdxEprRefToColCallback(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var pAggInfo uintptr var pCol uintptr _ = pWalker if (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo == uintptr(0) { return WRC_Continue } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AGG_COLUMN { return WRC_Continue } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AGG_FUNCTION { return WRC_Continue } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_IF_NULL_ROW { return WRC_Continue } pAggInfo = (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo pCol = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol + uintptr((*Expr)(unsafe.Pointer(pExpr)).FiAgg)*24 (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_AGG_COLUMN) (*Expr)(unsafe.Pointer(pExpr)).FiTable = (*AggInfo_col)(unsafe.Pointer(pCol)).FiTable (*Expr)(unsafe.Pointer(pExpr)).FiColumn = (*AggInfo_col)(unsafe.Pointer(pCol)).FiColumn return WRC_Prune } func aggregateConvertIndexedExprRefToColumn(tls *libc.TLS, pAggInfo uintptr) { bp := tls.Alloc(48) defer tls.Free(48) var i int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{aggregateIdxEprRefToColCallback})) for i = 0; i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc; i++ { Xsqlite3WalkExpr(tls, bp, (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc+uintptr(i)*24)).FpFExpr) } } func assignAggregateRegisters(tls *libc.TLS, pParse uintptr, pAggInfo uintptr) { (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn + (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc } func resetAccumulator(tls *libc.TLS, pParse uintptr, pAggInfo uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var i int32 var pFunc uintptr var nReg int32 = (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc + (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn if nReg == 0 { return } if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } Xsqlite3VdbeAddOp3(tls, v, OP_Null, 0, (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg, (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg+nReg-1) pFunc = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc i = 0 __1: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc) { goto __3 } { if (*AggInfo_func)(unsafe.Pointer(pFunc)).FiDistinct >= 0 { var pE uintptr = (*AggInfo_func)(unsafe.Pointer(pFunc)).FpFExpr if *(*uintptr)(unsafe.Pointer(pE + 32)) == uintptr(0) || (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pE + 32)))).FnExpr != 1 { Xsqlite3ErrorMsg(tls, pParse, ts+20974, 0) (*AggInfo_func)(unsafe.Pointer(pFunc)).FiDistinct = -1 } else { var pKeyInfo uintptr = Xsqlite3KeyInfoFromExprList(tls, pParse, *(*uintptr)(unsafe.Pointer(pE + 32)), 0, 0) (*AggInfo_func)(unsafe.Pointer(pFunc)).FiDistAddr = Xsqlite3VdbeAddOp4(tls, v, OP_OpenEphemeral, (*AggInfo_func)(unsafe.Pointer(pFunc)).FiDistinct, 0, 0, pKeyInfo, -8) Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+21025, libc.VaList(bp, (*FuncDef)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer(pFunc)).FpFunc)).FzName)) } } } goto __2 __2: i++ pFunc += 24 goto __1 goto __3 __3: } func finalizeAggFunctions(tls *libc.TLS, pParse uintptr, pAggInfo uintptr) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var i int32 var pF uintptr i = 0 pF = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc __1: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc) { goto __3 } { var pList uintptr pList = *(*uintptr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer(pF)).FpFExpr + 32)) Xsqlite3VdbeAddOp2(tls, v, OP_AggFinal, func() int32 { return (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg + (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn + i }(), func() int32 { if pList != 0 { return (*ExprList)(unsafe.Pointer(pList)).FnExpr } return 0 }()) Xsqlite3VdbeAppendP4(tls, v, (*AggInfo_func)(unsafe.Pointer(pF)).FpFunc, -7) } goto __2 __2: i++ pF += 24 goto __1 goto __3 __3: } func updateAccumulator(tls *libc.TLS, pParse uintptr, regAcc int32, pAggInfo uintptr, eDistinctType int32) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var i int32 var regHit int32 = 0 var addrHitTest int32 = 0 var pF uintptr var pC uintptr if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return } (*AggInfo)(unsafe.Pointer(pAggInfo)).FdirectMode = U8(1) i = 0 pF = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc __1: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc) { goto __3 } { var nArg int32 var addrNext int32 = 0 var regAgg int32 var pList uintptr pList = *(*uintptr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer(pF)).FpFExpr + 32)) if (*Expr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer(pF)).FpFExpr)).Fflags&U32(EP_WinFunc) != U32(0) { var pFilter uintptr = (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer(pF)).FpFExpr + 64)))).FpFilter if (*AggInfo)(unsafe.Pointer(pAggInfo)).FnAccumulator != 0 && (*FuncDef)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer(pF)).FpFunc)).FfuncFlags&U32(SQLITE_FUNC_NEEDCOLL) != 0 && regAcc != 0 { if regHit == 0 { regHit = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) } Xsqlite3VdbeAddOp2(tls, v, OP_Copy, regAcc, regHit) } addrNext = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3ExprIfFalse(tls, pParse, pFilter, addrNext, SQLITE_JUMPIFNULL) } if pList != 0 { nArg = (*ExprList)(unsafe.Pointer(pList)).FnExpr regAgg = Xsqlite3GetTempRange(tls, pParse, nArg) Xsqlite3ExprCodeExprList(tls, pParse, pList, regAgg, 0, uint8(SQLITE_ECEL_DUP)) } else { nArg = 0 regAgg = 0 } if (*AggInfo_func)(unsafe.Pointer(pF)).FiDistinct >= 0 && pList != 0 { if addrNext == 0 { addrNext = Xsqlite3VdbeMakeLabel(tls, pParse) } (*AggInfo_func)(unsafe.Pointer(pF)).FiDistinct = codeDistinct(tls, pParse, eDistinctType, (*AggInfo_func)(unsafe.Pointer(pF)).FiDistinct, addrNext, pList, regAgg) } if (*FuncDef)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer(pF)).FpFunc)).FfuncFlags&U32(SQLITE_FUNC_NEEDCOLL) != 0 { var pColl uintptr = uintptr(0) var pItem uintptr var j int32 j = 0 pItem = pList + 8 __4: if !(!(pColl != 0) && j < nArg) { goto __6 } { pColl = Xsqlite3ExprCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(pItem)).FpExpr) } goto __5 __5: j++ pItem += 32 goto __4 goto __6 __6: ; if !(pColl != 0) { pColl = (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FpDfltColl } if regHit == 0 && (*AggInfo)(unsafe.Pointer(pAggInfo)).FnAccumulator != 0 { regHit = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) } Xsqlite3VdbeAddOp4(tls, v, OP_CollSeq, regHit, 0, 0, pColl, -2) } Xsqlite3VdbeAddOp3(tls, v, OP_AggStep, 0, regAgg, func() int32 { return (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg + (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn + i }()) Xsqlite3VdbeAppendP4(tls, v, (*AggInfo_func)(unsafe.Pointer(pF)).FpFunc, -7) Xsqlite3VdbeChangeP5(tls, v, uint16(U8(nArg))) Xsqlite3ReleaseTempRange(tls, pParse, regAgg, nArg) if addrNext != 0 { Xsqlite3VdbeResolveLabel(tls, v, addrNext) } } goto __2 __2: i++ pF += 24 goto __1 goto __3 __3: ; if regHit == 0 && (*AggInfo)(unsafe.Pointer(pAggInfo)).FnAccumulator != 0 { regHit = regAcc } if regHit != 0 { addrHitTest = Xsqlite3VdbeAddOp1(tls, v, OP_If, regHit) } i = 0 pC = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol __7: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnAccumulator) { goto __9 } { Xsqlite3ExprCode(tls, pParse, (*AggInfo_col)(unsafe.Pointer(pC)).FpCExpr, func() int32 { ; return (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg + i }()) } goto __8 __8: i++ pC += 24 goto __7 goto __9 __9: ; (*AggInfo)(unsafe.Pointer(pAggInfo)).FdirectMode = U8(0) if addrHitTest != 0 { Xsqlite3VdbeJumpHereOrPopInst(tls, v, addrHitTest) } } func explainSimpleCount(tls *libc.TLS, pParse uintptr, pTab uintptr, pIdx uintptr) { bp := tls.Alloc(24) defer tls.Free(24) if int32((*Parse)(unsafe.Pointer(pParse)).Fexplain) == 2 { var bCover int32 = libc.Bool32(pIdx != uintptr(0) && ((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) || !(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY))) Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+21058, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName, func() uintptr { if bCover != 0 { return ts + 21070 } return ts + 1544 }(), func() uintptr { if bCover != 0 { return (*Index)(unsafe.Pointer(pIdx)).FzName } return ts + 1544 }())) } } func havingToWhereExprCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_AND { var pS uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) if Xsqlite3ExprIsConstantOrGroupBy(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, pExpr, (*Select)(unsafe.Pointer(pS)).FpGroupBy) != 0 && libc.Bool32((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_IsFalse) == U32(EP_IsFalse)) == 0 && (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo == uintptr(0) { var db uintptr = (*Parse)(unsafe.Pointer((*Walker)(unsafe.Pointer(pWalker)).FpParse)).Fdb var pNew uintptr = Xsqlite3Expr(tls, db, TK_INTEGER, ts+9290) if pNew != 0 { var pWhere uintptr = (*Select)(unsafe.Pointer(pS)).FpWhere { var t = *(*Expr)(unsafe.Pointer(pNew)) *(*Expr)(unsafe.Pointer(pNew)) = *(*Expr)(unsafe.Pointer(pExpr)) *(*Expr)(unsafe.Pointer(pExpr)) = t } pNew = Xsqlite3ExprAnd(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, pWhere, pNew) (*Select)(unsafe.Pointer(pS)).FpWhere = pNew (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(1) } } return WRC_Prune } return WRC_Continue } func havingToWhere(tls *libc.TLS, pParse uintptr, p uintptr) { bp := tls.Alloc(48) defer tls.Free(48) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FpParse = pParse (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{havingToWhereExprCb})) *(*uintptr)(unsafe.Pointer(bp + 40)) = p Xsqlite3WalkExpr(tls, bp, (*Select)(unsafe.Pointer(p)).FpHaving) } func isSelfJoinView(tls *libc.TLS, pTabList uintptr, pThis uintptr, iFirst int32, iEnd int32) uintptr { var pItem uintptr if (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pThis)).FpSelect)).FselFlags&U32(SF_PushDown) != 0 { return uintptr(0) } for iFirst < iEnd { var pS1 uintptr pItem = pTabList + 8 + uintptr(libc.PostIncInt32(&iFirst, 1))*104 if (*SrcItem)(unsafe.Pointer(pItem)).FpSelect == uintptr(0) { continue } if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x20>>5)) != 0 { continue } if (*SrcItem)(unsafe.Pointer(pItem)).FzName == uintptr(0) { continue } if (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpTab)).FpSchema != (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pThis)).FpTab)).FpSchema { continue } if Xsqlite3_stricmp(tls, (*SrcItem)(unsafe.Pointer(pItem)).FzName, (*SrcItem)(unsafe.Pointer(pThis)).FzName) != 0 { continue } pS1 = (*SrcItem)(unsafe.Pointer(pItem)).FpSelect if (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpTab)).FpSchema == uintptr(0) && (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pThis)).FpSelect)).FselId != (*Select)(unsafe.Pointer(pS1)).FselId { continue } if (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpSelect)).FselFlags&U32(SF_PushDown) != 0 { continue } return pItem } return uintptr(0) } func agginfoFree(tls *libc.TLS, db uintptr, p uintptr) { Xsqlite3DbFree(tls, db, (*AggInfo)(unsafe.Pointer(p)).FaCol) Xsqlite3DbFree(tls, db, (*AggInfo)(unsafe.Pointer(p)).FaFunc) Xsqlite3DbFreeNN(tls, db, p) } func sameSrcAlias(tls *libc.TLS, p0 uintptr, pSrc uintptr) int32 { var i int32 for i = 0; i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc; i++ { var p1 uintptr = pSrc + 8 + uintptr(i)*104 if p1 == p0 { continue } if (*SrcItem)(unsafe.Pointer(p0)).FpTab == (*SrcItem)(unsafe.Pointer(p1)).FpTab && 0 == Xsqlite3_stricmp(tls, (*SrcItem)(unsafe.Pointer(p0)).FzAlias, (*SrcItem)(unsafe.Pointer(p1)).FzAlias) { return 1 } if (*SrcItem)(unsafe.Pointer(p1)).FpSelect != 0 && (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(p1)).FpSelect)).FselFlags&U32(SF_NestedFrom) != U32(0) && sameSrcAlias(tls, p0, (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(p1)).FpSelect)).FpSrc) != 0 { return 1 } } return 0 } func fromClauseTermCanBeCoroutine(tls *libc.TLS, pParse uintptr, pTabList uintptr, i int32, selFlags int32) int32 { var pItem uintptr = pTabList + 8 + uintptr(i)*104 if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x100>>8)) != 0 { var pCteUse uintptr = *(*uintptr)(unsafe.Pointer(pItem + 96)) if int32((*CteUse)(unsafe.Pointer(pCteUse)).FeM10d) == M10d_Yes { return 0 } if (*CteUse)(unsafe.Pointer(pCteUse)).FnUse >= 2 && int32((*CteUse)(unsafe.Pointer(pCteUse)).FeM10d) != M10d_No { return 0 } } if int32((*SrcItem)(unsafe.Pointer(pTabList+8)).Ffg.Fjointype)&JT_LTORJ != 0 { return 0 } if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FdbOptFlags&U32(SQLITE_Coroutines) != U32(0) { return 0 } if isSelfJoinView(tls, pTabList, pItem, i+1, (*SrcList)(unsafe.Pointer(pTabList)).FnSrc) != uintptr(0) { return 0 } if i == 0 { if (*SrcList)(unsafe.Pointer(pTabList)).FnSrc == 1 { return 1 } if int32((*SrcItem)(unsafe.Pointer(pTabList+8+1*104)).Ffg.Fjointype)&JT_CROSS != 0 { return 1 } if selFlags&SF_UpdateFrom != 0 { return 0 } return 1 } if selFlags&SF_UpdateFrom != 0 { return 0 } for 1 != 0 { if int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&(JT_OUTER|JT_CROSS) != 0 { return 0 } if i == 0 { break } i-- pItem -= 104 if (*SrcItem)(unsafe.Pointer(pItem)).FpSelect != uintptr(0) { return 0 } } return 1 } // Generate code for the SELECT statement given in the p argument. // // The results are returned according to the SelectDest structure. // See comments in sqliteInt.h for further information. // // This routine returns the number of errors. If any errors are // encountered, then an appropriate error message is left in // pParse->zErrMsg. // // This routine does NOT free the Select structure passed in. The // calling function needs to do that. func Xsqlite3Select(tls *libc.TLS, pParse uintptr, p uintptr, pDest uintptr) int32 { bp := tls.Alloc(216) defer tls.Free(216) var i int32 var j int32 var pWInfo uintptr var v uintptr var isAgg int32 var pEList uintptr var pTabList uintptr var pWhere uintptr var pGroupBy uintptr var pHaving uintptr var pAggInfo uintptr var rc int32 var iEnd int32 var db uintptr var minMaxFlag U8 var p0 uintptr var pItem uintptr var pSub uintptr var pTab uintptr var addrTop int32 var pCteUse uintptr var pCteUse1 uintptr var topAddr int32 var onceAddr int32 var pItem1 uintptr var pPrior uintptr var pSub1 uintptr var zSavedAuthContext uintptr var pKeyInfo uintptr var ii int32 var addrGosub int32 var iCont int32 var iBreak int32 var regGosub int32 var wctrlFlags U16 var pWin uintptr var sortFlags U8 var ii1 int32 var k int32 var pItem2 uintptr var pExpr uintptr var pCol uintptr var regBase int32 var regRecord int32 var nCol int32 var nGroupBy int32 var pF uintptr var pKeyInfo1 uintptr var addr1 int32 var addrOutputRow int32 var regOutputRow int32 var addrSetAbort int32 var addrTopOfLoop int32 var addrSortingIdx int32 var addrReset int32 var regReset int32 var pDistinct uintptr var distFlag U16 var eDist int32 var iDb int32 var iCsr int32 var pIdx uintptr var pKeyInfo2 uintptr var pBest uintptr var iRoot Pgno var pF1 uintptr var regAcc int32 var pDistinct1 uintptr var distFlag1 U16 var eDist1 int32 var pTab1 uintptr var iAMem int32 var iBMem int32 var iUseFlag int32 var iAbortFlag int32 var groupBySort int32 var addrEnd int32 var sortPTab int32 var sortOut int32 var orderByGrp int32 pEList = uintptr(0) pAggInfo = uintptr(0) rc = 1 *(*uintptr)(unsafe.Pointer(bp + 208)) = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb v = Xsqlite3GetVdbe(tls, pParse) if !(p == uintptr(0) || (*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __1 } return 1 __1: ; if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_SELECT, uintptr(0), uintptr(0), uintptr(0)) != 0) { goto __2 } return 1 __2: ; if !(int32((*SelectDest)(unsafe.Pointer(pDest)).FeDest) <= SRT_DistQueue) { goto __3 } if !((*Select)(unsafe.Pointer(p)).FpOrderBy != 0) { goto __4 } Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3ExprListDelete})), (*Select)(unsafe.Pointer(p)).FpOrderBy) (*Select)(unsafe.Pointer(p)).FpOrderBy = uintptr(0) __4: ; *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_Distinct)) *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_NoopOrderBy) __3: ; Xsqlite3SelectPrep(tls, pParse, p, uintptr(0)) if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __5 } goto select_end __5: ; if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_UFSrcCheck) != 0) { goto __6 } p0 = (*Select)(unsafe.Pointer(p)).FpSrc + 8 if !(sameSrcAlias(tls, p0, (*Select)(unsafe.Pointer(p)).FpSrc) != 0) { goto __7 } Xsqlite3ErrorMsg(tls, pParse, ts+21093, libc.VaList(bp, func() uintptr { if (*SrcItem)(unsafe.Pointer(p0)).FzAlias != 0 { return (*SrcItem)(unsafe.Pointer(p0)).FzAlias } return (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(p0)).FpTab)).FzName }())) goto select_end __7: ; *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_UFSrcCheck)) __6: ; if !(int32((*SelectDest)(unsafe.Pointer(pDest)).FeDest) == SRT_Output) { goto __8 } Xsqlite3GenerateColumnNames(tls, pParse, p) __8: ; if !(Xsqlite3WindowRewrite(tls, pParse, p) != 0) { goto __9 } goto select_end __9: ; pTabList = (*Select)(unsafe.Pointer(p)).FpSrc isAgg = libc.Bool32((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Aggregate) != U32(0)) libc.Xmemset(tls, bp+48, 0, uint64(unsafe.Sizeof(SortCtx{}))) (*SortCtx)(unsafe.Pointer(bp + 48)).FpOrderBy = (*Select)(unsafe.Pointer(p)).FpOrderBy i = 0 __10: if !(!(int32((*Select)(unsafe.Pointer(p)).FpPrior) != 0) && i < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc) { goto __12 } pItem = pTabList + 8 + uintptr(i)*104 pSub = (*SrcItem)(unsafe.Pointer(pItem)).FpSelect pTab = (*SrcItem)(unsafe.Pointer(pItem)).FpTab if !(int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&(JT_LEFT|JT_RIGHT) == JT_LEFT && Xsqlite3ExprImpliesNonNullRow(tls, (*Select)(unsafe.Pointer(p)).FpWhere, (*SrcItem)(unsafe.Pointer(pItem)).FiCursor) != 0 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_SimplifyJoin) == U32(0)) { goto __13 } *(*U8)(unsafe.Pointer(pItem + 60)) &= libc.Uint8FromInt32(libc.CplInt32(JT_LEFT | JT_OUTER)) unsetJoinExpr(tls, (*Select)(unsafe.Pointer(p)).FpWhere, (*SrcItem)(unsafe.Pointer(pItem)).FiCursor, int32((*SrcItem)(unsafe.Pointer(pTabList+8)).Ffg.Fjointype)&JT_LTORJ) __13: ; if !(pSub == uintptr(0)) { goto __14 } goto __11 __14: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FnCol) != (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSub)).FpEList)).FnExpr) { goto __15 } Xsqlite3ErrorMsg(tls, pParse, ts+21147, libc.VaList(bp+8, int32((*Table)(unsafe.Pointer(pTab)).FnCol), (*Table)(unsafe.Pointer(pTab)).FzName, (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(pSub)).FpEList)).FnExpr)) goto select_end __15: ; if !((*Select)(unsafe.Pointer(pSub)).FselFlags&U32(SF_Aggregate) != U32(0)) { goto __16 } goto __11 __16: ; if !((*Select)(unsafe.Pointer(pSub)).FpOrderBy != uintptr(0) && ((*Select)(unsafe.Pointer(p)).FpOrderBy != uintptr(0) || (*SrcList)(unsafe.Pointer(pTabList)).FnSrc > 1) && (*Select)(unsafe.Pointer(pSub)).FpLimit == uintptr(0) && (*Select)(unsafe.Pointer(pSub)).FselFlags&U32(SF_OrderByReqd) == U32(0) && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_OrderByReqd) == U32(0) && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_OmitOrderBy) == U32(0)) { goto __17 } Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3ExprListDelete})), (*Select)(unsafe.Pointer(pSub)).FpOrderBy) (*Select)(unsafe.Pointer(pSub)).FpOrderBy = uintptr(0) __17: ; if !((*Select)(unsafe.Pointer(pSub)).FpOrderBy != uintptr(0) && i == 0 && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_ComplexResult) != U32(0) && ((*SrcList)(unsafe.Pointer(pTabList)).FnSrc == 1 || int32((*SrcItem)(unsafe.Pointer(pTabList+8+1*104)).Ffg.Fjointype)&(JT_OUTER|JT_CROSS) != 0)) { goto __18 } goto __11 __18: ; if !(flattenSubquery(tls, pParse, p, i, isAgg) != 0) { goto __19 } if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __20 } goto select_end __20: ; i = -1 __19: ; pTabList = (*Select)(unsafe.Pointer(p)).FpSrc if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __21 } goto select_end __21: ; if !!(int32((*SelectDest)(unsafe.Pointer(pDest)).FeDest) <= SRT_Fifo) { goto __22 } (*SortCtx)(unsafe.Pointer(bp + 48)).FpOrderBy = (*Select)(unsafe.Pointer(p)).FpOrderBy __22: ; goto __11 __11: i++ goto __10 goto __12 __12: ; if !((*Select)(unsafe.Pointer(p)).FpPrior != 0) { goto __23 } rc = multiSelect(tls, pParse, p, pDest) if !((*Select)(unsafe.Pointer(p)).FpNext == uintptr(0)) { goto __24 } Xsqlite3VdbeExplainPop(tls, pParse) __24: ; return rc __23: ; if !((*Select)(unsafe.Pointer(p)).FpWhere != uintptr(0) && int32((*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpWhere)).Fop) == TK_AND && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_PropagateConst) == U32(0) && propagateConstants(tls, pParse, p) != 0) { goto __25 } goto __26 __25: ; __26: ; i = 0 __27: if !(i < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc) { goto __29 } pItem1 = pTabList + 8 + uintptr(i)*104 if !((*SrcItem)(unsafe.Pointer(pItem1)).FcolUsed == uint64(0) && (*SrcItem)(unsafe.Pointer(pItem1)).FzName != uintptr(0)) { goto __30 } Xsqlite3AuthCheck(tls, pParse, SQLITE_READ, (*SrcItem)(unsafe.Pointer(pItem1)).FzName, ts+1544, (*SrcItem)(unsafe.Pointer(pItem1)).FzDatabase) __30: ; pSub1 = (*SrcItem)(unsafe.Pointer(pItem1)).FpSelect if !(pSub1 == uintptr(0)) { goto __31 } goto __28 __31: ; *(*int32)(unsafe.Pointer(pParse + 316)) += Xsqlite3SelectExprHeight(tls, p) if !((*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_PushDown) == U32(0) && (int32(*(*uint16)(unsafe.Pointer(pItem1 + 60 + 4))&0x100>>8) == 0 || int32((*CteUse)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pItem1 + 96)))).FeM10d) != M10d_Yes && (*CteUse)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pItem1 + 96)))).FnUse < 2) && pushDownWhereTerms(tls, pParse, pSub1, (*Select)(unsafe.Pointer(p)).FpWhere, pItem1) != 0) { goto __32 } goto __33 __32: ; __33: ; zSavedAuthContext = (*Parse)(unsafe.Pointer(pParse)).FzAuthContext (*Parse)(unsafe.Pointer(pParse)).FzAuthContext = (*SrcItem)(unsafe.Pointer(pItem1)).FzName if !(fromClauseTermCanBeCoroutine(tls, pParse, pTabList, i, int32((*Select)(unsafe.Pointer(p)).FselFlags)) != 0) { goto __34 } addrTop = Xsqlite3VdbeCurrentAddr(tls, v) + 1 (*SrcItem)(unsafe.Pointer(pItem1)).FregReturn = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp3(tls, v, OP_InitCoroutine, (*SrcItem)(unsafe.Pointer(pItem1)).FregReturn, 0, addrTop) (*SrcItem)(unsafe.Pointer(pItem1)).FaddrFillSub = addrTop Xsqlite3SelectDestInit(tls, bp+96, SRT_Coroutine, (*SrcItem)(unsafe.Pointer(pItem1)).FregReturn) Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+21187, libc.VaList(bp+32, pItem1)) Xsqlite3Select(tls, pParse, pSub1, bp+96) (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem1)).FpTab)).FnRowLogEst = (*Select)(unsafe.Pointer(pSub1)).FnSelectRow libc.SetBitFieldPtr16Uint32(pItem1+60+4, uint32(1), 5, 0x20) (*SrcItem)(unsafe.Pointer(pItem1)).FregResult = (*SelectDest)(unsafe.Pointer(bp + 96)).FiSdst Xsqlite3VdbeEndCoroutine(tls, v, (*SrcItem)(unsafe.Pointer(pItem1)).FregReturn) Xsqlite3VdbeJumpHere(tls, v, addrTop-1) Xsqlite3ClearTempRegCache(tls, pParse) goto __35 __34: if !(uint32(int32(*(*uint16)(unsafe.Pointer(pItem1 + 60 + 4))&0x100>>8)) != 0 && (*CteUse)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pItem1 + 96)))).FaddrM9e > 0) { goto __36 } pCteUse = *(*uintptr)(unsafe.Pointer(pItem1 + 96)) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*CteUse)(unsafe.Pointer(pCteUse)).FregRtn, (*CteUse)(unsafe.Pointer(pCteUse)).FaddrM9e) if !((*SrcItem)(unsafe.Pointer(pItem1)).FiCursor != (*CteUse)(unsafe.Pointer(pCteUse)).FiCur) { goto __38 } Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*SrcItem)(unsafe.Pointer(pItem1)).FiCursor, (*CteUse)(unsafe.Pointer(pCteUse)).FiCur) __38: ; (*Select)(unsafe.Pointer(pSub1)).FnSelectRow = (*CteUse)(unsafe.Pointer(pCteUse)).FnRowEst goto __37 __36: if !(libc.AssignUintptr(&pPrior, isSelfJoinView(tls, pTabList, pItem1, 0, i)) != uintptr(0)) { goto __39 } if !((*SrcItem)(unsafe.Pointer(pPrior)).FaddrFillSub != 0) { goto __41 } Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*SrcItem)(unsafe.Pointer(pPrior)).FregReturn, (*SrcItem)(unsafe.Pointer(pPrior)).FaddrFillSub) __41: ; Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*SrcItem)(unsafe.Pointer(pItem1)).FiCursor, (*SrcItem)(unsafe.Pointer(pPrior)).FiCursor) (*Select)(unsafe.Pointer(pSub1)).FnSelectRow = (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pPrior)).FpSelect)).FnSelectRow goto __40 __39: onceAddr = 0 (*SrcItem)(unsafe.Pointer(pItem1)).FregReturn = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) topAddr = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) (*SrcItem)(unsafe.Pointer(pItem1)).FaddrFillSub = topAddr + 1 libc.SetBitFieldPtr16Uint32(pItem1+60+4, uint32(1), 4, 0x10) if !(int32(*(*uint16)(unsafe.Pointer(pItem1 + 60 + 4))&0x8>>3) == 0) { goto __42 } onceAddr = Xsqlite3VdbeAddOp0(tls, v, OP_Once) goto __43 __42: ; __43: ; Xsqlite3SelectDestInit(tls, bp+96, SRT_EphemTab, (*SrcItem)(unsafe.Pointer(pItem1)).FiCursor) Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+21202, libc.VaList(bp+40, pItem1)) Xsqlite3Select(tls, pParse, pSub1, bp+96) (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem1)).FpTab)).FnRowLogEst = (*Select)(unsafe.Pointer(pSub1)).FnSelectRow if !(onceAddr != 0) { goto __44 } Xsqlite3VdbeJumpHere(tls, v, onceAddr) __44: ; Xsqlite3VdbeAddOp2(tls, v, OP_Return, (*SrcItem)(unsafe.Pointer(pItem1)).FregReturn, topAddr+1) Xsqlite3VdbeJumpHere(tls, v, topAddr) Xsqlite3ClearTempRegCache(tls, pParse) if !(uint32(int32(*(*uint16)(unsafe.Pointer(pItem1 + 60 + 4))&0x100>>8)) != 0 && int32(*(*uint16)(unsafe.Pointer(pItem1 + 60 + 4))&0x8>>3) == 0) { goto __45 } pCteUse1 = *(*uintptr)(unsafe.Pointer(pItem1 + 96)) (*CteUse)(unsafe.Pointer(pCteUse1)).FaddrM9e = (*SrcItem)(unsafe.Pointer(pItem1)).FaddrFillSub (*CteUse)(unsafe.Pointer(pCteUse1)).FregRtn = (*SrcItem)(unsafe.Pointer(pItem1)).FregReturn (*CteUse)(unsafe.Pointer(pCteUse1)).FiCur = (*SrcItem)(unsafe.Pointer(pItem1)).FiCursor (*CteUse)(unsafe.Pointer(pCteUse1)).FnRowEst = (*Select)(unsafe.Pointer(pSub1)).FnSelectRow __45: ; __40: ; __37: ; __35: ; if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __46 } goto select_end __46: ; *(*int32)(unsafe.Pointer(pParse + 316)) -= Xsqlite3SelectExprHeight(tls, p) (*Parse)(unsafe.Pointer(pParse)).FzAuthContext = zSavedAuthContext goto __28 __28: i++ goto __27 goto __29 __29: ; pEList = (*Select)(unsafe.Pointer(p)).FpEList pWhere = (*Select)(unsafe.Pointer(p)).FpWhere pGroupBy = (*Select)(unsafe.Pointer(p)).FpGroupBy pHaving = (*Select)(unsafe.Pointer(p)).FpHaving (*DistinctCtx)(unsafe.Pointer(bp + 136)).FisTnct = U8(libc.Bool32((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct) != U32(0))) if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct|SF_Aggregate) == U32(SF_Distinct) && Xsqlite3ExprListCompare(tls, (*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy, pEList, -1) == 0 && (*Select)(unsafe.Pointer(p)).FpWin == uintptr(0)) { goto __47 } *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_Distinct)) pGroupBy = libc.AssignPtrUintptr(p+56, Xsqlite3ExprListDup(tls, db, pEList, 0)) *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_Aggregate) (*DistinctCtx)(unsafe.Pointer(bp + 136)).FisTnct = U8(2) __47: ; if !((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy != 0) { goto __48 } pKeyInfo = Xsqlite3KeyInfoFromExprList(tls, pParse, (*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy, 0, (*ExprList)(unsafe.Pointer(pEList)).FnExpr) (*SortCtx)(unsafe.Pointer(bp + 48)).FiECursor = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) (*SortCtx)(unsafe.Pointer(bp + 48)).FaddrSortIndex = Xsqlite3VdbeAddOp4(tls, v, OP_OpenEphemeral, (*SortCtx)(unsafe.Pointer(bp+48)).FiECursor, (*ExprList)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy)).FnExpr+1+(*ExprList)(unsafe.Pointer(pEList)).FnExpr, 0, pKeyInfo, -8) goto __49 __48: (*SortCtx)(unsafe.Pointer(bp + 48)).FaddrSortIndex = -1 __49: ; if !(int32((*SelectDest)(unsafe.Pointer(pDest)).FeDest) == SRT_EphemTab) { goto __50 } Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, (*SelectDest)(unsafe.Pointer(pDest)).FiSDParm, (*ExprList)(unsafe.Pointer(pEList)).FnExpr) if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_NestedFrom) != 0) { goto __51 } ii = (*ExprList)(unsafe.Pointer(pEList)).FnExpr - 1 __52: if !(ii > 0 && int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(ii)*32 + 16 + 4))&0x40>>6) == 0) { goto __54 } Xsqlite3ExprDelete(tls, db, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(ii)*32)).FpExpr) Xsqlite3DbFree(tls, db, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(ii)*32)).FzEName) (*ExprList)(unsafe.Pointer(pEList)).FnExpr-- goto __53 __53: ii-- goto __52 goto __54 __54: ; ii = 0 __55: if !(ii < (*ExprList)(unsafe.Pointer(pEList)).FnExpr) { goto __57 } if !(int32(*(*uint16)(unsafe.Pointer(pEList + 8 + uintptr(ii)*32 + 16 + 4))&0x40>>6) == 0) { goto __58 } (*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pEList + 8 + uintptr(ii)*32)).FpExpr)).Fop = U8(TK_NULL) __58: ; goto __56 __56: ii++ goto __55 goto __57 __57: ; __51: ; __50: ; iEnd = Xsqlite3VdbeMakeLabel(tls, pParse) if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_FixedLimit) == U32(0)) { goto __59 } (*Select)(unsafe.Pointer(p)).FnSelectRow = int16(320) __59: ; if !((*Select)(unsafe.Pointer(p)).FpLimit != 0) { goto __60 } computeLimitRegisters(tls, pParse, p, iEnd) __60: ; if !((*Select)(unsafe.Pointer(p)).FiLimit == 0 && (*SortCtx)(unsafe.Pointer(bp+48)).FaddrSortIndex >= 0) { goto __61 } Xsqlite3VdbeChangeOpcode(tls, v, (*SortCtx)(unsafe.Pointer(bp+48)).FaddrSortIndex, uint8(OP_SorterOpen)) *(*U8)(unsafe.Pointer(bp + 48 + 36)) |= U8(SORTFLAG_UseSorter) __61: ; if !((*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct) != 0) { goto __62 } (*DistinctCtx)(unsafe.Pointer(bp + 136)).FtabTnct = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) (*DistinctCtx)(unsafe.Pointer(bp + 136)).FaddrTnct = Xsqlite3VdbeAddOp4(tls, v, OP_OpenEphemeral, (*DistinctCtx)(unsafe.Pointer(bp+136)).FtabTnct, 0, 0, Xsqlite3KeyInfoFromExprList(tls, pParse, (*Select)(unsafe.Pointer(p)).FpEList, 0, 0), -8) Xsqlite3VdbeChangeP5(tls, v, uint16(BTREE_UNORDERED)) (*DistinctCtx)(unsafe.Pointer(bp + 136)).FeTnctType = U8(WHERE_DISTINCT_UNORDERED) goto __63 __62: (*DistinctCtx)(unsafe.Pointer(bp + 136)).FeTnctType = U8(WHERE_DISTINCT_NOOP) __63: ; if !(!(isAgg != 0) && pGroupBy == uintptr(0)) { goto __64 } wctrlFlags = U16(func() uint32 { if (*DistinctCtx)(unsafe.Pointer(bp+136)).FisTnct != 0 { return uint32(WHERE_WANT_DISTINCT) } return uint32(0) }() | (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_FixedLimit)) pWin = (*Select)(unsafe.Pointer(p)).FpWin if !(pWin != 0) { goto __66 } Xsqlite3WindowCodeInit(tls, pParse, p) __66: ; pWInfo = Xsqlite3WhereBegin(tls, pParse, pTabList, pWhere, (*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy, (*Select)(unsafe.Pointer(p)).FpEList, p, wctrlFlags, int32((*Select)(unsafe.Pointer(p)).FnSelectRow)) if !(pWInfo == uintptr(0)) { goto __67 } goto select_end __67: ; if !(int32(Xsqlite3WhereOutputRowCount(tls, pWInfo)) < int32((*Select)(unsafe.Pointer(p)).FnSelectRow)) { goto __68 } (*Select)(unsafe.Pointer(p)).FnSelectRow = Xsqlite3WhereOutputRowCount(tls, pWInfo) __68: ; if !((*DistinctCtx)(unsafe.Pointer(bp+136)).FisTnct != 0 && Xsqlite3WhereIsDistinct(tls, pWInfo) != 0) { goto __69 } (*DistinctCtx)(unsafe.Pointer(bp + 136)).FeTnctType = U8(Xsqlite3WhereIsDistinct(tls, pWInfo)) __69: ; if !((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy != 0) { goto __70 } (*SortCtx)(unsafe.Pointer(bp + 48)).FnOBSat = Xsqlite3WhereIsOrdered(tls, pWInfo) (*SortCtx)(unsafe.Pointer(bp + 48)).FlabelOBLopt = Xsqlite3WhereOrderByLimitOptLabel(tls, pWInfo) if !((*SortCtx)(unsafe.Pointer(bp+48)).FnOBSat == (*ExprList)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy)).FnExpr) { goto __71 } (*SortCtx)(unsafe.Pointer(bp + 48)).FpOrderBy = uintptr(0) __71: ; __70: ; if !((*SortCtx)(unsafe.Pointer(bp+48)).FaddrSortIndex >= 0 && (*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy == uintptr(0)) { goto __72 } Xsqlite3VdbeChangeToNoop(tls, v, (*SortCtx)(unsafe.Pointer(bp+48)).FaddrSortIndex) __72: ; if !(pWin != 0) { goto __73 } addrGosub = Xsqlite3VdbeMakeLabel(tls, pParse) iCont = Xsqlite3VdbeMakeLabel(tls, pParse) iBreak = Xsqlite3VdbeMakeLabel(tls, pParse) regGosub = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3WindowCodeStep(tls, pParse, p, pWInfo, regGosub, addrGosub) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, iBreak) Xsqlite3VdbeResolveLabel(tls, v, addrGosub) (*SortCtx)(unsafe.Pointer(bp + 48)).FlabelOBLopt = 0 selectInnerLoop(tls, pParse, p, -1, bp+48, bp+136, pDest, iCont, iBreak) Xsqlite3VdbeResolveLabel(tls, v, iCont) Xsqlite3VdbeAddOp1(tls, v, OP_Return, regGosub) Xsqlite3VdbeResolveLabel(tls, v, iBreak) goto __74 __73: selectInnerLoop(tls, pParse, p, -1, bp+48, bp+136, pDest, Xsqlite3WhereContinueLabel(tls, pWInfo), Xsqlite3WhereBreakLabel(tls, pWInfo)) Xsqlite3WhereEnd(tls, pWInfo) __74: ; goto __65 __64: sortPTab = 0 sortOut = 0 orderByGrp = 0 if !(pGroupBy != 0) { goto __75 } k = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpEList)).FnExpr pItem2 = (*Select)(unsafe.Pointer(p)).FpEList + 8 __77: if !(k > 0) { goto __79 } *(*U16)(unsafe.Pointer(pItem2 + 24 + 2)) = U16(0) goto __78 __78: k-- pItem2 += 32 goto __77 goto __79 __79: ; k = (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr pItem2 = pGroupBy + 8 __80: if !(k > 0) { goto __82 } *(*U16)(unsafe.Pointer(pItem2 + 24 + 2)) = U16(0) goto __81 __81: k-- pItem2 += 32 goto __80 goto __82 __82: ; if !(int32((*Select)(unsafe.Pointer(p)).FnSelectRow) > 66) { goto __83 } (*Select)(unsafe.Pointer(p)).FnSelectRow = int16(66) __83: ; if !((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy != 0 && (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr == (*ExprList)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy)).FnExpr) { goto __84 } ii1 = 0 __85: if !(ii1 < (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr) { goto __87 } sortFlags = U8(int32((*ExprList_item)(unsafe.Pointer((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy+8+uintptr(ii1)*32)).Ffg.FsortFlags) & KEYINFO_ORDER_DESC) (*ExprList_item)(unsafe.Pointer(pGroupBy + 8 + uintptr(ii1)*32)).Ffg.FsortFlags = sortFlags goto __86 __86: ii1++ goto __85 goto __87 __87: ; if !(Xsqlite3ExprListCompare(tls, pGroupBy, (*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy, -1) == 0) { goto __88 } orderByGrp = 1 __88: ; __84: ; goto __76 __75: ; (*Select)(unsafe.Pointer(p)).FnSelectRow = int16(0) __76: ; addrEnd = Xsqlite3VdbeMakeLabel(tls, pParse) pAggInfo = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(AggInfo{}))) if !(pAggInfo != 0) { goto __89 } Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{agginfoFree})), pAggInfo) __89: ; if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __90 } goto select_end __90: ; (*AggInfo)(unsafe.Pointer(pAggInfo)).FselId = (*Select)(unsafe.Pointer(p)).FselId libc.Xmemset(tls, bp+152, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 152)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp + 152)).FpSrcList = pTabList *(*uintptr)(unsafe.Pointer(bp + 152 + 16)) = pAggInfo (*AggInfo)(unsafe.Pointer(pAggInfo)).FnSortingColumn = func() uint16 { if pGroupBy != 0 { return uint16((*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr) } return uint16(0) }() (*AggInfo)(unsafe.Pointer(pAggInfo)).FpGroupBy = pGroupBy Xsqlite3ExprAnalyzeAggList(tls, bp+152, pEList) Xsqlite3ExprAnalyzeAggList(tls, bp+152, (*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy) if !(pHaving != 0) { goto __91 } if !(pGroupBy != 0) { goto __92 } havingToWhere(tls, pParse, p) pWhere = (*Select)(unsafe.Pointer(p)).FpWhere __92: ; Xsqlite3ExprAnalyzeAggregates(tls, bp+152, pHaving) __91: ; (*AggInfo)(unsafe.Pointer(pAggInfo)).FnAccumulator = (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn if !((*Select)(unsafe.Pointer(p)).FpGroupBy == uintptr(0) && (*Select)(unsafe.Pointer(p)).FpHaving == uintptr(0) && (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc == 1) { goto __93 } minMaxFlag = minMaxQuery(tls, db, (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FpFExpr, bp+208) goto __94 __93: minMaxFlag = U8(WHERE_ORDERBY_NORMAL) __94: ; analyzeAggFuncArgs(tls, pAggInfo, bp+152) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __95 } goto select_end __95: ; if !(pGroupBy != 0) { goto __96 } pDistinct = uintptr(0) distFlag = U16(0) eDist = WHERE_DISTINCT_NOOP if !((*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc == 1 && (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FiDistinct >= 0 && (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FpFExpr != uintptr(0) && (*Expr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FpFExpr)).Fflags&U32(EP_xIsSelect) == U32(0) && *(*uintptr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FpFExpr + 32)) != uintptr(0)) { goto __98 } pExpr = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FpFExpr + 32)) + 8)).FpExpr pExpr = Xsqlite3ExprDup(tls, db, pExpr, 0) pDistinct = Xsqlite3ExprListDup(tls, db, pGroupBy, 0) pDistinct = Xsqlite3ExprListAppend(tls, pParse, pDistinct, pExpr) if pDistinct != 0 { distFlag = uint16(WHERE_WANT_DISTINCT | WHERE_AGG_DISTINCT) } else { distFlag = uint16(0) } __98: ; (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdx = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) pKeyInfo1 = Xsqlite3KeyInfoFromExprList(tls, pParse, pGroupBy, 0, (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn) addrSortingIdx = Xsqlite3VdbeAddOp4(tls, v, OP_SorterOpen, (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdx, int32((*AggInfo)(unsafe.Pointer(pAggInfo)).FnSortingColumn), 0, pKeyInfo1, -8) iUseFlag = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) iAbortFlag = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regOutputRow = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) addrOutputRow = Xsqlite3VdbeMakeLabel(tls, pParse) regReset = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) addrReset = Xsqlite3VdbeMakeLabel(tls, pParse) iAMem = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr iBMem = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, iAbortFlag) Xsqlite3VdbeAddOp3(tls, v, OP_Null, 0, iAMem, iAMem+(*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr-1) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regReset, addrReset) pWInfo = Xsqlite3WhereBegin(tls, pParse, pTabList, pWhere, pGroupBy, pDistinct, p, uint16(func() int32 { if int32((*DistinctCtx)(unsafe.Pointer(bp+136)).FisTnct) == 2 { return WHERE_DISTINCTBY } return WHERE_GROUPBY }()| func() int32 { if orderByGrp != 0 { return WHERE_SORTBYGROUP } return 0 }()|int32(distFlag)), 0) if !(pWInfo == uintptr(0)) { goto __99 } Xsqlite3ExprListDelete(tls, db, pDistinct) goto select_end __99: ; if !((*Parse)(unsafe.Pointer(pParse)).FpIdxEpr != 0) { goto __100 } optimizeAggregateUseOfIndexedExpr(tls, pParse, p, pAggInfo, bp+152) __100: ; assignAggregateRegisters(tls, pParse, pAggInfo) eDist = Xsqlite3WhereIsDistinct(tls, pWInfo) if !(Xsqlite3WhereIsOrdered(tls, pWInfo) == (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr) { goto __101 } groupBySort = 0 goto __102 __101: explainTempTable(tls, pParse, func() uintptr { if (*DistinctCtx)(unsafe.Pointer(bp+136)).FisTnct != 0 && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct) == U32(0) { return ts + 21218 } return ts + 21227 }()) groupBySort = 1 nGroupBy = (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr nCol = nGroupBy j = nGroupBy i = 0 __103: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn) { goto __105 } if !(int32((*AggInfo_col)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol+uintptr(i)*24)).FiSorterColumn) >= j) { goto __106 } nCol++ j++ __106: ; goto __104 __104: i++ goto __103 goto __105 __105: ; regBase = Xsqlite3GetTempRange(tls, pParse, nCol) Xsqlite3ExprCodeExprList(tls, pParse, pGroupBy, regBase, 0, uint8(0)) j = nGroupBy (*AggInfo)(unsafe.Pointer(pAggInfo)).FdirectMode = U8(1) i = 0 __107: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn) { goto __109 } pCol = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaCol + uintptr(i)*24 if !(int32((*AggInfo_col)(unsafe.Pointer(pCol)).FiSorterColumn) >= j) { goto __110 } Xsqlite3ExprCode(tls, pParse, (*AggInfo_col)(unsafe.Pointer(pCol)).FpCExpr, j+regBase) j++ __110: ; goto __108 __108: i++ goto __107 goto __109 __109: ; (*AggInfo)(unsafe.Pointer(pAggInfo)).FdirectMode = U8(0) regRecord = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regBase, nCol, regRecord) Xsqlite3VdbeAddOp2(tls, v, OP_SorterInsert, (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdx, regRecord) Xsqlite3ReleaseTempReg(tls, pParse, regRecord) Xsqlite3ReleaseTempRange(tls, pParse, regBase, nCol) Xsqlite3WhereEnd(tls, pWInfo) (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdxPTab = libc.AssignInt32(&sortPTab, libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1)) sortOut = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_OpenPseudo, sortPTab, sortOut, nCol) Xsqlite3VdbeAddOp2(tls, v, OP_SorterSort, (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdx, addrEnd) (*AggInfo)(unsafe.Pointer(pAggInfo)).FuseSortingIdx = U8(1) __102: ; if !((*Parse)(unsafe.Pointer(pParse)).FpIdxEpr != 0) { goto __111 } aggregateConvertIndexedExprRefToColumn(tls, pAggInfo) __111: ; if !(orderByGrp != 0 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_GroupByOrder) == U32(0) && (groupBySort != 0 || Xsqlite3WhereIsSorted(tls, pWInfo) != 0)) { goto __112 } (*SortCtx)(unsafe.Pointer(bp + 48)).FpOrderBy = uintptr(0) Xsqlite3VdbeChangeToNoop(tls, v, (*SortCtx)(unsafe.Pointer(bp+48)).FaddrSortIndex) __112: ; addrTopOfLoop = Xsqlite3VdbeCurrentAddr(tls, v) if !(groupBySort != 0) { goto __113 } Xsqlite3VdbeAddOp3(tls, v, OP_SorterData, (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdx, sortOut, sortPTab) __113: ; j = 0 __114: if !(j < (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr) { goto __116 } if !(groupBySort != 0) { goto __117 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, sortPTab, j, iBMem+j) goto __118 __117: (*AggInfo)(unsafe.Pointer(pAggInfo)).FdirectMode = U8(1) Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pGroupBy+8+uintptr(j)*32)).FpExpr, iBMem+j) __118: ; goto __115 __115: j++ goto __114 goto __116 __116: ; Xsqlite3VdbeAddOp4(tls, v, OP_Compare, iAMem, iBMem, (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr, Xsqlite3KeyInfoRef(tls, pKeyInfo1), -8) addr1 = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp3(tls, v, OP_Jump, addr1+1, 0, addr1+1) Xsqlite3ExprCodeMove(tls, pParse, iBMem, iAMem, (*ExprList)(unsafe.Pointer(pGroupBy)).FnExpr) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regOutputRow, addrOutputRow) Xsqlite3VdbeAddOp2(tls, v, OP_IfPos, iAbortFlag, addrEnd) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regReset, addrReset) Xsqlite3VdbeJumpHere(tls, v, addr1) updateAccumulator(tls, pParse, iUseFlag, pAggInfo, eDist) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, iUseFlag) if !(groupBySort != 0) { goto __119 } Xsqlite3VdbeAddOp2(tls, v, OP_SorterNext, (*AggInfo)(unsafe.Pointer(pAggInfo)).FsortingIdx, addrTopOfLoop) goto __120 __119: ; Xsqlite3WhereEnd(tls, pWInfo) Xsqlite3VdbeChangeToNoop(tls, v, addrSortingIdx) __120: ; Xsqlite3ExprListDelete(tls, db, pDistinct) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regOutputRow, addrOutputRow) Xsqlite3VdbeGoto(tls, v, addrEnd) addrSetAbort = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, iAbortFlag) Xsqlite3VdbeAddOp1(tls, v, OP_Return, regOutputRow) Xsqlite3VdbeResolveLabel(tls, v, addrOutputRow) addrOutputRow = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp2(tls, v, OP_IfPos, iUseFlag, addrOutputRow+2) Xsqlite3VdbeAddOp1(tls, v, OP_Return, regOutputRow) finalizeAggFunctions(tls, pParse, pAggInfo) Xsqlite3ExprIfFalse(tls, pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL) selectInnerLoop(tls, pParse, p, -1, bp+48, bp+136, pDest, addrOutputRow+1, addrSetAbort) Xsqlite3VdbeAddOp1(tls, v, OP_Return, regOutputRow) Xsqlite3VdbeResolveLabel(tls, v, addrReset) resetAccumulator(tls, pParse, pAggInfo) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, iUseFlag) Xsqlite3VdbeAddOp1(tls, v, OP_Return, regReset) if !(int32(distFlag) != 0 && eDist != WHERE_DISTINCT_NOOP) { goto __121 } pF = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc fixDistinctOpenEph(tls, pParse, eDist, (*AggInfo_func)(unsafe.Pointer(pF)).FiDistinct, (*AggInfo_func)(unsafe.Pointer(pF)).FiDistAddr) __121: ; goto __97 __96: if !(libc.AssignUintptr(&pTab1, isSimpleCount(tls, p, pAggInfo)) != uintptr(0)) { goto __122 } iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Table)(unsafe.Pointer(pTab1)).FpSchema) iCsr = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) pKeyInfo2 = uintptr(0) pBest = uintptr(0) iRoot = (*Table)(unsafe.Pointer(pTab1)).Ftnum Xsqlite3CodeVerifySchema(tls, pParse, iDb) Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab1)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pTab1)).FzName) if !!((*Table)(unsafe.Pointer(pTab1)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __124 } pBest = Xsqlite3PrimaryKeyIndex(tls, pTab1) __124: ; if !!(int32(*(*uint16)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8 + 60 + 4))&0x1>>0) != 0) { goto __125 } pIdx = (*Table)(unsafe.Pointer(pTab1)).FpIndex __126: if !(pIdx != 0) { goto __128 } if !(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x4>>2) == 0 && int32((*Index)(unsafe.Pointer(pIdx)).FszIdxRow) < int32((*Table)(unsafe.Pointer(pTab1)).FszTabRow) && (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere == uintptr(0) && (!(pBest != 0) || int32((*Index)(unsafe.Pointer(pIdx)).FszIdxRow) < int32((*Index)(unsafe.Pointer(pBest)).FszIdxRow))) { goto __129 } pBest = pIdx __129: ; goto __127 __127: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext goto __126 goto __128 __128: ; __125: ; if !(pBest != 0) { goto __130 } iRoot = (*Index)(unsafe.Pointer(pBest)).Ftnum pKeyInfo2 = Xsqlite3KeyInfoOfIndex(tls, pParse, pBest) __130: ; Xsqlite3VdbeAddOp4Int(tls, v, OP_OpenRead, iCsr, int32(iRoot), iDb, 1) if !(pKeyInfo2 != 0) { goto __131 } Xsqlite3VdbeChangeP4(tls, v, -1, pKeyInfo2, -8) __131: ; assignAggregateRegisters(tls, pParse, pAggInfo) Xsqlite3VdbeAddOp2(tls, v, OP_Count, iCsr, func() int32 { return (*AggInfo)(unsafe.Pointer(pAggInfo)).FiFirstReg + (*AggInfo)(unsafe.Pointer(pAggInfo)).FnColumn + 0 }()) Xsqlite3VdbeAddOp1(tls, v, OP_Close, iCsr) explainSimpleCount(tls, pParse, pTab1, pBest) goto __123 __122: regAcc = 0 pDistinct1 = uintptr(0) distFlag1 = U16(0) if !((*AggInfo)(unsafe.Pointer(pAggInfo)).FnAccumulator != 0) { goto __132 } i = 0 __134: if !(i < (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc) { goto __136 } if !((*Expr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc+uintptr(i)*24)).FpFExpr)).Fflags&U32(EP_WinFunc) != U32(0)) { goto __137 } goto __135 __137: ; if !((*FuncDef)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc+uintptr(i)*24)).FpFunc)).FfuncFlags&U32(SQLITE_FUNC_NEEDCOLL) != 0) { goto __138 } goto __136 __138: ; goto __135 __135: i++ goto __134 goto __136 __136: ; if !(i == (*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc) { goto __139 } regAcc = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regAcc) __139: ; goto __133 __132: if !((*AggInfo)(unsafe.Pointer(pAggInfo)).FnFunc == 1 && (*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FiDistinct >= 0) { goto __140 } pDistinct1 = *(*uintptr)(unsafe.Pointer((*AggInfo_func)(unsafe.Pointer((*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc)).FpFExpr + 32)) if pDistinct1 != 0 { distFlag1 = uint16(WHERE_WANT_DISTINCT | WHERE_AGG_DISTINCT) } else { distFlag1 = uint16(0) } __140: ; __133: ; assignAggregateRegisters(tls, pParse, pAggInfo) resetAccumulator(tls, pParse, pAggInfo) pWInfo = Xsqlite3WhereBegin(tls, pParse, pTabList, pWhere, *(*uintptr)(unsafe.Pointer(bp + 208)), pDistinct1, p, uint16(int32(minMaxFlag)|int32(distFlag1)), 0) if !(pWInfo == uintptr(0)) { goto __141 } goto select_end __141: ; eDist1 = Xsqlite3WhereIsDistinct(tls, pWInfo) updateAccumulator(tls, pParse, regAcc, pAggInfo, eDist1) if !(eDist1 != WHERE_DISTINCT_NOOP) { goto __142 } pF1 = (*AggInfo)(unsafe.Pointer(pAggInfo)).FaFunc if !(pF1 != 0) { goto __143 } fixDistinctOpenEph(tls, pParse, eDist1, (*AggInfo_func)(unsafe.Pointer(pF1)).FiDistinct, (*AggInfo_func)(unsafe.Pointer(pF1)).FiDistAddr) __143: ; __142: ; if !(regAcc != 0) { goto __144 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, regAcc) __144: ; if !(minMaxFlag != 0) { goto __145 } Xsqlite3WhereMinMaxOptEarlyOut(tls, v, pWInfo) __145: ; Xsqlite3WhereEnd(tls, pWInfo) finalizeAggFunctions(tls, pParse, pAggInfo) __123: ; (*SortCtx)(unsafe.Pointer(bp + 48)).FpOrderBy = uintptr(0) Xsqlite3ExprIfFalse(tls, pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL) selectInnerLoop(tls, pParse, p, -1, uintptr(0), uintptr(0), pDest, addrEnd, addrEnd) __97: ; Xsqlite3VdbeResolveLabel(tls, v, addrEnd) __65: ; if !(int32((*DistinctCtx)(unsafe.Pointer(bp+136)).FeTnctType) == WHERE_DISTINCT_UNORDERED) { goto __146 } explainTempTable(tls, pParse, ts+21218) __146: ; if !((*SortCtx)(unsafe.Pointer(bp+48)).FpOrderBy != 0) { goto __147 } generateSortTail(tls, pParse, p, bp+48, (*ExprList)(unsafe.Pointer(pEList)).FnExpr, pDest) __147: ; Xsqlite3VdbeResolveLabel(tls, v, iEnd) rc = libc.Bool32((*Parse)(unsafe.Pointer(pParse)).FnErr > 0) select_end: ; Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(bp + 208))) Xsqlite3VdbeExplainPop(tls, pParse) return rc } // This structure is used to pass data from sqlite3_get_table() through // to the callback function is uses to build the result. type TabResult1 = struct { FazResult uintptr FzErrMsg uintptr FnAlloc U32 FnRow U32 FnColumn U32 FnData U32 Frc int32 F__ccgo_pad1 [4]byte } // This structure is used to pass data from sqlite3_get_table() through // to the callback function is uses to build the result. type TabResult = TabResult1 func sqlite3_get_table_cb(tls *libc.TLS, pArg uintptr, nCol int32, argv uintptr, colv uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr var need int32 var i int32 var z uintptr var azNew uintptr var n int32 p = pArg if !((*TabResult)(unsafe.Pointer(p)).FnRow == U32(0) && argv != uintptr(0)) { goto __1 } need = nCol * 2 goto __2 __1: need = nCol __2: ; if !((*TabResult)(unsafe.Pointer(p)).FnData+U32(need) > (*TabResult)(unsafe.Pointer(p)).FnAlloc) { goto __3 } (*TabResult)(unsafe.Pointer(p)).FnAlloc = (*TabResult)(unsafe.Pointer(p)).FnAlloc*U32(2) + U32(need) azNew = Xsqlite3Realloc(tls, (*TabResult)(unsafe.Pointer(p)).FazResult, uint64(unsafe.Sizeof(uintptr(0)))*uint64((*TabResult)(unsafe.Pointer(p)).FnAlloc)) if !(azNew == uintptr(0)) { goto __4 } goto malloc_failed __4: ; (*TabResult)(unsafe.Pointer(p)).FazResult = azNew __3: ; if !((*TabResult)(unsafe.Pointer(p)).FnRow == U32(0)) { goto __5 } (*TabResult)(unsafe.Pointer(p)).FnColumn = U32(nCol) i = 0 __7: if !(i < nCol) { goto __9 } z = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(colv + uintptr(i)*8)))) if !(z == uintptr(0)) { goto __10 } goto malloc_failed __10: ; *(*uintptr)(unsafe.Pointer((*TabResult)(unsafe.Pointer(p)).FazResult + uintptr(libc.PostIncUint32(&(*TabResult)(unsafe.Pointer(p)).FnData, 1))*8)) = z goto __8 __8: i++ goto __7 goto __9 __9: ; goto __6 __5: if !(int32((*TabResult)(unsafe.Pointer(p)).FnColumn) != nCol) { goto __11 } Xsqlite3_free(tls, (*TabResult)(unsafe.Pointer(p)).FzErrMsg) (*TabResult)(unsafe.Pointer(p)).FzErrMsg = Xsqlite3_mprintf(tls, ts+21236, 0) (*TabResult)(unsafe.Pointer(p)).Frc = SQLITE_ERROR return 1 __11: ; __6: ; if !(argv != uintptr(0)) { goto __12 } i = 0 __13: if !(i < nCol) { goto __15 } if !(*(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8)) == uintptr(0)) { goto __16 } z = uintptr(0) goto __17 __16: n = Xsqlite3Strlen30(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) + 1 z = Xsqlite3_malloc64(tls, uint64(n)) if !(z == uintptr(0)) { goto __18 } goto malloc_failed __18: ; libc.Xmemcpy(tls, z, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8)), uint64(n)) __17: ; *(*uintptr)(unsafe.Pointer((*TabResult)(unsafe.Pointer(p)).FazResult + uintptr(libc.PostIncUint32(&(*TabResult)(unsafe.Pointer(p)).FnData, 1))*8)) = z goto __14 __14: i++ goto __13 goto __15 __15: ; (*TabResult)(unsafe.Pointer(p)).FnRow++ __12: ; return 0 malloc_failed: (*TabResult)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM return 1 } // Query the database. But instead of invoking a callback for each row, // malloc() for space to hold the result and return the entire results // at the conclusion of the call. // // The result that is written to ***pazResult is held in memory obtained // from malloc(). But the caller cannot free this memory directly. // Instead, the entire table should be passed to sqlite3_free_table() when // the calling procedure is finished using it. func Xsqlite3_get_table(tls *libc.TLS, db uintptr, zSql uintptr, pazResult uintptr, pnRow uintptr, pnColumn uintptr, pzErrMsg uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var rc int32 *(*uintptr)(unsafe.Pointer(pazResult)) = uintptr(0) if pnColumn != 0 { *(*int32)(unsafe.Pointer(pnColumn)) = 0 } if pnRow != 0 { *(*int32)(unsafe.Pointer(pnRow)) = 0 } if pzErrMsg != 0 { *(*uintptr)(unsafe.Pointer(pzErrMsg)) = uintptr(0) } (*TabResult)(unsafe.Pointer(bp + 8)).FzErrMsg = uintptr(0) (*TabResult)(unsafe.Pointer(bp + 8)).FnRow = U32(0) (*TabResult)(unsafe.Pointer(bp + 8)).FnColumn = U32(0) (*TabResult)(unsafe.Pointer(bp + 8)).FnData = U32(1) (*TabResult)(unsafe.Pointer(bp + 8)).FnAlloc = U32(20) (*TabResult)(unsafe.Pointer(bp + 8)).Frc = SQLITE_OK (*TabResult)(unsafe.Pointer(bp + 8)).FazResult = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(uintptr(0)))*uint64((*TabResult)(unsafe.Pointer(bp+8)).FnAlloc)) if (*TabResult)(unsafe.Pointer(bp+8)).FazResult == uintptr(0) { (*Sqlite3)(unsafe.Pointer(db)).FerrCode = SQLITE_NOMEM return SQLITE_NOMEM } *(*uintptr)(unsafe.Pointer((*TabResult)(unsafe.Pointer(bp + 8)).FazResult)) = uintptr(0) rc = Xsqlite3_exec(tls, db, zSql, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 }{sqlite3_get_table_cb})), bp+8, pzErrMsg) *(*uintptr)(unsafe.Pointer((*TabResult)(unsafe.Pointer(bp + 8)).FazResult)) = uintptr(int64((*TabResult)(unsafe.Pointer(bp + 8)).FnData)) if rc&0xff == SQLITE_ABORT { Xsqlite3_free_table(tls, (*TabResult)(unsafe.Pointer(bp+8)).FazResult+1*8) if (*TabResult)(unsafe.Pointer(bp+8)).FzErrMsg != 0 { if pzErrMsg != 0 { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(pzErrMsg))) *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, (*TabResult)(unsafe.Pointer(bp+8)).FzErrMsg)) } Xsqlite3_free(tls, (*TabResult)(unsafe.Pointer(bp+8)).FzErrMsg) } (*Sqlite3)(unsafe.Pointer(db)).FerrCode = (*TabResult)(unsafe.Pointer(bp + 8)).Frc return (*TabResult)(unsafe.Pointer(bp + 8)).Frc } Xsqlite3_free(tls, (*TabResult)(unsafe.Pointer(bp+8)).FzErrMsg) if rc != SQLITE_OK { Xsqlite3_free_table(tls, (*TabResult)(unsafe.Pointer(bp+8)).FazResult+1*8) return rc } if (*TabResult)(unsafe.Pointer(bp+8)).FnAlloc > (*TabResult)(unsafe.Pointer(bp+8)).FnData { var azNew uintptr azNew = Xsqlite3Realloc(tls, (*TabResult)(unsafe.Pointer(bp+8)).FazResult, uint64(unsafe.Sizeof(uintptr(0)))*uint64((*TabResult)(unsafe.Pointer(bp+8)).FnData)) if azNew == uintptr(0) { Xsqlite3_free_table(tls, (*TabResult)(unsafe.Pointer(bp+8)).FazResult+1*8) (*Sqlite3)(unsafe.Pointer(db)).FerrCode = SQLITE_NOMEM return SQLITE_NOMEM } (*TabResult)(unsafe.Pointer(bp + 8)).FazResult = azNew } *(*uintptr)(unsafe.Pointer(pazResult)) = (*TabResult)(unsafe.Pointer(bp+8)).FazResult + 1*8 if pnColumn != 0 { *(*int32)(unsafe.Pointer(pnColumn)) = int32((*TabResult)(unsafe.Pointer(bp + 8)).FnColumn) } if pnRow != 0 { *(*int32)(unsafe.Pointer(pnRow)) = int32((*TabResult)(unsafe.Pointer(bp + 8)).FnRow) } return rc } // This routine frees the space the sqlite3_get_table() malloced. func Xsqlite3_free_table(tls *libc.TLS, azResult uintptr) { if azResult != 0 { var i int32 var n int32 azResult -= 8 n = int32(*(*uintptr)(unsafe.Pointer(azResult))) for i = 1; i < n; i++ { if *(*uintptr)(unsafe.Pointer(azResult + uintptr(i)*8)) != 0 { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(azResult + uintptr(i)*8))) } } Xsqlite3_free(tls, azResult) } } // Delete a linked list of TriggerStep structures. func Xsqlite3DeleteTriggerStep(tls *libc.TLS, db uintptr, pTriggerStep uintptr) { for pTriggerStep != 0 { var pTmp uintptr = pTriggerStep pTriggerStep = (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpNext Xsqlite3ExprDelete(tls, db, (*TriggerStep)(unsafe.Pointer(pTmp)).FpWhere) Xsqlite3ExprListDelete(tls, db, (*TriggerStep)(unsafe.Pointer(pTmp)).FpExprList) Xsqlite3SelectDelete(tls, db, (*TriggerStep)(unsafe.Pointer(pTmp)).FpSelect) Xsqlite3IdListDelete(tls, db, (*TriggerStep)(unsafe.Pointer(pTmp)).FpIdList) Xsqlite3UpsertDelete(tls, db, (*TriggerStep)(unsafe.Pointer(pTmp)).FpUpsert) Xsqlite3SrcListDelete(tls, db, (*TriggerStep)(unsafe.Pointer(pTmp)).FpFrom) Xsqlite3DbFree(tls, db, (*TriggerStep)(unsafe.Pointer(pTmp)).FzSpan) Xsqlite3DbFree(tls, db, pTmp) } } // Given table pTab, return a list of all the triggers attached to // the table. The list is connected by Trigger.pNext pointers. // // All of the triggers on pTab that are in the same database as pTab // are already attached to pTab->pTrigger. But there might be additional // triggers on pTab in the TEMP schema. This routine prepends all // TEMP triggers on pTab to the beginning of the pTab->pTrigger list // and returns the combined list. // // To state it another way: This routine returns a list of all triggers // that fire off of pTab. The list will include any TEMP triggers on // pTab as well as the triggers lised in pTab->pTrigger. func Xsqlite3TriggerList(tls *libc.TLS, pParse uintptr, pTab uintptr) uintptr { var pTmpSchema uintptr var pList uintptr var p uintptr pTmpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb + 1*32)).FpSchema p = (*Hash)(unsafe.Pointer(pTmpSchema + 56)).Ffirst pList = (*Table)(unsafe.Pointer(pTab)).FpTrigger for p != 0 { var pTrig uintptr = (*HashElem)(unsafe.Pointer(p)).Fdata if (*Trigger)(unsafe.Pointer(pTrig)).FpTabSchema == (*Table)(unsafe.Pointer(pTab)).FpSchema && (*Trigger)(unsafe.Pointer(pTrig)).Ftable != 0 && 0 == Xsqlite3StrICmp(tls, (*Trigger)(unsafe.Pointer(pTrig)).Ftable, (*Table)(unsafe.Pointer(pTab)).FzName) && ((*Trigger)(unsafe.Pointer(pTrig)).FpTabSchema != pTmpSchema || (*Trigger)(unsafe.Pointer(pTrig)).FbReturning != 0) { (*Trigger)(unsafe.Pointer(pTrig)).FpNext = pList pList = pTrig } else if int32((*Trigger)(unsafe.Pointer(pTrig)).Fop) == TK_RETURNING { (*Trigger)(unsafe.Pointer(pTrig)).Ftable = (*Table)(unsafe.Pointer(pTab)).FzName (*Trigger)(unsafe.Pointer(pTrig)).FpTabSchema = (*Table)(unsafe.Pointer(pTab)).FpSchema (*Trigger)(unsafe.Pointer(pTrig)).FpNext = pList pList = pTrig } p = (*HashElem)(unsafe.Pointer(p)).Fnext } return pList } // This is called by the parser when it sees a CREATE TRIGGER statement // up to the point of the BEGIN before the trigger actions. A Trigger // structure is generated based on the information available and stored // in pParse->pNewTrigger. After the trigger actions have been parsed, the // sqlite3FinishTrigger() function is called to complete the trigger // construction process. func Xsqlite3BeginTrigger(tls *libc.TLS, pParse uintptr, pName1 uintptr, pName2 uintptr, tr_tm int32, op int32, pColumns uintptr, pTableName uintptr, pWhen uintptr, isTemp int32, noErr int32) { bp := tls.Alloc(136) defer tls.Free(136) var pTrigger uintptr var pTab uintptr var zName uintptr var db uintptr var iDb int32 var iTabDb int32 var code int32 var zDb uintptr var zDbTrig uintptr pTrigger = uintptr(0) zName = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !(isTemp != 0) { goto __1 } if !((*Token)(unsafe.Pointer(pName2)).Fn > uint32(0)) { goto __3 } Xsqlite3ErrorMsg(tls, pParse, ts+21301, 0) goto trigger_cleanup __3: ; iDb = 1 *(*uintptr)(unsafe.Pointer(bp + 32)) = pName1 goto __2 __1: iDb = Xsqlite3TwoPartName(tls, pParse, pName1, pName2, bp+32) if !(iDb < 0) { goto __4 } goto trigger_cleanup __4: ; __2: ; if !(!(pTableName != 0) || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __5 } goto trigger_cleanup __5: ; if !((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0 && iDb != 1) { goto __6 } Xsqlite3DbFree(tls, db, (*SrcItem)(unsafe.Pointer(pTableName+8)).FzDatabase) (*SrcItem)(unsafe.Pointer(pTableName + 8)).FzDatabase = uintptr(0) __6: ; pTab = Xsqlite3SrcListLookup(tls, pParse, pTableName) if !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) == 0 && (*Token)(unsafe.Pointer(pName2)).Fn == uint32(0) && pTab != 0 && (*Table)(unsafe.Pointer(pTab)).FpSchema == (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema) { goto __7 } iDb = 1 __7: ; if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __8 } goto trigger_cleanup __8: ; Xsqlite3FixInit(tls, bp+40, pParse, iDb, ts+21347, *(*uintptr)(unsafe.Pointer(bp + 32))) if !(Xsqlite3FixSrcList(tls, bp+40, pTableName) != 0) { goto __9 } goto trigger_cleanup __9: ; pTab = Xsqlite3SrcListLookup(tls, pParse, pTableName) if !!(pTab != 0) { goto __10 } goto trigger_orphan_error __10: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __11 } Xsqlite3ErrorMsg(tls, pParse, ts+21355, 0) goto trigger_orphan_error __11: ; zName = Xsqlite3NameFromToken(tls, db, *(*uintptr)(unsafe.Pointer(bp + 32))) if !(zName == uintptr(0)) { goto __12 } goto trigger_cleanup __12: ; if !(Xsqlite3CheckObjectName(tls, pParse, zName, ts+21347, (*Table)(unsafe.Pointer(pTab)).FzName) != 0) { goto __13 } goto trigger_cleanup __13: ; if !!(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __14 } if !(Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema+56, zName) != 0) { goto __15 } if !!(noErr != 0) { goto __16 } Xsqlite3ErrorMsg(tls, pParse, ts+21396, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(bp + 32)))) goto __17 __16: ; Xsqlite3CodeVerifySchema(tls, pParse, iDb) __17: ; goto trigger_cleanup __15: ; __14: ; if !(Xsqlite3_strnicmp(tls, (*Table)(unsafe.Pointer(pTab)).FzName, ts+7733, 7) == 0) { goto __18 } Xsqlite3ErrorMsg(tls, pParse, ts+21422, 0) goto trigger_cleanup __18: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW && tr_tm != TK_INSTEAD) { goto __19 } Xsqlite3ErrorMsg(tls, pParse, ts+21460, libc.VaList(bp+8, func() uintptr { if tr_tm == TK_BEFORE { return ts + 21497 } return ts + 21504 }(), pTableName+8)) goto trigger_orphan_error __19: ; if !(!(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) && tr_tm == TK_INSTEAD) { goto __20 } Xsqlite3ErrorMsg(tls, pParse, ts+21510, libc.VaList(bp+24, pTableName+8)) goto trigger_orphan_error __20: ; if !!(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __21 } iTabDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) code = SQLITE_CREATE_TRIGGER zDb = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iTabDb)*32)).FzDbSName if isTemp != 0 { zDbTrig = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).FzDbSName } else { zDbTrig = zDb } if !(iTabDb == 1 || isTemp != 0) { goto __22 } code = SQLITE_CREATE_TEMP_TRIGGER __22: ; if !(Xsqlite3AuthCheck(tls, pParse, code, zName, (*Table)(unsafe.Pointer(pTab)).FzName, zDbTrig) != 0) { goto __23 } goto trigger_cleanup __23: ; if !(Xsqlite3AuthCheck(tls, pParse, SQLITE_INSERT, func() uintptr { if !(0 != 0) && iTabDb == 1 { return ts + 7741 } return ts + 7235 }(), uintptr(0), zDb) != 0) { goto __24 } goto trigger_cleanup __24: ; __21: ; if !(tr_tm == TK_INSTEAD) { goto __25 } tr_tm = TK_BEFORE __25: ; pTrigger = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Trigger{}))) if !(pTrigger == uintptr(0)) { goto __26 } goto trigger_cleanup __26: ; (*Trigger)(unsafe.Pointer(pTrigger)).FzName = zName zName = uintptr(0) (*Trigger)(unsafe.Pointer(pTrigger)).Ftable = Xsqlite3DbStrDup(tls, db, (*SrcItem)(unsafe.Pointer(pTableName+8)).FzName) (*Trigger)(unsafe.Pointer(pTrigger)).FpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpSchema (*Trigger)(unsafe.Pointer(pTrigger)).FpTabSchema = (*Table)(unsafe.Pointer(pTab)).FpSchema (*Trigger)(unsafe.Pointer(pTrigger)).Fop = U8(op) (*Trigger)(unsafe.Pointer(pTrigger)).Ftr_tm = func() uint8 { if tr_tm == TK_BEFORE { return uint8(TRIGGER_BEFORE) } return uint8(TRIGGER_AFTER) }() if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __27 } Xsqlite3RenameTokenRemap(tls, pParse, (*Trigger)(unsafe.Pointer(pTrigger)).Ftable, (*SrcItem)(unsafe.Pointer(pTableName+8)).FzName) (*Trigger)(unsafe.Pointer(pTrigger)).FpWhen = pWhen pWhen = uintptr(0) goto __28 __27: (*Trigger)(unsafe.Pointer(pTrigger)).FpWhen = Xsqlite3ExprDup(tls, db, pWhen, EXPRDUP_REDUCE) __28: ; (*Trigger)(unsafe.Pointer(pTrigger)).FpColumns = pColumns pColumns = uintptr(0) (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger = pTrigger trigger_cleanup: Xsqlite3DbFree(tls, db, zName) Xsqlite3SrcListDelete(tls, db, pTableName) Xsqlite3IdListDelete(tls, db, pColumns) Xsqlite3ExprDelete(tls, db, pWhen) if !!(int32((*Parse)(unsafe.Pointer(pParse)).FpNewTrigger) != 0) { goto __29 } Xsqlite3DeleteTrigger(tls, db, pTrigger) goto __30 __29: ; __30: ; return trigger_orphan_error: if !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb) == 1) { goto __31 } libc.SetBitFieldPtr8Uint32(db+192+8, uint32(1), 0, 0x1) __31: ; goto trigger_cleanup } // This routine is called after all of the trigger actions have been parsed // in order to complete the process of building the trigger. func Xsqlite3FinishTrigger(tls *libc.TLS, pParse uintptr, pStepList uintptr, pAll uintptr) { bp := tls.Alloc(168) defer tls.Free(168) var pTrig uintptr var zName uintptr var db uintptr var iDb int32 var pStep uintptr var v uintptr var z uintptr var pTab uintptr var pLink uintptr var pHash uintptr pTrig = (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger db = (*Parse)(unsafe.Pointer(pParse)).Fdb (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger = uintptr(0) if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0 || !(pTrig != 0)) { goto __1 } goto triggerfinish_cleanup __1: ; zName = (*Trigger)(unsafe.Pointer(pTrig)).FzName iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Trigger)(unsafe.Pointer(pTrig)).FpSchema) (*Trigger)(unsafe.Pointer(pTrig)).Fstep_list = pStepList __2: if !(pStepList != 0) { goto __3 } (*TriggerStep)(unsafe.Pointer(pStepList)).FpTrig = pTrig pStepList = (*TriggerStep)(unsafe.Pointer(pStepList)).FpNext goto __2 __3: ; Xsqlite3TokenInit(tls, bp+56, (*Trigger)(unsafe.Pointer(pTrig)).FzName) Xsqlite3FixInit(tls, bp+72, pParse, iDb, ts+21347, bp+56) if !(Xsqlite3FixTriggerStep(tls, bp+72, (*Trigger)(unsafe.Pointer(pTrig)).Fstep_list) != 0 || Xsqlite3FixExpr(tls, bp+72, (*Trigger)(unsafe.Pointer(pTrig)).FpWhen) != 0) { goto __4 } goto triggerfinish_cleanup __4: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { goto __5 } (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger = pTrig pTrig = uintptr(0) goto __6 __5: if !!(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) { goto __7 } if !(Xsqlite3ReadOnlyShadowTables(tls, db) != 0) { goto __8 } pStep = (*Trigger)(unsafe.Pointer(pTrig)).Fstep_list __9: if !(pStep != 0) { goto __11 } if !((*TriggerStep)(unsafe.Pointer(pStep)).FzTarget != uintptr(0) && Xsqlite3ShadowTableName(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget) != 0) { goto __12 } Xsqlite3ErrorMsg(tls, pParse, ts+21556, libc.VaList(bp, (*Trigger)(unsafe.Pointer(pTrig)).FzName, (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget)) goto triggerfinish_cleanup __12: ; goto __10 __10: pStep = (*TriggerStep)(unsafe.Pointer(pStep)).FpNext goto __9 goto __11 __11: ; __8: ; v = Xsqlite3GetVdbe(tls, pParse) if !(v == uintptr(0)) { goto __13 } goto triggerfinish_cleanup __13: ; Xsqlite3BeginWriteOperation(tls, pParse, 0, iDb) z = Xsqlite3DbStrNDup(tls, db, (*Token)(unsafe.Pointer(pAll)).Fz, uint64((*Token)(unsafe.Pointer(pAll)).Fn)) Xsqlite3NestedParse(tls, pParse, ts+21604, libc.VaList(bp+16, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, zName, (*Trigger)(unsafe.Pointer(pTrig)).Ftable, z)) Xsqlite3DbFree(tls, db, z) Xsqlite3ChangeCookie(tls, pParse, iDb) Xsqlite3VdbeAddParseSchemaOp(tls, v, iDb, Xsqlite3MPrintf(tls, db, ts+21679, libc.VaList(bp+48, zName)), uint16(0)) __7: ; __6: ; if !((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy != 0) { goto __14 } pLink = pTrig pHash = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema + 56 pTrig = Xsqlite3HashInsert(tls, pHash, zName, pTrig) if !(pTrig != 0) { goto __15 } Xsqlite3OomFault(tls, db) goto __16 __15: if !((*Trigger)(unsafe.Pointer(pLink)).FpSchema == (*Trigger)(unsafe.Pointer(pLink)).FpTabSchema) { goto __17 } pTab = Xsqlite3HashFind(tls, (*Trigger)(unsafe.Pointer(pLink)).FpTabSchema+8, (*Trigger)(unsafe.Pointer(pLink)).Ftable) (*Trigger)(unsafe.Pointer(pLink)).FpNext = (*Table)(unsafe.Pointer(pTab)).FpTrigger (*Table)(unsafe.Pointer(pTab)).FpTrigger = pLink __17: ; __16: ; __14: ; triggerfinish_cleanup: Xsqlite3DeleteTrigger(tls, db, pTrig) Xsqlite3DeleteTriggerStep(tls, db, pStepList) } func triggerSpanDup(tls *libc.TLS, db uintptr, zStart uintptr, zEnd uintptr) uintptr { var z uintptr = Xsqlite3DbSpanDup(tls, db, zStart, zEnd) var i int32 if z != 0 { for i = 0; *(*int8)(unsafe.Pointer(z + uintptr(i))) != 0; i++ { if int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(i))))])&0x01 != 0 { *(*int8)(unsafe.Pointer(z + uintptr(i))) = int8(' ') } } } return z } // Turn a SELECT statement (that the pSelect parameter points to) into // a trigger step. Return a pointer to a TriggerStep structure. // // The parser calls this routine when it finds a SELECT statement in // body of a TRIGGER. func Xsqlite3TriggerSelectStep(tls *libc.TLS, db uintptr, pSelect uintptr, zStart uintptr, zEnd uintptr) uintptr { var pTriggerStep uintptr = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(TriggerStep{}))) if pTriggerStep == uintptr(0) { Xsqlite3SelectDelete(tls, db, pSelect) return uintptr(0) } (*TriggerStep)(unsafe.Pointer(pTriggerStep)).Fop = U8(TK_SELECT) (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpSelect = pSelect (*TriggerStep)(unsafe.Pointer(pTriggerStep)).Forconf = U8(OE_Default) (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FzSpan = triggerSpanDup(tls, db, zStart, zEnd) return pTriggerStep } func triggerStepAllocate(tls *libc.TLS, pParse uintptr, op U8, pName uintptr, zStart uintptr, zEnd uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTriggerStep uintptr if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return uintptr(0) } pTriggerStep = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(TriggerStep{}))+uint64((*Token)(unsafe.Pointer(pName)).Fn)+uint64(1)) if pTriggerStep != 0 { var z uintptr = pTriggerStep + 1*96 libc.Xmemcpy(tls, z, (*Token)(unsafe.Pointer(pName)).Fz, uint64((*Token)(unsafe.Pointer(pName)).Fn)) Xsqlite3Dequote(tls, z) (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FzTarget = z (*TriggerStep)(unsafe.Pointer(pTriggerStep)).Fop = op (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FzSpan = triggerSpanDup(tls, db, zStart, zEnd) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameTokenMap(tls, pParse, (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FzTarget, pName) } } return pTriggerStep } // Build a trigger step out of an INSERT statement. Return a pointer // to the new trigger step. // // The parser calls this routine when it sees an INSERT inside the // body of a trigger. func Xsqlite3TriggerInsertStep(tls *libc.TLS, pParse uintptr, pTableName uintptr, pColumn uintptr, pSelect uintptr, orconf U8, pUpsert uintptr, zStart uintptr, zEnd uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTriggerStep uintptr pTriggerStep = triggerStepAllocate(tls, pParse, uint8(TK_INSERT), pTableName, zStart, zEnd) if pTriggerStep != 0 { if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpSelect = pSelect pSelect = uintptr(0) } else { (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpSelect = Xsqlite3SelectDup(tls, db, pSelect, EXPRDUP_REDUCE) } (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpIdList = pColumn (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpUpsert = pUpsert (*TriggerStep)(unsafe.Pointer(pTriggerStep)).Forconf = orconf if pUpsert != 0 { Xsqlite3HasExplicitNulls(tls, pParse, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget) } } else { Xsqlite3IdListDelete(tls, db, pColumn) Xsqlite3UpsertDelete(tls, db, pUpsert) } Xsqlite3SelectDelete(tls, db, pSelect) return pTriggerStep } // Construct a trigger step that implements an UPDATE statement and return // a pointer to that trigger step. The parser calls this routine when it // sees an UPDATE statement inside the body of a CREATE TRIGGER. func Xsqlite3TriggerUpdateStep(tls *libc.TLS, pParse uintptr, pTableName uintptr, pFrom uintptr, pEList uintptr, pWhere uintptr, orconf U8, zStart uintptr, zEnd uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTriggerStep uintptr pTriggerStep = triggerStepAllocate(tls, pParse, uint8(TK_UPDATE), pTableName, zStart, zEnd) if pTriggerStep != 0 { if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpExprList = pEList (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpWhere = pWhere (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpFrom = pFrom pEList = uintptr(0) pWhere = uintptr(0) pFrom = uintptr(0) } else { (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpExprList = Xsqlite3ExprListDup(tls, db, pEList, EXPRDUP_REDUCE) (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpWhere = Xsqlite3ExprDup(tls, db, pWhere, EXPRDUP_REDUCE) (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpFrom = Xsqlite3SrcListDup(tls, db, pFrom, EXPRDUP_REDUCE) } (*TriggerStep)(unsafe.Pointer(pTriggerStep)).Forconf = orconf } Xsqlite3ExprListDelete(tls, db, pEList) Xsqlite3ExprDelete(tls, db, pWhere) Xsqlite3SrcListDelete(tls, db, pFrom) return pTriggerStep } // Construct a trigger step that implements a DELETE statement and return // a pointer to that trigger step. The parser calls this routine when it // sees a DELETE statement inside the body of a CREATE TRIGGER. func Xsqlite3TriggerDeleteStep(tls *libc.TLS, pParse uintptr, pTableName uintptr, pWhere uintptr, zStart uintptr, zEnd uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTriggerStep uintptr pTriggerStep = triggerStepAllocate(tls, pParse, uint8(TK_DELETE), pTableName, zStart, zEnd) if pTriggerStep != 0 { if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpWhere = pWhere pWhere = uintptr(0) } else { (*TriggerStep)(unsafe.Pointer(pTriggerStep)).FpWhere = Xsqlite3ExprDup(tls, db, pWhere, EXPRDUP_REDUCE) } (*TriggerStep)(unsafe.Pointer(pTriggerStep)).Forconf = U8(OE_Default) } Xsqlite3ExprDelete(tls, db, pWhere) return pTriggerStep } // Recursively delete a Trigger structure func Xsqlite3DeleteTrigger(tls *libc.TLS, db uintptr, pTrigger uintptr) { if pTrigger == uintptr(0) || (*Trigger)(unsafe.Pointer(pTrigger)).FbReturning != 0 { return } Xsqlite3DeleteTriggerStep(tls, db, (*Trigger)(unsafe.Pointer(pTrigger)).Fstep_list) Xsqlite3DbFree(tls, db, (*Trigger)(unsafe.Pointer(pTrigger)).FzName) Xsqlite3DbFree(tls, db, (*Trigger)(unsafe.Pointer(pTrigger)).Ftable) Xsqlite3ExprDelete(tls, db, (*Trigger)(unsafe.Pointer(pTrigger)).FpWhen) Xsqlite3IdListDelete(tls, db, (*Trigger)(unsafe.Pointer(pTrigger)).FpColumns) Xsqlite3DbFree(tls, db, pTrigger) } // This function is called to drop a trigger from the database schema. // // This may be called directly from the parser and therefore identifies // the trigger by name. The sqlite3DropTriggerPtr() routine does the // same job as this routine except it takes a pointer to the trigger // instead of the trigger name. func Xsqlite3DropTrigger(tls *libc.TLS, pParse uintptr, pName uintptr, noErr int32) { bp := tls.Alloc(8) defer tls.Free(8) var pTrigger uintptr var i int32 var zDb uintptr var zName uintptr var db uintptr var j int32 pTrigger = uintptr(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __1 } goto drop_trigger_cleanup __1: ; if !(SQLITE_OK != Xsqlite3ReadSchema(tls, pParse)) { goto __2 } goto drop_trigger_cleanup __2: ; zDb = (*SrcItem)(unsafe.Pointer(pName + 8)).FzDatabase zName = (*SrcItem)(unsafe.Pointer(pName + 8)).FzName i = OMIT_TEMPDB __3: if !(i < (*Sqlite3)(unsafe.Pointer(db)).FnDb) { goto __5 } if i < 2 { j = i ^ 1 } else { j = i } if !(zDb != 0 && Xsqlite3DbIsNamed(tls, db, j, zDb) == 0) { goto __6 } goto __4 __6: ; pTrigger = Xsqlite3HashFind(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(j)*32)).FpSchema+56, zName) if !(pTrigger != 0) { goto __7 } goto __5 __7: ; goto __4 __4: i++ goto __3 goto __5 __5: ; if !!(pTrigger != 0) { goto __8 } if !!(noErr != 0) { goto __9 } Xsqlite3ErrorMsg(tls, pParse, ts+21708, libc.VaList(bp, pName+8)) goto __10 __9: Xsqlite3CodeVerifyNamedSchema(tls, pParse, zDb) __10: ; (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) goto drop_trigger_cleanup __8: ; Xsqlite3DropTriggerPtr(tls, pParse, pTrigger) drop_trigger_cleanup: Xsqlite3SrcListDelete(tls, db, pName) } func tableOfTrigger(tls *libc.TLS, pTrigger uintptr) uintptr { return Xsqlite3HashFind(tls, (*Trigger)(unsafe.Pointer(pTrigger)).FpTabSchema+8, (*Trigger)(unsafe.Pointer(pTrigger)).Ftable) } // Drop a trigger given a pointer to that trigger. func Xsqlite3DropTriggerPtr(tls *libc.TLS, pParse uintptr, pTrigger uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var pTable uintptr var v uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var iDb int32 iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Trigger)(unsafe.Pointer(pTrigger)).FpSchema) pTable = tableOfTrigger(tls, pTrigger) if pTable != 0 { var code int32 = SQLITE_DROP_TRIGGER var zDb uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName var zTab uintptr = func() uintptr { if !(0 != 0) && iDb == 1 { return ts + 7741 } return ts + 7235 }() if iDb == 1 { code = SQLITE_DROP_TEMP_TRIGGER } if Xsqlite3AuthCheck(tls, pParse, code, (*Trigger)(unsafe.Pointer(pTrigger)).FzName, (*Table)(unsafe.Pointer(pTable)).FzName, zDb) != 0 || Xsqlite3AuthCheck(tls, pParse, SQLITE_DELETE, zTab, uintptr(0), zDb) != 0 { return } } if libc.AssignUintptr(&v, Xsqlite3GetVdbe(tls, pParse)) != uintptr(0) { Xsqlite3NestedParse(tls, pParse, ts+21728, libc.VaList(bp, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, (*Trigger)(unsafe.Pointer(pTrigger)).FzName)) Xsqlite3ChangeCookie(tls, pParse, iDb) Xsqlite3VdbeAddOp4(tls, v, OP_DropTrigger, iDb, 0, 0, (*Trigger)(unsafe.Pointer(pTrigger)).FzName, 0) } } // Remove a trigger from the hash tables of the sqlite* pointer. func Xsqlite3UnlinkAndDeleteTrigger(tls *libc.TLS, db uintptr, iDb int32, zName uintptr) { var pTrigger uintptr var pHash uintptr pHash = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema + 56 pTrigger = Xsqlite3HashInsert(tls, pHash, zName, uintptr(0)) if pTrigger != 0 { if (*Trigger)(unsafe.Pointer(pTrigger)).FpSchema == (*Trigger)(unsafe.Pointer(pTrigger)).FpTabSchema { var pTab uintptr = tableOfTrigger(tls, pTrigger) if pTab != 0 { var pp uintptr for pp = pTab + 88; *(*uintptr)(unsafe.Pointer(pp)) != 0; pp = *(*uintptr)(unsafe.Pointer(pp)) + 64 { if *(*uintptr)(unsafe.Pointer(pp)) == pTrigger { *(*uintptr)(unsafe.Pointer(pp)) = (*Trigger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FpNext break } } } } Xsqlite3DeleteTrigger(tls, db, pTrigger) *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_SchemaChange) } } func checkColumnOverlap(tls *libc.TLS, pIdList uintptr, pEList uintptr) int32 { var e int32 if pIdList == uintptr(0) || pEList == uintptr(0) { return 1 } for e = 0; e < (*ExprList)(unsafe.Pointer(pEList)).FnExpr; e++ { if Xsqlite3IdListIndex(tls, pIdList, (*ExprList_item)(unsafe.Pointer(pEList+8+uintptr(e)*32)).FzEName) >= 0 { return 1 } } return 0 } func tempTriggersExist(tls *libc.TLS, db uintptr) int32 { if (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema == uintptr(0) { return 0 } if (*Hash)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema+56)).Ffirst == uintptr(0) { return 0 } return 1 } func triggersReallyExist(tls *libc.TLS, pParse uintptr, pTab uintptr, op int32, pChanges uintptr, pMask uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var mask int32 var pList uintptr var p uintptr mask = 0 pList = uintptr(0) pList = Xsqlite3TriggerList(tls, pParse, pTab) if !(pList != uintptr(0)) { goto __1 } p = pList if !((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_EnableTrigger) == uint64(0) && (*Table)(unsafe.Pointer(pTab)).FpTrigger != uintptr(0)) { goto __2 } if !(pList == (*Table)(unsafe.Pointer(pTab)).FpTrigger) { goto __3 } pList = uintptr(0) goto exit_triggers_exist __3: ; __4: if !((*Trigger)(unsafe.Pointer(p)).FpNext != 0 && (*Trigger)(unsafe.Pointer(p)).FpNext != (*Table)(unsafe.Pointer(pTab)).FpTrigger) { goto __5 } p = (*Trigger)(unsafe.Pointer(p)).FpNext goto __4 __5: ; (*Trigger)(unsafe.Pointer(p)).FpNext = uintptr(0) p = pList __2: ; __6: if !(int32((*Trigger)(unsafe.Pointer(p)).Fop) == op && checkColumnOverlap(tls, (*Trigger)(unsafe.Pointer(p)).FpColumns, pChanges) != 0) { goto __9 } mask = mask | int32((*Trigger)(unsafe.Pointer(p)).Ftr_tm) goto __10 __9: if !(int32((*Trigger)(unsafe.Pointer(p)).Fop) == TK_RETURNING) { goto __11 } (*Trigger)(unsafe.Pointer(p)).Fop = U8(op) if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __13 } if !(op != TK_INSERT) { goto __15 } Xsqlite3ErrorMsg(tls, pParse, ts+21790, libc.VaList(bp, func() uintptr { if op == TK_DELETE { return ts + 21838 } return ts + 21845 }())) __15: ; (*Trigger)(unsafe.Pointer(p)).Ftr_tm = U8(TRIGGER_BEFORE) goto __14 __13: (*Trigger)(unsafe.Pointer(p)).Ftr_tm = U8(TRIGGER_AFTER) __14: ; mask = mask | int32((*Trigger)(unsafe.Pointer(p)).Ftr_tm) goto __12 __11: if !((*Trigger)(unsafe.Pointer(p)).FbReturning != 0 && int32((*Trigger)(unsafe.Pointer(p)).Fop) == TK_INSERT && op == TK_UPDATE && (*Parse)(unsafe.Pointer(pParse)).FpToplevel == uintptr(0)) { goto __16 } mask = mask | int32((*Trigger)(unsafe.Pointer(p)).Ftr_tm) __16: ; __12: ; __10: ; p = (*Trigger)(unsafe.Pointer(p)).FpNext goto __7 __7: if p != 0 { goto __6 } goto __8 __8: ; __1: ; exit_triggers_exist: if !(pMask != 0) { goto __17 } *(*int32)(unsafe.Pointer(pMask)) = mask __17: ; return func() uintptr { if mask != 0 { return pList } return uintptr(0) }() } func Xsqlite3TriggersExist(tls *libc.TLS, pParse uintptr, pTab uintptr, op int32, pChanges uintptr, pMask uintptr) uintptr { if (*Table)(unsafe.Pointer(pTab)).FpTrigger == uintptr(0) && !(tempTriggersExist(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb) != 0) || (*Parse)(unsafe.Pointer(pParse)).FdisableTriggers != 0 { if pMask != 0 { *(*int32)(unsafe.Pointer(pMask)) = 0 } return uintptr(0) } return triggersReallyExist(tls, pParse, pTab, op, pChanges, pMask) } // Convert the pStep->zTarget string into a SrcList and return a pointer // to that SrcList. // // This routine adds a specific database name, if needed, to the target when // forming the SrcList. This prevents a trigger in one database from // referring to a target in another database. An exception is when the // trigger is in TEMP in which case it can refer to any other database it // wants. func Xsqlite3TriggerStepSrc(tls *libc.TLS, pParse uintptr, pStep uintptr) uintptr { bp := tls.Alloc(16) defer tls.Free(16) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pSrc uintptr var zName uintptr = Xsqlite3DbStrDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FzTarget) pSrc = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), uintptr(0), uintptr(0)) if pSrc != 0 { var pSchema uintptr = (*Trigger)(unsafe.Pointer((*TriggerStep)(unsafe.Pointer(pStep)).FpTrig)).FpSchema (*SrcItem)(unsafe.Pointer(pSrc + 8)).FzName = zName if pSchema != (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema { (*SrcItem)(unsafe.Pointer(pSrc + 8)).FpSchema = pSchema } if (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom != 0 { var pDup uintptr = Xsqlite3SrcListDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpFrom, 0) if pDup != 0 && (*SrcList)(unsafe.Pointer(pDup)).FnSrc > 1 && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { var pSubquery uintptr pSubquery = Xsqlite3SelectNew(tls, pParse, uintptr(0), pDup, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(SF_NestedFrom), uintptr(0)) (*Token)(unsafe.Pointer(bp)).Fn = uint32(0) (*Token)(unsafe.Pointer(bp)).Fz = uintptr(0) pDup = Xsqlite3SrcListAppendFromTerm(tls, pParse, uintptr(0), uintptr(0), uintptr(0), bp, pSubquery, uintptr(0)) } pSrc = Xsqlite3SrcListAppendList(tls, pParse, pSrc, pDup) } } else { Xsqlite3DbFree(tls, db, zName) } return pSrc } func isAsteriskTerm(tls *libc.TLS, pParse uintptr, pTerm uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pTerm)).Fop) == TK_ASTERISK { return 1 } if int32((*Expr)(unsafe.Pointer(pTerm)).Fop) != TK_DOT { return 0 } if int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pTerm)).FpRight)).Fop) != TK_ASTERISK { return 0 } Xsqlite3ErrorMsg(tls, pParse, ts+21852, 0) return 1 } func sqlite3ExpandReturning(tls *libc.TLS, pParse uintptr, pList uintptr, pTab uintptr) uintptr { var pNew uintptr = uintptr(0) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { var pOldExpr uintptr = (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(i)*32)).FpExpr if pOldExpr == uintptr(0) { continue } if isAsteriskTerm(tls, pParse, pOldExpr) != 0 { var jj int32 for jj = 0; jj < int32((*Table)(unsafe.Pointer(pTab)).FnCol); jj++ { var pNewExpr uintptr if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(jj)*24)).FcolFlags)&COLFLAG_HIDDEN != 0 { continue } pNewExpr = Xsqlite3Expr(tls, db, TK_ID, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(jj)*24)).FzCnName) pNew = Xsqlite3ExprListAppend(tls, pParse, pNew, pNewExpr) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { var pItem uintptr = pNew + 8 + uintptr((*ExprList)(unsafe.Pointer(pNew)).FnExpr-1)*32 (*ExprList_item)(unsafe.Pointer(pItem)).FzEName = Xsqlite3DbStrDup(tls, db, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(jj)*24)).FzCnName) libc.SetBitFieldPtr16Uint32(pItem+16+4, uint32(ENAME_NAME), 0, 0x3) } } } else { var pNewExpr uintptr = Xsqlite3ExprDup(tls, db, pOldExpr, 0) pNew = Xsqlite3ExprListAppend(tls, pParse, pNew, pNewExpr) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) && (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FzEName != uintptr(0) { var pItem uintptr = pNew + 8 + uintptr((*ExprList)(unsafe.Pointer(pNew)).FnExpr-1)*32 (*ExprList_item)(unsafe.Pointer(pItem)).FzEName = Xsqlite3DbStrDup(tls, db, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FzEName) libc.SetBitFieldPtr16Uint32(pItem+16+4, uint32(int32(*(*uint16)(unsafe.Pointer(pList + 8 + uintptr(i)*32 + 16 + 4))&0x3>>0)), 0, 0x3) } } } return pNew } func codeReturningTrigger(tls *libc.TLS, pParse uintptr, pTrigger uintptr, pTab uintptr, regIn int32) { bp := tls.Alloc(296) defer tls.Free(296) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pNew uintptr var pReturning uintptr pReturning = *(*uintptr)(unsafe.Pointer(pParse + 200)) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Select{}))) libc.Xmemset(tls, bp+128, 0, uint64(unsafe.Sizeof(SrcList{}))) (*Select)(unsafe.Pointer(bp)).FpEList = Xsqlite3ExprListDup(tls, db, (*Returning)(unsafe.Pointer(pReturning)).FpReturnEL, 0) (*Select)(unsafe.Pointer(bp)).FpSrc = bp + 128 (*SrcList)(unsafe.Pointer(bp + 128)).FnSrc = 1 (*SrcItem)(unsafe.Pointer(bp + 128 + 8)).FpTab = pTab (*SrcItem)(unsafe.Pointer(bp + 128 + 8)).FiCursor = -1 Xsqlite3SelectPrep(tls, pParse, bp, uintptr(0)) if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 { Xsqlite3GenerateColumnNames(tls, pParse, bp) } Xsqlite3ExprListDelete(tls, db, (*Select)(unsafe.Pointer(bp)).FpEList) pNew = sqlite3ExpandReturning(tls, pParse, (*Returning)(unsafe.Pointer(pReturning)).FpReturnEL, pTab) if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 { libc.Xmemset(tls, bp+240, 0, uint64(unsafe.Sizeof(NameContext{}))) if (*Returning)(unsafe.Pointer(pReturning)).FnRetCol == 0 { (*Returning)(unsafe.Pointer(pReturning)).FnRetCol = (*ExprList)(unsafe.Pointer(pNew)).FnExpr (*Returning)(unsafe.Pointer(pReturning)).FiRetCur = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) } (*NameContext)(unsafe.Pointer(bp + 240)).FpParse = pParse *(*int32)(unsafe.Pointer(bp + 240 + 16)) = regIn (*NameContext)(unsafe.Pointer(bp + 240)).FncFlags = NC_UBaseReg (*Parse)(unsafe.Pointer(pParse)).FeTriggerOp = (*Trigger)(unsafe.Pointer(pTrigger)).Fop (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab = pTab if Xsqlite3ResolveExprListNames(tls, bp+240, pNew) == SQLITE_OK && !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { var i int32 var nCol int32 = (*ExprList)(unsafe.Pointer(pNew)).FnExpr var reg int32 = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nCol + 2 (*Returning)(unsafe.Pointer(pReturning)).FiRetReg = reg for i = 0; i < nCol; i++ { var pCol uintptr = (*ExprList_item)(unsafe.Pointer(pNew + 8 + uintptr(i)*32)).FpExpr Xsqlite3ExprCodeFactorable(tls, pParse, pCol, reg+i) if int32(Xsqlite3ExprAffinity(tls, pCol)) == SQLITE_AFF_REAL { Xsqlite3VdbeAddOp1(tls, v, OP_RealAffinity, reg+i) } } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, reg, i, reg+i) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, (*Returning)(unsafe.Pointer(pReturning)).FiRetCur, reg+i+1) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, (*Returning)(unsafe.Pointer(pReturning)).FiRetCur, reg+i, reg+i+1) } } Xsqlite3ExprListDelete(tls, db, pNew) (*Parse)(unsafe.Pointer(pParse)).FeTriggerOp = U8(0) (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab = uintptr(0) } func codeTriggerProgram(tls *libc.TLS, pParse uintptr, pStepList uintptr, orconf int32) int32 { bp := tls.Alloc(48) defer tls.Free(48) var pStep uintptr var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb for pStep = pStepList; pStep != 0; pStep = (*TriggerStep)(unsafe.Pointer(pStep)).FpNext { (*Parse)(unsafe.Pointer(pParse)).FeOrconf = func() uint8 { if orconf == OE_Default { return (*TriggerStep)(unsafe.Pointer(pStep)).Forconf } return U8(orconf) }() if (*TriggerStep)(unsafe.Pointer(pStep)).FzSpan != 0 { Xsqlite3VdbeAddOp4(tls, v, OP_Trace, 0x7fffffff, 1, 0, Xsqlite3MPrintf(tls, db, ts+7432, libc.VaList(bp, (*TriggerStep)(unsafe.Pointer(pStep)).FzSpan)), -6) } switch int32((*TriggerStep)(unsafe.Pointer(pStep)).Fop) { case TK_UPDATE: { Xsqlite3Update(tls, pParse, Xsqlite3TriggerStepSrc(tls, pParse, pStep), Xsqlite3ExprListDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpExprList, 0), Xsqlite3ExprDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere, 0), int32((*Parse)(unsafe.Pointer(pParse)).FeOrconf), uintptr(0), uintptr(0), uintptr(0)) Xsqlite3VdbeAddOp0(tls, v, OP_ResetCount) break } case TK_INSERT: { Xsqlite3Insert(tls, pParse, Xsqlite3TriggerStepSrc(tls, pParse, pStep), Xsqlite3SelectDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect, 0), Xsqlite3IdListDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpIdList), int32((*Parse)(unsafe.Pointer(pParse)).FeOrconf), Xsqlite3UpsertDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpUpsert)) Xsqlite3VdbeAddOp0(tls, v, OP_ResetCount) break } case TK_DELETE: { Xsqlite3DeleteFrom(tls, pParse, Xsqlite3TriggerStepSrc(tls, pParse, pStep), Xsqlite3ExprDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpWhere, 0), uintptr(0), uintptr(0)) Xsqlite3VdbeAddOp0(tls, v, OP_ResetCount) break } default: { var pSelect uintptr = Xsqlite3SelectDup(tls, db, (*TriggerStep)(unsafe.Pointer(pStep)).FpSelect, 0) Xsqlite3SelectDestInit(tls, bp+8, SRT_Discard, 0) Xsqlite3Select(tls, pParse, pSelect, bp+8) Xsqlite3SelectDelete(tls, db, pSelect) break } } } return 0 } func transferParseError(tls *libc.TLS, pTo uintptr, pFrom uintptr) { if (*Parse)(unsafe.Pointer(pTo)).FnErr == 0 { (*Parse)(unsafe.Pointer(pTo)).FzErrMsg = (*Parse)(unsafe.Pointer(pFrom)).FzErrMsg (*Parse)(unsafe.Pointer(pTo)).FnErr = (*Parse)(unsafe.Pointer(pFrom)).FnErr (*Parse)(unsafe.Pointer(pTo)).Frc = (*Parse)(unsafe.Pointer(pFrom)).Frc } else { Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pFrom)).Fdb, (*Parse)(unsafe.Pointer(pFrom)).FzErrMsg) } } func codeRowTrigger(tls *libc.TLS, pParse uintptr, pTrigger uintptr, pTab uintptr, orconf int32) uintptr { bp := tls.Alloc(488) defer tls.Free(488) var pTop uintptr = func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }() var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pPrg uintptr var pWhen uintptr = uintptr(0) var v uintptr var pProgram uintptr = uintptr(0) var iEndTrigger int32 = 0 pPrg = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(TriggerPrg{}))) if !(pPrg != 0) { return uintptr(0) } (*TriggerPrg)(unsafe.Pointer(pPrg)).FpNext = (*Parse)(unsafe.Pointer(pTop)).FpTriggerPrg (*Parse)(unsafe.Pointer(pTop)).FpTriggerPrg = pPrg (*TriggerPrg)(unsafe.Pointer(pPrg)).FpProgram = libc.AssignUintptr(&pProgram, Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(SubProgram{})))) if !(pProgram != 0) { return uintptr(0) } Xsqlite3VdbeLinkSubProgram(tls, (*Parse)(unsafe.Pointer(pTop)).FpVdbe, pProgram) (*TriggerPrg)(unsafe.Pointer(pPrg)).FpTrigger = pTrigger (*TriggerPrg)(unsafe.Pointer(pPrg)).Forconf = orconf *(*U32)(unsafe.Pointer(pPrg + 28)) = 0xffffffff *(*U32)(unsafe.Pointer(pPrg + 28 + 1*4)) = 0xffffffff Xsqlite3ParseObjectInit(tls, bp+8, db) libc.Xmemset(tls, bp+432, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 432)).FpParse = bp + 8 (*Parse)(unsafe.Pointer(bp + 8)).FpTriggerTab = pTab (*Parse)(unsafe.Pointer(bp + 8)).FpToplevel = pTop (*Parse)(unsafe.Pointer(bp + 8)).FzAuthContext = (*Trigger)(unsafe.Pointer(pTrigger)).FzName (*Parse)(unsafe.Pointer(bp + 8)).FeTriggerOp = (*Trigger)(unsafe.Pointer(pTrigger)).Fop (*Parse)(unsafe.Pointer(bp + 8)).FnQueryLoop = (*Parse)(unsafe.Pointer(pParse)).FnQueryLoop (*Parse)(unsafe.Pointer(bp + 8)).FprepFlags = (*Parse)(unsafe.Pointer(pParse)).FprepFlags v = Xsqlite3GetVdbe(tls, bp+8) if v != 0 { if (*Trigger)(unsafe.Pointer(pTrigger)).FzName != 0 { Xsqlite3VdbeChangeP4(tls, v, -1, Xsqlite3MPrintf(tls, db, ts+21894, libc.VaList(bp, (*Trigger)(unsafe.Pointer(pTrigger)).FzName)), -6) } if (*Trigger)(unsafe.Pointer(pTrigger)).FpWhen != 0 { pWhen = Xsqlite3ExprDup(tls, db, (*Trigger)(unsafe.Pointer(pTrigger)).FpWhen, 0) if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 && SQLITE_OK == Xsqlite3ResolveExprNames(tls, bp+432, pWhen) { iEndTrigger = Xsqlite3VdbeMakeLabel(tls, bp+8) Xsqlite3ExprIfFalse(tls, bp+8, pWhen, iEndTrigger, SQLITE_JUMPIFNULL) } Xsqlite3ExprDelete(tls, db, pWhen) } codeTriggerProgram(tls, bp+8, (*Trigger)(unsafe.Pointer(pTrigger)).Fstep_list, orconf) if iEndTrigger != 0 { Xsqlite3VdbeResolveLabel(tls, v, iEndTrigger) } Xsqlite3VdbeAddOp0(tls, v, OP_Halt) transferParseError(tls, pParse, bp+8) if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 { (*SubProgram)(unsafe.Pointer(pProgram)).FaOp = Xsqlite3VdbeTakeOpArray(tls, v, pProgram+8, pTop+136) } (*SubProgram)(unsafe.Pointer(pProgram)).FnMem = (*Parse)(unsafe.Pointer(bp + 8)).FnMem (*SubProgram)(unsafe.Pointer(pProgram)).FnCsr = (*Parse)(unsafe.Pointer(bp + 8)).FnTab (*SubProgram)(unsafe.Pointer(pProgram)).Ftoken = pTrigger *(*U32)(unsafe.Pointer(pPrg + 28)) = (*Parse)(unsafe.Pointer(bp + 8)).Foldmask *(*U32)(unsafe.Pointer(pPrg + 28 + 1*4)) = (*Parse)(unsafe.Pointer(bp + 8)).Fnewmask Xsqlite3VdbeDelete(tls, v) } else { transferParseError(tls, pParse, bp+8) } Xsqlite3ParseObjectReset(tls, bp+8) return pPrg } func getRowTrigger(tls *libc.TLS, pParse uintptr, pTrigger uintptr, pTab uintptr, orconf int32) uintptr { var pRoot uintptr = func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }() var pPrg uintptr for pPrg = (*Parse)(unsafe.Pointer(pRoot)).FpTriggerPrg; pPrg != 0 && ((*TriggerPrg)(unsafe.Pointer(pPrg)).FpTrigger != pTrigger || (*TriggerPrg)(unsafe.Pointer(pPrg)).Forconf != orconf); pPrg = (*TriggerPrg)(unsafe.Pointer(pPrg)).FpNext { } if !(pPrg != 0) { pPrg = codeRowTrigger(tls, pParse, pTrigger, pTab, orconf) (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FerrByteOffset = -1 } return pPrg } // Generate code for the trigger program associated with trigger p on // table pTab. The reg, orconf and ignoreJump parameters passed to this // function are the same as those described in the header function for // sqlite3CodeRowTrigger() func Xsqlite3CodeRowTriggerDirect(tls *libc.TLS, pParse uintptr, p uintptr, pTab uintptr, reg int32, orconf int32, ignoreJump int32) { var v uintptr = Xsqlite3GetVdbe(tls, pParse) var pPrg uintptr pPrg = getRowTrigger(tls, pParse, p, pTab, orconf) if pPrg != 0 { var bRecursive int32 = libc.Bool32((*Trigger)(unsafe.Pointer(p)).FzName != 0 && uint64(0) == (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_RecTriggers)) Xsqlite3VdbeAddOp4(tls, v, OP_Program, reg, ignoreJump, libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1), (*TriggerPrg)(unsafe.Pointer(pPrg)).FpProgram, -4) Xsqlite3VdbeChangeP5(tls, v, uint16(U8(bRecursive))) } } // This is called to code the required FOR EACH ROW triggers for an operation // on table pTab. The operation to code triggers for (INSERT, UPDATE or DELETE) // is given by the op parameter. The tr_tm parameter determines whether the // BEFORE or AFTER triggers are coded. If the operation is an UPDATE, then // parameter pChanges is passed the list of columns being modified. // // If there are no triggers that fire at the specified time for the specified // operation on pTab, this function is a no-op. // // The reg argument is the address of the first in an array of registers // that contain the values substituted for the new.* and old.* references // in the trigger program. If N is the number of columns in table pTab // (a copy of pTab->nCol), then registers are populated as follows: // // Register Contains // ------------------------------------------------------ // reg+0 OLD.rowid // reg+1 OLD.* value of left-most column of pTab // ... ... // reg+N OLD.* value of right-most column of pTab // reg+N+1 NEW.rowid // reg+N+2 NEW.* value of left-most column of pTab // ... ... // reg+N+N+1 NEW.* value of right-most column of pTab // // For ON DELETE triggers, the registers containing the NEW.* values will // never be accessed by the trigger program, so they are not allocated or // populated by the caller (there is no data to populate them with anyway). // Similarly, for ON INSERT triggers the values stored in the OLD.* registers // are never accessed, and so are not allocated by the caller. So, for an // ON INSERT trigger, the value passed to this function as parameter reg // is not a readable register, although registers (reg+N) through // (reg+N+N+1) are. // // Parameter orconf is the default conflict resolution algorithm for the // trigger program to use (REPLACE, IGNORE etc.). Parameter ignoreJump // is the instruction that control should jump to if a trigger program // raises an IGNORE exception. func Xsqlite3CodeRowTrigger(tls *libc.TLS, pParse uintptr, pTrigger uintptr, op int32, pChanges uintptr, tr_tm int32, pTab uintptr, reg int32, orconf int32, ignoreJump int32) { var p uintptr for p = pTrigger; p != 0; p = (*Trigger)(unsafe.Pointer(p)).FpNext { if (int32((*Trigger)(unsafe.Pointer(p)).Fop) == op || (*Trigger)(unsafe.Pointer(p)).FbReturning != 0 && int32((*Trigger)(unsafe.Pointer(p)).Fop) == TK_INSERT && op == TK_UPDATE) && int32((*Trigger)(unsafe.Pointer(p)).Ftr_tm) == tr_tm && checkColumnOverlap(tls, (*Trigger)(unsafe.Pointer(p)).FpColumns, pChanges) != 0 { if !(int32((*Trigger)(unsafe.Pointer(p)).FbReturning) != 0) { Xsqlite3CodeRowTriggerDirect(tls, pParse, p, pTab, reg, orconf, ignoreJump) } else if (*Parse)(unsafe.Pointer(pParse)).FpToplevel == uintptr(0) { codeReturningTrigger(tls, pParse, p, pTab, reg) } } } } // Triggers may access values stored in the old.* or new.* pseudo-table. // This function returns a 32-bit bitmask indicating which columns of the // old.* or new.* tables actually are used by triggers. This information // may be used by the caller, for example, to avoid having to load the entire // old.* record into memory when executing an UPDATE or DELETE command. // // Bit 0 of the returned mask is set if the left-most column of the // table may be accessed using an [old|new].reference. Bit 1 is set if // the second leftmost column value is required, and so on. If there // are more than 32 columns in the table, and at least one of the columns // with an index greater than 32 may be accessed, 0xffffffff is returned. // // It is not possible to determine if the old.rowid or new.rowid column is // accessed by triggers. The caller must always assume that it is. // // Parameter isNew must be either 1 or 0. If it is 0, then the mask returned // applies to the old.* table. If 1, the new.* table. // // Parameter tr_tm must be a mask with one or both of the TRIGGER_BEFORE // and TRIGGER_AFTER bits set. Values accessed by BEFORE triggers are only // included in the returned mask if the TRIGGER_BEFORE bit is set in the // tr_tm parameter. Similarly, values accessed by AFTER triggers are only // included in the returned mask if the TRIGGER_AFTER bit is set in tr_tm. func Xsqlite3TriggerColmask(tls *libc.TLS, pParse uintptr, pTrigger uintptr, pChanges uintptr, isNew int32, tr_tm int32, pTab uintptr, orconf int32) U32 { var op int32 if pChanges != 0 { op = TK_UPDATE } else { op = TK_DELETE } var mask U32 = U32(0) var p uintptr for p = pTrigger; p != 0; p = (*Trigger)(unsafe.Pointer(p)).FpNext { if int32((*Trigger)(unsafe.Pointer(p)).Fop) == op && tr_tm&int32((*Trigger)(unsafe.Pointer(p)).Ftr_tm) != 0 && checkColumnOverlap(tls, (*Trigger)(unsafe.Pointer(p)).FpColumns, pChanges) != 0 { if (*Trigger)(unsafe.Pointer(p)).FbReturning != 0 { mask = 0xffffffff } else { var pPrg uintptr pPrg = getRowTrigger(tls, pParse, p, pTab, orconf) if pPrg != 0 { mask = mask | *(*U32)(unsafe.Pointer(pPrg + 28 + uintptr(isNew)*4)) } } } } return mask } // The most recently coded instruction was an OP_Column to retrieve the // i-th column of table pTab. This routine sets the P4 parameter of the // OP_Column to the default value, if any. // // The default value of a column is specified by a DEFAULT clause in the // column definition. This was either supplied by the user when the table // was created, or added later to the table definition by an ALTER TABLE // command. If the latter, then the row-records in the table btree on disk // may not contain a value for the column and the default value, taken // from the P4 parameter of the OP_Column instruction, is returned instead. // If the former, then all row-records are guaranteed to include a value // for the column and the P4 value is not required. // // Column definitions created by an ALTER TABLE command may only have // literal default values specified: a number, null or a string. (If a more // complicated default expression value was provided, it is evaluated // when the ALTER TABLE is executed and one of the literal values written // into the sqlite_schema table.) // // Therefore, the P4 parameter is only required if the default value for // the column is a literal number, string or null. The sqlite3ValueFromExpr() // function is capable of transforming these types of expressions into // sqlite3_value objects. // // If column as REAL affinity and the table is an ordinary b-tree table // (not a virtual table) then the value might have been stored as an // integer. In that case, add an OP_RealAffinity opcode to make sure // it has been converted into REAL. func Xsqlite3ColumnDefault(tls *libc.TLS, v uintptr, pTab uintptr, i int32, iReg int32) { bp := tls.Alloc(8) defer tls.Free(8) var pCol uintptr pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(i)*24 if (*Column)(unsafe.Pointer(pCol)).FiDflt != 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var enc U8 = (*Sqlite3)(unsafe.Pointer(Xsqlite3VdbeDb(tls, v))).Fenc Xsqlite3ValueFromExpr(tls, Xsqlite3VdbeDb(tls, v), Xsqlite3ColumnExpr(tls, pTab, pCol), enc, uint8((*Column)(unsafe.Pointer(pCol)).Faffinity), bp) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { Xsqlite3VdbeAppendP4(tls, v, *(*uintptr)(unsafe.Pointer(bp)), -10) } } if int32((*Column)(unsafe.Pointer(pCol)).Faffinity) == SQLITE_AFF_REAL && !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { Xsqlite3VdbeAddOp1(tls, v, OP_RealAffinity, iReg) } } func indexColumnIsBeingUpdated(tls *libc.TLS, pIdx uintptr, iCol int32, aXRef uintptr, chngRowid int32) int32 { var iIdxCol I16 = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(iCol)*2)) if int32(iIdxCol) >= 0 { return libc.Bool32(*(*int32)(unsafe.Pointer(aXRef + uintptr(iIdxCol)*4)) >= 0) } return Xsqlite3ExprReferencesUpdatedColumn(tls, (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr+8+uintptr(iCol)*32)).FpExpr, aXRef, chngRowid) } func indexWhereClauseMightChange(tls *libc.TLS, pIdx uintptr, aXRef uintptr, chngRowid int32) int32 { if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere == uintptr(0) { return 0 } return Xsqlite3ExprReferencesUpdatedColumn(tls, (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere, aXRef, chngRowid) } func exprRowColumn(tls *libc.TLS, pParse uintptr, iCol int32) uintptr { var pRet uintptr = Xsqlite3PExpr(tls, pParse, TK_ROW, uintptr(0), uintptr(0)) if pRet != 0 { (*Expr)(unsafe.Pointer(pRet)).FiColumn = YnVar(iCol + 1) } return pRet } func updateFromSelect(tls *libc.TLS, pParse uintptr, iEph int32, pPk uintptr, pChanges uintptr, pTabList uintptr, pWhere uintptr, pOrderBy uintptr, pLimit uintptr) { bp := tls.Alloc(40) defer tls.Free(40) var i int32 var pSelect uintptr = uintptr(0) var pList uintptr = uintptr(0) var pGrp uintptr = uintptr(0) var pLimit2 uintptr = uintptr(0) var pOrderBy2 uintptr = uintptr(0) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTab uintptr = (*SrcItem)(unsafe.Pointer(pTabList + 8)).FpTab var pSrc uintptr var pWhere2 uintptr var eDest int32 _ = pOrderBy _ = pLimit pSrc = Xsqlite3SrcListDup(tls, db, pTabList, 0) pWhere2 = Xsqlite3ExprDup(tls, db, pWhere, 0) if pSrc != 0 { libc.SetBitFieldPtr16Uint32(pSrc+8+60+4, uint32(1), 9, 0x200) (*SrcItem)(unsafe.Pointer(pSrc + 8)).FiCursor = -1 (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pSrc+8)).FpTab)).FnTabRef-- (*SrcItem)(unsafe.Pointer(pSrc + 8)).FpTab = uintptr(0) } if pPk != 0 { for i = 0; i < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol); i++ { var pNew uintptr = exprRowColumn(tls, pParse, int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2)))) pList = Xsqlite3ExprListAppend(tls, pParse, pList, pNew) } if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { eDest = SRT_Table } else { eDest = SRT_Upfrom } } else if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW { for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { pList = Xsqlite3ExprListAppend(tls, pParse, pList, exprRowColumn(tls, pParse, i)) } eDest = SRT_Table } else { if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { eDest = SRT_Table } else { eDest = SRT_Upfrom } pList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), Xsqlite3PExpr(tls, pParse, TK_ROW, uintptr(0), uintptr(0))) } if pChanges != 0 { for i = 0; i < (*ExprList)(unsafe.Pointer(pChanges)).FnExpr; i++ { pList = Xsqlite3ExprListAppend(tls, pParse, pList, Xsqlite3ExprDup(tls, db, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(i)*32)).FpExpr, 0)) } } pSelect = Xsqlite3SelectNew(tls, pParse, pList, pSrc, pWhere2, pGrp, uintptr(0), pOrderBy2, uint32(SF_UFSrcCheck|SF_IncludeHidden|SF_UpdateFrom), pLimit2) if pSelect != 0 { *(*U32)(unsafe.Pointer(pSelect + 4)) |= U32(SF_OrderByReqd) } Xsqlite3SelectDestInit(tls, bp, eDest, iEph) (*SelectDest)(unsafe.Pointer(bp)).FiSDParm2 = func() int32 { if pPk != 0 { return int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol) } return -1 }() Xsqlite3Select(tls, pParse, pSelect, bp) Xsqlite3SelectDelete(tls, db, pSelect) } // Process an UPDATE statement. // // UPDATE OR IGNORE tbl SET a=b, c=d FROM tbl2... WHERE e<5 AND f NOT NULL; // \_______/ \_/ \______/ \_____/ \________________/ // onError | pChanges | pWhere // \_______________________/ // pTabList func Xsqlite3Update(tls *libc.TLS, pParse uintptr, pTabList uintptr, pChanges uintptr, pWhere uintptr, onError int32, pOrderBy uintptr, pLimit uintptr, pUpsert uintptr) { bp := tls.Alloc(108) defer tls.Free(108) var i int32 var j int32 var k int32 var pTab uintptr var addrTop int32 var pWInfo uintptr var v uintptr var pIdx uintptr var pPk uintptr var nIdx int32 var nAllIdx int32 var iBaseCur int32 var iDataCur int32 var iIdxCur int32 var db uintptr var aRegIdx uintptr var aXRef uintptr var aToOpen uintptr var chngPk U8 var chngRowid U8 var chngKey U8 var pRowidExpr uintptr var iRowidExpr int32 var iDb int32 var eOnePass int32 var hasFK int32 var labelBreak int32 var labelContinue int32 var flags int32 var isView int32 var pTrigger uintptr var newmask int32 var iEph int32 var nKey int32 var addrOpen int32 var iPk int32 var nPk I16 var bFinishSeek int32 var nChangeFrom int32 var regRowCount int32 var regOldRowid int32 var regNewRowid int32 var regNew int32 var regOld int32 var regRowSet int32 var regKey int32 var rc int32 var hCol U8 var bProgress int32 var reg int32 var pKeyInfo uintptr var nEphCol int32 var iCur int32 var addrOnce int32 var colFlags U32 var oldmask U32 var nOff int32 addrTop = 0 pWInfo = uintptr(0) aRegIdx = uintptr(0) aXRef = uintptr(0) pRowidExpr = uintptr(0) iRowidExpr = -1 iEph = 0 nKey = 0 addrOpen = 0 iPk = 0 nPk = int16(0) *(*int32)(unsafe.Pointer(bp + 104)) = 0 bFinishSeek = 1 nChangeFrom = 0 regRowCount = 0 regOldRowid = 0 regNewRowid = 0 regNew = 0 regOld = 0 regRowSet = 0 regKey = 0 libc.Xmemset(tls, bp+16, 0, uint64(unsafe.Sizeof(AuthContext{}))) db = (*Parse)(unsafe.Pointer(pParse)).Fdb if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __1 } goto update_cleanup __1: ; pTab = Xsqlite3SrcListLookup(tls, pParse, pTabList) if !(pTab == uintptr(0)) { goto __2 } goto update_cleanup __2: ; iDb = Xsqlite3SchemaToIndex(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Table)(unsafe.Pointer(pTab)).FpSchema) pTrigger = Xsqlite3TriggersExist(tls, pParse, pTab, TK_UPDATE, pChanges, bp+32) isView = libc.Bool32(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) if (*SrcList)(unsafe.Pointer(pTabList)).FnSrc > 1 { nChangeFrom = (*ExprList)(unsafe.Pointer(pChanges)).FnExpr } else { nChangeFrom = 0 } if !(Xsqlite3ViewGetColumnNames(tls, pParse, pTab) != 0) { goto __3 } goto update_cleanup __3: ; if !(Xsqlite3IsReadOnly(tls, pParse, pTab, *(*int32)(unsafe.Pointer(bp + 32))) != 0) { goto __4 } goto update_cleanup __4: ; iBaseCur = libc.AssignInt32(&iDataCur, libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1)) iIdxCur = iDataCur + 1 if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { pPk = uintptr(0) } else { pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) } nIdx = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __5: if !(pIdx != 0) { goto __7 } if !(pPk == pIdx) { goto __8 } iDataCur = (*Parse)(unsafe.Pointer(pParse)).FnTab __8: ; (*Parse)(unsafe.Pointer(pParse)).FnTab++ goto __6 __6: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext nIdx++ goto __5 goto __7 __7: ; if !(pUpsert != 0) { goto __9 } iDataCur = (*Upsert)(unsafe.Pointer(pUpsert)).FiDataCur iIdxCur = (*Upsert)(unsafe.Pointer(pUpsert)).FiIdxCur (*Parse)(unsafe.Pointer(pParse)).FnTab = iBaseCur __9: ; (*SrcItem)(unsafe.Pointer(pTabList + 8)).FiCursor = iDataCur aXRef = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(int32(0)))*uint64(int32((*Table)(unsafe.Pointer(pTab)).FnCol)+nIdx+1)+uint64(nIdx)+uint64(2)) if !(aXRef == uintptr(0)) { goto __10 } goto update_cleanup __10: ; aRegIdx = aXRef + uintptr((*Table)(unsafe.Pointer(pTab)).FnCol)*4 aToOpen = aRegIdx + uintptr(nIdx)*4 + uintptr(1)*4 libc.Xmemset(tls, aToOpen, 1, uint64(nIdx+1)) *(*U8)(unsafe.Pointer(aToOpen + uintptr(nIdx+1))) = U8(0) i = 0 __11: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __13 } *(*int32)(unsafe.Pointer(aXRef + uintptr(i)*4)) = -1 goto __12 __12: i++ goto __11 goto __13 __13: ; libc.Xmemset(tls, bp+40, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 40)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp + 40)).FpSrcList = pTabList *(*uintptr)(unsafe.Pointer(bp + 40 + 16)) = pUpsert (*NameContext)(unsafe.Pointer(bp + 40)).FncFlags = NC_UUpsert v = Xsqlite3GetVdbe(tls, pParse) if !(v == uintptr(0)) { goto __14 } goto update_cleanup __14: ; chngRowid = libc.AssignUint8(&chngPk, U8(0)) i = 0 __15: if !(i < (*ExprList)(unsafe.Pointer(pChanges)).FnExpr) { goto __17 } hCol = Xsqlite3StrIHash(tls, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(i)*32)).FzEName) if !(nChangeFrom == 0 && Xsqlite3ResolveExprNames(tls, bp+40, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(i)*32)).FpExpr) != 0) { goto __18 } goto update_cleanup __18: ; j = 0 __19: if !(j < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __21 } if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FhName) == int32(hCol) && Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FzCnName, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(i)*32)).FzEName) == 0) { goto __22 } if !(j == int32((*Table)(unsafe.Pointer(pTab)).FiPKey)) { goto __23 } chngRowid = U8(1) pRowidExpr = (*ExprList_item)(unsafe.Pointer(pChanges + 8 + uintptr(i)*32)).FpExpr iRowidExpr = i goto __24 __23: if !(pPk != 0 && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_PRIMKEY != 0) { goto __25 } chngPk = U8(1) goto __26 __25: if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_GENERATED != 0) { goto __27 } Xsqlite3ErrorMsg(tls, pParse, ts+21908, libc.VaList(bp, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FzCnName)) goto update_cleanup __27: ; __26: ; __24: ; *(*int32)(unsafe.Pointer(aXRef + uintptr(j)*4)) = i goto __21 __22: ; goto __20 __20: j++ goto __19 goto __21 __21: ; if !(j >= int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __28 } if !(pPk == uintptr(0) && Xsqlite3IsRowid(tls, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(i)*32)).FzEName) != 0) { goto __29 } j = -1 chngRowid = U8(1) pRowidExpr = (*ExprList_item)(unsafe.Pointer(pChanges + 8 + uintptr(i)*32)).FpExpr iRowidExpr = i goto __30 __29: Xsqlite3ErrorMsg(tls, pParse, ts+21944, libc.VaList(bp+8, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(i)*32)).FzEName)) (*Parse)(unsafe.Pointer(pParse)).FcheckSchema = U8(1) goto update_cleanup __30: ; __28: ; rc = Xsqlite3AuthCheck(tls, pParse, SQLITE_UPDATE, (*Table)(unsafe.Pointer(pTab)).FzName, func() uintptr { if j < 0 { return ts + 9065 } return (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(j)*24)).FzCnName }(), (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) if !(rc == SQLITE_DENY) { goto __31 } goto update_cleanup goto __32 __31: if !(rc == SQLITE_IGNORE) { goto __33 } *(*int32)(unsafe.Pointer(aXRef + uintptr(j)*4)) = -1 __33: ; __32: ; goto __16 __16: i++ goto __15 goto __17 __17: ; chngKey = U8(int32(chngRowid) + int32(chngPk)) if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated) != 0) { goto __34 } __35: bProgress = 0 i = 0 __38: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __40 } if !(*(*int32)(unsafe.Pointer(aXRef + uintptr(i)*4)) >= 0) { goto __41 } goto __39 __41: ; if !(int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).FcolFlags)&COLFLAG_GENERATED == 0) { goto __42 } goto __39 __42: ; if !(Xsqlite3ExprReferencesUpdatedColumn(tls, Xsqlite3ColumnExpr(tls, pTab, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24), aXRef, int32(chngRowid)) != 0) { goto __43 } *(*int32)(unsafe.Pointer(aXRef + uintptr(i)*4)) = 99999 bProgress = 1 __43: ; goto __39 __39: i++ goto __38 goto __40 __40: ; goto __36 __36: if bProgress != 0 { goto __35 } goto __37 __37: ; __34: ; (*SrcItem)(unsafe.Pointer(pTabList + 8)).FcolUsed = func() uint64 { if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { return libc.Uint64(libc.Uint64FromInt32(-1)) } return uint64(0) }() hasFK = Xsqlite3FkRequired(tls, pParse, pTab, aXRef, int32(chngKey)) if !(onError == OE_Replace) { goto __44 } *(*int32)(unsafe.Pointer(bp + 104)) = 1 __44: ; nAllIdx = 0 pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex __45: if !(pIdx != 0) { goto __47 } if !(chngKey != 0 || hasFK > 1 || pIdx == pPk || indexWhereClauseMightChange(tls, pIdx, aXRef, int32(chngRowid)) != 0) { goto __48 } reg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) goto __49 __48: reg = 0 i = 0 __50: if !(i < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol)) { goto __52 } if !(indexColumnIsBeingUpdated(tls, pIdx, i, aXRef, int32(chngRowid)) != 0) { goto __53 } reg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) if !(onError == OE_Default && int32((*Index)(unsafe.Pointer(pIdx)).FonError) == OE_Replace) { goto __54 } *(*int32)(unsafe.Pointer(bp + 104)) = 1 __54: ; goto __52 __53: ; goto __51 __51: i++ goto __50 goto __52 __52: ; __49: ; if !(reg == 0) { goto __55 } *(*U8)(unsafe.Pointer(aToOpen + uintptr(nAllIdx+1))) = U8(0) __55: ; *(*int32)(unsafe.Pointer(aRegIdx + uintptr(nAllIdx)*4)) = reg goto __46 __46: pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext nAllIdx++ goto __45 goto __47 __47: ; *(*int32)(unsafe.Pointer(aRegIdx + uintptr(nAllIdx)*4)) = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) if !(*(*int32)(unsafe.Pointer(bp + 104)) != 0) { goto __56 } libc.Xmemset(tls, aToOpen, 1, uint64(nIdx+1)) __56: ; if !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0) { goto __57 } Xsqlite3VdbeCountChanges(tls, v) __57: ; Xsqlite3BeginWriteOperation(tls, pParse, libc.Bool32(pTrigger != 0 || hasFK != 0), iDb) if !!(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __58 } regRowSet = *(*int32)(unsafe.Pointer(aRegIdx + uintptr(nAllIdx)*4)) regOldRowid = libc.AssignInt32(®NewRowid, libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1)) if !(chngPk != 0 || pTrigger != 0 || hasFK != 0) { goto __59 } regOld = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Table)(unsafe.Pointer(pTab)).FnCol) __59: ; if !(chngKey != 0 || pTrigger != 0 || hasFK != 0) { goto __60 } regNewRowid = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) __60: ; regNew = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += int32((*Table)(unsafe.Pointer(pTab)).FnCol) __58: ; if !(isView != 0) { goto __61 } Xsqlite3AuthContextPush(tls, pParse, bp+16, (*Table)(unsafe.Pointer(pTab)).FzName) __61: ; if !(nChangeFrom == 0 && isView != 0) { goto __62 } Xsqlite3MaterializeView(tls, pParse, pTab, pWhere, pOrderBy, pLimit, iDataCur) pOrderBy = uintptr(0) pLimit = uintptr(0) __62: ; if !(nChangeFrom == 0 && Xsqlite3ResolveExprNames(tls, bp+40, pWhere) != 0) { goto __63 } goto update_cleanup __63: ; if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __64 } updateVirtualTable(tls, pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, pWhere, onError) goto update_cleanup __64: ; labelContinue = libc.AssignInt32(&labelBreak, Xsqlite3VdbeMakeLabel(tls, pParse)) if !((*Sqlite3)(unsafe.Pointer(db)).Fflags&(uint64(0x00001)<<32) != uint64(0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FpTriggerTab) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FbReturning) != 0) && pUpsert == uintptr(0)) { goto __65 } regRowCount = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regRowCount) __65: ; if !(nChangeFrom == 0 && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __66 } Xsqlite3VdbeAddOp3(tls, v, OP_Null, 0, regRowSet, regOldRowid) iEph = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) addrOpen = Xsqlite3VdbeAddOp3(tls, v, OP_OpenEphemeral, iEph, 0, regRowSet) goto __67 __66: ; if pPk != 0 { nPk = int16((*Index)(unsafe.Pointer(pPk)).FnKeyCol) } else { nPk = int16(0) } iPk = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += int32(nPk) *(*int32)(unsafe.Pointer(pParse + 56)) += nChangeFrom regKey = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) if !(pUpsert == uintptr(0)) { goto __68 } nEphCol = int32(nPk) + nChangeFrom + func() int32 { if isView != 0 { return int32((*Table)(unsafe.Pointer(pTab)).FnCol) } return 0 }() iEph = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) if !(pPk != 0) { goto __69 } Xsqlite3VdbeAddOp3(tls, v, OP_Null, 0, iPk, iPk+int32(nPk)-1) __69: ; addrOpen = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, iEph, nEphCol) if !(pPk != 0) { goto __70 } pKeyInfo = Xsqlite3KeyInfoOfIndex(tls, pParse, pPk) if !(pKeyInfo != 0) { goto __71 } (*KeyInfo)(unsafe.Pointer(pKeyInfo)).FnAllField = U16(nEphCol) Xsqlite3VdbeAppendP4(tls, v, pKeyInfo, -8) __71: ; __70: ; if !(nChangeFrom != 0) { goto __72 } updateFromSelect(tls, pParse, iEph, pPk, pChanges, pTabList, pWhere, pOrderBy, pLimit) if !(isView != 0) { goto __73 } iDataCur = iEph __73: ; __72: ; __68: ; __67: ; if !(nChangeFrom != 0) { goto __74 } Xsqlite3MultiWrite(tls, pParse) eOnePass = ONEPASS_OFF nKey = int32(nPk) regKey = iPk goto __75 __74: if !(pUpsert != 0) { goto __76 } pWInfo = uintptr(0) eOnePass = ONEPASS_SINGLE Xsqlite3ExprIfFalse(tls, pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL) bFinishSeek = 0 goto __77 __76: flags = WHERE_ONEPASS_DESIRED if !(!(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0) && !(pTrigger != 0) && !(hasFK != 0) && !(chngKey != 0) && !(*(*int32)(unsafe.Pointer(bp + 104)) != 0) && (*NameContext)(unsafe.Pointer(bp+40)).FncFlags&NC_Subquery == 0) { goto __78 } flags = flags | WHERE_ONEPASS_MULTIROW __78: ; pWInfo = Xsqlite3WhereBegin(tls, pParse, pTabList, pWhere, uintptr(0), uintptr(0), uintptr(0), uint16(flags), iIdxCur) if !(pWInfo == uintptr(0)) { goto __79 } goto update_cleanup __79: ; eOnePass = Xsqlite3WhereOkOnePass(tls, pWInfo, bp+96) bFinishSeek = Xsqlite3WhereUsesDeferredSeek(tls, pWInfo) if !(eOnePass != ONEPASS_SINGLE) { goto __80 } Xsqlite3MultiWrite(tls, pParse) if !(eOnePass == ONEPASS_MULTI) { goto __81 } iCur = *(*int32)(unsafe.Pointer(bp + 96 + 1*4)) if !(iCur >= 0 && iCur != iDataCur && *(*U8)(unsafe.Pointer(aToOpen + uintptr(iCur-iBaseCur))) != 0) { goto __82 } eOnePass = ONEPASS_OFF __82: ; __81: ; __80: ; __77: ; if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __83 } Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iDataCur, regOldRowid) if !(eOnePass == ONEPASS_OFF) { goto __85 } *(*int32)(unsafe.Pointer(aRegIdx + uintptr(nAllIdx)*4)) = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, iEph, regRowSet, regOldRowid) goto __86 __85: if !(addrOpen != 0) { goto __87 } Xsqlite3VdbeChangeToNoop(tls, v, addrOpen) __87: ; __86: ; goto __84 __83: i = 0 __88: if !(i < int32(nPk)) { goto __90 } Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iDataCur, int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2))), iPk+i) goto __89 __89: i++ goto __88 goto __90 __90: ; if !(eOnePass != 0) { goto __91 } if !(addrOpen != 0) { goto __93 } Xsqlite3VdbeChangeToNoop(tls, v, addrOpen) __93: ; nKey = int32(nPk) regKey = iPk goto __92 __91: Xsqlite3VdbeAddOp4(tls, v, OP_MakeRecord, iPk, int32(nPk), regKey, Xsqlite3IndexAffinityStr(tls, db, pPk), int32(nPk)) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, iEph, regKey, iPk, int32(nPk)) __92: ; __84: ; __75: ; if !(pUpsert == uintptr(0)) { goto __94 } if !(nChangeFrom == 0 && eOnePass != ONEPASS_MULTI) { goto __95 } Xsqlite3WhereEnd(tls, pWInfo) __95: ; if !!(isView != 0) { goto __96 } addrOnce = 0 if !(eOnePass != ONEPASS_OFF) { goto __97 } if !(*(*int32)(unsafe.Pointer(bp + 96)) >= 0) { goto __98 } *(*U8)(unsafe.Pointer(aToOpen + uintptr(*(*int32)(unsafe.Pointer(bp + 96))-iBaseCur))) = U8(0) __98: ; if !(*(*int32)(unsafe.Pointer(bp + 96 + 1*4)) >= 0) { goto __99 } *(*U8)(unsafe.Pointer(aToOpen + uintptr(*(*int32)(unsafe.Pointer(bp + 96 + 1*4))-iBaseCur))) = U8(0) __99: ; __97: ; if !(eOnePass == ONEPASS_MULTI && nIdx-libc.Bool32(*(*int32)(unsafe.Pointer(bp + 96 + 1*4)) >= 0) > 0) { goto __100 } addrOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) __100: ; Xsqlite3OpenTableAndIndices(tls, pParse, pTab, OP_OpenWrite, uint8(0), iBaseCur, aToOpen, uintptr(0), uintptr(0)) if !(addrOnce != 0) { goto __101 } Xsqlite3VdbeJumpHereOrPopInst(tls, v, addrOnce) __101: ; __96: ; if !(eOnePass != ONEPASS_OFF) { goto __102 } if !(*(*int32)(unsafe.Pointer(bp + 96)) != iDataCur && *(*int32)(unsafe.Pointer(bp + 96 + 1*4)) != iDataCur) { goto __104 } Xsqlite3VdbeAddOp4Int(tls, v, OP_NotFound, iDataCur, labelBreak, regKey, nKey) __104: ; if !(eOnePass != ONEPASS_SINGLE) { goto __105 } labelContinue = Xsqlite3VdbeMakeLabel(tls, pParse) __105: ; Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, func() int32 { if pPk != 0 { return regKey } return regOldRowid }(), labelBreak) goto __103 __102: if !(pPk != 0 || nChangeFrom != 0) { goto __106 } labelContinue = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, iEph, labelBreak) addrTop = Xsqlite3VdbeCurrentAddr(tls, v) if !(nChangeFrom != 0) { goto __108 } if !!(isView != 0) { goto __110 } if !(pPk != 0) { goto __111 } i = 0 __113: if !(i < int32(nPk)) { goto __115 } Xsqlite3VdbeAddOp3(tls, v, OP_Column, iEph, i, iPk+i) goto __114 __114: i++ goto __113 goto __115 __115: ; Xsqlite3VdbeAddOp4Int(tls, v, OP_NotFound, iDataCur, labelContinue, iPk, int32(nPk)) goto __112 __111: Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iEph, regOldRowid) Xsqlite3VdbeAddOp3(tls, v, OP_NotExists, iDataCur, labelContinue, regOldRowid) __112: ; __110: ; goto __109 __108: Xsqlite3VdbeAddOp2(tls, v, OP_RowData, iEph, regKey) Xsqlite3VdbeAddOp4Int(tls, v, OP_NotFound, iDataCur, labelContinue, regKey, 0) __109: ; goto __107 __106: Xsqlite3VdbeAddOp2(tls, v, OP_Rewind, iEph, labelBreak) labelContinue = Xsqlite3VdbeMakeLabel(tls, pParse) addrTop = Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iEph, regOldRowid) Xsqlite3VdbeAddOp3(tls, v, OP_NotExists, iDataCur, labelContinue, regOldRowid) __107: ; __103: ; __94: ; if !(chngRowid != 0) { goto __116 } if !(nChangeFrom == 0) { goto __117 } Xsqlite3ExprCode(tls, pParse, pRowidExpr, regNewRowid) goto __118 __117: Xsqlite3VdbeAddOp3(tls, v, OP_Column, iEph, iRowidExpr, regNewRowid) __118: ; Xsqlite3VdbeAddOp1(tls, v, OP_MustBeInt, regNewRowid) __116: ; if !(chngPk != 0 || hasFK != 0 || pTrigger != 0) { goto __119 } oldmask = func() uint32 { if hasFK != 0 { return Xsqlite3FkOldmask(tls, pParse, pTab) } return uint32(0) }() oldmask = oldmask | Xsqlite3TriggerColmask(tls, pParse, pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError) i = 0 __120: if !(i < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __122 } colFlags = U32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(i)*24)).FcolFlags) k = int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(i))) + regOld if !(oldmask == 0xffffffff || i < 32 && oldmask&(uint32(1)<= 0) { goto __134 } if !(nChangeFrom != 0) { goto __136 } nOff = func() int32 { if isView != 0 { return int32((*Table)(unsafe.Pointer(pTab)).FnCol) } return int32(nPk) }() Xsqlite3VdbeAddOp3(tls, v, OP_Column, iEph, nOff+j, k) goto __137 __136: Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(j)*32)).FpExpr, k) __137: ; goto __135 __134: if !(0 == *(*int32)(unsafe.Pointer(bp + 32))&TRIGGER_BEFORE || i > 31 || uint32(newmask)&(uint32(1)< 1 || chngKey != 0 { return 0 } return OPFLAG_ISNOOP }(), regNewRowid) if !(eOnePass == ONEPASS_MULTI) { goto __159 } Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_SAVEPOSITION)) __159: ; if !!(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) != 0) { goto __160 } Xsqlite3VdbeAppendP4(tls, v, pTab, -5) __160: ; if !(hasFK != 0) { goto __161 } Xsqlite3FkCheck(tls, pParse, pTab, 0, regNewRowid, aXRef, int32(chngKey)) __161: ; Xsqlite3CompleteInsertion(tls, pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx, OPFLAG_ISUPDATE|func() int32 { if eOnePass == ONEPASS_MULTI { return OPFLAG_SAVEPOSITION } return 0 }(), 0, 0) if !(hasFK != 0) { goto __162 } Xsqlite3FkActions(tls, pParse, pTab, pChanges, regOldRowid, aXRef, int32(chngKey)) __162: ; __153: ; if !(regRowCount != 0) { goto __163 } Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, regRowCount, 1) __163: ; Xsqlite3CodeRowTrigger(tls, pParse, pTrigger, TK_UPDATE, pChanges, TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue) if !(eOnePass == ONEPASS_SINGLE) { goto __164 } goto __165 __164: if !(eOnePass == ONEPASS_MULTI) { goto __166 } Xsqlite3VdbeResolveLabel(tls, v, labelContinue) Xsqlite3WhereEnd(tls, pWInfo) goto __167 __166: Xsqlite3VdbeResolveLabel(tls, v, labelContinue) Xsqlite3VdbeAddOp2(tls, v, OP_Next, iEph, addrTop) __167: ; __165: ; Xsqlite3VdbeResolveLabel(tls, v, labelBreak) if !(int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0 && (*Parse)(unsafe.Pointer(pParse)).FpTriggerTab == uintptr(0) && pUpsert == uintptr(0)) { goto __168 } Xsqlite3AutoincrementEnd(tls, pParse) __168: ; if !(regRowCount != 0) { goto __169 } Xsqlite3CodeChangeCount(tls, v, regRowCount, ts+21963) __169: ; update_cleanup: Xsqlite3AuthContextPop(tls, bp+16) Xsqlite3DbFree(tls, db, aXRef) Xsqlite3SrcListDelete(tls, db, pTabList) Xsqlite3ExprListDelete(tls, db, pChanges) Xsqlite3ExprDelete(tls, db, pWhere) return } func updateVirtualTable(tls *libc.TLS, pParse uintptr, pSrc uintptr, pTab uintptr, pChanges uintptr, pRowid uintptr, aXRef uintptr, pWhere uintptr, onError int32) { bp := tls.Alloc(8) defer tls.Free(8) var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var ephemTab int32 var i int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pVTab uintptr = Xsqlite3GetVTable(tls, db, pTab) var pWInfo uintptr = uintptr(0) var nArg int32 = 2 + int32((*Table)(unsafe.Pointer(pTab)).FnCol) var regArg int32 var regRec int32 var regRowid int32 var iCsr int32 = (*SrcItem)(unsafe.Pointer(pSrc + 8)).FiCursor var eOnePass int32 var addr int32 ephemTab = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) addr = Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, ephemTab, nArg) regArg = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nArg if (*SrcList)(unsafe.Pointer(pSrc)).FnSrc > 1 { var pPk uintptr = uintptr(0) var pRow uintptr var pList uintptr if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { if pRowid != 0 { pRow = Xsqlite3ExprDup(tls, db, pRowid, 0) } else { pRow = Xsqlite3PExpr(tls, pParse, TK_ROW, uintptr(0), uintptr(0)) } } else { var iPk I16 pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) iPk = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn)) if *(*int32)(unsafe.Pointer(aXRef + uintptr(iPk)*4)) >= 0 { pRow = Xsqlite3ExprDup(tls, db, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(*(*int32)(unsafe.Pointer(aXRef + uintptr(iPk)*4)))*32)).FpExpr, 0) } else { pRow = exprRowColumn(tls, pParse, int32(iPk)) } } pList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), pRow) for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if *(*int32)(unsafe.Pointer(aXRef + uintptr(i)*4)) >= 0 { pList = Xsqlite3ExprListAppend(tls, pParse, pList, Xsqlite3ExprDup(tls, db, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(*(*int32)(unsafe.Pointer(aXRef + uintptr(i)*4)))*32)).FpExpr, 0)) } else { pList = Xsqlite3ExprListAppend(tls, pParse, pList, exprRowColumn(tls, pParse, i)) } } updateFromSelect(tls, pParse, ephemTab, pPk, pList, pSrc, pWhere, uintptr(0), uintptr(0)) Xsqlite3ExprListDelete(tls, db, pList) eOnePass = ONEPASS_OFF } else { regRec = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regRowid = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) pWInfo = Xsqlite3WhereBegin(tls, pParse, pSrc, pWhere, uintptr(0), uintptr(0), uintptr(0), uint16(WHERE_ONEPASS_DESIRED), 0) if pWInfo == uintptr(0) { return } for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if *(*int32)(unsafe.Pointer(aXRef + uintptr(i)*4)) >= 0 { Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pChanges+8+uintptr(*(*int32)(unsafe.Pointer(aXRef + uintptr(i)*4)))*32)).FpExpr, regArg+2+i) } else { Xsqlite3VdbeAddOp3(tls, v, OP_VColumn, iCsr, i, regArg+2+i) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_NOCHNG)) } } if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iCsr, regArg) if pRowid != 0 { Xsqlite3ExprCode(tls, pParse, pRowid, regArg+1) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iCsr, regArg+1) } } else { var pPk uintptr var iPk I16 pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) iPk = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn)) Xsqlite3VdbeAddOp3(tls, v, OP_VColumn, iCsr, int32(iPk), regArg) Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, regArg+2+int32(iPk), regArg+1) } eOnePass = Xsqlite3WhereOkOnePass(tls, pWInfo, bp) if eOnePass != 0 { Xsqlite3VdbeChangeToNoop(tls, v, addr) Xsqlite3VdbeAddOp1(tls, v, OP_Close, iCsr) } else { Xsqlite3MultiWrite(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regArg, nArg, regRec) Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, ephemTab, regRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, ephemTab, regRec, regRowid) } } if eOnePass == ONEPASS_OFF { if (*SrcList)(unsafe.Pointer(pSrc)).FnSrc == 1 { Xsqlite3WhereEnd(tls, pWInfo) } addr = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, ephemTab) for i = 0; i < nArg; i++ { Xsqlite3VdbeAddOp3(tls, v, OP_Column, ephemTab, i, regArg+i) } } Xsqlite3VtabMakeWritable(tls, pParse, pTab) Xsqlite3VdbeAddOp4(tls, v, OP_VUpdate, 0, nArg, regArg, pVTab, -11) Xsqlite3VdbeChangeP5(tls, v, func() uint16 { if onError == OE_Default { return uint16(OE_Abort) } return uint16(onError) }()) Xsqlite3MayAbort(tls, pParse) if eOnePass == ONEPASS_OFF { Xsqlite3VdbeAddOp2(tls, v, OP_Next, ephemTab, addr+1) Xsqlite3VdbeJumpHere(tls, v, addr) Xsqlite3VdbeAddOp2(tls, v, OP_Close, ephemTab, 0) } else { Xsqlite3WhereEnd(tls, pWInfo) } } func upsertDelete(tls *libc.TLS, db uintptr, p uintptr) { for __ccgo := true; __ccgo; __ccgo = p != 0 { var pNext uintptr = (*Upsert)(unsafe.Pointer(p)).FpNextUpsert Xsqlite3ExprListDelete(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertTarget) Xsqlite3ExprDelete(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertTargetWhere) Xsqlite3ExprListDelete(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertSet) Xsqlite3ExprDelete(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertWhere) Xsqlite3DbFree(tls, db, (*Upsert)(unsafe.Pointer(p)).FpToFree) Xsqlite3DbFree(tls, db, p) p = pNext } } func Xsqlite3UpsertDelete(tls *libc.TLS, db uintptr, p uintptr) { if p != 0 { upsertDelete(tls, db, p) } } // Duplicate an Upsert object. func Xsqlite3UpsertDup(tls *libc.TLS, db uintptr, p uintptr) uintptr { if p == uintptr(0) { return uintptr(0) } return Xsqlite3UpsertNew(tls, db, Xsqlite3ExprListDup(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertTarget, 0), Xsqlite3ExprDup(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertTargetWhere, 0), Xsqlite3ExprListDup(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertSet, 0), Xsqlite3ExprDup(tls, db, (*Upsert)(unsafe.Pointer(p)).FpUpsertWhere, 0), Xsqlite3UpsertDup(tls, db, (*Upsert)(unsafe.Pointer(p)).FpNextUpsert)) } // Create a new Upsert object. func Xsqlite3UpsertNew(tls *libc.TLS, db uintptr, pTarget uintptr, pTargetWhere uintptr, pSet uintptr, pWhere uintptr, pNext uintptr) uintptr { var pNew uintptr pNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Upsert{}))) if pNew == uintptr(0) { Xsqlite3ExprListDelete(tls, db, pTarget) Xsqlite3ExprDelete(tls, db, pTargetWhere) Xsqlite3ExprListDelete(tls, db, pSet) Xsqlite3ExprDelete(tls, db, pWhere) Xsqlite3UpsertDelete(tls, db, pNext) return uintptr(0) } else { (*Upsert)(unsafe.Pointer(pNew)).FpUpsertTarget = pTarget (*Upsert)(unsafe.Pointer(pNew)).FpUpsertTargetWhere = pTargetWhere (*Upsert)(unsafe.Pointer(pNew)).FpUpsertSet = pSet (*Upsert)(unsafe.Pointer(pNew)).FpUpsertWhere = pWhere (*Upsert)(unsafe.Pointer(pNew)).FisDoUpdate = U8(libc.Bool32(pSet != uintptr(0))) (*Upsert)(unsafe.Pointer(pNew)).FpNextUpsert = pNext } return pNew } // Analyze the ON CONFLICT clause described by pUpsert. Resolve all // symbols in the conflict-target. // // Return SQLITE_OK if everything works, or an error code is something // is wrong. func Xsqlite3UpsertAnalyzeTarget(tls *libc.TLS, pParse uintptr, pTabList uintptr, pUpsert uintptr) int32 { bp := tls.Alloc(232) defer tls.Free(232) var pTab uintptr var rc int32 var iCursor int32 var pIdx uintptr var pTarget uintptr var pTerm uintptr var nClause int32 = 0 libc.Xmemset(tls, bp+16, 0, uint64(unsafe.Sizeof(NameContext{}))) (*NameContext)(unsafe.Pointer(bp + 16)).FpParse = pParse (*NameContext)(unsafe.Pointer(bp + 16)).FpSrcList = pTabList __1: if !(pUpsert != 0 && (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget != 0) { goto __3 } { rc = Xsqlite3ResolveExprListNames(tls, bp+16, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget) if rc != 0 { return rc } rc = Xsqlite3ResolveExprNames(tls, bp+16, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTargetWhere) if rc != 0 { return rc } pTab = (*SrcItem)(unsafe.Pointer(pTabList + 8)).FpTab pTarget = (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget iCursor = (*SrcItem)(unsafe.Pointer(pTabList + 8)).FiCursor if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) && (*ExprList)(unsafe.Pointer(pTarget)).FnExpr == 1 && int32((*Expr)(unsafe.Pointer(libc.AssignUintptr(&pTerm, (*ExprList_item)(unsafe.Pointer(pTarget+8)).FpExpr))).Fop) == TK_COLUMN && int32((*Expr)(unsafe.Pointer(pTerm)).FiColumn) == -1 { goto __2 } libc.Xmemset(tls, bp+72, 0, uint64(unsafe.Sizeof([2]Expr{}))) (*Expr)(unsafe.Pointer(bp + 72)).Fop = U8(TK_COLLATE) (*Expr)(unsafe.Pointer(bp + 72)).FpLeft = bp + 72 + 1*72 (*Expr)(unsafe.Pointer(bp + 72 + 1*72)).Fop = U8(TK_COLUMN) (*Expr)(unsafe.Pointer(bp + 72 + 1*72)).FiTable = (*SrcItem)(unsafe.Pointer(pTabList + 8)).FiCursor for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { var ii int32 var jj int32 var nn int32 if !(int32((*Index)(unsafe.Pointer(pIdx)).FonError) != OE_None) { continue } if (*ExprList)(unsafe.Pointer(pTarget)).FnExpr != int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) { continue } if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != 0 { if (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTargetWhere == uintptr(0) { continue } if Xsqlite3ExprCompare(tls, pParse, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTargetWhere, (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere, iCursor) != 0 { continue } } nn = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) for ii = 0; ii < nn; ii++ { var pExpr uintptr *(*uintptr)(unsafe.Pointer(bp + 72 + 8)) = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(ii)*8)) if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(ii)*2))) == -2 { pExpr = (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr + 8 + uintptr(ii)*32)).FpExpr if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLLATE { (*Expr)(unsafe.Pointer(bp + 72)).FpLeft = pExpr pExpr = bp + 72 } } else { (*Expr)(unsafe.Pointer(bp + 72)).FpLeft = bp + 72 + 1*72 (*Expr)(unsafe.Pointer(bp + 72 + 1*72)).FiColumn = *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(ii)*2)) pExpr = bp + 72 } for jj = 0; jj < nn; jj++ { if Xsqlite3ExprCompare(tls, pParse, (*ExprList_item)(unsafe.Pointer(pTarget+8+uintptr(jj)*32)).FpExpr, pExpr, iCursor) < 2 { break } } if jj >= nn { break } } if ii < nn { continue } (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertIdx = pIdx break } if (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertIdx == uintptr(0) { if nClause == 0 && (*Upsert)(unsafe.Pointer(pUpsert)).FpNextUpsert == uintptr(0) { *(*int8)(unsafe.Pointer(bp + 216)) = int8(0) } else { Xsqlite3_snprintf(tls, int32(unsafe.Sizeof([16]int8{})), bp+216, ts+21976, libc.VaList(bp, nClause+1)) } Xsqlite3ErrorMsg(tls, pParse, ts+21980, libc.VaList(bp+8, bp+216)) return SQLITE_ERROR } } goto __2 __2: pUpsert = (*Upsert)(unsafe.Pointer(pUpsert)).FpNextUpsert nClause++ goto __1 goto __3 __3: ; return SQLITE_OK } // Return true if pUpsert is the last ON CONFLICT clause with a // conflict target, or if pUpsert is followed by another ON CONFLICT // clause that targets the INTEGER PRIMARY KEY. func Xsqlite3UpsertNextIsIPK(tls *libc.TLS, pUpsert uintptr) int32 { var pNext uintptr if pUpsert == uintptr(0) { return 0 } pNext = (*Upsert)(unsafe.Pointer(pUpsert)).FpNextUpsert if pNext == uintptr(0) { return 1 } if (*Upsert)(unsafe.Pointer(pNext)).FpUpsertTarget == uintptr(0) { return 1 } if (*Upsert)(unsafe.Pointer(pNext)).FpUpsertIdx == uintptr(0) { return 1 } return 0 } // Given the list of ON CONFLICT clauses described by pUpsert, and // a particular index pIdx, return a pointer to the particular ON CONFLICT // clause that applies to the index. Or, if the index is not subject to // any ON CONFLICT clause, return NULL. func Xsqlite3UpsertOfIndex(tls *libc.TLS, pUpsert uintptr, pIdx uintptr) uintptr { for pUpsert != 0 && (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertTarget != uintptr(0) && (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertIdx != pIdx { pUpsert = (*Upsert)(unsafe.Pointer(pUpsert)).FpNextUpsert } return pUpsert } // Generate bytecode that does an UPDATE as part of an upsert. // // If pIdx is NULL, then the UNIQUE constraint that failed was the IPK. // In this case parameter iCur is a cursor open on the table b-tree that // currently points to the conflicting table row. Otherwise, if pIdx // is not NULL, then pIdx is the constraint that failed and iCur is a // cursor points to the conflicting row. func Xsqlite3UpsertDoUpdate(tls *libc.TLS, pParse uintptr, pUpsert uintptr, pTab uintptr, pIdx uintptr, iCur int32) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pSrc uintptr var iDataCur int32 var i int32 var pTop uintptr = pUpsert iDataCur = (*Upsert)(unsafe.Pointer(pUpsert)).FiDataCur pUpsert = Xsqlite3UpsertOfIndex(tls, pTop, pIdx) if pIdx != 0 && iCur != iDataCur { if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { var regRowid int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_IdxRowid, iCur, regRowid) Xsqlite3VdbeAddOp3(tls, v, OP_SeekRowid, iDataCur, 0, regRowid) Xsqlite3ReleaseTempReg(tls, pParse, regRowid) } else { var pPk uintptr = Xsqlite3PrimaryKeyIndex(tls, pTab) var nPk int32 = int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol) var iPk int32 = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nPk for i = 0; i < nPk; i++ { var k int32 k = int32(Xsqlite3TableColumnToIndex(tls, pIdx, *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(i)*2)))) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iCur, k, iPk+i) } i = Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, iDataCur, 0, iPk, nPk) Xsqlite3VdbeAddOp4(tls, v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, ts+13502, -1) Xsqlite3MayAbort(tls, pParse) Xsqlite3VdbeJumpHere(tls, v, i) } } pSrc = Xsqlite3SrcListDup(tls, db, (*Upsert)(unsafe.Pointer(pTop)).FpUpsertSrc, 0) for i = 0; i < int32((*Table)(unsafe.Pointer(pTab)).FnCol); i++ { if int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(i)*24)).Faffinity) == SQLITE_AFF_REAL { Xsqlite3VdbeAddOp1(tls, v, OP_RealAffinity, (*Upsert)(unsafe.Pointer(pTop)).FregData+i) } } Xsqlite3Update(tls, pParse, pSrc, Xsqlite3ExprListDup(tls, db, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertSet, 0), Xsqlite3ExprDup(tls, db, (*Upsert)(unsafe.Pointer(pUpsert)).FpUpsertWhere, 0), OE_Abort, uintptr(0), uintptr(0), pUpsert) } func execSql(tls *libc.TLS, db uintptr, pzErrMsg uintptr, zSql uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = Xsqlite3_prepare_v2(tls, db, zSql, -1, bp, uintptr(0)) if rc != SQLITE_OK { return rc } for SQLITE_ROW == libc.AssignInt32(&rc, Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp)))) { var zSubSql uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp)), 0) if zSubSql != 0 && (libc.Xstrncmp(tls, zSubSql, ts+22053, uint64(3)) == 0 || libc.Xstrncmp(tls, zSubSql, ts+22057, uint64(3)) == 0) { rc = execSql(tls, db, pzErrMsg, zSubSql) if rc != SQLITE_OK { break } } } if rc == SQLITE_DONE { rc = SQLITE_OK } if rc != 0 { Xsqlite3SetString(tls, pzErrMsg, db, Xsqlite3_errmsg(tls, db)) } Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } func execSqlF(tls *libc.TLS, db uintptr, pzErrMsg uintptr, zSql uintptr, va uintptr) int32 { var z uintptr var ap Va_list _ = ap var rc int32 ap = va z = Xsqlite3VMPrintf(tls, db, zSql, ap) _ = ap if z == uintptr(0) { return SQLITE_NOMEM } rc = execSql(tls, db, pzErrMsg, z) Xsqlite3DbFree(tls, db, z) return rc } // The VACUUM command is used to clean up the database, // collapse free space, etc. It is modelled after the VACUUM command // in PostgreSQL. The VACUUM command works as follows: // // (1) Create a new transient database file // (2) Copy all content from the database being vacuumed into // the new transient database file // (3) Copy content from the transient database back into the // original database. // // The transient database requires temporary disk space approximately // equal to the size of the original database. The copy operation of // step (3) requires additional temporary disk space approximately equal // to the size of the original database for the rollback journal. // Hence, temporary disk space that is approximately 2x the size of the // original database is required. Every page of the database is written // approximately 3 times: Once for step (2) and twice for step (3). // Two writes per page are required in step (3) because the original // database content must be written into the rollback journal prior to // overwriting the database with the vacuumed content. // // Only 1x temporary space and only 1x writes would be required if // the copy of step (3) were replaced by deleting the original database // and renaming the transient database as the original. But that will // not work if other processes are attached to the original database. // And a power loss in between deleting the original and renaming the // transient would cause the database file to appear to be deleted // following reboot. func Xsqlite3Vacuum(tls *libc.TLS, pParse uintptr, pNm uintptr, pInto uintptr) { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = pNm var v uintptr var iDb int32 var iIntoReg int32 v = Xsqlite3GetVdbe(tls, pParse) iDb = 0 if !(v == uintptr(0)) { goto __1 } goto build_vacuum_end __1: ; if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __2 } goto build_vacuum_end __2: ; if !(*(*uintptr)(unsafe.Pointer(bp)) != 0) { goto __3 } iDb = Xsqlite3TwoPartName(tls, pParse, *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp)), bp) if !(iDb < 0) { goto __4 } goto build_vacuum_end __4: ; __3: ; if !(iDb != 1) { goto __5 } iIntoReg = 0 if !(pInto != 0 && Xsqlite3ResolveSelfReference(tls, pParse, uintptr(0), 0, pInto, uintptr(0)) == 0) { goto __6 } iIntoReg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3ExprCode(tls, pParse, pInto, iIntoReg) __6: ; Xsqlite3VdbeAddOp2(tls, v, OP_Vacuum, iDb, iIntoReg) Xsqlite3VdbeUsesBtree(tls, v, iDb) __5: ; build_vacuum_end: Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pInto) return } // This routine implements the OP_Vacuum opcode of the VDBE. func Xsqlite3RunVacuum(tls *libc.TLS, pzErrMsg uintptr, db uintptr, iDb int32, pOut uintptr) int32 { bp := tls.Alloc(52) defer tls.Free(52) var rc int32 var pMain uintptr var pTemp uintptr var saved_mDbFlags U32 var saved_flags U64 var saved_nChange I64 var saved_nTotalChange I64 var saved_openFlags U32 var saved_mTrace U8 var pDb uintptr var isMemDb int32 var nRes int32 var nDb int32 var zDbMain uintptr var zOut uintptr var pgflags U32 var id uintptr var i int32 rc = SQLITE_OK pDb = uintptr(0) pgflags = U32(PAGER_SYNCHRONOUS_OFF) if !!(int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) != 0) { goto __1 } Xsqlite3SetString(tls, pzErrMsg, db, ts+22061) return SQLITE_ERROR __1: ; if !((*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive > 1) { goto __2 } Xsqlite3SetString(tls, pzErrMsg, db, ts+22101) return SQLITE_ERROR __2: ; saved_openFlags = (*Sqlite3)(unsafe.Pointer(db)).FopenFlags if !(pOut != 0) { goto __3 } if !(Xsqlite3_value_type(tls, pOut) != SQLITE_TEXT) { goto __5 } Xsqlite3SetString(tls, pzErrMsg, db, ts+22144) return SQLITE_ERROR __5: ; zOut = Xsqlite3_value_text(tls, pOut) *(*uint32)(unsafe.Pointer(db + 76)) &= libc.Uint32FromInt32(libc.CplInt32(SQLITE_OPEN_READONLY)) *(*uint32)(unsafe.Pointer(db + 76)) |= uint32(SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE) goto __4 __3: zOut = ts + 1544 __4: ; saved_flags = (*Sqlite3)(unsafe.Pointer(db)).Fflags saved_mDbFlags = (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags saved_nChange = (*Sqlite3)(unsafe.Pointer(db)).FnChange saved_nTotalChange = (*Sqlite3)(unsafe.Pointer(db)).FnTotalChange saved_mTrace = (*Sqlite3)(unsafe.Pointer(db)).FmTrace *(*U64)(unsafe.Pointer(db + 48)) |= uint64(SQLITE_WriteSchema | SQLITE_IgnoreChecks) *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_PreferBuiltin | DBFLAG_Vacuum) *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_ForeignKeys|SQLITE_ReverseOrder| SQLITE_Defensive) | uint64(0x00001)<<32) (*Sqlite3)(unsafe.Pointer(db)).FmTrace = U8(0) zDbMain = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName pMain = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt isMemDb = Xsqlite3PagerIsMemdb(tls, Xsqlite3BtreePager(tls, pMain)) nDb = (*Sqlite3)(unsafe.Pointer(db)).FnDb rc = execSqlF(tls, db, pzErrMsg, ts+22162, libc.VaList(bp, zOut)) (*Sqlite3)(unsafe.Pointer(db)).FopenFlags = saved_openFlags if !(rc != SQLITE_OK) { goto __6 } goto end_of_vacuum __6: ; pDb = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(nDb)*32 pTemp = (*Db)(unsafe.Pointer(pDb)).FpBt if !(pOut != 0) { goto __7 } id = Xsqlite3PagerFile(tls, Xsqlite3BtreePager(tls, pTemp)) *(*I64)(unsafe.Pointer(bp + 40)) = int64(0) if !((*Sqlite3_file)(unsafe.Pointer(id)).FpMethods != uintptr(0) && (Xsqlite3OsFileSize(tls, id, bp+40) != SQLITE_OK || *(*I64)(unsafe.Pointer(bp + 40)) > int64(0))) { goto __8 } rc = SQLITE_ERROR Xsqlite3SetString(tls, pzErrMsg, db, ts+22185) goto end_of_vacuum __8: ; *(*U32)(unsafe.Pointer(db + 44)) |= U32(DBFLAG_VacuumInto) pgflags = U32(U64((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).Fsafety_level) | (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(PAGER_FLAGS_MASK)) __7: ; nRes = Xsqlite3BtreeGetRequestedReserve(tls, pMain) Xsqlite3BtreeSetCacheSize(tls, pTemp, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FpSchema)).Fcache_size) Xsqlite3BtreeSetSpillSize(tls, pTemp, Xsqlite3BtreeSetSpillSize(tls, pMain, 0)) Xsqlite3BtreeSetPagerFlags(tls, pTemp, pgflags|U32(PAGER_CACHESPILL)) rc = execSql(tls, db, pzErrMsg, ts+15860) if !(rc != SQLITE_OK) { goto __9 } goto end_of_vacuum __9: ; rc = Xsqlite3BtreeBeginTrans(tls, pMain, func() int32 { if pOut == uintptr(0) { return 2 } return 0 }(), uintptr(0)) if !(rc != SQLITE_OK) { goto __10 } goto end_of_vacuum __10: ; if !(Xsqlite3PagerGetJournalMode(tls, Xsqlite3BtreePager(tls, pMain)) == PAGER_JOURNALMODE_WAL && pOut == uintptr(0)) { goto __11 } (*Sqlite3)(unsafe.Pointer(db)).FnextPagesize = 0 __11: ; if !(Xsqlite3BtreeSetPageSize(tls, pTemp, Xsqlite3BtreeGetPageSize(tls, pMain), nRes, 0) != 0 || !(isMemDb != 0) && Xsqlite3BtreeSetPageSize(tls, pTemp, (*Sqlite3)(unsafe.Pointer(db)).FnextPagesize, nRes, 0) != 0 || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __12 } rc = SQLITE_NOMEM goto end_of_vacuum __12: ; Xsqlite3BtreeSetAutoVacuum(tls, pTemp, func() int32 { if int32((*Sqlite3)(unsafe.Pointer(db)).FnextAutovac) >= 0 { return int32((*Sqlite3)(unsafe.Pointer(db)).FnextAutovac) } return Xsqlite3BtreeGetAutoVacuum(tls, pMain) }()) (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(nDb) rc = execSqlF(tls, db, pzErrMsg, ts+22212, libc.VaList(bp+8, zDbMain)) if !(rc != SQLITE_OK) { goto __13 } goto end_of_vacuum __13: ; rc = execSqlF(tls, db, pzErrMsg, ts+22320, libc.VaList(bp+16, zDbMain)) if !(rc != SQLITE_OK) { goto __14 } goto end_of_vacuum __14: ; (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(0) rc = execSqlF(tls, db, pzErrMsg, ts+22374, libc.VaList(bp+24, zDbMain)) *(*U32)(unsafe.Pointer(db + 44)) &= libc.Uint32FromInt32(libc.CplInt32(DBFLAG_Vacuum)) if !(rc != SQLITE_OK) { goto __15 } goto end_of_vacuum __15: ; rc = execSqlF(tls, db, pzErrMsg, ts+22525, libc.VaList(bp+32, zDbMain)) if !(rc != 0) { goto __16 } goto end_of_vacuum __16: ; i = 0 __17: if !(i < int32(uint64(unsafe.Sizeof(aCopy))/uint64(unsafe.Sizeof(uint8(0))))) { goto __19 } Xsqlite3BtreeGetMeta(tls, pMain, int32(aCopy[i]), bp+48) rc = Xsqlite3BtreeUpdateMeta(tls, pTemp, int32(aCopy[i]), *(*U32)(unsafe.Pointer(bp + 48))+U32(aCopy[i+1])) if !(rc != SQLITE_OK) { goto __20 } goto end_of_vacuum __20: ; goto __18 __18: i = i + 2 goto __17 goto __19 __19: ; if !(pOut == uintptr(0)) { goto __21 } rc = Xsqlite3BtreeCopyFile(tls, pMain, pTemp) __21: ; if !(rc != SQLITE_OK) { goto __22 } goto end_of_vacuum __22: ; rc = Xsqlite3BtreeCommit(tls, pTemp) if !(rc != SQLITE_OK) { goto __23 } goto end_of_vacuum __23: ; if !(pOut == uintptr(0)) { goto __24 } Xsqlite3BtreeSetAutoVacuum(tls, pMain, Xsqlite3BtreeGetAutoVacuum(tls, pTemp)) __24: ; if !(pOut == uintptr(0)) { goto __25 } nRes = Xsqlite3BtreeGetRequestedReserve(tls, pTemp) rc = Xsqlite3BtreeSetPageSize(tls, pMain, Xsqlite3BtreeGetPageSize(tls, pTemp), nRes, 1) __25: ; end_of_vacuum: (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(0) (*Sqlite3)(unsafe.Pointer(db)).FmDbFlags = saved_mDbFlags (*Sqlite3)(unsafe.Pointer(db)).Fflags = saved_flags (*Sqlite3)(unsafe.Pointer(db)).FnChange = saved_nChange (*Sqlite3)(unsafe.Pointer(db)).FnTotalChange = saved_nTotalChange (*Sqlite3)(unsafe.Pointer(db)).FmTrace = saved_mTrace Xsqlite3BtreeSetPageSize(tls, pMain, -1, 0, 1) (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1) if !(pDb != 0) { goto __26 } Xsqlite3BtreeClose(tls, (*Db)(unsafe.Pointer(pDb)).FpBt) (*Db)(unsafe.Pointer(pDb)).FpBt = uintptr(0) (*Db)(unsafe.Pointer(pDb)).FpSchema = uintptr(0) __26: ; Xsqlite3ResetAllSchemasOfConnection(tls, db) return rc } var aCopy = [10]uint8{ uint8(BTREE_SCHEMA_VERSION), uint8(1), uint8(BTREE_DEFAULT_CACHE_SIZE), uint8(0), uint8(BTREE_TEXT_ENCODING), uint8(0), uint8(BTREE_USER_VERSION), uint8(0), uint8(BTREE_APPLICATION_ID), uint8(0), } // Construct and install a Module object for a virtual table. When this // routine is called, it is guaranteed that all appropriate locks are held // and the module is not already part of the connection. // // If there already exists a module with zName, replace it with the new one. // If pModule==0, then delete the module zName if it exists. func Xsqlite3VtabCreateModule(tls *libc.TLS, db uintptr, zName uintptr, pModule uintptr, pAux uintptr, xDestroy uintptr) uintptr { var pMod uintptr var pDel uintptr var zCopy uintptr if pModule == uintptr(0) { zCopy = zName pMod = uintptr(0) } else { var nName int32 = Xsqlite3Strlen30(tls, zName) pMod = Xsqlite3Malloc(tls, uint64(unsafe.Sizeof(Module{}))+uint64(nName)+uint64(1)) if pMod == uintptr(0) { Xsqlite3OomFault(tls, db) return uintptr(0) } zCopy = pMod + 1*48 libc.Xmemcpy(tls, zCopy, zName, uint64(nName+1)) (*Module)(unsafe.Pointer(pMod)).FzName = zCopy (*Module)(unsafe.Pointer(pMod)).FpModule = pModule (*Module)(unsafe.Pointer(pMod)).FpAux = pAux (*Module)(unsafe.Pointer(pMod)).FxDestroy = xDestroy (*Module)(unsafe.Pointer(pMod)).FpEpoTab = uintptr(0) (*Module)(unsafe.Pointer(pMod)).FnRefModule = 1 } pDel = Xsqlite3HashInsert(tls, db+576, zCopy, pMod) if pDel != 0 { if pDel == pMod { Xsqlite3OomFault(tls, db) Xsqlite3DbFree(tls, db, pDel) pMod = uintptr(0) } else { Xsqlite3VtabEponymousTableClear(tls, db, pDel) Xsqlite3VtabModuleUnref(tls, db, pDel) } } return pMod } func createModule(tls *libc.TLS, db uintptr, zName uintptr, pModule uintptr, pAux uintptr, xDestroy uintptr) int32 { var rc int32 = SQLITE_OK Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) Xsqlite3VtabCreateModule(tls, db, zName, pModule, pAux, xDestroy) rc = Xsqlite3ApiExit(tls, db, rc) if rc != SQLITE_OK && xDestroy != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDestroy})).f(tls, pAux) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // External API function used to create a new virtual-table module. func Xsqlite3_create_module(tls *libc.TLS, db uintptr, zName uintptr, pModule uintptr, pAux uintptr) int32 { return createModule(tls, db, zName, pModule, pAux, uintptr(0)) } // External API function used to create a new virtual-table module. func Xsqlite3_create_module_v2(tls *libc.TLS, db uintptr, zName uintptr, pModule uintptr, pAux uintptr, xDestroy uintptr) int32 { return createModule(tls, db, zName, pModule, pAux, xDestroy) } // External API to drop all virtual-table modules, except those named // on the azNames list. func Xsqlite3_drop_modules(tls *libc.TLS, db uintptr, azNames uintptr) int32 { var pThis uintptr var pNext uintptr for pThis = (*Hash)(unsafe.Pointer(db + 576)).Ffirst; pThis != 0; pThis = pNext { var pMod uintptr = (*HashElem)(unsafe.Pointer(pThis)).Fdata pNext = (*HashElem)(unsafe.Pointer(pThis)).Fnext if azNames != 0 { var ii int32 for ii = 0; *(*uintptr)(unsafe.Pointer(azNames + uintptr(ii)*8)) != uintptr(0) && libc.Xstrcmp(tls, *(*uintptr)(unsafe.Pointer(azNames + uintptr(ii)*8)), (*Module)(unsafe.Pointer(pMod)).FzName) != 0; ii++ { } if *(*uintptr)(unsafe.Pointer(azNames + uintptr(ii)*8)) != uintptr(0) { continue } } createModule(tls, db, (*Module)(unsafe.Pointer(pMod)).FzName, uintptr(0), uintptr(0), uintptr(0)) } return SQLITE_OK } // Decrement the reference count on a Module object. Destroy the // module when the reference count reaches zero. func Xsqlite3VtabModuleUnref(tls *libc.TLS, db uintptr, pMod uintptr) { (*Module)(unsafe.Pointer(pMod)).FnRefModule-- if (*Module)(unsafe.Pointer(pMod)).FnRefModule == 0 { if (*Module)(unsafe.Pointer(pMod)).FxDestroy != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Module)(unsafe.Pointer(pMod)).FxDestroy})).f(tls, (*Module)(unsafe.Pointer(pMod)).FpAux) } Xsqlite3DbFree(tls, db, pMod) } } // Lock the virtual table so that it cannot be disconnected. // Locks nest. Every lock should have a corresponding unlock. // If an unlock is omitted, resources leaks will occur. // // If a disconnect is attempted while a virtual table is locked, // the disconnect is deferred until all locks have been removed. func Xsqlite3VtabLock(tls *libc.TLS, pVTab uintptr) { (*VTable)(unsafe.Pointer(pVTab)).FnRef++ } // pTab is a pointer to a Table structure representing a virtual-table. // Return a pointer to the VTable object used by connection db to access // this virtual-table, if one has been created, or NULL otherwise. func Xsqlite3GetVTable(tls *libc.TLS, db uintptr, pTab uintptr) uintptr { var pVtab uintptr for pVtab = *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)); pVtab != 0 && (*VTable)(unsafe.Pointer(pVtab)).Fdb != db; pVtab = (*VTable)(unsafe.Pointer(pVtab)).FpNext { } return pVtab } // Decrement the ref-count on a virtual table object. When the ref-count // reaches zero, call the xDisconnect() method to delete the object. func Xsqlite3VtabUnlock(tls *libc.TLS, pVTab uintptr) { var db uintptr = (*VTable)(unsafe.Pointer(pVTab)).Fdb (*VTable)(unsafe.Pointer(pVTab)).FnRef-- if (*VTable)(unsafe.Pointer(pVTab)).FnRef == 0 { var p uintptr = (*VTable)(unsafe.Pointer(pVTab)).FpVtab if p != 0 { (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer((*Sqlite3_vtab)(unsafe.Pointer(p)).FpModule)).FxDisconnect})).f(tls, p) } Xsqlite3VtabModuleUnref(tls, (*VTable)(unsafe.Pointer(pVTab)).Fdb, (*VTable)(unsafe.Pointer(pVTab)).FpMod) Xsqlite3DbFree(tls, db, pVTab) } } func vtabDisconnectAll(tls *libc.TLS, db uintptr, p uintptr) uintptr { var pRet uintptr = uintptr(0) var pVTable uintptr pVTable = *(*uintptr)(unsafe.Pointer(p + 64 + 16)) *(*uintptr)(unsafe.Pointer(p + 64 + 16)) = uintptr(0) for pVTable != 0 { var db2 uintptr = (*VTable)(unsafe.Pointer(pVTable)).Fdb var pNext uintptr = (*VTable)(unsafe.Pointer(pVTable)).FpNext if db2 == db { pRet = pVTable *(*uintptr)(unsafe.Pointer(p + 64 + 16)) = pRet (*VTable)(unsafe.Pointer(pRet)).FpNext = uintptr(0) } else { (*VTable)(unsafe.Pointer(pVTable)).FpNext = (*Sqlite3)(unsafe.Pointer(db2)).FpDisconnect (*Sqlite3)(unsafe.Pointer(db2)).FpDisconnect = pVTable } pVTable = pNext } return pRet } // Table *p is a virtual table. This function removes the VTable object // for table *p associated with database connection db from the linked // list in p->pVTab. It also decrements the VTable ref count. This is // used when closing database connection db to free all of its VTable // objects without disturbing the rest of the Schema object (which may // be being used by other shared-cache connections). func Xsqlite3VtabDisconnect(tls *libc.TLS, db uintptr, p uintptr) { var ppVTab uintptr for ppVTab = p + 64 + 16; *(*uintptr)(unsafe.Pointer(ppVTab)) != 0; ppVTab = *(*uintptr)(unsafe.Pointer(ppVTab)) + 40 { if (*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppVTab)))).Fdb == db { var pVTab uintptr = *(*uintptr)(unsafe.Pointer(ppVTab)) *(*uintptr)(unsafe.Pointer(ppVTab)) = (*VTable)(unsafe.Pointer(pVTab)).FpNext Xsqlite3VtabUnlock(tls, pVTab) break } } } // Disconnect all the virtual table objects in the sqlite3.pDisconnect list. // // This function may only be called when the mutexes associated with all // shared b-tree databases opened using connection db are held by the // caller. This is done to protect the sqlite3.pDisconnect list. The // sqlite3.pDisconnect list is accessed only as follows: // // 1. By this function. In this case, all BtShared mutexes and the mutex // associated with the database handle itself must be held. // // 2. By function vtabDisconnectAll(), when it adds a VTable entry to // the sqlite3.pDisconnect list. In this case either the BtShared mutex // associated with the database the virtual table is stored in is held // or, if the virtual table is stored in a non-sharable database, then // the database handle mutex is held. // // As a result, a sqlite3.pDisconnect cannot be accessed simultaneously // by multiple threads. It is thread-safe. func Xsqlite3VtabUnlockList(tls *libc.TLS, db uintptr) { var p uintptr = (*Sqlite3)(unsafe.Pointer(db)).FpDisconnect if p != 0 { (*Sqlite3)(unsafe.Pointer(db)).FpDisconnect = uintptr(0) Xsqlite3ExpirePreparedStatements(tls, db, 0) for __ccgo := true; __ccgo; __ccgo = p != 0 { var pNext uintptr = (*VTable)(unsafe.Pointer(p)).FpNext Xsqlite3VtabUnlock(tls, p) p = pNext } } } // Clear any and all virtual-table information from the Table record. // This routine is called, for example, just before deleting the Table // record. // // Since it is a virtual-table, the Table structure contains a pointer // to the head of a linked list of VTable structures. Each VTable // structure is associated with a single sqlite3* user of the schema. // The reference count of the VTable structure associated with database // connection db is decremented immediately (which may lead to the // structure being xDisconnected and free). Any other VTable structures // in the list are moved to the sqlite3.pDisconnect list of the associated // database connection. func Xsqlite3VtabClear(tls *libc.TLS, db uintptr, p uintptr) { if (*Sqlite3)(unsafe.Pointer(db)).FpnBytesFreed == uintptr(0) { vtabDisconnectAll(tls, uintptr(0), p) } if *(*uintptr)(unsafe.Pointer(p + 64 + 8)) != 0 { var i int32 for i = 0; i < *(*int32)(unsafe.Pointer(p + 64)); i++ { if i != 1 { Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64 + 8)) + uintptr(i)*8))) } } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(p + 64 + 8))) } } func addModuleArgument(tls *libc.TLS, pParse uintptr, pTable uintptr, zArg uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var nBytes Sqlite3_int64 var azModuleArg uintptr var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb nBytes = Sqlite3_int64(uint64(unsafe.Sizeof(uintptr(0))) * uint64(2+*(*int32)(unsafe.Pointer(pTable + 64)))) if *(*int32)(unsafe.Pointer(pTable + 64))+3 >= *(*int32)(unsafe.Pointer(db + 136 + 2*4)) { Xsqlite3ErrorMsg(tls, pParse, ts+13729, libc.VaList(bp, (*Table)(unsafe.Pointer(pTable)).FzName)) } azModuleArg = Xsqlite3DbRealloc(tls, db, *(*uintptr)(unsafe.Pointer(pTable + 64 + 8)), uint64(nBytes)) if azModuleArg == uintptr(0) { Xsqlite3DbFree(tls, db, zArg) } else { var i int32 = libc.PostIncInt32(&*(*int32)(unsafe.Pointer(pTable + 64)), 1) *(*uintptr)(unsafe.Pointer(azModuleArg + uintptr(i)*8)) = zArg *(*uintptr)(unsafe.Pointer(azModuleArg + uintptr(i+1)*8)) = uintptr(0) *(*uintptr)(unsafe.Pointer(pTable + 64 + 8)) = azModuleArg } } // The parser calls this routine when it first sees a CREATE VIRTUAL TABLE // statement. The module name has been parsed, but the optional list // of parameters that follow the module name are still pending. func Xsqlite3VtabBeginParse(tls *libc.TLS, pParse uintptr, pName1 uintptr, pName2 uintptr, pModuleName uintptr, ifNotExists int32) { var pTable uintptr var db uintptr Xsqlite3StartTable(tls, pParse, pName1, pName2, 0, 0, 1, ifNotExists) pTable = (*Parse)(unsafe.Pointer(pParse)).FpNewTable if pTable == uintptr(0) { return } (*Table)(unsafe.Pointer(pTable)).FeTabType = U8(TABTYP_VTAB) db = (*Parse)(unsafe.Pointer(pParse)).Fdb addModuleArgument(tls, pParse, pTable, Xsqlite3NameFromToken(tls, db, pModuleName)) addModuleArgument(tls, pParse, pTable, uintptr(0)) addModuleArgument(tls, pParse, pTable, Xsqlite3DbStrDup(tls, db, (*Table)(unsafe.Pointer(pTable)).FzName)) (*Parse)(unsafe.Pointer(pParse)).FsNameToken.Fn = uint32(int32((int64((*Token)(unsafe.Pointer(pModuleName)).Fz+uintptr((*Token)(unsafe.Pointer(pModuleName)).Fn)) - int64((*Parse)(unsafe.Pointer(pParse)).FsNameToken.Fz)) / 1)) if *(*uintptr)(unsafe.Pointer(pTable + 64 + 8)) != 0 { var iDb int32 = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTable)).FpSchema) Xsqlite3AuthCheck(tls, pParse, SQLITE_CREATE_VTABLE, (*Table)(unsafe.Pointer(pTable)).FzName, *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTable + 64 + 8)))), (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FaDb+uintptr(iDb)*32)).FzDbSName) } } func addArgumentToVtab(tls *libc.TLS, pParse uintptr) { if (*Parse)(unsafe.Pointer(pParse)).FsArg.Fz != 0 && (*Parse)(unsafe.Pointer(pParse)).FpNewTable != 0 { var z uintptr = (*Parse)(unsafe.Pointer(pParse)).FsArg.Fz var n int32 = int32((*Parse)(unsafe.Pointer(pParse)).FsArg.Fn) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb addModuleArgument(tls, pParse, (*Parse)(unsafe.Pointer(pParse)).FpNewTable, Xsqlite3DbStrNDup(tls, db, z, uint64(n))) } } // The parser calls this routine after the CREATE VIRTUAL TABLE statement // has been completely parsed. func Xsqlite3VtabFinishParse(tls *libc.TLS, pParse uintptr, pEnd uintptr) { bp := tls.Alloc(64) defer tls.Free(64) var pTab uintptr = (*Parse)(unsafe.Pointer(pParse)).FpNewTable var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if pTab == uintptr(0) { return } addArgumentToVtab(tls, pParse) (*Parse)(unsafe.Pointer(pParse)).FsArg.Fz = uintptr(0) if *(*int32)(unsafe.Pointer(pTab + 64)) < 1 { return } if !(int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) != 0) { var zStmt uintptr var zWhere uintptr var iDb int32 var iReg int32 var v uintptr Xsqlite3MayAbort(tls, pParse) if pEnd != 0 { (*Parse)(unsafe.Pointer(pParse)).FsNameToken.Fn = uint32(int32((int64((*Token)(unsafe.Pointer(pEnd)).Fz)-int64((*Parse)(unsafe.Pointer(pParse)).FsNameToken.Fz))/1)) + (*Token)(unsafe.Pointer(pEnd)).Fn } zStmt = Xsqlite3MPrintf(tls, db, ts+22655, libc.VaList(bp, pParse+272)) iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) Xsqlite3NestedParse(tls, pParse, ts+22679, libc.VaList(bp+8, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName, (*Table)(unsafe.Pointer(pTab)).FzName, (*Table)(unsafe.Pointer(pTab)).FzName, zStmt, (*Parse)(unsafe.Pointer(pParse)).FregRowid)) v = Xsqlite3GetVdbe(tls, pParse) Xsqlite3ChangeCookie(tls, pParse, iDb) Xsqlite3VdbeAddOp0(tls, v, OP_Expire) zWhere = Xsqlite3MPrintf(tls, db, ts+22778, libc.VaList(bp+48, (*Table)(unsafe.Pointer(pTab)).FzName, zStmt)) Xsqlite3VdbeAddParseSchemaOp(tls, v, iDb, zWhere, uint16(0)) Xsqlite3DbFree(tls, db, zStmt) iReg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeLoadString(tls, v, iReg, (*Table)(unsafe.Pointer(pTab)).FzName) Xsqlite3VdbeAddOp2(tls, v, OP_VCreate, iDb, iReg) } else { var pOld uintptr var pSchema uintptr = (*Table)(unsafe.Pointer(pTab)).FpSchema var zName uintptr = (*Table)(unsafe.Pointer(pTab)).FzName Xsqlite3MarkAllShadowTablesOf(tls, db, pTab) pOld = Xsqlite3HashInsert(tls, pSchema+8, zName, pTab) if pOld != 0 { Xsqlite3OomFault(tls, db) return } (*Parse)(unsafe.Pointer(pParse)).FpNewTable = uintptr(0) } } // The parser calls this routine when it sees the first token // of an argument to the module name in a CREATE VIRTUAL TABLE statement. func Xsqlite3VtabArgInit(tls *libc.TLS, pParse uintptr) { addArgumentToVtab(tls, pParse) (*Parse)(unsafe.Pointer(pParse)).FsArg.Fz = uintptr(0) (*Parse)(unsafe.Pointer(pParse)).FsArg.Fn = uint32(0) } // The parser calls this routine for each token after the first token // in an argument to the module name in a CREATE VIRTUAL TABLE statement. func Xsqlite3VtabArgExtend(tls *libc.TLS, pParse uintptr, p uintptr) { var pArg uintptr = pParse + 384 if (*Token)(unsafe.Pointer(pArg)).Fz == uintptr(0) { (*Token)(unsafe.Pointer(pArg)).Fz = (*Token)(unsafe.Pointer(p)).Fz (*Token)(unsafe.Pointer(pArg)).Fn = (*Token)(unsafe.Pointer(p)).Fn } else { (*Token)(unsafe.Pointer(pArg)).Fn = uint32(int32((int64((*Token)(unsafe.Pointer(p)).Fz+uintptr((*Token)(unsafe.Pointer(p)).Fn)) - int64((*Token)(unsafe.Pointer(pArg)).Fz)) / 1)) } } func vtabCallConstructor(tls *libc.TLS, db uintptr, pTab uintptr, pMod uintptr, xConstruct uintptr, pzErr uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) var pVTable uintptr var rc int32 var azArg uintptr var nArg int32 = *(*int32)(unsafe.Pointer(pTab + 64)) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) var zModuleName uintptr var iDb int32 var pCtx uintptr azArg = *(*uintptr)(unsafe.Pointer(pTab + 64 + 8)) for pCtx = (*Sqlite3)(unsafe.Pointer(db)).FpVtabCtx; pCtx != 0; pCtx = (*VtabCtx)(unsafe.Pointer(pCtx)).FpPrior { if (*VtabCtx)(unsafe.Pointer(pCtx)).FpTab == pTab { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3MPrintf(tls, db, ts+22797, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName)) return SQLITE_LOCKED } } zModuleName = Xsqlite3DbStrDup(tls, db, (*Table)(unsafe.Pointer(pTab)).FzName) if !(zModuleName != 0) { return SQLITE_NOMEM } pVTable = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(VTable{}))) if !(pVTable != 0) { Xsqlite3OomFault(tls, db) Xsqlite3DbFree(tls, db, zModuleName) return SQLITE_NOMEM } (*VTable)(unsafe.Pointer(pVTable)).Fdb = db (*VTable)(unsafe.Pointer(pVTable)).FpMod = pMod (*VTable)(unsafe.Pointer(pVTable)).FeVtabRisk = U8(SQLITE_VTABRISK_Normal) iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 8)) + 1*8)) = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FzDbSName (*VtabCtx)(unsafe.Pointer(bp + 32)).FpTab = pTab (*VtabCtx)(unsafe.Pointer(bp + 32)).FpVTable = pVTable (*VtabCtx)(unsafe.Pointer(bp + 32)).FpPrior = (*Sqlite3)(unsafe.Pointer(db)).FpVtabCtx (*VtabCtx)(unsafe.Pointer(bp + 32)).FbDeclared = 0 (*Sqlite3)(unsafe.Pointer(db)).FpVtabCtx = bp + 32 (*Table)(unsafe.Pointer(pTab)).FnTabRef++ rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xConstruct})).f(tls, db, (*Module)(unsafe.Pointer(pMod)).FpAux, nArg, azArg, pVTable+16, bp+64) Xsqlite3DeleteTable(tls, db, pTab) (*Sqlite3)(unsafe.Pointer(db)).FpVtabCtx = (*VtabCtx)(unsafe.Pointer(bp + 32)).FpPrior if rc == SQLITE_NOMEM { Xsqlite3OomFault(tls, db) } if SQLITE_OK != rc { if *(*uintptr)(unsafe.Pointer(bp + 64)) == uintptr(0) { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3MPrintf(tls, db, ts+22839, libc.VaList(bp+8, zModuleName)) } else { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3MPrintf(tls, db, ts+4493, libc.VaList(bp+16, *(*uintptr)(unsafe.Pointer(bp + 64)))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) } Xsqlite3DbFree(tls, db, pVTable) } else if (*VTable)(unsafe.Pointer(pVTable)).FpVtab != 0 { libc.Xmemset(tls, (*VTable)(unsafe.Pointer(pVTable)).FpVtab, 0, uint64(unsafe.Sizeof(Sqlite3_vtab{}))) (*Sqlite3_vtab)(unsafe.Pointer((*VTable)(unsafe.Pointer(pVTable)).FpVtab)).FpModule = (*Module)(unsafe.Pointer(pMod)).FpModule (*Module)(unsafe.Pointer(pMod)).FnRefModule++ (*VTable)(unsafe.Pointer(pVTable)).FnRef = 1 if (*VtabCtx)(unsafe.Pointer(bp+32)).FbDeclared == 0 { var zFormat uintptr = ts + 22869 *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3MPrintf(tls, db, zFormat, libc.VaList(bp+24, (*Table)(unsafe.Pointer(pTab)).FzName)) Xsqlite3VtabUnlock(tls, pVTable) rc = SQLITE_ERROR } else { var iCol int32 var oooHidden U16 = U16(0) (*VTable)(unsafe.Pointer(pVTable)).FpNext = *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) = pVTable for iCol = 0; iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol); iCol++ { var zType uintptr = Xsqlite3ColumnType(tls, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(iCol)*24, ts+1544) var nType int32 var i int32 = 0 nType = Xsqlite3Strlen30(tls, zType) for i = 0; i < nType; i++ { if 0 == Xsqlite3_strnicmp(tls, ts+17516, zType+uintptr(i), 6) && (i == 0 || int32(*(*int8)(unsafe.Pointer(zType + uintptr(i-1)))) == ' ') && (int32(*(*int8)(unsafe.Pointer(zType + uintptr(i+6)))) == 0 || int32(*(*int8)(unsafe.Pointer(zType + uintptr(i+6)))) == ' ') { break } } if i < nType { var j int32 var nDel int32 = 6 + func() int32 { if *(*int8)(unsafe.Pointer(zType + uintptr(i+6))) != 0 { return 1 } return 0 }() for j = i; j+nDel <= nType; j++ { *(*int8)(unsafe.Pointer(zType + uintptr(j))) = *(*int8)(unsafe.Pointer(zType + uintptr(j+nDel))) } if int32(*(*int8)(unsafe.Pointer(zType + uintptr(i)))) == 0 && i > 0 { *(*int8)(unsafe.Pointer(zType + uintptr(i-1))) = int8(0) } *(*U16)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24 + 16)) |= U16(COLFLAG_HIDDEN) *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_HasHidden) oooHidden = U16(TF_OOOHidden) } else { *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(oooHidden) } } } } Xsqlite3DbFree(tls, db, zModuleName) return rc } // This function is invoked by the parser to call the xConnect() method // of the virtual table pTab. If an error occurs, an error code is returned // and an error left in pParse. // // This call is a no-op if table pTab is not a virtual table. func Xsqlite3VtabCallConnect(tls *libc.TLS, pParse uintptr, pTab uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var zMod uintptr var pMod uintptr var rc int32 if Xsqlite3GetVTable(tls, db, pTab) != 0 { return SQLITE_OK } zMod = *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 8)))) pMod = Xsqlite3HashFind(tls, db+576, zMod) if !(pMod != 0) { var zModule uintptr = *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 8)))) Xsqlite3ErrorMsg(tls, pParse, ts+22915, libc.VaList(bp, zModule)) rc = SQLITE_ERROR } else { *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) rc = vtabCallConstructor(tls, db, pTab, pMod, (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxConnect, bp+16) if rc != SQLITE_OK { Xsqlite3ErrorMsg(tls, pParse, ts+4493, libc.VaList(bp+8, *(*uintptr)(unsafe.Pointer(bp + 16)))) (*Parse)(unsafe.Pointer(pParse)).Frc = rc } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 16))) } return rc } func growVTrans(tls *libc.TLS, db uintptr) int32 { var ARRAY_INCR int32 = 5 if (*Sqlite3)(unsafe.Pointer(db)).FnVTrans%ARRAY_INCR == 0 { var aVTrans uintptr var nBytes Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(uintptr(0))) * uint64(Sqlite3_int64((*Sqlite3)(unsafe.Pointer(db)).FnVTrans)+Sqlite3_int64(ARRAY_INCR))) aVTrans = Xsqlite3DbRealloc(tls, db, (*Sqlite3)(unsafe.Pointer(db)).FaVTrans, uint64(nBytes)) if !(aVTrans != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, aVTrans+uintptr((*Sqlite3)(unsafe.Pointer(db)).FnVTrans)*8, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64(ARRAY_INCR)) (*Sqlite3)(unsafe.Pointer(db)).FaVTrans = aVTrans } return SQLITE_OK } func addToVTrans(tls *libc.TLS, db uintptr, pVTab uintptr) { *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaVTrans + uintptr(libc.PostIncInt32(&(*Sqlite3)(unsafe.Pointer(db)).FnVTrans, 1))*8)) = pVTab Xsqlite3VtabLock(tls, pVTab) } // This function is invoked by the vdbe to call the xCreate method // of the virtual table named zTab in database iDb. // // If an error occurs, *pzErr is set to point to an English language // description of the error and an SQLITE_XXX error code is returned. // In this case the caller must call sqlite3DbFree(db, ) on *pzErr. func Xsqlite3VtabCallCreate(tls *libc.TLS, db uintptr, iDb int32, zTab uintptr, pzErr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var pTab uintptr var pMod uintptr var zMod uintptr pTab = Xsqlite3FindTable(tls, db, zTab, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) zMod = *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTab + 64 + 8)))) pMod = Xsqlite3HashFind(tls, db+576, zMod) if pMod == uintptr(0) || (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxCreate == uintptr(0) || (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxDestroy == uintptr(0) { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3MPrintf(tls, db, ts+22915, libc.VaList(bp, zMod)) rc = SQLITE_ERROR } else { rc = vtabCallConstructor(tls, db, pTab, pMod, (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer(pMod)).FpModule)).FxCreate, pzErr) } if rc == SQLITE_OK && Xsqlite3GetVTable(tls, db, pTab) != 0 { rc = growVTrans(tls, db) if rc == SQLITE_OK { addToVTrans(tls, db, Xsqlite3GetVTable(tls, db, pTab)) } } return rc } // This function is used to set the schema of a virtual table. It is only // valid to call this function from within the xCreate() or xConnect() of a // virtual table module. func Xsqlite3_declare_vtab(tls *libc.TLS, db uintptr, zCreateTable uintptr) int32 { bp := tls.Alloc(432) defer tls.Free(432) var pCtx uintptr var rc int32 = SQLITE_OK var pTab uintptr var initBusy int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pCtx = (*Sqlite3)(unsafe.Pointer(db)).FpVtabCtx if !(pCtx != 0) || (*VtabCtx)(unsafe.Pointer(pCtx)).FbDeclared != 0 { Xsqlite3Error(tls, db, SQLITE_MISUSE) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return Xsqlite3MisuseError(tls, 151102) } pTab = (*VtabCtx)(unsafe.Pointer(pCtx)).FpTab Xsqlite3ParseObjectInit(tls, bp+8, db) (*Parse)(unsafe.Pointer(bp + 8)).FeParseMode = U8(PARSE_MODE_DECLARE_VTAB) (*Parse)(unsafe.Pointer(bp + 8)).FdisableTriggers = U8(1) initBusy = int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy = U8(0) (*Parse)(unsafe.Pointer(bp + 8)).FnQueryLoop = U32(1) if SQLITE_OK == Xsqlite3RunParser(tls, bp+8, zCreateTable) && (*Parse)(unsafe.Pointer(bp+8)).FpNewTable != uintptr(0) && !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) && int32((*Table)(unsafe.Pointer((*Parse)(unsafe.Pointer(bp+8)).FpNewTable)).FeTabType) == TABTYP_NORM { if !(int32((*Table)(unsafe.Pointer(pTab)).FaCol) != 0) { var pNew uintptr = (*Parse)(unsafe.Pointer(bp + 8)).FpNewTable var pIdx uintptr (*Table)(unsafe.Pointer(pTab)).FaCol = (*Table)(unsafe.Pointer(pNew)).FaCol Xsqlite3ExprListDelete(tls, db, *(*uintptr)(unsafe.Pointer(pNew + 64 + 16))) (*Table)(unsafe.Pointer(pTab)).FnNVCol = libc.AssignPtrInt16(pTab+54, (*Table)(unsafe.Pointer(pNew)).FnCol) *(*U32)(unsafe.Pointer(pTab + 48)) |= (*Table)(unsafe.Pointer(pNew)).FtabFlags & U32(TF_WithoutRowid|TF_NoVisibleRowid) (*Table)(unsafe.Pointer(pNew)).FnCol = int16(0) (*Table)(unsafe.Pointer(pNew)).FaCol = uintptr(0) if !((*Table)(unsafe.Pointer(pNew)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) && (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer((*VTable)(unsafe.Pointer((*VtabCtx)(unsafe.Pointer(pCtx)).FpVTable)).FpMod)).FpModule)).FxUpdate != uintptr(0) && int32((*Index)(unsafe.Pointer(Xsqlite3PrimaryKeyIndex(tls, pNew))).FnKeyCol) != 1 { rc = SQLITE_ERROR } pIdx = (*Table)(unsafe.Pointer(pNew)).FpIndex if pIdx != 0 { (*Table)(unsafe.Pointer(pTab)).FpIndex = pIdx (*Table)(unsafe.Pointer(pNew)).FpIndex = uintptr(0) (*Index)(unsafe.Pointer(pIdx)).FpTable = pTab } } (*VtabCtx)(unsafe.Pointer(pCtx)).FbDeclared = 1 } else { Xsqlite3ErrorWithMsg(tls, db, SQLITE_ERROR, func() uintptr { if (*Parse)(unsafe.Pointer(bp+8)).FzErrMsg != 0 { return ts + 4493 } return uintptr(0) }(), libc.VaList(bp, (*Parse)(unsafe.Pointer(bp+8)).FzErrMsg)) Xsqlite3DbFree(tls, db, (*Parse)(unsafe.Pointer(bp+8)).FzErrMsg) rc = SQLITE_ERROR } (*Parse)(unsafe.Pointer(bp + 8)).FeParseMode = U8(PARSE_MODE_NORMAL) if (*Parse)(unsafe.Pointer(bp+8)).FpVdbe != 0 { Xsqlite3VdbeFinalize(tls, (*Parse)(unsafe.Pointer(bp+8)).FpVdbe) } Xsqlite3DeleteTable(tls, db, (*Parse)(unsafe.Pointer(bp+8)).FpNewTable) Xsqlite3ParseObjectReset(tls, bp+8) (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy = U8(initBusy) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // This function is invoked by the vdbe to call the xDestroy method // of the virtual table named zTab in database iDb. This occurs // when a DROP TABLE is mentioned. // // This call is a no-op if zTab is not a virtual table. func Xsqlite3VtabCallDestroy(tls *libc.TLS, db uintptr, iDb int32, zTab uintptr) int32 { var rc int32 = SQLITE_OK var pTab uintptr pTab = Xsqlite3FindTable(tls, db, zTab, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(iDb)*32)).FzDbSName) if pTab != uintptr(0) && int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB && *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) != uintptr(0) { var p uintptr var xDestroy uintptr for p = *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)); p != 0; p = (*VTable)(unsafe.Pointer(p)).FpNext { if (*Sqlite3_vtab)(unsafe.Pointer((*VTable)(unsafe.Pointer(p)).FpVtab)).FnRef > 0 { return SQLITE_LOCKED } } p = vtabDisconnectAll(tls, db, pTab) xDestroy = (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer((*VTable)(unsafe.Pointer(p)).FpMod)).FpModule)).FxDestroy if xDestroy == uintptr(0) { xDestroy = (*Sqlite3_module)(unsafe.Pointer((*Module)(unsafe.Pointer((*VTable)(unsafe.Pointer(p)).FpMod)).FpModule)).FxDisconnect } (*Table)(unsafe.Pointer(pTab)).FnTabRef++ rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xDestroy})).f(tls, (*VTable)(unsafe.Pointer(p)).FpVtab) if rc == SQLITE_OK { (*VTable)(unsafe.Pointer(p)).FpVtab = uintptr(0) *(*uintptr)(unsafe.Pointer(pTab + 64 + 16)) = uintptr(0) Xsqlite3VtabUnlock(tls, p) } Xsqlite3DeleteTable(tls, db, pTab) } return rc } func callFinaliser(tls *libc.TLS, db uintptr, offset int32) { var i int32 if (*Sqlite3)(unsafe.Pointer(db)).FaVTrans != 0 { var aVTrans uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaVTrans (*Sqlite3)(unsafe.Pointer(db)).FaVTrans = uintptr(0) for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnVTrans; i++ { var pVTab uintptr = *(*uintptr)(unsafe.Pointer(aVTrans + uintptr(i)*8)) var p uintptr = (*VTable)(unsafe.Pointer(pVTab)).FpVtab if p != 0 { var x uintptr x = *(*uintptr)(unsafe.Pointer((*Sqlite3_vtab)(unsafe.Pointer(p)).FpModule + uintptr(offset))) if x != 0 { (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{x})).f(tls, p) } } (*VTable)(unsafe.Pointer(pVTab)).FiSavepoint = 0 Xsqlite3VtabUnlock(tls, pVTab) } Xsqlite3DbFree(tls, db, aVTrans) (*Sqlite3)(unsafe.Pointer(db)).FnVTrans = 0 } } // Invoke the xSync method of all virtual tables in the sqlite3.aVTrans // array. Return the error code for the first error that occurs, or // SQLITE_OK if all xSync operations are successful. // // If an error message is available, leave it in p->zErrMsg. func Xsqlite3VtabSync(tls *libc.TLS, db uintptr, p uintptr) int32 { var i int32 var rc int32 = SQLITE_OK var aVTrans uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaVTrans (*Sqlite3)(unsafe.Pointer(db)).FaVTrans = uintptr(0) for i = 0; rc == SQLITE_OK && i < (*Sqlite3)(unsafe.Pointer(db)).FnVTrans; i++ { var x uintptr var pVtab uintptr = (*VTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aVTrans + uintptr(i)*8)))).FpVtab if pVtab != 0 && libc.AssignUintptr(&x, (*Sqlite3_module)(unsafe.Pointer((*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FpModule)).FxSync) != uintptr(0) { rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{x})).f(tls, pVtab) Xsqlite3VtabImportErrmsg(tls, p, pVtab) } } (*Sqlite3)(unsafe.Pointer(db)).FaVTrans = aVTrans return rc } // Invoke the xRollback method of all virtual tables in the // sqlite3.aVTrans array. Then clear the array itself. func Xsqlite3VtabRollback(tls *libc.TLS, db uintptr) int32 { callFinaliser(tls, db, int32(uintptr(0)+136)) return SQLITE_OK } // Invoke the xCommit method of all virtual tables in the // sqlite3.aVTrans array. Then clear the array itself. func Xsqlite3VtabCommit(tls *libc.TLS, db uintptr) int32 { callFinaliser(tls, db, int32(uintptr(0)+128)) return SQLITE_OK } // If the virtual table pVtab supports the transaction interface // (xBegin/xRollback/xCommit and optionally xSync) and a transaction is // not currently open, invoke the xBegin method now. // // If the xBegin call is successful, place the sqlite3_vtab pointer // in the sqlite3.aVTrans array. func Xsqlite3VtabBegin(tls *libc.TLS, db uintptr, pVTab uintptr) int32 { var rc int32 = SQLITE_OK var pModule uintptr if (*Sqlite3)(unsafe.Pointer(db)).FnVTrans > 0 && (*Sqlite3)(unsafe.Pointer(db)).FaVTrans == uintptr(0) { return SQLITE_LOCKED } if !(pVTab != 0) { return SQLITE_OK } pModule = (*Sqlite3_vtab)(unsafe.Pointer((*VTable)(unsafe.Pointer(pVTab)).FpVtab)).FpModule if (*Sqlite3_module)(unsafe.Pointer(pModule)).FxBegin != 0 { var i int32 for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnVTrans; i++ { if *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaVTrans + uintptr(i)*8)) == pVTab { return SQLITE_OK } } rc = growVTrans(tls, db) if rc == SQLITE_OK { rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule)).FxBegin})).f(tls, (*VTable)(unsafe.Pointer(pVTab)).FpVtab) if rc == SQLITE_OK { var iSvpt int32 = (*Sqlite3)(unsafe.Pointer(db)).FnStatement + (*Sqlite3)(unsafe.Pointer(db)).FnSavepoint addToVTrans(tls, db, pVTab) if iSvpt != 0 && (*Sqlite3_module)(unsafe.Pointer(pModule)).FxSavepoint != 0 { (*VTable)(unsafe.Pointer(pVTab)).FiSavepoint = iSvpt rc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pModule)).FxSavepoint})).f(tls, (*VTable)(unsafe.Pointer(pVTab)).FpVtab, iSvpt-1) } } } } return rc } // Invoke either the xSavepoint, xRollbackTo or xRelease method of all // virtual tables that currently have an open transaction. Pass iSavepoint // as the second argument to the virtual table method invoked. // // If op is SAVEPOINT_BEGIN, the xSavepoint method is invoked. If it is // SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is // SAVEPOINT_RELEASE, then the xRelease method of each virtual table with // an open transaction is invoked. // // If any virtual table method returns an error code other than SQLITE_OK, // processing is abandoned and the error returned to the caller of this // function immediately. If all calls to virtual table methods are successful, // SQLITE_OK is returned. func Xsqlite3VtabSavepoint(tls *libc.TLS, db uintptr, op int32, iSavepoint int32) int32 { var rc int32 = SQLITE_OK if (*Sqlite3)(unsafe.Pointer(db)).FaVTrans != 0 { var i int32 for i = 0; rc == SQLITE_OK && i < (*Sqlite3)(unsafe.Pointer(db)).FnVTrans; i++ { var pVTab uintptr = *(*uintptr)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaVTrans + uintptr(i)*8)) var pMod uintptr = (*Module)(unsafe.Pointer((*VTable)(unsafe.Pointer(pVTab)).FpMod)).FpModule if (*VTable)(unsafe.Pointer(pVTab)).FpVtab != 0 && (*Sqlite3_module)(unsafe.Pointer(pMod)).FiVersion >= 2 { var xMethod uintptr Xsqlite3VtabLock(tls, pVTab) switch op { case SAVEPOINT_BEGIN: xMethod = (*Sqlite3_module)(unsafe.Pointer(pMod)).FxSavepoint (*VTable)(unsafe.Pointer(pVTab)).FiSavepoint = iSavepoint + 1 break fallthrough case SAVEPOINT_ROLLBACK: xMethod = (*Sqlite3_module)(unsafe.Pointer(pMod)).FxRollbackTo break fallthrough default: xMethod = (*Sqlite3_module)(unsafe.Pointer(pMod)).FxRelease break } if xMethod != 0 && (*VTable)(unsafe.Pointer(pVTab)).FiSavepoint > iSavepoint { rc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xMethod})).f(tls, (*VTable)(unsafe.Pointer(pVTab)).FpVtab, iSavepoint) } Xsqlite3VtabUnlock(tls, pVTab) } } } return rc } // The first parameter (pDef) is a function implementation. The // second parameter (pExpr) is the first argument to this function. // If pExpr is a column in a virtual table, then let the virtual // table implementation have an opportunity to overload the function. // // This routine is used to allow virtual table implementations to // overload MATCH, LIKE, GLOB, and REGEXP operators. // // Return either the pDef argument (indicating no change) or a // new FuncDef structure that is marked as ephemeral using the // SQLITE_FUNC_EPHEM flag. func Xsqlite3VtabOverloadFunction(tls *libc.TLS, db uintptr, pDef uintptr, nArg int32, pExpr uintptr) uintptr { bp := tls.Alloc(16) defer tls.Free(16) var pTab uintptr var pVtab uintptr var pMod uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var pNew uintptr var rc int32 = 0 if pExpr == uintptr(0) { return pDef } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLUMN { return pDef } pTab = *(*uintptr)(unsafe.Pointer(pExpr + 64)) if pTab == uintptr(0) { return pDef } if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { return pDef } pVtab = (*VTable)(unsafe.Pointer(Xsqlite3GetVTable(tls, db, pTab))).FpVtab pMod = (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FpModule if (*Sqlite3_module)(unsafe.Pointer(pMod)).FxFindFunction == uintptr(0) { return pDef } rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pMod)).FxFindFunction})).f(tls, pVtab, nArg, (*FuncDef)(unsafe.Pointer(pDef)).FzName, bp, bp+8) if rc == 0 { return pDef } pNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(FuncDef{}))+ uint64(Xsqlite3Strlen30(tls, (*FuncDef)(unsafe.Pointer(pDef)).FzName))+uint64(1)) if pNew == uintptr(0) { return pDef } *(*FuncDef)(unsafe.Pointer(pNew)) = *(*FuncDef)(unsafe.Pointer(pDef)) (*FuncDef)(unsafe.Pointer(pNew)).FzName = pNew + 1*72 libc.Xmemcpy(tls, pNew+1*72, (*FuncDef)(unsafe.Pointer(pDef)).FzName, uint64(Xsqlite3Strlen30(tls, (*FuncDef)(unsafe.Pointer(pDef)).FzName)+1)) (*FuncDef)(unsafe.Pointer(pNew)).FxSFunc = *(*uintptr)(unsafe.Pointer(bp)) (*FuncDef)(unsafe.Pointer(pNew)).FpUserData = *(*uintptr)(unsafe.Pointer(bp + 8)) *(*U32)(unsafe.Pointer(pNew + 4)) |= U32(SQLITE_FUNC_EPHEM) return pNew } // Make sure virtual table pTab is contained in the pParse->apVirtualLock[] // array so that an OP_VBegin will get generated for it. Add pTab to the // array if it is missing. If pTab is already in the array, this routine // is a no-op. func Xsqlite3VtabMakeWritable(tls *libc.TLS, pParse uintptr, pTab uintptr) { var pToplevel uintptr = func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }() var i int32 var n int32 var apVtabLock uintptr for i = 0; i < (*Parse)(unsafe.Pointer(pToplevel)).FnVtabLock; i++ { if pTab == *(*uintptr)(unsafe.Pointer((*Parse)(unsafe.Pointer(pToplevel)).FapVtabLock + uintptr(i)*8)) { return } } n = int32(uint64((*Parse)(unsafe.Pointer(pToplevel)).FnVtabLock+1) * uint64(unsafe.Sizeof(uintptr(0)))) apVtabLock = Xsqlite3Realloc(tls, (*Parse)(unsafe.Pointer(pToplevel)).FapVtabLock, uint64(n)) if apVtabLock != 0 { (*Parse)(unsafe.Pointer(pToplevel)).FapVtabLock = apVtabLock *(*uintptr)(unsafe.Pointer((*Parse)(unsafe.Pointer(pToplevel)).FapVtabLock + uintptr(libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pToplevel)).FnVtabLock, 1))*8)) = pTab } else { Xsqlite3OomFault(tls, (*Parse)(unsafe.Pointer(pToplevel)).Fdb) } } // Check to see if virtual table module pMod can be have an eponymous // virtual table instance. If it can, create one if one does not already // exist. Return non-zero if either the eponymous virtual table instance // exists when this routine returns or if an attempt to create it failed // and an error message was left in pParse. // // An eponymous virtual table instance is one that is named after its // module, and more importantly, does not require a CREATE VIRTUAL TABLE // statement in order to come into existance. Eponymous virtual table // instances always exist. They cannot be DROP-ed. // // Any virtual table module for which xConnect and xCreate are the same // method can have an eponymous virtual table instance. func Xsqlite3VtabEponymousTableInit(tls *libc.TLS, pParse uintptr, pMod uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pModule uintptr = (*Module)(unsafe.Pointer(pMod)).FpModule var pTab uintptr *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var rc int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Module)(unsafe.Pointer(pMod)).FpEpoTab != 0 { return 1 } if (*Sqlite3_module)(unsafe.Pointer(pModule)).FxCreate != uintptr(0) && (*Sqlite3_module)(unsafe.Pointer(pModule)).FxCreate != (*Sqlite3_module)(unsafe.Pointer(pModule)).FxConnect { return 0 } pTab = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Table{}))) if pTab == uintptr(0) { return 0 } (*Table)(unsafe.Pointer(pTab)).FzName = Xsqlite3DbStrDup(tls, db, (*Module)(unsafe.Pointer(pMod)).FzName) if (*Table)(unsafe.Pointer(pTab)).FzName == uintptr(0) { Xsqlite3DbFree(tls, db, pTab) return 0 } (*Module)(unsafe.Pointer(pMod)).FpEpoTab = pTab (*Table)(unsafe.Pointer(pTab)).FnTabRef = U32(1) (*Table)(unsafe.Pointer(pTab)).FeTabType = U8(TABTYP_VTAB) (*Table)(unsafe.Pointer(pTab)).FpSchema = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema (*Table)(unsafe.Pointer(pTab)).FiPKey = int16(-1) *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_Eponymous) addModuleArgument(tls, pParse, pTab, Xsqlite3DbStrDup(tls, db, (*Table)(unsafe.Pointer(pTab)).FzName)) addModuleArgument(tls, pParse, pTab, uintptr(0)) addModuleArgument(tls, pParse, pTab, Xsqlite3DbStrDup(tls, db, (*Table)(unsafe.Pointer(pTab)).FzName)) rc = vtabCallConstructor(tls, db, pTab, pMod, (*Sqlite3_module)(unsafe.Pointer(pModule)).FxConnect, bp+8) if rc != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+4493, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(bp + 8)))) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 8))) Xsqlite3VtabEponymousTableClear(tls, db, pMod) } return 1 } // Erase the eponymous virtual table instance associated with // virtual table module pMod, if it exists. func Xsqlite3VtabEponymousTableClear(tls *libc.TLS, db uintptr, pMod uintptr) { var pTab uintptr = (*Module)(unsafe.Pointer(pMod)).FpEpoTab if pTab != uintptr(0) { *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_Ephemeral) Xsqlite3DeleteTable(tls, db, pTab) (*Module)(unsafe.Pointer(pMod)).FpEpoTab = uintptr(0) } } // Return the ON CONFLICT resolution mode in effect for the virtual // table update operation currently in progress. // // The results of this routine are undefined unless it is called from // within an xUpdate method. func Xsqlite3_vtab_on_conflict(tls *libc.TLS, db uintptr) int32 { return int32(aMap[int32((*Sqlite3)(unsafe.Pointer(db)).FvtabOnConflict)-1]) } var aMap = [5]uint8{ uint8(SQLITE_ROLLBACK), uint8(SQLITE_ABORT), uint8(SQLITE_FAIL), uint8(SQLITE_IGNORE), uint8(SQLITE_REPLACE), } // Call from within the xCreate() or xConnect() methods to provide // the SQLite core with additional information about the behavior // of the virtual table being implemented. func Xsqlite3_vtab_config(tls *libc.TLS, db uintptr, op int32, va uintptr) int32 { var ap Va_list _ = ap var rc int32 = SQLITE_OK var p uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) p = (*Sqlite3)(unsafe.Pointer(db)).FpVtabCtx if !(p != 0) { rc = Xsqlite3MisuseError(tls, 151593) } else { ap = va switch op { case SQLITE_VTAB_CONSTRAINT_SUPPORT: { (*VTable)(unsafe.Pointer((*VtabCtx)(unsafe.Pointer(p)).FpVTable)).FbConstraint = U8(libc.VaInt32(&ap)) break } fallthrough case SQLITE_VTAB_INNOCUOUS: { (*VTable)(unsafe.Pointer((*VtabCtx)(unsafe.Pointer(p)).FpVTable)).FeVtabRisk = U8(SQLITE_VTABRISK_Low) break } fallthrough case SQLITE_VTAB_DIRECTONLY: { (*VTable)(unsafe.Pointer((*VtabCtx)(unsafe.Pointer(p)).FpVTable)).FeVtabRisk = U8(SQLITE_VTABRISK_High) break } fallthrough default: { rc = Xsqlite3MisuseError(tls, 151611) break } } _ = ap } if rc != SQLITE_OK { Xsqlite3Error(tls, db, rc) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Forward references type WhereClause1 = struct { FpWInfo uintptr FpOuter uintptr Fop U8 FhasOr U8 F__ccgo_pad1 [2]byte FnTerm int32 FnSlot int32 FnBase int32 Fa uintptr FaStatic [8]WhereTerm } // Forward references type WhereClause = WhereClause1 type WhereMaskSet1 = struct { FbVarSelect int32 Fn int32 Fix [64]int32 } type WhereMaskSet = WhereMaskSet1 type WhereOrInfo1 = struct { Fwc WhereClause Findexable Bitmask } type WhereOrInfo = WhereOrInfo1 type WhereAndInfo1 = struct{ Fwc WhereClause } type WhereAndInfo = WhereAndInfo1 type WhereLevel1 = struct { FiLeftJoin int32 FiTabCur int32 FiIdxCur int32 FaddrBrk int32 FaddrNxt int32 FaddrSkip int32 FaddrCont int32 FaddrFirst int32 FaddrBody int32 FregBignull int32 FaddrBignull int32 FregFilter int32 FpRJ uintptr FiFrom U8 Fop U8 Fp3 U8 Fp5 U8 Fp1 int32 Fp2 int32 F__ccgo_pad1 [4]byte Fu struct { Fin struct { FnIn int32 F__ccgo_pad1 [4]byte FaInLoop uintptr } } FpWLoop uintptr FnotReady Bitmask } type WhereLevel = WhereLevel1 type WhereLoop1 = struct { Fprereq Bitmask FmaskSelf Bitmask FiTab U8 FiSortIdx U8 FrSetup LogEst FrRun LogEst FnOut LogEst Fu struct { Fbtree struct { FnEq U16 FnBtm U16 FnTop U16 FnDistinctCol U16 FpIndex uintptr } F__ccgo_pad1 [16]byte } FwsFlags U32 FnLTerm U16 FnSkip U16 FnLSlot U16 F__ccgo_pad1 [6]byte FaLTerm uintptr FpNextLoop uintptr FaLTermSpace [3]uintptr } type WhereLoop = WhereLoop1 type WherePath1 = struct { FmaskLoop Bitmask FrevLoop Bitmask FnRow LogEst FrCost LogEst FrUnsorted LogEst FisOrdered I8 F__ccgo_pad1 [1]byte FaLoop uintptr } type WherePath = WherePath1 type WhereTerm1 = struct { FpExpr uintptr FpWC uintptr FtruthProb LogEst FwtFlags U16 FeOperator U16 FnChild U8 FeMatchOp U8 FiParent int32 FleftCursor int32 Fu struct { F__ccgo_pad1 [0]uint64 Fx struct { FleftColumn int32 FiField int32 } } FprereqRight Bitmask FprereqAll Bitmask } type WhereTerm = WhereTerm1 type WhereLoopBuilder1 = struct { FpWInfo uintptr FpWC uintptr FpNew uintptr FpOrSet uintptr FpRec uintptr FnRecValid int32 FbldFlags1 uint8 FbldFlags2 uint8 F__ccgo_pad1 [2]byte FiPlanLimit uint32 F__ccgo_pad2 [4]byte } type WhereLoopBuilder = WhereLoopBuilder1 type WhereScan1 = struct { FpOrigWC uintptr FpWC uintptr FzCollName uintptr FpIdxExpr uintptr Fk int32 FopMask U32 Fidxaff int8 FiEquiv uint8 FnEquiv uint8 F__ccgo_pad1 [1]byte FaiCur [11]int32 FaiColumn [11]I16 F__ccgo_pad2 [2]byte } type WhereScan = WhereScan1 type WhereOrCost1 = struct { Fprereq Bitmask FrRun LogEst FnOut LogEst F__ccgo_pad1 [4]byte } type WhereOrCost = WhereOrCost1 type WhereOrSet1 = struct { Fn U16 F__ccgo_pad1 [6]byte Fa [3]WhereOrCost } type WhereOrSet = WhereOrSet1 type WhereMemBlock1 = struct { FpNext uintptr Fsz U64 } type WhereMemBlock = WhereMemBlock1 type WhereRightJoin1 = struct { FiMatch int32 FregBloom int32 FregReturn int32 FaddrSubrtn int32 FendSubrtn int32 } type WhereRightJoin = WhereRightJoin1 // This object contains information needed to implement a single nested // loop in WHERE clause. // // Contrast this object with WhereLoop. This object describes the // implementation of the loop. WhereLoop describes the algorithm. // This object contains a pointer to the WhereLoop algorithm as one of // its elements. // // The WhereInfo object contains a single instance of this object for // each term in the FROM clause (which is to say, for each of the // nested loops as implemented). The order of WhereLevel objects determines // the loop nested order, with WhereInfo.a[0] being the outer loop and // WhereInfo.a[WhereInfo.nLevel-1] being the inner loop. type InLoop = struct { FiCur int32 FaddrInTop int32 FiBase int32 FnPrefix int32 FeEndLoopOp U8 F__ccgo_pad1 [3]byte } func explainIndexColumnName(tls *libc.TLS, pIdx uintptr, i int32) uintptr { i = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) if i == -2 { return ts + 22934 } if i == -1 { return ts + 17625 } return (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FaCol + uintptr(i)*24)).FzCnName } func explainAppendTerm(tls *libc.TLS, pStr uintptr, pIdx uintptr, nTerm int32, iTerm int32, bAnd int32, zOp uintptr) { var i int32 if bAnd != 0 { Xsqlite3_str_append(tls, pStr, ts+22941, 5) } if nTerm > 1 { Xsqlite3_str_append(tls, pStr, ts+22947, 1) } for i = 0; i < nTerm; i++ { if i != 0 { Xsqlite3_str_append(tls, pStr, ts+14119, 1) } Xsqlite3_str_appendall(tls, pStr, explainIndexColumnName(tls, pIdx, iTerm+i)) } if nTerm > 1 { Xsqlite3_str_append(tls, pStr, ts+6309, 1) } Xsqlite3_str_append(tls, pStr, zOp, 1) if nTerm > 1 { Xsqlite3_str_append(tls, pStr, ts+22947, 1) } for i = 0; i < nTerm; i++ { if i != 0 { Xsqlite3_str_append(tls, pStr, ts+14119, 1) } Xsqlite3_str_append(tls, pStr, ts+6360, 1) } if nTerm > 1 { Xsqlite3_str_append(tls, pStr, ts+6309, 1) } } func explainIndexRange(tls *libc.TLS, pStr uintptr, pLoop uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var pIndex uintptr = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) var nEq U16 = *(*U16)(unsafe.Pointer(pLoop + 24)) var nSkip U16 = (*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip var i int32 var j int32 if int32(nEq) == 0 && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT) == U32(0) { return } Xsqlite3_str_append(tls, pStr, ts+22949, 2) for i = 0; i < int32(nEq); i++ { var z uintptr = explainIndexColumnName(tls, pIndex, i) if i != 0 { Xsqlite3_str_append(tls, pStr, ts+22941, 5) } Xsqlite3_str_appendf(tls, pStr, func() uintptr { if i >= int32(nSkip) { return ts + 22952 } return ts + 22957 }(), libc.VaList(bp, z)) } j = i if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_BTM_LIMIT) != 0 { explainAppendTerm(tls, pStr, pIndex, int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 2))), j, i, ts+22965) i = 1 } if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_TOP_LIMIT) != 0 { explainAppendTerm(tls, pStr, pIndex, int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 4))), j, i, ts+22967) } Xsqlite3_str_append(tls, pStr, ts+6309, 1) } // This function is a no-op unless currently processing an EXPLAIN QUERY PLAN // command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was // defined at compile-time. If it is not a no-op, a single OP_Explain opcode // is added to the output to describe the table scan strategy in pLevel. // // If an OP_Explain opcode is added to the VM, its address is returned. // Otherwise, if no OP_Explain is coded, zero is returned. func Xsqlite3WhereExplainOneScan(tls *libc.TLS, pParse uintptr, pTabList uintptr, pLevel uintptr, wctrlFlags U16) int32 { bp := tls.Alloc(196) defer tls.Free(196) var ret int32 = 0 if int32((*Parse)(unsafe.Pointer(func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }())).Fexplain) == 2 { var pItem uintptr = pTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var isSearch int32 var pLoop uintptr var flags U32 var zMsg uintptr pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop flags = (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags if flags&U32(WHERE_MULTI_OR) != 0 || int32(wctrlFlags)&WHERE_OR_SUBCLAUSE != 0 { return 0 } isSearch = libc.Bool32(flags&U32(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT) != U32(0) || flags&U32(WHERE_VIRTUALTABLE) == U32(0) && int32(*(*U16)(unsafe.Pointer(pLoop + 24))) > 0 || int32(wctrlFlags)&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX) != 0) Xsqlite3StrAccumInit(tls, bp+64, db, bp+96, int32(unsafe.Sizeof([100]int8{})), SQLITE_MAX_LENGTH) (*StrAccum)(unsafe.Pointer(bp + 64)).FprintfFlags = U8(SQLITE_PRINTF_INTERNAL) Xsqlite3_str_appendf(tls, bp+64, ts+22969, libc.VaList(bp, func() uintptr { if isSearch != 0 { return ts + 22975 } return ts + 22982 }(), pItem)) if flags&U32(WHERE_IPK|WHERE_VIRTUALTABLE) == U32(0) { var zFmt uintptr = uintptr(0) var pIdx uintptr pIdx = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) if !((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) && int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY { if isSearch != 0 { zFmt = ts + 12328 } } else if flags&U32(WHERE_PARTIALIDX) != 0 { zFmt = ts + 22987 } else if flags&U32(WHERE_AUTO_INDEX) != 0 { zFmt = ts + 23020 } else if flags&U32(WHERE_IDX_ONLY) != 0 { zFmt = ts + 23045 } else { zFmt = ts + 23063 } if zFmt != 0 { Xsqlite3_str_append(tls, bp+64, ts+23072, 7) Xsqlite3_str_appendf(tls, bp+64, zFmt, libc.VaList(bp+16, (*Index)(unsafe.Pointer(pIdx)).FzName)) explainIndexRange(tls, bp+64, pLoop) } } else if flags&U32(WHERE_IPK) != U32(0) && flags&U32(WHERE_CONSTRAINT) != U32(0) { var cRangeOp int8 var zRowid uintptr = ts + 17625 Xsqlite3_str_appendf(tls, bp+64, ts+23080, libc.VaList(bp+24, zRowid)) if flags&U32(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) != 0 { cRangeOp = int8('=') } else if flags&U32(WHERE_BOTH_LIMIT) == U32(WHERE_BOTH_LIMIT) { Xsqlite3_str_appendf(tls, bp+64, ts+23111, libc.VaList(bp+32, zRowid)) cRangeOp = int8('<') } else if flags&U32(WHERE_BTM_LIMIT) != 0 { cRangeOp = int8('>') } else { cRangeOp = int8('<') } Xsqlite3_str_appendf(tls, bp+64, ts+23121, libc.VaList(bp+40, int32(cRangeOp))) } else if flags&U32(WHERE_VIRTUALTABLE) != U32(0) { Xsqlite3_str_appendf(tls, bp+64, ts+23126, libc.VaList(bp+48, *(*int32)(unsafe.Pointer(pLoop + 24)), *(*uintptr)(unsafe.Pointer(pLoop + 24 + 16)))) } if int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_LEFT != 0 { Xsqlite3_str_appendf(tls, bp+64, ts+23153, 0) } zMsg = Xsqlite3StrAccumFinish(tls, bp+64) ret = Xsqlite3VdbeAddOp4(tls, v, OP_Explain, Xsqlite3VdbeCurrentAddr(tls, v), (*Parse)(unsafe.Pointer(pParse)).FaddrExplain, 0, zMsg, -6) } return ret } // Add a single OP_Explain opcode that describes a Bloom filter. // // Or if not processing EXPLAIN QUERY PLAN and not in a SQLITE_DEBUG and/or // SQLITE_ENABLE_STMT_SCANSTATUS build, then OP_Explain opcodes are not // required and this routine is a no-op. // // If an OP_Explain opcode is added to the VM, its address is returned. // Otherwise, if no OP_Explain is coded, zero is returned. func Xsqlite3WhereExplainBloomFilter(tls *libc.TLS, pParse uintptr, pWInfo uintptr, pLevel uintptr) int32 { bp := tls.Alloc(156) defer tls.Free(156) var ret int32 = 0 var pItem uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var zMsg uintptr var i int32 var pLoop uintptr Xsqlite3StrAccumInit(tls, bp+24, db, bp+56, int32(unsafe.Sizeof([100]int8{})), SQLITE_MAX_LENGTH) (*StrAccum)(unsafe.Pointer(bp + 24)).FprintfFlags = U8(SQLITE_PRINTF_INTERNAL) Xsqlite3_str_appendf(tls, bp+24, ts+23164, libc.VaList(bp, pItem)) pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IPK) != 0 { var pTab uintptr = (*SrcItem)(unsafe.Pointer(pItem)).FpTab if int32((*Table)(unsafe.Pointer(pTab)).FiPKey) >= 0 { Xsqlite3_str_appendf(tls, bp+24, ts+22952, libc.VaList(bp+8, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr((*Table)(unsafe.Pointer(pTab)).FiPKey)*24)).FzCnName)) } else { Xsqlite3_str_appendf(tls, bp+24, ts+23185, 0) } } else { for i = int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip); i < int32(*(*U16)(unsafe.Pointer(pLoop + 24))); i++ { var z uintptr = explainIndexColumnName(tls, *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)), i) if i > int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip) { Xsqlite3_str_append(tls, bp+24, ts+22941, 5) } Xsqlite3_str_appendf(tls, bp+24, ts+22952, libc.VaList(bp+16, z)) } } Xsqlite3_str_append(tls, bp+24, ts+6309, 1) zMsg = Xsqlite3StrAccumFinish(tls, bp+24) ret = Xsqlite3VdbeAddOp4(tls, v, OP_Explain, Xsqlite3VdbeCurrentAddr(tls, v), (*Parse)(unsafe.Pointer(pParse)).FaddrExplain, 0, zMsg, -6) return ret } func disableTerm(tls *libc.TLS, pLevel uintptr, pTerm uintptr) { var nLoop int32 = 0 for int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_CODED == 0 && ((*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin == 0 || (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_OuterON) != U32(0)) && (*WhereLevel)(unsafe.Pointer(pLevel)).FnotReady&(*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll == uint64(0) { if nLoop != 0 && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_LIKE != 0 { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_LIKECOND) } else { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_CODED) } if (*WhereTerm)(unsafe.Pointer(pTerm)).FiParent < 0 { break } pTerm = (*WhereClause)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpWC)).Fa + uintptr((*WhereTerm)(unsafe.Pointer(pTerm)).FiParent)*56 (*WhereTerm)(unsafe.Pointer(pTerm)).FnChild-- if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FnChild) != 0 { break } nLoop++ } } func codeApplyAffinity(tls *libc.TLS, pParse uintptr, base int32, n int32, zAff uintptr) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe if zAff == uintptr(0) { return } for n > 0 && int32(*(*int8)(unsafe.Pointer(zAff))) <= SQLITE_AFF_BLOB { n-- base++ zAff++ } for n > 1 && int32(*(*int8)(unsafe.Pointer(zAff + uintptr(n-1)))) <= SQLITE_AFF_BLOB { n-- } if n > 0 { Xsqlite3VdbeAddOp4(tls, v, OP_Affinity, base, n, 0, zAff, n) } } func updateRangeAffinityStr(tls *libc.TLS, pRight uintptr, n int32, zAff uintptr) { var i int32 for i = 0; i < n; i++ { var p uintptr = Xsqlite3VectorFieldSubexpr(tls, pRight, i) if int32(Xsqlite3CompareAffinity(tls, p, *(*int8)(unsafe.Pointer(zAff + uintptr(i))))) == SQLITE_AFF_BLOB || Xsqlite3ExprNeedsNoAffinityChange(tls, p, *(*int8)(unsafe.Pointer(zAff + uintptr(i)))) != 0 { *(*int8)(unsafe.Pointer(zAff + uintptr(i))) = int8(SQLITE_AFF_BLOB) } } } func removeUnindexableInClauseTerms(tls *libc.TLS, pParse uintptr, iEq int32, pLoop uintptr, pX uintptr) uintptr { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pSelect uintptr var pNew uintptr pNew = Xsqlite3ExprDup(tls, db, pX, 0) if int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) == 0 { for pSelect = *(*uintptr)(unsafe.Pointer(pNew + 32)); pSelect != 0; pSelect = (*Select)(unsafe.Pointer(pSelect)).FpPrior { var pOrigRhs uintptr var pOrigLhs uintptr = uintptr(0) var pRhs uintptr = uintptr(0) var pLhs uintptr = uintptr(0) var i int32 pOrigRhs = (*Select)(unsafe.Pointer(pSelect)).FpEList if pSelect == *(*uintptr)(unsafe.Pointer(pNew + 32)) { pOrigLhs = *(*uintptr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pNew)).FpLeft + 32)) } for i = iEq; i < int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm); i++ { if (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(i)*8)))).FpExpr == pX { var iField int32 iField = *(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(i)*8)) + 32 + 4)) - 1 if (*ExprList_item)(unsafe.Pointer(pOrigRhs+8+uintptr(iField)*32)).FpExpr == uintptr(0) { continue } pRhs = Xsqlite3ExprListAppend(tls, pParse, pRhs, (*ExprList_item)(unsafe.Pointer(pOrigRhs+8+uintptr(iField)*32)).FpExpr) (*ExprList_item)(unsafe.Pointer(pOrigRhs + 8 + uintptr(iField)*32)).FpExpr = uintptr(0) if pOrigLhs != 0 { pLhs = Xsqlite3ExprListAppend(tls, pParse, pLhs, (*ExprList_item)(unsafe.Pointer(pOrigLhs+8+uintptr(iField)*32)).FpExpr) (*ExprList_item)(unsafe.Pointer(pOrigLhs + 8 + uintptr(iField)*32)).FpExpr = uintptr(0) } } } Xsqlite3ExprListDelete(tls, db, pOrigRhs) if pOrigLhs != 0 { Xsqlite3ExprListDelete(tls, db, pOrigLhs) *(*uintptr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pNew)).FpLeft + 32)) = pLhs } (*Select)(unsafe.Pointer(pSelect)).FpEList = pRhs if pLhs != 0 && (*ExprList)(unsafe.Pointer(pLhs)).FnExpr == 1 { var p uintptr = (*ExprList_item)(unsafe.Pointer(pLhs + 8)).FpExpr (*ExprList_item)(unsafe.Pointer(pLhs + 8)).FpExpr = uintptr(0) Xsqlite3ExprDelete(tls, db, (*Expr)(unsafe.Pointer(pNew)).FpLeft) (*Expr)(unsafe.Pointer(pNew)).FpLeft = p } if (*Select)(unsafe.Pointer(pSelect)).FpOrderBy != 0 { var pOrderBy uintptr = (*Select)(unsafe.Pointer(pSelect)).FpOrderBy for i = 0; i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr; i++ { *(*U16)(unsafe.Pointer(pOrderBy + 8 + uintptr(i)*32 + 24)) = U16(0) } } } } return pNew } func codeEqualityTerm(tls *libc.TLS, pParse uintptr, pTerm uintptr, pLevel uintptr, iEq int32, bRev int32, iTarget int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pX uintptr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var iReg int32 if int32((*Expr)(unsafe.Pointer(pX)).Fop) == TK_EQ || int32((*Expr)(unsafe.Pointer(pX)).Fop) == TK_IS { iReg = Xsqlite3ExprCodeTarget(tls, pParse, (*Expr)(unsafe.Pointer(pX)).FpRight, iTarget) } else if int32((*Expr)(unsafe.Pointer(pX)).Fop) == TK_ISNULL { iReg = iTarget Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, iReg) } else { var eType int32 = IN_INDEX_NOOP var pIn uintptr var pLoop uintptr = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop var i int32 var nEq int32 = 0 var aiMap uintptr = uintptr(0) if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_VIRTUALTABLE) == U32(0) && *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) != uintptr(0) && *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)))).FaSortOrder + uintptr(iEq))) != 0 { bRev = libc.BoolInt32(!(bRev != 0)) } iReg = iTarget for i = 0; i < iEq; i++ { if *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(i)*8)) != 0 && (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(i)*8)))).FpExpr == pX { disableTerm(tls, pLevel, pTerm) return iTarget } } for i = iEq; i < int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm); i++ { if (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(i)*8)))).FpExpr == pX { nEq++ } } *(*int32)(unsafe.Pointer(bp)) = 0 if !((*Expr)(unsafe.Pointer(pX)).Fflags&U32(EP_xIsSelect) != U32(0)) || (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pX + 32)))).FpEList)).FnExpr == 1 { eType = Xsqlite3FindInIndex(tls, pParse, pX, uint32(IN_INDEX_LOOP), uintptr(0), uintptr(0), bp) } else { var pExpr uintptr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if (*Expr)(unsafe.Pointer(pExpr)).FiTable == 0 || !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Subrtn) != U32(0)) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb pX = removeUnindexableInClauseTerms(tls, pParse, iEq, pLoop, pX) if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { aiMap = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(int32(0)))*uint64(nEq)) eType = Xsqlite3FindInIndex(tls, pParse, pX, uint32(IN_INDEX_LOOP), uintptr(0), aiMap, bp) (*Expr)(unsafe.Pointer(pExpr)).FiTable = *(*int32)(unsafe.Pointer(bp)) } Xsqlite3ExprDelete(tls, db, pX) } else { var n int32 = Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pX)).FpLeft) aiMap = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(int32(0)))*func() uint64 { if nEq > n { return uint64(nEq) } return uint64(n) }()) eType = Xsqlite3FindInIndex(tls, pParse, pX, uint32(IN_INDEX_LOOP), uintptr(0), aiMap, bp) } pX = pExpr } if eType == IN_INDEX_INDEX_DESC { bRev = libc.BoolInt32(!(bRev != 0)) } Xsqlite3VdbeAddOp2(tls, v, func() int32 { if bRev != 0 { return OP_Last } return OP_Rewind }(), *(*int32)(unsafe.Pointer(bp)), 0) *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_IN_ABLE) if *(*int32)(unsafe.Pointer(pLevel + 72)) == 0 { (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrNxt = Xsqlite3VdbeMakeLabel(tls, pParse) } if iEq > 0 && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_SEEKSCAN) == U32(0) { *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_IN_EARLYOUT) } i = *(*int32)(unsafe.Pointer(pLevel + 72)) *(*int32)(unsafe.Pointer(pLevel + 72)) += nEq *(*uintptr)(unsafe.Pointer(pLevel + 72 + 8)) = Xsqlite3WhereRealloc(tls, (*WhereClause)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpWC)).FpWInfo, *(*uintptr)(unsafe.Pointer(pLevel + 72 + 8)), uint64(unsafe.Sizeof(InLoop{}))*uint64(*(*int32)(unsafe.Pointer(pLevel + 72)))) pIn = *(*uintptr)(unsafe.Pointer(pLevel + 72 + 8)) if pIn != 0 { var iMap int32 = 0 pIn += 20 * uintptr(i) for i = iEq; i < int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm); i++ { if (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(i)*8)))).FpExpr == pX { var iOut int32 = iReg + i - iEq if eType == IN_INDEX_ROWID { *(*int32)(unsafe.Pointer(pIn + 4)) = Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, *(*int32)(unsafe.Pointer(bp)), iOut) } else { var iCol int32 if aiMap != 0 { iCol = *(*int32)(unsafe.Pointer(aiMap + uintptr(libc.PostIncInt32(&iMap, 1))*4)) } else { iCol = 0 } *(*int32)(unsafe.Pointer(pIn + 4)) = Xsqlite3VdbeAddOp3(tls, v, OP_Column, *(*int32)(unsafe.Pointer(bp)), iCol, iOut) } Xsqlite3VdbeAddOp1(tls, v, OP_IsNull, iOut) if i == iEq { *(*int32)(unsafe.Pointer(pIn)) = *(*int32)(unsafe.Pointer(bp)) *(*U8)(unsafe.Pointer(pIn + 16)) = func() uint8 { if bRev != 0 { return uint8(OP_Prev) } return uint8(OP_Next) }() if iEq > 0 { *(*int32)(unsafe.Pointer(pIn + 8)) = iReg - i *(*int32)(unsafe.Pointer(pIn + 12)) = i } else { *(*int32)(unsafe.Pointer(pIn + 12)) = 0 } } else { *(*U8)(unsafe.Pointer(pIn + 16)) = U8(OP_Noop) } pIn += 20 } } if iEq > 0 && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_SEEKSCAN|WHERE_VIRTUALTABLE) == U32(0) { Xsqlite3VdbeAddOp3(tls, v, OP_SeekHit, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur, 0, iEq) } } else { *(*int32)(unsafe.Pointer(pLevel + 72)) = 0 } Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, aiMap) } if (*WhereLoop1)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop)).FwsFlags&U32(WHERE_TRANSCONS) == U32(0) || int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_EQUIV == 0 { disableTerm(tls, pLevel, pTerm) } return iReg } func codeAllEqualityTerms(tls *libc.TLS, pParse uintptr, pLevel uintptr, bRev int32, nExtraReg int32, pzAff uintptr) int32 { var nEq U16 var nSkip U16 var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var pIdx uintptr var pTerm uintptr var pLoop uintptr var j int32 var regBase int32 var nReg int32 var zAff uintptr pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop nEq = *(*U16)(unsafe.Pointer(pLoop + 24)) nSkip = (*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip pIdx = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) regBase = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 nReg = int32(*(*U16)(unsafe.Pointer(pLoop + 24))) + nExtraReg *(*int32)(unsafe.Pointer(pParse + 56)) += nReg zAff = Xsqlite3DbStrDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, Xsqlite3IndexAffinityStr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pIdx)) if nSkip != 0 { var iIdxCur int32 = (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur Xsqlite3VdbeAddOp3(tls, v, OP_Null, 0, regBase, regBase+int32(nSkip)-1) Xsqlite3VdbeAddOp1(tls, v, func() int32 { if bRev != 0 { return OP_Last } return OP_Rewind }(), iIdxCur) j = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrSkip = Xsqlite3VdbeAddOp4Int(tls, v, func() int32 { if bRev != 0 { return OP_SeekLT } return OP_SeekGT }(), iIdxCur, 0, regBase, int32(nSkip)) Xsqlite3VdbeJumpHere(tls, v, j) for j = 0; j < int32(nSkip); j++ { Xsqlite3VdbeAddOp3(tls, v, OP_Column, iIdxCur, j, regBase+j) } } for j = int32(nSkip); j < int32(nEq); j++ { var r1 int32 pTerm = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)) r1 = codeEqualityTerm(tls, pParse, pTerm, pLevel, j, bRev, regBase+j) if r1 != regBase+j { if nReg == 1 { Xsqlite3ReleaseTempReg(tls, pParse, regBase) regBase = r1 } else { Xsqlite3VdbeAddOp2(tls, v, OP_Copy, r1, regBase+j) } } } for j = int32(nSkip); j < int32(nEq); j++ { pTerm = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)) if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_IN != 0 { if (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_xIsSelect) != 0 { if zAff != 0 { *(*int8)(unsafe.Pointer(zAff + uintptr(j))) = int8(SQLITE_AFF_BLOB) } } } else if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_ISNULL == 0 { var pRight uintptr = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpRight if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_IS == 0 && Xsqlite3ExprCanBeNull(tls, pRight) != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regBase+j, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBrk) } if (*Parse)(unsafe.Pointer(pParse)).FnErr == 0 { if int32(Xsqlite3CompareAffinity(tls, pRight, *(*int8)(unsafe.Pointer(zAff + uintptr(j))))) == SQLITE_AFF_BLOB { *(*int8)(unsafe.Pointer(zAff + uintptr(j))) = int8(SQLITE_AFF_BLOB) } if Xsqlite3ExprNeedsNoAffinityChange(tls, pRight, *(*int8)(unsafe.Pointer(zAff + uintptr(j)))) != 0 { *(*int8)(unsafe.Pointer(zAff + uintptr(j))) = int8(SQLITE_AFF_BLOB) } } } } *(*uintptr)(unsafe.Pointer(pzAff)) = zAff return regBase } func codeDeferredSeek(tls *libc.TLS, pWInfo uintptr, pIdx uintptr, iCur int32, iIdxCur int32) { var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe libc.SetBitFieldPtr8Uint32(pWInfo+68, uint32(1), 0, 0x1) Xsqlite3VdbeAddOp3(tls, v, OP_DeferredSeek, iIdxCur, 0, iCur) if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&(WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN) != 0 && (*Parse)(unsafe.Pointer(func() uintptr { if (*Parse)(unsafe.Pointer(pParse)).FpToplevel != 0 { return (*Parse)(unsafe.Pointer(pParse)).FpToplevel } return pParse }())).FwriteMask == YDbMask(0) { var i int32 var pTab uintptr = (*Index)(unsafe.Pointer(pIdx)).FpTable var ai uintptr = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(U32(0)))*uint64(int32((*Table)(unsafe.Pointer(pTab)).FnCol)+1)) if ai != 0 { *(*U32)(unsafe.Pointer(ai)) = U32((*Table)(unsafe.Pointer(pTab)).FnCol) for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn)-1; i++ { var x1 int32 var x2 int32 x1 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) x2 = int32(Xsqlite3TableColumnToStorage(tls, pTab, int16(x1))) if x1 >= 0 { *(*U32)(unsafe.Pointer(ai + uintptr(x2+1)*4)) = U32(i + 1) } } Xsqlite3VdbeChangeP4(tls, v, -1, ai, -14) } } } func codeExprOrVector(tls *libc.TLS, pParse uintptr, p uintptr, iReg int32, nReg int32) { if p != 0 && Xsqlite3ExprIsVector(tls, p) != 0 { if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_xIsSelect) != U32(0) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var iSelect int32 iSelect = Xsqlite3CodeSubselect(tls, pParse, p) Xsqlite3VdbeAddOp3(tls, v, OP_Copy, iSelect, iReg, nReg-1) } else { var i int32 var pList uintptr pList = *(*uintptr)(unsafe.Pointer(p + 32)) for i = 0; i < nReg; i++ { Xsqlite3ExprCode(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr, iReg+i) } } } else { Xsqlite3ExprCode(tls, pParse, p, iReg) } } func whereApplyPartialIndexConstraints(tls *libc.TLS, pTruth uintptr, iTabCur int32, pWC uintptr) { var i int32 var pTerm uintptr for int32((*Expr)(unsafe.Pointer(pTruth)).Fop) == TK_AND { whereApplyPartialIndexConstraints(tls, (*Expr)(unsafe.Pointer(pTruth)).FpLeft, iTabCur, pWC) pTruth = (*Expr)(unsafe.Pointer(pTruth)).FpRight } i = 0 pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa __1: if !(i < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm) { goto __3 } { var pExpr uintptr if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_CODED != 0 { goto __2 } pExpr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if Xsqlite3ExprCompare(tls, uintptr(0), pExpr, pTruth, iTabCur) == 0 { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_CODED) } } goto __2 __2: i++ pTerm += 56 goto __1 goto __3 __3: } func filterPullDown(tls *libc.TLS, pParse uintptr, pWInfo uintptr, iLevel int32, addrNxt int32, notReady Bitmask) { bp := tls.Alloc(8) defer tls.Free(8) for libc.PreIncInt32(&iLevel, 1) < int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) { var pLevel uintptr = pWInfo + 856 + uintptr(iLevel)*104 var pLoop uintptr = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop if (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter == 0 { continue } if (*WhereLoop1)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop)).FnSkip != 0 { continue } if (*WhereLoop)(unsafe.Pointer(pLoop)).Fprereq¬Ready != 0 { continue } (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBrk = addrNxt if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IPK) != 0 { var pTerm uintptr = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm)) var regRowid int32 regRowid = Xsqlite3GetTempReg(tls, pParse) regRowid = codeEqualityTerm(tls, pParse, pTerm, pLevel, 0, 0, regRowid) Xsqlite3VdbeAddOp2(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, OP_MustBeInt, regRowid, addrNxt) Xsqlite3VdbeAddOp4Int(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, OP_Filter, (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter, addrNxt, regRowid, 1) } else { var nEq U16 = *(*U16)(unsafe.Pointer(pLoop + 24)) var r1 int32 r1 = codeAllEqualityTerms(tls, pParse, pLevel, 0, 0, bp) codeApplyAffinity(tls, pParse, r1, int32(nEq), *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3DbFree(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3VdbeAddOp4Int(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, OP_Filter, (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter, addrNxt, r1, int32(nEq)) } (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter = 0 (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBrk = 0 } } // Generate code for the start of the iLevel-th loop in the WHERE clause // implementation described by pWInfo. func Xsqlite3WhereCodeOneLoopStart(tls *libc.TLS, pParse uintptr, v uintptr, pWInfo uintptr, iLevel int32, pLevel uintptr, notReady Bitmask) Bitmask { bp := tls.Alloc(96) defer tls.Free(96) var j int32 var k int32 var iCur int32 var addrNxt int32 var bRev int32 var pLoop uintptr var pWC uintptr var pTerm uintptr var db uintptr var pTabItem uintptr var addrBrk int32 var addrHalt int32 var addrCont int32 var iRowidReg int32 var iReleaseReg int32 var pIdx uintptr var iLoop int32 var regYield int32 var iTab int32 var iCache int32 var pRight uintptr var iTarget int32 var iFld int32 var pLeft uintptr var pCompare uintptr var pRight1 uintptr var pOp uintptr var iIn int32 var iReg int32 var addrNotFound int32 var nConstraint int32 var pX uintptr var r1 int32 var op int32 var pX1 uintptr var testOp int32 var start int32 var memEndValue int32 var pStart uintptr var pEnd uintptr var t uintptr var t1 U8 var t2 U8 var pRight2 uintptr var pRight3 uintptr var pPk uintptr var nEq U16 var nBtm U16 var nTop U16 var regBase int32 var pRangeStart uintptr var pRangeEnd uintptr var startEq int32 var endEq int32 var start_constraints int32 var nConstraint1 int32 var iIdxCur int32 var nExtraReg int32 var op1 int32 var zEndAff uintptr var bSeekPastNull U8 var bStopAtNull U8 var omitTable int32 var regBignull int32 var addrSeekScan int32 var nNotReady int32 var origSrc uintptr var pPk1 uintptr var pExpr uintptr var iTerm int32 var iCol int32 var pPk2 uintptr var nPk int32 var iPk int32 var r int32 var iSet int32 var pSubLoop uintptr var addrExplain int32 _ = addrExplain var pSubWInfo uintptr var pOrExpr uintptr var pDelete uintptr var jmp1 int32 var pOrTerm uintptr var pOrWc uintptr var pOrTab uintptr var pCov uintptr var iCovCur int32 var regReturn int32 var regRowset int32 var regRowid int32 var iLoopBody int32 var iRetInit int32 var untestedTerms int32 var ii int32 var pAndExpr uintptr var pTab uintptr var m Bitmask var pE uintptr var skipLikeAddr int32 var iNext int32 var pE1 uintptr var pAlt uintptr var iCol1 int32 var iPk1 int32 var pPk3 uintptr var pTab1 uintptr var nPk1 int32 var r2 int32 var jmp11 int32 var pRJ uintptr var pRJ1 uintptr iRowidReg = 0 iReleaseReg = 0 pIdx = uintptr(0) pWC = pWInfo + 104 db = (*Parse)(unsafe.Pointer(pParse)).Fdb pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop pTabItem = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 iCur = (*SrcItem)(unsafe.Pointer(pTabItem)).FiCursor (*WhereLevel)(unsafe.Pointer(pLevel)).FnotReady = notReady & ^Xsqlite3WhereGetMask(tls, pWInfo+592, iCur) bRev = int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FrevMask >> iLevel & uint64(1)) addrBrk = libc.AssignPtrInt32(pLevel+12, libc.AssignPtrInt32(pLevel+16, Xsqlite3VdbeMakeLabel(tls, pParse))) addrCont = libc.AssignPtrInt32(pLevel+24, Xsqlite3VdbeMakeLabel(tls, pParse)) if !(int32((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom) > 0 && int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&JT_LEFT != 0) { goto __1 } (*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin) __1: ; j = iLevel __2: if !(j > 0) { goto __4 } if !((*WhereLevel)(unsafe.Pointer(pWInfo+856+uintptr(j)*104)).FiLeftJoin != 0) { goto __5 } goto __4 __5: ; if !((*WhereLevel)(unsafe.Pointer(pWInfo+856+uintptr(j)*104)).FpRJ != 0) { goto __6 } goto __4 __6: ; goto __3 __3: j-- goto __2 goto __4 __4: ; addrHalt = (*WhereLevel)(unsafe.Pointer(pWInfo + 856 + uintptr(j)*104)).FaddrBrk if !(uint32(int32(*(*uint16)(unsafe.Pointer(pTabItem + 60 + 4))&0x20>>5)) != 0) { goto __7 } regYield = (*SrcItem)(unsafe.Pointer(pTabItem)).FregReturn Xsqlite3VdbeAddOp3(tls, v, OP_InitCoroutine, regYield, 0, (*SrcItem)(unsafe.Pointer(pTabItem)).FaddrFillSub) (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 = Xsqlite3VdbeAddOp2(tls, v, OP_Yield, regYield, addrBrk) (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = U8(OP_Goto) goto __8 __7: if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_VIRTUALTABLE) != U32(0)) { goto __9 } nConstraint = int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm) iReg = Xsqlite3GetTempRange(tls, pParse, nConstraint+2) addrNotFound = (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBrk j = 0 __11: if !(j < nConstraint) { goto __13 } iTarget = iReg + j + 2 pTerm = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)) if !(pTerm == uintptr(0)) { goto __14 } goto __12 __14: ; if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_IN != 0) { goto __15 } if !(func() uint32 { if j <= 31 { return uint32(1) << j } return uint32(0) }()&*(*U32)(unsafe.Pointer(pLoop + 24 + 24)) != 0) { goto __17 } iTab = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) iCache = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3CodeRhsOfIN(tls, pParse, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr, iTab) Xsqlite3VdbeAddOp3(tls, v, OP_VInitIn, iTab, iTarget, iCache) goto __18 __17: codeEqualityTerm(tls, pParse, pTerm, pLevel, j, bRev, iTarget) addrNotFound = (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrNxt __18: ; goto __16 __15: pRight = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpRight codeExprOrVector(tls, pParse, pRight, iTarget, 1) if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeMatchOp) == SQLITE_INDEX_CONSTRAINT_OFFSET && U32(int32(*(*uint8)(unsafe.Pointer(pLoop + 24 + 4))&0x2>>1)) != 0) { goto __19 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*Select)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect)).FiOffset) __19: ; __16: ; goto __12 __12: j++ goto __11 goto __13 __13: ; Xsqlite3VdbeAddOp2(tls, v, OP_Integer, *(*int32)(unsafe.Pointer(pLoop + 24)), iReg) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, nConstraint, iReg+1) Xsqlite3VdbeAddOp4(tls, v, OP_VFilter, iCur, addrNotFound, iReg, *(*uintptr)(unsafe.Pointer(pLoop + 24 + 16)), func() int32 { if U32(int32(*(*uint8)(unsafe.Pointer(pLoop + 24 + 4))&0x1>>0)) != 0 { return -6 } return -1 }()) libc.SetBitFieldPtr8Uint32(pLoop+24+4, U32(0), 0, 0x1) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __20 } *(*uintptr)(unsafe.Pointer(pLoop + 24 + 16)) = uintptr(0) __20: ; (*WhereLevel)(unsafe.Pointer(pLevel)).Fp1 = iCur (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = func() uint8 { if (*WhereInfo)(unsafe.Pointer(pWInfo)).FeOnePass != 0 { return uint8(OP_Noop) } return uint8(OP_VNext) }() (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 = Xsqlite3VdbeCurrentAddr(tls, v) j = 0 __21: if !(j < nConstraint) { goto __23 } pTerm = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)) if !(j < 16 && int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 8)))>>j&1 != 0) { goto __24 } disableTerm(tls, pLevel, pTerm) goto __22 __24: ; if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_IN != 0 && func() uint32 { if j <= 31 { return uint32(1) << j } return uint32(0) }()&*(*U32)(unsafe.Pointer(pLoop + 24 + 24)) == uint32(0) && !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0)) { goto __25 } iIn = 0 __26: if !(iIn < *(*int32)(unsafe.Pointer(pLevel + 72))) { goto __28 } pOp = Xsqlite3VdbeGetOp(tls, v, *(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pLevel + 72 + 8)) + uintptr(iIn)*20 + 4))) if !(int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Column && (*VdbeOp)(unsafe.Pointer(pOp)).Fp3 == iReg+j+2 || int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Rowid && (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 == iReg+j+2) { goto __29 } Xsqlite3VdbeAddOp3(tls, v, int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode), (*VdbeOp)(unsafe.Pointer(pOp)).Fp1, (*VdbeOp)(unsafe.Pointer(pOp)).Fp2, (*VdbeOp)(unsafe.Pointer(pOp)).Fp3) goto __28 __29: ; goto __27 __27: iIn++ goto __26 goto __28 __28: ; pCompare = Xsqlite3PExpr(tls, pParse, TK_EQ, uintptr(0), uintptr(0)) if !!(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { goto __30 } iFld = *(*int32)(unsafe.Pointer(pTerm + 32 + 4)) pLeft = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpLeft if !(iFld > 0) { goto __31 } (*Expr)(unsafe.Pointer(pCompare)).FpLeft = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pLeft + 32)) + 8 + uintptr(iFld-1)*32)).FpExpr goto __32 __31: (*Expr)(unsafe.Pointer(pCompare)).FpLeft = pLeft __32: ; (*Expr)(unsafe.Pointer(pCompare)).FpRight = libc.AssignUintptr(&pRight1, Xsqlite3Expr(tls, db, TK_REGISTER, uintptr(0))) if !(pRight1 != 0) { goto __33 } (*Expr)(unsafe.Pointer(pRight1)).FiTable = iReg + j + 2 Xsqlite3ExprIfFalse(tls, pParse, pCompare, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont, SQLITE_JUMPIFNULL) __33: ; (*Expr)(unsafe.Pointer(pCompare)).FpLeft = uintptr(0) __30: ; Xsqlite3ExprDelete(tls, db, pCompare) __25: ; goto __22 __22: j++ goto __21 goto __23 __23: ; goto __10 __9: if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IPK) != U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_COLUMN_IN|WHERE_COLUMN_EQ) != U32(0)) { goto __34 } pTerm = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm)) iReleaseReg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) iRowidReg = codeEqualityTerm(tls, pParse, pTerm, pLevel, 0, bRev, iReleaseReg) if !(iRowidReg != iReleaseReg) { goto __36 } Xsqlite3ReleaseTempReg(tls, pParse, iReleaseReg) __36: ; addrNxt = (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrNxt if !((*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter != 0) { goto __37 } Xsqlite3VdbeAddOp2(tls, v, OP_MustBeInt, iRowidReg, addrNxt) Xsqlite3VdbeAddOp4Int(tls, v, OP_Filter, (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter, addrNxt, iRowidReg, 1) filterPullDown(tls, pParse, pWInfo, iLevel, addrNxt, notReady) __37: ; Xsqlite3VdbeAddOp3(tls, v, OP_SeekRowid, iCur, addrNxt, iRowidReg) (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = U8(OP_Noop) goto __35 __34: if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IPK) != U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_COLUMN_RANGE) != U32(0)) { goto __38 } testOp = OP_Noop memEndValue = 0 j = 0 pStart = libc.AssignUintptr(&pEnd, uintptr(0)) if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_BTM_LIMIT) != 0) { goto __40 } pStart = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(libc.PostIncInt32(&j, 1))*8)) __40: ; if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_TOP_LIMIT) != 0) { goto __41 } pEnd = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(libc.PostIncInt32(&j, 1))*8)) __41: ; if !(bRev != 0) { goto __42 } pTerm = pStart pStart = pEnd pEnd = pTerm __42: ; if !(pStart != 0) { goto __43 } *(*[4]U8)(unsafe.Pointer(bp + 8)) = [4]U8{ U8(OP_SeekGT), U8(OP_SeekLE), U8(OP_SeekLT), U8(OP_SeekGE), } pX = (*WhereTerm)(unsafe.Pointer(pStart)).FpExpr if !(Xsqlite3ExprIsVector(tls, (*Expr)(unsafe.Pointer(pX)).FpRight) != 0) { goto __45 } r1 = libc.AssignPtrInt32(bp+12, Xsqlite3GetTempReg(tls, pParse)) codeExprOrVector(tls, pParse, (*Expr)(unsafe.Pointer(pX)).FpRight, r1, 1) op = int32(*(*U8)(unsafe.Pointer(bp + 8 + uintptr((int32((*Expr)(unsafe.Pointer(pX)).Fop)-TK_GT-1)&0x3|0x1)))) goto __46 __45: r1 = Xsqlite3ExprCodeTemp(tls, pParse, (*Expr)(unsafe.Pointer(pX)).FpRight, bp+12) disableTerm(tls, pLevel, pStart) op = int32(*(*U8)(unsafe.Pointer(bp + 8 + uintptr(int32((*Expr)(unsafe.Pointer(pX)).Fop)-TK_GT)))) __46: ; Xsqlite3VdbeAddOp3(tls, v, op, iCur, addrBrk, r1) Xsqlite3ReleaseTempReg(tls, pParse, *(*int32)(unsafe.Pointer(bp + 12))) goto __44 __43: Xsqlite3VdbeAddOp2(tls, v, func() int32 { if bRev != 0 { return OP_Last } return OP_Rewind }(), iCur, addrHalt) __44: ; if !(pEnd != 0) { goto __47 } pX1 = (*WhereTerm)(unsafe.Pointer(pEnd)).FpExpr memEndValue = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) codeExprOrVector(tls, pParse, (*Expr)(unsafe.Pointer(pX1)).FpRight, memEndValue, 1) if !(0 == Xsqlite3ExprIsVector(tls, (*Expr)(unsafe.Pointer(pX1)).FpRight) && (int32((*Expr)(unsafe.Pointer(pX1)).Fop) == TK_LT || int32((*Expr)(unsafe.Pointer(pX1)).Fop) == TK_GT)) { goto __48 } if bRev != 0 { testOp = OP_Le } else { testOp = OP_Ge } goto __49 __48: if bRev != 0 { testOp = OP_Lt } else { testOp = OP_Gt } __49: ; if !(0 == Xsqlite3ExprIsVector(tls, (*Expr)(unsafe.Pointer(pX1)).FpRight)) { goto __50 } disableTerm(tls, pLevel, pEnd) __50: ; __47: ; start = Xsqlite3VdbeCurrentAddr(tls, v) (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = func() uint8 { if bRev != 0 { return uint8(OP_Prev) } return uint8(OP_Next) }() (*WhereLevel)(unsafe.Pointer(pLevel)).Fp1 = iCur (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 = start if !(testOp != OP_Noop) { goto __51 } iRowidReg = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iCur, iRowidReg) Xsqlite3VdbeAddOp3(tls, v, testOp, memEndValue, addrBrk, iRowidReg) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_AFF_NUMERIC|SQLITE_JUMPIFNULL)) __51: ; goto __39 __38: if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_INDEXED) != 0) { goto __52 } nEq = *(*U16)(unsafe.Pointer(pLoop + 24)) nBtm = *(*U16)(unsafe.Pointer(pLoop + 24 + 2)) nTop = *(*U16)(unsafe.Pointer(pLoop + 24 + 4)) pRangeStart = uintptr(0) pRangeEnd = uintptr(0) nExtraReg = 0 zEndAff = uintptr(0) bSeekPastNull = U8(0) bStopAtNull = U8(0) regBignull = 0 addrSeekScan = 0 pIdx = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) iIdxCur = (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur j = int32(nEq) if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_BTM_LIMIT) != 0) { goto __54 } pRangeStart = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(libc.PostIncInt32(&j, 1))*8)) nExtraReg = func() int32 { if nExtraReg > int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 2))) { return nExtraReg } return int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 2))) }() __54: ; if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_TOP_LIMIT) != 0) { goto __55 } pRangeEnd = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(libc.PostIncInt32(&j, 1))*8)) nExtraReg = func() int32 { if nExtraReg > int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 4))) { return nExtraReg } return int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 4))) }() if !(pRangeStart == uintptr(0)) { goto __56 } j = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(nEq)*2))) if !(j >= 0 && int32(*(*uint8)(unsafe.Pointer((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FaCol + uintptr(j)*24 + 8))&0xf>>0) == 0 || j == -2) { goto __57 } bSeekPastNull = U8(1) __57: ; __56: ; __55: ; if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_TOP_LIMIT|WHERE_BTM_LIMIT) == U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_BIGNULL_SORT) != U32(0)) { goto __58 } nExtraReg = 1 bSeekPastNull = U8(1) (*WhereLevel)(unsafe.Pointer(pLevel)).FregBignull = libc.AssignInt32(®Bignull, libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1)) if !((*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin != 0) { goto __59 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regBignull) __59: ; (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBignull = Xsqlite3VdbeMakeLabel(tls, pParse) __58: ; if !(int32(nEq) < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) && bRev == libc.Bool32(int32(*(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSortOrder + uintptr(nEq)))) == SQLITE_SO_ASC)) { goto __60 } t = pRangeEnd pRangeEnd = pRangeStart pRangeStart = t t1 = bSeekPastNull bSeekPastNull = bStopAtNull bStopAtNull = t1 t2 = U8(nBtm) nBtm = nTop nTop = U16(t2) __60: ; if !(iLevel > 0 && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_SEEKSCAN) != U32(0)) { goto __61 } Xsqlite3VdbeAddOp1(tls, v, OP_NullRow, iIdxCur) __61: ; regBase = codeAllEqualityTerms(tls, pParse, pLevel, bRev, nExtraReg, bp+16) if !(*(*uintptr)(unsafe.Pointer(bp + 16)) != 0 && nTop != 0) { goto __62 } zEndAff = Xsqlite3DbStrDup(tls, db, *(*uintptr)(unsafe.Pointer(bp + 16))+uintptr(nEq)) __62: ; addrNxt = func() int32 { if regBignull != 0 { return (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBignull } return (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrNxt }() startEq = libc.Bool32(!(pRangeStart != 0) || int32((*WhereTerm)(unsafe.Pointer(pRangeStart)).FeOperator)&(int32(WO_EQ)<<(TK_LE-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)) != 0) endEq = libc.Bool32(!(pRangeEnd != 0) || int32((*WhereTerm)(unsafe.Pointer(pRangeEnd)).FeOperator)&(int32(WO_EQ)<<(TK_LE-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)) != 0) start_constraints = libc.Bool32(pRangeStart != 0 || int32(nEq) > 0) nConstraint1 = int32(nEq) if !(pRangeStart != 0) { goto __63 } pRight2 = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pRangeStart)).FpExpr)).FpRight codeExprOrVector(tls, pParse, pRight2, regBase+int32(nEq), int32(nBtm)) if !(int32((*WhereTerm)(unsafe.Pointer(pRangeStart)).FwtFlags)&TERM_VNULL == 0 && Xsqlite3ExprCanBeNull(tls, pRight2) != 0) { goto __65 } Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regBase+int32(nEq), addrNxt) __65: ; if !(*(*uintptr)(unsafe.Pointer(bp + 16)) != 0) { goto __66 } updateRangeAffinityStr(tls, pRight2, int32(nBtm), *(*uintptr)(unsafe.Pointer(bp + 16))+uintptr(nEq)) __66: ; nConstraint1 = nConstraint1 + int32(nBtm) if !(Xsqlite3ExprIsVector(tls, pRight2) == 0) { goto __67 } disableTerm(tls, pLevel, pRangeStart) goto __68 __67: startEq = 1 __68: ; bSeekPastNull = U8(0) goto __64 __63: if !(bSeekPastNull != 0) { goto __69 } startEq = 0 Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regBase+int32(nEq)) start_constraints = 1 nConstraint1++ goto __70 __69: if !(regBignull != 0) { goto __71 } Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regBase+int32(nEq)) start_constraints = 1 nConstraint1++ __71: ; __70: ; __64: ; codeApplyAffinity(tls, pParse, regBase, nConstraint1-int32(bSeekPastNull), *(*uintptr)(unsafe.Pointer(bp + 16))) if !(int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip) > 0 && nConstraint1 == int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip)) { goto __72 } goto __73 __72: if !(regBignull != 0) { goto __74 } Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, regBignull) __74: ; if !((*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter != 0) { goto __75 } Xsqlite3VdbeAddOp4Int(tls, v, OP_Filter, (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter, addrNxt, regBase, int32(nEq)) filterPullDown(tls, pParse, pWInfo, iLevel, addrNxt, notReady) __75: ; op1 = int32(aStartOp[start_constraints<<2+startEq<<1+bRev]) if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_SEEKSCAN) != U32(0) && op1 == OP_SeekGE) { goto __76 } addrSeekScan = Xsqlite3VdbeAddOp1(tls, v, OP_SeekScan, (int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiRowLogEst)))+9)/10) if !(pRangeStart != 0) { goto __77 } Xsqlite3VdbeChangeP5(tls, v, uint16(1)) Xsqlite3VdbeChangeP2(tls, v, addrSeekScan, Xsqlite3VdbeCurrentAddr(tls, v)+1) addrSeekScan = 0 __77: ; __76: ; Xsqlite3VdbeAddOp4Int(tls, v, op1, iIdxCur, addrNxt, regBase, nConstraint1) if !(regBignull != 0) { goto __78 } Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, Xsqlite3VdbeCurrentAddr(tls, v)+2) op1 = int32(aStartOp[libc.Bool32(nConstraint1 > 1)*4+2+bRev]) Xsqlite3VdbeAddOp4Int(tls, v, op1, iIdxCur, addrNxt, regBase, nConstraint1-startEq) __78: ; __73: ; nConstraint1 = int32(nEq) if !(pRangeEnd != 0) { goto __79 } pRight3 = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pRangeEnd)).FpExpr)).FpRight if !(addrSeekScan != 0) { goto __81 } (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 = Xsqlite3VdbeCurrentAddr(tls, v) __81: ; codeExprOrVector(tls, pParse, pRight3, regBase+int32(nEq), int32(nTop)) if !(int32((*WhereTerm)(unsafe.Pointer(pRangeEnd)).FwtFlags)&TERM_VNULL == 0 && Xsqlite3ExprCanBeNull(tls, pRight3) != 0) { goto __82 } Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, regBase+int32(nEq), addrNxt) __82: ; if !(zEndAff != 0) { goto __83 } updateRangeAffinityStr(tls, pRight3, int32(nTop), zEndAff) codeApplyAffinity(tls, pParse, regBase+int32(nEq), int32(nTop), zEndAff) goto __84 __83: ; __84: ; nConstraint1 = nConstraint1 + int32(nTop) if !(Xsqlite3ExprIsVector(tls, pRight3) == 0) { goto __85 } disableTerm(tls, pLevel, pRangeEnd) goto __86 __85: endEq = 1 __86: ; goto __80 __79: if !(bStopAtNull != 0) { goto __87 } if !(regBignull == 0) { goto __88 } Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regBase+int32(nEq)) endEq = 0 __88: ; nConstraint1++ __87: ; __80: ; if !(*(*uintptr)(unsafe.Pointer(bp + 16)) != 0) { goto __89 } Xsqlite3DbNNFreeNN(tls, db, *(*uintptr)(unsafe.Pointer(bp + 16))) __89: ; if !(zEndAff != 0) { goto __90 } Xsqlite3DbNNFreeNN(tls, db, zEndAff) __90: ; if !((*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 == 0) { goto __91 } (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 = Xsqlite3VdbeCurrentAddr(tls, v) __91: ; if !(nConstraint1 != 0) { goto __92 } if !(regBignull != 0) { goto __93 } Xsqlite3VdbeAddOp2(tls, v, OP_IfNot, regBignull, Xsqlite3VdbeCurrentAddr(tls, v)+3) __93: ; op1 = int32(aEndOp[bRev*2+endEq]) Xsqlite3VdbeAddOp4Int(tls, v, op1, iIdxCur, addrNxt, regBase, nConstraint1) if !(addrSeekScan != 0) { goto __94 } Xsqlite3VdbeJumpHere(tls, v, addrSeekScan) __94: ; __92: ; if !(regBignull != 0) { goto __95 } Xsqlite3VdbeAddOp2(tls, v, OP_If, regBignull, Xsqlite3VdbeCurrentAddr(tls, v)+2) op1 = int32(aEndOp[bRev*2+int32(bSeekPastNull)]) Xsqlite3VdbeAddOp4Int(tls, v, op1, iIdxCur, addrNxt, regBase, nConstraint1+int32(bSeekPastNull)) __95: ; if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_EARLYOUT) != U32(0)) { goto __96 } Xsqlite3VdbeAddOp3(tls, v, OP_SeekHit, iIdxCur, int32(nEq), int32(nEq)) __96: ; omitTable = libc.Bool32((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IDX_ONLY) != U32(0) && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&(WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN) == 0) if !(omitTable != 0) { goto __97 } goto __98 __97: if !((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __99 } codeDeferredSeek(tls, pWInfo, pIdx, iCur, iIdxCur) goto __100 __99: if !(iCur != iIdxCur) { goto __101 } pPk = Xsqlite3PrimaryKeyIndex(tls, (*Index)(unsafe.Pointer(pIdx)).FpTable) iRowidReg = Xsqlite3GetTempRange(tls, pParse, int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) j = 0 __102: if !(j < int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) { goto __104 } k = int32(Xsqlite3TableColumnToIndex(tls, pIdx, *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(j)*2)))) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iIdxCur, k, iRowidReg+j) goto __103 __103: j++ goto __102 goto __104 __104: ; Xsqlite3VdbeAddOp4Int(tls, v, OP_NotFound, iCur, addrCont, iRowidReg, int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) __101: ; __100: ; __98: ; if !((*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin == 0) { goto __105 } if !((*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != 0) { goto __107 } whereApplyPartialIndexConstraints(tls, (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere, iCur, pWC) __107: ; goto __106 __105: ; __106: ; if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_ONEROW) != 0) { goto __108 } (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = U8(OP_Noop) goto __109 __108: if !(bRev != 0) { goto __110 } (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = U8(OP_Prev) goto __111 __110: (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = U8(OP_Next) __111: ; __109: ; (*WhereLevel)(unsafe.Pointer(pLevel)).Fp1 = iIdxCur (*WhereLevel)(unsafe.Pointer(pLevel)).Fp3 = func() uint8 { if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_UNQ_WANTED) != U32(0) { return uint8(1) } return uint8(0) }() if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_CONSTRAINT) == U32(0)) { goto __112 } (*WhereLevel)(unsafe.Pointer(pLevel)).Fp5 = U8(SQLITE_STMTSTATUS_FULLSCAN_STEP) goto __113 __112: ; __113: ; if !(omitTable != 0) { goto __114 } pIdx = uintptr(0) __114: ; goto __53 __52: if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_MULTI_OR) != 0) { goto __115 } pCov = uintptr(0) iCovCur = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) regReturn = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) regRowset = 0 regRowid = 0 iLoopBody = Xsqlite3VdbeMakeLabel(tls, pParse) untestedTerms = 0 pAndExpr = uintptr(0) pTab = (*SrcItem)(unsafe.Pointer(pTabItem)).FpTab pTerm = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm)) pOrWc = *(*uintptr)(unsafe.Pointer(pTerm + 32)) (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = U8(OP_Return) (*WhereLevel)(unsafe.Pointer(pLevel)).Fp1 = regReturn if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) > 1) { goto __117 } nNotReady = int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) - iLevel - 1 pOrTab = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(SrcList{}))+uint64(nNotReady)*uint64(unsafe.Sizeof(SrcItem{}))) if !(pOrTab == uintptr(0)) { goto __119 } return notReady __119: ; (*SrcList)(unsafe.Pointer(pOrTab)).FnAlloc = U32(U8(nNotReady + 1)) (*SrcList)(unsafe.Pointer(pOrTab)).FnSrc = int32((*SrcList)(unsafe.Pointer(pOrTab)).FnAlloc) libc.Xmemcpy(tls, pOrTab+8, pTabItem, uint64(unsafe.Sizeof(SrcItem{}))) origSrc = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 k = 1 __120: if !(k <= nNotReady) { goto __122 } libc.Xmemcpy(tls, pOrTab+8+uintptr(k)*104, origSrc+uintptr((*WhereLevel)(unsafe.Pointer(pLevel+uintptr(k)*104)).FiFrom)*104, uint64(unsafe.Sizeof(SrcItem{}))) goto __121 __121: k++ goto __120 goto __122 __122: ; goto __118 __117: pOrTab = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList __118: ; if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_DUPLICATES_OK == 0) { goto __123 } if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __124 } regRowset = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, regRowset) goto __125 __124: pPk1 = Xsqlite3PrimaryKeyIndex(tls, pTab) regRowset = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, regRowset, int32((*Index)(unsafe.Pointer(pPk1)).FnKeyCol)) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pPk1) __125: ; regRowid = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) __123: ; iRetInit = Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regReturn) if !((*WhereClause)(unsafe.Pointer(pWC)).FnTerm > 1) { goto __126 } iTerm = 0 __127: if !(iTerm < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm) { goto __129 } pExpr = (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(iTerm)*56)).FpExpr if !((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr(iTerm)*56 == pTerm) { goto __130 } goto __128 __130: ; if !(int32((*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr(iTerm)*56)).FwtFlags)&(TERM_VIRTUAL|TERM_CODED|TERM_SLICE) != 0) { goto __131 } goto __128 __131: ; if !(int32((*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr(iTerm)*56)).FeOperator)&WO_ALL == 0) { goto __132 } goto __128 __132: ; if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_Subquery) != U32(0)) { goto __133 } goto __128 __133: ; pExpr = Xsqlite3ExprDup(tls, db, pExpr, 0) pAndExpr = Xsqlite3ExprAnd(tls, pParse, pAndExpr, pExpr) goto __128 __128: iTerm++ goto __127 goto __129 __129: ; if !(pAndExpr != 0) { goto __134 } pAndExpr = Xsqlite3PExpr(tls, pParse, TK_AND|0x10000, uintptr(0), pAndExpr) __134: ; __126: ; Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+23193, 0) ii = 0 __135: if !(ii < (*WhereClause)(unsafe.Pointer(pOrWc)).FnTerm) { goto __137 } pOrTerm = (*WhereClause)(unsafe.Pointer(pOrWc)).Fa + uintptr(ii)*56 if !((*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor == iCur || int32((*WhereTerm)(unsafe.Pointer(pOrTerm)).FeOperator)&WO_AND != 0) { goto __138 } pOrExpr = (*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr jmp1 = 0 pDelete = libc.AssignUintptr(&pOrExpr, Xsqlite3ExprDup(tls, db, pOrExpr, 0)) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __139 } Xsqlite3ExprDelete(tls, db, pDelete) goto __136 __139: ; if !(pAndExpr != 0) { goto __140 } (*Expr)(unsafe.Pointer(pAndExpr)).FpLeft = pOrExpr pOrExpr = pAndExpr __140: ; Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+23208, libc.VaList(bp, ii+1)) pSubWInfo = Xsqlite3WhereBegin(tls, pParse, pOrTab, pOrExpr, uintptr(0), uintptr(0), uintptr(0), uint16(WHERE_OR_SUBCLAUSE), iCovCur) if !(pSubWInfo != 0) { goto __141 } addrExplain = Xsqlite3WhereExplainOneScan(tls, pParse, pOrTab, pSubWInfo+856, uint16(0)) _ = addrExplain if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_DUPLICATES_OK == 0) { goto __142 } iSet = func() int32 { if ii == (*WhereClause)(unsafe.Pointer(pOrWc)).FnTerm-1 { return -1 } return ii }() if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __143 } Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iCur, -1, regRowid) jmp1 = Xsqlite3VdbeAddOp4Int(tls, v, OP_RowSetTest, regRowset, 0, regRowid, iSet) goto __144 __143: pPk2 = Xsqlite3PrimaryKeyIndex(tls, pTab) nPk = int32((*Index)(unsafe.Pointer(pPk2)).FnKeyCol) r = Xsqlite3GetTempRange(tls, pParse, nPk) iPk = 0 __145: if !(iPk < nPk) { goto __147 } iCol = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk2)).FaiColumn + uintptr(iPk)*2))) Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iCur, iCol, r+iPk) goto __146 __146: iPk++ goto __145 goto __147 __147: ; if !(iSet != 0) { goto __148 } jmp1 = Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, regRowset, 0, r, nPk) __148: ; if !(iSet >= 0) { goto __149 } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, r, nPk, regRowid) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, regRowset, regRowid, r, nPk) if !(iSet != 0) { goto __150 } Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_USESEEKRESULT)) __150: ; __149: ; Xsqlite3ReleaseTempRange(tls, pParse, r, nPk) __144: ; __142: ; Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, regReturn, iLoopBody) if !(jmp1 != 0) { goto __151 } Xsqlite3VdbeJumpHere(tls, v, jmp1) __151: ; if !(uint32(int32(*(*uint8)(unsafe.Pointer(pSubWInfo + 68))&0x2>>1)) != 0) { goto __152 } untestedTerms = 1 __152: ; pSubLoop = (*WhereLevel)(unsafe.Pointer(pSubWInfo + 856)).FpWLoop if !((*WhereLoop)(unsafe.Pointer(pSubLoop)).FwsFlags&U32(WHERE_INDEXED) != U32(0) && (ii == 0 || *(*uintptr)(unsafe.Pointer(pSubLoop + 24 + 8)) == pCov) && ((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) || !(int32(*(*uint16)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pSubLoop + 24 + 8)) + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY))) { goto __153 } pCov = *(*uintptr)(unsafe.Pointer(pSubLoop + 24 + 8)) goto __154 __153: pCov = uintptr(0) __154: ; if !(Xsqlite3WhereUsesDeferredSeek(tls, pSubWInfo) != 0) { goto __155 } libc.SetBitFieldPtr8Uint32(pWInfo+68, uint32(1), 0, 0x1) __155: ; Xsqlite3WhereEnd(tls, pSubWInfo) Xsqlite3VdbeExplainPop(tls, pParse) __141: ; Xsqlite3ExprDelete(tls, db, pDelete) __138: ; goto __136 __136: ii++ goto __135 goto __137 __137: ; Xsqlite3VdbeExplainPop(tls, pParse) *(*uintptr)(unsafe.Pointer(pLevel + 72)) = pCov if !(pCov != 0) { goto __156 } (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur = iCovCur __156: ; if !(pAndExpr != 0) { goto __157 } (*Expr)(unsafe.Pointer(pAndExpr)).FpLeft = uintptr(0) Xsqlite3ExprDelete(tls, db, pAndExpr) __157: ; Xsqlite3VdbeChangeP1(tls, v, iRetInit, Xsqlite3VdbeCurrentAddr(tls, v)) Xsqlite3VdbeGoto(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBrk) Xsqlite3VdbeResolveLabel(tls, v, iLoopBody) (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 = Xsqlite3VdbeCurrentAddr(tls, v) if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) > 1) { goto __158 } Xsqlite3DbFreeNN(tls, db, pOrTab) __158: ; if !!(untestedTerms != 0) { goto __159 } disableTerm(tls, pLevel, pTerm) __159: ; goto __116 __115: ; if !(uint32(int32(*(*uint16)(unsafe.Pointer(pTabItem + 60 + 4))&0x40>>6)) != 0) { goto __160 } (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = U8(OP_Noop) goto __161 __160: ; (*WhereLevel)(unsafe.Pointer(pLevel)).Fop = aStep[bRev] (*WhereLevel)(unsafe.Pointer(pLevel)).Fp1 = iCur (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2 = 1 + Xsqlite3VdbeAddOp2(tls, v, int32(aStart[bRev]), iCur, addrHalt) (*WhereLevel)(unsafe.Pointer(pLevel)).Fp5 = U8(SQLITE_STMTSTATUS_FULLSCAN_STEP) __161: ; __116: ; __53: ; __39: ; __35: ; __10: ; __8: ; iLoop = func() int32 { if pIdx != 0 { return 1 } return 2 }() __162: iNext = 0 pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa j = (*WhereClause)(unsafe.Pointer(pWC)).FnTerm __165: if !(j > 0) { goto __167 } skipLikeAddr = 0 if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&(TERM_VIRTUAL|TERM_CODED) != 0) { goto __168 } goto __166 __168: ; if !((*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll&(*WhereLevel)(unsafe.Pointer(pLevel)).FnotReady != uint64(0)) { goto __169 } libc.SetBitFieldPtr8Uint32(pWInfo+68, uint32(1), 1, 0x2) goto __166 __169: ; pE = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if !(int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ|JT_RIGHT) != 0) { goto __170 } if !!((*Expr)(unsafe.Pointer(pE)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0)) { goto __171 } goto __166 goto __172 __171: if !(int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&JT_LEFT == JT_LEFT && !((*Expr)(unsafe.Pointer(pE)).Fflags&U32(EP_OuterON) != U32(0))) { goto __173 } goto __166 goto __174 __173: m = Xsqlite3WhereGetMask(tls, pWInfo+592, *(*int32)(unsafe.Pointer(pE + 52))) if !(m&(*WhereLevel)(unsafe.Pointer(pLevel)).FnotReady != 0) { goto __175 } goto __166 __175: ; __174: ; __172: ; __170: ; if !(iLoop == 1 && !(Xsqlite3ExprCoveredByIndex(tls, pE, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur, pIdx) != 0)) { goto __176 } iNext = 2 goto __166 __176: ; if !(iLoop < 3 && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VARSELECT != 0) { goto __177 } if !(iNext == 0) { goto __178 } iNext = 3 __178: ; goto __166 __177: ; if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_LIKECOND != 0) { goto __179 } goto __166 __179: ; Xsqlite3ExprIfFalse(tls, pParse, pE, addrCont, SQLITE_JUMPIFNULL) if !(skipLikeAddr != 0) { goto __180 } Xsqlite3VdbeJumpHere(tls, v, skipLikeAddr) __180: ; *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_CODED) goto __166 __166: j-- pTerm += 56 goto __165 goto __167 __167: ; iLoop = iNext goto __163 __163: if iLoop > 0 { goto __162 } goto __164 __164: ; pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa j = (*WhereClause)(unsafe.Pointer(pWC)).FnBase __181: if !(j > 0) { goto __183 } if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&(TERM_VIRTUAL|TERM_CODED) != 0) { goto __184 } goto __182 __184: ; if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&(WO_EQ|WO_IS) == 0) { goto __185 } goto __182 __185: ; if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_EQUIV == 0) { goto __186 } goto __182 __186: ; if !((*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor != iCur) { goto __187 } goto __182 __187: ; if !(int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ|JT_RIGHT) != 0) { goto __188 } goto __182 __188: ; pE1 = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr pAlt = Xsqlite3WhereFindTerm(tls, pWC, iCur, *(*int32)(unsafe.Pointer(pTerm + 32)), notReady, uint32(WO_EQ|WO_IN|WO_IS), uintptr(0)) if !(pAlt == uintptr(0)) { goto __189 } goto __182 __189: ; if !(int32((*WhereTerm)(unsafe.Pointer(pAlt)).FwtFlags)&TERM_CODED != 0) { goto __190 } goto __182 __190: ; if !(int32((*WhereTerm)(unsafe.Pointer(pAlt)).FeOperator)&WO_IN != 0 && (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pAlt)).FpExpr)).Fflags&U32(EP_xIsSelect) != U32(0) && (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pAlt)).FpExpr + 32)))).FpEList)).FnExpr > 1) { goto __191 } goto __182 __191: ; *(*Expr)(unsafe.Pointer(bp + 24)) = *(*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pAlt)).FpExpr)) (*Expr)(unsafe.Pointer(bp + 24)).FpLeft = (*Expr)(unsafe.Pointer(pE1)).FpLeft Xsqlite3ExprIfFalse(tls, pParse, bp+24, addrCont, SQLITE_JUMPIFNULL) *(*U16)(unsafe.Pointer(pAlt + 18)) |= U16(TERM_CODED) goto __182 __182: j-- pTerm += 56 goto __181 goto __183 __183: ; if !((*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ != 0) { goto __192 } jmp11 = 0 pRJ = (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ pTab1 = (*SrcItem)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104)).FpTab if !((*Table)(unsafe.Pointer(pTab1)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __193 } r2 = Xsqlite3GetTempRange(tls, pParse, 2) Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab1, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur, -1, r2+1) nPk1 = 1 goto __194 __193: pPk3 = Xsqlite3PrimaryKeyIndex(tls, pTab1) nPk1 = int32((*Index)(unsafe.Pointer(pPk3)).FnKeyCol) r2 = Xsqlite3GetTempRange(tls, pParse, nPk1+1) iPk1 = 0 __195: if !(iPk1 < nPk1) { goto __197 } iCol1 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk3)).FaiColumn + uintptr(iPk1)*2))) Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab1, iCur, iCol1, r2+1+iPk1) goto __196 __196: iPk1++ goto __195 goto __197 __197: ; __194: ; jmp11 = Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FiMatch, 0, r2+1, nPk1) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, r2+1, nPk1, r2) Xsqlite3VdbeAddOp4Int(tls, v, OP_IdxInsert, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FiMatch, r2, r2+1, nPk1) Xsqlite3VdbeAddOp4Int(tls, v, OP_FilterAdd, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregBloom, 0, r2+1, nPk1) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_USESEEKRESULT)) Xsqlite3VdbeJumpHere(tls, v, jmp11) Xsqlite3ReleaseTempRange(tls, pParse, r2, nPk1+1) __192: ; if !((*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin != 0) { goto __198 } (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrFirst = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, (*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin) if !((*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ == uintptr(0)) { goto __199 } goto code_outer_join_constraints __199: ; __198: ; if !((*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ != 0) { goto __200 } pRJ1 = (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ Xsqlite3VdbeAddOp2(tls, v, OP_BeginSubrtn, 0, (*WhereRightJoin)(unsafe.Pointer(pRJ1)).FregReturn) (*WhereRightJoin)(unsafe.Pointer(pRJ1)).FaddrSubrtn = Xsqlite3VdbeCurrentAddr(tls, v) (*Parse)(unsafe.Pointer(pParse)).FwithinRJSubrtn++ code_outer_join_constraints: pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa j = 0 __201: if !(j < (*WhereClause)(unsafe.Pointer(pWC)).FnBase) { goto __203 } if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&(TERM_VIRTUAL|TERM_CODED) != 0) { goto __204 } goto __202 __204: ; if !((*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll&(*WhereLevel)(unsafe.Pointer(pLevel)).FnotReady != uint64(0)) { goto __205 } goto __202 __205: ; if !(int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&JT_LTORJ != 0) { goto __206 } goto __202 __206: ; Xsqlite3ExprIfFalse(tls, pParse, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr, addrCont, SQLITE_JUMPIFNULL) *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_CODED) goto __202 __202: j++ pTerm += 56 goto __201 goto __203 __203: ; __200: ; return (*WhereLevel)(unsafe.Pointer(pLevel)).FnotReady } var aStartOp = [8]U8{ U8(0), U8(0), U8(OP_Rewind), U8(OP_Last), U8(OP_SeekGT), U8(OP_SeekLT), U8(OP_SeekGE), U8(OP_SeekLE), } var aEndOp = [4]U8{ U8(OP_IdxGE), U8(OP_IdxGT), U8(OP_IdxLE), U8(OP_IdxLT), } var aStep = [2]U8{U8(OP_Next), U8(OP_Prev)} var aStart = [2]U8{U8(OP_Rewind), U8(OP_Last)} // Generate the code for the loop that finds all non-matched terms // for a RIGHT JOIN. func Xsqlite3WhereRightJoinLoop(tls *libc.TLS, pWInfo uintptr, iLevel int32, pLevel uintptr) { bp := tls.Alloc(120) defer tls.Free(120) var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var pRJ uintptr = (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ var pSubWhere uintptr = uintptr(0) var pWC uintptr = pWInfo + 104 var pSubWInfo uintptr var pLoop uintptr = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop var pTabItem uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 var mAll Bitmask = uint64(0) var k int32 Xsqlite3VdbeExplain(tls, pParse, uint8(1), ts+23217, libc.VaList(bp, (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pTabItem)).FpTab)).FzName)) for k = 0; k < iLevel; k++ { var iIdxCur int32 mAll = mAll | (*WhereLoop1)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pWInfo+856+uintptr(k)*104)).FpWLoop)).FmaskSelf Xsqlite3VdbeAddOp1(tls, v, OP_NullRow, (*WhereLevel)(unsafe.Pointer(pWInfo+856+uintptr(k)*104)).FiTabCur) iIdxCur = (*WhereLevel)(unsafe.Pointer(pWInfo + 856 + uintptr(k)*104)).FiIdxCur if iIdxCur != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_NullRow, iIdxCur) } } if int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&JT_LTORJ == 0 { mAll = mAll | (*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf for k = 0; k < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm; k++ { var pTerm uintptr = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(k)*56 if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&(TERM_VIRTUAL|TERM_SLICE) != 0 && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator) != WO_ROWVAL { break } if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll & ^mAll != 0 { continue } if (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0) { continue } pSubWhere = Xsqlite3ExprAnd(tls, pParse, pSubWhere, Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr, 0)) } } (*SrcList)(unsafe.Pointer(bp + 8)).FnSrc = 1 (*SrcList)(unsafe.Pointer(bp + 8)).FnAlloc = U32(1) libc.Xmemcpy(tls, bp+8+8, pTabItem, uint64(unsafe.Sizeof(SrcItem{}))) (*SrcItem)(unsafe.Pointer(bp + 8 + 8)).Ffg.Fjointype = U8(0) (*Parse)(unsafe.Pointer(pParse)).FwithinRJSubrtn++ pSubWInfo = Xsqlite3WhereBegin(tls, pParse, bp+8, pSubWhere, uintptr(0), uintptr(0), uintptr(0), uint16(WHERE_RIGHT_JOIN), 0) if pSubWInfo != 0 { var iCur int32 = (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur var r int32 = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) var nPk int32 var jmp int32 var addrCont int32 = Xsqlite3WhereContinueLabel(tls, pSubWInfo) var pTab uintptr = (*SrcItem)(unsafe.Pointer(pTabItem)).FpTab if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) { Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iCur, -1, r) nPk = 1 } else { var iPk int32 var pPk uintptr = Xsqlite3PrimaryKeyIndex(tls, pTab) nPk = int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol) *(*int32)(unsafe.Pointer(pParse + 56)) += nPk - 1 for iPk = 0; iPk < nPk; iPk++ { var iCol int32 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(iPk)*2))) Xsqlite3ExprCodeGetColumnOfTable(tls, v, pTab, iCur, iCol, r+iPk) } } jmp = Xsqlite3VdbeAddOp4Int(tls, v, OP_Filter, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregBloom, 0, r, nPk) Xsqlite3VdbeAddOp4Int(tls, v, OP_Found, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FiMatch, addrCont, r, nPk) Xsqlite3VdbeJumpHere(tls, v, jmp) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregReturn, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FaddrSubrtn) Xsqlite3WhereEnd(tls, pSubWInfo) } Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pSubWhere) Xsqlite3VdbeExplainPop(tls, pParse) (*Parse)(unsafe.Pointer(pParse)).FwithinRJSubrtn-- } func whereOrInfoDelete(tls *libc.TLS, db uintptr, p uintptr) { Xsqlite3WhereClauseClear(tls, p) Xsqlite3DbFree(tls, db, p) } func whereAndInfoDelete(tls *libc.TLS, db uintptr, p uintptr) { Xsqlite3WhereClauseClear(tls, p) Xsqlite3DbFree(tls, db, p) } func whereClauseInsert(tls *libc.TLS, pWC uintptr, p uintptr, wtFlags U16) int32 { var pTerm uintptr var idx int32 if (*WhereClause)(unsafe.Pointer(pWC)).FnTerm >= (*WhereClause)(unsafe.Pointer(pWC)).FnSlot { var pOld uintptr = (*WhereClause)(unsafe.Pointer(pWC)).Fa var db uintptr = (*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpParse)).Fdb (*WhereClause)(unsafe.Pointer(pWC)).Fa = Xsqlite3WhereMalloc(tls, (*WhereClause)(unsafe.Pointer(pWC)).FpWInfo, uint64(unsafe.Sizeof(WhereTerm{}))*uint64((*WhereClause)(unsafe.Pointer(pWC)).FnSlot)*uint64(2)) if (*WhereClause)(unsafe.Pointer(pWC)).Fa == uintptr(0) { if int32(wtFlags)&TERM_DYNAMIC != 0 { Xsqlite3ExprDelete(tls, db, p) } (*WhereClause)(unsafe.Pointer(pWC)).Fa = pOld return 0 } libc.Xmemcpy(tls, (*WhereClause)(unsafe.Pointer(pWC)).Fa, pOld, uint64(unsafe.Sizeof(WhereTerm{}))*uint64((*WhereClause)(unsafe.Pointer(pWC)).FnTerm)) (*WhereClause)(unsafe.Pointer(pWC)).FnSlot = (*WhereClause)(unsafe.Pointer(pWC)).FnSlot * 2 } pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(libc.AssignInt32(&idx, libc.PostIncInt32(&(*WhereClause)(unsafe.Pointer(pWC)).FnTerm, 1)))*56 if int32(wtFlags)&TERM_VIRTUAL == 0 { (*WhereClause)(unsafe.Pointer(pWC)).FnBase = (*WhereClause)(unsafe.Pointer(pWC)).FnTerm } if p != 0 && (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_Unlikely) != U32(0) { (*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb = LogEst(int32(Xsqlite3LogEst(tls, uint64((*Expr)(unsafe.Pointer(p)).FiTable))) - 270) } else { (*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb = int16(1) } (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr = Xsqlite3ExprSkipCollateAndLikely(tls, p) (*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags = wtFlags (*WhereTerm)(unsafe.Pointer(pTerm)).FpWC = pWC (*WhereTerm)(unsafe.Pointer(pTerm)).FiParent = -1 libc.Xmemset(tls, pTerm+20, 0, uint64(unsafe.Sizeof(WhereTerm{}))-uint64(uintptr(0)+20)) return idx } func allowedOp(tls *libc.TLS, op int32) int32 { return libc.Bool32(op == TK_IN || op >= TK_EQ && op <= TK_GE || op == TK_ISNULL || op == TK_IS) } func exprCommute(tls *libc.TLS, pParse uintptr, pExpr uintptr) U16 { if int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft)).Fop) == TK_VECTOR || int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpRight)).Fop) == TK_VECTOR || Xsqlite3BinaryCompareCollSeq(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, (*Expr)(unsafe.Pointer(pExpr)).FpRight) != Xsqlite3BinaryCompareCollSeq(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) { *(*U32)(unsafe.Pointer(pExpr + 4)) ^= U32(EP_Commuted) } { var t uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpRight (*Expr)(unsafe.Pointer(pExpr)).FpRight = (*Expr)(unsafe.Pointer(pExpr)).FpLeft (*Expr)(unsafe.Pointer(pExpr)).FpLeft = t } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) >= TK_GT { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(int32((*Expr)(unsafe.Pointer(pExpr)).Fop) - TK_GT ^ 2 + TK_GT) } return U16(0) } func operatorMask(tls *libc.TLS, op int32) U16 { var c U16 if op == TK_IN { c = U16(WO_IN) } else if op == TK_ISNULL { c = U16(WO_ISNULL) } else if op == TK_IS { c = U16(WO_IS) } else { c = U16(int32(WO_EQ) << (op - TK_EQ)) } return c } func isLikeOrGlob(tls *libc.TLS, pParse uintptr, pExpr uintptr, ppPrefix uintptr, pisComplete uintptr, pnoCase uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var z uintptr = uintptr(0) var pRight uintptr var pLeft uintptr var pList uintptr var c U8 var cnt int32 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pVal uintptr = uintptr(0) var op int32 var rc int32 if !(Xsqlite3IsLikeFunction(tls, db, pExpr, pnoCase, bp) != 0) { return 0 } pList = *(*uintptr)(unsafe.Pointer(pExpr + 32)) pLeft = (*ExprList_item)(unsafe.Pointer(pList + 8 + 1*32)).FpExpr pRight = Xsqlite3ExprSkipCollate(tls, (*ExprList_item)(unsafe.Pointer(pList+8)).FpExpr) op = int32((*Expr)(unsafe.Pointer(pRight)).Fop) if op == TK_VARIABLE && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_EnableQPSG) == uint64(0) { var pReprepare uintptr = (*Parse)(unsafe.Pointer(pParse)).FpReprepare var iCol int32 = int32((*Expr)(unsafe.Pointer(pRight)).FiColumn) pVal = Xsqlite3VdbeGetBoundValue(tls, pReprepare, iCol, uint8(SQLITE_AFF_BLOB)) if pVal != 0 && Xsqlite3_value_type(tls, pVal) == SQLITE_TEXT { z = Xsqlite3_value_text(tls, pVal) } Xsqlite3VdbeSetVarmask(tls, (*Parse)(unsafe.Pointer(pParse)).FpVdbe, iCol) } else if op == TK_STRING { z = *(*uintptr)(unsafe.Pointer(pRight + 8)) } if z != 0 { cnt = 0 for int32(libc.AssignUint8(&c, *(*U8)(unsafe.Pointer(z + uintptr(cnt))))) != 0 && int32(c) != int32(*(*U8)(unsafe.Pointer(bp))) && int32(c) != int32(*(*U8)(unsafe.Pointer(bp + 1))) && int32(c) != int32(*(*U8)(unsafe.Pointer(bp + 2))) { cnt++ if int32(c) == int32(*(*U8)(unsafe.Pointer(bp + 3))) && int32(*(*U8)(unsafe.Pointer(z + uintptr(cnt)))) != 0 { cnt++ } } if cnt != 0 && 255 != int32(*(*U8)(unsafe.Pointer(z + uintptr(cnt-1)))) && (cnt > 1 || int32(*(*U8)(unsafe.Pointer(z))) != int32(*(*U8)(unsafe.Pointer(bp + 3)))) { var pPrefix uintptr *(*int32)(unsafe.Pointer(pisComplete)) = libc.Bool32(int32(c) == int32(*(*U8)(unsafe.Pointer(bp))) && int32(*(*U8)(unsafe.Pointer(z + uintptr(cnt+1)))) == 0) pPrefix = Xsqlite3Expr(tls, db, TK_STRING, z) if pPrefix != 0 { var iFrom int32 var iTo int32 var zNew uintptr zNew = *(*uintptr)(unsafe.Pointer(pPrefix + 8)) *(*int8)(unsafe.Pointer(zNew + uintptr(cnt))) = int8(0) for iFrom = libc.AssignInt32(&iTo, 0); iFrom < cnt; iFrom++ { if int32(*(*int8)(unsafe.Pointer(zNew + uintptr(iFrom)))) == int32(*(*U8)(unsafe.Pointer(bp + 3))) { iFrom++ } *(*int8)(unsafe.Pointer(zNew + uintptr(libc.PostIncInt32(&iTo, 1)))) = *(*int8)(unsafe.Pointer(zNew + uintptr(iFrom))) } *(*int8)(unsafe.Pointer(zNew + uintptr(iTo))) = int8(0) if int32((*Expr)(unsafe.Pointer(pLeft)).Fop) != TK_COLUMN || int32(Xsqlite3ExprAffinity(tls, pLeft)) != SQLITE_AFF_TEXT || (*Expr)(unsafe.Pointer(pLeft)).Fflags&U32(EP_WinFunc|EP_Subrtn) == U32(0) && *(*uintptr)(unsafe.Pointer(pLeft + 64)) != 0 && int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pLeft + 64)))).FeTabType) == TABTYP_VTAB { var isNum int32 isNum = Xsqlite3AtoF(tls, zNew, bp+8, iTo, uint8(SQLITE_UTF8)) if isNum <= 0 { if iTo == 1 && int32(*(*int8)(unsafe.Pointer(zNew))) == '-' { isNum = +1 } else { *(*int8)(unsafe.Pointer(zNew + uintptr(iTo-1)))++ isNum = Xsqlite3AtoF(tls, zNew, bp+8, iTo, uint8(SQLITE_UTF8)) *(*int8)(unsafe.Pointer(zNew + uintptr(iTo-1)))-- } } if isNum > 0 { Xsqlite3ExprDelete(tls, db, pPrefix) Xsqlite3ValueFree(tls, pVal) return 0 } } } *(*uintptr)(unsafe.Pointer(ppPrefix)) = pPrefix if op == TK_VARIABLE { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe Xsqlite3VdbeSetVarmask(tls, v, int32((*Expr)(unsafe.Pointer(pRight)).FiColumn)) if *(*int32)(unsafe.Pointer(pisComplete)) != 0 && *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pRight + 8)) + 1)) != 0 { var r1 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3ExprCodeTarget(tls, pParse, pRight, r1) Xsqlite3VdbeChangeP3(tls, v, Xsqlite3VdbeCurrentAddr(tls, v)-1, 0) Xsqlite3ReleaseTempReg(tls, pParse, r1) } } } else { z = uintptr(0) } } rc = libc.Bool32(z != uintptr(0)) Xsqlite3ValueFree(tls, pVal) return rc } func isAuxiliaryVtabOperator(tls *libc.TLS, db uintptr, pExpr uintptr, peOp2 uintptr, ppLeft uintptr, ppRight uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_FUNCTION { var pList uintptr var pCol uintptr var i int32 pList = *(*uintptr)(unsafe.Pointer(pExpr + 32)) if pList == uintptr(0) || (*ExprList)(unsafe.Pointer(pList)).FnExpr != 2 { return 0 } pCol = (*ExprList_item)(unsafe.Pointer(pList + 8 + 1*32)).FpExpr if int32((*Expr)(unsafe.Pointer(pCol)).Fop) == TK_COLUMN && int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pCol + 64)))).FeTabType) == TABTYP_VTAB { for i = 0; i < int32(uint64(unsafe.Sizeof(aOp))/uint64(unsafe.Sizeof(Op2{}))); i++ { if Xsqlite3StrICmp(tls, *(*uintptr)(unsafe.Pointer(pExpr + 8)), aOp[i].FzOp) == 0 { *(*uint8)(unsafe.Pointer(peOp2)) = aOp[i].FeOp2 *(*uintptr)(unsafe.Pointer(ppRight)) = (*ExprList_item)(unsafe.Pointer(pList + 8)).FpExpr *(*uintptr)(unsafe.Pointer(ppLeft)) = pCol return 1 } } } pCol = (*ExprList_item)(unsafe.Pointer(pList + 8)).FpExpr if int32((*Expr)(unsafe.Pointer(pCol)).Fop) == TK_COLUMN && int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pCol + 64)))).FeTabType) == TABTYP_VTAB { var pVtab uintptr var pMod uintptr pVtab = (*VTable)(unsafe.Pointer(Xsqlite3GetVTable(tls, db, *(*uintptr)(unsafe.Pointer(pCol + 64))))).FpVtab pMod = (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FpModule if (*Sqlite3_module)(unsafe.Pointer(pMod)).FxFindFunction != uintptr(0) { i = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_module)(unsafe.Pointer(pMod)).FxFindFunction})).f(tls, pVtab, 2, *(*uintptr)(unsafe.Pointer(pExpr + 8)), bp, bp+8) if i >= SQLITE_INDEX_CONSTRAINT_FUNCTION { *(*uint8)(unsafe.Pointer(peOp2)) = uint8(i) *(*uintptr)(unsafe.Pointer(ppRight)) = (*ExprList_item)(unsafe.Pointer(pList + 8 + 1*32)).FpExpr *(*uintptr)(unsafe.Pointer(ppLeft)) = pCol return 1 } } } } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_NE || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_ISNOT || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_NOTNULL { var res int32 = 0 var pLeft uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft var pRight uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpRight if int32((*Expr)(unsafe.Pointer(pLeft)).Fop) == TK_COLUMN && int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pLeft + 64)))).FeTabType) == TABTYP_VTAB { res++ } if pRight != 0 && (int32((*Expr)(unsafe.Pointer(pRight)).Fop) == TK_COLUMN && int32((*Table)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pRight + 64)))).FeTabType) == TABTYP_VTAB) { res++ { var t uintptr = pLeft pLeft = pRight pRight = t } } *(*uintptr)(unsafe.Pointer(ppLeft)) = pLeft *(*uintptr)(unsafe.Pointer(ppRight)) = pRight if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_NE { *(*uint8)(unsafe.Pointer(peOp2)) = uint8(SQLITE_INDEX_CONSTRAINT_NE) } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_ISNOT { *(*uint8)(unsafe.Pointer(peOp2)) = uint8(SQLITE_INDEX_CONSTRAINT_ISNOT) } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_NOTNULL { *(*uint8)(unsafe.Pointer(peOp2)) = uint8(SQLITE_INDEX_CONSTRAINT_ISNOTNULL) } return res } return 0 } type Op2 = struct { FzOp uintptr FeOp2 uint8 F__ccgo_pad1 [7]byte } var aOp = [4]Op2{ {FzOp: ts + 17474, FeOp2: uint8(SQLITE_INDEX_CONSTRAINT_MATCH)}, {FzOp: ts + 16804, FeOp2: uint8(SQLITE_INDEX_CONSTRAINT_GLOB)}, {FzOp: ts + 16324, FeOp2: uint8(SQLITE_INDEX_CONSTRAINT_LIKE)}, {FzOp: ts + 23231, FeOp2: uint8(SQLITE_INDEX_CONSTRAINT_REGEXP)}, } func transferJoinMarkings(tls *libc.TLS, pDerived uintptr, pBase uintptr) { if pDerived != 0 && (*Expr)(unsafe.Pointer(pBase)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0) { *(*U32)(unsafe.Pointer(pDerived + 4)) |= (*Expr)(unsafe.Pointer(pBase)).Fflags & U32(EP_OuterON|EP_InnerON) *(*int32)(unsafe.Pointer(pDerived + 52)) = *(*int32)(unsafe.Pointer(pBase + 52)) } } func markTermAsChild(tls *libc.TLS, pWC uintptr, iChild int32, iParent int32) { (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(iChild)*56)).FiParent = iParent (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(iChild)*56)).FtruthProb = (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(iParent)*56)).FtruthProb (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr(iParent)*56)).FnChild++ } func whereNthSubterm(tls *libc.TLS, pTerm uintptr, N int32) uintptr { if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator) != WO_AND { if N == 0 { return pTerm } return uintptr(0) } if N < (*WhereAndInfo)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTerm + 32)))).Fwc.FnTerm { return (*WhereAndInfo)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTerm + 32)))).Fwc.Fa + uintptr(N)*56 } return uintptr(0) } func whereCombineDisjuncts(tls *libc.TLS, pSrc uintptr, pWC uintptr, pOne uintptr, pTwo uintptr) { var eOp U16 = U16(int32((*WhereTerm)(unsafe.Pointer(pOne)).FeOperator) | int32((*WhereTerm)(unsafe.Pointer(pTwo)).FeOperator)) var db uintptr var pNew uintptr var op int32 var idxNew int32 if (int32((*WhereTerm)(unsafe.Pointer(pOne)).FwtFlags)|int32((*WhereTerm)(unsafe.Pointer(pTwo)).FwtFlags))&TERM_VNULL != 0 { return } if int32((*WhereTerm)(unsafe.Pointer(pOne)).FeOperator)&(WO_EQ|int32(WO_EQ)<<(TK_LT-TK_EQ)|int32(WO_EQ)<<(TK_LE-TK_EQ)|int32(WO_EQ)<<(TK_GT-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)) == 0 { return } if int32((*WhereTerm)(unsafe.Pointer(pTwo)).FeOperator)&(WO_EQ|int32(WO_EQ)<<(TK_LT-TK_EQ)|int32(WO_EQ)<<(TK_LE-TK_EQ)|int32(WO_EQ)<<(TK_GT-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)) == 0 { return } if int32(eOp)&(WO_EQ|int32(WO_EQ)<<(TK_LT-TK_EQ)|int32(WO_EQ)<<(TK_LE-TK_EQ)) != int32(eOp) && int32(eOp)&(WO_EQ|int32(WO_EQ)<<(TK_GT-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)) != int32(eOp) { return } if Xsqlite3ExprCompare(tls, uintptr(0), (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOne)).FpExpr)).FpLeft, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTwo)).FpExpr)).FpLeft, -1) != 0 { return } if Xsqlite3ExprCompare(tls, uintptr(0), (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOne)).FpExpr)).FpRight, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTwo)).FpExpr)).FpRight, -1) != 0 { return } if int32(eOp)&(int32(eOp)-1) != 0 { if int32(eOp)&(int32(WO_EQ)<<(TK_LT-TK_EQ)|int32(WO_EQ)<<(TK_LE-TK_EQ)) != 0 { eOp = U16(int32(WO_EQ) << (TK_LE - TK_EQ)) } else { eOp = U16(int32(WO_EQ) << (TK_GE - TK_EQ)) } } db = (*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpParse)).Fdb pNew = Xsqlite3ExprDup(tls, db, (*WhereTerm)(unsafe.Pointer(pOne)).FpExpr, 0) if pNew == uintptr(0) { return } for op = TK_EQ; int32(eOp) != int32(WO_EQ)<<(op-TK_EQ); op++ { } (*Expr)(unsafe.Pointer(pNew)).Fop = U8(op) idxNew = whereClauseInsert(tls, pWC, pNew, uint16(TERM_VIRTUAL|TERM_DYNAMIC)) exprAnalyze(tls, pSrc, pWC, idxNew) } func exprAnalyzeOrTerm(tls *libc.TLS, pSrc uintptr, pWC uintptr, idxTerm int32) { var pWInfo uintptr = (*WhereClause)(unsafe.Pointer(pWC)).FpWInfo var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pTerm uintptr = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 var pExpr uintptr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr var i int32 var pOrWc uintptr var pOrTerm uintptr var pOrInfo uintptr var chngToIN Bitmask var indexable Bitmask *(*uintptr)(unsafe.Pointer(pTerm + 32)) = libc.AssignUintptr(&pOrInfo, Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(WhereOrInfo{})))) if pOrInfo == uintptr(0) { return } *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_ORINFO) pOrWc = pOrInfo libc.Xmemset(tls, pOrWc+40, 0, uint64(unsafe.Sizeof([8]WhereTerm{}))) Xsqlite3WhereClauseInit(tls, pOrWc, pWInfo) Xsqlite3WhereSplit(tls, pOrWc, pExpr, uint8(TK_OR)) Xsqlite3WhereExprAnalyze(tls, pSrc, pOrWc) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return } indexable = libc.CplUint64(uint64(0)) chngToIN = libc.CplUint64(uint64(0)) i = (*WhereClause)(unsafe.Pointer(pOrWc)).FnTerm - 1 pOrTerm = (*WhereClause)(unsafe.Pointer(pOrWc)).Fa __1: if !(i >= 0 && indexable != 0) { goto __3 } { if int32((*WhereTerm)(unsafe.Pointer(pOrTerm)).FeOperator)&WO_SINGLE == 0 { var pAndInfo uintptr chngToIN = uint64(0) pAndInfo = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(WhereAndInfo{}))) if pAndInfo != 0 { var pAndWC uintptr var pAndTerm uintptr var j int32 var b Bitmask = uint64(0) *(*uintptr)(unsafe.Pointer(pOrTerm + 32)) = pAndInfo *(*U16)(unsafe.Pointer(pOrTerm + 18)) |= U16(TERM_ANDINFO) (*WhereTerm)(unsafe.Pointer(pOrTerm)).FeOperator = U16(WO_AND) (*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor = -1 pAndWC = pAndInfo libc.Xmemset(tls, pAndWC+40, 0, uint64(unsafe.Sizeof([8]WhereTerm{}))) Xsqlite3WhereClauseInit(tls, pAndWC, (*WhereClause)(unsafe.Pointer(pWC)).FpWInfo) Xsqlite3WhereSplit(tls, pAndWC, (*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr, uint8(TK_AND)) Xsqlite3WhereExprAnalyze(tls, pSrc, pAndWC) (*WhereClause)(unsafe.Pointer(pAndWC)).FpOuter = pWC if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { j = 0 pAndTerm = (*WhereClause)(unsafe.Pointer(pAndWC)).Fa __4: if !(j < (*WhereClause)(unsafe.Pointer(pAndWC)).FnTerm) { goto __6 } { if allowedOp(tls, int32((*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pAndTerm)).FpExpr)).Fop)) != 0 || int32((*WhereTerm)(unsafe.Pointer(pAndTerm)).FeOperator) == WO_AUX { b = b | Xsqlite3WhereGetMask(tls, pWInfo+592, (*WhereTerm)(unsafe.Pointer(pAndTerm)).FleftCursor) } } goto __5 __5: j++ pAndTerm += 56 goto __4 goto __6 __6: } indexable = indexable & b } } else if int32((*WhereTerm)(unsafe.Pointer(pOrTerm)).FwtFlags)&TERM_COPIED != 0 { } else { var b Bitmask b = Xsqlite3WhereGetMask(tls, pWInfo+592, (*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor) if int32((*WhereTerm)(unsafe.Pointer(pOrTerm)).FwtFlags)&TERM_VIRTUAL != 0 { var pOther uintptr = (*WhereClause)(unsafe.Pointer(pOrWc)).Fa + uintptr((*WhereTerm)(unsafe.Pointer(pOrTerm)).FiParent)*56 b = b | Xsqlite3WhereGetMask(tls, pWInfo+592, (*WhereTerm)(unsafe.Pointer(pOther)).FleftCursor) } indexable = indexable & b if int32((*WhereTerm)(unsafe.Pointer(pOrTerm)).FeOperator)&WO_EQ == 0 { chngToIN = uint64(0) } else { chngToIN = chngToIN & b } } } goto __2 __2: i-- pOrTerm += 56 goto __1 goto __3 __3: ; (*WhereOrInfo)(unsafe.Pointer(pOrInfo)).Findexable = indexable (*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator = U16(WO_OR) (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor = -1 if indexable != 0 { (*WhereClause)(unsafe.Pointer(pWC)).FhasOr = U8(1) } if indexable != 0 && (*WhereClause)(unsafe.Pointer(pOrWc)).FnTerm == 2 { var iOne int32 = 0 var pOne uintptr for libc.AssignUintptr(&pOne, whereNthSubterm(tls, (*WhereClause)(unsafe.Pointer(pOrWc)).Fa, libc.PostIncInt32(&iOne, 1))) != uintptr(0) { var iTwo int32 = 0 var pTwo uintptr for libc.AssignUintptr(&pTwo, whereNthSubterm(tls, (*WhereClause)(unsafe.Pointer(pOrWc)).Fa+1*56, libc.PostIncInt32(&iTwo, 1))) != uintptr(0) { whereCombineDisjuncts(tls, pSrc, pWC, pOne, pTwo) } } } if chngToIN != 0 { var okToChngToIN int32 = 0 var iColumn int32 = -1 var iCursor int32 = -1 var j int32 = 0 for j = 0; j < 2 && !(okToChngToIN != 0); j++ { var pLeft uintptr = uintptr(0) pOrTerm = (*WhereClause)(unsafe.Pointer(pOrWc)).Fa i = (*WhereClause)(unsafe.Pointer(pOrWc)).FnTerm - 1 __7: if !(i >= 0) { goto __9 } { *(*U16)(unsafe.Pointer(pOrTerm + 18)) &= libc.Uint16FromInt32(libc.CplInt32(TERM_OK)) if (*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor == iCursor { goto __8 } if chngToIN&Xsqlite3WhereGetMask(tls, pWInfo+592, (*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor) == uint64(0) { goto __8 } iColumn = *(*int32)(unsafe.Pointer(pOrTerm + 32)) iCursor = (*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor pLeft = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr)).FpLeft goto __9 } goto __8 __8: i-- pOrTerm += 56 goto __7 goto __9 __9: ; if i < 0 { break } okToChngToIN = 1 __10: if !(i >= 0 && okToChngToIN != 0) { goto __12 } { if (*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor != iCursor { *(*U16)(unsafe.Pointer(pOrTerm + 18)) &= libc.Uint16FromInt32(libc.CplInt32(TERM_OK)) } else if *(*int32)(unsafe.Pointer(pOrTerm + 32)) != iColumn || iColumn == -2 && Xsqlite3ExprCompare(tls, pParse, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr)).FpLeft, pLeft, -1) != 0 { okToChngToIN = 0 } else { var affLeft int32 var affRight int32 affRight = int32(Xsqlite3ExprAffinity(tls, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr)).FpRight)) affLeft = int32(Xsqlite3ExprAffinity(tls, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr)).FpLeft)) if affRight != 0 && affRight != affLeft { okToChngToIN = 0 } else { *(*U16)(unsafe.Pointer(pOrTerm + 18)) |= U16(TERM_OK) } } } goto __11 __11: i-- pOrTerm += 56 goto __10 goto __12 __12: } if okToChngToIN != 0 { var pDup uintptr var pList uintptr = uintptr(0) var pLeft uintptr = uintptr(0) var pNew uintptr i = (*WhereClause)(unsafe.Pointer(pOrWc)).FnTerm - 1 pOrTerm = (*WhereClause)(unsafe.Pointer(pOrWc)).Fa __13: if !(i >= 0) { goto __15 } { if int32((*WhereTerm)(unsafe.Pointer(pOrTerm)).FwtFlags)&TERM_OK == 0 { goto __14 } pDup = Xsqlite3ExprDup(tls, db, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr)).FpRight, 0) pList = Xsqlite3ExprListAppend(tls, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse, pList, pDup) pLeft = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pOrTerm)).FpExpr)).FpLeft } goto __14 __14: i-- pOrTerm += 56 goto __13 goto __15 __15: ; pDup = Xsqlite3ExprDup(tls, db, pLeft, 0) pNew = Xsqlite3PExpr(tls, pParse, TK_IN, pDup, uintptr(0)) if pNew != 0 { var idxNew int32 transferJoinMarkings(tls, pNew, pExpr) *(*uintptr)(unsafe.Pointer(pNew + 32)) = pList idxNew = whereClauseInsert(tls, pWC, pNew, uint16(TERM_VIRTUAL|TERM_DYNAMIC)) exprAnalyze(tls, pSrc, pWC, idxNew) markTermAsChild(tls, pWC, idxNew, idxTerm) } else { Xsqlite3ExprListDelete(tls, db, pList) } } } } func termIsEquivalence(tls *libc.TLS, pParse uintptr, pExpr uintptr) int32 { var aff1 int8 var aff2 int8 var pColl uintptr if !((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FdbOptFlags&U32(SQLITE_Transitive) == U32(0)) { return 0 } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_EQ && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_IS { return 0 } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0) { return 0 } aff1 = Xsqlite3ExprAffinity(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) aff2 = Xsqlite3ExprAffinity(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) if int32(aff1) != int32(aff2) && (!(int32(aff1) >= SQLITE_AFF_NUMERIC) || !(int32(aff2) >= SQLITE_AFF_NUMERIC)) { return 0 } pColl = Xsqlite3ExprCompareCollSeq(tls, pParse, pExpr) if Xsqlite3IsBinary(tls, pColl) != 0 { return 1 } return Xsqlite3ExprCollSeqMatch(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, (*Expr)(unsafe.Pointer(pExpr)).FpRight) } func exprSelectUsage(tls *libc.TLS, pMaskSet uintptr, pS uintptr) Bitmask { var mask Bitmask = uint64(0) for pS != 0 { var pSrc uintptr = (*Select)(unsafe.Pointer(pS)).FpSrc mask = mask | Xsqlite3WhereExprListUsage(tls, pMaskSet, (*Select)(unsafe.Pointer(pS)).FpEList) mask = mask | Xsqlite3WhereExprListUsage(tls, pMaskSet, (*Select)(unsafe.Pointer(pS)).FpGroupBy) mask = mask | Xsqlite3WhereExprListUsage(tls, pMaskSet, (*Select)(unsafe.Pointer(pS)).FpOrderBy) mask = mask | Xsqlite3WhereExprUsage(tls, pMaskSet, (*Select)(unsafe.Pointer(pS)).FpWhere) mask = mask | Xsqlite3WhereExprUsage(tls, pMaskSet, (*Select)(unsafe.Pointer(pS)).FpHaving) if pSrc != uintptr(0) { var i int32 for i = 0; i < (*SrcList)(unsafe.Pointer(pSrc)).FnSrc; i++ { mask = mask | exprSelectUsage(tls, pMaskSet, (*SrcItem)(unsafe.Pointer(pSrc+8+uintptr(i)*104)).FpSelect) if int32(*(*uint16)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 60 + 4))&0x400>>10) == 0 { mask = mask | Xsqlite3WhereExprUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 72))) } if uint32(int32(*(*uint16)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 60 + 4))&0x4>>2)) != 0 { mask = mask | Xsqlite3WhereExprListUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(pSrc + 8 + uintptr(i)*104 + 88))) } } } pS = (*Select)(unsafe.Pointer(pS)).FpPrior } return mask } func exprMightBeIndexed2(tls *libc.TLS, pFrom uintptr, aiCurCol uintptr, pExpr uintptr, j int32) int32 { var pIdx uintptr var i int32 var iCur int32 for __ccgo := true; __ccgo; __ccgo = libc.PreIncInt32(&j, 1) < (*SrcList)(unsafe.Pointer(pFrom)).FnSrc { iCur = (*SrcItem)(unsafe.Pointer(pFrom + 8 + uintptr(j)*104)).FiCursor for pIdx = (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pFrom + 8 + uintptr(j)*104)).FpTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { if (*Index)(unsafe.Pointer(pIdx)).FaColExpr == uintptr(0) { continue } for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol); i++ { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) != -2 { continue } if Xsqlite3ExprCompareSkip(tls, pExpr, (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr+8+uintptr(i)*32)).FpExpr, iCur) == 0 && int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_STRING { *(*int32)(unsafe.Pointer(aiCurCol)) = iCur *(*int32)(unsafe.Pointer(aiCurCol + 1*4)) = -2 return 1 } } } } return 0 } func exprMightBeIndexed(tls *libc.TLS, pFrom uintptr, aiCurCol uintptr, pExpr uintptr, op int32) int32 { var i int32 if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_VECTOR && (op >= TK_GT && op <= TK_GE) { pExpr = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)) + 8)).FpExpr } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN { *(*int32)(unsafe.Pointer(aiCurCol)) = (*Expr)(unsafe.Pointer(pExpr)).FiTable *(*int32)(unsafe.Pointer(aiCurCol + 1*4)) = int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) return 1 } for i = 0; i < (*SrcList)(unsafe.Pointer(pFrom)).FnSrc; i++ { var pIdx uintptr for pIdx = (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pFrom + 8 + uintptr(i)*104)).FpTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { if (*Index)(unsafe.Pointer(pIdx)).FaColExpr != 0 { return exprMightBeIndexed2(tls, pFrom, aiCurCol, pExpr, i) } } } return 0 } func exprAnalyze(tls *libc.TLS, pSrc uintptr, pWC uintptr, idxTerm int32) { bp := tls.Alloc(48) defer tls.Free(48) var pWInfo uintptr = (*WhereClause)(unsafe.Pointer(pWC)).FpWInfo var pTerm uintptr var pMaskSet uintptr var pExpr uintptr var prereqLeft Bitmask var prereqAll Bitmask var extraRight Bitmask = uint64(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 16)) = 0 *(*int32)(unsafe.Pointer(bp + 20)) = 0 var op int32 var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb *(*uint8)(unsafe.Pointer(bp + 24)) = uint8(0) var nLeft int32 if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return } pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 pMaskSet = pWInfo + 592 pExpr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr (*WhereMaskSet)(unsafe.Pointer(pMaskSet)).FbVarSelect = 0 prereqLeft = Xsqlite3WhereExprUsage(tls, pMaskSet, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) op = int32((*Expr)(unsafe.Pointer(pExpr)).Fop) if op == TK_IN { if Xsqlite3ExprCheckIN(tls, pParse, pExpr) != 0 { return } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight = exprSelectUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(pExpr + 32))) } else { (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight = Xsqlite3WhereExprListUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(pExpr + 32))) } prereqAll = prereqLeft | (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight } else { (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight = Xsqlite3WhereExprUsage(tls, pMaskSet, (*Expr)(unsafe.Pointer(pExpr)).FpRight) if (*Expr)(unsafe.Pointer(pExpr)).FpLeft == uintptr(0) || (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect|EP_IfNullRow) != U32(0) || *(*uintptr)(unsafe.Pointer(pExpr + 32)) != uintptr(0) { prereqAll = Xsqlite3WhereExprUsageNN(tls, pMaskSet, pExpr) } else { prereqAll = prereqLeft | (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight } } if (*WhereMaskSet)(unsafe.Pointer(pMaskSet)).FbVarSelect != 0 { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_VARSELECT) } if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0) { var x Bitmask = Xsqlite3WhereGetMask(tls, pMaskSet, *(*int32)(unsafe.Pointer(pExpr + 52))) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0) { prereqAll = prereqAll | x extraRight = x - uint64(1) if prereqAll>>1 >= x { Xsqlite3ErrorMsg(tls, pParse, ts+23238, 0) return } } else if prereqAll>>1 >= x { if (*SrcList)(unsafe.Pointer(pSrc)).FnSrc > 0 && int32((*SrcItem)(unsafe.Pointer(pSrc+8)).Ffg.Fjointype)&JT_LTORJ != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+23238, 0) return } *(*U32)(unsafe.Pointer(pExpr + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_InnerON)) } } (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll = prereqAll (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor = -1 (*WhereTerm)(unsafe.Pointer(pTerm)).FiParent = -1 (*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator = U16(0) if allowedOp(tls, op) != 0 { var pLeft uintptr = Xsqlite3ExprSkipCollate(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft) var pRight uintptr = Xsqlite3ExprSkipCollate(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) var opMask U16 if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight&prereqLeft == uint64(0) { opMask = uint16(WO_ALL) } else { opMask = uint16(WO_EQUIV) } if *(*int32)(unsafe.Pointer(pTerm + 32 + 4)) > 0 { pLeft = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pLeft + 32)) + 8 + uintptr(*(*int32)(unsafe.Pointer(pTerm + 32 + 4))-1)*32)).FpExpr } if exprMightBeIndexed(tls, pSrc, bp, pLeft, op) != 0 { (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor = *(*int32)(unsafe.Pointer(bp)) *(*int32)(unsafe.Pointer(pTerm + 32)) = *(*int32)(unsafe.Pointer(bp + 1*4)) (*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator = U16(int32(operatorMask(tls, op)) & int32(opMask)) } if op == TK_IS { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_IS) } if pRight != 0 && exprMightBeIndexed(tls, pSrc, bp, pRight, op) != 0 && !((*Expr)(unsafe.Pointer(pRight)).Fflags&U32(EP_FixedCol) != U32(0)) { var pNew uintptr var pDup uintptr var eExtraOp U16 = U16(0) if (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor >= 0 { var idxNew int32 pDup = Xsqlite3ExprDup(tls, db, pExpr, 0) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3ExprDelete(tls, db, pDup) return } idxNew = whereClauseInsert(tls, pWC, pDup, uint16(TERM_VIRTUAL|TERM_DYNAMIC)) if idxNew == 0 { return } pNew = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxNew)*56 markTermAsChild(tls, pWC, idxNew, idxTerm) if op == TK_IS { *(*U16)(unsafe.Pointer(pNew + 18)) |= U16(TERM_IS) } pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_COPIED) if termIsEquivalence(tls, pParse, pDup) != 0 { *(*U16)(unsafe.Pointer(pTerm + 20)) |= U16(WO_EQUIV) eExtraOp = U16(WO_EQUIV) } } else { pDup = pExpr pNew = pTerm } *(*U16)(unsafe.Pointer(pNew + 18)) |= U16(int32(exprCommute(tls, pParse, pDup))) (*WhereTerm)(unsafe.Pointer(pNew)).FleftCursor = *(*int32)(unsafe.Pointer(bp)) *(*int32)(unsafe.Pointer(pNew + 32)) = *(*int32)(unsafe.Pointer(bp + 1*4)) (*WhereTerm)(unsafe.Pointer(pNew)).FprereqRight = prereqLeft | extraRight (*WhereTerm)(unsafe.Pointer(pNew)).FprereqAll = prereqAll (*WhereTerm)(unsafe.Pointer(pNew)).FeOperator = U16((int32(operatorMask(tls, int32((*Expr)(unsafe.Pointer(pDup)).Fop))) + int32(eExtraOp)) & int32(opMask)) } else if op == TK_ISNULL && !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0)) && 0 == Xsqlite3ExprCanBeNull(tls, pLeft) { (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_TRUEFALSE) *(*uintptr)(unsafe.Pointer(pExpr + 8)) = ts + 9051 *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_IsFalse) (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll = uint64(0) (*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator = U16(0) } } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_BETWEEN && int32((*WhereClause)(unsafe.Pointer(pWC)).Fop) == TK_AND { var pList uintptr var i int32 pList = *(*uintptr)(unsafe.Pointer(pExpr + 32)) for i = 0; i < 2; i++ { var pNewExpr uintptr var idxNew int32 pNewExpr = Xsqlite3PExpr(tls, pParse, int32(ops[i]), Xsqlite3ExprDup(tls, db, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, 0), Xsqlite3ExprDup(tls, db, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr, 0)) transferJoinMarkings(tls, pNewExpr, pExpr) idxNew = whereClauseInsert(tls, pWC, pNewExpr, uint16(TERM_VIRTUAL|TERM_DYNAMIC)) exprAnalyze(tls, pSrc, pWC, idxNew) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 markTermAsChild(tls, pWC, idxNew, idxTerm) } } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_OR { exprAnalyzeOrTerm(tls, pSrc, pWC, idxTerm) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_NOTNULL { if int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft)).Fop) == TK_COLUMN && int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft)).FiColumn) >= 0 && !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0)) { var pNewExpr uintptr var pLeft uintptr = (*Expr)(unsafe.Pointer(pExpr)).FpLeft var idxNew int32 var pNewTerm uintptr pNewExpr = Xsqlite3PExpr(tls, pParse, TK_GT, Xsqlite3ExprDup(tls, db, pLeft, 0), Xsqlite3ExprAlloc(tls, db, TK_NULL, uintptr(0), 0)) idxNew = whereClauseInsert(tls, pWC, pNewExpr, uint16(TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL)) if idxNew != 0 { pNewTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxNew)*56 (*WhereTerm)(unsafe.Pointer(pNewTerm)).FprereqRight = uint64(0) (*WhereTerm)(unsafe.Pointer(pNewTerm)).FleftCursor = (*Expr)(unsafe.Pointer(pLeft)).FiTable *(*int32)(unsafe.Pointer(pNewTerm + 32)) = int32((*Expr)(unsafe.Pointer(pLeft)).FiColumn) (*WhereTerm)(unsafe.Pointer(pNewTerm)).FeOperator = U16(int32(WO_EQ) << (TK_GT - TK_EQ)) markTermAsChild(tls, pWC, idxNew, idxTerm) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_COPIED) (*WhereTerm)(unsafe.Pointer(pNewTerm)).FprereqAll = (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll } } } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_FUNCTION && int32((*WhereClause)(unsafe.Pointer(pWC)).Fop) == TK_AND && isLikeOrGlob(tls, pParse, pExpr, bp+8, bp+16, bp+20) != 0 { var pLeft uintptr var pStr2 uintptr var pNewExpr1 uintptr var pNewExpr2 uintptr var idxNew1 int32 var idxNew2 int32 var zCollSeqName uintptr var wtFlags U16 = U16(TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC) pLeft = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)) + 8 + 1*32)).FpExpr pStr2 = Xsqlite3ExprDup(tls, db, *(*uintptr)(unsafe.Pointer(bp + 8)), 0) if *(*int32)(unsafe.Pointer(bp + 20)) != 0 && !(int32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed) != 0) { var i int32 var c int8 *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_LIKE) for i = 0; int32(libc.AssignInt8(&c, *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)) + 8)) + uintptr(i))))) != 0; i++ { *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)) + 8)) + uintptr(i))) = int8(int32(c) & ^(int32(Xsqlite3CtypeMap[uint8(c)]) & 0x20)) *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pStr2 + 8)) + uintptr(i))) = int8(Xsqlite3UpperToLower[uint8(c)]) } } if !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { var c U8 var pC uintptr pC = *(*uintptr)(unsafe.Pointer(pStr2 + 8)) + uintptr(Xsqlite3Strlen30(tls, *(*uintptr)(unsafe.Pointer(pStr2 + 8)))-1) c = *(*U8)(unsafe.Pointer(pC)) if *(*int32)(unsafe.Pointer(bp + 20)) != 0 { if int32(c) == 'A'-1 { *(*int32)(unsafe.Pointer(bp + 16)) = 0 } c = Xsqlite3UpperToLower[c] } *(*U8)(unsafe.Pointer(pC)) = U8(int32(c) + 1) } zCollSeqName = func() uintptr { if *(*int32)(unsafe.Pointer(bp + 20)) != 0 { return ts + 23279 } return uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) }() pNewExpr1 = Xsqlite3ExprDup(tls, db, pLeft, 0) pNewExpr1 = Xsqlite3PExpr(tls, pParse, TK_GE, Xsqlite3ExprAddCollateString(tls, pParse, pNewExpr1, zCollSeqName), *(*uintptr)(unsafe.Pointer(bp + 8))) transferJoinMarkings(tls, pNewExpr1, pExpr) idxNew1 = whereClauseInsert(tls, pWC, pNewExpr1, wtFlags) pNewExpr2 = Xsqlite3ExprDup(tls, db, pLeft, 0) pNewExpr2 = Xsqlite3PExpr(tls, pParse, TK_LT, Xsqlite3ExprAddCollateString(tls, pParse, pNewExpr2, zCollSeqName), pStr2) transferJoinMarkings(tls, pNewExpr2, pExpr) idxNew2 = whereClauseInsert(tls, pWC, pNewExpr2, wtFlags) exprAnalyze(tls, pSrc, pWC, idxNew1) exprAnalyze(tls, pSrc, pWC, idxNew2) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 if *(*int32)(unsafe.Pointer(bp + 16)) != 0 { markTermAsChild(tls, pWC, idxNew1, idxTerm) markTermAsChild(tls, pWC, idxNew2, idxTerm) } } if (int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_EQ || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_IS) && libc.AssignInt32(&nLeft, Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft)) > 1 && Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pExpr)).FpRight) == nLeft && ((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft)).Fflags&U32(EP_xIsSelect) == U32(0) || (*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpRight)).Fflags&U32(EP_xIsSelect) == U32(0)) && int32((*WhereClause)(unsafe.Pointer(pWC)).Fop) == TK_AND { var i int32 for i = 0; i < nLeft; i++ { var idxNew int32 var pNew uintptr var pLeft uintptr = Xsqlite3ExprForVectorField(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpLeft, i, nLeft) var pRight uintptr = Xsqlite3ExprForVectorField(tls, pParse, (*Expr)(unsafe.Pointer(pExpr)).FpRight, i, nLeft) pNew = Xsqlite3PExpr(tls, pParse, int32((*Expr)(unsafe.Pointer(pExpr)).Fop), pLeft, pRight) transferJoinMarkings(tls, pNew, pExpr) idxNew = whereClauseInsert(tls, pWC, pNew, uint16(TERM_DYNAMIC|TERM_SLICE)) exprAnalyze(tls, pSrc, pWC, idxNew) } pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_CODED | TERM_VIRTUAL) (*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator = U16(WO_ROWVAL) } else if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_IN && *(*int32)(unsafe.Pointer(pTerm + 32 + 4)) == 0 && int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(pExpr)).FpLeft)).Fop) == TK_VECTOR && (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) && ((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FpPrior == uintptr(0) || (*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FselFlags&U32(SF_Values) != 0) && (*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FpWin == uintptr(0) && int32((*WhereClause)(unsafe.Pointer(pWC)).Fop) == TK_AND { var i int32 for i = 0; i < Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer(pExpr)).FpLeft); i++ { var idxNew int32 idxNew = whereClauseInsert(tls, pWC, pExpr, uint16(TERM_VIRTUAL|TERM_SLICE)) *(*int32)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxNew)*56 + 32 + 4)) = i + 1 exprAnalyze(tls, pSrc, pWC, idxNew) markTermAsChild(tls, pWC, idxNew, idxTerm) } } else if int32((*WhereClause)(unsafe.Pointer(pWC)).Fop) == TK_AND { *(*uintptr)(unsafe.Pointer(bp + 40)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 32)) = uintptr(0) var res int32 = isAuxiliaryVtabOperator(tls, db, pExpr, bp+24, bp+32, bp+40) for libc.PostDecInt32(&res, 1) > 0 { var idxNew int32 var pNewTerm uintptr var prereqColumn Bitmask var prereqExpr Bitmask prereqExpr = Xsqlite3WhereExprUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(bp + 40))) prereqColumn = Xsqlite3WhereExprUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(bp + 32))) if prereqExpr&prereqColumn == uint64(0) { var pNewExpr uintptr pNewExpr = Xsqlite3PExpr(tls, pParse, TK_MATCH, uintptr(0), Xsqlite3ExprDup(tls, db, *(*uintptr)(unsafe.Pointer(bp + 40)), 0)) if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0) && pNewExpr != 0 { *(*U32)(unsafe.Pointer(pNewExpr + 4)) |= U32(EP_OuterON) *(*int32)(unsafe.Pointer(pNewExpr + 52)) = *(*int32)(unsafe.Pointer(pExpr + 52)) } idxNew = whereClauseInsert(tls, pWC, pNewExpr, uint16(TERM_VIRTUAL|TERM_DYNAMIC)) pNewTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxNew)*56 (*WhereTerm)(unsafe.Pointer(pNewTerm)).FprereqRight = prereqExpr (*WhereTerm)(unsafe.Pointer(pNewTerm)).FleftCursor = (*Expr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 32)))).FiTable *(*int32)(unsafe.Pointer(pNewTerm + 32)) = int32((*Expr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 32)))).FiColumn) (*WhereTerm)(unsafe.Pointer(pNewTerm)).FeOperator = U16(WO_AUX) (*WhereTerm)(unsafe.Pointer(pNewTerm)).FeMatchOp = *(*uint8)(unsafe.Pointer(bp + 24)) markTermAsChild(tls, pWC, idxNew, idxTerm) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_COPIED) (*WhereTerm)(unsafe.Pointer(pNewTerm)).FprereqAll = (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll } { var t uintptr = *(*uintptr)(unsafe.Pointer(bp + 32)) *(*uintptr)(unsafe.Pointer(bp + 32)) = *(*uintptr)(unsafe.Pointer(bp + 40)) *(*uintptr)(unsafe.Pointer(bp + 40)) = t } } } pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idxTerm)*56 *(*Bitmask)(unsafe.Pointer(pTerm + 40)) |= extraRight } var ops = [2]U8{U8(TK_GE), U8(TK_LE)} // This routine identifies subexpressions in the WHERE clause where // each subexpression is separated by the AND operator or some other // operator specified in the op parameter. The WhereClause structure // is filled with pointers to subexpressions. For example: // // WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) // \________/ \_______________/ \________________/ // slot[0] slot[1] slot[2] // // The original WHERE clause in pExpr is unaltered. All this routine // does is make slot[] entries point to substructure within pExpr. // // In the previous sentence and in the diagram, "slot[]" refers to // the WhereClause.a[] array. The slot[] array grows as needed to contain // all terms of the WHERE clause. func Xsqlite3WhereSplit(tls *libc.TLS, pWC uintptr, pExpr uintptr, op U8) { var pE2 uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, pExpr) (*WhereClause)(unsafe.Pointer(pWC)).Fop = op if pE2 == uintptr(0) { return } if int32((*Expr)(unsafe.Pointer(pE2)).Fop) != int32(op) { whereClauseInsert(tls, pWC, pExpr, uint16(0)) } else { Xsqlite3WhereSplit(tls, pWC, (*Expr)(unsafe.Pointer(pE2)).FpLeft, op) Xsqlite3WhereSplit(tls, pWC, (*Expr)(unsafe.Pointer(pE2)).FpRight, op) } } func whereAddLimitExpr(tls *libc.TLS, pWC uintptr, iReg int32, pExpr uintptr, iCsr int32, eMatchOp int32) { bp := tls.Alloc(4) defer tls.Free(4) var pParse uintptr = (*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpParse var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pNew uintptr *(*int32)(unsafe.Pointer(bp)) = 0 if Xsqlite3ExprIsInteger(tls, pExpr, bp) != 0 && *(*int32)(unsafe.Pointer(bp)) >= 0 { var pVal uintptr = Xsqlite3Expr(tls, db, TK_INTEGER, uintptr(0)) if pVal == uintptr(0) { return } *(*U32)(unsafe.Pointer(pVal + 4)) |= U32(EP_IntValue) *(*int32)(unsafe.Pointer(pVal + 8)) = *(*int32)(unsafe.Pointer(bp)) pNew = Xsqlite3PExpr(tls, pParse, TK_MATCH, uintptr(0), pVal) } else { var pVal uintptr = Xsqlite3Expr(tls, db, TK_REGISTER, uintptr(0)) if pVal == uintptr(0) { return } (*Expr)(unsafe.Pointer(pVal)).FiTable = iReg pNew = Xsqlite3PExpr(tls, pParse, TK_MATCH, uintptr(0), pVal) } if pNew != 0 { var pTerm uintptr var idx int32 idx = whereClauseInsert(tls, pWC, pNew, uint16(TERM_DYNAMIC|TERM_VIRTUAL)) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(idx)*56 (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor = iCsr (*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator = U16(WO_AUX) (*WhereTerm)(unsafe.Pointer(pTerm)).FeMatchOp = U8(eMatchOp) } } // Possibly add terms corresponding to the LIMIT and OFFSET clauses of the // SELECT statement passed as the second argument. These terms are only // added if: // // 1. The SELECT statement has a LIMIT clause, and // 2. The SELECT statement is not an aggregate or DISTINCT query, and // 3. The SELECT statement has exactly one object in its from clause, and // that object is a virtual table, and // 4. There are no terms in the WHERE clause that will not be passed // to the virtual table xBestIndex method. // 5. The ORDER BY clause, if any, will be made available to the xBestIndex // method. // // LIMIT and OFFSET terms are ignored by most of the planner code. They // exist only so that they may be passed to the xBestIndex method of the // single virtual table in the FROM clause of the SELECT. func Xsqlite3WhereAddLimit(tls *libc.TLS, pWC uintptr, p uintptr) { if (*Select)(unsafe.Pointer(p)).FpGroupBy == uintptr(0) && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Distinct|SF_Aggregate) == U32(0) && ((*SrcList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc)).FnSrc == 1 && int32((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc+8)).FpTab)).FeTabType) == TABTYP_VTAB) { var pOrderBy uintptr = (*Select)(unsafe.Pointer(p)).FpOrderBy var iCsr int32 = (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FiCursor var ii int32 for ii = 0; ii < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm; ii++ { if int32((*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr(ii)*56)).FwtFlags)&TERM_CODED != 0 { continue } if (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr(ii)*56)).FnChild != 0 { continue } if (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr(ii)*56)).FleftCursor != iCsr { return } } if pOrderBy != 0 { for ii = 0; ii < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr; ii++ { var pExpr uintptr = (*ExprList_item)(unsafe.Pointer(pOrderBy + 8 + uintptr(ii)*32)).FpExpr if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLUMN { return } if (*Expr)(unsafe.Pointer(pExpr)).FiTable != iCsr { return } if int32((*ExprList_item)(unsafe.Pointer(pOrderBy+8+uintptr(ii)*32)).Ffg.FsortFlags)&KEYINFO_ORDER_BIGNULL != 0 { return } } } whereAddLimitExpr(tls, pWC, (*Select)(unsafe.Pointer(p)).FiLimit, (*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpLimit)).FpLeft, iCsr, SQLITE_INDEX_CONSTRAINT_LIMIT) if (*Select)(unsafe.Pointer(p)).FiOffset > 0 { whereAddLimitExpr(tls, pWC, (*Select)(unsafe.Pointer(p)).FiOffset, (*Expr)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpLimit)).FpRight, iCsr, SQLITE_INDEX_CONSTRAINT_OFFSET) } } } // Initialize a preallocated WhereClause structure. func Xsqlite3WhereClauseInit(tls *libc.TLS, pWC uintptr, pWInfo uintptr) { (*WhereClause)(unsafe.Pointer(pWC)).FpWInfo = pWInfo (*WhereClause)(unsafe.Pointer(pWC)).FhasOr = U8(0) (*WhereClause)(unsafe.Pointer(pWC)).FpOuter = uintptr(0) (*WhereClause)(unsafe.Pointer(pWC)).FnTerm = 0 (*WhereClause)(unsafe.Pointer(pWC)).FnBase = 0 (*WhereClause)(unsafe.Pointer(pWC)).FnSlot = int32(uint64(unsafe.Sizeof([8]WhereTerm{})) / uint64(unsafe.Sizeof(WhereTerm{}))) (*WhereClause)(unsafe.Pointer(pWC)).Fa = pWC + 40 } // Deallocate a WhereClause structure. The WhereClause structure // itself is not freed. This routine is the inverse of // sqlite3WhereClauseInit(). func Xsqlite3WhereClauseClear(tls *libc.TLS, pWC uintptr) { var db uintptr = (*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpParse)).Fdb if (*WhereClause)(unsafe.Pointer(pWC)).FnTerm > 0 { var a uintptr = (*WhereClause)(unsafe.Pointer(pWC)).Fa var aLast uintptr = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr((*WhereClause)(unsafe.Pointer(pWC)).FnTerm-1)*56 for 1 != 0 { if int32((*WhereTerm)(unsafe.Pointer(a)).FwtFlags)&TERM_DYNAMIC != 0 { Xsqlite3ExprDelete(tls, db, (*WhereTerm)(unsafe.Pointer(a)).FpExpr) } if int32((*WhereTerm)(unsafe.Pointer(a)).FwtFlags)&(TERM_ORINFO|TERM_ANDINFO) != 0 { if int32((*WhereTerm)(unsafe.Pointer(a)).FwtFlags)&TERM_ORINFO != 0 { whereOrInfoDelete(tls, db, *(*uintptr)(unsafe.Pointer(a + 32))) } else { whereAndInfoDelete(tls, db, *(*uintptr)(unsafe.Pointer(a + 32))) } } if a == aLast { break } a += 56 } } } func sqlite3WhereExprUsageFull(tls *libc.TLS, pMaskSet uintptr, p uintptr) Bitmask { var mask Bitmask if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_IF_NULL_ROW { mask = Xsqlite3WhereGetMask(tls, pMaskSet, (*Expr)(unsafe.Pointer(p)).FiTable) } else { mask = uint64(0) } if (*Expr)(unsafe.Pointer(p)).FpLeft != 0 { mask = mask | Xsqlite3WhereExprUsageNN(tls, pMaskSet, (*Expr)(unsafe.Pointer(p)).FpLeft) } if (*Expr)(unsafe.Pointer(p)).FpRight != 0 { mask = mask | Xsqlite3WhereExprUsageNN(tls, pMaskSet, (*Expr)(unsafe.Pointer(p)).FpRight) } else if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_xIsSelect) != U32(0) { if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_VarSelect) != U32(0) { (*WhereMaskSet)(unsafe.Pointer(pMaskSet)).FbVarSelect = 1 } mask = mask | exprSelectUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(p + 32))) } else if *(*uintptr)(unsafe.Pointer(p + 32)) != 0 { mask = mask | Xsqlite3WhereExprListUsage(tls, pMaskSet, *(*uintptr)(unsafe.Pointer(p + 32))) } if (int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_FUNCTION || int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_AGG_FUNCTION) && (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_WinFunc) != U32(0) { mask = mask | Xsqlite3WhereExprListUsage(tls, pMaskSet, (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64)))).FpPartition) mask = mask | Xsqlite3WhereExprListUsage(tls, pMaskSet, (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64)))).FpOrderBy) mask = mask | Xsqlite3WhereExprUsage(tls, pMaskSet, (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 64)))).FpFilter) } return mask } func Xsqlite3WhereExprUsageNN(tls *libc.TLS, pMaskSet uintptr, p uintptr) Bitmask { if int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_COLUMN && !((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_FixedCol) != U32(0)) { return Xsqlite3WhereGetMask(tls, pMaskSet, (*Expr)(unsafe.Pointer(p)).FiTable) } else if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_TokenOnly|EP_Leaf) != U32(0) { return uint64(0) } return sqlite3WhereExprUsageFull(tls, pMaskSet, p) } func Xsqlite3WhereExprUsage(tls *libc.TLS, pMaskSet uintptr, p uintptr) Bitmask { if p != 0 { return Xsqlite3WhereExprUsageNN(tls, pMaskSet, p) } return uint64(0) } func Xsqlite3WhereExprListUsage(tls *libc.TLS, pMaskSet uintptr, pList uintptr) Bitmask { var i int32 var mask Bitmask = uint64(0) if pList != 0 { for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { mask = mask | Xsqlite3WhereExprUsage(tls, pMaskSet, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr) } } return mask } // Call exprAnalyze on all terms in a WHERE clause. // // Note that exprAnalyze() might add new virtual terms onto the // end of the WHERE clause. We do not want to analyze these new // virtual terms, so start analyzing at the end and work forward // so that the added virtual terms are never processed. func Xsqlite3WhereExprAnalyze(tls *libc.TLS, pTabList uintptr, pWC uintptr) { var i int32 for i = (*WhereClause)(unsafe.Pointer(pWC)).FnTerm - 1; i >= 0; i-- { exprAnalyze(tls, pTabList, pWC, i) } } // For table-valued-functions, transform the function arguments into // new WHERE clause terms. // // Each function argument translates into an equality constraint against // a HIDDEN column in the table. func Xsqlite3WhereTabFuncArgs(tls *libc.TLS, pParse uintptr, pItem uintptr, pWC uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var pTab uintptr var j int32 var k int32 var pArgs uintptr var pColRef uintptr var pTerm uintptr if int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x4>>2) == 0 { return } pTab = (*SrcItem)(unsafe.Pointer(pItem)).FpTab pArgs = *(*uintptr)(unsafe.Pointer(pItem + 88)) if pArgs == uintptr(0) { return } for j = libc.AssignInt32(&k, 0); j < (*ExprList)(unsafe.Pointer(pArgs)).FnExpr; j++ { var pRhs uintptr var joinType U32 for k < int32((*Table)(unsafe.Pointer(pTab)).FnCol) && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(k)*24)).FcolFlags)&COLFLAG_HIDDEN == 0 { k++ } if k >= int32((*Table)(unsafe.Pointer(pTab)).FnCol) { Xsqlite3ErrorMsg(tls, pParse, ts+23286, libc.VaList(bp, (*Table)(unsafe.Pointer(pTab)).FzName, j)) return } pColRef = Xsqlite3ExprAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_COLUMN, uintptr(0), 0) if pColRef == uintptr(0) { return } (*Expr)(unsafe.Pointer(pColRef)).FiTable = (*SrcItem)(unsafe.Pointer(pItem)).FiCursor (*Expr)(unsafe.Pointer(pColRef)).FiColumn = YnVar(libc.PostIncInt32(&k, 1)) *(*uintptr)(unsafe.Pointer(pColRef + 64)) = pTab *(*Bitmask)(unsafe.Pointer(pItem + 80)) |= Xsqlite3ExprColUsed(tls, pColRef) pRhs = Xsqlite3PExpr(tls, pParse, TK_UPLUS, Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*ExprList_item)(unsafe.Pointer(pArgs+8+uintptr(j)*32)).FpExpr, 0), uintptr(0)) pTerm = Xsqlite3PExpr(tls, pParse, TK_EQ, pColRef, pRhs) if int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ|JT_RIGHT) != 0 { joinType = U32(EP_OuterON) } else { joinType = U32(EP_InnerON) } Xsqlite3SetJoinExpr(tls, pTerm, (*SrcItem)(unsafe.Pointer(pItem)).FiCursor, joinType) whereClauseInsert(tls, pWC, pTerm, uint16(TERM_DYNAMIC)) } } // Extra information appended to the end of sqlite3_index_info but not // visible to the xBestIndex function, at least not directly. The // sqlite3_vtab_collation() interface knows how to reach it, however. // // This object is not an API and can be changed from one release to the // next. As long as allocateIndexInfo() and sqlite3_vtab_collation() // agree on the structure, all will be well. type HiddenIndexInfo1 = struct { FpWC uintptr FpParse uintptr FeDistinct int32 FmIn U32 FmHandleIn U32 F__ccgo_pad1 [4]byte FaRhs [1]uintptr } // Extra information appended to the end of sqlite3_index_info but not // visible to the xBestIndex function, at least not directly. The // sqlite3_vtab_collation() interface knows how to reach it, however. // // This object is not an API and can be changed from one release to the // next. As long as allocateIndexInfo() and sqlite3_vtab_collation() // agree on the structure, all will be well. type HiddenIndexInfo = HiddenIndexInfo1 // Return the estimated number of output rows from a WHERE clause func Xsqlite3WhereOutputRowCount(tls *libc.TLS, pWInfo uintptr) LogEst { return (*WhereInfo)(unsafe.Pointer(pWInfo)).FnRowOut } // Return one of the WHERE_DISTINCT_xxxxx values to indicate how this // WHERE clause returns outputs for DISTINCT processing. func Xsqlite3WhereIsDistinct(tls *libc.TLS, pWInfo uintptr) int32 { return int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct) } // Return the number of ORDER BY terms that are satisfied by the // WHERE clause. A return of 0 means that the output must be // completely sorted. A return equal to the number of ORDER BY // terms means that no sorting is needed at all. A return that // is positive but less than the number of ORDER BY terms means that // block sorting is required. func Xsqlite3WhereIsOrdered(tls *libc.TLS, pWInfo uintptr) int32 { if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat) < 0 { return 0 } return int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat) } // In the ORDER BY LIMIT optimization, if the inner-most loop is known // to emit rows in increasing order, and if the last row emitted by the // inner-most loop did not fit within the sorter, then we can skip all // subsequent rows for the current iteration of the inner loop (because they // will not fit in the sorter either) and continue with the second inner // loop - the loop immediately outside the inner-most. // // When a row does not fit in the sorter (because the sorter already // holds LIMIT+OFFSET rows that are smaller), then a jump is made to the // label returned by this function. // // If the ORDER BY LIMIT optimization applies, the jump destination should // be the continuation for the second-inner-most loop. If the ORDER BY // LIMIT optimization does not apply, then the jump destination should // be the continuation for the inner-most loop. // // It is always safe for this routine to return the continuation of the // inner-most loop, in the sense that a correct answer will result. // Returning the continuation the second inner loop is an optimization // that might make the code run a little faster, but should not change // the final answer. func Xsqlite3WhereOrderByLimitOptLabel(tls *libc.TLS, pWInfo uintptr) int32 { var pInner uintptr if !(int32(*(*uint8)(unsafe.Pointer(pWInfo + 68))&0x4>>2) != 0) { return (*WhereInfo)(unsafe.Pointer(pWInfo)).FiContinue } pInner = pWInfo + 856 + uintptr(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel)-1)*104 if (*WhereLevel)(unsafe.Pointer(pInner)).FpRJ != 0 { return (*WhereInfo)(unsafe.Pointer(pWInfo)).FiContinue } return (*WhereLevel)(unsafe.Pointer(pInner)).FaddrNxt } // While generating code for the min/max optimization, after handling // the aggregate-step call to min() or max(), check to see if any // additional looping is required. If the output order is such that // we are certain that the correct answer has already been found, then // code an OP_Goto to by pass subsequent processing. // // Any extra OP_Goto that is coded here is an optimization. The // correct answer should be obtained regardless. This OP_Goto just // makes the answer appear faster. func Xsqlite3WhereMinMaxOptEarlyOut(tls *libc.TLS, v uintptr, pWInfo uintptr) { var pInner uintptr var i int32 if !(int32(*(*uint8)(unsafe.Pointer(pWInfo + 68))&0x4>>2) != 0) { return } if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat) == 0 { return } for i = int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) - 1; i >= 0; i-- { pInner = pWInfo + 856 + uintptr(i)*104 if (*WhereLoop1)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pInner)).FpWLoop)).FwsFlags&U32(WHERE_COLUMN_IN) != U32(0) { Xsqlite3VdbeGoto(tls, v, (*WhereLevel)(unsafe.Pointer(pInner)).FaddrNxt) return } } Xsqlite3VdbeGoto(tls, v, (*WhereInfo)(unsafe.Pointer(pWInfo)).FiBreak) } // Return the VDBE address or label to jump to in order to continue // immediately with the next row of a WHERE clause. func Xsqlite3WhereContinueLabel(tls *libc.TLS, pWInfo uintptr) int32 { return (*WhereInfo)(unsafe.Pointer(pWInfo)).FiContinue } // Return the VDBE address or label to jump to in order to break // out of a WHERE loop. func Xsqlite3WhereBreakLabel(tls *libc.TLS, pWInfo uintptr) int32 { return (*WhereInfo)(unsafe.Pointer(pWInfo)).FiBreak } // Return ONEPASS_OFF (0) if an UPDATE or DELETE statement is unable to // operate directly on the rowids returned by a WHERE clause. Return // ONEPASS_SINGLE (1) if the statement can operation directly because only // a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass // optimization can be used on multiple // // If the ONEPASS optimization is used (if this routine returns true) // then also write the indices of open cursors used by ONEPASS // into aiCur[0] and aiCur[1]. iaCur[0] gets the cursor of the data // table and iaCur[1] gets the cursor used by an auxiliary index. // Either value may be -1, indicating that cursor is not used. // Any cursors returned will have been opened for writing. // // aiCur[0] and aiCur[1] both get -1 if the where-clause logic is // unable to use the ONEPASS optimization. func Xsqlite3WhereOkOnePass(tls *libc.TLS, pWInfo uintptr, aiCur uintptr) int32 { libc.Xmemcpy(tls, aiCur, pWInfo+40, uint64(unsafe.Sizeof(int32(0)))*uint64(2)) return int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeOnePass) } // Return TRUE if the WHERE loop uses the OP_DeferredSeek opcode to move // the data cursor to the row selected by the index cursor. func Xsqlite3WhereUsesDeferredSeek(tls *libc.TLS, pWInfo uintptr) int32 { return int32(*(*uint8)(unsafe.Pointer(pWInfo + 68)) & 0x1 >> 0) } func whereOrMove(tls *libc.TLS, pDest uintptr, pSrc uintptr) { (*WhereOrSet)(unsafe.Pointer(pDest)).Fn = (*WhereOrSet)(unsafe.Pointer(pSrc)).Fn libc.Xmemcpy(tls, pDest+8, pSrc+8, uint64((*WhereOrSet)(unsafe.Pointer(pDest)).Fn)*uint64(unsafe.Sizeof(WhereOrCost{}))) } func whereOrInsert(tls *libc.TLS, pSet uintptr, prereq Bitmask, rRun LogEst, nOut LogEst) int32 { var i U16 var p uintptr i = (*WhereOrSet)(unsafe.Pointer(pSet)).Fn p = pSet + 8 __1: if !(int32(i) > 0) { goto __3 } if !(int32(rRun) <= int32((*WhereOrCost)(unsafe.Pointer(p)).FrRun) && prereq&(*WhereOrCost)(unsafe.Pointer(p)).Fprereq == prereq) { goto __4 } goto whereOrInsert_done __4: ; if !(int32((*WhereOrCost)(unsafe.Pointer(p)).FrRun) <= int32(rRun) && (*WhereOrCost)(unsafe.Pointer(p)).Fprereq&prereq == (*WhereOrCost)(unsafe.Pointer(p)).Fprereq) { goto __5 } return 0 __5: ; goto __2 __2: i-- p += 16 goto __1 goto __3 __3: ; if !(int32((*WhereOrSet)(unsafe.Pointer(pSet)).Fn) < N_OR_COST) { goto __6 } p = pSet + 8 + uintptr(libc.PostIncUint16(&(*WhereOrSet)(unsafe.Pointer(pSet)).Fn, 1))*16 (*WhereOrCost)(unsafe.Pointer(p)).FnOut = nOut goto __7 __6: p = pSet + 8 i = U16(1) __8: if !(int32(i) < int32((*WhereOrSet)(unsafe.Pointer(pSet)).Fn)) { goto __10 } if !(int32((*WhereOrCost)(unsafe.Pointer(p)).FrRun) > int32((*WhereOrCost)(unsafe.Pointer(pSet+8+uintptr(i)*16)).FrRun)) { goto __11 } p = pSet + 8 + uintptr(i)*16 __11: ; goto __9 __9: i++ goto __8 goto __10 __10: ; if !(int32((*WhereOrCost)(unsafe.Pointer(p)).FrRun) <= int32(rRun)) { goto __12 } return 0 __12: ; __7: ; whereOrInsert_done: (*WhereOrCost)(unsafe.Pointer(p)).Fprereq = prereq (*WhereOrCost)(unsafe.Pointer(p)).FrRun = rRun if !(int32((*WhereOrCost)(unsafe.Pointer(p)).FnOut) > int32(nOut)) { goto __13 } (*WhereOrCost)(unsafe.Pointer(p)).FnOut = nOut __13: ; return 1 } // Return the bitmask for the given cursor number. Return 0 if // iCursor is not in the set. func Xsqlite3WhereGetMask(tls *libc.TLS, pMaskSet uintptr, iCursor int32) Bitmask { var i int32 if *(*int32)(unsafe.Pointer(pMaskSet + 8)) == iCursor { return uint64(1) } for i = 1; i < (*WhereMaskSet)(unsafe.Pointer(pMaskSet)).Fn; i++ { if *(*int32)(unsafe.Pointer(pMaskSet + 8 + uintptr(i)*4)) == iCursor { return uint64(1) << i } } return uint64(0) } // Allocate memory that is automatically freed when pWInfo is freed. func Xsqlite3WhereMalloc(tls *libc.TLS, pWInfo uintptr, nByte U64) uintptr { var pBlock uintptr pBlock = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse)).Fdb, nByte+U64(unsafe.Sizeof(WhereMemBlock{}))) if pBlock != 0 { (*WhereMemBlock)(unsafe.Pointer(pBlock)).FpNext = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpMemToFree (*WhereMemBlock)(unsafe.Pointer(pBlock)).Fsz = nByte (*WhereInfo)(unsafe.Pointer(pWInfo)).FpMemToFree = pBlock pBlock += 16 } return pBlock } func Xsqlite3WhereRealloc(tls *libc.TLS, pWInfo uintptr, pOld uintptr, nByte U64) uintptr { var pNew uintptr = Xsqlite3WhereMalloc(tls, pWInfo, nByte) if pNew != 0 && pOld != 0 { var pOldBlk uintptr = pOld pOldBlk -= 16 libc.Xmemcpy(tls, pNew, pOld, (*WhereMemBlock)(unsafe.Pointer(pOldBlk)).Fsz) } return pNew } func createMask(tls *libc.TLS, pMaskSet uintptr, iCursor int32) { *(*int32)(unsafe.Pointer(pMaskSet + 8 + uintptr(libc.PostIncInt32(&(*WhereMaskSet)(unsafe.Pointer(pMaskSet)).Fn, 1))*4)) = iCursor } func whereRightSubexprIsColumn(tls *libc.TLS, p uintptr) uintptr { p = Xsqlite3ExprSkipCollateAndLikely(tls, (*Expr)(unsafe.Pointer(p)).FpRight) if p != uintptr(0) && int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_COLUMN && !((*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_FixedCol) != U32(0)) { return p } return uintptr(0) } func whereScanNext(tls *libc.TLS, pScan uintptr) uintptr { var iCur int32 var iColumn I16 var pX uintptr var pWC uintptr var pTerm uintptr var k int32 = (*WhereScan)(unsafe.Pointer(pScan)).Fk pWC = (*WhereScan)(unsafe.Pointer(pScan)).FpWC for 1 != 0 { iColumn = *(*I16)(unsafe.Pointer(pScan + 88 + uintptr(int32((*WhereScan)(unsafe.Pointer(pScan)).FiEquiv)-1)*2)) iCur = *(*int32)(unsafe.Pointer(pScan + 44 + uintptr(int32((*WhereScan)(unsafe.Pointer(pScan)).FiEquiv)-1)*4)) for __ccgo := true; __ccgo; __ccgo = pWC != uintptr(0) { pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(k)*56 __1: if !(k < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm) { goto __3 } { if (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor == iCur && *(*int32)(unsafe.Pointer(pTerm + 32)) == int32(iColumn) && (int32(iColumn) != -2 || Xsqlite3ExprCompareSkip(tls, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpLeft, (*WhereScan)(unsafe.Pointer(pScan)).FpIdxExpr, iCur) == 0) && (int32((*WhereScan)(unsafe.Pointer(pScan)).FiEquiv) <= 1 || !((*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_OuterON) != U32(0))) { if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_EQUIV != 0 && int32((*WhereScan)(unsafe.Pointer(pScan)).FnEquiv) < int32(uint64(unsafe.Sizeof([11]int32{}))/uint64(unsafe.Sizeof(int32(0)))) && libc.AssignUintptr(&pX, whereRightSubexprIsColumn(tls, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)) != uintptr(0) { var j int32 for j = 0; j < int32((*WhereScan)(unsafe.Pointer(pScan)).FnEquiv); j++ { if *(*int32)(unsafe.Pointer(pScan + 44 + uintptr(j)*4)) == (*Expr)(unsafe.Pointer(pX)).FiTable && int32(*(*I16)(unsafe.Pointer(pScan + 88 + uintptr(j)*2))) == int32((*Expr)(unsafe.Pointer(pX)).FiColumn) { break } } if j == int32((*WhereScan)(unsafe.Pointer(pScan)).FnEquiv) { *(*int32)(unsafe.Pointer(pScan + 44 + uintptr(j)*4)) = (*Expr)(unsafe.Pointer(pX)).FiTable *(*I16)(unsafe.Pointer(pScan + 88 + uintptr(j)*2)) = (*Expr)(unsafe.Pointer(pX)).FiColumn (*WhereScan)(unsafe.Pointer(pScan)).FnEquiv++ } } if U32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&(*WhereScan)(unsafe.Pointer(pScan)).FopMask != U32(0) { if (*WhereScan)(unsafe.Pointer(pScan)).FzCollName != 0 && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_ISNULL == 0 { var pColl uintptr var pParse uintptr = (*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpParse pX = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if !(Xsqlite3IndexAffinityOk(tls, pX, (*WhereScan)(unsafe.Pointer(pScan)).Fidxaff) != 0) { goto __2 } pColl = Xsqlite3ExprCompareCollSeq(tls, pParse, pX) if pColl == uintptr(0) { pColl = (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FpDfltColl } if Xsqlite3StrICmp(tls, (*CollSeq)(unsafe.Pointer(pColl)).FzName, (*WhereScan)(unsafe.Pointer(pScan)).FzCollName) != 0 { goto __2 } } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&(WO_EQ|WO_IS) != 0 && func() bool { pX = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpRight return pX != uintptr(0) }() && int32((*Expr)(unsafe.Pointer(pX)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pX)).FiTable == *(*int32)(unsafe.Pointer(pScan + 44)) && int32((*Expr)(unsafe.Pointer(pX)).FiColumn) == int32(*(*I16)(unsafe.Pointer(pScan + 88))) { goto __2 } (*WhereScan)(unsafe.Pointer(pScan)).FpWC = pWC (*WhereScan)(unsafe.Pointer(pScan)).Fk = k + 1 return pTerm } } } goto __2 __2: k++ pTerm += 56 goto __1 goto __3 __3: ; pWC = (*WhereClause)(unsafe.Pointer(pWC)).FpOuter k = 0 } if int32((*WhereScan)(unsafe.Pointer(pScan)).FiEquiv) >= int32((*WhereScan)(unsafe.Pointer(pScan)).FnEquiv) { break } pWC = (*WhereScan)(unsafe.Pointer(pScan)).FpOrigWC k = 0 (*WhereScan)(unsafe.Pointer(pScan)).FiEquiv++ } return uintptr(0) } func whereScanInitIndexExpr(tls *libc.TLS, pScan uintptr) uintptr { (*WhereScan)(unsafe.Pointer(pScan)).Fidxaff = Xsqlite3ExprAffinity(tls, (*WhereScan)(unsafe.Pointer(pScan)).FpIdxExpr) return whereScanNext(tls, pScan) } func whereScanInit(tls *libc.TLS, pScan uintptr, pWC uintptr, iCur int32, iColumn int32, opMask U32, pIdx uintptr) uintptr { (*WhereScan)(unsafe.Pointer(pScan)).FpOrigWC = pWC (*WhereScan)(unsafe.Pointer(pScan)).FpWC = pWC (*WhereScan)(unsafe.Pointer(pScan)).FpIdxExpr = uintptr(0) (*WhereScan)(unsafe.Pointer(pScan)).Fidxaff = int8(0) (*WhereScan)(unsafe.Pointer(pScan)).FzCollName = uintptr(0) (*WhereScan)(unsafe.Pointer(pScan)).FopMask = opMask (*WhereScan)(unsafe.Pointer(pScan)).Fk = 0 *(*int32)(unsafe.Pointer(pScan + 44)) = iCur (*WhereScan)(unsafe.Pointer(pScan)).FnEquiv = uint8(1) (*WhereScan)(unsafe.Pointer(pScan)).FiEquiv = uint8(1) if pIdx != 0 { var j int32 = iColumn iColumn = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(j)*2))) if iColumn == int32((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FiPKey) { iColumn = -1 } else if iColumn >= 0 { (*WhereScan)(unsafe.Pointer(pScan)).Fidxaff = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FaCol + uintptr(iColumn)*24)).Faffinity (*WhereScan)(unsafe.Pointer(pScan)).FzCollName = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(j)*8)) } else if iColumn == -2 { (*WhereScan)(unsafe.Pointer(pScan)).FpIdxExpr = (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr + 8 + uintptr(j)*32)).FpExpr (*WhereScan)(unsafe.Pointer(pScan)).FzCollName = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(j)*8)) *(*I16)(unsafe.Pointer(pScan + 88)) = int16(-2) return whereScanInitIndexExpr(tls, pScan) } } else if iColumn == -2 { return uintptr(0) } *(*I16)(unsafe.Pointer(pScan + 88)) = I16(iColumn) return whereScanNext(tls, pScan) } // Search for a term in the WHERE clause that is of the form "X " // where X is a reference to the iColumn of table iCur or of index pIdx // if pIdx!=0 and is one of the WO_xx operator codes specified by // the op parameter. Return a pointer to the term. Return 0 if not found. // // If pIdx!=0 then it must be one of the indexes of table iCur. // Search for terms matching the iColumn-th column of pIdx // rather than the iColumn-th column of table iCur. // // The term returned might by Y= if there is another constraint in // the WHERE clause that specifies that X=Y. Any such constraints will be // identified by the WO_EQUIV bit in the pTerm->eOperator field. The // aiCur[]/iaColumn[] arrays hold X and all its equivalents. There are 11 // slots in aiCur[]/aiColumn[] so that means we can look for X plus up to 10 // other equivalent values. Hence a search for X will return if X=A1 // and A1=A2 and A2=A3 and ... and A9=A10 and A10=. // // If there are multiple terms in the WHERE clause of the form "X " // then try for the one with no dependencies on - in other words where // is a constant expression of some kind. Only return entries of // the form "X Y" where Y is a column in another table if no terms of // the form "X " exist. If no terms with a constant RHS // exist, try to return a term that does not use WO_EQUIV. func Xsqlite3WhereFindTerm(tls *libc.TLS, pWC uintptr, iCur int32, iColumn int32, notReady Bitmask, op U32, pIdx uintptr) uintptr { bp := tls.Alloc(112) defer tls.Free(112) var pResult uintptr = uintptr(0) var p uintptr p = whereScanInit(tls, bp, pWC, iCur, iColumn, op, pIdx) op = op & U32(WO_EQ|WO_IS) for p != 0 { if (*WhereTerm)(unsafe.Pointer(p)).FprereqRight¬Ready == uint64(0) { if (*WhereTerm)(unsafe.Pointer(p)).FprereqRight == uint64(0) && U32((*WhereTerm)(unsafe.Pointer(p)).FeOperator)&op != U32(0) { return p } if pResult == uintptr(0) { pResult = p } } p = whereScanNext(tls, bp) } return pResult } func findIndexCol(tls *libc.TLS, pParse uintptr, pList uintptr, iBase int32, pIdx uintptr, iCol int32) int32 { var i int32 var zColl uintptr = *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(iCol)*8)) for i = 0; i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { var p uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr) if p != uintptr(0) && (int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_COLUMN || int32((*Expr)(unsafe.Pointer(p)).Fop) == TK_AGG_COLUMN) && int32((*Expr)(unsafe.Pointer(p)).FiColumn) == int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(iCol)*2))) && (*Expr)(unsafe.Pointer(p)).FiTable == iBase { var pColl uintptr = Xsqlite3ExprNNCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr) if 0 == Xsqlite3StrICmp(tls, (*CollSeq)(unsafe.Pointer(pColl)).FzName, zColl) { return i } } } return -1 } func indexColumnNotNull(tls *libc.TLS, pIdx uintptr, iCol int32) int32 { var j int32 j = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(iCol)*2))) if j >= 0 { return int32(*(*uint8)(unsafe.Pointer((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FaCol + uintptr(j)*24 + 8)) & 0xf >> 0) } else if j == -1 { return 1 } else { return 0 } return int32(0) } func isDistinctRedundant(tls *libc.TLS, pParse uintptr, pTabList uintptr, pWC uintptr, pDistinct uintptr) int32 { var pTab uintptr var pIdx uintptr var i int32 var iBase int32 if (*SrcList)(unsafe.Pointer(pTabList)).FnSrc != 1 { return 0 } iBase = (*SrcItem)(unsafe.Pointer(pTabList + 8)).FiCursor pTab = (*SrcItem)(unsafe.Pointer(pTabList + 8)).FpTab for i = 0; i < (*ExprList)(unsafe.Pointer(pDistinct)).FnExpr; i++ { var p uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, (*ExprList_item)(unsafe.Pointer(pDistinct+8+uintptr(i)*32)).FpExpr) if p == uintptr(0) { continue } if int32((*Expr)(unsafe.Pointer(p)).Fop) != TK_COLUMN && int32((*Expr)(unsafe.Pointer(p)).Fop) != TK_AGG_COLUMN { continue } if (*Expr)(unsafe.Pointer(p)).FiTable == iBase && int32((*Expr)(unsafe.Pointer(p)).FiColumn) < 0 { return 1 } } for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { if !(int32((*Index)(unsafe.Pointer(pIdx)).FonError) != OE_None) { continue } if (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != 0 { continue } for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol); i++ { if uintptr(0) == Xsqlite3WhereFindTerm(tls, pWC, iBase, i, libc.CplUint64(uint64(0)), uint32(WO_EQ), pIdx) { if findIndexCol(tls, pParse, pDistinct, iBase, pIdx, i) < 0 { break } if indexColumnNotNull(tls, pIdx, i) == 0 { break } } } if i == int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) { return 1 } } return 0 } func estLog(tls *libc.TLS, N LogEst) LogEst { if int32(N) <= 10 { return int16(0) } return int16(int32(Xsqlite3LogEst(tls, uint64(N))) - 33) } func translateColumnToCopy(tls *libc.TLS, pParse uintptr, iStart int32, iTabCur int32, iRegister int32, iAutoidxCur int32) { var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var pOp uintptr = Xsqlite3VdbeGetOp(tls, v, iStart) var iEnd int32 = Xsqlite3VdbeCurrentAddr(tls, v) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { return } __1: if !(iStart < iEnd) { goto __3 } { if (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 != iTabCur { goto __2 } if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Column { (*VdbeOp)(unsafe.Pointer(pOp)).Fopcode = U8(OP_Copy) (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 + iRegister (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 = (*VdbeOp)(unsafe.Pointer(pOp)).Fp3 (*VdbeOp)(unsafe.Pointer(pOp)).Fp3 = 0 (*VdbeOp)(unsafe.Pointer(pOp)).Fp5 = U16(2) } else if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Rowid { (*VdbeOp)(unsafe.Pointer(pOp)).Fopcode = U8(OP_Sequence) (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = iAutoidxCur } } goto __2 __2: iStart++ pOp += 24 goto __1 goto __3 __3: } func constraintCompatibleWithOuterJoin(tls *libc.TLS, pTerm uintptr, pSrc uintptr) int32 { if !((*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_OuterON|EP_InnerON) != U32(0)) || *(*int32)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr + 52)) != (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor { return 0 } if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&(JT_LEFT|JT_RIGHT) != 0 && (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_InnerON) != U32(0) { return 0 } return 1 } func termCanDriveIndex(tls *libc.TLS, pTerm uintptr, pSrc uintptr, notReady Bitmask) int32 { var aff int8 if (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor != (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor { return 0 } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&(WO_EQ|WO_IS) == 0 { return 0 } if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ|JT_RIGHT) != 0 && !(constraintCompatibleWithOuterJoin(tls, pTerm, pSrc) != 0) { return 0 } if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight¬Ready != uint64(0) { return 0 } if *(*int32)(unsafe.Pointer(pTerm + 32)) < 0 { return 0 } aff = (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pSrc)).FpTab)).FaCol + uintptr(*(*int32)(unsafe.Pointer(pTerm + 32)))*24)).Faffinity if !(Xsqlite3IndexAffinityOk(tls, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr, aff) != 0) { return 0 } return 1 } func constructAutomaticIndex(tls *libc.TLS, pParse uintptr, pWC uintptr, pSrc uintptr, notReady Bitmask, pLevel uintptr) { bp := tls.Alloc(24) defer tls.Free(24) var nKeyCol int32 var pTerm uintptr var pWCEnd uintptr var pIdx uintptr var v uintptr var addrInit int32 var pTable uintptr var addrTop int32 var regRecord int32 var n int32 var i int32 var mxBitCol int32 var pColl uintptr var pLoop uintptr var idxCols Bitmask var extraCols Bitmask var sentWarning U8 var pPartial uintptr var iContinue int32 var pTabItem uintptr var addrCounter int32 var regBase int32 var iCol int32 var cMask Bitmask var pExpr uintptr var pX uintptr var iCol1 int32 var cMask1 Bitmask var regYield int32 sentWarning = U8(0) pPartial = uintptr(0) iContinue = 0 addrCounter = 0 v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe addrInit = Xsqlite3VdbeAddOp0(tls, v, OP_Once) nKeyCol = 0 pTable = (*SrcItem)(unsafe.Pointer(pSrc)).FpTab pWCEnd = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr((*WhereClause)(unsafe.Pointer(pWC)).FnTerm)*56 pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop idxCols = uint64(0) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa __1: if !(pTerm < pWCEnd) { goto __3 } pExpr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if !(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VIRTUAL == 0 && Xsqlite3ExprIsTableConstraint(tls, pExpr, pSrc) != 0) { goto __4 } pPartial = Xsqlite3ExprAnd(tls, pParse, pPartial, Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr, 0)) __4: ; if !(termCanDriveIndex(tls, pTerm, pSrc, notReady) != 0) { goto __5 } iCol = *(*int32)(unsafe.Pointer(pTerm + 32)) if iCol >= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) { cMask = uint64(1) << (int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) - 1) } else { cMask = uint64(1) << iCol } if !!(sentWarning != 0) { goto __6 } Xsqlite3_log(tls, SQLITE_WARNING|int32(1)<<8, ts+23322, libc.VaList(bp, (*Table)(unsafe.Pointer(pTable)).FzName, (*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTable)).FaCol+uintptr(iCol)*24)).FzCnName)) sentWarning = U8(1) __6: ; if !(idxCols&cMask == uint64(0)) { goto __7 } if !(whereLoopResize(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pLoop, nKeyCol+1) != 0) { goto __8 } goto end_auto_index_create __8: ; *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(libc.PostIncInt32(&nKeyCol, 1))*8)) = pTerm idxCols = idxCols | cMask __7: ; __5: ; goto __2 __2: pTerm += 56 goto __1 goto __3 __3: ; *(*U16)(unsafe.Pointer(pLoop + 24)) = libc.AssignPtrUint16(pLoop+60, U16(nKeyCol)) (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags = U32(WHERE_COLUMN_EQ | WHERE_IDX_ONLY | WHERE_INDEXED | WHERE_AUTO_INDEX) extraCols = (*SrcItem)(unsafe.Pointer(pSrc)).FcolUsed & (^idxCols | uint64(1)<<(int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))-1)) mxBitCol = func() int32 { if int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))-1 < int32((*Table)(unsafe.Pointer(pTable)).FnCol) { return int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) - 1 } return int32((*Table)(unsafe.Pointer(pTable)).FnCol) }() i = 0 __9: if !(i < mxBitCol) { goto __11 } if !(extraCols&(uint64(1)<= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) { cMask1 = uint64(1) << (int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) - 1) } else { cMask1 = uint64(1) << iCol1 } if !(idxCols&cMask1 == uint64(0)) { goto __19 } pX = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr idxCols = idxCols | cMask1 *(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(n)*2)) = I16(*(*int32)(unsafe.Pointer(pTerm + 32))) pColl = Xsqlite3ExprCompareCollSeq(tls, pParse, pX) *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(n)*8)) = func() uintptr { if pColl != 0 { return (*CollSeq)(unsafe.Pointer(pColl)).FzName } return uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) }() n++ __19: ; __18: ; goto __16 __16: pTerm += 56 goto __15 goto __17 __17: ; i = 0 __20: if !(i < mxBitCol) { goto __22 } if !(extraCols&(uint64(1)<>5)) != 0) { goto __29 } regYield = (*SrcItem)(unsafe.Pointer(pTabItem)).FregReturn addrCounter = Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, 0) Xsqlite3VdbeAddOp3(tls, v, OP_InitCoroutine, regYield, 0, (*SrcItem)(unsafe.Pointer(pTabItem)).FaddrFillSub) addrTop = Xsqlite3VdbeAddOp1(tls, v, OP_Yield, regYield) goto __30 __29: addrTop = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur) __30: ; if !(pPartial != 0) { goto __31 } iContinue = Xsqlite3VdbeMakeLabel(tls, pParse) Xsqlite3ExprIfFalse(tls, pParse, pPartial, iContinue, SQLITE_JUMPIFNULL) *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_PARTIALIDX) __31: ; regRecord = Xsqlite3GetTempReg(tls, pParse) regBase = Xsqlite3GenerateIndexKey(tls, pParse, pIdx, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur, regRecord, 0, uintptr(0), uintptr(0), 0) if !((*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter != 0) { goto __32 } Xsqlite3VdbeAddOp4Int(tls, v, OP_FilterAdd, (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter, 0, regBase, int32(*(*U16)(unsafe.Pointer(pLoop + 24)))) __32: ; Xsqlite3VdbeAddOp2(tls, v, OP_IdxInsert, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur, regRecord) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_USESEEKRESULT)) if !(pPartial != 0) { goto __33 } Xsqlite3VdbeResolveLabel(tls, v, iContinue) __33: ; if !(uint32(int32(*(*uint16)(unsafe.Pointer(pTabItem + 60 + 4))&0x20>>5)) != 0) { goto __34 } Xsqlite3VdbeChangeP2(tls, v, addrCounter, regBase+n) translateColumnToCopy(tls, pParse, addrTop, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur, (*SrcItem)(unsafe.Pointer(pTabItem)).FregResult, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur) Xsqlite3VdbeGoto(tls, v, addrTop) libc.SetBitFieldPtr16Uint32(pTabItem+60+4, uint32(0), 5, 0x20) goto __35 __34: Xsqlite3VdbeAddOp2(tls, v, OP_Next, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur, addrTop+1) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_STMTSTATUS_AUTOINDEX)) __35: ; Xsqlite3VdbeJumpHere(tls, v, addrTop) Xsqlite3ReleaseTempReg(tls, pParse, regRecord) Xsqlite3VdbeJumpHere(tls, v, addrInit) end_auto_index_create: Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pPartial) } func sqlite3ConstructBloomFilter(tls *libc.TLS, pWInfo uintptr, iLevel int32, pLevel uintptr, notReady Bitmask) { var addrOnce int32 var addrTop int32 var addrCont int32 var pTerm uintptr var pWCEnd uintptr var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var pLoop uintptr = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop var iCur int32 var saved_pIdxEpr uintptr saved_pIdxEpr = (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr = uintptr(0) addrOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) for __ccgo := true; __ccgo; __ccgo = iLevel < int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) { var pItem uintptr var pTab uintptr var sz U64 Xsqlite3WhereExplainBloomFilter(tls, pParse, pWInfo, pLevel) addrCont = Xsqlite3VdbeMakeLabel(tls, pParse) iCur = (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) pItem = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 pTab = (*SrcItem)(unsafe.Pointer(pItem)).FpTab sz = Xsqlite3LogEstToInt(tls, (*Table)(unsafe.Pointer(pTab)).FnRowLogEst) if sz < uint64(10000) { sz = uint64(10000) } else if sz > uint64(10000000) { sz = uint64(10000000) } Xsqlite3VdbeAddOp2(tls, v, OP_Blob, int32(sz), (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter) addrTop = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, iCur) pWCEnd = (*WhereInfo)(unsafe.Pointer(pWInfo)).FsWC.Fa + uintptr((*WhereInfo)(unsafe.Pointer(pWInfo)).FsWC.FnTerm)*56 for pTerm = (*WhereInfo)(unsafe.Pointer(pWInfo)).FsWC.Fa; pTerm < pWCEnd; pTerm += 56 { var pExpr uintptr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VIRTUAL == 0 && Xsqlite3ExprIsTableConstraint(tls, pExpr, pItem) != 0 { Xsqlite3ExprIfFalse(tls, pParse, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr, addrCont, SQLITE_JUMPIFNULL) } } if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IPK) != 0 { var r1 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iCur, r1) Xsqlite3VdbeAddOp4Int(tls, v, OP_FilterAdd, (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter, 0, r1, 1) Xsqlite3ReleaseTempReg(tls, pParse, r1) } else { var pIdx uintptr = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) var n int32 = int32(*(*U16)(unsafe.Pointer(pLoop + 24))) var r1 int32 = Xsqlite3GetTempRange(tls, pParse, n) var jj int32 for jj = 0; jj < n; jj++ { Xsqlite3ExprCodeLoadIndexColumn(tls, pParse, pIdx, iCur, jj, r1+jj) } Xsqlite3VdbeAddOp4Int(tls, v, OP_FilterAdd, (*WhereLevel)(unsafe.Pointer(pLevel)).FregFilter, 0, r1, n) Xsqlite3ReleaseTempRange(tls, pParse, r1, n) } Xsqlite3VdbeResolveLabel(tls, v, addrCont) Xsqlite3VdbeAddOp2(tls, v, OP_Next, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur, addrTop+1) Xsqlite3VdbeJumpHere(tls, v, addrTop) *(*U32)(unsafe.Pointer(pLoop + 56)) &= libc.Uint32FromInt32(libc.CplInt32(WHERE_BLOOMFILTER)) if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FdbOptFlags&U32(SQLITE_BloomPulldown) != U32(0) { break } for libc.PreIncInt32(&iLevel, 1) < int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) { var pTabItem uintptr pLevel = pWInfo + 856 + uintptr(iLevel)*104 pTabItem = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 if int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ) != 0 { continue } pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop if pLoop == uintptr(0) { continue } if (*WhereLoop)(unsafe.Pointer(pLoop)).Fprereq¬Ready != 0 { continue } if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_BLOOMFILTER|WHERE_COLUMN_IN) == U32(WHERE_BLOOMFILTER) { break } } } Xsqlite3VdbeJumpHere(tls, v, addrOnce) (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr = saved_pIdxEpr } func allocateIndexInfo(tls *libc.TLS, pWInfo uintptr, pWC uintptr, mUnusable Bitmask, pSrc uintptr, pmNoOmit uintptr) uintptr { var i int32 var j int32 var nTerm int32 var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var pIdxCons uintptr var pIdxOrderBy uintptr var pUsage uintptr var pHidden uintptr var pTerm uintptr var nOrderBy int32 var pIdxInfo uintptr var mNoOmit U16 = U16(0) var pTab uintptr var eDistinct int32 = 0 var pOrderBy uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy pTab = (*SrcItem)(unsafe.Pointer(pSrc)).FpTab i = libc.AssignInt32(&nTerm, 0) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa __1: if !(i < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm) { goto __3 } { *(*U16)(unsafe.Pointer(pTerm + 18)) &= libc.Uint16FromInt32(libc.CplInt32(TERM_OK)) if (*WhereTerm)(unsafe.Pointer(pTerm)).FleftCursor != (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor { goto __2 } if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight&mUnusable != 0 { goto __2 } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&libc.CplInt32(WO_EQUIV) == 0 { goto __2 } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VNULL != 0 { goto __2 } if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ|JT_RIGHT) != 0 && !(constraintCompatibleWithOuterJoin(tls, pTerm, pSrc) != 0) { goto __2 } nTerm++ *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_OK) } goto __2 __2: i++ pTerm += 56 goto __1 goto __3 __3: ; nOrderBy = 0 if pOrderBy != 0 { var n int32 = (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr for i = 0; i < n; i++ { var pExpr uintptr = (*ExprList_item)(unsafe.Pointer(pOrderBy + 8 + uintptr(i)*32)).FpExpr var pE2 uintptr if Xsqlite3ExprIsConstant(tls, pExpr) != 0 { continue } if int32((*ExprList_item)(unsafe.Pointer(pOrderBy+8+uintptr(i)*32)).Ffg.FsortFlags)&KEYINFO_ORDER_BIGNULL != 0 { break } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor { continue } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLLATE && int32((*Expr)(unsafe.Pointer(libc.AssignUintptr(&pE2, (*Expr)(unsafe.Pointer(pExpr)).FpLeft))).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pE2)).FiTable == (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor { var zColl uintptr (*Expr)(unsafe.Pointer(pExpr)).FiColumn = (*Expr)(unsafe.Pointer(pE2)).FiColumn if int32((*Expr)(unsafe.Pointer(pE2)).FiColumn) < 0 { continue } zColl = Xsqlite3ColumnColl(tls, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr((*Expr)(unsafe.Pointer(pE2)).FiColumn)*24) if zColl == uintptr(0) { zColl = uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) } if Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(pExpr + 8)), zColl) == 0 { continue } } break } if i == n { nOrderBy = n if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_DISTINCTBY != 0 { eDistinct = 2 + libc.Bool32(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_SORTBYGROUP != 0) } else if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_GROUPBY != 0 { eDistinct = 1 } } } pIdxInfo = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Sqlite3_index_info{}))+ (uint64(unsafe.Sizeof(sqlite3_index_constraint{}))+uint64(unsafe.Sizeof(sqlite3_index_constraint_usage{})))*uint64(nTerm)+ uint64(unsafe.Sizeof(sqlite3_index_orderby{}))*uint64(nOrderBy)+uint64(unsafe.Sizeof(HiddenIndexInfo1{}))+ uint64(unsafe.Sizeof(uintptr(0)))*uint64(nTerm)) if pIdxInfo == uintptr(0) { Xsqlite3ErrorMsg(tls, pParse, ts+1480, 0) return uintptr(0) } pHidden = pIdxInfo + 1*96 pIdxCons = pHidden + 32 + uintptr(nTerm)*8 pIdxOrderBy = pIdxCons + uintptr(nTerm)*12 pUsage = pIdxOrderBy + uintptr(nOrderBy)*8 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint = pIdxCons (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaOrderBy = pIdxOrderBy (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage = pUsage (*HiddenIndexInfo1)(unsafe.Pointer(pHidden)).FpWC = pWC (*HiddenIndexInfo1)(unsafe.Pointer(pHidden)).FpParse = pParse (*HiddenIndexInfo1)(unsafe.Pointer(pHidden)).FeDistinct = eDistinct (*HiddenIndexInfo1)(unsafe.Pointer(pHidden)).FmIn = U32(0) i = libc.AssignInt32(&j, 0) pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa __4: if !(i < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm) { goto __6 } { var op U16 if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_OK == 0 { goto __5 } (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons + uintptr(j)*12)).FiColumn = *(*int32)(unsafe.Pointer(pTerm + 32)) (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons + uintptr(j)*12)).FiTermOffset = i op = U16(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator) & WO_ALL) if int32(op) == WO_IN { if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_SLICE == 0 { *(*U32)(unsafe.Pointer(pHidden + 20)) |= func() uint32 { if j <= 31 { return uint32(1) << j } return uint32(0) }() } op = U16(WO_EQ) } if int32(op) == WO_AUX { (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons + uintptr(j)*12)).Fop = (*WhereTerm)(unsafe.Pointer(pTerm)).FeMatchOp } else if int32(op)&(WO_ISNULL|WO_IS) != 0 { if int32(op) == WO_ISNULL { (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons + uintptr(j)*12)).Fop = uint8(SQLITE_INDEX_CONSTRAINT_ISNULL) } else { (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons + uintptr(j)*12)).Fop = uint8(SQLITE_INDEX_CONSTRAINT_IS) } } else { (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons + uintptr(j)*12)).Fop = U8(op) if int32(op)&(int32(WO_EQ)<<(TK_LT-TK_EQ)|int32(WO_EQ)<<(TK_LE-TK_EQ)|int32(WO_EQ)<<(TK_GT-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)) != 0 && Xsqlite3ExprIsVector(tls, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpRight) != 0 { if j < 16 { mNoOmit = U16(int32(mNoOmit) | int32(1)<>0) == SQLITE_IDXTYPE_PRIMARYKEY { nField = int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) } else { nField = int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) } nField = func() int32 { if int32((*UnpackedRecord)(unsafe.Pointer(pRec)).FnField) < nField { return int32((*UnpackedRecord)(unsafe.Pointer(pRec)).FnField) } return nField }() iCol = 0 iSample = (*Index)(unsafe.Pointer(pIdx)).FnSample * nField for __ccgo := true; __ccgo; __ccgo = res != 0 && iMin < iSample { var iSamp int32 var n int32 iTest = (iMin + iSample) / 2 iSamp = iTest / nField if iSamp > 0 { for n = iTest%nField + 1; n < nField; n++ { if *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(iSamp-1)*40)).FanLt + uintptr(n-1)*8)) != *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(iSamp)*40)).FanLt + uintptr(n-1)*8)) { break } } } else { n = iTest + 1 } (*UnpackedRecord)(unsafe.Pointer(pRec)).FnField = U16(n) res = Xsqlite3VdbeRecordCompare(tls, (*IndexSample)(unsafe.Pointer(aSample+uintptr(iSamp)*40)).Fn, (*IndexSample)(unsafe.Pointer(aSample+uintptr(iSamp)*40)).Fp, pRec) if res < 0 { iLower = *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(iSamp)*40)).FanLt + uintptr(n-1)*8)) + *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(iSamp)*40)).FanEq + uintptr(n-1)*8)) iMin = iTest + 1 } else if res == 0 && n < nField { iLower = *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(iSamp)*40)).FanLt + uintptr(n-1)*8)) iMin = iTest + 1 res = -1 } else { iSample = iTest iCol = n - 1 } } i = iSample / nField if res == 0 { *(*TRowcnt)(unsafe.Pointer(aStat)) = *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(i)*40)).FanLt + uintptr(iCol)*8)) *(*TRowcnt)(unsafe.Pointer(aStat + 1*8)) = *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(i)*40)).FanEq + uintptr(iCol)*8)) } else { var iUpper TRowcnt var iGap TRowcnt if i >= (*Index)(unsafe.Pointer(pIdx)).FnSample { iUpper = (*Index)(unsafe.Pointer(pIdx)).FnRowEst0 } else { iUpper = *(*TRowcnt)(unsafe.Pointer((*IndexSample)(unsafe.Pointer(aSample+uintptr(i)*40)).FanLt + uintptr(iCol)*8)) } if iLower >= iUpper { iGap = uint64(0) } else { iGap = iUpper - iLower } if roundUp != 0 { iGap = iGap * uint64(2) / uint64(3) } else { iGap = iGap / uint64(3) } *(*TRowcnt)(unsafe.Pointer(aStat)) = iLower + iGap *(*TRowcnt)(unsafe.Pointer(aStat + 1*8)) = *(*TRowcnt)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaAvgEq + uintptr(nField-1)*8)) } (*UnpackedRecord)(unsafe.Pointer(pRec)).FnField = U16(nField) return i } func whereRangeAdjust(tls *libc.TLS, pTerm uintptr, nNew LogEst) LogEst { var nRet LogEst = nNew if pTerm != 0 { if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb) <= 0 { nRet = LogEst(int32(nRet) + int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb)) } else if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VNULL == 0 { nRet = int16(int32(nRet) - 20) } } return nRet } // Return the affinity for a single column of an index. func Xsqlite3IndexColumnAffinity(tls *libc.TLS, db uintptr, pIdx uintptr, iCol int32) int8 { if !(int32((*Index)(unsafe.Pointer(pIdx)).FzColAff) != 0) { if Xsqlite3IndexAffinityStr(tls, db, pIdx) == uintptr(0) { return int8(SQLITE_AFF_BLOB) } } return *(*int8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FzColAff + uintptr(iCol))) } func whereRangeSkipScanEst(tls *libc.TLS, pParse uintptr, pLower uintptr, pUpper uintptr, pLoop uintptr, pbDone uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var p uintptr = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) var nEq int32 = int32(*(*U16)(unsafe.Pointer(pLoop + 24))) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var nLower int32 = -1 var nUpper int32 = (*Index)(unsafe.Pointer(p)).FnSample + 1 var rc int32 = SQLITE_OK var aff U8 = U8(Xsqlite3IndexColumnAffinity(tls, db, p, nEq)) var pColl uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) pColl = Xsqlite3LocateCollSeq(tls, pParse, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(p)).FazColl + uintptr(nEq)*8))) if pLower != 0 { rc = Xsqlite3Stat4ValueFromExpr(tls, pParse, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pLower)).FpExpr)).FpRight, aff, bp) nLower = 0 } if pUpper != 0 && rc == SQLITE_OK { rc = Xsqlite3Stat4ValueFromExpr(tls, pParse, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pUpper)).FpExpr)).FpRight, aff, bp+8) if *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { nUpper = 0 } else { nUpper = (*Index)(unsafe.Pointer(p)).FnSample } } if *(*uintptr)(unsafe.Pointer(bp)) != 0 || *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { var i int32 var nDiff int32 for i = 0; rc == SQLITE_OK && i < (*Index)(unsafe.Pointer(p)).FnSample; i++ { rc = Xsqlite3Stat4Column(tls, db, (*IndexSample)(unsafe.Pointer((*Index)(unsafe.Pointer(p)).FaSample+uintptr(i)*40)).Fp, (*IndexSample)(unsafe.Pointer((*Index)(unsafe.Pointer(p)).FaSample+uintptr(i)*40)).Fn, nEq, bp+16) if rc == SQLITE_OK && *(*uintptr)(unsafe.Pointer(bp)) != 0 { var res int32 = Xsqlite3MemCompare(tls, *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 16)), pColl) if res >= 0 { nLower++ } } if rc == SQLITE_OK && *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { var res int32 = Xsqlite3MemCompare(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), *(*uintptr)(unsafe.Pointer(bp + 16)), pColl) if res >= 0 { nUpper++ } } } nDiff = nUpper - nLower if nDiff <= 0 { nDiff = 1 } if nDiff != 1 || pUpper == uintptr(0) || pLower == uintptr(0) { var nAdjust int32 = int32(Xsqlite3LogEst(tls, uint64((*Index)(unsafe.Pointer(p)).FnSample))) - int32(Xsqlite3LogEst(tls, uint64(nDiff))) *(*LogEst)(unsafe.Pointer(pLoop + 22)) -= LogEst(nAdjust) *(*int32)(unsafe.Pointer(pbDone)) = 1 } } else { } Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) return rc } func whereRangeScanEst(tls *libc.TLS, pParse uintptr, pBuilder uintptr, pLower uintptr, pUpper uintptr, pLoop uintptr) int32 { bp := tls.Alloc(36) defer tls.Free(36) var rc int32 = SQLITE_OK var nOut int32 = int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnOut) var nNew LogEst var p uintptr = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) var nEq int32 = int32(*(*U16)(unsafe.Pointer(pLoop + 24))) if (*Index)(unsafe.Pointer(p)).FnSample > 0 && nEq < (*Index)(unsafe.Pointer(p)).FnSampleCol && (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FdbOptFlags&U32(SQLITE_Stat4) == U32(0) { if nEq == (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid { *(*uintptr)(unsafe.Pointer(bp + 16)) = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpRec var nBtm int32 = int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 2))) var nTop int32 = int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 4))) var iLower TRowcnt var iUpper TRowcnt var iLwrIdx int32 = -2 var iUprIdx int32 = -1 if *(*uintptr)(unsafe.Pointer(bp + 16)) != 0 { (*UnpackedRecord)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FnField = U16((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid) } if nEq == 0 { iLower = uint64(0) iUpper = (*Index)(unsafe.Pointer(p)).FnRowEst0 } else { whereKeyStats(tls, pParse, p, *(*uintptr)(unsafe.Pointer(bp + 16)), 0, bp) iLower = *(*TRowcnt)(unsafe.Pointer(bp)) iUpper = *(*TRowcnt)(unsafe.Pointer(bp)) + *(*TRowcnt)(unsafe.Pointer(bp + 1*8)) } if *(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(p)).FaSortOrder + uintptr(nEq))) != 0 { { var t uintptr = pLower pLower = pUpper pUpper = t } { var t int32 = nBtm nBtm = nTop nTop = t } } if pLower != 0 { var pExpr uintptr = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pLower)).FpExpr)).FpRight rc = Xsqlite3Stat4ProbeSetValue(tls, pParse, p, bp+16, pExpr, nBtm, nEq, bp+24) if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 24)) != 0 { var iNew TRowcnt var mask U16 = U16(int32(WO_EQ)<<(TK_GT-TK_EQ) | int32(WO_EQ)<<(TK_LE-TK_EQ)) if Xsqlite3ExprVectorSize(tls, pExpr) > *(*int32)(unsafe.Pointer(bp + 24)) { mask = U16(int32(WO_EQ)<<(TK_LE-TK_EQ) | int32(WO_EQ)<<(TK_LT-TK_EQ)) } iLwrIdx = whereKeyStats(tls, pParse, p, *(*uintptr)(unsafe.Pointer(bp + 16)), 0, bp) iNew = *(*TRowcnt)(unsafe.Pointer(bp)) + func() uint64 { if int32((*WhereTerm)(unsafe.Pointer(pLower)).FeOperator)&int32(mask) != 0 { return *(*TRowcnt)(unsafe.Pointer(bp + 1*8)) } return uint64(0) }() if iNew > iLower { iLower = iNew } nOut-- pLower = uintptr(0) } } if pUpper != 0 { var pExpr uintptr = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pUpper)).FpExpr)).FpRight rc = Xsqlite3Stat4ProbeSetValue(tls, pParse, p, bp+16, pExpr, nTop, nEq, bp+28) if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 28)) != 0 { var iNew TRowcnt var mask U16 = U16(int32(WO_EQ)<<(TK_GT-TK_EQ) | int32(WO_EQ)<<(TK_LE-TK_EQ)) if Xsqlite3ExprVectorSize(tls, pExpr) > *(*int32)(unsafe.Pointer(bp + 28)) { mask = U16(int32(WO_EQ)<<(TK_LE-TK_EQ) | int32(WO_EQ)<<(TK_LT-TK_EQ)) } iUprIdx = whereKeyStats(tls, pParse, p, *(*uintptr)(unsafe.Pointer(bp + 16)), 1, bp) iNew = *(*TRowcnt)(unsafe.Pointer(bp)) + func() uint64 { if int32((*WhereTerm)(unsafe.Pointer(pUpper)).FeOperator)&int32(mask) != 0 { return *(*TRowcnt)(unsafe.Pointer(bp + 1*8)) } return uint64(0) }() if iNew < iUpper { iUpper = iNew } nOut-- pUpper = uintptr(0) } } (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpRec = *(*uintptr)(unsafe.Pointer(bp + 16)) if rc == SQLITE_OK { if iUpper > iLower { nNew = Xsqlite3LogEst(tls, iUpper-iLower) if iLwrIdx == iUprIdx { nNew = int16(int32(nNew) - 20) } } else { nNew = int16(10) } if int32(nNew) < nOut { nOut = int32(nNew) } } } else { *(*int32)(unsafe.Pointer(bp + 32)) = 0 rc = whereRangeSkipScanEst(tls, pParse, pLower, pUpper, pLoop, bp+32) if *(*int32)(unsafe.Pointer(bp + 32)) != 0 { return rc } } } nNew = whereRangeAdjust(tls, pLower, int16(nOut)) nNew = whereRangeAdjust(tls, pUpper, nNew) if pLower != 0 && int32((*WhereTerm)(unsafe.Pointer(pLower)).FtruthProb) > 0 && pUpper != 0 && int32((*WhereTerm)(unsafe.Pointer(pUpper)).FtruthProb) > 0 { nNew = int16(int32(nNew) - 20) } nOut = nOut - (libc.Bool32(pLower != uintptr(0)) + libc.Bool32(pUpper != uintptr(0))) if int32(nNew) < 10 { nNew = int16(10) } if int32(nNew) < nOut { nOut = int32(nNew) } (*WhereLoop)(unsafe.Pointer(pLoop)).FnOut = LogEst(nOut) return rc } func whereEqualScanEst(tls *libc.TLS, pParse uintptr, pBuilder uintptr, pExpr uintptr, pnRow uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var p uintptr = *(*uintptr)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew + 24 + 8)) var nEq int32 = int32(*(*U16)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew + 24))) *(*uintptr)(unsafe.Pointer(bp)) = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpRec var rc int32 if (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid < nEq-1 { return SQLITE_NOTFOUND } if nEq >= int32((*Index)(unsafe.Pointer(p)).FnColumn) { *(*TRowcnt)(unsafe.Pointer(pnRow)) = uint64(1) return SQLITE_OK } rc = Xsqlite3Stat4ProbeSetValue(tls, pParse, p, bp, pExpr, 1, nEq-1, bp+8) (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpRec = *(*uintptr)(unsafe.Pointer(bp)) if rc != SQLITE_OK { return rc } if *(*int32)(unsafe.Pointer(bp + 8)) == 0 { return SQLITE_NOTFOUND } (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid = nEq whereKeyStats(tls, pParse, p, *(*uintptr)(unsafe.Pointer(bp)), 0, bp+16) *(*TRowcnt)(unsafe.Pointer(pnRow)) = *(*TRowcnt)(unsafe.Pointer(bp + 16 + 1*8)) return rc } func whereInScanEst(tls *libc.TLS, pParse uintptr, pBuilder uintptr, pList uintptr, pnRow uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr = *(*uintptr)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew + 24 + 8)) var nRow0 I64 = I64(Xsqlite3LogEstToInt(tls, *(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(p)).FaiRowLogEst)))) var nRecValid int32 = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid var rc int32 = SQLITE_OK var nRowEst TRowcnt = uint64(0) var i int32 for i = 0; rc == SQLITE_OK && i < (*ExprList)(unsafe.Pointer(pList)).FnExpr; i++ { *(*TRowcnt)(unsafe.Pointer(bp)) = TRowcnt(nRow0) rc = whereEqualScanEst(tls, pParse, pBuilder, (*ExprList_item)(unsafe.Pointer(pList+8+uintptr(i)*32)).FpExpr, bp) nRowEst = nRowEst + *(*TRowcnt)(unsafe.Pointer(bp)) (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid = nRecValid } if rc == SQLITE_OK { if nRowEst > TRowcnt(nRow0) { nRowEst = TRowcnt(nRow0) } *(*TRowcnt)(unsafe.Pointer(pnRow)) = nRowEst } return rc } func whereLoopInit(tls *libc.TLS, p uintptr) { (*WhereLoop)(unsafe.Pointer(p)).FaLTerm = p + 88 (*WhereLoop)(unsafe.Pointer(p)).FnLTerm = U16(0) (*WhereLoop)(unsafe.Pointer(p)).FnLSlot = U16(int32(uint64(unsafe.Sizeof([3]uintptr{})) / uint64(unsafe.Sizeof(uintptr(0))))) (*WhereLoop)(unsafe.Pointer(p)).FwsFlags = U32(0) } func whereLoopClearUnion(tls *libc.TLS, db uintptr, p uintptr) { if (*WhereLoop)(unsafe.Pointer(p)).FwsFlags&U32(WHERE_VIRTUALTABLE|WHERE_AUTO_INDEX) != 0 { if (*WhereLoop)(unsafe.Pointer(p)).FwsFlags&U32(WHERE_VIRTUALTABLE) != U32(0) && U32(int32(*(*uint8)(unsafe.Pointer(p + 24 + 4))&0x1>>0)) != 0 { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(p + 24 + 16))) libc.SetBitFieldPtr8Uint32(p+24+4, U32(0), 0, 0x1) *(*uintptr)(unsafe.Pointer(p + 24 + 16)) = uintptr(0) } else if (*WhereLoop)(unsafe.Pointer(p)).FwsFlags&U32(WHERE_AUTO_INDEX) != U32(0) && *(*uintptr)(unsafe.Pointer(p + 24 + 8)) != uintptr(0) { Xsqlite3DbFree(tls, db, (*Index)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 24 + 8)))).FzColAff) Xsqlite3DbFreeNN(tls, db, *(*uintptr)(unsafe.Pointer(p + 24 + 8))) *(*uintptr)(unsafe.Pointer(p + 24 + 8)) = uintptr(0) } } } func whereLoopClear(tls *libc.TLS, db uintptr, p uintptr) { if (*WhereLoop)(unsafe.Pointer(p)).FaLTerm != p+88 { Xsqlite3DbFreeNN(tls, db, (*WhereLoop)(unsafe.Pointer(p)).FaLTerm) (*WhereLoop)(unsafe.Pointer(p)).FaLTerm = p + 88 (*WhereLoop)(unsafe.Pointer(p)).FnLSlot = U16(int32(uint64(unsafe.Sizeof([3]uintptr{})) / uint64(unsafe.Sizeof(uintptr(0))))) } whereLoopClearUnion(tls, db, p) (*WhereLoop)(unsafe.Pointer(p)).FnLTerm = U16(0) (*WhereLoop)(unsafe.Pointer(p)).FwsFlags = U32(0) } func whereLoopResize(tls *libc.TLS, db uintptr, p uintptr, n int32) int32 { var paNew uintptr if int32((*WhereLoop)(unsafe.Pointer(p)).FnLSlot) >= n { return SQLITE_OK } n = (n + 7) & libc.CplInt32(7) paNew = Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(uintptr(0)))*uint64(n)) if paNew == uintptr(0) { return SQLITE_NOMEM } libc.Xmemcpy(tls, paNew, (*WhereLoop)(unsafe.Pointer(p)).FaLTerm, uint64(unsafe.Sizeof(uintptr(0)))*uint64((*WhereLoop)(unsafe.Pointer(p)).FnLSlot)) if (*WhereLoop)(unsafe.Pointer(p)).FaLTerm != p+88 { Xsqlite3DbFreeNN(tls, db, (*WhereLoop)(unsafe.Pointer(p)).FaLTerm) } (*WhereLoop)(unsafe.Pointer(p)).FaLTerm = paNew (*WhereLoop)(unsafe.Pointer(p)).FnLSlot = U16(n) return SQLITE_OK } func whereLoopXfer(tls *libc.TLS, db uintptr, pTo uintptr, pFrom uintptr) int32 { whereLoopClearUnion(tls, db, pTo) if int32((*WhereLoop)(unsafe.Pointer(pFrom)).FnLTerm) > int32((*WhereLoop)(unsafe.Pointer(pTo)).FnLSlot) && whereLoopResize(tls, db, pTo, int32((*WhereLoop)(unsafe.Pointer(pFrom)).FnLTerm)) != 0 { libc.Xmemset(tls, pTo, 0, uint64(uintptr(0)+64)) return SQLITE_NOMEM } libc.Xmemcpy(tls, pTo, pFrom, uint64(uintptr(0)+64)) libc.Xmemcpy(tls, (*WhereLoop)(unsafe.Pointer(pTo)).FaLTerm, (*WhereLoop)(unsafe.Pointer(pFrom)).FaLTerm, uint64((*WhereLoop)(unsafe.Pointer(pTo)).FnLTerm)*uint64(unsafe.Sizeof(uintptr(0)))) if (*WhereLoop)(unsafe.Pointer(pFrom)).FwsFlags&U32(WHERE_VIRTUALTABLE) != 0 { libc.SetBitFieldPtr8Uint32(pFrom+24+4, U32(0), 0, 0x1) } else if (*WhereLoop)(unsafe.Pointer(pFrom)).FwsFlags&U32(WHERE_AUTO_INDEX) != U32(0) { *(*uintptr)(unsafe.Pointer(pFrom + 24 + 8)) = uintptr(0) } return SQLITE_OK } func whereLoopDelete(tls *libc.TLS, db uintptr, p uintptr) { whereLoopClear(tls, db, p) Xsqlite3DbNNFreeNN(tls, db, p) } func whereInfoFree(tls *libc.TLS, db uintptr, pWInfo uintptr) { Xsqlite3WhereClauseClear(tls, pWInfo+104) for (*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops != 0 { var p uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops (*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops = (*WhereLoop)(unsafe.Pointer(p)).FpNextLoop whereLoopDelete(tls, db, p) } for (*WhereInfo)(unsafe.Pointer(pWInfo)).FpMemToFree != 0 { var pNext uintptr = (*WhereMemBlock)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpMemToFree)).FpNext Xsqlite3DbNNFreeNN(tls, db, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpMemToFree) (*WhereInfo)(unsafe.Pointer(pWInfo)).FpMemToFree = pNext } Xsqlite3DbNNFreeNN(tls, db, pWInfo) } func whereLoopCheaperProperSubset(tls *libc.TLS, pX uintptr, pY uintptr) int32 { var i int32 var j int32 if int32((*WhereLoop)(unsafe.Pointer(pX)).FnLTerm)-int32((*WhereLoop)(unsafe.Pointer(pX)).FnSkip) >= int32((*WhereLoop)(unsafe.Pointer(pY)).FnLTerm)-int32((*WhereLoop)(unsafe.Pointer(pY)).FnSkip) { return 0 } if int32((*WhereLoop)(unsafe.Pointer(pX)).FrRun) > int32((*WhereLoop)(unsafe.Pointer(pY)).FrRun) && int32((*WhereLoop)(unsafe.Pointer(pX)).FnOut) > int32((*WhereLoop)(unsafe.Pointer(pY)).FnOut) { return 0 } if int32((*WhereLoop)(unsafe.Pointer(pY)).FnSkip) > int32((*WhereLoop)(unsafe.Pointer(pX)).FnSkip) { return 0 } for i = int32((*WhereLoop)(unsafe.Pointer(pX)).FnLTerm) - 1; i >= 0; i-- { if *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pX)).FaLTerm + uintptr(i)*8)) == uintptr(0) { continue } for j = int32((*WhereLoop)(unsafe.Pointer(pY)).FnLTerm) - 1; j >= 0; j-- { if *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pY)).FaLTerm + uintptr(j)*8)) == *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pX)).FaLTerm + uintptr(i)*8)) { break } } if j < 0 { return 0 } } if (*WhereLoop)(unsafe.Pointer(pX)).FwsFlags&U32(WHERE_IDX_ONLY) != U32(0) && (*WhereLoop)(unsafe.Pointer(pY)).FwsFlags&U32(WHERE_IDX_ONLY) == U32(0) { return 0 } return 1 } func whereLoopAdjustCost(tls *libc.TLS, p uintptr, pTemplate uintptr) { if (*WhereLoop)(unsafe.Pointer(pTemplate)).FwsFlags&U32(WHERE_INDEXED) == U32(0) { return } for ; p != 0; p = (*WhereLoop)(unsafe.Pointer(p)).FpNextLoop { if int32((*WhereLoop)(unsafe.Pointer(p)).FiTab) != int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FiTab) { continue } if (*WhereLoop)(unsafe.Pointer(p)).FwsFlags&U32(WHERE_INDEXED) == U32(0) { continue } if whereLoopCheaperProperSubset(tls, p, pTemplate) != 0 { (*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun = func() int16 { if int32((*WhereLoop)(unsafe.Pointer(p)).FrRun) < int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun) { return (*WhereLoop)(unsafe.Pointer(p)).FrRun } return (*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun }() (*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut = func() int16 { if int32((*WhereLoop)(unsafe.Pointer(p)).FnOut)-1 < int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut) { return int16(int32((*WhereLoop)(unsafe.Pointer(p)).FnOut) - 1) } return (*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut }() } else if whereLoopCheaperProperSubset(tls, pTemplate, p) != 0 { (*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun = func() int16 { if int32((*WhereLoop)(unsafe.Pointer(p)).FrRun) > int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun) { return (*WhereLoop)(unsafe.Pointer(p)).FrRun } return (*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun }() (*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut = func() int16 { if int32((*WhereLoop)(unsafe.Pointer(p)).FnOut)+1 > int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut) { return int16(int32((*WhereLoop)(unsafe.Pointer(p)).FnOut) + 1) } return (*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut }() } } } func whereLoopFindLesser(tls *libc.TLS, ppPrev uintptr, pTemplate uintptr) uintptr { var p uintptr p = *(*uintptr)(unsafe.Pointer(ppPrev)) __1: if !(p != 0) { goto __3 } { if int32((*WhereLoop)(unsafe.Pointer(p)).FiTab) != int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FiTab) || int32((*WhereLoop)(unsafe.Pointer(p)).FiSortIdx) != int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FiSortIdx) { goto __2 } if (*WhereLoop)(unsafe.Pointer(p)).FwsFlags&U32(WHERE_AUTO_INDEX) != U32(0) && int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FnSkip) == 0 && (*WhereLoop)(unsafe.Pointer(pTemplate)).FwsFlags&U32(WHERE_INDEXED) != U32(0) && (*WhereLoop)(unsafe.Pointer(pTemplate)).FwsFlags&U32(WHERE_COLUMN_EQ) != U32(0) && (*WhereLoop)(unsafe.Pointer(p)).Fprereq&(*WhereLoop)(unsafe.Pointer(pTemplate)).Fprereq == (*WhereLoop)(unsafe.Pointer(pTemplate)).Fprereq { goto __3 } if (*WhereLoop)(unsafe.Pointer(p)).Fprereq&(*WhereLoop)(unsafe.Pointer(pTemplate)).Fprereq == (*WhereLoop)(unsafe.Pointer(p)).Fprereq && int32((*WhereLoop)(unsafe.Pointer(p)).FrSetup) <= int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FrSetup) && int32((*WhereLoop)(unsafe.Pointer(p)).FrRun) <= int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun) && int32((*WhereLoop)(unsafe.Pointer(p)).FnOut) <= int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut) { return uintptr(0) } if (*WhereLoop)(unsafe.Pointer(p)).Fprereq&(*WhereLoop)(unsafe.Pointer(pTemplate)).Fprereq == (*WhereLoop)(unsafe.Pointer(pTemplate)).Fprereq && int32((*WhereLoop)(unsafe.Pointer(p)).FrRun) >= int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun) && int32((*WhereLoop)(unsafe.Pointer(p)).FnOut) >= int32((*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut) { goto __3 } } goto __2 __2: ppPrev = p + 80 p = *(*uintptr)(unsafe.Pointer(ppPrev)) goto __1 goto __3 __3: ; return ppPrev } func whereLoopInsert(tls *libc.TLS, pBuilder uintptr, pTemplate uintptr) int32 { var ppPrev uintptr var p uintptr var pWInfo uintptr = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo var db uintptr = (*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse)).Fdb var rc int32 if (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FiPlanLimit == uint32(0) { if (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpOrSet != 0 { (*WhereOrSet)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpOrSet)).Fn = U16(0) } return SQLITE_DONE } (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FiPlanLimit-- whereLoopAdjustCost(tls, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops, pTemplate) if (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpOrSet != uintptr(0) { if (*WhereLoop)(unsafe.Pointer(pTemplate)).FnLTerm != 0 { whereOrInsert(tls, (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpOrSet, (*WhereLoop)(unsafe.Pointer(pTemplate)).Fprereq, (*WhereLoop)(unsafe.Pointer(pTemplate)).FrRun, (*WhereLoop)(unsafe.Pointer(pTemplate)).FnOut) } return SQLITE_OK } ppPrev = whereLoopFindLesser(tls, pWInfo+80, pTemplate) if ppPrev == uintptr(0) { return SQLITE_OK } else { p = *(*uintptr)(unsafe.Pointer(ppPrev)) } if p == uintptr(0) { *(*uintptr)(unsafe.Pointer(ppPrev)) = libc.AssignUintptr(&p, Xsqlite3DbMallocRawNN(tls, db, uint64(unsafe.Sizeof(WhereLoop{})))) if p == uintptr(0) { return SQLITE_NOMEM } whereLoopInit(tls, p) (*WhereLoop)(unsafe.Pointer(p)).FpNextLoop = uintptr(0) } else { var ppTail uintptr = p + 80 var pToDel uintptr for *(*uintptr)(unsafe.Pointer(ppTail)) != 0 { ppTail = whereLoopFindLesser(tls, ppTail, pTemplate) if ppTail == uintptr(0) { break } pToDel = *(*uintptr)(unsafe.Pointer(ppTail)) if pToDel == uintptr(0) { break } *(*uintptr)(unsafe.Pointer(ppTail)) = (*WhereLoop)(unsafe.Pointer(pToDel)).FpNextLoop whereLoopDelete(tls, db, pToDel) } } rc = whereLoopXfer(tls, db, p, pTemplate) if (*WhereLoop)(unsafe.Pointer(p)).FwsFlags&U32(WHERE_VIRTUALTABLE) == U32(0) { var pIndex uintptr = *(*uintptr)(unsafe.Pointer(p + 24 + 8)) if pIndex != 0 && int32(*(*uint16)(unsafe.Pointer(pIndex + 100))&0x3>>0) == SQLITE_IDXTYPE_IPK { *(*uintptr)(unsafe.Pointer(p + 24 + 8)) = uintptr(0) } } return rc } func whereLoopOutputAdjust(tls *libc.TLS, pWC uintptr, pLoop uintptr, nRow LogEst) { bp := tls.Alloc(4) defer tls.Free(4) var pTerm uintptr var pX uintptr var notAllowed Bitmask = ^((*WhereLoop)(unsafe.Pointer(pLoop)).Fprereq | (*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf) var i int32 var j int32 var iReduce LogEst = int16(0) i = (*WhereClause)(unsafe.Pointer(pWC)).FnBase pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa __1: if !(i > 0) { goto __3 } { if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll¬Allowed != uint64(0) { goto __2 } if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll&(*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf == uint64(0) { goto __2 } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VIRTUAL != 0 { goto __2 } for j = int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm) - 1; j >= 0; j-- { pX = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)) if pX == uintptr(0) { continue } if pX == pTerm { break } if (*WhereTerm)(unsafe.Pointer(pX)).FiParent >= 0 && (*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr((*WhereTerm)(unsafe.Pointer(pX)).FiParent)*56 == pTerm { break } } if j < 0 { Xsqlite3ProgressCheck(tls, (*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpParse) if (*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf == (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll { if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&0x3f != 0 || int32((*SrcItem)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpTabList+8+uintptr((*WhereLoop)(unsafe.Pointer(pLoop)).FiTab)*104)).Ffg.Fjointype)& (JT_LEFT|JT_LTORJ) == 0 { *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_SELFCULL) } } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb) <= 0 { *(*LogEst)(unsafe.Pointer(pLoop + 22)) += LogEst(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb)) } else { (*WhereLoop)(unsafe.Pointer(pLoop)).FnOut-- if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&(WO_EQ|WO_IS) != 0 && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_HIGHTRUTH == 0 { var pRight uintptr = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpRight *(*int32)(unsafe.Pointer(bp)) = 0 if Xsqlite3ExprIsInteger(tls, pRight, bp) != 0 && *(*int32)(unsafe.Pointer(bp)) >= -1 && *(*int32)(unsafe.Pointer(bp)) <= 1 { *(*int32)(unsafe.Pointer(bp)) = 10 } else { *(*int32)(unsafe.Pointer(bp)) = 20 } if int32(iReduce) < *(*int32)(unsafe.Pointer(bp)) { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_HEURTRUTH) iReduce = LogEst(*(*int32)(unsafe.Pointer(bp))) } } } } } goto __2 __2: i-- pTerm += 56 goto __1 goto __3 __3: ; if int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnOut) > int32(nRow)-int32(iReduce) { (*WhereLoop)(unsafe.Pointer(pLoop)).FnOut = LogEst(int32(nRow) - int32(iReduce)) } } func whereRangeVectorLen(tls *libc.TLS, pParse uintptr, iCur int32, pIdx uintptr, nEq int32, pTerm uintptr) int32 { var nCmp int32 = Xsqlite3ExprVectorSize(tls, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpLeft) var i int32 nCmp = func() int32 { if nCmp < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn)-nEq { return nCmp } return int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) - nEq }() for i = 1; i < nCmp; i++ { var aff int8 var idxaff int8 = int8(0) var pColl uintptr var pLhs uintptr var pRhs uintptr pLhs = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpLeft + 32)) + 8 + uintptr(i)*32)).FpExpr pRhs = (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpRight if (*Expr)(unsafe.Pointer(pRhs)).Fflags&U32(EP_xIsSelect) != U32(0) { pRhs = (*ExprList_item)(unsafe.Pointer((*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pRhs + 32)))).FpEList + 8 + uintptr(i)*32)).FpExpr } else { pRhs = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pRhs + 32)) + 8 + uintptr(i)*32)).FpExpr } if int32((*Expr)(unsafe.Pointer(pLhs)).Fop) != TK_COLUMN || (*Expr)(unsafe.Pointer(pLhs)).FiTable != iCur || int32((*Expr)(unsafe.Pointer(pLhs)).FiColumn) != int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i+nEq)*2))) || int32(*(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSortOrder + uintptr(i+nEq)))) != int32(*(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaSortOrder + uintptr(nEq)))) { break } aff = Xsqlite3CompareAffinity(tls, pRhs, Xsqlite3ExprAffinity(tls, pLhs)) idxaff = Xsqlite3TableColumnAffinity(tls, (*Index)(unsafe.Pointer(pIdx)).FpTable, int32((*Expr)(unsafe.Pointer(pLhs)).FiColumn)) if int32(aff) != int32(idxaff) { break } pColl = Xsqlite3BinaryCompareCollSeq(tls, pParse, pLhs, pRhs) if pColl == uintptr(0) { break } if Xsqlite3StrICmp(tls, (*CollSeq)(unsafe.Pointer(pColl)).FzName, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FazColl + uintptr(i+nEq)*8))) != 0 { break } } return i } func whereLoopAddBtreeIndex(tls *libc.TLS, pBuilder uintptr, pSrc uintptr, pProbe uintptr, nInMul LogEst) int32 { bp := tls.Alloc(120) defer tls.Free(120) var pWInfo uintptr = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pNew uintptr var pTerm uintptr var opMask int32 var saved_prereq Bitmask var saved_nLTerm U16 var saved_nEq U16 var saved_nBtm U16 var saved_nTop U16 var saved_nSkip U16 var saved_wsFlags U32 var saved_nOut LogEst var rc int32 = SQLITE_OK var rSize LogEst var rLogSize LogEst var pTop uintptr = uintptr(0) var pBtm uintptr = uintptr(0) pNew = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew if (*Parse)(unsafe.Pointer(pParse)).FnErr != 0 { return (*Parse)(unsafe.Pointer(pParse)).Frc } if (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags&U32(WHERE_BTM_LIMIT) != 0 { opMask = int32(WO_EQ)<<(TK_LT-TK_EQ) | int32(WO_EQ)<<(TK_LE-TK_EQ) } else { opMask = WO_EQ | WO_IN | int32(WO_EQ)<<(TK_GT-TK_EQ) | int32(WO_EQ)<<(TK_GE-TK_EQ) | int32(WO_EQ)<<(TK_LT-TK_EQ) | int32(WO_EQ)<<(TK_LE-TK_EQ) | WO_ISNULL | WO_IS } if uint32(int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x4>>2)) != 0 { opMask = opMask & libc.CplInt32(int32(WO_EQ)<<(TK_GT-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)|int32(WO_EQ)<<(TK_LT-TK_EQ)|int32(WO_EQ)<<(TK_LE-TK_EQ)) } saved_nEq = *(*U16)(unsafe.Pointer(pNew + 24)) saved_nBtm = *(*U16)(unsafe.Pointer(pNew + 24 + 2)) saved_nTop = *(*U16)(unsafe.Pointer(pNew + 24 + 4)) saved_nSkip = (*WhereLoop)(unsafe.Pointer(pNew)).FnSkip saved_nLTerm = (*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm saved_wsFlags = (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags saved_prereq = (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq saved_nOut = (*WhereLoop)(unsafe.Pointer(pNew)).FnOut pTerm = whereScanInit(tls, bp, (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWC, (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor, int32(saved_nEq), uint32(opMask), pProbe) (*WhereLoop)(unsafe.Pointer(pNew)).FrSetup = int16(0) rSize = *(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst)) rLogSize = estLog(tls, rSize) for ; rc == SQLITE_OK && pTerm != uintptr(0); pTerm = whereScanNext(tls, bp) { var eOp U16 = (*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator var rCostIdx LogEst var nOutUnadjusted LogEst var nIn int32 = 0 var nRecValid int32 = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid if (int32(eOp) == WO_ISNULL || int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VNULL != 0) && indexColumnNotNull(tls, pProbe, int32(saved_nEq)) != 0 { continue } if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight&(*WhereLoop)(unsafe.Pointer(pNew)).FmaskSelf != 0 { continue } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_LIKEOPT != 0 && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator) == int32(WO_EQ)<<(TK_LT-TK_EQ) { continue } if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ|JT_RIGHT) != 0 && !(constraintCompatibleWithOuterJoin(tls, pTerm, pSrc) != 0) { continue } if int32((*Index)(unsafe.Pointer(pProbe)).FonError) != OE_None && int32(saved_nEq) == int32((*Index)(unsafe.Pointer(pProbe)).FnKeyCol)-1 { *(*uint8)(unsafe.Pointer(pBuilder + 44)) |= uint8(SQLITE_BLDF1_UNIQUE) } else { *(*uint8)(unsafe.Pointer(pBuilder + 44)) |= uint8(SQLITE_BLDF1_INDEXED) } (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = saved_wsFlags *(*U16)(unsafe.Pointer(pNew + 24)) = saved_nEq *(*U16)(unsafe.Pointer(pNew + 24 + 2)) = saved_nBtm *(*U16)(unsafe.Pointer(pNew + 24 + 4)) = saved_nTop (*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm = saved_nLTerm if int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm) >= int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLSlot) && whereLoopResize(tls, db, pNew, int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm)+1) != 0 { break } *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(libc.PostIncUint16(&(*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm, 1))*8)) = pTerm (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq = (saved_prereq | (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight) & ^(*WhereLoop)(unsafe.Pointer(pNew)).FmaskSelf if int32(eOp)&WO_IN != 0 { var pExpr uintptr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_xIsSelect) != U32(0) { var i int32 nIn = 46 for i = 0; i < int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm)-1; i++ { if *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(i)*8)) != 0 && (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(i)*8)))).FpExpr == pExpr { nIn = 0 } } } else if *(*uintptr)(unsafe.Pointer(pExpr + 32)) != 0 && (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FnExpr != 0 { nIn = int32(Xsqlite3LogEst(tls, uint64((*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pExpr + 32)))).FnExpr))) } if uint32(int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x80>>7)) != 0 && int32(rLogSize) >= 10 { var M LogEst var logK LogEst var x LogEst M = *(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst + uintptr(saved_nEq)*2)) logK = estLog(tls, int16(nIn)) x = LogEst(int32(M) + int32(logK) + 10 - (nIn + int32(rLogSize))) if int32(x) >= 0 { } else if int32(nInMul) < 2 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_SeekScan) == U32(0) { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_IN_SEEKSCAN) } else { continue } } *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_COLUMN_IN) } else if int32(eOp)&(WO_EQ|WO_IS) != 0 { var iCol int32 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiColumn + uintptr(saved_nEq)*2))) *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_COLUMN_EQ) if iCol == -1 || iCol >= 0 && int32(nInMul) == 0 && int32(saved_nEq) == int32((*Index)(unsafe.Pointer(pProbe)).FnKeyCol)-1 { if iCol == -1 || uint32(int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x8>>3)) != 0 || int32((*Index)(unsafe.Pointer(pProbe)).FnKeyCol) == 1 && (*Index)(unsafe.Pointer(pProbe)).FonError != 0 && int32(eOp) == WO_EQ { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_ONEROW) } else { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_UNQ_WANTED) } } if int32((*WhereScan)(unsafe.Pointer(bp)).FiEquiv) > 1 { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_TRANSCONS) } } else if int32(eOp)&WO_ISNULL != 0 { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_COLUMN_NULL) } else { var nVecLen int32 = whereRangeVectorLen(tls, pParse, (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor, pProbe, int32(saved_nEq), pTerm) if int32(eOp)&(int32(WO_EQ)<<(TK_GT-TK_EQ)|int32(WO_EQ)<<(TK_GE-TK_EQ)) != 0 { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_COLUMN_RANGE | WHERE_BTM_LIMIT) *(*U16)(unsafe.Pointer(pNew + 24 + 2)) = U16(nVecLen) pBtm = pTerm pTop = uintptr(0) if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_LIKEOPT != 0 { pTop = pTerm + 1*56 if whereLoopResize(tls, db, pNew, int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm)+1) != 0 { break } *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(libc.PostIncUint16(&(*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm, 1))*8)) = pTop *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_TOP_LIMIT) *(*U16)(unsafe.Pointer(pNew + 24 + 4)) = U16(1) } } else { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_COLUMN_RANGE | WHERE_TOP_LIMIT) *(*U16)(unsafe.Pointer(pNew + 24 + 4)) = U16(nVecLen) pTop = pTerm if (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags&U32(WHERE_BTM_LIMIT) != U32(0) { pBtm = *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm)-2)*8)) } else { pBtm = uintptr(0) } } } if (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags&U32(WHERE_COLUMN_RANGE) != 0 { whereRangeScanEst(tls, pParse, pBuilder, pBtm, pTop, pNew) } else { var nEq int32 = int32(libc.PreIncUint16(&*(*U16)(unsafe.Pointer(pNew + 24)), 1)) if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb) <= 0 && int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiColumn + uintptr(saved_nEq)*2))) >= 0 { *(*LogEst)(unsafe.Pointer(pNew + 22)) += LogEst(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb)) *(*LogEst)(unsafe.Pointer(pNew + 22)) -= LogEst(nIn) } else { *(*TRowcnt)(unsafe.Pointer(bp + 112)) = uint64(0) if int32(nInMul) == 0 && (*Index)(unsafe.Pointer(pProbe)).FnSample != 0 && int32(*(*U16)(unsafe.Pointer(pNew + 24))) <= (*Index)(unsafe.Pointer(pProbe)).FnSampleCol && (int32(eOp)&WO_IN == 0 || (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_xIsSelect) == U32(0)) && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_Stat4) == U32(0) { var pExpr uintptr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if int32(eOp)&(WO_EQ|WO_ISNULL|WO_IS) != 0 { rc = whereEqualScanEst(tls, pParse, pBuilder, (*Expr)(unsafe.Pointer(pExpr)).FpRight, bp+112) } else { rc = whereInScanEst(tls, pParse, pBuilder, *(*uintptr)(unsafe.Pointer(pExpr + 32)), bp+112) } if rc == SQLITE_NOTFOUND { rc = SQLITE_OK } if rc != SQLITE_OK { break } if *(*TRowcnt)(unsafe.Pointer(bp + 112)) != 0 { (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = Xsqlite3LogEst(tls, *(*TRowcnt)(unsafe.Pointer(bp + 112))) if nEq == 1 && int32((*WhereLoop)(unsafe.Pointer(pNew)).FnOut)+10 > int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst))) { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_HIGHTRUTH) if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_HEURTRUTH != 0 { *(*uint8)(unsafe.Pointer(pBuilder + 45)) |= uint8(SQLITE_BLDF2_2NDPASS) } } if int32((*WhereLoop)(unsafe.Pointer(pNew)).FnOut) > int32(saved_nOut) { (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = saved_nOut } *(*LogEst)(unsafe.Pointer(pNew + 22)) -= LogEst(nIn) } } if *(*TRowcnt)(unsafe.Pointer(bp + 112)) == uint64(0) { *(*LogEst)(unsafe.Pointer(pNew + 22)) += LogEst(int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst + uintptr(nEq)*2))) - int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst + uintptr(nEq-1)*2)))) if int32(eOp)&WO_ISNULL != 0 { *(*LogEst)(unsafe.Pointer(pNew + 22)) += int16(10) } } } } if int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x3>>0) == SQLITE_IDXTYPE_IPK { rCostIdx = LogEst(int32((*WhereLoop)(unsafe.Pointer(pNew)).FnOut) + 16) } else { rCostIdx = LogEst(int32((*WhereLoop)(unsafe.Pointer(pNew)).FnOut) + 1 + 15*int32((*Index)(unsafe.Pointer(pProbe)).FszIdxRow)/int32((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pSrc)).FpTab)).FszTabRow)) } (*WhereLoop)(unsafe.Pointer(pNew)).FrRun = Xsqlite3LogEstAdd(tls, rLogSize, rCostIdx) if (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags&U32(WHERE_IDX_ONLY|WHERE_IPK|WHERE_EXPRIDX) == U32(0) { (*WhereLoop)(unsafe.Pointer(pNew)).FrRun = Xsqlite3LogEstAdd(tls, (*WhereLoop)(unsafe.Pointer(pNew)).FrRun, int16(int32((*WhereLoop)(unsafe.Pointer(pNew)).FnOut)+16)) } nOutUnadjusted = (*WhereLoop)(unsafe.Pointer(pNew)).FnOut *(*LogEst)(unsafe.Pointer(pNew + 20)) += LogEst(int32(nInMul) + nIn) *(*LogEst)(unsafe.Pointer(pNew + 22)) += LogEst(int32(nInMul) + nIn) whereLoopOutputAdjust(tls, (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWC, pNew, rSize) rc = whereLoopInsert(tls, pBuilder, pNew) if (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags&U32(WHERE_COLUMN_RANGE) != 0 { (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = saved_nOut } else { (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = nOutUnadjusted } if (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags&U32(WHERE_TOP_LIMIT) == U32(0) && int32(*(*U16)(unsafe.Pointer(pNew + 24))) < int32((*Index)(unsafe.Pointer(pProbe)).FnColumn) && (int32(*(*U16)(unsafe.Pointer(pNew + 24))) < int32((*Index)(unsafe.Pointer(pProbe)).FnKeyCol) || int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x3>>0) != SQLITE_IDXTYPE_PRIMARYKEY) { if int32(*(*U16)(unsafe.Pointer(pNew + 24))) > 3 { Xsqlite3ProgressCheck(tls, pParse) } whereLoopAddBtreeIndex(tls, pBuilder, pSrc, pProbe, int16(int32(nInMul)+nIn)) } (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = saved_nOut (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid = nRecValid } (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq = saved_prereq *(*U16)(unsafe.Pointer(pNew + 24)) = saved_nEq *(*U16)(unsafe.Pointer(pNew + 24 + 2)) = saved_nBtm *(*U16)(unsafe.Pointer(pNew + 24 + 4)) = saved_nTop (*WhereLoop)(unsafe.Pointer(pNew)).FnSkip = saved_nSkip (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = saved_wsFlags (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = saved_nOut (*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm = saved_nLTerm if int32(saved_nEq) == int32(saved_nSkip) && int32(saved_nEq)+1 < int32((*Index)(unsafe.Pointer(pProbe)).FnKeyCol) && int32(saved_nEq) == int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm) && int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x40>>6) == 0 && int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x80>>7) != 0 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_SkipScan) == U32(0) && int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst + uintptr(int32(saved_nEq)+1)*2))) >= 42 && libc.AssignInt32(&rc, whereLoopResize(tls, db, pNew, int32((*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm)+1)) == SQLITE_OK { var nIter LogEst *(*U16)(unsafe.Pointer(pNew + 24))++ (*WhereLoop)(unsafe.Pointer(pNew)).FnSkip++ *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(libc.PostIncUint16(&(*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm, 1))*8)) = uintptr(0) *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_SKIPSCAN) nIter = LogEst(int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst + uintptr(saved_nEq)*2))) - int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst + uintptr(int32(saved_nEq)+1)*2)))) *(*LogEst)(unsafe.Pointer(pNew + 22)) -= LogEst(int32(nIter)) nIter = int16(int32(nIter) + 5) whereLoopAddBtreeIndex(tls, pBuilder, pSrc, pProbe, int16(int32(nIter)+int32(nInMul))) (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = saved_nOut *(*U16)(unsafe.Pointer(pNew + 24)) = saved_nEq (*WhereLoop)(unsafe.Pointer(pNew)).FnSkip = saved_nSkip (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = saved_wsFlags } return rc } func indexMightHelpWithOrderBy(tls *libc.TLS, pBuilder uintptr, pIndex uintptr, iCursor int32) int32 { var pOB uintptr var aColExpr uintptr var ii int32 var jj int32 if uint32(int32(*(*uint16)(unsafe.Pointer(pIndex + 100))&0x4>>2)) != 0 { return 0 } if libc.AssignUintptr(&pOB, (*WhereInfo)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo)).FpOrderBy) == uintptr(0) { return 0 } for ii = 0; ii < (*ExprList)(unsafe.Pointer(pOB)).FnExpr; ii++ { var pExpr uintptr = Xsqlite3ExprSkipCollateAndLikely(tls, (*ExprList_item)(unsafe.Pointer(pOB+8+uintptr(ii)*32)).FpExpr) if pExpr == uintptr(0) { continue } if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN && (*Expr)(unsafe.Pointer(pExpr)).FiTable == iCursor { if int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) < 0 { return 1 } for jj = 0; jj < int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol); jj++ { if int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) == int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(jj)*2))) { return 1 } } } else if libc.AssignUintptr(&aColExpr, (*Index)(unsafe.Pointer(pIndex)).FaColExpr) != uintptr(0) { for jj = 0; jj < int32((*Index)(unsafe.Pointer(pIndex)).FnKeyCol); jj++ { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(jj)*2))) != -2 { continue } if Xsqlite3ExprCompareSkip(tls, pExpr, (*ExprList_item)(unsafe.Pointer(aColExpr+8+uintptr(jj)*32)).FpExpr, iCursor) == 0 { return 1 } } } } return 0 } func whereUsablePartialIndex(tls *libc.TLS, iTab int32, jointype U8, pWC uintptr, pWhere uintptr) int32 { var i int32 var pTerm uintptr var pParse uintptr if int32(jointype)&JT_LTORJ != 0 { return 0 } pParse = (*WhereInfo)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).FpWInfo)).FpParse for int32((*Expr)(unsafe.Pointer(pWhere)).Fop) == TK_AND { if !(whereUsablePartialIndex(tls, iTab, jointype, pWC, (*Expr)(unsafe.Pointer(pWhere)).FpLeft) != 0) { return 0 } pWhere = (*Expr)(unsafe.Pointer(pWhere)).FpRight } if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Fflags&uint64(SQLITE_EnableQPSG) != 0 { pParse = uintptr(0) } i = 0 pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa __1: if !(i < (*WhereClause)(unsafe.Pointer(pWC)).FnTerm) { goto __3 } { var pExpr uintptr pExpr = (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr if (!((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0)) || *(*int32)(unsafe.Pointer(pExpr + 52)) == iTab) && (int32(jointype)&JT_OUTER == 0 || (*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_OuterON) != U32(0)) && Xsqlite3ExprImpliesExpr(tls, pParse, pExpr, pWhere, iTab) != 0 && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FwtFlags)&TERM_VNULL == 0 { return 1 } } goto __2 __2: i++ pTerm += 56 goto __1 goto __3 __3: ; return 0 } func exprIsCoveredByIndex(tls *libc.TLS, pExpr uintptr, pIdx uintptr, iTabCur int32) int32 { var i int32 for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn); i++ { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) == -2 && Xsqlite3ExprCompare(tls, uintptr(0), pExpr, (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr+8+uintptr(i)*32)).FpExpr, iTabCur) == 0 { return 1 } } return 0 } // Structure passed to the whereIsCoveringIndex Walker callback. type CoveringIndexCheck = CoveringIndexCheck1 func whereIsCoveringIndexWalkCallback(tls *libc.TLS, pWalk uintptr, pExpr uintptr) int32 { var i int32 var pIdx uintptr var aiColumn uintptr var nColumn U16 var pCk uintptr pCk = *(*uintptr)(unsafe.Pointer(pWalk + 40)) pIdx = (*CoveringIndexCheck)(unsafe.Pointer(pCk)).FpIdx if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_COLUMN || int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AGG_COLUMN { if (*Expr)(unsafe.Pointer(pExpr)).FiTable != (*CoveringIndexCheck)(unsafe.Pointer(pCk)).FiTabCur { return WRC_Continue } pIdx = (*CoveringIndexCheck1)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pWalk + 40)))).FpIdx aiColumn = (*Index)(unsafe.Pointer(pIdx)).FaiColumn nColumn = (*Index)(unsafe.Pointer(pIdx)).FnColumn for i = 0; i < int32(nColumn); i++ { if int32(*(*I16)(unsafe.Pointer(aiColumn + uintptr(i)*2))) == int32((*Expr)(unsafe.Pointer(pExpr)).FiColumn) { return WRC_Continue } } (*CoveringIndexCheck)(unsafe.Pointer(pCk)).FbUnidx = U8(1) return WRC_Abort } else if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x800>>11)) != 0 && exprIsCoveredByIndex(tls, pExpr, pIdx, (*CoveringIndexCheck1)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pWalk + 40)))).FiTabCur) != 0 { (*CoveringIndexCheck)(unsafe.Pointer(pCk)).FbExpr = U8(1) return WRC_Prune } return WRC_Continue } func whereIsCoveringIndex(tls *libc.TLS, pWInfo uintptr, pIdx uintptr, iTabCur int32) U32 { bp := tls.Alloc(64) defer tls.Free(64) var i int32 var rc int32 if (*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect == uintptr(0) { return U32(0) } if int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x800>>11) == 0 { for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn); i++ { if int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) >= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))-1 { break } } if i >= int32((*Index)(unsafe.Pointer(pIdx)).FnColumn) { return U32(0) } } (*CoveringIndexCheck1)(unsafe.Pointer(bp + 48)).FpIdx = pIdx (*CoveringIndexCheck1)(unsafe.Pointer(bp + 48)).FiTabCur = iTabCur (*CoveringIndexCheck1)(unsafe.Pointer(bp + 48)).FbExpr = U8(0) (*CoveringIndexCheck1)(unsafe.Pointer(bp + 48)).FbUnidx = U8(0) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{whereIsCoveringIndexWalkCallback})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkNoop})) *(*uintptr)(unsafe.Pointer(bp + 40)) = bp + 48 Xsqlite3WalkSelect(tls, bp, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect) if (*CoveringIndexCheck1)(unsafe.Pointer(bp+48)).FbUnidx != 0 { rc = 0 } else if (*CoveringIndexCheck1)(unsafe.Pointer(bp+48)).FbExpr != 0 { rc = WHERE_EXPRIDX } else { rc = WHERE_IDX_ONLY } return U32(rc) } func whereLoopAddBtree(tls *libc.TLS, pBuilder uintptr, mPrereq Bitmask) int32 { bp := tls.Alloc(158) defer tls.Free(158) var pWInfo uintptr var pProbe uintptr *(*I16)(unsafe.Pointer(bp + 152)) = int16(-1) var pTabList uintptr var pSrc uintptr var pNew uintptr var rc int32 = SQLITE_OK var iSortIdx int32 = 1 var b int32 var rSize LogEst var pWC uintptr var pTab uintptr pNew = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew pWInfo = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo pTabList = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList pSrc = pTabList + 8 + uintptr((*WhereLoop)(unsafe.Pointer(pNew)).FiTab)*104 pTab = (*SrcItem)(unsafe.Pointer(pSrc)).FpTab pWC = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWC if uint32(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x2>>1)) != 0 { pProbe = *(*uintptr)(unsafe.Pointer(pSrc + 96)) } else if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { pProbe = (*Table)(unsafe.Pointer(pTab)).FpIndex } else { var pFirst uintptr libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Index{}))) (*Index)(unsafe.Pointer(bp)).FnKeyCol = U16(1) (*Index)(unsafe.Pointer(bp)).FnColumn = U16(1) (*Index)(unsafe.Pointer(bp)).FaiColumn = bp + 152 (*Index)(unsafe.Pointer(bp)).FaiRowLogEst = bp + 154 (*Index)(unsafe.Pointer(bp)).FonError = U8(OE_Replace) (*Index)(unsafe.Pointer(bp)).FpTable = pTab (*Index)(unsafe.Pointer(bp)).FszIdxRow = int16(3) libc.SetBitFieldPtr16Uint32(bp+100, uint32(SQLITE_IDXTYPE_IPK), 0, 0x3) *(*LogEst)(unsafe.Pointer(bp + 154)) = (*Table)(unsafe.Pointer(pTab)).FnRowLogEst *(*LogEst)(unsafe.Pointer(bp + 154 + 1*2)) = int16(0) pFirst = (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pSrc)).FpTab)).FpIndex if int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x1>>0) == 0 { (*Index)(unsafe.Pointer(bp)).FpNext = pFirst } pProbe = bp } rSize = (*Table)(unsafe.Pointer(pTab)).FnRowLogEst if !(int32((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpOrSet) != 0) && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&(WHERE_RIGHT_JOIN|WHERE_OR_SUBCLAUSE) == 0 && (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse)).Fdb)).Fflags&uint64(SQLITE_AutoIndex) != uint64(0) && !(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x2>>1) != 0) && !(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x1>>0) != 0) && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) && !(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x8>>3) != 0) && !(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x40>>6) != 0) && int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&JT_RIGHT == 0 { var rLogSize LogEst var pTerm uintptr var pWCEnd uintptr = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr((*WhereClause)(unsafe.Pointer(pWC)).FnTerm)*56 rLogSize = estLog(tls, rSize) for pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa; rc == SQLITE_OK && pTerm < pWCEnd; pTerm += 56 { if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight&(*WhereLoop)(unsafe.Pointer(pNew)).FmaskSelf != 0 { continue } if termCanDriveIndex(tls, pTerm, pSrc, uint64(0)) != 0 { *(*U16)(unsafe.Pointer(pNew + 24)) = U16(1) (*WhereLoop)(unsafe.Pointer(pNew)).FnSkip = U16(0) *(*uintptr)(unsafe.Pointer(pNew + 24 + 8)) = uintptr(0) (*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm = U16(1) *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm)) = pTerm (*WhereLoop)(unsafe.Pointer(pNew)).FrSetup = LogEst(int32(rLogSize) + int32(rSize)) if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Ephemeral) == U32(0) { *(*LogEst)(unsafe.Pointer(pNew + 18)) += int16(28) } else { *(*LogEst)(unsafe.Pointer(pNew + 18)) -= int16(25) } if int32((*WhereLoop)(unsafe.Pointer(pNew)).FrSetup) < 0 { (*WhereLoop)(unsafe.Pointer(pNew)).FrSetup = int16(0) } (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = int16(43) (*WhereLoop)(unsafe.Pointer(pNew)).FrRun = Xsqlite3LogEstAdd(tls, rLogSize, (*WhereLoop)(unsafe.Pointer(pNew)).FnOut) (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = U32(WHERE_AUTO_INDEX) (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq = mPrereq | (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight rc = whereLoopInsert(tls, pBuilder, pNew) } } } __1: if !(rc == SQLITE_OK && pProbe != 0) { goto __3 } { if (*Index)(unsafe.Pointer(pProbe)).FpPartIdxWhere != uintptr(0) && !(whereUsablePartialIndex(tls, (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor, (*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype, pWC, (*Index)(unsafe.Pointer(pProbe)).FpPartIdxWhere) != 0) { goto __2 } if uint32(int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x100>>8)) != 0 { goto __2 } rSize = *(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pProbe)).FaiRowLogEst)) *(*U16)(unsafe.Pointer(pNew + 24)) = U16(0) *(*U16)(unsafe.Pointer(pNew + 24 + 2)) = U16(0) *(*U16)(unsafe.Pointer(pNew + 24 + 4)) = U16(0) (*WhereLoop)(unsafe.Pointer(pNew)).FnSkip = U16(0) (*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm = U16(0) (*WhereLoop)(unsafe.Pointer(pNew)).FiSortIdx = U8(0) (*WhereLoop)(unsafe.Pointer(pNew)).FrSetup = int16(0) (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq = mPrereq (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = rSize *(*uintptr)(unsafe.Pointer(pNew + 24 + 8)) = pProbe b = indexMightHelpWithOrderBy(tls, pBuilder, pProbe, (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor) if int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x3>>0) == SQLITE_IDXTYPE_IPK { (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = U32(WHERE_IPK) (*WhereLoop)(unsafe.Pointer(pNew)).FiSortIdx = func() uint8 { if b != 0 { return uint8(iSortIdx) } return uint8(0) }() (*WhereLoop)(unsafe.Pointer(pNew)).FrRun = LogEst(int32(rSize) + 16 - 2*libc.Bool32((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasStat4) != U32(0))) if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW || (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Ephemeral) != U32(0) { *(*U32)(unsafe.Pointer(pNew + 56)) |= U32(WHERE_VIEWSCAN) } whereLoopOutputAdjust(tls, pWC, pNew, rSize) rc = whereLoopInsert(tls, pBuilder, pNew) (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = rSize if rc != 0 { goto __3 } } else { var m Bitmask if uint32(int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x20>>5)) != 0 { m = uint64(0) (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = U32(WHERE_IDX_ONLY | WHERE_INDEXED) } else { m = (*SrcItem)(unsafe.Pointer(pSrc)).FcolUsed & (*Index)(unsafe.Pointer(pProbe)).FcolNotIdxed (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = U32(WHERE_INDEXED) if m == uint64(1)<<(int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))-1) || uint32(int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x800>>11)) != 0 && !(int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x400>>10) != 0) && m != uint64(0) { var isCov U32 = whereIsCoveringIndex(tls, pWInfo, pProbe, (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor) if isCov == U32(0) { } else { m = uint64(0) *(*U32)(unsafe.Pointer(pNew + 56)) |= isCov if isCov&U32(WHERE_IDX_ONLY) != 0 { } else { } } } else if m == uint64(0) { (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = U32(WHERE_IDX_ONLY | WHERE_INDEXED) } } if b != 0 || !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) || (*Index)(unsafe.Pointer(pProbe)).FpPartIdxWhere != uintptr(0) || uint32(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x2>>1)) != 0 || m == uint64(0) && int32(*(*uint16)(unsafe.Pointer(pProbe + 100))&0x4>>2) == 0 && int32((*Index)(unsafe.Pointer(pProbe)).FszIdxRow) < int32((*Table)(unsafe.Pointer(pTab)).FszTabRow) && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_ONEPASS_DESIRED == 0 && Xsqlite3Config.FbUseCis != 0 && (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse)).Fdb)).FdbOptFlags&U32(SQLITE_CoverIdxScan) == U32(0) { (*WhereLoop)(unsafe.Pointer(pNew)).FiSortIdx = func() uint8 { if b != 0 { return uint8(iSortIdx) } return uint8(0) }() (*WhereLoop)(unsafe.Pointer(pNew)).FrRun = LogEst(int32(rSize) + 1 + 15*int32((*Index)(unsafe.Pointer(pProbe)).FszIdxRow)/int32((*Table)(unsafe.Pointer(pTab)).FszTabRow)) if m != uint64(0) { var nLookup LogEst = LogEst(int32(rSize) + 16) var ii int32 var iCur int32 = (*SrcItem)(unsafe.Pointer(pSrc)).FiCursor var pWC2 uintptr = pWInfo + 104 for ii = 0; ii < (*WhereClause)(unsafe.Pointer(pWC2)).FnTerm; ii++ { var pTerm uintptr = (*WhereClause)(unsafe.Pointer(pWC2)).Fa + uintptr(ii)*56 if !(Xsqlite3ExprCoveredByIndex(tls, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr, iCur, pProbe) != 0) { break } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb) <= 0 { nLookup = LogEst(int32(nLookup) + int32((*WhereTerm)(unsafe.Pointer(pTerm)).FtruthProb)) } else { nLookup-- if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&(WO_EQ|WO_IS) != 0 { nLookup = int16(int32(nLookup) - 19) } } } (*WhereLoop)(unsafe.Pointer(pNew)).FrRun = Xsqlite3LogEstAdd(tls, (*WhereLoop)(unsafe.Pointer(pNew)).FrRun, nLookup) } whereLoopOutputAdjust(tls, pWC, pNew, rSize) if int32((*SrcItem)(unsafe.Pointer(pSrc)).Ffg.Fjointype)&JT_RIGHT != 0 && (*Index)(unsafe.Pointer(pProbe)).FaColExpr != 0 { } else { rc = whereLoopInsert(tls, pBuilder, pNew) } (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = rSize if rc != 0 { goto __3 } } } (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FbldFlags1 = uint8(0) rc = whereLoopAddBtreeIndex(tls, pBuilder, pSrc, pProbe, int16(0)) if int32((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FbldFlags1) == SQLITE_BLDF1_INDEXED { *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_StatsUsed) } Xsqlite3Stat4ProbeFree(tls, (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpRec) (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FnRecValid = 0 (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpRec = uintptr(0) } goto __2 __2: pProbe = func() uintptr { if uint32(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x2>>1)) != 0 { return uintptr(0) } return (*Index)(unsafe.Pointer(pProbe)).FpNext }() iSortIdx++ goto __1 goto __3 __3: ; return rc } func isLimitTerm(tls *libc.TLS, pTerm uintptr) int32 { return libc.Bool32(int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeMatchOp) >= SQLITE_INDEX_CONSTRAINT_LIMIT && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeMatchOp) <= SQLITE_INDEX_CONSTRAINT_OFFSET) } func whereLoopAddVirtualOne(tls *libc.TLS, pBuilder uintptr, mPrereq Bitmask, mUsable Bitmask, mExclude U16, pIdxInfo uintptr, mNoOmit U16, pbIn uintptr, pbRetryLimit uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pWC uintptr = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWC var pHidden uintptr = pIdxInfo + 1*96 var pIdxCons uintptr var pUsage uintptr = (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage var i int32 var mxTerm int32 var rc int32 = SQLITE_OK var pNew uintptr = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew var pParse uintptr = (*WhereInfo)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo)).FpParse var pSrc uintptr = (*WhereInfo)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo)).FpTabList + 8 + uintptr((*WhereLoop)(unsafe.Pointer(pNew)).FiTab)*104 var nConstraint int32 = (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint *(*int32)(unsafe.Pointer(pbIn)) = 0 (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq = mPrereq pIdxCons = *(*uintptr)(unsafe.Pointer(pIdxInfo + 8)) i = 0 __1: if !(i < nConstraint) { goto __3 } { var pTerm uintptr = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr((*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons)).FiTermOffset)*56 (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons)).Fusable = uint8(0) if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight&mUsable == (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight && int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&int32(mExclude) == 0 && (pbRetryLimit != 0 || !(isLimitTerm(tls, pTerm) != 0)) { (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons)).Fusable = uint8(1) } } goto __2 __2: i++ pIdxCons += 12 goto __1 goto __3 __3: ; libc.Xmemset(tls, pUsage, 0, uint64(unsafe.Sizeof(sqlite3_index_constraint_usage{}))*uint64(nConstraint)) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxStr = uintptr(0) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 0 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).ForderByConsumed = 0 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = float64(1e99) / float64(2) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = int64(25) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxFlags = 0 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FcolUsed = Sqlite3_uint64(Sqlite3_int64((*SrcItem)(unsafe.Pointer(pSrc)).FcolUsed)) (*HiddenIndexInfo)(unsafe.Pointer(pHidden)).FmHandleIn = U32(0) rc = vtabBestIndex(tls, pParse, (*SrcItem)(unsafe.Pointer(pSrc)).FpTab, pIdxInfo) if rc != 0 { if rc == SQLITE_CONSTRAINT { return SQLITE_OK } return rc } mxTerm = -1 libc.Xmemset(tls, (*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64(nConstraint)) libc.Xmemset(tls, pNew+24, 0, uint64(unsafe.Sizeof(struct { FidxNum int32 FneedFree uint8 F__ccgo_pad1 [1]byte FisOrdered I8 F__ccgo_pad2 [1]byte FomitMask U16 F__ccgo_pad3 [6]byte FidxStr uintptr FmHandleIn U32 F__ccgo_pad4 [4]byte }{}))) pIdxCons = *(*uintptr)(unsafe.Pointer(pIdxInfo + 8)) i = 0 __4: if !(i < nConstraint) { goto __6 } { var iTerm int32 if libc.AssignInt32(&iTerm, (*sqlite3_index_constraint_usage)(unsafe.Pointer(pUsage+uintptr(i)*8)).FargvIndex-1) >= 0 { var pTerm uintptr var j int32 = (*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons)).FiTermOffset if iTerm >= nConstraint || j < 0 || j >= (*WhereClause)(unsafe.Pointer(pWC)).FnTerm || *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(iTerm)*8)) != uintptr(0) || int32((*sqlite3_index_constraint)(unsafe.Pointer(pIdxCons)).Fusable) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+23359, libc.VaList(bp, (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pSrc)).FpTab)).FzName)) return SQLITE_ERROR } pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr(j)*56 *(*Bitmask)(unsafe.Pointer(pNew)) |= (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm + uintptr(iTerm)*8)) = pTerm if iTerm > mxTerm { mxTerm = iTerm } if (*sqlite3_index_constraint_usage)(unsafe.Pointer(pUsage+uintptr(i)*8)).Fomit != 0 { if i < 16 && int32(1)<>0)) != 0 { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(pNew + 24 + 16))) libc.SetBitFieldPtr8Uint32(pNew+24+4, U32(0), 0, 0x1) } return rc } // Return the collating sequence for a constraint passed into xBestIndex. // // pIdxInfo must be an sqlite3_index_info structure passed into xBestIndex. // This routine depends on there being a HiddenIndexInfo structure immediately // following the sqlite3_index_info structure. // // Return a pointer to the collation name: // // 1. If there is an explicit COLLATE operator on the constaint, return it. // // 2. Else, if the column has an alternative collation, return that. // // 3. Otherwise, return "BINARY". func Xsqlite3_vtab_collation(tls *libc.TLS, pIdxInfo uintptr, iCons int32) uintptr { var pHidden uintptr = pIdxInfo + 1*96 var zRet uintptr = uintptr(0) if iCons >= 0 && iCons < (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint { var pC uintptr = uintptr(0) var iTerm int32 = (*sqlite3_index_constraint)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint + uintptr(iCons)*12)).FiTermOffset var pX uintptr = (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer((*HiddenIndexInfo)(unsafe.Pointer(pHidden)).FpWC)).Fa + uintptr(iTerm)*56)).FpExpr if (*Expr)(unsafe.Pointer(pX)).FpLeft != 0 { pC = Xsqlite3ExprCompareCollSeq(tls, (*HiddenIndexInfo)(unsafe.Pointer(pHidden)).FpParse, pX) } zRet = func() uintptr { if pC != 0 { return (*CollSeq)(unsafe.Pointer(pC)).FzName } return uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) }() } return zRet } // Return true if constraint iCons is really an IN(...) constraint, or // false otherwise. If iCons is an IN(...) constraint, set (if bHandle!=0) // or clear (if bHandle==0) the flag to handle it using an iterator. func Xsqlite3_vtab_in(tls *libc.TLS, pIdxInfo uintptr, iCons int32, bHandle int32) int32 { var pHidden uintptr = pIdxInfo + 1*96 var m U32 = func() uint32 { if iCons <= 31 { return uint32(1) << iCons } return uint32(0) }() if m&(*HiddenIndexInfo)(unsafe.Pointer(pHidden)).FmIn != 0 { if bHandle == 0 { *(*U32)(unsafe.Pointer(pHidden + 24)) &= ^m } else if bHandle > 0 { *(*U32)(unsafe.Pointer(pHidden + 24)) |= m } return 1 } return 0 } // This interface is callable from within the xBestIndex callback only. // // If possible, set (*ppVal) to point to an object containing the value // on the right-hand-side of constraint iCons. func Xsqlite3_vtab_rhs_value(tls *libc.TLS, pIdxInfo uintptr, iCons int32, ppVal uintptr) int32 { var pH uintptr = pIdxInfo + 1*96 var pVal uintptr = uintptr(0) var rc int32 = SQLITE_OK if iCons < 0 || iCons >= (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint { rc = SQLITE_MISUSE } else { if *(*uintptr)(unsafe.Pointer(pH + 32 + uintptr(iCons)*8)) == uintptr(0) { var pTerm uintptr = (*WhereClause)(unsafe.Pointer((*HiddenIndexInfo)(unsafe.Pointer(pH)).FpWC)).Fa + uintptr((*sqlite3_index_constraint)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint+uintptr(iCons)*12)).FiTermOffset)*56 rc = Xsqlite3ValueFromExpr(tls, (*Parse)(unsafe.Pointer((*HiddenIndexInfo)(unsafe.Pointer(pH)).FpParse)).Fdb, (*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).FpRight, (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer((*HiddenIndexInfo)(unsafe.Pointer(pH)).FpParse)).Fdb)).Fenc, uint8(SQLITE_AFF_BLOB), pH+32+uintptr(iCons)*8) } pVal = *(*uintptr)(unsafe.Pointer(pH + 32 + uintptr(iCons)*8)) } *(*uintptr)(unsafe.Pointer(ppVal)) = pVal if rc == SQLITE_OK && pVal == uintptr(0) { rc = SQLITE_NOTFOUND } return rc } // Return true if ORDER BY clause may be handled as DISTINCT. func Xsqlite3_vtab_distinct(tls *libc.TLS, pIdxInfo uintptr) int32 { var pHidden uintptr = pIdxInfo + 1*96 return (*HiddenIndexInfo)(unsafe.Pointer(pHidden)).FeDistinct } func whereLoopAddVirtual(tls *libc.TLS, pBuilder uintptr, mPrereq Bitmask, mUnusable Bitmask) int32 { bp := tls.Alloc(12) defer tls.Free(12) var rc int32 = SQLITE_OK var pWInfo uintptr var pParse uintptr var pWC uintptr var pSrc uintptr var p uintptr var nConstraint int32 var pNew uintptr var mBest Bitmask *(*int32)(unsafe.Pointer(bp + 8)) = 0 pWInfo = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo pParse = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse pWC = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWC pNew = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew pSrc = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLoop)(unsafe.Pointer(pNew)).FiTab)*104 p = allocateIndexInfo(tls, pWInfo, pWC, mUnusable, pSrc, bp) if p == uintptr(0) { return SQLITE_NOMEM } (*WhereLoop)(unsafe.Pointer(pNew)).FrSetup = int16(0) (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = U32(WHERE_VIRTUALTABLE) (*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm = U16(0) libc.SetBitFieldPtr8Uint32(pNew+24+4, U32(0), 0, 0x1) nConstraint = (*Sqlite3_index_info)(unsafe.Pointer(p)).FnConstraint if whereLoopResize(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pNew, nConstraint) != 0 { freeIndexInfo(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, p) return SQLITE_NOMEM } rc = whereLoopAddVirtualOne(tls, pBuilder, mPrereq, libc.Uint64(libc.Uint64FromInt32(-1)), uint16(0), p, *(*U16)(unsafe.Pointer(bp)), bp+4, bp+8) if *(*int32)(unsafe.Pointer(bp + 8)) != 0 { rc = whereLoopAddVirtualOne(tls, pBuilder, mPrereq, libc.Uint64(libc.Uint64FromInt32(-1)), uint16(0), p, *(*U16)(unsafe.Pointer(bp)), bp+4, uintptr(0)) } if rc == SQLITE_OK && (libc.AssignUint64(&mBest, (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq & ^mPrereq) != uint64(0) || *(*int32)(unsafe.Pointer(bp + 4)) != 0) { var seenZero int32 = 0 var seenZeroNoIN int32 = 0 var mPrev Bitmask = uint64(0) var mBestNoIn Bitmask = uint64(0) if *(*int32)(unsafe.Pointer(bp + 4)) != 0 { rc = whereLoopAddVirtualOne(tls, pBuilder, mPrereq, libc.Uint64(libc.Uint64FromInt32(-1)), uint16(WO_IN), p, *(*U16)(unsafe.Pointer(bp)), bp+4, uintptr(0)) mBestNoIn = (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq & ^mPrereq if mBestNoIn == uint64(0) { seenZero = 1 seenZeroNoIN = 1 } } for rc == SQLITE_OK { var i int32 var mNext Bitmask = libc.Uint64(libc.Uint64FromInt32(-1)) for i = 0; i < nConstraint; i++ { var mThis Bitmask = (*WhereTerm)(unsafe.Pointer((*WhereClause)(unsafe.Pointer(pWC)).Fa+uintptr((*sqlite3_index_constraint)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(p)).FaConstraint+uintptr(i)*12)).FiTermOffset)*56)).FprereqRight & ^mPrereq if mThis > mPrev && mThis < mNext { mNext = mThis } } mPrev = mNext if mNext == libc.Uint64(libc.Uint64FromInt32(-1)) { break } if mNext == mBest || mNext == mBestNoIn { continue } rc = whereLoopAddVirtualOne(tls, pBuilder, mPrereq, mNext|mPrereq, uint16(0), p, *(*U16)(unsafe.Pointer(bp)), bp+4, uintptr(0)) if (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq == mPrereq { seenZero = 1 if *(*int32)(unsafe.Pointer(bp + 4)) == 0 { seenZeroNoIN = 1 } } } if rc == SQLITE_OK && seenZero == 0 { rc = whereLoopAddVirtualOne(tls, pBuilder, mPrereq, mPrereq, uint16(0), p, *(*U16)(unsafe.Pointer(bp)), bp+4, uintptr(0)) if *(*int32)(unsafe.Pointer(bp + 4)) == 0 { seenZeroNoIN = 1 } } if rc == SQLITE_OK && seenZeroNoIN == 0 { rc = whereLoopAddVirtualOne(tls, pBuilder, mPrereq, mPrereq, uint16(WO_IN), p, *(*U16)(unsafe.Pointer(bp)), bp+4, uintptr(0)) } } if (*Sqlite3_index_info)(unsafe.Pointer(p)).FneedToFreeIdxStr != 0 { Xsqlite3_free(tls, (*Sqlite3_index_info)(unsafe.Pointer(p)).FidxStr) } freeIndexInfo(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, p) return rc } func whereLoopAddOr(tls *libc.TLS, pBuilder uintptr, mPrereq Bitmask, mUnusable Bitmask) int32 { bp := tls.Alloc(712) defer tls.Free(712) var pWInfo uintptr = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo var pWC uintptr var pNew uintptr var pTerm uintptr var pWCEnd uintptr var rc int32 = SQLITE_OK var iCur int32 var pItem uintptr pWC = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWC pWCEnd = (*WhereClause)(unsafe.Pointer(pWC)).Fa + uintptr((*WhereClause)(unsafe.Pointer(pWC)).FnTerm)*56 pNew = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(WhereOrSet{}))) pItem = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLoop)(unsafe.Pointer(pNew)).FiTab)*104 iCur = (*SrcItem)(unsafe.Pointer(pItem)).FiCursor if int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_RIGHT != 0 { return SQLITE_OK } for pTerm = (*WhereClause)(unsafe.Pointer(pWC)).Fa; pTerm < pWCEnd && rc == SQLITE_OK; pTerm += 56 { if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&WO_OR != 0 && (*WhereOrInfo)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pTerm + 32)))).Findexable&(*WhereLoop)(unsafe.Pointer(pNew)).FmaskSelf != uint64(0) { var pOrWC uintptr = *(*uintptr)(unsafe.Pointer(pTerm + 32)) var pOrWCEnd uintptr = (*WhereClause)(unsafe.Pointer(pOrWC)).Fa + uintptr((*WhereClause)(unsafe.Pointer(pOrWC)).FnTerm)*56 var pOrTerm uintptr var once int32 = 1 var i int32 var j int32 *(*WhereLoopBuilder)(unsafe.Pointer(bp + 600)) = *(*WhereLoopBuilder)(unsafe.Pointer(pBuilder)) (*WhereLoopBuilder)(unsafe.Pointer(bp + 600)).FpOrSet = bp + 56 for pOrTerm = (*WhereClause)(unsafe.Pointer(pOrWC)).Fa; pOrTerm < pOrWCEnd; pOrTerm += 56 { if int32((*WhereTerm)(unsafe.Pointer(pOrTerm)).FeOperator)&WO_AND != 0 { (*WhereLoopBuilder)(unsafe.Pointer(bp + 600)).FpWC = *(*uintptr)(unsafe.Pointer(pOrTerm + 32)) } else if (*WhereTerm)(unsafe.Pointer(pOrTerm)).FleftCursor == iCur { (*WhereClause)(unsafe.Pointer(bp + 112)).FpWInfo = (*WhereClause)(unsafe.Pointer(pWC)).FpWInfo (*WhereClause)(unsafe.Pointer(bp + 112)).FpOuter = pWC (*WhereClause)(unsafe.Pointer(bp + 112)).Fop = U8(TK_AND) (*WhereClause)(unsafe.Pointer(bp + 112)).FnTerm = 1 (*WhereClause)(unsafe.Pointer(bp + 112)).FnBase = 1 (*WhereClause)(unsafe.Pointer(bp + 112)).Fa = pOrTerm (*WhereLoopBuilder)(unsafe.Pointer(bp + 600)).FpWC = bp + 112 } else { continue } (*WhereOrSet)(unsafe.Pointer(bp + 56)).Fn = U16(0) if int32((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpTab)).FeTabType) == TABTYP_VTAB { rc = whereLoopAddVirtual(tls, bp+600, mPrereq, mUnusable) } else { rc = whereLoopAddBtree(tls, bp+600, mPrereq) } if rc == SQLITE_OK { rc = whereLoopAddOr(tls, bp+600, mPrereq, mUnusable) } if int32((*WhereOrSet)(unsafe.Pointer(bp+56)).Fn) == 0 { (*WhereOrSet)(unsafe.Pointer(bp)).Fn = U16(0) break } else if once != 0 { whereOrMove(tls, bp, bp+56) once = 0 } else { whereOrMove(tls, bp+656, bp) (*WhereOrSet)(unsafe.Pointer(bp)).Fn = U16(0) for i = 0; i < int32((*WhereOrSet)(unsafe.Pointer(bp+656)).Fn); i++ { for j = 0; j < int32((*WhereOrSet)(unsafe.Pointer(bp+56)).Fn); j++ { whereOrInsert(tls, bp, (*WhereOrCost)(unsafe.Pointer(bp+656+8+uintptr(i)*16)).Fprereq|(*WhereOrCost)(unsafe.Pointer(bp+56+8+uintptr(j)*16)).Fprereq, Xsqlite3LogEstAdd(tls, (*WhereOrCost)(unsafe.Pointer(bp+656+8+uintptr(i)*16)).FrRun, (*WhereOrCost)(unsafe.Pointer(bp+56+8+uintptr(j)*16)).FrRun), Xsqlite3LogEstAdd(tls, (*WhereOrCost)(unsafe.Pointer(bp+656+8+uintptr(i)*16)).FnOut, (*WhereOrCost)(unsafe.Pointer(bp+56+8+uintptr(j)*16)).FnOut)) } } } } (*WhereLoop)(unsafe.Pointer(pNew)).FnLTerm = U16(1) *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pNew)).FaLTerm)) = pTerm (*WhereLoop)(unsafe.Pointer(pNew)).FwsFlags = U32(WHERE_MULTI_OR) (*WhereLoop)(unsafe.Pointer(pNew)).FrSetup = int16(0) (*WhereLoop)(unsafe.Pointer(pNew)).FiSortIdx = U8(0) libc.Xmemset(tls, pNew+24, 0, uint64(unsafe.Sizeof(struct { Fbtree struct { FnEq U16 FnBtm U16 FnTop U16 FnDistinctCol U16 FpIndex uintptr } F__ccgo_pad1 [16]byte }{}))) for i = 0; rc == SQLITE_OK && i < int32((*WhereOrSet)(unsafe.Pointer(bp)).Fn); i++ { (*WhereLoop)(unsafe.Pointer(pNew)).FrRun = LogEst(int32((*WhereOrCost)(unsafe.Pointer(bp+8+uintptr(i)*16)).FrRun) + 1) (*WhereLoop)(unsafe.Pointer(pNew)).FnOut = (*WhereOrCost)(unsafe.Pointer(bp + 8 + uintptr(i)*16)).FnOut (*WhereLoop)(unsafe.Pointer(pNew)).Fprereq = (*WhereOrCost)(unsafe.Pointer(bp + 8 + uintptr(i)*16)).Fprereq rc = whereLoopInsert(tls, pBuilder, pNew) } } } return rc } func whereLoopAddAll(tls *libc.TLS, pBuilder uintptr) int32 { var pWInfo uintptr = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo var mPrereq Bitmask = uint64(0) var mPrior Bitmask = uint64(0) var iTab int32 var pTabList uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList var pItem uintptr var pEnd uintptr = pTabList + 8 + uintptr((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel)*104 var db uintptr = (*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse)).Fdb var rc int32 = SQLITE_OK var bFirstPastRJ int32 = 0 var hasRightJoin int32 = 0 var pNew uintptr pNew = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FiPlanLimit = uint32(SQLITE_QUERY_PLANNER_LIMIT) iTab = 0 pItem = pTabList + 8 __1: if !(pItem < pEnd) { goto __3 } { var mUnusable Bitmask = uint64(0) (*WhereLoop)(unsafe.Pointer(pNew)).FiTab = U8(iTab) *(*uint32)(unsafe.Pointer(pBuilder + 48)) += uint32(SQLITE_QUERY_PLANNER_LIMIT_INCR) (*WhereLoop)(unsafe.Pointer(pNew)).FmaskSelf = Xsqlite3WhereGetMask(tls, pWInfo+592, (*SrcItem)(unsafe.Pointer(pItem)).FiCursor) if bFirstPastRJ != 0 || int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&(JT_OUTER|JT_CROSS|JT_LTORJ) != 0 { if int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_LTORJ != 0 { hasRightJoin = 1 } mPrereq = mPrereq | mPrior bFirstPastRJ = libc.Bool32(int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&JT_RIGHT != 0) } else if !(hasRightJoin != 0) { mPrereq = uint64(0) } if int32((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pItem)).FpTab)).FeTabType) == TABTYP_VTAB { var p uintptr for p = pItem + 1*104; p < pEnd; p += 104 { if mUnusable != 0 || int32((*SrcItem)(unsafe.Pointer(p)).Ffg.Fjointype)&(JT_OUTER|JT_CROSS) != 0 { mUnusable = mUnusable | Xsqlite3WhereGetMask(tls, pWInfo+592, (*SrcItem)(unsafe.Pointer(p)).FiCursor) } } rc = whereLoopAddVirtual(tls, pBuilder, mPrereq, mUnusable) } else { rc = whereLoopAddBtree(tls, pBuilder, mPrereq) } if rc == SQLITE_OK && (*WhereClause)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWC)).FhasOr != 0 { rc = whereLoopAddOr(tls, pBuilder, mPrereq, mUnusable) } mPrior = mPrior | (*WhereLoop)(unsafe.Pointer(pNew)).FmaskSelf if rc != 0 || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { if rc == SQLITE_DONE { Xsqlite3_log(tls, SQLITE_WARNING, ts+23385, 0) rc = SQLITE_OK } else { goto __3 } } } goto __2 __2: iTab++ pItem += 104 goto __1 goto __3 __3: ; whereLoopClear(tls, db, pNew) return rc } func wherePathSatisfiesOrderBy(tls *libc.TLS, pWInfo uintptr, pOrderBy uintptr, pPath uintptr, wctrlFlags U16, nLoop U16, pLast uintptr, pRevMask uintptr) I8 { var revSet U8 var rev U8 var revIdx U8 var isOrderDistinct U8 var distinctColumns U8 var isMatch U8 var eqOpMask U16 var nKeyCol U16 var nColumn U16 var nOrderBy U16 var iLoop int32 var i int32 var j int32 var iCur int32 var iColumn int32 var pLoop uintptr = uintptr(0) var pTerm uintptr var pOBExpr uintptr var pColl uintptr var pIndex uintptr var db uintptr = (*Parse)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse)).Fdb var obSat Bitmask = uint64(0) var obDone Bitmask var orderDistinctMask Bitmask var ready Bitmask if nLoop != 0 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_OrderByIdxJoin) != U32(0) { return int8(0) } nOrderBy = U16((*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr) if int32(nOrderBy) > int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))-1 { return int8(0) } isOrderDistinct = U8(1) obDone = uint64(1)< 0 { ready = ready | (*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf } if iLoop < int32(nLoop) { pLoop = *(*uintptr)(unsafe.Pointer((*WherePath)(unsafe.Pointer(pPath)).FaLoop + uintptr(iLoop)*8)) if int32(wctrlFlags)&WHERE_ORDERBY_LIMIT != 0 { continue } } else { pLoop = pLast } if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_VIRTUALTABLE) != 0 { if *(*I8)(unsafe.Pointer(pLoop + 24 + 6)) != 0 && int32(wctrlFlags)&(WHERE_DISTINCTBY|WHERE_SORTBYGROUP) != WHERE_DISTINCTBY { obSat = obDone } break } else if int32(wctrlFlags)&WHERE_DISTINCTBY != 0 { *(*U16)(unsafe.Pointer(pLoop + 24 + 6)) = U16(0) } iCur = (*SrcItem)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLoop)(unsafe.Pointer(pLoop)).FiTab)*104)).FiCursor for i = 0; i < int32(nOrderBy); i++ { if uint64(1)<= int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm) { continue } } if int32((*WhereTerm)(unsafe.Pointer(pTerm)).FeOperator)&(WO_EQ|WO_IS) != 0 && int32((*Expr)(unsafe.Pointer(pOBExpr)).FiColumn) >= 0 { var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var pColl1 uintptr = Xsqlite3ExprNNCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(pOrderBy+8+uintptr(i)*32)).FpExpr) var pColl2 uintptr = Xsqlite3ExprCompareCollSeq(tls, pParse, (*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr) if pColl2 == uintptr(0) || Xsqlite3StrICmp(tls, (*CollSeq)(unsafe.Pointer(pColl1)).FzName, (*CollSeq)(unsafe.Pointer(pColl2)).FzName) != 0 { continue } } obSat = obSat | uint64(1)<>2)) != 0 { return int8(0) } else { nKeyCol = (*Index)(unsafe.Pointer(pIndex)).FnKeyCol nColumn = (*Index)(unsafe.Pointer(pIndex)).FnColumn isOrderDistinct = U8(libc.Bool32(int32((*Index)(unsafe.Pointer(pIndex)).FonError) != OE_None && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_SKIPSCAN) == U32(0))) } rev = libc.AssignUint8(&revSet, U8(0)) distinctColumns = U8(0) for j = 0; j < int32(nColumn); j++ { var bOnce U8 = U8(1) if j < int32(*(*U16)(unsafe.Pointer(pLoop + 24))) && j >= int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip) { var eOp U16 = (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)))).FeOperator if int32(eOp)&int32(eqOpMask) != 0 { if int32(eOp)&(WO_ISNULL|WO_IS) != 0 { isOrderDistinct = U8(0) } continue } else if int32(eOp)&WO_IN != 0 { var pX uintptr = (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)))).FpExpr for i = j + 1; i < int32(*(*U16)(unsafe.Pointer(pLoop + 24))); i++ { if (*WhereTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(i)*8)))).FpExpr == pX { bOnce = U8(0) break } } } } if pIndex != 0 { iColumn = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaiColumn + uintptr(j)*2))) revIdx = U8(int32(*(*U8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaSortOrder + uintptr(j)))) & KEYINFO_ORDER_DESC) if iColumn == int32((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FpTable)).FiPKey) { iColumn = -1 } } else { iColumn = -1 revIdx = U8(0) } if isOrderDistinct != 0 { if iColumn >= 0 && j >= int32(*(*U16)(unsafe.Pointer(pLoop + 24))) && int32(*(*uint8)(unsafe.Pointer((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FpTable)).FaCol + uintptr(iColumn)*24 + 8))&0xf>>0) == 0 { isOrderDistinct = U8(0) } if iColumn == -2 { isOrderDistinct = U8(0) } } isMatch = U8(0) for i = 0; bOnce != 0 && i < int32(nOrderBy); i++ { if uint64(1)<= -1 { if int32((*Expr)(unsafe.Pointer(pOBExpr)).Fop) != TK_COLUMN && int32((*Expr)(unsafe.Pointer(pOBExpr)).Fop) != TK_AGG_COLUMN { continue } if (*Expr)(unsafe.Pointer(pOBExpr)).FiTable != iCur { continue } if int32((*Expr)(unsafe.Pointer(pOBExpr)).FiColumn) != iColumn { continue } } else { var pIxExpr uintptr = (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FaColExpr + 8 + uintptr(j)*32)).FpExpr if Xsqlite3ExprCompareSkip(tls, pOBExpr, pIxExpr, iCur) != 0 { continue } } if iColumn != -1 { pColl = Xsqlite3ExprNNCollSeq(tls, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse, (*ExprList_item)(unsafe.Pointer(pOrderBy+8+uintptr(i)*32)).FpExpr) if Xsqlite3StrICmp(tls, (*CollSeq)(unsafe.Pointer(pColl)).FzName, *(*uintptr)(unsafe.Pointer((*Index)(unsafe.Pointer(pIndex)).FazColl + uintptr(j)*8))) != 0 { continue } } if int32(wctrlFlags)&WHERE_DISTINCTBY != 0 { *(*U16)(unsafe.Pointer(pLoop + 24 + 6)) = U16(j + 1) } isMatch = U8(1) break } if isMatch != 0 && int32(wctrlFlags)&WHERE_GROUPBY == 0 { if revSet != 0 { if int32(rev)^int32(revIdx) != int32((*ExprList_item)(unsafe.Pointer(pOrderBy+8+uintptr(i)*32)).Ffg.FsortFlags)&KEYINFO_ORDER_DESC { isMatch = U8(0) } } else { rev = U8(int32(revIdx) ^ int32((*ExprList_item)(unsafe.Pointer(pOrderBy+8+uintptr(i)*32)).Ffg.FsortFlags)&KEYINFO_ORDER_DESC) if rev != 0 { *(*Bitmask)(unsafe.Pointer(pRevMask)) |= uint64(1) << iLoop } revSet = U8(1) } } if isMatch != 0 && int32((*ExprList_item)(unsafe.Pointer(pOrderBy+8+uintptr(i)*32)).Ffg.FsortFlags)&KEYINFO_ORDER_BIGNULL != 0 { if j == int32(*(*U16)(unsafe.Pointer(pLoop + 24))) { *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_BIGNULL_SORT) } else { isMatch = U8(0) } } if isMatch != 0 { if iColumn == -1 { distinctColumns = U8(1) } obSat = obSat | uint64(1)< 0; i-- { var m Bitmask if i < int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) { m = uint64(1)<> 3) } func whereSortingCost(tls *libc.TLS, pWInfo uintptr, nRow LogEst, nOrderBy int32, nSorted int32) LogEst { var rSortCost LogEst var nCol LogEst nCol = Xsqlite3LogEst(tls, uint64(((*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect)).FpEList)).FnExpr+59)/30)) rSortCost = LogEst(int32(nRow) + int32(nCol)) if nSorted > 0 { rSortCost = LogEst(int32(rSortCost) + (int32(Xsqlite3LogEst(tls, uint64((nOrderBy-nSorted)*100/nOrderBy))) - 66)) } if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_USE_LIMIT != 0 { rSortCost = int16(int32(rSortCost) + 10) if nSorted != 0 { rSortCost = int16(int32(rSortCost) + 6) } if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FiLimit) < int32(nRow) { nRow = (*WhereInfo)(unsafe.Pointer(pWInfo)).FiLimit } } else if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_WANT_DISTINCT != 0 { if int32(nRow) > 10 { nRow = int16(int32(nRow) - 10) } } rSortCost = LogEst(int32(rSortCost) + int32(estLog(tls, nRow))) return rSortCost } func wherePathSolver(tls *libc.TLS, pWInfo uintptr, nRowEst LogEst) int32 { bp := tls.Alloc(32) defer tls.Free(32) var mxChoice int32 var nLoop int32 var pParse uintptr var iLoop int32 var ii int32 var jj int32 var mxI int32 = 0 var nOrderBy int32 var mxCost LogEst = int16(0) var mxUnsorted LogEst = int16(0) var nTo int32 var nFrom int32 var aFrom uintptr var aTo uintptr var pFrom uintptr var pTo uintptr var pWLoop uintptr var pX uintptr var aSortCost uintptr = uintptr(0) var pSpace uintptr var nSpace int32 pParse = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse nLoop = int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) if nLoop <= 1 { mxChoice = 1 } else { mxChoice = func() int32 { if nLoop == 2 { return 5 } return 10 }() } if (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy == uintptr(0) || int32(nRowEst) == 0 { nOrderBy = 0 } else { nOrderBy = (*ExprList)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy)).FnExpr } nSpace = int32((uint64(unsafe.Sizeof(WherePath{})) + uint64(unsafe.Sizeof(uintptr(0)))*uint64(nLoop)) * uint64(mxChoice) * uint64(2)) nSpace = int32(uint64(nSpace) + uint64(unsafe.Sizeof(LogEst(0)))*uint64(nOrderBy)) pSpace = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(nSpace)) if pSpace == uintptr(0) { return SQLITE_NOMEM } aTo = pSpace aFrom = aTo + uintptr(mxChoice)*32 libc.Xmemset(tls, aFrom, 0, uint64(unsafe.Sizeof(WherePath{}))) pX = aFrom + uintptr(mxChoice)*32 ii = mxChoice * 2 pFrom = aTo __1: if !(ii > 0) { goto __3 } { (*WherePath)(unsafe.Pointer(pFrom)).FaLoop = pX } goto __2 __2: ii-- pFrom += 32 pX += 8 * uintptr(nLoop) goto __1 goto __3 __3: ; if nOrderBy != 0 { aSortCost = pX libc.Xmemset(tls, aSortCost, 0, uint64(unsafe.Sizeof(LogEst(0)))*uint64(nOrderBy)) } (*WherePath)(unsafe.Pointer(aFrom)).FnRow = func() int16 { if (*Parse)(unsafe.Pointer(pParse)).FnQueryLoop < U32(48) { return int16((*Parse)(unsafe.Pointer(pParse)).FnQueryLoop) } return int16(48) }() nFrom = 1 if nOrderBy != 0 { (*WherePath)(unsafe.Pointer(aFrom)).FisOrdered = func() int8 { if nLoop > 0 { return int8(-1) } return int8(nOrderBy) }() } for iLoop = 0; iLoop < nLoop; iLoop++ { nTo = 0 ii = 0 pFrom = aFrom __4: if !(ii < nFrom) { goto __6 } { for pWLoop = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops; pWLoop != 0; pWLoop = (*WhereLoop)(unsafe.Pointer(pWLoop)).FpNextLoop { var nOut LogEst var rCost LogEst var rUnsorted LogEst var isOrdered I8 var maskNew Bitmask if (*WhereLoop)(unsafe.Pointer(pWLoop)).Fprereq & ^(*WherePath)(unsafe.Pointer(pFrom)).FmaskLoop != uint64(0) { continue } if (*WhereLoop)(unsafe.Pointer(pWLoop)).FmaskSelf&(*WherePath)(unsafe.Pointer(pFrom)).FmaskLoop != uint64(0) { continue } if (*WhereLoop)(unsafe.Pointer(pWLoop)).FwsFlags&U32(WHERE_AUTO_INDEX) != U32(0) && int32((*WherePath)(unsafe.Pointer(pFrom)).FnRow) < 3 { continue } rUnsorted = Xsqlite3LogEstAdd(tls, (*WhereLoop)(unsafe.Pointer(pWLoop)).FrSetup, int16(int32((*WhereLoop)(unsafe.Pointer(pWLoop)).FrRun)+int32((*WherePath)(unsafe.Pointer(pFrom)).FnRow))) rUnsorted = Xsqlite3LogEstAdd(tls, rUnsorted, (*WherePath)(unsafe.Pointer(pFrom)).FrUnsorted) nOut = LogEst(int32((*WherePath)(unsafe.Pointer(pFrom)).FnRow) + int32((*WhereLoop)(unsafe.Pointer(pWLoop)).FnOut)) maskNew = (*WherePath)(unsafe.Pointer(pFrom)).FmaskLoop | (*WhereLoop)(unsafe.Pointer(pWLoop)).FmaskSelf isOrdered = (*WherePath)(unsafe.Pointer(pFrom)).FisOrdered if int32(isOrdered) < 0 { *(*Bitmask)(unsafe.Pointer(bp)) = uint64(0) isOrdered = wherePathSatisfiesOrderBy(tls, pWInfo, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy, pFrom, (*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags, uint16(iLoop), pWLoop, bp) } else { *(*Bitmask)(unsafe.Pointer(bp)) = (*WherePath)(unsafe.Pointer(pFrom)).FrevLoop } if int32(isOrdered) >= 0 && int32(isOrdered) < nOrderBy { if int32(*(*LogEst)(unsafe.Pointer(aSortCost + uintptr(isOrdered)*2))) == 0 { *(*LogEst)(unsafe.Pointer(aSortCost + uintptr(isOrdered)*2)) = whereSortingCost(tls, pWInfo, nRowEst, nOrderBy, int32(isOrdered)) } rCost = LogEst(int32(Xsqlite3LogEstAdd(tls, rUnsorted, *(*LogEst)(unsafe.Pointer(aSortCost + uintptr(isOrdered)*2)))) + 3) } else { rCost = rUnsorted rUnsorted = int16(int32(rUnsorted) - 2) } if iLoop == 0 && (*WhereLoop)(unsafe.Pointer(pWLoop)).FwsFlags&U32(WHERE_VIEWSCAN) != U32(0) { rCost = int16(int32(rCost) + -10) nOut = int16(int32(nOut) + -30) } jj = 0 pTo = aTo __7: if !(jj < nTo) { goto __9 } { if (*WherePath)(unsafe.Pointer(pTo)).FmaskLoop == maskNew && (int32((*WherePath)(unsafe.Pointer(pTo)).FisOrdered)^int32(isOrdered))&0x80 == 0 { goto __9 } } goto __8 __8: jj++ pTo += 32 goto __7 goto __9 __9: ; if jj >= nTo { if nTo >= mxChoice && (int32(rCost) > int32(mxCost) || int32(rCost) == int32(mxCost) && int32(rUnsorted) >= int32(mxUnsorted)) { continue } if nTo < mxChoice { jj = libc.PostIncInt32(&nTo, 1) } else { jj = mxI } pTo = aTo + uintptr(jj)*32 } else { if int32((*WherePath)(unsafe.Pointer(pTo)).FrCost) < int32(rCost) || int32((*WherePath)(unsafe.Pointer(pTo)).FrCost) == int32(rCost) && (int32((*WherePath)(unsafe.Pointer(pTo)).FnRow) < int32(nOut) || int32((*WherePath)(unsafe.Pointer(pTo)).FnRow) == int32(nOut) && int32((*WherePath)(unsafe.Pointer(pTo)).FrUnsorted) <= int32(rUnsorted)) { continue } } (*WherePath)(unsafe.Pointer(pTo)).FmaskLoop = (*WherePath)(unsafe.Pointer(pFrom)).FmaskLoop | (*WhereLoop)(unsafe.Pointer(pWLoop)).FmaskSelf (*WherePath)(unsafe.Pointer(pTo)).FrevLoop = *(*Bitmask)(unsafe.Pointer(bp)) (*WherePath)(unsafe.Pointer(pTo)).FnRow = nOut (*WherePath)(unsafe.Pointer(pTo)).FrCost = rCost (*WherePath)(unsafe.Pointer(pTo)).FrUnsorted = rUnsorted (*WherePath)(unsafe.Pointer(pTo)).FisOrdered = isOrdered libc.Xmemcpy(tls, (*WherePath)(unsafe.Pointer(pTo)).FaLoop, (*WherePath)(unsafe.Pointer(pFrom)).FaLoop, uint64(unsafe.Sizeof(uintptr(0)))*uint64(iLoop)) *(*uintptr)(unsafe.Pointer((*WherePath)(unsafe.Pointer(pTo)).FaLoop + uintptr(iLoop)*8)) = pWLoop if nTo >= mxChoice { mxI = 0 mxCost = (*WherePath)(unsafe.Pointer(aTo)).FrCost mxUnsorted = (*WherePath)(unsafe.Pointer(aTo)).FnRow jj = 1 pTo = aTo + 1*32 __10: if !(jj < mxChoice) { goto __12 } { if int32((*WherePath)(unsafe.Pointer(pTo)).FrCost) > int32(mxCost) || int32((*WherePath)(unsafe.Pointer(pTo)).FrCost) == int32(mxCost) && int32((*WherePath)(unsafe.Pointer(pTo)).FrUnsorted) > int32(mxUnsorted) { mxCost = (*WherePath)(unsafe.Pointer(pTo)).FrCost mxUnsorted = (*WherePath)(unsafe.Pointer(pTo)).FrUnsorted mxI = jj } } goto __11 __11: jj++ pTo += 32 goto __10 goto __12 __12: } } } goto __5 __5: ii++ pFrom += 32 goto __4 goto __6 __6: ; pFrom = aTo aTo = aFrom aFrom = pFrom nFrom = nTo } if nFrom == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+23420, 0) Xsqlite3DbFreeNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pSpace) return SQLITE_ERROR } pFrom = aFrom for ii = 1; ii < nFrom; ii++ { if int32((*WherePath)(unsafe.Pointer(pFrom)).FrCost) > int32((*WherePath)(unsafe.Pointer(aFrom+uintptr(ii)*32)).FrCost) { pFrom = aFrom + uintptr(ii)*32 } } for iLoop = 0; iLoop < nLoop; iLoop++ { var pLevel uintptr = pWInfo + 856 + uintptr(iLoop)*104 (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop = libc.AssignUintptr(&pWLoop, *(*uintptr)(unsafe.Pointer((*WherePath)(unsafe.Pointer(pFrom)).FaLoop + uintptr(iLoop)*8))) (*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom = (*WhereLoop)(unsafe.Pointer(pWLoop)).FiTab (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur = (*SrcItem)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104)).FiCursor } if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_WANT_DISTINCT != 0 && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_DISTINCTBY == 0 && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct) == WHERE_DISTINCT_NOOP && nRowEst != 0 { var rc int32 = int32(wherePathSatisfiesOrderBy(tls, pWInfo, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpResultSet, pFrom, uint16(WHERE_DISTINCTBY), uint16(nLoop-1), *(*uintptr)(unsafe.Pointer((*WherePath)(unsafe.Pointer(pFrom)).FaLoop + uintptr(nLoop-1)*8)), bp+8)) if rc == (*ExprList)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpResultSet)).FnExpr { (*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct = U8(WHERE_DISTINCT_ORDERED) } } libc.SetBitFieldPtr8Uint32(pWInfo+68, uint32(0), 2, 0x4) if (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy != 0 { (*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat = (*WherePath)(unsafe.Pointer(pFrom)).FisOrdered if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_DISTINCTBY != 0 { if int32((*WherePath)(unsafe.Pointer(pFrom)).FisOrdered) == (*ExprList)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy)).FnExpr { (*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct = U8(WHERE_DISTINCT_ORDERED) } if (*Select)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect)).FpOrderBy != 0 && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat) > (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect)).FpOrderBy)).FnExpr { (*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat = I8((*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect)).FpOrderBy)).FnExpr) } } else { (*WhereInfo)(unsafe.Pointer(pWInfo)).FrevMask = (*WherePath)(unsafe.Pointer(pFrom)).FrevLoop if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat) <= 0 { (*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat = int8(0) if nLoop > 0 { var wsFlags U32 = (*WhereLoop)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*WherePath)(unsafe.Pointer(pFrom)).FaLoop + uintptr(nLoop-1)*8)))).FwsFlags if wsFlags&U32(WHERE_ONEROW) == U32(0) && wsFlags&U32(WHERE_IPK|WHERE_COLUMN_IN) != U32(WHERE_IPK|WHERE_COLUMN_IN) { *(*Bitmask)(unsafe.Pointer(bp + 16)) = uint64(0) var rc int32 = int32(wherePathSatisfiesOrderBy(tls, pWInfo, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy, pFrom, uint16(WHERE_ORDERBY_LIMIT), uint16(nLoop-1), *(*uintptr)(unsafe.Pointer((*WherePath)(unsafe.Pointer(pFrom)).FaLoop + uintptr(nLoop-1)*8)), bp+16)) if rc == (*ExprList)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy)).FnExpr { libc.SetBitFieldPtr8Uint32(pWInfo+68, uint32(1), 2, 0x4) (*WhereInfo)(unsafe.Pointer(pWInfo)).FrevMask = *(*Bitmask)(unsafe.Pointer(bp + 16)) } } } } else if nLoop != 0 && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat) == 1 && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX) != 0 { libc.SetBitFieldPtr8Uint32(pWInfo+68, uint32(1), 2, 0x4) } } if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_SORTBYGROUP != 0 && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat) == (*ExprList)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy)).FnExpr && nLoop > 0 { *(*Bitmask)(unsafe.Pointer(bp + 24)) = uint64(0) var nOrder int32 = int32(wherePathSatisfiesOrderBy(tls, pWInfo, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy, pFrom, uint16(0), uint16(nLoop-1), *(*uintptr)(unsafe.Pointer((*WherePath)(unsafe.Pointer(pFrom)).FaLoop + uintptr(nLoop-1)*8)), bp+24)) if nOrder == (*ExprList)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy)).FnExpr { libc.SetBitFieldPtr8Uint32(pWInfo+68, uint32(1), 3, 0x8) (*WhereInfo)(unsafe.Pointer(pWInfo)).FrevMask = *(*Bitmask)(unsafe.Pointer(bp + 24)) } } } (*WhereInfo)(unsafe.Pointer(pWInfo)).FnRowOut = (*WherePath)(unsafe.Pointer(pFrom)).FnRow Xsqlite3DbFreeNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pSpace) return SQLITE_OK } func whereShortCut(tls *libc.TLS, pBuilder uintptr) int32 { bp := tls.Alloc(112) defer tls.Free(112) var pWInfo uintptr var pItem uintptr var pWC uintptr var pTerm uintptr var pLoop uintptr var iCur int32 var j int32 var pTab uintptr var pIdx uintptr pWInfo = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpWInfo if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_OR_SUBCLAUSE != 0 { return 0 } pItem = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 pTab = (*SrcItem)(unsafe.Pointer(pItem)).FpTab if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { return 0 } if uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x2>>1)) != 0 || uint32(int32(*(*uint16)(unsafe.Pointer(pItem + 60 + 4))&0x1>>0)) != 0 { return 0 } iCur = (*SrcItem)(unsafe.Pointer(pItem)).FiCursor pWC = pWInfo + 104 pLoop = (*WhereLoopBuilder)(unsafe.Pointer(pBuilder)).FpNew (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags = U32(0) (*WhereLoop)(unsafe.Pointer(pLoop)).FnSkip = U16(0) pTerm = whereScanInit(tls, bp, pWC, iCur, -1, uint32(WO_EQ|WO_IS), uintptr(0)) for pTerm != 0 && (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight != 0 { pTerm = whereScanNext(tls, bp) } if pTerm != 0 { (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags = U32(WHERE_COLUMN_EQ | WHERE_IPK | WHERE_ONEROW) *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm)) = pTerm (*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm = U16(1) *(*U16)(unsafe.Pointer(pLoop + 24)) = U16(1) (*WhereLoop)(unsafe.Pointer(pLoop)).FrRun = int16(33) } else { for pIdx = (*Table)(unsafe.Pointer(pTab)).FpIndex; pIdx != 0; pIdx = (*Index)(unsafe.Pointer(pIdx)).FpNext { var opMask int32 if !(int32((*Index)(unsafe.Pointer(pIdx)).FonError) != OE_None) || (*Index)(unsafe.Pointer(pIdx)).FpPartIdxWhere != uintptr(0) || int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) > int32(uint64(unsafe.Sizeof([3]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0)))) { continue } if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x8>>3)) != 0 { opMask = WO_EQ | WO_IS } else { opMask = WO_EQ } for j = 0; j < int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol); j++ { pTerm = whereScanInit(tls, bp, pWC, iCur, j, uint32(opMask), pIdx) for pTerm != 0 && (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqRight != 0 { pTerm = whereScanNext(tls, bp) } if pTerm == uintptr(0) { break } *(*uintptr)(unsafe.Pointer((*WhereLoop)(unsafe.Pointer(pLoop)).FaLTerm + uintptr(j)*8)) = pTerm } if j != int32((*Index)(unsafe.Pointer(pIdx)).FnKeyCol) { continue } (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags = U32(WHERE_COLUMN_EQ | WHERE_ONEROW | WHERE_INDEXED) if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x20>>5)) != 0 || (*SrcItem)(unsafe.Pointer(pItem)).FcolUsed&(*Index)(unsafe.Pointer(pIdx)).FcolNotIdxed == uint64(0) { *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_IDX_ONLY) } (*WhereLoop)(unsafe.Pointer(pLoop)).FnLTerm = U16(j) *(*U16)(unsafe.Pointer(pLoop + 24)) = U16(j) *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) = pIdx (*WhereLoop)(unsafe.Pointer(pLoop)).FrRun = int16(39) break } } if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags != 0 { (*WhereLoop)(unsafe.Pointer(pLoop)).FnOut = int16(1) (*WhereLevel)(unsafe.Pointer(pWInfo + 856)).FpWLoop = pLoop (*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf = uint64(1) (*WhereLevel)(unsafe.Pointer(pWInfo + 856)).FiTabCur = iCur (*WhereInfo)(unsafe.Pointer(pWInfo)).FnRowOut = int16(1) if (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy != 0 { (*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat = I8((*ExprList)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy)).FnExpr) } if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_WANT_DISTINCT != 0 { (*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct = U8(WHERE_DISTINCT_UNIQUE) } if int32((*WhereScan)(unsafe.Pointer(bp)).FiEquiv) > 1 { *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_TRANSCONS) } return 1 } return 0 } func exprNodeIsDeterministic(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_FUNCTION && libc.Bool32((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_ConstFunc) != U32(0)) == 0 { (*Walker)(unsafe.Pointer(pWalker)).FeCode = U16(0) return WRC_Abort } return WRC_Continue } func exprIsDeterministic(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FeCode = U16(1) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{exprNodeIsDeterministic})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3SelectWalkFail})) Xsqlite3WalkExpr(tls, bp, p) return int32((*Walker)(unsafe.Pointer(bp)).FeCode) } func whereOmitNoopJoin(tls *libc.TLS, pWInfo uintptr, notReady Bitmask) Bitmask { var i int32 var tabUsed Bitmask tabUsed = Xsqlite3WhereExprListUsage(tls, pWInfo+592, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpResultSet) if (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy != 0 { tabUsed = tabUsed | Xsqlite3WhereExprListUsage(tls, pWInfo+592, (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy) } for i = int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) - 1; i >= 1; i-- { var pTerm uintptr var pEnd uintptr var pItem uintptr var pLoop uintptr pLoop = (*WhereLevel)(unsafe.Pointer(pWInfo + 856 + uintptr(i)*104)).FpWLoop pItem = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLoop)(unsafe.Pointer(pLoop)).FiTab)*104 if int32((*SrcItem)(unsafe.Pointer(pItem)).Ffg.Fjointype)&(JT_LEFT|JT_RIGHT) != JT_LEFT { continue } if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_WANT_DISTINCT == 0 && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_ONEROW) == U32(0) { continue } if tabUsed&(*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf != uint64(0) { continue } pEnd = (*WhereInfo)(unsafe.Pointer(pWInfo)).FsWC.Fa + uintptr((*WhereInfo)(unsafe.Pointer(pWInfo)).FsWC.FnTerm)*56 for pTerm = (*WhereInfo)(unsafe.Pointer(pWInfo)).FsWC.Fa; pTerm < pEnd; pTerm += 56 { if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll&(*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf != uint64(0) { if !((*Expr)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr)).Fflags&U32(EP_OuterON) != U32(0)) || *(*int32)(unsafe.Pointer((*WhereTerm)(unsafe.Pointer(pTerm)).FpExpr + 52)) != (*SrcItem)(unsafe.Pointer(pItem)).FiCursor { break } } } if pTerm < pEnd { continue } notReady = notReady & ^(*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf for pTerm = (*WhereInfo)(unsafe.Pointer(pWInfo)).FsWC.Fa; pTerm < pEnd; pTerm += 56 { if (*WhereTerm)(unsafe.Pointer(pTerm)).FprereqAll&(*WhereLoop)(unsafe.Pointer(pLoop)).FmaskSelf != uint64(0) { *(*U16)(unsafe.Pointer(pTerm + 18)) |= U16(TERM_CODED) } } if i != int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel)-1 { var nByte int32 = int32(uint64(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel)-1-i) * uint64(unsafe.Sizeof(WhereLevel{}))) libc.Xmemmove(tls, pWInfo+856+uintptr(i)*104, pWInfo+856+uintptr(i+1)*104, uint64(nByte)) } (*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel-- } return notReady } func whereCheckIfBloomFilterIsUseful(tls *libc.TLS, pWInfo uintptr) { var i int32 var nSearch LogEst = int16(0) for i = 0; i < int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel); i++ { var pLoop uintptr = (*WhereLevel)(unsafe.Pointer(pWInfo + 856 + uintptr(i)*104)).FpWLoop var reqFlags uint32 = uint32(WHERE_SELFCULL | WHERE_COLUMN_EQ) var pItem uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList + 8 + uintptr((*WhereLoop)(unsafe.Pointer(pLoop)).FiTab)*104 var pTab uintptr = (*SrcItem)(unsafe.Pointer(pItem)).FpTab if (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasStat1) == U32(0) { break } *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_StatsUsed) if i >= 1 && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&reqFlags == reqFlags && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IPK|WHERE_INDEXED) != U32(0) { if int32(nSearch) > int32((*Table)(unsafe.Pointer(pTab)).FnRowLogEst) { *(*U32)(unsafe.Pointer(pLoop + 56)) |= U32(WHERE_BLOOMFILTER) *(*U32)(unsafe.Pointer(pLoop + 56)) &= libc.Uint32FromInt32(libc.CplInt32(WHERE_IDX_ONLY)) } } nSearch = LogEst(int32(nSearch) + int32((*WhereLoop)(unsafe.Pointer(pLoop)).FnOut)) } } func whereIndexedExprCleanup(tls *libc.TLS, db uintptr, pObject uintptr) { var pParse uintptr = pObject for (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr != uintptr(0) { var p uintptr = (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr = (*IndexedExpr)(unsafe.Pointer(p)).FpIENext Xsqlite3ExprDelete(tls, db, (*IndexedExpr)(unsafe.Pointer(p)).FpExpr) Xsqlite3DbFreeNN(tls, db, p) } } func whereAddIndexedExpr(tls *libc.TLS, pParse uintptr, pIdx uintptr, iIdxCur int32, pTabItem uintptr) { var i int32 var p uintptr var pTab uintptr pTab = (*Index)(unsafe.Pointer(pIdx)).FpTable for i = 0; i < int32((*Index)(unsafe.Pointer(pIdx)).FnColumn); i++ { var pExpr uintptr var j int32 = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiColumn + uintptr(i)*2))) var bMaybeNullRow int32 if j == -2 { pExpr = (*ExprList_item)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaColExpr + 8 + uintptr(i)*32)).FpExpr bMaybeNullRow = libc.Bool32(int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&(JT_LEFT|JT_LTORJ|JT_RIGHT) != 0) } else if j >= 0 && int32((*Column)(unsafe.Pointer((*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24)).FcolFlags)&COLFLAG_VIRTUAL != 0 { pExpr = Xsqlite3ColumnExpr(tls, pTab, (*Table)(unsafe.Pointer(pTab)).FaCol+uintptr(j)*24) bMaybeNullRow = 0 } else { continue } if Xsqlite3ExprIsConstant(tls, pExpr) != 0 { continue } p = Xsqlite3DbMallocRaw(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(IndexedExpr{}))) if p == uintptr(0) { break } (*IndexedExpr)(unsafe.Pointer(p)).FpIENext = (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr (*IndexedExpr)(unsafe.Pointer(p)).FpExpr = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr, 0) (*IndexedExpr)(unsafe.Pointer(p)).FiDataCur = (*SrcItem)(unsafe.Pointer(pTabItem)).FiCursor (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCur = iIdxCur (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCol = i (*IndexedExpr)(unsafe.Pointer(p)).FbMaybeNullRow = U8(bMaybeNullRow) if Xsqlite3IndexAffinityStr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pIdx) != 0 { (*IndexedExpr)(unsafe.Pointer(p)).Faff = U8(*(*int8)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FzColAff + uintptr(i)))) } (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr = p if (*IndexedExpr)(unsafe.Pointer(p)).FpIENext == uintptr(0) { Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{whereIndexedExprCleanup})), pParse) } } } // Generate the beginning of the loop used for WHERE clause processing. // The return value is a pointer to an opaque structure that contains // information needed to terminate the loop. Later, the calling routine // should invoke sqlite3WhereEnd() with the return value of this function // in order to complete the WHERE clause processing. // // If an error occurs, this routine returns NULL. // // The basic idea is to do a nested loop, one loop for each table in // the FROM clause of a select. (INSERT and UPDATE statements are the // same as a SELECT with only a single table in the FROM clause.) For // example, if the SQL is this: // // SELECT * FROM t1, t2, t3 WHERE ...; // // Then the code generated is conceptually like the following: // // foreach row1 in t1 do \ Code generated // foreach row2 in t2 do |-- by sqlite3WhereBegin() // foreach row3 in t3 do / // ... // end \ Code generated // end |-- by sqlite3WhereEnd() // end / // // Note that the loops might not be nested in the order in which they // appear in the FROM clause if a different order is better able to make // use of indices. Note also that when the IN operator appears in // the WHERE clause, it might result in additional nested loops for // scanning through all values on the right-hand side of the IN. // // There are Btree cursors associated with each table. t1 uses cursor // number pTabList->a[0].iCursor. t2 uses the cursor pTabList->a[1].iCursor. // And so forth. This routine generates code to open those VDBE cursors // and sqlite3WhereEnd() generates the code to close them. // // The code that sqlite3WhereBegin() generates leaves the cursors named // in pTabList pointing at their appropriate entries. The [...] code // can use OP_Column and OP_Rowid opcodes on these cursors to extract // data from the various tables of the loop. // // If the WHERE clause is empty, the foreach loops must each scan their // entire tables. Thus a three-way join is an O(N^3) operation. But if // the tables have indices and there are terms in the WHERE clause that // refer to those indices, a complete table scan can be avoided and the // code will run much faster. Most of the work of this routine is checking // to see if there are indices that can be used to speed up the loop. // // Terms of the WHERE clause are also used to limit which rows actually // make it to the "..." in the middle of the loop. After each "foreach", // terms of the WHERE clause that use only terms in that loop and outer // loops are evaluated and if false a jump is made around all subsequent // inner loops (or around the "..." if the test occurs within the inner- // most loop) // // # OUTER JOINS // // An outer join of tables t1 and t2 is conceptally coded as follows: // // foreach row1 in t1 do // flag = 0 // foreach row2 in t2 do // start: // ... // flag = 1 // end // if flag==0 then // move the row2 cursor to a null row // goto start // fi // end // // # ORDER BY CLAUSE PROCESSING // // pOrderBy is a pointer to the ORDER BY clause (or the GROUP BY clause // if the WHERE_GROUPBY flag is set in wctrlFlags) of a SELECT statement // if there is one. If there is no ORDER BY clause or if this routine // is called from an UPDATE or DELETE statement, then pOrderBy is NULL. // // The iIdxCur parameter is the cursor number of an index. If // WHERE_OR_SUBCLAUSE is set, iIdxCur is the cursor number of an index // to use for OR clause processing. The WHERE clause should use this // specific cursor. If WHERE_ONEPASS_DESIRED is set, then iIdxCur is // the first cursor in an array of cursors for all indices. iIdxCur should // be used to compute the appropriate cursor depending on which index is // used. func Xsqlite3WhereBegin(tls *libc.TLS, pParse uintptr, pTabList uintptr, pWhere uintptr, pOrderBy uintptr, pResultSet uintptr, pSelect uintptr, wctrlFlags U16, iAuxArg int32) uintptr { bp := tls.Alloc(64) defer tls.Free(64) var nByteWInfo int32 var nTabList int32 var pWInfo uintptr var v uintptr var notReady Bitmask var pMaskSet uintptr var pLevel uintptr var pLoop uintptr var ii int32 var db uintptr var rc int32 var bFordelete U8 var pT uintptr var p uintptr var wsFlags int32 var bOnerow int32 var pVTab uintptr var iCur int32 var b Bitmask var n int32 var op int32 var pJ uintptr var pIx uintptr var iIndexCur int32 var op1 int32 var pInfo uintptr var pPk uintptr var pRJ uintptr var pTab uintptr var iDb int32 var pTabItem uintptr var iOnce int32 var addrExplain int32 _ = addrExplain var wsFlags1 int32 var pSrc uintptr v = (*Parse)(unsafe.Pointer(pParse)).FpVdbe bFordelete = U8(0) db = (*Parse)(unsafe.Pointer(pParse)).Fdb libc.Xmemset(tls, bp+8, 0, uint64(unsafe.Sizeof(WhereLoopBuilder{}))) if !(pOrderBy != 0 && (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr >= int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))) { goto __1 } pOrderBy = uintptr(0) __1: ; if !((*SrcList)(unsafe.Pointer(pTabList)).FnSrc > int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8))) { goto __2 } Xsqlite3ErrorMsg(tls, pParse, ts+23438, libc.VaList(bp, int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)))) return uintptr(0) __2: ; if int32(wctrlFlags)&WHERE_OR_SUBCLAUSE != 0 { nTabList = 1 } else { nTabList = (*SrcList)(unsafe.Pointer(pTabList)).FnSrc } nByteWInfo = int32(uint64(unsafe.Sizeof(WhereInfo{})) + uint64(nTabList-1)*uint64(unsafe.Sizeof(WhereLevel{}))) pWInfo = Xsqlite3DbMallocRawNN(tls, db, uint64(nByteWInfo)+uint64(unsafe.Sizeof(WhereLoop{}))) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __3 } Xsqlite3DbFree(tls, db, pWInfo) pWInfo = uintptr(0) goto whereBeginError __3: ; (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse = pParse (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList = pTabList (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy = pOrderBy (*WhereInfo)(unsafe.Pointer(pWInfo)).FpResultSet = pResultSet *(*int32)(unsafe.Pointer(pWInfo + 40)) = libc.AssignPtrInt32(pWInfo+40+1*4, -1) (*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel = U8(nTabList) (*WhereInfo)(unsafe.Pointer(pWInfo)).FiBreak = libc.AssignPtrInt32(pWInfo+48, Xsqlite3VdbeMakeLabel(tls, pParse)) (*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags = wctrlFlags (*WhereInfo)(unsafe.Pointer(pWInfo)).FiLimit = LogEst(iAuxArg) (*WhereInfo)(unsafe.Pointer(pWInfo)).FsavedNQueryLoop = int32((*Parse)(unsafe.Pointer(pParse)).FnQueryLoop) (*WhereInfo)(unsafe.Pointer(pWInfo)).FpSelect = pSelect libc.Xmemset(tls, pWInfo+65, 0, uint64(uintptr(0)+104)-uint64(uintptr(0)+65)) libc.Xmemset(tls, pWInfo+856, 0, uint64(unsafe.Sizeof(WhereLoop{}))+uint64(nTabList)*uint64(unsafe.Sizeof(WhereLevel{}))) pMaskSet = pWInfo + 592 (*WhereMaskSet)(unsafe.Pointer(pMaskSet)).Fn = 0 *(*int32)(unsafe.Pointer(pMaskSet + 8)) = -99 (*WhereLoopBuilder)(unsafe.Pointer(bp + 8)).FpWInfo = pWInfo (*WhereLoopBuilder)(unsafe.Pointer(bp + 8)).FpWC = pWInfo + 104 (*WhereLoopBuilder)(unsafe.Pointer(bp + 8)).FpNew = pWInfo + uintptr(nByteWInfo) whereLoopInit(tls, (*WhereLoopBuilder)(unsafe.Pointer(bp+8)).FpNew) Xsqlite3WhereClauseInit(tls, pWInfo+104, pWInfo) Xsqlite3WhereSplit(tls, pWInfo+104, pWhere, uint8(TK_AND)) if !(nTabList == 0) { goto __4 } if !(pOrderBy != 0) { goto __6 } (*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat = I8((*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr) __6: ; if !(int32(wctrlFlags)&WHERE_WANT_DISTINCT != 0 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_DistinctOpt) == U32(0)) { goto __7 } (*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct = U8(WHERE_DISTINCT_UNIQUE) __7: ; Xsqlite3VdbeExplain(tls, pParse, uint8(0), ts+23466, 0) goto __5 __4: ii = 0 __8: createMask(tls, pMaskSet, (*SrcItem)(unsafe.Pointer(pTabList+8+uintptr(ii)*104)).FiCursor) Xsqlite3WhereTabFuncArgs(tls, pParse, pTabList+8+uintptr(ii)*104, pWInfo+104) goto __9 __9: if libc.PreIncInt32(&ii, 1) < (*SrcList)(unsafe.Pointer(pTabList)).FnSrc { goto __8 } goto __10 __10: ; __5: ; Xsqlite3WhereExprAnalyze(tls, pTabList, pWInfo+104) if !(pSelect != 0 && (*Select)(unsafe.Pointer(pSelect)).FpLimit != 0) { goto __11 } Xsqlite3WhereAddLimit(tls, pWInfo+104, pSelect) __11: ; if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __12 } goto whereBeginError __12: ; ii = 0 __13: if !(ii < (*WhereClause)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(bp+8)).FpWC)).FnBase) { goto __15 } pT = (*WhereClause)(unsafe.Pointer((*WhereLoopBuilder)(unsafe.Pointer(bp+8)).FpWC)).Fa + uintptr(ii)*56 if !(int32((*WhereTerm)(unsafe.Pointer(pT)).FwtFlags)&TERM_VIRTUAL != 0) { goto __16 } goto __14 __16: ; if !((*WhereTerm)(unsafe.Pointer(pT)).FprereqAll == uint64(0) && (nTabList == 0 || exprIsDeterministic(tls, (*WhereTerm)(unsafe.Pointer(pT)).FpExpr) != 0)) { goto __17 } Xsqlite3ExprIfFalse(tls, pParse, (*WhereTerm)(unsafe.Pointer(pT)).FpExpr, (*WhereInfo)(unsafe.Pointer(pWInfo)).FiBreak, SQLITE_JUMPIFNULL) *(*U16)(unsafe.Pointer(pT + 18)) |= U16(TERM_CODED) __17: ; goto __14 __14: ii++ goto __13 goto __15 __15: ; if !(int32(wctrlFlags)&WHERE_WANT_DISTINCT != 0) { goto __18 } if !((*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_DistinctOpt) != U32(0)) { goto __19 } wctrlFlags = libc.Uint16FromInt32(int32(wctrlFlags) & libc.CplInt32(WHERE_WANT_DISTINCT)) *(*U16)(unsafe.Pointer(pWInfo + 60)) &= libc.Uint16FromInt32(libc.CplInt32(WHERE_WANT_DISTINCT)) goto __20 __19: if !(isDistinctRedundant(tls, pParse, pTabList, pWInfo+104, pResultSet) != 0) { goto __21 } (*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct = U8(WHERE_DISTINCT_UNIQUE) goto __22 __21: if !(pOrderBy == uintptr(0)) { goto __23 } *(*U16)(unsafe.Pointer(pWInfo + 60)) |= U16(WHERE_DISTINCTBY) (*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy = pResultSet __23: ; __22: ; __20: ; __18: ; if !(nTabList != 1 || whereShortCut(tls, bp+8) == 0) { goto __24 } rc = whereLoopAddAll(tls, bp+8) if !(rc != 0) { goto __25 } goto whereBeginError __25: ; if !(int32((*WhereLoopBuilder)(unsafe.Pointer(bp+8)).FbldFlags2)&SQLITE_BLDF2_2NDPASS != 0) { goto __26 } __27: if !((*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops != 0) { goto __28 } p = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops (*WhereInfo)(unsafe.Pointer(pWInfo)).FpLoops = (*WhereLoop)(unsafe.Pointer(p)).FpNextLoop whereLoopDelete(tls, db, p) goto __27 __28: ; rc = whereLoopAddAll(tls, bp+8) if !(rc != 0) { goto __29 } goto whereBeginError __29: ; __26: ; wherePathSolver(tls, pWInfo, int16(0)) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __30 } goto whereBeginError __30: ; if !((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy != 0) { goto __31 } wherePathSolver(tls, pWInfo, int16(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnRowOut)+1)) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __32 } goto whereBeginError __32: ; __31: ; __24: ; if !((*WhereInfo)(unsafe.Pointer(pWInfo)).FpOrderBy == uintptr(0) && (*Sqlite3)(unsafe.Pointer(db)).Fflags&uint64(SQLITE_ReverseOrder) != uint64(0)) { goto __33 } (*WhereInfo)(unsafe.Pointer(pWInfo)).FrevMask = libc.Uint64(libc.Uint64FromInt32(-1)) __33: ; if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __34 } goto whereBeginError __34: ; notReady = libc.CplUint64(uint64(0)) if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) >= 2 && pResultSet != uintptr(0) && 0 == int32(wctrlFlags)&WHERE_AGG_DISTINCT && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_OmitNoopJoin) == U32(0)) { goto __35 } notReady = whereOmitNoopJoin(tls, pWInfo, notReady) nTabList = int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) __35: ; if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) >= 2 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_BloomFilter) == U32(0)) { goto __36 } whereCheckIfBloomFilterIsUseful(tls, pWInfo) __36: ; *(*U32)(unsafe.Pointer((*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse + 208)) += U32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnRowOut) if !(int32(wctrlFlags)&WHERE_ONEPASS_DESIRED != 0) { goto __37 } wsFlags = int32((*WhereLoop1)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pWInfo + 856)).FpWLoop)).FwsFlags) bOnerow = libc.Bool32(wsFlags&WHERE_ONEROW != 0) if !(bOnerow != 0 || 0 != int32(wctrlFlags)&WHERE_ONEPASS_MULTIROW && !(int32((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pTabList+8)).FpTab)).FeTabType) == TABTYP_VTAB) && (0 == wsFlags&WHERE_MULTI_OR || int32(wctrlFlags)&WHERE_DUPLICATES_OK != 0)) { goto __38 } (*WhereInfo)(unsafe.Pointer(pWInfo)).FeOnePass = func() uint8 { if bOnerow != 0 { return uint8(ONEPASS_SINGLE) } return uint8(ONEPASS_MULTI) }() if !((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pTabList+8)).FpTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) && wsFlags&WHERE_IDX_ONLY != 0) { goto __39 } if !(int32(wctrlFlags)&WHERE_ONEPASS_MULTIROW != 0) { goto __40 } bFordelete = U8(OPFLAG_FORDELETE) __40: ; (*WhereLoop1)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pWInfo + 856)).FpWLoop)).FwsFlags = U32(wsFlags & libc.CplInt32(WHERE_IDX_ONLY)) __39: ; __38: ; __37: ; ii = 0 pLevel = pWInfo + 856 __41: if !(ii < nTabList) { goto __43 } pTabItem = pTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 pTab = (*SrcItem)(unsafe.Pointer(pTabItem)).FpTab iDb = Xsqlite3SchemaToIndex(tls, db, (*Table)(unsafe.Pointer(pTab)).FpSchema) pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Ephemeral) != U32(0) || int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __44 } goto __45 __44: if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_VIRTUALTABLE) != U32(0)) { goto __46 } pVTab = Xsqlite3GetVTable(tls, db, pTab) iCur = (*SrcItem)(unsafe.Pointer(pTabItem)).FiCursor Xsqlite3VdbeAddOp4(tls, v, OP_VOpen, iCur, 0, 0, pVTab, -11) goto __47 __46: if !(int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB) { goto __48 } goto __49 __48: if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IDX_ONLY) == U32(0) && int32(wctrlFlags)&WHERE_OR_SUBCLAUSE == 0 || int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&(JT_LTORJ|JT_RIGHT) != 0) { goto __50 } op = OP_OpenRead if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeOnePass) != ONEPASS_OFF) { goto __52 } op = OP_OpenWrite *(*int32)(unsafe.Pointer(pWInfo + 40)) = (*SrcItem)(unsafe.Pointer(pTabItem)).FiCursor __52: ; Xsqlite3OpenTable(tls, pParse, (*SrcItem)(unsafe.Pointer(pTabItem)).FiCursor, iDb, pTab, op) if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeOnePass) == ONEPASS_OFF && int32((*Table)(unsafe.Pointer(pTab)).FnCol) < int32(uint64(unsafe.Sizeof(Bitmask(0)))*uint64(8)) && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_HasGenerated|TF_WithoutRowid) == U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_AUTO_INDEX|WHERE_BLOOMFILTER) == U32(0)) { goto __53 } b = (*SrcItem)(unsafe.Pointer(pTabItem)).FcolUsed n = 0 __54: if !(b != 0) { goto __56 } goto __55 __55: b = b >> 1 n++ goto __54 goto __56 __56: ; Xsqlite3VdbeChangeP4(tls, v, -1, uintptr(int64(n)), -3) __53: ; Xsqlite3VdbeChangeP5(tls, v, uint16(bFordelete)) goto __51 __50: Xsqlite3TableLock(tls, pParse, iDb, (*Table)(unsafe.Pointer(pTab)).Ftnum, uint8(0), (*Table)(unsafe.Pointer(pTab)).FzName) __51: ; __49: ; __47: ; __45: ; if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_INDEXED) != 0) { goto __57 } pIx = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) op1 = OP_OpenRead if !(!((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) && int32(*(*uint16)(unsafe.Pointer(pIx + 100))&0x3>>0) == SQLITE_IDXTYPE_PRIMARYKEY && int32(wctrlFlags)&WHERE_OR_SUBCLAUSE != 0) { goto __58 } iIndexCur = (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur op1 = 0 goto __59 __58: if !(int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeOnePass) != ONEPASS_OFF) { goto __60 } pJ = (*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pTabItem)).FpTab)).FpIndex iIndexCur = iAuxArg __62: if !(pJ != 0 && pJ != pIx) { goto __63 } iIndexCur++ pJ = (*Index)(unsafe.Pointer(pJ)).FpNext goto __62 __63: ; op1 = OP_OpenWrite *(*int32)(unsafe.Pointer(pWInfo + 40 + 1*4)) = iIndexCur goto __61 __60: if !(iAuxArg != 0 && int32(wctrlFlags)&WHERE_OR_SUBCLAUSE != 0) { goto __64 } iIndexCur = iAuxArg op1 = OP_ReopenIdx goto __65 __64: iIndexCur = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) if !(uint32(int32(*(*uint16)(unsafe.Pointer(pIx + 100))&0x800>>11)) != 0 && (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags&U32(SQLITE_IndexedExpr) == U32(0)) { goto __66 } whereAddIndexedExpr(tls, pParse, pIx, iIndexCur, pTabItem) __66: ; __65: ; __61: ; __59: ; (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur = iIndexCur if !(op1 != 0) { goto __67 } Xsqlite3VdbeAddOp3(tls, v, op1, iIndexCur, int32((*Index)(unsafe.Pointer(pIx)).Ftnum), iDb) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pIx) if !((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_CONSTRAINT) != U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_COLUMN_RANGE|WHERE_SKIPSCAN) == U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_BIGNULL_SORT) == U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_SEEKSCAN) == U32(0) && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FwctrlFlags)&WHERE_ORDERBY_MIN == 0 && int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct) != WHERE_DISTINCT_ORDERED) { goto __68 } Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_SEEKEQ)) __68: ; __67: ; __57: ; if !(iDb >= 0) { goto __69 } Xsqlite3CodeVerifySchema(tls, pParse, iDb) __69: ; if !(int32((*SrcItem)(unsafe.Pointer(pTabItem)).Ffg.Fjointype)&JT_RIGHT != 0 && libc.AssignPtrUintptr(pLevel+48, Xsqlite3WhereMalloc(tls, pWInfo, uint64(unsafe.Sizeof(WhereRightJoin{})))) != uintptr(0)) { goto __70 } pRJ = (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ (*WhereRightJoin)(unsafe.Pointer(pRJ)).FiMatch = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregBloom = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Blob, 65536, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregBloom) (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregReturn = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregReturn) if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { goto __71 } Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FiMatch, 1) pInfo = Xsqlite3KeyInfoAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, 1, 0) if !(pInfo != 0) { goto __73 } *(*uintptr)(unsafe.Pointer(pInfo + 32)) = uintptr(0) *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pInfo)).FaSortFlags)) = U8(0) Xsqlite3VdbeAppendP4(tls, v, pInfo, -8) __73: ; goto __72 __71: pPk = Xsqlite3PrimaryKeyIndex(tls, pTab) Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FiMatch, int32((*Index)(unsafe.Pointer(pPk)).FnKeyCol)) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pPk) __72: ; *(*U32)(unsafe.Pointer(pLoop + 56)) &= libc.Uint32FromInt32(libc.CplInt32(WHERE_IDX_ONLY)) (*WhereInfo)(unsafe.Pointer(pWInfo)).FnOBSat = int8(0) (*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct = U8(WHERE_DISTINCT_UNORDERED) __70: ; goto __42 __42: ii++ pLevel += 104 goto __41 goto __43 __43: ; (*WhereInfo)(unsafe.Pointer(pWInfo)).FiTop = Xsqlite3VdbeCurrentAddr(tls, v) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __74 } goto whereBeginError __74: ; ii = 0 __75: if !(ii < nTabList) { goto __77 } if !((*Parse)(unsafe.Pointer(pParse)).FnErr != 0) { goto __78 } goto whereBeginError __78: ; pLevel = pWInfo + 856 + uintptr(ii)*104 wsFlags1 = int32((*WhereLoop1)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop)).FwsFlags) pSrc = pTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 if !(uint32(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x10>>4)) != 0) { goto __79 } if !(uint32(int32(*(*uint16)(unsafe.Pointer(pSrc + 60 + 4))&0x8>>3)) != 0) { goto __80 } Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*SrcItem)(unsafe.Pointer(pSrc)).FregReturn, (*SrcItem)(unsafe.Pointer(pSrc)).FaddrFillSub) goto __81 __80: iOnce = Xsqlite3VdbeAddOp0(tls, v, OP_Once) Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*SrcItem)(unsafe.Pointer(pSrc)).FregReturn, (*SrcItem)(unsafe.Pointer(pSrc)).FaddrFillSub) Xsqlite3VdbeJumpHere(tls, v, iOnce) __81: ; __79: ; if !(wsFlags1&(WHERE_AUTO_INDEX|WHERE_BLOOMFILTER) != 0) { goto __82 } if !(wsFlags1&WHERE_AUTO_INDEX != 0) { goto __83 } constructAutomaticIndex(tls, pParse, pWInfo+104, pTabList+8+uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104, notReady, pLevel) goto __84 __83: sqlite3ConstructBloomFilter(tls, pWInfo, ii, pLevel, notReady) __84: ; if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __85 } goto whereBeginError __85: ; __82: ; addrExplain = Xsqlite3WhereExplainOneScan(tls, pParse, pTabList, pLevel, wctrlFlags) (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBody = Xsqlite3VdbeCurrentAddr(tls, v) notReady = Xsqlite3WhereCodeOneLoopStart(tls, pParse, v, pWInfo, ii, pLevel, notReady) (*WhereInfo)(unsafe.Pointer(pWInfo)).FiContinue = (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont if !(wsFlags1&WHERE_MULTI_OR == 0 && int32(wctrlFlags)&WHERE_OR_SUBCLAUSE == 0) { goto __86 } _ = addrExplain __86: ; goto __76 __76: ii++ goto __75 goto __77 __77: ; (*WhereInfo)(unsafe.Pointer(pWInfo)).FiEndWhere = Xsqlite3VdbeCurrentAddr(tls, v) return pWInfo whereBeginError: if !(pWInfo != 0) { goto __87 } (*Parse)(unsafe.Pointer(pParse)).FnQueryLoop = U32((*WhereInfo)(unsafe.Pointer(pWInfo)).FsavedNQueryLoop) whereInfoFree(tls, db, pWInfo) __87: ; return uintptr(0) } // Generate the end of the WHERE loop. See comments on // sqlite3WhereBegin() for additional information. func Xsqlite3WhereEnd(tls *libc.TLS, pWInfo uintptr) { var pParse uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpParse var v uintptr = (*Parse)(unsafe.Pointer(pParse)).FpVdbe var i int32 var pLevel uintptr var pLoop uintptr var pTabList uintptr = (*WhereInfo)(unsafe.Pointer(pWInfo)).FpTabList var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var iEnd int32 = Xsqlite3VdbeCurrentAddr(tls, v) var nRJ int32 = 0 for i = int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel) - 1; i >= 0; i-- { var addr int32 pLevel = pWInfo + 856 + uintptr(i)*104 if (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ != 0 { var pRJ uintptr = (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ Xsqlite3VdbeResolveLabel(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont) (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont = 0 (*WhereRightJoin)(unsafe.Pointer(pRJ)).FendSubrtn = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp3(tls, v, OP_Return, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FregReturn, (*WhereRightJoin)(unsafe.Pointer(pRJ)).FaddrSubrtn, 1) nRJ++ } pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop if int32((*WhereLevel)(unsafe.Pointer(pLevel)).Fop) != OP_Noop { var addrSeek int32 = 0 var pIdx uintptr var n int32 if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeDistinct) == WHERE_DISTINCT_ORDERED && i == int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel)-1 && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_INDEXED) != U32(0) && uint32(int32(*(*uint16)(unsafe.Pointer(libc.AssignUintptr(&pIdx, *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8))) + 100))&0x80>>7)) != 0 && libc.AssignInt32(&n, int32(*(*U16)(unsafe.Pointer(pLoop + 24 + 6)))) > 0 && int32(*(*LogEst)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FaiRowLogEst + uintptr(n)*2))) >= 36 { var r1 int32 = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 var j int32 var op int32 for j = 0; j < n; j++ { Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur, j, r1+j) } *(*int32)(unsafe.Pointer(pParse + 56)) += n + 1 if int32((*WhereLevel)(unsafe.Pointer(pLevel)).Fop) == OP_Prev { op = OP_SeekLT } else { op = OP_SeekGT } addrSeek = Xsqlite3VdbeAddOp4Int(tls, v, op, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur, 0, r1, n) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 1, (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2) } if (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont != 0 { Xsqlite3VdbeResolveLabel(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont) } Xsqlite3VdbeAddOp3(tls, v, int32((*WhereLevel)(unsafe.Pointer(pLevel)).Fop), (*WhereLevel)(unsafe.Pointer(pLevel)).Fp1, (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2, int32((*WhereLevel)(unsafe.Pointer(pLevel)).Fp3)) Xsqlite3VdbeChangeP5(tls, v, uint16((*WhereLevel)(unsafe.Pointer(pLevel)).Fp5)) if (*WhereLevel)(unsafe.Pointer(pLevel)).FregBignull != 0 { Xsqlite3VdbeResolveLabel(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBignull) Xsqlite3VdbeAddOp2(tls, v, OP_DecrJumpZero, (*WhereLevel)(unsafe.Pointer(pLevel)).FregBignull, (*WhereLevel)(unsafe.Pointer(pLevel)).Fp2-1) } if addrSeek != 0 { Xsqlite3VdbeJumpHere(tls, v, addrSeek) } } else if (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont != 0 { Xsqlite3VdbeResolveLabel(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrCont) } if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_ABLE) != U32(0) && *(*int32)(unsafe.Pointer(pLevel + 72)) > 0 { var pIn uintptr var j int32 Xsqlite3VdbeResolveLabel(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrNxt) j = *(*int32)(unsafe.Pointer(pLevel + 72)) pIn = *(*uintptr)(unsafe.Pointer(pLevel + 72 + 8)) + uintptr(j-1)*20 __1: if !(j > 0) { goto __3 } { Xsqlite3VdbeJumpHere(tls, v, *(*int32)(unsafe.Pointer(pIn + 4))+1) if int32(*(*U8)(unsafe.Pointer(pIn + 16))) != OP_Noop { if *(*int32)(unsafe.Pointer(pIn + 12)) != 0 { var bEarlyOut int32 = libc.Bool32((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_VIRTUALTABLE) == U32(0) && (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_IN_EARLYOUT) != U32(0)) if (*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_IfNotOpen, *(*int32)(unsafe.Pointer(pIn)), Xsqlite3VdbeCurrentAddr(tls, v)+2+bEarlyOut) } if bEarlyOut != 0 { Xsqlite3VdbeAddOp4Int(tls, v, OP_IfNoHope, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur, Xsqlite3VdbeCurrentAddr(tls, v)+2, *(*int32)(unsafe.Pointer(pIn + 8)), *(*int32)(unsafe.Pointer(pIn + 12))) Xsqlite3VdbeJumpHere(tls, v, *(*int32)(unsafe.Pointer(pIn + 4))+1) } } Xsqlite3VdbeAddOp2(tls, v, int32(*(*U8)(unsafe.Pointer(pIn + 16))), *(*int32)(unsafe.Pointer(pIn)), *(*int32)(unsafe.Pointer(pIn + 4))) } Xsqlite3VdbeJumpHere(tls, v, *(*int32)(unsafe.Pointer(pIn + 4))-1) } goto __2 __2: j-- pIn -= 20 goto __1 goto __3 __3: } Xsqlite3VdbeResolveLabel(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBrk) if (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Return, (*WhereRightJoin)(unsafe.Pointer((*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ)).FregReturn, 0, 1) } if (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrSkip != 0 { Xsqlite3VdbeGoto(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrSkip) Xsqlite3VdbeJumpHere(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrSkip) Xsqlite3VdbeJumpHere(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrSkip-2) } if (*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin != 0 { var ws int32 = int32((*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags) addr = Xsqlite3VdbeAddOp1(tls, v, OP_IfPos, (*WhereLevel)(unsafe.Pointer(pLevel)).FiLeftJoin) if ws&WHERE_IDX_ONLY == 0 { Xsqlite3VdbeAddOp1(tls, v, OP_NullRow, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur) } if ws&WHERE_INDEXED != 0 || ws&WHERE_MULTI_OR != 0 && *(*uintptr)(unsafe.Pointer(pLevel + 72)) != 0 { if ws&WHERE_MULTI_OR != 0 { var pIx uintptr = *(*uintptr)(unsafe.Pointer(pLevel + 72)) var iDb int32 = Xsqlite3SchemaToIndex(tls, db, (*Index)(unsafe.Pointer(pIx)).FpSchema) Xsqlite3VdbeAddOp3(tls, v, OP_ReopenIdx, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur, int32((*Index)(unsafe.Pointer(pIx)).Ftnum), iDb) Xsqlite3VdbeSetP4KeyInfo(tls, pParse, pIx) } Xsqlite3VdbeAddOp1(tls, v, OP_NullRow, (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur) } if int32((*WhereLevel)(unsafe.Pointer(pLevel)).Fop) == OP_Return { Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*WhereLevel)(unsafe.Pointer(pLevel)).Fp1, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrFirst) } else { Xsqlite3VdbeGoto(tls, v, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrFirst) } Xsqlite3VdbeJumpHere(tls, v, addr) } } i = 0 pLevel = pWInfo + 856 __4: if !(i < int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FnLevel)) { goto __6 } { var k int32 var last int32 var pOp uintptr var pLastOp uintptr var pIdx uintptr = uintptr(0) var pTabItem uintptr = pTabList + 8 + uintptr((*WhereLevel)(unsafe.Pointer(pLevel)).FiFrom)*104 var pTab uintptr = (*SrcItem)(unsafe.Pointer(pTabItem)).FpTab pLoop = (*WhereLevel)(unsafe.Pointer(pLevel)).FpWLoop if (*WhereLevel)(unsafe.Pointer(pLevel)).FpRJ != 0 { Xsqlite3WhereRightJoinLoop(tls, pWInfo, i, pLevel) goto __5 } if uint32(int32(*(*uint16)(unsafe.Pointer(pTabItem + 60 + 4))&0x20>>5)) != 0 { translateColumnToCopy(tls, pParse, (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBody, (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur, (*SrcItem)(unsafe.Pointer(pTabItem)).FregResult, 0) goto __5 } if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_INDEXED|WHERE_IDX_ONLY) != 0 { pIdx = *(*uintptr)(unsafe.Pointer(pLoop + 24 + 8)) } else if (*WhereLoop)(unsafe.Pointer(pLoop)).FwsFlags&U32(WHERE_MULTI_OR) != 0 { pIdx = *(*uintptr)(unsafe.Pointer(pLevel + 72)) } if pIdx != 0 && !(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { if int32((*WhereInfo)(unsafe.Pointer(pWInfo)).FeOnePass) == ONEPASS_OFF || !((*Table)(unsafe.Pointer((*Index)(unsafe.Pointer(pIdx)).FpTable)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { last = iEnd } else { last = (*WhereInfo)(unsafe.Pointer(pWInfo)).FiEndWhere } if uint32(int32(*(*uint16)(unsafe.Pointer(pIdx + 100))&0x800>>11)) != 0 { var p uintptr = (*Parse)(unsafe.Pointer(pParse)).FpIdxEpr for p != 0 { if (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCur == (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur { (*IndexedExpr)(unsafe.Pointer(p)).FiDataCur = -1 (*IndexedExpr)(unsafe.Pointer(p)).FiIdxCur = -1 } p = (*IndexedExpr)(unsafe.Pointer(p)).FpIENext } } k = (*WhereLevel)(unsafe.Pointer(pLevel)).FaddrBody + 1 pOp = Xsqlite3VdbeGetOp(tls, v, k) pLastOp = pOp + uintptr(last-k)*24 for __ccgo := true; __ccgo; __ccgo = libc.PreIncUintptr(&pOp, 24) < pLastOp { if (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 != (*WhereLevel)(unsafe.Pointer(pLevel)).FiTabCur { } else if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Column || int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Offset { var x int32 = (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Offset { } else if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0)) { var pPk uintptr = Xsqlite3PrimaryKeyIndex(tls, pTab) x = int32(*(*I16)(unsafe.Pointer((*Index)(unsafe.Pointer(pPk)).FaiColumn + uintptr(x)*2))) } else { x = int32(Xsqlite3StorageColumnToTable(tls, pTab, int16(x))) } x = int32(Xsqlite3TableColumnToIndex(tls, pIdx, int16(x))) if x >= 0 { (*VdbeOp)(unsafe.Pointer(pOp)).Fp2 = x (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur } else { } } else if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Rowid { (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur (*VdbeOp)(unsafe.Pointer(pOp)).Fopcode = U8(OP_IdxRowid) } else if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_IfNullRow { (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = (*WhereLevel)(unsafe.Pointer(pLevel)).FiIdxCur } } } } goto __5 __5: i++ pLevel += 104 goto __4 goto __6 __6: ; Xsqlite3VdbeResolveLabel(tls, v, (*WhereInfo)(unsafe.Pointer(pWInfo)).FiBreak) (*Parse)(unsafe.Pointer(pParse)).FnQueryLoop = U32((*WhereInfo)(unsafe.Pointer(pWInfo)).FsavedNQueryLoop) whereInfoFree(tls, db, pWInfo) *(*U8)(unsafe.Pointer(pParse + 38)) -= U8(nRJ) return } func row_numberStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(I64(0)))) if p != 0 { *(*I64)(unsafe.Pointer(p))++ } _ = nArg _ = apArg } func row_numberValueFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(I64(0)))) Xsqlite3_result_int64(tls, pCtx, func() int64 { if p != 0 { return *(*I64)(unsafe.Pointer(p)) } return int64(0) }()) } // Context object type used by rank(), dense_rank(), percent_rank() and // cume_dist(). type CallCount = struct { FnValue I64 FnStep I64 FnTotal I64 } func dense_rankStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) if p != 0 { (*CallCount)(unsafe.Pointer(p)).FnStep = int64(1) } _ = nArg _ = apArg } func dense_rankValueFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) if p != 0 { if (*CallCount)(unsafe.Pointer(p)).FnStep != 0 { (*CallCount)(unsafe.Pointer(p)).FnValue++ (*CallCount)(unsafe.Pointer(p)).FnStep = int64(0) } Xsqlite3_result_int64(tls, pCtx, (*CallCount)(unsafe.Pointer(p)).FnValue) } } // Implementation of built-in window function nth_value(). This // implementation is used in "slow mode" only - when the EXCLUDE clause // is not set to the default value "NO OTHERS". type NthValueCtx = struct { FnStep I64 FpValue uintptr } func nth_valueStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr var fVal float64 var iVal I64 p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(NthValueCtx{}))) if !(p != 0) { goto __1 } switch Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(apArg + 1*8))) { case SQLITE_INTEGER: goto __3 case SQLITE_FLOAT: goto __4 default: goto __5 } goto __2 __3: iVal = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apArg + 1*8))) goto __2 __4: fVal = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(apArg + 1*8))) if !(float64(I64(fVal)) != fVal) { goto __6 } goto error_out __6: ; iVal = I64(fVal) goto __2 __5: goto error_out __2: ; if !(iVal <= int64(0)) { goto __7 } goto error_out __7: ; (*NthValueCtx)(unsafe.Pointer(p)).FnStep++ if !(iVal == (*NthValueCtx)(unsafe.Pointer(p)).FnStep) { goto __8 } (*NthValueCtx)(unsafe.Pointer(p)).FpValue = Xsqlite3_value_dup(tls, *(*uintptr)(unsafe.Pointer(apArg))) if !!(int32((*NthValueCtx)(unsafe.Pointer(p)).FpValue) != 0) { goto __9 } Xsqlite3_result_error_nomem(tls, pCtx) __9: ; __8: ; __1: ; _ = nArg _ = apArg return error_out: Xsqlite3_result_error(tls, pCtx, ts+23484, -1) } func nth_valueFinalizeFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, 0) if p != 0 && (*NthValueCtx)(unsafe.Pointer(p)).FpValue != 0 { Xsqlite3_result_value(tls, pCtx, (*NthValueCtx)(unsafe.Pointer(p)).FpValue) Xsqlite3_value_free(tls, (*NthValueCtx)(unsafe.Pointer(p)).FpValue) (*NthValueCtx)(unsafe.Pointer(p)).FpValue = uintptr(0) } } func first_valueStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(NthValueCtx{}))) if p != 0 && (*NthValueCtx)(unsafe.Pointer(p)).FpValue == uintptr(0) { (*NthValueCtx)(unsafe.Pointer(p)).FpValue = Xsqlite3_value_dup(tls, *(*uintptr)(unsafe.Pointer(apArg))) if !(int32((*NthValueCtx)(unsafe.Pointer(p)).FpValue) != 0) { Xsqlite3_result_error_nomem(tls, pCtx) } } _ = nArg _ = apArg } func first_valueFinalizeFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(NthValueCtx{}))) if p != 0 && (*NthValueCtx)(unsafe.Pointer(p)).FpValue != 0 { Xsqlite3_result_value(tls, pCtx, (*NthValueCtx)(unsafe.Pointer(p)).FpValue) Xsqlite3_value_free(tls, (*NthValueCtx)(unsafe.Pointer(p)).FpValue) (*NthValueCtx)(unsafe.Pointer(p)).FpValue = uintptr(0) } } func rankStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) if p != 0 { (*CallCount)(unsafe.Pointer(p)).FnStep++ if (*CallCount)(unsafe.Pointer(p)).FnValue == int64(0) { (*CallCount)(unsafe.Pointer(p)).FnValue = (*CallCount)(unsafe.Pointer(p)).FnStep } } _ = nArg _ = apArg } func rankValueFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) if p != 0 { Xsqlite3_result_int64(tls, pCtx, (*CallCount)(unsafe.Pointer(p)).FnValue) (*CallCount)(unsafe.Pointer(p)).FnValue = int64(0) } } func percent_rankStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg _ = apArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) if p != 0 { (*CallCount)(unsafe.Pointer(p)).FnTotal++ } } func percent_rankInvFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg _ = apArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) (*CallCount)(unsafe.Pointer(p)).FnStep++ } func percent_rankValueFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) if p != 0 { (*CallCount)(unsafe.Pointer(p)).FnValue = (*CallCount)(unsafe.Pointer(p)).FnStep if (*CallCount)(unsafe.Pointer(p)).FnTotal > int64(1) { var r float64 = float64((*CallCount)(unsafe.Pointer(p)).FnValue) / float64((*CallCount)(unsafe.Pointer(p)).FnTotal-int64(1)) Xsqlite3_result_double(tls, pCtx, r) } else { Xsqlite3_result_double(tls, pCtx, 0.0) } } } func cume_distStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg _ = apArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) if p != 0 { (*CallCount)(unsafe.Pointer(p)).FnTotal++ } } func cume_distInvFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg _ = apArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(CallCount{}))) (*CallCount)(unsafe.Pointer(p)).FnStep++ } func cume_distValueFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, 0) if p != 0 { var r float64 = float64((*CallCount)(unsafe.Pointer(p)).FnStep) / float64((*CallCount)(unsafe.Pointer(p)).FnTotal) Xsqlite3_result_double(tls, pCtx, r) } } // Context object for ntile() window function. type NtileCtx = struct { FnTotal I64 FnParam I64 FiRow I64 } func ntileStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(NtileCtx{}))) if p != 0 { if (*NtileCtx)(unsafe.Pointer(p)).FnTotal == int64(0) { (*NtileCtx)(unsafe.Pointer(p)).FnParam = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apArg))) if (*NtileCtx)(unsafe.Pointer(p)).FnParam <= int64(0) { Xsqlite3_result_error(tls, pCtx, ts+23540, -1) } } (*NtileCtx)(unsafe.Pointer(p)).FnTotal++ } } func ntileInvFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg _ = apArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(NtileCtx{}))) (*NtileCtx)(unsafe.Pointer(p)).FiRow++ } func ntileValueFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(NtileCtx{}))) if p != 0 && (*NtileCtx)(unsafe.Pointer(p)).FnParam > int64(0) { var nSize int32 = int32((*NtileCtx)(unsafe.Pointer(p)).FnTotal / (*NtileCtx)(unsafe.Pointer(p)).FnParam) if nSize == 0 { Xsqlite3_result_int64(tls, pCtx, (*NtileCtx)(unsafe.Pointer(p)).FiRow+int64(1)) } else { var nLarge I64 = (*NtileCtx)(unsafe.Pointer(p)).FnTotal - (*NtileCtx)(unsafe.Pointer(p)).FnParam*I64(nSize) var iSmall I64 = nLarge * I64(nSize+1) var iRow I64 = (*NtileCtx)(unsafe.Pointer(p)).FiRow if iRow < iSmall { Xsqlite3_result_int64(tls, pCtx, int64(1)+iRow/I64(nSize+1)) } else { Xsqlite3_result_int64(tls, pCtx, int64(1)+nLarge+(iRow-iSmall)/I64(nSize)) } } } } // Context object for last_value() window function. type LastValueCtx = struct { FpVal uintptr FnVal int32 F__ccgo_pad1 [4]byte } func last_valueStepFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(LastValueCtx{}))) if p != 0 { Xsqlite3_value_free(tls, (*LastValueCtx)(unsafe.Pointer(p)).FpVal) (*LastValueCtx)(unsafe.Pointer(p)).FpVal = Xsqlite3_value_dup(tls, *(*uintptr)(unsafe.Pointer(apArg))) if (*LastValueCtx)(unsafe.Pointer(p)).FpVal == uintptr(0) { Xsqlite3_result_error_nomem(tls, pCtx) } else { (*LastValueCtx)(unsafe.Pointer(p)).FnVal++ } } } func last_valueInvFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var p uintptr _ = nArg _ = apArg p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(LastValueCtx{}))) if p != 0 { (*LastValueCtx)(unsafe.Pointer(p)).FnVal-- if (*LastValueCtx)(unsafe.Pointer(p)).FnVal == 0 { Xsqlite3_value_free(tls, (*LastValueCtx)(unsafe.Pointer(p)).FpVal) (*LastValueCtx)(unsafe.Pointer(p)).FpVal = uintptr(0) } } } func last_valueValueFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, 0) if p != 0 && (*LastValueCtx)(unsafe.Pointer(p)).FpVal != 0 { Xsqlite3_result_value(tls, pCtx, (*LastValueCtx)(unsafe.Pointer(p)).FpVal) } } func last_valueFinalizeFunc(tls *libc.TLS, pCtx uintptr) { var p uintptr p = Xsqlite3_aggregate_context(tls, pCtx, int32(unsafe.Sizeof(LastValueCtx{}))) if p != 0 && (*LastValueCtx)(unsafe.Pointer(p)).FpVal != 0 { Xsqlite3_result_value(tls, pCtx, (*LastValueCtx)(unsafe.Pointer(p)).FpVal) Xsqlite3_value_free(tls, (*LastValueCtx)(unsafe.Pointer(p)).FpVal) (*LastValueCtx)(unsafe.Pointer(p)).FpVal = uintptr(0) } } var row_numberName = *(*[11]int8)(unsafe.Pointer(ts + 23585)) var dense_rankName = *(*[11]int8)(unsafe.Pointer(ts + 23596)) var rankName = *(*[5]int8)(unsafe.Pointer(ts + 23607)) var percent_rankName = *(*[13]int8)(unsafe.Pointer(ts + 23612)) var cume_distName = *(*[10]int8)(unsafe.Pointer(ts + 23625)) var ntileName = *(*[6]int8)(unsafe.Pointer(ts + 23635)) var last_valueName = *(*[11]int8)(unsafe.Pointer(ts + 23641)) var nth_valueName = *(*[10]int8)(unsafe.Pointer(ts + 23652)) var first_valueName = *(*[12]int8)(unsafe.Pointer(ts + 23662)) var leadName = *(*[5]int8)(unsafe.Pointer(ts + 23674)) var lagName = *(*[4]int8)(unsafe.Pointer(ts + 23679)) func noopStepFunc(tls *libc.TLS, p uintptr, n int32, a uintptr) { _ = p _ = n _ = a } func noopValueFunc(tls *libc.TLS, p uintptr) { _ = p } // Register those built-in window functions that are not also aggregates. func Xsqlite3WindowFunctions(tls *libc.TLS) { Xsqlite3InsertBuiltinFuncs(tls, uintptr(unsafe.Pointer(&aWindowFuncs)), int32(uint64(unsafe.Sizeof(aWindowFuncs))/uint64(unsafe.Sizeof(FuncDef{})))) } var aWindowFuncs = [15]FuncDef{ {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}, {FnArg: int8(3), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | SQLITE_FUNC_WINDOW | 0), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: 0}} func windowFind(tls *libc.TLS, pParse uintptr, pList uintptr, zName uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr for p = pList; p != 0; p = (*Window)(unsafe.Pointer(p)).FpNextWin { if Xsqlite3StrICmp(tls, (*Window)(unsafe.Pointer(p)).FzName, zName) == 0 { break } } if p == uintptr(0) { Xsqlite3ErrorMsg(tls, pParse, ts+23683, libc.VaList(bp, zName)) } return p } // This function is called immediately after resolving the function name // for a window function within a SELECT statement. Argument pList is a // linked list of WINDOW definitions for the current SELECT statement. // Argument pFunc is the function definition just resolved and pWin // is the Window object representing the associated OVER clause. This // function updates the contents of pWin as follows: // // - If the OVER clause refered to a named window (as in "max(x) OVER win"), // search list pList for a matching WINDOW definition, and update pWin // accordingly. If no such WINDOW clause can be found, leave an error // in pParse. // // - If the function is a built-in window function that requires the // window to be coerced (see "BUILT-IN WINDOW FUNCTIONS" at the top // of this file), pWin is updated here. func Xsqlite3WindowUpdate(tls *libc.TLS, pParse uintptr, pList uintptr, pWin uintptr, pFunc uintptr) { bp := tls.Alloc(192) defer tls.Free(192) if (*Window)(unsafe.Pointer(pWin)).FzName != 0 && int32((*Window)(unsafe.Pointer(pWin)).FeFrmType) == 0 { var p uintptr = windowFind(tls, pParse, pList, (*Window)(unsafe.Pointer(pWin)).FzName) if p == uintptr(0) { return } (*Window)(unsafe.Pointer(pWin)).FpPartition = Xsqlite3ExprListDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Window)(unsafe.Pointer(p)).FpPartition, 0) (*Window)(unsafe.Pointer(pWin)).FpOrderBy = Xsqlite3ExprListDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Window)(unsafe.Pointer(p)).FpOrderBy, 0) (*Window)(unsafe.Pointer(pWin)).FpStart = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Window)(unsafe.Pointer(p)).FpStart, 0) (*Window)(unsafe.Pointer(pWin)).FpEnd = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Window)(unsafe.Pointer(p)).FpEnd, 0) (*Window)(unsafe.Pointer(pWin)).FeStart = (*Window)(unsafe.Pointer(p)).FeStart (*Window)(unsafe.Pointer(pWin)).FeEnd = (*Window)(unsafe.Pointer(p)).FeEnd (*Window)(unsafe.Pointer(pWin)).FeFrmType = (*Window)(unsafe.Pointer(p)).FeFrmType (*Window)(unsafe.Pointer(pWin)).FeExclude = (*Window)(unsafe.Pointer(p)).FeExclude } else { Xsqlite3WindowChain(tls, pParse, pWin, pList) } if int32((*Window)(unsafe.Pointer(pWin)).FeFrmType) == TK_RANGE && ((*Window)(unsafe.Pointer(pWin)).FpStart != 0 || (*Window)(unsafe.Pointer(pWin)).FpEnd != 0) && ((*Window)(unsafe.Pointer(pWin)).FpOrderBy == uintptr(0) || (*ExprList)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOrderBy)).FnExpr != 1) { Xsqlite3ErrorMsg(tls, pParse, ts+23702, 0) } else if (*FuncDef)(unsafe.Pointer(pFunc)).FfuncFlags&U32(SQLITE_FUNC_WINDOW) != 0 { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if (*Window)(unsafe.Pointer(pWin)).FpFilter != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+23773, 0) } else { *(*[8]WindowUpdate)(unsafe.Pointer(bp)) = [8]WindowUpdate{ {FzFunc: uintptr(unsafe.Pointer(&row_numberName)), FeFrmType: TK_ROWS, FeStart: TK_UNBOUNDED, FeEnd: TK_CURRENT}, {FzFunc: uintptr(unsafe.Pointer(&dense_rankName)), FeFrmType: TK_RANGE, FeStart: TK_UNBOUNDED, FeEnd: TK_CURRENT}, {FzFunc: uintptr(unsafe.Pointer(&rankName)), FeFrmType: TK_RANGE, FeStart: TK_UNBOUNDED, FeEnd: TK_CURRENT}, {FzFunc: uintptr(unsafe.Pointer(&percent_rankName)), FeFrmType: TK_GROUPS, FeStart: TK_CURRENT, FeEnd: TK_UNBOUNDED}, {FzFunc: uintptr(unsafe.Pointer(&cume_distName)), FeFrmType: TK_GROUPS, FeStart: TK_FOLLOWING, FeEnd: TK_UNBOUNDED}, {FzFunc: uintptr(unsafe.Pointer(&ntileName)), FeFrmType: TK_ROWS, FeStart: TK_CURRENT, FeEnd: TK_UNBOUNDED}, {FzFunc: uintptr(unsafe.Pointer(&leadName)), FeFrmType: TK_ROWS, FeStart: TK_UNBOUNDED, FeEnd: TK_UNBOUNDED}, {FzFunc: uintptr(unsafe.Pointer(&lagName)), FeFrmType: TK_ROWS, FeStart: TK_UNBOUNDED, FeEnd: TK_CURRENT}, } var i int32 for i = 0; i < int32(uint64(unsafe.Sizeof([8]WindowUpdate{}))/uint64(unsafe.Sizeof(WindowUpdate{}))); i++ { if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == (*WindowUpdate)(unsafe.Pointer(bp+uintptr(i)*24)).FzFunc { Xsqlite3ExprDelete(tls, db, (*Window)(unsafe.Pointer(pWin)).FpStart) Xsqlite3ExprDelete(tls, db, (*Window)(unsafe.Pointer(pWin)).FpEnd) (*Window)(unsafe.Pointer(pWin)).FpEnd = libc.AssignPtrUintptr(pWin+40, uintptr(0)) (*Window)(unsafe.Pointer(pWin)).FeFrmType = U8((*WindowUpdate)(unsafe.Pointer(bp + uintptr(i)*24)).FeFrmType) (*Window)(unsafe.Pointer(pWin)).FeStart = U8((*WindowUpdate)(unsafe.Pointer(bp + uintptr(i)*24)).FeStart) (*Window)(unsafe.Pointer(pWin)).FeEnd = U8((*WindowUpdate)(unsafe.Pointer(bp + uintptr(i)*24)).FeEnd) (*Window)(unsafe.Pointer(pWin)).FeExclude = U8(0) if int32((*Window)(unsafe.Pointer(pWin)).FeStart) == TK_FOLLOWING { (*Window)(unsafe.Pointer(pWin)).FpStart = Xsqlite3Expr(tls, db, TK_INTEGER, ts+9290) } break } } } } (*Window)(unsafe.Pointer(pWin)).FpWFunc = pFunc } type WindowUpdate = struct { FzFunc uintptr FeFrmType int32 FeStart int32 FeEnd int32 F__ccgo_pad1 [4]byte } // Context object passed through sqlite3WalkExprList() to // selectWindowRewriteExprCb() by selectWindowRewriteEList(). type WindowRewrite = WindowRewrite1 func selectWindowRewriteExprCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pParse uintptr = (*Walker)(unsafe.Pointer(pWalker)).FpParse if (*WindowRewrite1)(unsafe.Pointer(p)).FpSubSelect != 0 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) != TK_COLUMN { return WRC_Continue } else { var nSrc int32 = (*SrcList)(unsafe.Pointer((*WindowRewrite1)(unsafe.Pointer(p)).FpSrc)).FnSrc var i int32 for i = 0; i < nSrc; i++ { if (*Expr)(unsafe.Pointer(pExpr)).FiTable == (*SrcItem)(unsafe.Pointer((*WindowRewrite1)(unsafe.Pointer(p)).FpSrc+8+uintptr(i)*104)).FiCursor { break } } if i == nSrc { return WRC_Continue } } } { switch int32((*Expr)(unsafe.Pointer(pExpr)).Fop) { case TK_FUNCTION: if !((*Expr)(unsafe.Pointer(pExpr)).Fflags&U32(EP_WinFunc) != U32(0)) { break } else { var pWin uintptr for pWin = (*WindowRewrite1)(unsafe.Pointer(p)).FpWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { if *(*uintptr)(unsafe.Pointer(pExpr + 64)) == pWin { return WRC_Prune } } } fallthrough case TK_AGG_FUNCTION: fallthrough case TK_COLUMN: { var iCol int32 = -1 if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { return WRC_Abort } if (*WindowRewrite1)(unsafe.Pointer(p)).FpSub != 0 { var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer((*WindowRewrite1)(unsafe.Pointer(p)).FpSub)).FnExpr; i++ { if 0 == Xsqlite3ExprCompare(tls, uintptr(0), (*ExprList_item)(unsafe.Pointer((*WindowRewrite1)(unsafe.Pointer(p)).FpSub+8+uintptr(i)*32)).FpExpr, pExpr, -1) { iCol = i break } } } if iCol < 0 { var pDup uintptr = Xsqlite3ExprDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr, 0) if pDup != 0 && int32((*Expr)(unsafe.Pointer(pDup)).Fop) == TK_AGG_FUNCTION { (*Expr)(unsafe.Pointer(pDup)).Fop = U8(TK_FUNCTION) } (*WindowRewrite1)(unsafe.Pointer(p)).FpSub = Xsqlite3ExprListAppend(tls, pParse, (*WindowRewrite1)(unsafe.Pointer(p)).FpSub, pDup) } if (*WindowRewrite1)(unsafe.Pointer(p)).FpSub != 0 { var f int32 = int32((*Expr)(unsafe.Pointer(pExpr)).Fflags & U32(EP_Collate)) *(*U32)(unsafe.Pointer(pExpr + 4)) |= U32(EP_Static) Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) *(*U32)(unsafe.Pointer(pExpr + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_Static)) libc.Xmemset(tls, pExpr, 0, uint64(unsafe.Sizeof(Expr{}))) (*Expr)(unsafe.Pointer(pExpr)).Fop = U8(TK_COLUMN) (*Expr)(unsafe.Pointer(pExpr)).FiColumn = func() int16 { if iCol < 0 { return int16((*ExprList)(unsafe.Pointer((*WindowRewrite1)(unsafe.Pointer(p)).FpSub)).FnExpr - 1) } return int16(iCol) }() (*Expr)(unsafe.Pointer(pExpr)).FiTable = (*Window)(unsafe.Pointer((*WindowRewrite1)(unsafe.Pointer(p)).FpWin)).FiEphCsr *(*uintptr)(unsafe.Pointer(pExpr + 64)) = (*WindowRewrite1)(unsafe.Pointer(p)).FpTab (*Expr)(unsafe.Pointer(pExpr)).Fflags = U32(f) } if (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FmallocFailed != 0 { return WRC_Abort } break } default: break } } return WRC_Continue } func selectWindowRewriteSelectCb(tls *libc.TLS, pWalker uintptr, pSelect uintptr) int32 { var p uintptr = *(*uintptr)(unsafe.Pointer(pWalker + 40)) var pSave uintptr = (*WindowRewrite1)(unsafe.Pointer(p)).FpSubSelect if pSave == pSelect { return WRC_Continue } else { (*WindowRewrite1)(unsafe.Pointer(p)).FpSubSelect = pSelect Xsqlite3WalkSelect(tls, pWalker, pSelect) (*WindowRewrite1)(unsafe.Pointer(p)).FpSubSelect = pSave } return WRC_Prune } func selectWindowRewriteEList(tls *libc.TLS, pParse uintptr, pWin uintptr, pSrc uintptr, pEList uintptr, pTab uintptr, ppSub uintptr) { bp := tls.Alloc(88) defer tls.Free(88) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) libc.Xmemset(tls, bp+48, 0, uint64(unsafe.Sizeof(WindowRewrite{}))) (*WindowRewrite)(unsafe.Pointer(bp + 48)).FpSub = *(*uintptr)(unsafe.Pointer(ppSub)) (*WindowRewrite)(unsafe.Pointer(bp + 48)).FpWin = pWin (*WindowRewrite)(unsafe.Pointer(bp + 48)).FpSrc = pSrc (*WindowRewrite)(unsafe.Pointer(bp + 48)).FpTab = pTab (*Walker)(unsafe.Pointer(bp)).FpParse = pParse (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{selectWindowRewriteExprCb})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{selectWindowRewriteSelectCb})) *(*uintptr)(unsafe.Pointer(bp + 40)) = bp + 48 Xsqlite3WalkExprList(tls, bp, pEList) *(*uintptr)(unsafe.Pointer(ppSub)) = (*WindowRewrite)(unsafe.Pointer(bp + 48)).FpSub } func exprListAppendList(tls *libc.TLS, pParse uintptr, pList uintptr, pAppend uintptr, bIntToNull int32) uintptr { bp := tls.Alloc(4) defer tls.Free(4) if pAppend != 0 { var i int32 var nInit int32 if pList != 0 { nInit = (*ExprList)(unsafe.Pointer(pList)).FnExpr } else { nInit = 0 } for i = 0; i < (*ExprList)(unsafe.Pointer(pAppend)).FnExpr; i++ { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pDup uintptr = Xsqlite3ExprDup(tls, db, (*ExprList_item)(unsafe.Pointer(pAppend+8+uintptr(i)*32)).FpExpr, 0) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { Xsqlite3ExprDelete(tls, db, pDup) break } if bIntToNull != 0 { var pSub uintptr pSub = Xsqlite3ExprSkipCollateAndLikely(tls, pDup) if Xsqlite3ExprIsInteger(tls, pSub, bp) != 0 { (*Expr)(unsafe.Pointer(pSub)).Fop = U8(TK_NULL) *(*U32)(unsafe.Pointer(pSub + 4)) &= libc.Uint32FromInt32(libc.CplInt32(EP_IntValue | EP_IsTrue | EP_IsFalse)) *(*uintptr)(unsafe.Pointer(pSub + 8)) = uintptr(0) } } pList = Xsqlite3ExprListAppend(tls, pParse, pList, pDup) if pList != 0 { (*ExprList_item)(unsafe.Pointer(pList + 8 + uintptr(nInit+i)*32)).Ffg.FsortFlags = (*ExprList_item)(unsafe.Pointer(pAppend + 8 + uintptr(i)*32)).Ffg.FsortFlags } } } return pList } func sqlite3WindowExtraAggFuncDepth(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AGG_FUNCTION && int32((*Expr)(unsafe.Pointer(pExpr)).Fop2) >= (*Walker)(unsafe.Pointer(pWalker)).FwalkerDepth { (*Expr)(unsafe.Pointer(pExpr)).Fop2++ } return WRC_Continue } func disallowAggregatesInOrderByCb(tls *libc.TLS, pWalker uintptr, pExpr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if int32((*Expr)(unsafe.Pointer(pExpr)).Fop) == TK_AGG_FUNCTION && (*Expr)(unsafe.Pointer(pExpr)).FpAggInfo == uintptr(0) { Xsqlite3ErrorMsg(tls, (*Walker)(unsafe.Pointer(pWalker)).FpParse, ts+23836, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(pExpr + 8)))) } return WRC_Continue } // If the SELECT statement passed as the second argument does not invoke // any SQL window functions, this function is a no-op. Otherwise, it // rewrites the SELECT statement so that window function xStep functions // are invoked in the correct order as described under "SELECT REWRITING" // at the top of this file. func Xsqlite3WindowRewrite(tls *libc.TLS, pParse uintptr, p uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var rc int32 = SQLITE_OK if (*Select)(unsafe.Pointer(p)).FpWin != 0 && (*Select)(unsafe.Pointer(p)).FpPrior == uintptr(0) && (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_WinRewrite) == U32(0) && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { var v uintptr = Xsqlite3GetVdbe(tls, pParse) var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pSub uintptr = uintptr(0) var pSrc uintptr = (*Select)(unsafe.Pointer(p)).FpSrc var pWhere uintptr = (*Select)(unsafe.Pointer(p)).FpWhere var pGroupBy uintptr = (*Select)(unsafe.Pointer(p)).FpGroupBy var pHaving uintptr = (*Select)(unsafe.Pointer(p)).FpHaving var pSort uintptr = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 48)) = uintptr(0) var pMWin uintptr = (*Select)(unsafe.Pointer(p)).FpWin var pWin uintptr var pTab uintptr var selFlags U32 = (*Select)(unsafe.Pointer(p)).FselFlags pTab = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Table{}))) if pTab == uintptr(0) { return Xsqlite3ErrorToParser(tls, db, SQLITE_NOMEM) } Xsqlite3AggInfoPersistWalkerInit(tls, bp, pParse) Xsqlite3WalkSelect(tls, bp, p) if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_Aggregate) == U32(0) { (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{disallowAggregatesInOrderByCb})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = uintptr(0) Xsqlite3WalkExprList(tls, bp, (*Select)(unsafe.Pointer(p)).FpOrderBy) } (*Select)(unsafe.Pointer(p)).FpSrc = uintptr(0) (*Select)(unsafe.Pointer(p)).FpWhere = uintptr(0) (*Select)(unsafe.Pointer(p)).FpGroupBy = uintptr(0) (*Select)(unsafe.Pointer(p)).FpHaving = uintptr(0) *(*U32)(unsafe.Pointer(p + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_Aggregate)) *(*U32)(unsafe.Pointer(p + 4)) |= U32(SF_WinRewrite) pSort = exprListAppendList(tls, pParse, uintptr(0), (*Window)(unsafe.Pointer(pMWin)).FpPartition, 1) pSort = exprListAppendList(tls, pParse, pSort, (*Window)(unsafe.Pointer(pMWin)).FpOrderBy, 1) if pSort != 0 && (*Select)(unsafe.Pointer(p)).FpOrderBy != 0 && (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpOrderBy)).FnExpr <= (*ExprList)(unsafe.Pointer(pSort)).FnExpr { var nSave int32 = (*ExprList)(unsafe.Pointer(pSort)).FnExpr (*ExprList)(unsafe.Pointer(pSort)).FnExpr = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpOrderBy)).FnExpr if Xsqlite3ExprListCompare(tls, pSort, (*Select)(unsafe.Pointer(p)).FpOrderBy, -1) == 0 { Xsqlite3ExprListDelete(tls, db, (*Select)(unsafe.Pointer(p)).FpOrderBy) (*Select)(unsafe.Pointer(p)).FpOrderBy = uintptr(0) } (*ExprList)(unsafe.Pointer(pSort)).FnExpr = nSave } (*Window)(unsafe.Pointer(pMWin)).FiEphCsr = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) *(*int32)(unsafe.Pointer(pParse + 52)) += 3 selectWindowRewriteEList(tls, pParse, pMWin, pSrc, (*Select)(unsafe.Pointer(p)).FpEList, pTab, bp+48) selectWindowRewriteEList(tls, pParse, pMWin, pSrc, (*Select)(unsafe.Pointer(p)).FpOrderBy, pTab, bp+48) (*Window)(unsafe.Pointer(pMWin)).FnBufferCol = func() int32 { if *(*uintptr)(unsafe.Pointer(bp + 48)) != 0 { return (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 48)))).FnExpr } return 0 }() *(*uintptr)(unsafe.Pointer(bp + 48)) = exprListAppendList(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 48)), (*Window)(unsafe.Pointer(pMWin)).FpPartition, 0) *(*uintptr)(unsafe.Pointer(bp + 48)) = exprListAppendList(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 48)), (*Window)(unsafe.Pointer(pMWin)).FpOrderBy, 0) for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { var pArgs uintptr pArgs = *(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOwner + 32)) if (*FuncDef)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpWFunc)).FfuncFlags&U32(SQLITE_FUNC_SUBTYPE) != 0 { selectWindowRewriteEList(tls, pParse, pMWin, pSrc, pArgs, pTab, bp+48) (*Window)(unsafe.Pointer(pWin)).FiArgCol = func() int32 { if *(*uintptr)(unsafe.Pointer(bp + 48)) != 0 { return (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 48)))).FnExpr } return 0 }() (*Window)(unsafe.Pointer(pWin)).FbExprArgs = U8(1) } else { (*Window)(unsafe.Pointer(pWin)).FiArgCol = func() int32 { if *(*uintptr)(unsafe.Pointer(bp + 48)) != 0 { return (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 48)))).FnExpr } return 0 }() *(*uintptr)(unsafe.Pointer(bp + 48)) = exprListAppendList(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 48)), pArgs, 0) } if (*Window)(unsafe.Pointer(pWin)).FpFilter != 0 { var pFilter uintptr = Xsqlite3ExprDup(tls, db, (*Window)(unsafe.Pointer(pWin)).FpFilter, 0) *(*uintptr)(unsafe.Pointer(bp + 48)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 48)), pFilter) } (*Window)(unsafe.Pointer(pWin)).FregAccum = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) (*Window)(unsafe.Pointer(pWin)).FregResult = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pWin)).FregAccum) } if *(*uintptr)(unsafe.Pointer(bp + 48)) == uintptr(0) { *(*uintptr)(unsafe.Pointer(bp + 48)) = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), Xsqlite3Expr(tls, db, TK_INTEGER, ts+8871)) } pSub = Xsqlite3SelectNew(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 48)), pSrc, pWhere, pGroupBy, pHaving, pSort, uint32(0), uintptr(0)) (*Select)(unsafe.Pointer(p)).FpSrc = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), uintptr(0), uintptr(0)) if (*Select)(unsafe.Pointer(p)).FpSrc != 0 { var pTab2 uintptr (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FpSelect = pSub libc.SetBitFieldPtr16Uint32((*Select)(unsafe.Pointer(p)).FpSrc+8+60+4, uint32(1), 3, 0x8) Xsqlite3SrcListAssignCursors(tls, pParse, (*Select)(unsafe.Pointer(p)).FpSrc) *(*U32)(unsafe.Pointer(pSub + 4)) |= U32(SF_Expanded | SF_OrderByReqd) pTab2 = Xsqlite3ResultSetOfSelect(tls, pParse, pSub, int8(SQLITE_AFF_NONE)) *(*U32)(unsafe.Pointer(pSub + 4)) |= selFlags & U32(SF_Aggregate) if pTab2 == uintptr(0) { rc = SQLITE_NOMEM } else { libc.Xmemcpy(tls, pTab, pTab2, uint64(unsafe.Sizeof(Table{}))) *(*U32)(unsafe.Pointer(pTab + 48)) |= U32(TF_Ephemeral) (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FpTab = pTab pTab = pTab2 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Walker{}))) (*Walker)(unsafe.Pointer(bp)).FxExprCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{sqlite3WindowExtraAggFuncDepth})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) int32 }{Xsqlite3WalkerDepthIncrease})) (*Walker)(unsafe.Pointer(bp)).FxSelectCallback2 = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3WalkerDepthDecrease})) Xsqlite3WalkSelect(tls, bp, pSub) } } else { Xsqlite3SelectDelete(tls, db, pSub) } if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { rc = SQLITE_NOMEM } Xsqlite3ParserAddCleanup(tls, pParse, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{Xsqlite3DbFree})), pTab) } return rc } // Unlink the Window object from the Select to which it is attached, // if it is attached. func Xsqlite3WindowUnlinkFromSelect(tls *libc.TLS, p uintptr) { if (*Window)(unsafe.Pointer(p)).FppThis != 0 { *(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(p)).FppThis)) = (*Window)(unsafe.Pointer(p)).FpNextWin if (*Window)(unsafe.Pointer(p)).FpNextWin != 0 { (*Window)(unsafe.Pointer((*Window)(unsafe.Pointer(p)).FpNextWin)).FppThis = (*Window)(unsafe.Pointer(p)).FppThis } (*Window)(unsafe.Pointer(p)).FppThis = uintptr(0) } } // Free the Window object passed as the second argument. func Xsqlite3WindowDelete(tls *libc.TLS, db uintptr, p uintptr) { if p != 0 { Xsqlite3WindowUnlinkFromSelect(tls, p) Xsqlite3ExprDelete(tls, db, (*Window)(unsafe.Pointer(p)).FpFilter) Xsqlite3ExprListDelete(tls, db, (*Window)(unsafe.Pointer(p)).FpPartition) Xsqlite3ExprListDelete(tls, db, (*Window)(unsafe.Pointer(p)).FpOrderBy) Xsqlite3ExprDelete(tls, db, (*Window)(unsafe.Pointer(p)).FpEnd) Xsqlite3ExprDelete(tls, db, (*Window)(unsafe.Pointer(p)).FpStart) Xsqlite3DbFree(tls, db, (*Window)(unsafe.Pointer(p)).FzName) Xsqlite3DbFree(tls, db, (*Window)(unsafe.Pointer(p)).FzBase) Xsqlite3DbFree(tls, db, p) } } // Free the linked list of Window objects starting at the second argument. func Xsqlite3WindowListDelete(tls *libc.TLS, db uintptr, p uintptr) { for p != 0 { var pNext uintptr = (*Window)(unsafe.Pointer(p)).FpNextWin Xsqlite3WindowDelete(tls, db, p) p = pNext } } func sqlite3WindowOffsetExpr(tls *libc.TLS, pParse uintptr, pExpr uintptr) uintptr { if 0 == Xsqlite3ExprIsConstant(tls, pExpr) { if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameExprUnmap(tls, pParse, pExpr) } Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pExpr) pExpr = Xsqlite3ExprAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_NULL, uintptr(0), 0) } return pExpr } // Allocate and return a new Window object describing a Window Definition. func Xsqlite3WindowAlloc(tls *libc.TLS, pParse uintptr, eType int32, eStart int32, pStart uintptr, eEnd int32, pEnd uintptr, eExclude U8) uintptr { var pWin uintptr var bImplicitFrame int32 pWin = uintptr(0) bImplicitFrame = 0 if !(eType == 0) { goto __1 } bImplicitFrame = 1 eType = TK_RANGE __1: ; if !(eStart == TK_CURRENT && eEnd == TK_PRECEDING || eStart == TK_FOLLOWING && (eEnd == TK_PRECEDING || eEnd == TK_CURRENT)) { goto __2 } Xsqlite3ErrorMsg(tls, pParse, ts+23862, 0) goto windowAllocErr __2: ; pWin = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Window{}))) if !(pWin == uintptr(0)) { goto __3 } goto windowAllocErr __3: ; (*Window)(unsafe.Pointer(pWin)).FeFrmType = U8(eType) (*Window)(unsafe.Pointer(pWin)).FeStart = U8(eStart) (*Window)(unsafe.Pointer(pWin)).FeEnd = U8(eEnd) if !(int32(eExclude) == 0 && (*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).FdbOptFlags&U32(SQLITE_WindowFunc) != U32(0)) { goto __4 } eExclude = U8(TK_NO) __4: ; (*Window)(unsafe.Pointer(pWin)).FeExclude = eExclude (*Window)(unsafe.Pointer(pWin)).FbImplicitFrame = U8(bImplicitFrame) (*Window)(unsafe.Pointer(pWin)).FpEnd = sqlite3WindowOffsetExpr(tls, pParse, pEnd) (*Window)(unsafe.Pointer(pWin)).FpStart = sqlite3WindowOffsetExpr(tls, pParse, pStart) return pWin windowAllocErr: Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pEnd) Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pStart) return uintptr(0) } // Attach PARTITION and ORDER BY clauses pPartition and pOrderBy to window // pWin. Also, if parameter pBase is not NULL, set pWin->zBase to the // equivalent nul-terminated string. func Xsqlite3WindowAssemble(tls *libc.TLS, pParse uintptr, pWin uintptr, pPartition uintptr, pOrderBy uintptr, pBase uintptr) uintptr { if pWin != 0 { (*Window)(unsafe.Pointer(pWin)).FpPartition = pPartition (*Window)(unsafe.Pointer(pWin)).FpOrderBy = pOrderBy if pBase != 0 { (*Window)(unsafe.Pointer(pWin)).FzBase = Xsqlite3DbStrNDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Token)(unsafe.Pointer(pBase)).Fz, uint64((*Token)(unsafe.Pointer(pBase)).Fn)) } } else { Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pPartition) Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pOrderBy) } return pWin } // Window *pWin has just been created from a WINDOW clause. Tokne pBase // is the base window. Earlier windows from the same WINDOW clause are // stored in the linked list starting at pWin->pNextWin. This function // either updates *pWin according to the base specification, or else // leaves an error in pParse. func Xsqlite3WindowChain(tls *libc.TLS, pParse uintptr, pWin uintptr, pList uintptr) { bp := tls.Alloc(16) defer tls.Free(16) if (*Window)(unsafe.Pointer(pWin)).FzBase != 0 { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var pExist uintptr = windowFind(tls, pParse, pList, (*Window)(unsafe.Pointer(pWin)).FzBase) if pExist != 0 { var zErr uintptr = uintptr(0) if (*Window)(unsafe.Pointer(pWin)).FpPartition != 0 { zErr = ts + 23894 } else if (*Window)(unsafe.Pointer(pExist)).FpOrderBy != 0 && (*Window)(unsafe.Pointer(pWin)).FpOrderBy != 0 { zErr = ts + 23911 } else if int32((*Window)(unsafe.Pointer(pExist)).FbImplicitFrame) == 0 { zErr = ts + 23927 } if zErr != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+23947, libc.VaList(bp, zErr, (*Window)(unsafe.Pointer(pWin)).FzBase)) } else { (*Window)(unsafe.Pointer(pWin)).FpPartition = Xsqlite3ExprListDup(tls, db, (*Window)(unsafe.Pointer(pExist)).FpPartition, 0) if (*Window)(unsafe.Pointer(pExist)).FpOrderBy != 0 { (*Window)(unsafe.Pointer(pWin)).FpOrderBy = Xsqlite3ExprListDup(tls, db, (*Window)(unsafe.Pointer(pExist)).FpOrderBy, 0) } Xsqlite3DbFree(tls, db, (*Window)(unsafe.Pointer(pWin)).FzBase) (*Window)(unsafe.Pointer(pWin)).FzBase = uintptr(0) } } } } // Attach window object pWin to expression p. func Xsqlite3WindowAttach(tls *libc.TLS, pParse uintptr, p uintptr, pWin uintptr) { if p != 0 { *(*uintptr)(unsafe.Pointer(p + 64)) = pWin *(*U32)(unsafe.Pointer(p + 4)) |= U32(EP_WinFunc) (*Window)(unsafe.Pointer(pWin)).FpOwner = p if (*Expr)(unsafe.Pointer(p)).Fflags&U32(EP_Distinct) != 0 && int32((*Window)(unsafe.Pointer(pWin)).FeFrmType) != TK_FILTER { Xsqlite3ErrorMsg(tls, pParse, ts+23980, 0) } } else { Xsqlite3WindowDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pWin) } } // Possibly link window pWin into the list at pSel->pWin (window functions // to be processed as part of SELECT statement pSel). The window is linked // in if either (a) there are no other windows already linked to this // SELECT, or (b) the windows already linked use a compatible window frame. func Xsqlite3WindowLink(tls *libc.TLS, pSel uintptr, pWin uintptr) { if pSel != 0 { if uintptr(0) == (*Select)(unsafe.Pointer(pSel)).FpWin || 0 == Xsqlite3WindowCompare(tls, uintptr(0), (*Select)(unsafe.Pointer(pSel)).FpWin, pWin, 0) { (*Window)(unsafe.Pointer(pWin)).FpNextWin = (*Select)(unsafe.Pointer(pSel)).FpWin if (*Select)(unsafe.Pointer(pSel)).FpWin != 0 { (*Window)(unsafe.Pointer((*Select)(unsafe.Pointer(pSel)).FpWin)).FppThis = pWin + 64 } (*Select)(unsafe.Pointer(pSel)).FpWin = pWin (*Window)(unsafe.Pointer(pWin)).FppThis = pSel + 112 } else { if Xsqlite3ExprListCompare(tls, (*Window)(unsafe.Pointer(pWin)).FpPartition, (*Window)(unsafe.Pointer((*Select)(unsafe.Pointer(pSel)).FpWin)).FpPartition, -1) != 0 { *(*U32)(unsafe.Pointer(pSel + 4)) |= U32(SF_MultiPart) } } } } // Return 0 if the two window objects are identical, 1 if they are // different, or 2 if it cannot be determined if the objects are identical // or not. Identical window objects can be processed in a single scan. func Xsqlite3WindowCompare(tls *libc.TLS, pParse uintptr, p1 uintptr, p2 uintptr, bFilter int32) int32 { var res int32 if p1 == uintptr(0) || p2 == uintptr(0) { return 1 } if int32((*Window)(unsafe.Pointer(p1)).FeFrmType) != int32((*Window)(unsafe.Pointer(p2)).FeFrmType) { return 1 } if int32((*Window)(unsafe.Pointer(p1)).FeStart) != int32((*Window)(unsafe.Pointer(p2)).FeStart) { return 1 } if int32((*Window)(unsafe.Pointer(p1)).FeEnd) != int32((*Window)(unsafe.Pointer(p2)).FeEnd) { return 1 } if int32((*Window)(unsafe.Pointer(p1)).FeExclude) != int32((*Window)(unsafe.Pointer(p2)).FeExclude) { return 1 } if Xsqlite3ExprCompare(tls, pParse, (*Window)(unsafe.Pointer(p1)).FpStart, (*Window)(unsafe.Pointer(p2)).FpStart, -1) != 0 { return 1 } if Xsqlite3ExprCompare(tls, pParse, (*Window)(unsafe.Pointer(p1)).FpEnd, (*Window)(unsafe.Pointer(p2)).FpEnd, -1) != 0 { return 1 } if libc.AssignInt32(&res, Xsqlite3ExprListCompare(tls, (*Window)(unsafe.Pointer(p1)).FpPartition, (*Window)(unsafe.Pointer(p2)).FpPartition, -1)) != 0 { return res } if libc.AssignInt32(&res, Xsqlite3ExprListCompare(tls, (*Window)(unsafe.Pointer(p1)).FpOrderBy, (*Window)(unsafe.Pointer(p2)).FpOrderBy, -1)) != 0 { return res } if bFilter != 0 { if libc.AssignInt32(&res, Xsqlite3ExprCompare(tls, pParse, (*Window)(unsafe.Pointer(p1)).FpFilter, (*Window)(unsafe.Pointer(p2)).FpFilter, -1)) != 0 { return res } } return 0 } // This is called by code in select.c before it calls sqlite3WhereBegin() // to begin iterating through the sub-query results. It is used to allocate // and initialize registers and cursors used by sqlite3WindowCodeStep(). func Xsqlite3WindowCodeInit(tls *libc.TLS, pParse uintptr, pSelect uintptr) { var nEphExpr int32 = (*ExprList)(unsafe.Pointer((*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(pSelect)).FpSrc + 8)).FpSelect)).FpEList)).FnExpr var pMWin uintptr = (*Select)(unsafe.Pointer(pSelect)).FpWin var pWin uintptr var v uintptr = Xsqlite3GetVdbe(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr, nEphExpr) Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr+1, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr) Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr+2, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr) Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr+3, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr) if (*Window)(unsafe.Pointer(pMWin)).FpPartition != 0 { var nExpr int32 = (*ExprList)(unsafe.Pointer((*Window)(unsafe.Pointer(pMWin)).FpPartition)).FnExpr (*Window)(unsafe.Pointer(pMWin)).FregPart = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nExpr Xsqlite3VdbeAddOp3(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pMWin)).FregPart, (*Window)(unsafe.Pointer(pMWin)).FregPart+nExpr-1) } (*Window)(unsafe.Pointer(pMWin)).FregOne = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, (*Window)(unsafe.Pointer(pMWin)).FregOne) if (*Window)(unsafe.Pointer(pMWin)).FeExclude != 0 { (*Window)(unsafe.Pointer(pMWin)).FregStartRowid = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) (*Window)(unsafe.Pointer(pMWin)).FregEndRowid = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) (*Window)(unsafe.Pointer(pMWin)).FcsrApp = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, (*Window)(unsafe.Pointer(pMWin)).FregStartRowid) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*Window)(unsafe.Pointer(pMWin)).FregEndRowid) Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*Window)(unsafe.Pointer(pMWin)).FcsrApp, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr) return } for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { var p uintptr = (*Window)(unsafe.Pointer(pWin)).FpWFunc if (*FuncDef)(unsafe.Pointer(p)).FfuncFlags&U32(SQLITE_FUNC_MINMAX) != 0 && int32((*Window)(unsafe.Pointer(pWin)).FeStart) != TK_UNBOUNDED { var pList uintptr var pKeyInfo uintptr pList = *(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOwner + 32)) pKeyInfo = Xsqlite3KeyInfoFromExprList(tls, pParse, pList, 0, 0) (*Window)(unsafe.Pointer(pWin)).FcsrApp = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) (*Window)(unsafe.Pointer(pWin)).FregApp = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += 3 if pKeyInfo != 0 && int32(*(*int8)(unsafe.Pointer((*FuncDef)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpWFunc)).FzName + 1))) == 'i' { *(*U8)(unsafe.Pointer((*KeyInfo)(unsafe.Pointer(pKeyInfo)).FaSortFlags)) = U8(KEYINFO_ORDER_DESC) } Xsqlite3VdbeAddOp2(tls, v, OP_OpenEphemeral, (*Window)(unsafe.Pointer(pWin)).FcsrApp, 2) Xsqlite3VdbeAppendP4(tls, v, pKeyInfo, -8) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*Window)(unsafe.Pointer(pWin)).FregApp+1) } else if (*FuncDef)(unsafe.Pointer(p)).FzName == uintptr(unsafe.Pointer(&nth_valueName)) || (*FuncDef)(unsafe.Pointer(p)).FzName == uintptr(unsafe.Pointer(&first_valueName)) { (*Window)(unsafe.Pointer(pWin)).FregApp = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 (*Window)(unsafe.Pointer(pWin)).FcsrApp = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) *(*int32)(unsafe.Pointer(pParse + 56)) += 2 Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*Window)(unsafe.Pointer(pWin)).FcsrApp, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr) } else if (*FuncDef)(unsafe.Pointer(p)).FzName == uintptr(unsafe.Pointer(&leadName)) || (*FuncDef)(unsafe.Pointer(p)).FzName == uintptr(unsafe.Pointer(&lagName)) { (*Window)(unsafe.Pointer(pWin)).FcsrApp = libc.PostIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnTab, 1) Xsqlite3VdbeAddOp2(tls, v, OP_OpenDup, (*Window)(unsafe.Pointer(pWin)).FcsrApp, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr) } } } func windowCheckValue(tls *libc.TLS, pParse uintptr, reg int32, eCond int32) { var v uintptr = Xsqlite3GetVdbe(tls, pParse) var regZero int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regZero) if eCond >= WINDOW_STARTING_NUM { var regString int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, regString, 0, ts+1544, -1) Xsqlite3VdbeAddOp3(tls, v, OP_Ge, regString, Xsqlite3VdbeCurrentAddr(tls, v)+2, reg) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_AFF_NUMERIC|SQLITE_JUMPIFNULL)) } else { Xsqlite3VdbeAddOp2(tls, v, OP_MustBeInt, reg, Xsqlite3VdbeCurrentAddr(tls, v)+2) } Xsqlite3VdbeAddOp3(tls, v, aOp1[eCond], regZero, Xsqlite3VdbeCurrentAddr(tls, v)+2, reg) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_AFF_NUMERIC)) Xsqlite3MayAbort(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Halt, SQLITE_ERROR, OE_Abort) Xsqlite3VdbeAppendP4(tls, v, azErr[eCond], -1) Xsqlite3ReleaseTempReg(tls, pParse, regZero) } var azErr = [5]uintptr{ ts + 24027, ts + 24080, ts + 23484, ts + 24131, ts + 24183, } var aOp1 = [5]int32{OP_Ge, OP_Ge, OP_Gt, OP_Ge, OP_Ge} func windowArgCount(tls *libc.TLS, pWin uintptr) int32 { var pList uintptr pList = *(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOwner + 32)) return func() int32 { if pList != 0 { return (*ExprList)(unsafe.Pointer(pList)).FnExpr } return 0 }() } type WindowCodeArg1 = struct { FpParse uintptr FpMWin uintptr FpVdbe uintptr FaddrGosub int32 FregGosub int32 FregArg int32 FeDelete int32 FregRowid int32 Fstart WindowCsrAndReg Fcurrent WindowCsrAndReg Fend WindowCsrAndReg F__ccgo_pad1 [4]byte } type WindowCodeArg = WindowCodeArg1 type WindowCsrAndReg1 = struct { Fcsr int32 Freg int32 } type WindowCsrAndReg = WindowCsrAndReg1 func windowReadPeerValues(tls *libc.TLS, p uintptr, csr int32, reg int32) { var pMWin uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpMWin var pOrderBy uintptr = (*Window)(unsafe.Pointer(pMWin)).FpOrderBy if pOrderBy != 0 { var v uintptr = Xsqlite3GetVdbe(tls, (*WindowCodeArg)(unsafe.Pointer(p)).FpParse) var pPart uintptr = (*Window)(unsafe.Pointer(pMWin)).FpPartition var iColOff int32 = (*Window)(unsafe.Pointer(pMWin)).FnBufferCol + func() int32 { if pPart != 0 { return (*ExprList)(unsafe.Pointer(pPart)).FnExpr } return 0 }() var i int32 for i = 0; i < (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr; i++ { Xsqlite3VdbeAddOp3(tls, v, OP_Column, csr, iColOff+i, reg+i) } } } func windowAggStep(tls *libc.TLS, p uintptr, pMWin uintptr, csr int32, bInverse int32, reg int32) { var pParse uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpParse var v uintptr = Xsqlite3GetVdbe(tls, pParse) var pWin uintptr for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { var pFunc uintptr = (*Window)(unsafe.Pointer(pWin)).FpWFunc var regArg int32 var nArg int32 if (*Window)(unsafe.Pointer(pWin)).FbExprArgs != 0 { nArg = 0 } else { nArg = windowArgCount(tls, pWin) } var i int32 for i = 0; i < nArg; i++ { if i != 1 || (*FuncDef)(unsafe.Pointer(pFunc)).FzName != uintptr(unsafe.Pointer(&nth_valueName)) { Xsqlite3VdbeAddOp3(tls, v, OP_Column, csr, (*Window)(unsafe.Pointer(pWin)).FiArgCol+i, reg+i) } else { Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr, (*Window)(unsafe.Pointer(pWin)).FiArgCol+i, reg+i) } } regArg = reg if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid == 0 && (*FuncDef)(unsafe.Pointer(pFunc)).FfuncFlags&U32(SQLITE_FUNC_MINMAX) != 0 && int32((*Window)(unsafe.Pointer(pWin)).FeStart) != TK_UNBOUNDED { var addrIsNull int32 = Xsqlite3VdbeAddOp1(tls, v, OP_IsNull, regArg) if bInverse == 0 { Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, (*Window)(unsafe.Pointer(pWin)).FregApp+1, 1) Xsqlite3VdbeAddOp2(tls, v, OP_SCopy, regArg, (*Window)(unsafe.Pointer(pWin)).FregApp) Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, (*Window)(unsafe.Pointer(pWin)).FregApp, 2, (*Window)(unsafe.Pointer(pWin)).FregApp+2) Xsqlite3VdbeAddOp2(tls, v, OP_IdxInsert, (*Window)(unsafe.Pointer(pWin)).FcsrApp, (*Window)(unsafe.Pointer(pWin)).FregApp+2) } else { Xsqlite3VdbeAddOp4Int(tls, v, OP_SeekGE, (*Window)(unsafe.Pointer(pWin)).FcsrApp, 0, regArg, 1) Xsqlite3VdbeAddOp1(tls, v, OP_Delete, (*Window)(unsafe.Pointer(pWin)).FcsrApp) Xsqlite3VdbeJumpHere(tls, v, Xsqlite3VdbeCurrentAddr(tls, v)-2) } Xsqlite3VdbeJumpHere(tls, v, addrIsNull) } else if (*Window)(unsafe.Pointer(pWin)).FregApp != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, (*Window)(unsafe.Pointer(pWin)).FregApp+1-bInverse, 1) } else if (*FuncDef)(unsafe.Pointer(pFunc)).FxSFunc != *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{noopStepFunc})) { var addrIf int32 = 0 if (*Window)(unsafe.Pointer(pWin)).FpFilter != 0 { var regTmp int32 regTmp = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_Column, csr, (*Window)(unsafe.Pointer(pWin)).FiArgCol+nArg, regTmp) addrIf = Xsqlite3VdbeAddOp3(tls, v, OP_IfNot, regTmp, 0, 1) Xsqlite3ReleaseTempReg(tls, pParse, regTmp) } if (*Window)(unsafe.Pointer(pWin)).FbExprArgs != 0 { var iOp int32 = Xsqlite3VdbeCurrentAddr(tls, v) var iEnd int32 nArg = (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOwner + 32)))).FnExpr regArg = Xsqlite3GetTempRange(tls, pParse, nArg) Xsqlite3ExprCodeExprList(tls, pParse, *(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOwner + 32)), regArg, 0, uint8(0)) for iEnd = Xsqlite3VdbeCurrentAddr(tls, v); iOp < iEnd; iOp++ { var pOp uintptr = Xsqlite3VdbeGetOp(tls, v, iOp) if int32((*VdbeOp)(unsafe.Pointer(pOp)).Fopcode) == OP_Column && (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 == (*Window)(unsafe.Pointer(pMWin)).FiEphCsr { (*VdbeOp)(unsafe.Pointer(pOp)).Fp1 = csr } } } if (*FuncDef)(unsafe.Pointer(pFunc)).FfuncFlags&U32(SQLITE_FUNC_NEEDCOLL) != 0 { var pColl uintptr pColl = Xsqlite3ExprNNCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOwner + 32))+8)).FpExpr) Xsqlite3VdbeAddOp4(tls, v, OP_CollSeq, 0, 0, 0, pColl, -2) } Xsqlite3VdbeAddOp3(tls, v, func() int32 { if bInverse != 0 { return OP_AggInverse } return OP_AggStep }(), bInverse, regArg, (*Window)(unsafe.Pointer(pWin)).FregAccum) Xsqlite3VdbeAppendP4(tls, v, pFunc, -7) Xsqlite3VdbeChangeP5(tls, v, uint16(U8(nArg))) if (*Window)(unsafe.Pointer(pWin)).FbExprArgs != 0 { Xsqlite3ReleaseTempRange(tls, pParse, regArg, nArg) } if addrIf != 0 { Xsqlite3VdbeJumpHere(tls, v, addrIf) } } } } func windowAggFinal(tls *libc.TLS, p uintptr, bFin int32) { var pParse uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpParse var pMWin uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpMWin var v uintptr = Xsqlite3GetVdbe(tls, pParse) var pWin uintptr for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid == 0 && (*FuncDef)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpWFunc)).FfuncFlags&U32(SQLITE_FUNC_MINMAX) != 0 && int32((*Window)(unsafe.Pointer(pWin)).FeStart) != TK_UNBOUNDED { Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pWin)).FregResult) Xsqlite3VdbeAddOp1(tls, v, OP_Last, (*Window)(unsafe.Pointer(pWin)).FcsrApp) Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*Window)(unsafe.Pointer(pWin)).FcsrApp, 0, (*Window)(unsafe.Pointer(pWin)).FregResult) Xsqlite3VdbeJumpHere(tls, v, Xsqlite3VdbeCurrentAddr(tls, v)-2) } else if (*Window)(unsafe.Pointer(pWin)).FregApp != 0 { } else { var nArg int32 = windowArgCount(tls, pWin) if bFin != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_AggFinal, (*Window)(unsafe.Pointer(pWin)).FregAccum, nArg) Xsqlite3VdbeAppendP4(tls, v, (*Window)(unsafe.Pointer(pWin)).FpWFunc, -7) Xsqlite3VdbeAddOp2(tls, v, OP_Copy, (*Window)(unsafe.Pointer(pWin)).FregAccum, (*Window)(unsafe.Pointer(pWin)).FregResult) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pWin)).FregAccum) } else { Xsqlite3VdbeAddOp3(tls, v, OP_AggValue, (*Window)(unsafe.Pointer(pWin)).FregAccum, nArg, (*Window)(unsafe.Pointer(pWin)).FregResult) Xsqlite3VdbeAppendP4(tls, v, (*Window)(unsafe.Pointer(pWin)).FpWFunc, -7) } } } } func windowFullScan(tls *libc.TLS, p uintptr) { var pWin uintptr var pParse uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpParse var pMWin uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpMWin var v uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpVdbe var regCRowid int32 = 0 var regCPeer int32 = 0 var regRowid int32 = 0 var regPeer int32 = 0 var nPeer int32 var lblNext int32 var lblBrk int32 var addrNext int32 var csr int32 csr = (*Window)(unsafe.Pointer(pMWin)).FcsrApp nPeer = func() int32 { if (*Window)(unsafe.Pointer(pMWin)).FpOrderBy != 0 { return (*ExprList)(unsafe.Pointer((*Window)(unsafe.Pointer(pMWin)).FpOrderBy)).FnExpr } return 0 }() lblNext = Xsqlite3VdbeMakeLabel(tls, pParse) lblBrk = Xsqlite3VdbeMakeLabel(tls, pParse) regCRowid = Xsqlite3GetTempReg(tls, pParse) regRowid = Xsqlite3GetTempReg(tls, pParse) if nPeer != 0 { regCPeer = Xsqlite3GetTempRange(tls, pParse, nPeer) regPeer = Xsqlite3GetTempRange(tls, pParse, nPeer) } Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr, regCRowid) windowReadPeerValues(tls, p, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr, regCPeer) for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pWin)).FregAccum) } Xsqlite3VdbeAddOp3(tls, v, OP_SeekGE, csr, lblBrk, (*Window)(unsafe.Pointer(pMWin)).FregStartRowid) addrNext = Xsqlite3VdbeCurrentAddr(tls, v) Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, csr, regRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Gt, (*Window)(unsafe.Pointer(pMWin)).FregEndRowid, lblBrk, regRowid) if int32((*Window)(unsafe.Pointer(pMWin)).FeExclude) == TK_CURRENT { Xsqlite3VdbeAddOp3(tls, v, OP_Eq, regCRowid, lblNext, regRowid) } else if int32((*Window)(unsafe.Pointer(pMWin)).FeExclude) != TK_NO { var addr int32 var addrEq int32 = 0 var pKeyInfo uintptr = uintptr(0) if (*Window)(unsafe.Pointer(pMWin)).FpOrderBy != 0 { pKeyInfo = Xsqlite3KeyInfoFromExprList(tls, pParse, (*Window)(unsafe.Pointer(pMWin)).FpOrderBy, 0, 0) } if int32((*Window)(unsafe.Pointer(pMWin)).FeExclude) == TK_TIES { addrEq = Xsqlite3VdbeAddOp3(tls, v, OP_Eq, regCRowid, 0, regRowid) } if pKeyInfo != 0 { windowReadPeerValues(tls, p, csr, regPeer) Xsqlite3VdbeAddOp3(tls, v, OP_Compare, regPeer, regCPeer, nPeer) Xsqlite3VdbeAppendP4(tls, v, pKeyInfo, -8) addr = Xsqlite3VdbeCurrentAddr(tls, v) + 1 Xsqlite3VdbeAddOp3(tls, v, OP_Jump, addr, lblNext, addr) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, lblNext) } if addrEq != 0 { Xsqlite3VdbeJumpHere(tls, v, addrEq) } } windowAggStep(tls, p, pMWin, csr, 0, (*WindowCodeArg)(unsafe.Pointer(p)).FregArg) Xsqlite3VdbeResolveLabel(tls, v, lblNext) Xsqlite3VdbeAddOp2(tls, v, OP_Next, csr, addrNext) Xsqlite3VdbeJumpHere(tls, v, addrNext-1) Xsqlite3VdbeJumpHere(tls, v, addrNext+1) Xsqlite3ReleaseTempReg(tls, pParse, regRowid) Xsqlite3ReleaseTempReg(tls, pParse, regCRowid) if nPeer != 0 { Xsqlite3ReleaseTempRange(tls, pParse, regPeer, nPeer) Xsqlite3ReleaseTempRange(tls, pParse, regCPeer, nPeer) } windowAggFinal(tls, p, 1) } func windowReturnOneRow(tls *libc.TLS, p uintptr) { var pMWin uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpMWin var v uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpVdbe if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid != 0 { windowFullScan(tls, p) } else { var pParse uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpParse var pWin uintptr for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { var pFunc uintptr = (*Window)(unsafe.Pointer(pWin)).FpWFunc if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&nth_valueName)) || (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&first_valueName)) { var csr int32 = (*Window)(unsafe.Pointer(pWin)).FcsrApp var lbl int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var tmpReg int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pWin)).FregResult) if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&nth_valueName)) { Xsqlite3VdbeAddOp3(tls, v, OP_Column, (*Window)(unsafe.Pointer(pMWin)).FiEphCsr, (*Window)(unsafe.Pointer(pWin)).FiArgCol+1, tmpReg) windowCheckValue(tls, pParse, tmpReg, 2) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, tmpReg) } Xsqlite3VdbeAddOp3(tls, v, OP_Add, tmpReg, (*Window)(unsafe.Pointer(pWin)).FregApp, tmpReg) Xsqlite3VdbeAddOp3(tls, v, OP_Gt, (*Window)(unsafe.Pointer(pWin)).FregApp+1, lbl, tmpReg) Xsqlite3VdbeAddOp3(tls, v, OP_SeekRowid, csr, 0, tmpReg) Xsqlite3VdbeAddOp3(tls, v, OP_Column, csr, (*Window)(unsafe.Pointer(pWin)).FiArgCol, (*Window)(unsafe.Pointer(pWin)).FregResult) Xsqlite3VdbeResolveLabel(tls, v, lbl) Xsqlite3ReleaseTempReg(tls, pParse, tmpReg) } else if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&leadName)) || (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&lagName)) { var nArg int32 = (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Window)(unsafe.Pointer(pWin)).FpOwner + 32)))).FnExpr var csr int32 = (*Window)(unsafe.Pointer(pWin)).FcsrApp var lbl int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var tmpReg int32 = Xsqlite3GetTempReg(tls, pParse) var iEph int32 = (*Window)(unsafe.Pointer(pMWin)).FiEphCsr if nArg < 3 { Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pWin)).FregResult) } else { Xsqlite3VdbeAddOp3(tls, v, OP_Column, iEph, (*Window)(unsafe.Pointer(pWin)).FiArgCol+2, (*Window)(unsafe.Pointer(pWin)).FregResult) } Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, iEph, tmpReg) if nArg < 2 { var val int32 = func() int32 { if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&leadName)) { return 1 } return -1 }() Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, tmpReg, val) } else { var op int32 = func() int32 { if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&leadName)) { return OP_Add } return OP_Subtract }() var tmpReg2 int32 = Xsqlite3GetTempReg(tls, pParse) Xsqlite3VdbeAddOp3(tls, v, OP_Column, iEph, (*Window)(unsafe.Pointer(pWin)).FiArgCol+1, tmpReg2) Xsqlite3VdbeAddOp3(tls, v, op, tmpReg2, tmpReg, tmpReg) Xsqlite3ReleaseTempReg(tls, pParse, tmpReg2) } Xsqlite3VdbeAddOp3(tls, v, OP_SeekRowid, csr, lbl, tmpReg) Xsqlite3VdbeAddOp3(tls, v, OP_Column, csr, (*Window)(unsafe.Pointer(pWin)).FiArgCol, (*Window)(unsafe.Pointer(pWin)).FregResult) Xsqlite3VdbeResolveLabel(tls, v, lbl) Xsqlite3ReleaseTempReg(tls, pParse, tmpReg) } } } Xsqlite3VdbeAddOp2(tls, v, OP_Gosub, (*WindowCodeArg)(unsafe.Pointer(p)).FregGosub, (*WindowCodeArg)(unsafe.Pointer(p)).FaddrGosub) } func windowInitAccum(tls *libc.TLS, pParse uintptr, pMWin uintptr) int32 { var v uintptr = Xsqlite3GetVdbe(tls, pParse) var regArg int32 var nArg int32 = 0 var pWin uintptr for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { var pFunc uintptr = (*Window)(unsafe.Pointer(pWin)).FpWFunc Xsqlite3VdbeAddOp2(tls, v, OP_Null, 0, (*Window)(unsafe.Pointer(pWin)).FregAccum) nArg = func() int32 { if nArg > windowArgCount(tls, pWin) { return nArg } return windowArgCount(tls, pWin) }() if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid == 0 { if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&nth_valueName)) || (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&first_valueName)) { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*Window)(unsafe.Pointer(pWin)).FregApp) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*Window)(unsafe.Pointer(pWin)).FregApp+1) } if (*FuncDef)(unsafe.Pointer(pFunc)).FfuncFlags&U32(SQLITE_FUNC_MINMAX) != 0 && (*Window)(unsafe.Pointer(pWin)).FcsrApp != 0 { Xsqlite3VdbeAddOp1(tls, v, OP_ResetSorter, (*Window)(unsafe.Pointer(pWin)).FcsrApp) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*Window)(unsafe.Pointer(pWin)).FregApp+1) } } } regArg = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nArg return regArg } func windowCacheFrame(tls *libc.TLS, pMWin uintptr) int32 { var pWin uintptr if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid != 0 { return 1 } for pWin = pMWin; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { var pFunc uintptr = (*Window)(unsafe.Pointer(pWin)).FpWFunc if (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&nth_valueName)) || (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&first_valueName)) || (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&leadName)) || (*FuncDef)(unsafe.Pointer(pFunc)).FzName == uintptr(unsafe.Pointer(&lagName)) { return 1 } } return 0 } func windowIfNewPeer(tls *libc.TLS, pParse uintptr, pOrderBy uintptr, regNew int32, regOld int32, addr int32) { var v uintptr = Xsqlite3GetVdbe(tls, pParse) if pOrderBy != 0 { var nVal int32 = (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr var pKeyInfo uintptr = Xsqlite3KeyInfoFromExprList(tls, pParse, pOrderBy, 0, 0) Xsqlite3VdbeAddOp3(tls, v, OP_Compare, regOld, regNew, nVal) Xsqlite3VdbeAppendP4(tls, v, pKeyInfo, -8) Xsqlite3VdbeAddOp3(tls, v, OP_Jump, Xsqlite3VdbeCurrentAddr(tls, v)+1, addr, Xsqlite3VdbeCurrentAddr(tls, v)+1) Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regNew, regOld, nVal-1) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addr) } } func windowCodeRangeTest(tls *libc.TLS, p uintptr, op int32, csr1 int32, regVal int32, csr2 int32, lbl int32) { var pParse uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpParse var v uintptr = Xsqlite3GetVdbe(tls, pParse) var pOrderBy uintptr = (*Window)(unsafe.Pointer((*WindowCodeArg)(unsafe.Pointer(p)).FpMWin)).FpOrderBy var reg1 int32 = Xsqlite3GetTempReg(tls, pParse) var reg2 int32 = Xsqlite3GetTempReg(tls, pParse) var regString int32 = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) var arith int32 = OP_Add var addrGe int32 var addrDone int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var pColl uintptr windowReadPeerValues(tls, p, csr1, reg1) windowReadPeerValues(tls, p, csr2, reg2) if int32((*ExprList_item)(unsafe.Pointer(pOrderBy+8)).Ffg.FsortFlags)&KEYINFO_ORDER_DESC != 0 { switch op { case OP_Ge: op = OP_Le break fallthrough case OP_Gt: op = OP_Lt break fallthrough default: op = OP_Ge break } arith = OP_Subtract } if int32((*ExprList_item)(unsafe.Pointer(pOrderBy+8)).Ffg.FsortFlags)&KEYINFO_ORDER_BIGNULL != 0 { var addr int32 = Xsqlite3VdbeAddOp1(tls, v, OP_NotNull, reg1) switch op { case OP_Ge: Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, lbl) break fallthrough case OP_Gt: Xsqlite3VdbeAddOp2(tls, v, OP_NotNull, reg2, lbl) break fallthrough case OP_Le: Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, reg2, lbl) break fallthrough default: break } Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addrDone) Xsqlite3VdbeJumpHere(tls, v, addr) Xsqlite3VdbeAddOp2(tls, v, OP_IsNull, reg2, func() int32 { if op == OP_Gt || op == OP_Ge { return addrDone } return lbl }()) } Xsqlite3VdbeAddOp4(tls, v, OP_String8, 0, regString, 0, ts+1544, -1) addrGe = Xsqlite3VdbeAddOp3(tls, v, OP_Ge, regString, 0, reg1) if op == OP_Ge && arith == OP_Add || op == OP_Le && arith == OP_Subtract { Xsqlite3VdbeAddOp3(tls, v, op, reg2, lbl, reg1) } Xsqlite3VdbeAddOp3(tls, v, arith, regVal, reg1, reg1) Xsqlite3VdbeJumpHere(tls, v, addrGe) Xsqlite3VdbeAddOp3(tls, v, op, reg2, lbl, reg1) pColl = Xsqlite3ExprNNCollSeq(tls, pParse, (*ExprList_item)(unsafe.Pointer(pOrderBy+8)).FpExpr) Xsqlite3VdbeAppendP4(tls, v, pColl, -2) Xsqlite3VdbeChangeP5(tls, v, uint16(SQLITE_NULLEQ)) Xsqlite3VdbeResolveLabel(tls, v, addrDone) Xsqlite3ReleaseTempReg(tls, pParse, reg1) Xsqlite3ReleaseTempReg(tls, pParse, reg2) } func windowCodeOp(tls *libc.TLS, p uintptr, op int32, regCountdown int32, jumpOnEof int32) int32 { var csr int32 var reg int32 var pParse uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpParse var pMWin uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpMWin var ret int32 = 0 var v uintptr = (*WindowCodeArg)(unsafe.Pointer(p)).FpVdbe var addrContinue int32 = 0 var bPeer int32 = libc.Bool32(int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) != TK_ROWS) var lblDone int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var addrNextRange int32 = 0 if op == WINDOW_AGGINVERSE && int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_UNBOUNDED { return 0 } if regCountdown > 0 { if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE { addrNextRange = Xsqlite3VdbeCurrentAddr(tls, v) if op == WINDOW_AGGINVERSE { if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_FOLLOWING { windowCodeRangeTest(tls, p, OP_Le, (*WindowCodeArg)(unsafe.Pointer(p)).Fcurrent.Fcsr, regCountdown, (*WindowCodeArg)(unsafe.Pointer(p)).Fstart.Fcsr, lblDone) } else { windowCodeRangeTest(tls, p, OP_Ge, (*WindowCodeArg)(unsafe.Pointer(p)).Fstart.Fcsr, regCountdown, (*WindowCodeArg)(unsafe.Pointer(p)).Fcurrent.Fcsr, lblDone) } } else { windowCodeRangeTest(tls, p, OP_Gt, (*WindowCodeArg)(unsafe.Pointer(p)).Fend.Fcsr, regCountdown, (*WindowCodeArg)(unsafe.Pointer(p)).Fcurrent.Fcsr, lblDone) } } else { Xsqlite3VdbeAddOp3(tls, v, OP_IfPos, regCountdown, lblDone, 1) } } if op == WINDOW_RETURN_ROW && (*Window)(unsafe.Pointer(pMWin)).FregStartRowid == 0 { windowAggFinal(tls, p, 0) } addrContinue = Xsqlite3VdbeCurrentAddr(tls, v) if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) && regCountdown != 0 && int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE { var regRowid1 int32 = Xsqlite3GetTempReg(tls, pParse) var regRowid2 int32 = Xsqlite3GetTempReg(tls, pParse) if op == WINDOW_AGGINVERSE { Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, (*WindowCodeArg)(unsafe.Pointer(p)).Fstart.Fcsr, regRowid1) Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, (*WindowCodeArg)(unsafe.Pointer(p)).Fend.Fcsr, regRowid2) Xsqlite3VdbeAddOp3(tls, v, OP_Ge, regRowid2, lblDone, regRowid1) } else if (*WindowCodeArg)(unsafe.Pointer(p)).FregRowid != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Rowid, (*WindowCodeArg)(unsafe.Pointer(p)).Fend.Fcsr, regRowid1) Xsqlite3VdbeAddOp3(tls, v, OP_Ge, (*WindowCodeArg)(unsafe.Pointer(p)).FregRowid, lblDone, regRowid1) } Xsqlite3ReleaseTempReg(tls, pParse, regRowid1) Xsqlite3ReleaseTempReg(tls, pParse, regRowid2) } switch op { case WINDOW_RETURN_ROW: csr = (*WindowCodeArg)(unsafe.Pointer(p)).Fcurrent.Fcsr reg = (*WindowCodeArg)(unsafe.Pointer(p)).Fcurrent.Freg windowReturnOneRow(tls, p) break case WINDOW_AGGINVERSE: csr = (*WindowCodeArg)(unsafe.Pointer(p)).Fstart.Fcsr reg = (*WindowCodeArg)(unsafe.Pointer(p)).Fstart.Freg if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, (*Window)(unsafe.Pointer(pMWin)).FregStartRowid, 1) } else { windowAggStep(tls, p, pMWin, csr, 1, (*WindowCodeArg)(unsafe.Pointer(p)).FregArg) } break default: csr = (*WindowCodeArg)(unsafe.Pointer(p)).Fend.Fcsr reg = (*WindowCodeArg)(unsafe.Pointer(p)).Fend.Freg if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_AddImm, (*Window)(unsafe.Pointer(pMWin)).FregEndRowid, 1) } else { windowAggStep(tls, p, pMWin, csr, 0, (*WindowCodeArg)(unsafe.Pointer(p)).FregArg) } break } if op == (*WindowCodeArg)(unsafe.Pointer(p)).FeDelete { Xsqlite3VdbeAddOp1(tls, v, OP_Delete, csr) Xsqlite3VdbeChangeP5(tls, v, uint16(OPFLAG_SAVEPOSITION)) } if jumpOnEof != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Next, csr, Xsqlite3VdbeCurrentAddr(tls, v)+2) ret = Xsqlite3VdbeAddOp0(tls, v, OP_Goto) } else { Xsqlite3VdbeAddOp2(tls, v, OP_Next, csr, Xsqlite3VdbeCurrentAddr(tls, v)+1+bPeer) if bPeer != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, lblDone) } } if bPeer != 0 { var nReg int32 = func() int32 { if (*Window)(unsafe.Pointer(pMWin)).FpOrderBy != 0 { return (*ExprList)(unsafe.Pointer((*Window)(unsafe.Pointer(pMWin)).FpOrderBy)).FnExpr } return 0 }() var regTmp int32 = func() int32 { if nReg != 0 { return Xsqlite3GetTempRange(tls, pParse, nReg) } return 0 }() windowReadPeerValues(tls, p, csr, regTmp) windowIfNewPeer(tls, pParse, (*Window)(unsafe.Pointer(pMWin)).FpOrderBy, regTmp, reg, addrContinue) Xsqlite3ReleaseTempRange(tls, pParse, regTmp, nReg) } if addrNextRange != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addrNextRange) } Xsqlite3VdbeResolveLabel(tls, v, lblDone) return ret } // Allocate and return a duplicate of the Window object indicated by the // third argument. Set the Window.pOwner field of the new object to // pOwner. func Xsqlite3WindowDup(tls *libc.TLS, db uintptr, pOwner uintptr, p uintptr) uintptr { var pNew uintptr = uintptr(0) if p != 0 { pNew = Xsqlite3DbMallocZero(tls, db, uint64(unsafe.Sizeof(Window{}))) if pNew != 0 { (*Window)(unsafe.Pointer(pNew)).FzName = Xsqlite3DbStrDup(tls, db, (*Window)(unsafe.Pointer(p)).FzName) (*Window)(unsafe.Pointer(pNew)).FzBase = Xsqlite3DbStrDup(tls, db, (*Window)(unsafe.Pointer(p)).FzBase) (*Window)(unsafe.Pointer(pNew)).FpFilter = Xsqlite3ExprDup(tls, db, (*Window)(unsafe.Pointer(p)).FpFilter, 0) (*Window)(unsafe.Pointer(pNew)).FpWFunc = (*Window)(unsafe.Pointer(p)).FpWFunc (*Window)(unsafe.Pointer(pNew)).FpPartition = Xsqlite3ExprListDup(tls, db, (*Window)(unsafe.Pointer(p)).FpPartition, 0) (*Window)(unsafe.Pointer(pNew)).FpOrderBy = Xsqlite3ExprListDup(tls, db, (*Window)(unsafe.Pointer(p)).FpOrderBy, 0) (*Window)(unsafe.Pointer(pNew)).FeFrmType = (*Window)(unsafe.Pointer(p)).FeFrmType (*Window)(unsafe.Pointer(pNew)).FeEnd = (*Window)(unsafe.Pointer(p)).FeEnd (*Window)(unsafe.Pointer(pNew)).FeStart = (*Window)(unsafe.Pointer(p)).FeStart (*Window)(unsafe.Pointer(pNew)).FeExclude = (*Window)(unsafe.Pointer(p)).FeExclude (*Window)(unsafe.Pointer(pNew)).FregResult = (*Window)(unsafe.Pointer(p)).FregResult (*Window)(unsafe.Pointer(pNew)).FregAccum = (*Window)(unsafe.Pointer(p)).FregAccum (*Window)(unsafe.Pointer(pNew)).FiArgCol = (*Window)(unsafe.Pointer(p)).FiArgCol (*Window)(unsafe.Pointer(pNew)).FiEphCsr = (*Window)(unsafe.Pointer(p)).FiEphCsr (*Window)(unsafe.Pointer(pNew)).FbExprArgs = (*Window)(unsafe.Pointer(p)).FbExprArgs (*Window)(unsafe.Pointer(pNew)).FpStart = Xsqlite3ExprDup(tls, db, (*Window)(unsafe.Pointer(p)).FpStart, 0) (*Window)(unsafe.Pointer(pNew)).FpEnd = Xsqlite3ExprDup(tls, db, (*Window)(unsafe.Pointer(p)).FpEnd, 0) (*Window)(unsafe.Pointer(pNew)).FpOwner = pOwner (*Window)(unsafe.Pointer(pNew)).FbImplicitFrame = (*Window)(unsafe.Pointer(p)).FbImplicitFrame } } return pNew } // Return a copy of the linked list of Window objects passed as the // second argument. func Xsqlite3WindowListDup(tls *libc.TLS, db uintptr, p uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var pWin uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var pp uintptr = bp for pWin = p; pWin != 0; pWin = (*Window)(unsafe.Pointer(pWin)).FpNextWin { *(*uintptr)(unsafe.Pointer(pp)) = Xsqlite3WindowDup(tls, db, uintptr(0), pWin) if *(*uintptr)(unsafe.Pointer(pp)) == uintptr(0) { break } pp = *(*uintptr)(unsafe.Pointer(pp)) + 64 } return *(*uintptr)(unsafe.Pointer(bp)) } func windowExprGtZero(tls *libc.TLS, pParse uintptr, pExpr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var ret int32 = 0 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) Xsqlite3ValueFromExpr(tls, db, pExpr, (*Sqlite3)(unsafe.Pointer(db)).Fenc, uint8(SQLITE_AFF_NUMERIC), bp) if *(*uintptr)(unsafe.Pointer(bp)) != 0 && Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(bp))) > 0 { ret = 1 } Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(bp))) return ret } // sqlite3WhereBegin() has already been called for the SELECT statement // passed as the second argument when this function is invoked. It generates // code to populate the Window.regResult register for each window function // and invoke the sub-routine at instruction addrGosub once for each row. // sqlite3WhereEnd() is always called before returning. // // This function handles several different types of window frames, which // require slightly different processing. The following pseudo code is // used to implement window frames of the form: // // ROWS BETWEEN PRECEDING AND FOLLOWING // // Other window frame types use variants of the following: // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // // if( first row of partition ){ // // Rewind three cursors, all open on the eph table. // Rewind(csrEnd); // Rewind(csrStart); // Rewind(csrCurrent); // // regEnd = // FOLLOWING expression // regStart = // PRECEDING expression // }else{ // // First time this branch is taken, the eph table contains two // // rows. The first row in the partition, which all three cursors // // currently point to, and the following row. // AGGSTEP // if( (regEnd--)<=0 ){ // RETURN_ROW // if( (regStart--)<=0 ){ // AGGINVERSE // } // } // } // } // flush: // AGGSTEP // while( 1 ){ // RETURN ROW // if( csrCurrent is EOF ) break; // if( (regStart--)<=0 ){ // AggInverse(csrStart) // Next(csrStart) // } // } // // The pseudo-code above uses the following shorthand: // // AGGSTEP: invoke the aggregate xStep() function for each window function // with arguments read from the current row of cursor csrEnd, then // step cursor csrEnd forward one row (i.e. sqlite3BtreeNext()). // // RETURN_ROW: return a row to the caller based on the contents of the // current row of csrCurrent and the current state of all // aggregates. Then step cursor csrCurrent forward one row. // // AGGINVERSE: invoke the aggregate xInverse() function for each window // functions with arguments read from the current row of cursor // csrStart. Then step csrStart forward one row. // // There are two other ROWS window frames that are handled significantly // differently from the above - "BETWEEN PRECEDING AND PRECEDING" // and "BETWEEN FOLLOWING AND FOLLOWING". These are special // cases because they change the order in which the three cursors (csrStart, // csrCurrent and csrEnd) iterate through the ephemeral table. Cases that // use UNBOUNDED or CURRENT ROW are much simpler variations on one of these // three. // // ROWS BETWEEN PRECEDING AND PRECEDING // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regEnd = // regStart = // }else{ // if( (regEnd--)<=0 ){ // AGGSTEP // } // RETURN_ROW // if( (regStart--)<=0 ){ // AGGINVERSE // } // } // } // flush: // if( (regEnd--)<=0 ){ // AGGSTEP // } // RETURN_ROW // // // ROWS BETWEEN FOLLOWING AND FOLLOWING // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regEnd = // regStart = regEnd - // }else{ // AGGSTEP // if( (regEnd--)<=0 ){ // RETURN_ROW // } // if( (regStart--)<=0 ){ // AGGINVERSE // } // } // } // flush: // AGGSTEP // while( 1 ){ // if( (regEnd--)<=0 ){ // RETURN_ROW // if( eof ) break; // } // if( (regStart--)<=0 ){ // AGGINVERSE // if( eof ) break // } // } // while( !eof csrCurrent ){ // RETURN_ROW // } // // For the most part, the patterns above are adapted to support UNBOUNDED by // assuming that it is equivalent to "infinity PRECEDING/FOLLOWING" and // CURRENT ROW by assuming that it is equivilent to "0 PRECEDING/FOLLOWING". // This is optimized of course - branches that will never be taken and // conditions that are always true are omitted from the VM code. The only // exceptional case is: // // ROWS BETWEEN FOLLOWING AND UNBOUNDED FOLLOWING // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regStart = // }else{ // AGGSTEP // } // } // flush: // AGGSTEP // while( 1 ){ // if( (regStart--)<=0 ){ // AGGINVERSE // if( eof ) break // } // RETURN_ROW // } // while( !eof csrCurrent ){ // RETURN_ROW // } // // Also requiring special handling are the cases: // // ROWS BETWEEN PRECEDING AND PRECEDING // ROWS BETWEEN FOLLOWING AND FOLLOWING // // when (expr1 < expr2). This is detected at runtime, not by this function. // To handle this case, the pseudo-code programs depicted above are modified // slightly to be: // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regEnd = // regStart = // if( regEnd < regStart ){ // RETURN_ROW // delete eph table contents // continue // } // ... // // The new "continue" statement in the above jumps to the next iteration // of the outer loop - the one started by sqlite3WhereBegin(). // // The various GROUPS cases are implemented using the same patterns as // ROWS. The VM code is modified slightly so that: // // 1. The else branch in the main loop is only taken if the row just // added to the ephemeral table is the start of a new group. In // other words, it becomes: // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regEnd = // regStart = // }else if( new group ){ // ... // } // } // // 2. Instead of processing a single row, each RETURN_ROW, AGGSTEP or // AGGINVERSE step processes the current row of the relevant cursor and // all subsequent rows belonging to the same group. // // RANGE window frames are a little different again. As for GROUPS, the // main loop runs once per group only. And RETURN_ROW, AGGSTEP and AGGINVERSE // deal in groups instead of rows. As for ROWS and GROUPS, there are three // basic cases: // // RANGE BETWEEN PRECEDING AND FOLLOWING // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regEnd = // regStart = // }else{ // AGGSTEP // while( (csrCurrent.key + regEnd) < csrEnd.key ){ // RETURN_ROW // while( csrStart.key + regStart) < csrCurrent.key ){ // AGGINVERSE // } // } // } // } // flush: // AGGSTEP // while( 1 ){ // RETURN ROW // if( csrCurrent is EOF ) break; // while( csrStart.key + regStart) < csrCurrent.key ){ // AGGINVERSE // } // } // } // // In the above notation, "csr.key" means the current value of the ORDER BY // expression (there is only ever 1 for a RANGE that uses an FOLLOWING // or PRECEDING AND PRECEDING // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regEnd = // regStart = // }else{ // while( (csrEnd.key + regEnd) <= csrCurrent.key ){ // AGGSTEP // } // while( (csrStart.key + regStart) < csrCurrent.key ){ // AGGINVERSE // } // RETURN_ROW // } // } // flush: // while( (csrEnd.key + regEnd) <= csrCurrent.key ){ // AGGSTEP // } // while( (csrStart.key + regStart) < csrCurrent.key ){ // AGGINVERSE // } // RETURN_ROW // // RANGE BETWEEN FOLLOWING AND FOLLOWING // // ... loop started by sqlite3WhereBegin() ... // if( new partition ){ // Gosub flush // } // Insert new row into eph table. // if( first row of partition ){ // Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) // regEnd = // regStart = // }else{ // AGGSTEP // while( (csrCurrent.key + regEnd) < csrEnd.key ){ // while( (csrCurrent.key + regStart) > csrStart.key ){ // AGGINVERSE // } // RETURN_ROW // } // } // } // flush: // AGGSTEP // while( 1 ){ // while( (csrCurrent.key + regStart) > csrStart.key ){ // AGGINVERSE // if( eof ) break "while( 1 )" loop. // } // RETURN_ROW // } // while( !eof csrCurrent ){ // RETURN_ROW // } // // The text above leaves out many details. Refer to the code and comments // below for a more complete picture. func Xsqlite3WindowCodeStep(tls *libc.TLS, pParse uintptr, p uintptr, pWInfo uintptr, regGosub int32, addrGosub int32) { bp := tls.Alloc(72) defer tls.Free(72) var pMWin uintptr = (*Select)(unsafe.Pointer(p)).FpWin var pOrderBy uintptr = (*Window)(unsafe.Pointer(pMWin)).FpOrderBy var v uintptr = Xsqlite3GetVdbe(tls, pParse) var csrWrite int32 var csrInput int32 = (*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FiCursor var nInput int32 = int32((*Table)(unsafe.Pointer((*SrcItem)(unsafe.Pointer((*Select)(unsafe.Pointer(p)).FpSrc + 8)).FpTab)).FnCol) var iInput int32 var addrNe int32 var addrGosubFlush int32 = 0 var addrInteger int32 = 0 var addrEmpty int32 var regNew int32 var regRecord int32 var regNewPeer int32 = 0 var regPeer int32 = 0 var regFlushPart int32 = 0 var lblWhereEnd int32 var regStart int32 = 0 var regEnd int32 = 0 lblWhereEnd = Xsqlite3VdbeMakeLabel(tls, pParse) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(WindowCodeArg{}))) (*WindowCodeArg)(unsafe.Pointer(bp)).FpParse = pParse (*WindowCodeArg)(unsafe.Pointer(bp)).FpMWin = pMWin (*WindowCodeArg)(unsafe.Pointer(bp)).FpVdbe = v (*WindowCodeArg)(unsafe.Pointer(bp)).FregGosub = regGosub (*WindowCodeArg)(unsafe.Pointer(bp)).FaddrGosub = addrGosub (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr = (*Window)(unsafe.Pointer(pMWin)).FiEphCsr csrWrite = (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr + 1 (*WindowCodeArg)(unsafe.Pointer(bp)).Fstart.Fcsr = (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr + 2 (*WindowCodeArg)(unsafe.Pointer(bp)).Fend.Fcsr = (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr + 3 switch int32((*Window)(unsafe.Pointer(pMWin)).FeStart) { case TK_FOLLOWING: if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) != TK_RANGE && windowExprGtZero(tls, pParse, (*Window)(unsafe.Pointer(pMWin)).FpStart) != 0 { (*WindowCodeArg)(unsafe.Pointer(bp)).FeDelete = WINDOW_RETURN_ROW } break case TK_UNBOUNDED: if windowCacheFrame(tls, pMWin) == 0 { if int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) == TK_PRECEDING { if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) != TK_RANGE && windowExprGtZero(tls, pParse, (*Window)(unsafe.Pointer(pMWin)).FpEnd) != 0 { (*WindowCodeArg)(unsafe.Pointer(bp)).FeDelete = WINDOW_AGGSTEP } } else { (*WindowCodeArg)(unsafe.Pointer(bp)).FeDelete = WINDOW_RETURN_ROW } } break default: (*WindowCodeArg)(unsafe.Pointer(bp)).FeDelete = WINDOW_AGGINVERSE break } regNew = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nInput regRecord = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) (*WindowCodeArg)(unsafe.Pointer(bp)).FregRowid = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_PRECEDING || int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_FOLLOWING { regStart = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) } if int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) == TK_PRECEDING || int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) == TK_FOLLOWING { regEnd = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) } if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) != TK_ROWS { var nPeer int32 = func() int32 { if pOrderBy != 0 { return (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr } return 0 }() regNewPeer = regNew + (*Window)(unsafe.Pointer(pMWin)).FnBufferCol if (*Window)(unsafe.Pointer(pMWin)).FpPartition != 0 { regNewPeer = regNewPeer + (*ExprList)(unsafe.Pointer((*Window)(unsafe.Pointer(pMWin)).FpPartition)).FnExpr } regPeer = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nPeer (*WindowCodeArg)(unsafe.Pointer(bp)).Fstart.Freg = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nPeer (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Freg = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nPeer (*WindowCodeArg)(unsafe.Pointer(bp)).Fend.Freg = (*Parse)(unsafe.Pointer(pParse)).FnMem + 1 *(*int32)(unsafe.Pointer(pParse + 56)) += nPeer } for iInput = 0; iInput < nInput; iInput++ { Xsqlite3VdbeAddOp3(tls, v, OP_Column, csrInput, iInput, regNew+iInput) } Xsqlite3VdbeAddOp3(tls, v, OP_MakeRecord, regNew, nInput, regRecord) if (*Window)(unsafe.Pointer(pMWin)).FpPartition != 0 { var addr int32 var pPart uintptr = (*Window)(unsafe.Pointer(pMWin)).FpPartition var nPart int32 = (*ExprList)(unsafe.Pointer(pPart)).FnExpr var regNewPart int32 = regNew + (*Window)(unsafe.Pointer(pMWin)).FnBufferCol var pKeyInfo uintptr = Xsqlite3KeyInfoFromExprList(tls, pParse, pPart, 0, 0) regFlushPart = libc.PreIncInt32(&(*Parse)(unsafe.Pointer(pParse)).FnMem, 1) addr = Xsqlite3VdbeAddOp3(tls, v, OP_Compare, regNewPart, (*Window)(unsafe.Pointer(pMWin)).FregPart, nPart) Xsqlite3VdbeAppendP4(tls, v, pKeyInfo, -8) Xsqlite3VdbeAddOp3(tls, v, OP_Jump, addr+2, addr+4, addr+2) addrGosubFlush = Xsqlite3VdbeAddOp1(tls, v, OP_Gosub, regFlushPart) Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regNewPart, (*Window)(unsafe.Pointer(pMWin)).FregPart, nPart-1) } Xsqlite3VdbeAddOp2(tls, v, OP_NewRowid, csrWrite, (*WindowCodeArg)(unsafe.Pointer(bp)).FregRowid) Xsqlite3VdbeAddOp3(tls, v, OP_Insert, csrWrite, regRecord, (*WindowCodeArg)(unsafe.Pointer(bp)).FregRowid) addrNe = Xsqlite3VdbeAddOp3(tls, v, OP_Ne, (*Window)(unsafe.Pointer(pMWin)).FregOne, 0, (*WindowCodeArg)(unsafe.Pointer(bp)).FregRowid) (*WindowCodeArg)(unsafe.Pointer(bp)).FregArg = windowInitAccum(tls, pParse, pMWin) if regStart != 0 { Xsqlite3ExprCode(tls, pParse, (*Window)(unsafe.Pointer(pMWin)).FpStart, regStart) windowCheckValue(tls, pParse, regStart, 0+func() int32 { if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE { return 3 } return 0 }()) } if regEnd != 0 { Xsqlite3ExprCode(tls, pParse, (*Window)(unsafe.Pointer(pMWin)).FpEnd, regEnd) windowCheckValue(tls, pParse, regEnd, 1+func() int32 { if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE { return 3 } return 0 }()) } if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) != TK_RANGE && int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) && regStart != 0 { var op int32 = func() int32 { if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_FOLLOWING { return OP_Ge } return OP_Le }() var addrGe int32 = Xsqlite3VdbeAddOp3(tls, v, op, regStart, 0, regEnd) windowAggFinal(tls, bp, 0) Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr) windowReturnOneRow(tls, bp) Xsqlite3VdbeAddOp1(tls, v, OP_ResetSorter, (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, lblWhereEnd) Xsqlite3VdbeJumpHere(tls, v, addrGe) } if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_FOLLOWING && int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) != TK_RANGE && regEnd != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Subtract, regStart, regEnd, regStart) } if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) != TK_UNBOUNDED { Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, (*WindowCodeArg)(unsafe.Pointer(bp)).Fstart.Fcsr) } Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr) Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, (*WindowCodeArg)(unsafe.Pointer(bp)).Fend.Fcsr) if regPeer != 0 && pOrderBy != 0 { Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regNewPeer, regPeer, (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr-1) Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regPeer, (*WindowCodeArg)(unsafe.Pointer(bp)).Fstart.Freg, (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr-1) Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regPeer, (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Freg, (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr-1) Xsqlite3VdbeAddOp3(tls, v, OP_Copy, regPeer, (*WindowCodeArg)(unsafe.Pointer(bp)).Fend.Freg, (*ExprList)(unsafe.Pointer(pOrderBy)).FnExpr-1) } Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, lblWhereEnd) Xsqlite3VdbeJumpHere(tls, v, addrNe) if regPeer != 0 { windowIfNewPeer(tls, pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd) } if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_FOLLOWING { windowCodeOp(tls, bp, WINDOW_AGGSTEP, 0, 0) if int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) != TK_UNBOUNDED { if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE { var lbl int32 = Xsqlite3VdbeMakeLabel(tls, pParse) var addrNext int32 = Xsqlite3VdbeCurrentAddr(tls, v) windowCodeRangeTest(tls, bp, OP_Ge, (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr, regEnd, (*WindowCodeArg)(unsafe.Pointer(bp)).Fend.Fcsr, lbl) windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 0) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addrNext) Xsqlite3VdbeResolveLabel(tls, v, lbl) } else { windowCodeOp(tls, bp, WINDOW_RETURN_ROW, regEnd, 0) windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) } } } else if int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) == TK_PRECEDING { var bRPS int32 = libc.Bool32(int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_PRECEDING && int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE) windowCodeOp(tls, bp, WINDOW_AGGSTEP, regEnd, 0) if bRPS != 0 { windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) } windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 0) if !(bRPS != 0) { windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) } } else { var addr int32 = 0 windowCodeOp(tls, bp, WINDOW_AGGSTEP, 0, 0) if int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) != TK_UNBOUNDED { if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE { var lbl int32 = 0 addr = Xsqlite3VdbeCurrentAddr(tls, v) if regEnd != 0 { lbl = Xsqlite3VdbeMakeLabel(tls, pParse) windowCodeRangeTest(tls, bp, OP_Ge, (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr, regEnd, (*WindowCodeArg)(unsafe.Pointer(bp)).Fend.Fcsr, lbl) } windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 0) windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) if regEnd != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addr) Xsqlite3VdbeResolveLabel(tls, v, lbl) } } else { if regEnd != 0 { addr = Xsqlite3VdbeAddOp3(tls, v, OP_IfPos, regEnd, 0, 1) } windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 0) windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) if regEnd != 0 { Xsqlite3VdbeJumpHere(tls, v, addr) } } } } Xsqlite3VdbeResolveLabel(tls, v, lblWhereEnd) Xsqlite3WhereEnd(tls, pWInfo) if (*Window)(unsafe.Pointer(pMWin)).FpPartition != 0 { addrInteger = Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, regFlushPart) Xsqlite3VdbeJumpHere(tls, v, addrGosubFlush) } (*WindowCodeArg)(unsafe.Pointer(bp)).FregRowid = 0 addrEmpty = Xsqlite3VdbeAddOp1(tls, v, OP_Rewind, csrWrite) if int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) == TK_PRECEDING { var bRPS int32 = libc.Bool32(int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_PRECEDING && int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE) windowCodeOp(tls, bp, WINDOW_AGGSTEP, regEnd, 0) if bRPS != 0 { windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) } windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 0) } else if int32((*Window)(unsafe.Pointer(pMWin)).FeStart) == TK_FOLLOWING { var addrStart int32 var addrBreak1 int32 var addrBreak2 int32 var addrBreak3 int32 windowCodeOp(tls, bp, WINDOW_AGGSTEP, 0, 0) if int32((*Window)(unsafe.Pointer(pMWin)).FeFrmType) == TK_RANGE { addrStart = Xsqlite3VdbeCurrentAddr(tls, v) addrBreak2 = windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 1) addrBreak1 = windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 1) } else if int32((*Window)(unsafe.Pointer(pMWin)).FeEnd) == TK_UNBOUNDED { addrStart = Xsqlite3VdbeCurrentAddr(tls, v) addrBreak1 = windowCodeOp(tls, bp, WINDOW_RETURN_ROW, regStart, 1) addrBreak2 = windowCodeOp(tls, bp, WINDOW_AGGINVERSE, 0, 1) } else { addrStart = Xsqlite3VdbeCurrentAddr(tls, v) addrBreak1 = windowCodeOp(tls, bp, WINDOW_RETURN_ROW, regEnd, 1) addrBreak2 = windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 1) } Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addrStart) Xsqlite3VdbeJumpHere(tls, v, addrBreak2) addrStart = Xsqlite3VdbeCurrentAddr(tls, v) addrBreak3 = windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 1) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addrStart) Xsqlite3VdbeJumpHere(tls, v, addrBreak1) Xsqlite3VdbeJumpHere(tls, v, addrBreak3) } else { var addrBreak int32 var addrStart int32 windowCodeOp(tls, bp, WINDOW_AGGSTEP, 0, 0) addrStart = Xsqlite3VdbeCurrentAddr(tls, v) addrBreak = windowCodeOp(tls, bp, WINDOW_RETURN_ROW, 0, 1) windowCodeOp(tls, bp, WINDOW_AGGINVERSE, regStart, 0) Xsqlite3VdbeAddOp2(tls, v, OP_Goto, 0, addrStart) Xsqlite3VdbeJumpHere(tls, v, addrBreak) } Xsqlite3VdbeJumpHere(tls, v, addrEmpty) Xsqlite3VdbeAddOp1(tls, v, OP_ResetSorter, (*WindowCodeArg)(unsafe.Pointer(bp)).Fcurrent.Fcsr) if (*Window)(unsafe.Pointer(pMWin)).FpPartition != 0 { if (*Window)(unsafe.Pointer(pMWin)).FregStartRowid != 0 { Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 1, (*Window)(unsafe.Pointer(pMWin)).FregStartRowid) Xsqlite3VdbeAddOp2(tls, v, OP_Integer, 0, (*Window)(unsafe.Pointer(pMWin)).FregEndRowid) } Xsqlite3VdbeChangeP1(tls, v, addrInteger, Xsqlite3VdbeCurrentAddr(tls, v)) Xsqlite3VdbeAddOp1(tls, v, OP_Return, regFlushPart) } } // An instance of the following structure describes the event of a // TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, // TK_DELETE, or TK_INSTEAD. If the event is of the form // // UPDATE ON (a,b,c) // // Then the "b" IdList records the list "a,b,c". type TrigEvent = struct { Fa int32 F__ccgo_pad1 [4]byte Fb uintptr } type FrameBound = struct { FeType int32 F__ccgo_pad1 [4]byte FpExpr uintptr } func disableLookaside(tls *libc.TLS, pParse uintptr) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb (*Parse)(unsafe.Pointer(pParse)).FdisableLookaside++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable++ (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) } func parserDoubleLinkSelect(tls *libc.TLS, pParse uintptr, p uintptr) { bp := tls.Alloc(16) defer tls.Free(16) if (*Select)(unsafe.Pointer(p)).FpPrior != 0 { var pNext uintptr = uintptr(0) var pLoop uintptr = p var mxSelect int32 var cnt int32 = 1 for 1 != 0 { (*Select)(unsafe.Pointer(pLoop)).FpNext = pNext *(*U32)(unsafe.Pointer(pLoop + 4)) |= U32(SF_Compound) pNext = pLoop pLoop = (*Select)(unsafe.Pointer(pLoop)).FpPrior if pLoop == uintptr(0) { break } cnt++ if (*Select)(unsafe.Pointer(pLoop)).FpOrderBy != 0 || (*Select)(unsafe.Pointer(pLoop)).FpLimit != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+24233, libc.VaList(bp, func() uintptr { if (*Select)(unsafe.Pointer(pLoop)).FpOrderBy != uintptr(0) { return ts + 24275 } return ts + 24284 }(), Xsqlite3SelectOpName(tls, int32((*Select)(unsafe.Pointer(pNext)).Fop)))) break } } if (*Select)(unsafe.Pointer(p)).FselFlags&U32(SF_MultiValue) == U32(0) && libc.AssignInt32(&mxSelect, *(*int32)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb + 136 + 4*4))) > 0 && cnt > mxSelect { Xsqlite3ErrorMsg(tls, pParse, ts+24290, 0) } } } func attachWithToSelect(tls *libc.TLS, pParse uintptr, pSelect uintptr, pWith uintptr) uintptr { if pSelect != 0 { (*Select)(unsafe.Pointer(pSelect)).FpWith = pWith parserDoubleLinkSelect(tls, pParse, pSelect) } else { Xsqlite3WithDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pWith) } return pSelect } func tokenExpr(tls *libc.TLS, pParse uintptr, op int32, t Token) uintptr { bp := tls.Alloc(16) defer tls.Free(16) *(*Token)(unsafe.Pointer(bp)) = t var p uintptr = Xsqlite3DbMallocRawNN(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Expr{}))+uint64((*Token)(unsafe.Pointer(bp)).Fn)+uint64(1)) if p != 0 { (*Expr)(unsafe.Pointer(p)).Fop = U8(op) (*Expr)(unsafe.Pointer(p)).FaffExpr = int8(0) (*Expr)(unsafe.Pointer(p)).Fflags = U32(EP_Leaf) (*Expr)(unsafe.Pointer(p)).FpLeft = libc.AssignPtrUintptr(p+24, uintptr(0)) (*Expr)(unsafe.Pointer(p)).FpAggInfo = uintptr(0) libc.Xmemset(tls, p+32, 0, uint64(unsafe.Sizeof(struct{ FpList uintptr }{}))) libc.Xmemset(tls, p+64, 0, uint64(unsafe.Sizeof(struct{ FpTab uintptr }{}))) (*Expr)(unsafe.Pointer(p)).Fop2 = U8(0) (*Expr)(unsafe.Pointer(p)).FiTable = 0 (*Expr)(unsafe.Pointer(p)).FiColumn = int16(0) *(*uintptr)(unsafe.Pointer(p + 8)) = p + 1*72 libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(p + 8)), (*Token)(unsafe.Pointer(bp)).Fz, uint64((*Token)(unsafe.Pointer(bp)).Fn)) *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 8)) + uintptr((*Token)(unsafe.Pointer(bp)).Fn))) = int8(0) *(*int32)(unsafe.Pointer(p + 52)) = int32((int64((*Token)(unsafe.Pointer(bp)).Fz) - int64((*Parse)(unsafe.Pointer(pParse)).FzTail)) / 1) if int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(p + 8)))))])&0x80 != 0 { Xsqlite3DequoteExpr(tls, p) } (*Expr)(unsafe.Pointer(p)).FnHeight = 1 if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { return Xsqlite3RenameTokenMap(tls, pParse, p, bp) } } return p } func binaryToUnaryIfNull(tls *libc.TLS, pParse uintptr, pY uintptr, pA uintptr, op int32) { var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb if pA != 0 && pY != 0 && int32((*Expr)(unsafe.Pointer(pY)).Fop) == TK_NULL && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { (*Expr)(unsafe.Pointer(pA)).Fop = U8(op) Xsqlite3ExprDelete(tls, db, (*Expr)(unsafe.Pointer(pA)).FpRight) (*Expr)(unsafe.Pointer(pA)).FpRight = uintptr(0) } } func parserAddExprIdListTerm(tls *libc.TLS, pParse uintptr, pPrior uintptr, pIdToken uintptr, hasCollate int32, sortOrder int32) uintptr { bp := tls.Alloc(16) defer tls.Free(16) var p uintptr = Xsqlite3ExprListAppend(tls, pParse, pPrior, uintptr(0)) if (hasCollate != 0 || sortOrder != -1) && int32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Finit.Fbusy) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+24324, libc.VaList(bp, (*Token)(unsafe.Pointer(pIdToken)).Fn, (*Token)(unsafe.Pointer(pIdToken)).Fz)) } Xsqlite3ExprListSetName(tls, pParse, p, pIdToken, 1) return p } // The next sections is a series of control #defines. // various aspects of the generated parser. // // YYCODETYPE is the data type used to store the integer codes // that represent terminal and non-terminal symbols. // "unsigned char" is used if there are fewer than // 256 symbols. Larger types otherwise. // YYNOCODE is a number of type YYCODETYPE that is not used for // any terminal or nonterminal symbol. // YYFALLBACK If defined, this indicates that one or more tokens // (also known as: "terminal symbols") have fall-back // values which should be used if the original symbol // would not parse. This permits keywords to sometimes // be used as identifiers, for example. // YYACTIONTYPE is the data type used for "action codes" - numbers // that indicate what to do in response to the next // token. // sqlite3ParserTOKENTYPE is the data type used for minor type for terminal // symbols. Background: A "minor type" is a semantic // value associated with a terminal or non-terminal // symbols. For example, for an "ID" terminal symbol, // the minor type might be the name of the identifier. // Each non-terminal can have a different minor type. // Terminal symbols all have the same minor type, though. // This macros defines the minor type for terminal // symbols. // YYMINORTYPE is the data type used for all minor types. // This is typically a union of many types, one of // which is sqlite3ParserTOKENTYPE. The entry in the union // for terminal symbols is called "yy0". // YYSTACKDEPTH is the maximum depth of the parser's stack. If // zero the stack is dynamically sized using realloc() // sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument // sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument // sqlite3ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter // sqlite3ParserARG_STORE Code to store %extra_argument into yypParser // sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser // sqlite3ParserCTX_* As sqlite3ParserARG_ except for %extra_context // YYERRORSYMBOL is the code number of the error symbol. If not // defined, then do no error processing. // YYNSTATE the combined number of states. // YYNRULE the number of rules in the grammar // YYNTOKEN Number of terminal symbols // YY_MAX_SHIFT Maximum value for shift actions // YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions // YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions // YY_ERROR_ACTION The yy_action[] code for syntax error // YY_ACCEPT_ACTION The yy_action[] code for accept // YY_NO_ACTION The yy_action[] code for no-op // YY_MIN_REDUCE Minimum value for reduce actions // YY_MAX_REDUCE Maximum value for reduce actions // // ************ Begin control #defines **************************************** type YYMINORTYPE = struct { F__ccgo_pad1 [0]uint64 Fyyinit int32 F__ccgo_pad2 [12]byte } var yy_action = [2098]uint16{ uint16(568), uint16(208), uint16(568), uint16(118), uint16(115), uint16(229), uint16(568), uint16(118), uint16(115), uint16(229), uint16(568), uint16(1314), uint16(377), uint16(1293), uint16(408), uint16(562), uint16(562), uint16(562), uint16(568), uint16(409), uint16(378), uint16(1314), uint16(1276), uint16(41), uint16(41), uint16(41), uint16(41), uint16(208), uint16(1526), uint16(71), uint16(71), uint16(971), uint16(419), uint16(41), uint16(41), uint16(491), uint16(303), uint16(279), uint16(303), uint16(972), uint16(397), uint16(71), uint16(71), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(476), uint16(409), uint16(1241), uint16(1), uint16(1), uint16(575), uint16(2), uint16(1245), uint16(550), uint16(118), uint16(115), uint16(229), uint16(317), uint16(480), uint16(146), uint16(480), uint16(524), uint16(118), uint16(115), uint16(229), uint16(529), uint16(1327), uint16(417), uint16(523), uint16(142), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(118), uint16(115), uint16(229), uint16(327), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(284), uint16(284), uint16(284), uint16(284), uint16(442), uint16(442), uint16(442), uint16(1567), uint16(376), uint16(1569), uint16(1192), uint16(375), uint16(1163), uint16(565), uint16(1163), uint16(565), uint16(409), uint16(1567), uint16(537), uint16(259), uint16(226), uint16(444), uint16(101), uint16(145), uint16(449), uint16(316), uint16(559), uint16(240), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(142), uint16(294), uint16(1192), uint16(339), uint16(448), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(127), uint16(1192), uint16(1193), uint16(1194), uint16(148), uint16(441), uint16(440), uint16(568), uint16(119), uint16(116), uint16(444), uint16(124), uint16(124), uint16(124), uint16(124), uint16(117), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(454), uint16(113), uint16(13), uint16(13), uint16(546), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(422), uint16(316), uint16(559), uint16(1192), uint16(1193), uint16(1194), uint16(149), uint16(1224), uint16(409), uint16(1224), uint16(124), uint16(124), uint16(124), uint16(124), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(465), uint16(342), uint16(1037), uint16(1037), uint16(1051), uint16(1054), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(1279), uint16(522), uint16(222), uint16(1192), uint16(568), uint16(409), uint16(224), uint16(514), uint16(175), uint16(82), uint16(83), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1007), uint16(16), uint16(16), uint16(1192), uint16(133), uint16(133), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1041), uint16(546), uint16(1192), uint16(373), uint16(1192), uint16(1193), uint16(1194), uint16(252), uint16(1434), uint16(399), uint16(504), uint16(501), uint16(500), uint16(111), uint16(560), uint16(566), uint16(4), uint16(926), uint16(926), uint16(433), uint16(499), uint16(340), uint16(460), uint16(328), uint16(360), uint16(394), uint16(1237), uint16(1192), uint16(1193), uint16(1194), uint16(563), uint16(568), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(284), uint16(284), uint16(369), uint16(1580), uint16(1607), uint16(441), uint16(440), uint16(154), uint16(409), uint16(445), uint16(71), uint16(71), uint16(1286), uint16(565), uint16(1221), uint16(1192), uint16(1193), uint16(1194), uint16(85), uint16(1223), uint16(271), uint16(557), uint16(543), uint16(515), uint16(1561), uint16(568), uint16(98), uint16(1222), uint16(6), uint16(1278), uint16(472), uint16(142), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(550), uint16(13), uint16(13), uint16(1027), uint16(507), uint16(1224), uint16(1192), uint16(1224), uint16(549), uint16(109), uint16(109), uint16(222), uint16(568), uint16(1238), uint16(175), uint16(568), uint16(427), uint16(110), uint16(197), uint16(445), uint16(570), uint16(569), uint16(430), uint16(1552), uint16(1017), uint16(325), uint16(551), uint16(1192), uint16(270), uint16(287), uint16(368), uint16(510), uint16(363), uint16(509), uint16(257), uint16(71), uint16(71), uint16(543), uint16(71), uint16(71), uint16(359), uint16(316), uint16(559), uint16(1613), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(284), uint16(284), uint16(1192), uint16(1193), uint16(1194), uint16(1158), uint16(568), uint16(1612), uint16(409), uint16(901), uint16(190), uint16(550), uint16(356), uint16(565), uint16(550), uint16(937), uint16(533), uint16(517), uint16(1158), uint16(516), uint16(413), uint16(1158), uint16(552), uint16(1192), uint16(1193), uint16(1194), uint16(568), uint16(544), uint16(1554), uint16(51), uint16(51), uint16(214), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(1192), uint16(474), uint16(135), uint16(135), uint16(409), uint16(284), uint16(284), uint16(1490), uint16(505), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1007), uint16(565), uint16(518), uint16(217), uint16(541), uint16(1561), uint16(316), uint16(559), uint16(142), uint16(6), uint16(532), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(1555), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(485), uint16(1192), uint16(1193), uint16(1194), uint16(482), uint16(281), uint16(1267), uint16(957), uint16(252), uint16(1192), uint16(373), uint16(504), uint16(501), uint16(500), uint16(1192), uint16(340), uint16(571), uint16(1192), uint16(571), uint16(409), uint16(292), uint16(499), uint16(957), uint16(876), uint16(191), uint16(480), uint16(316), uint16(559), uint16(384), uint16(290), uint16(380), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(409), uint16(394), uint16(1136), uint16(1192), uint16(869), uint16(100), uint16(284), uint16(284), uint16(1192), uint16(1193), uint16(1194), uint16(373), uint16(1093), uint16(1192), uint16(1193), uint16(1194), uint16(1192), uint16(1193), uint16(1194), uint16(565), uint16(455), uint16(32), uint16(373), uint16(233), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(1433), uint16(959), uint16(568), uint16(228), uint16(958), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1158), uint16(228), uint16(1192), uint16(157), uint16(1192), uint16(1193), uint16(1194), uint16(1553), uint16(13), uint16(13), uint16(301), uint16(957), uint16(1232), uint16(1158), uint16(153), uint16(409), uint16(1158), uint16(373), uint16(1583), uint16(1176), uint16(5), uint16(369), uint16(1580), uint16(429), uint16(1238), uint16(3), uint16(957), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(409), uint16(208), uint16(567), uint16(1192), uint16(1028), uint16(1192), uint16(1193), uint16(1194), uint16(1192), uint16(388), uint16(852), uint16(155), uint16(1552), uint16(286), uint16(402), uint16(1098), uint16(1098), uint16(488), uint16(568), uint16(465), uint16(342), uint16(1319), uint16(1319), uint16(1552), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(129), uint16(568), uint16(13), uint16(13), uint16(374), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(302), uint16(568), uint16(453), uint16(528), uint16(1192), uint16(1193), uint16(1194), uint16(13), uint16(13), uint16(1192), uint16(1193), uint16(1194), uint16(1297), uint16(463), uint16(1267), uint16(409), uint16(1317), uint16(1317), uint16(1552), uint16(1012), uint16(453), uint16(452), uint16(200), uint16(299), uint16(71), uint16(71), uint16(1265), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(409), uint16(227), uint16(1073), uint16(1158), uint16(284), uint16(284), uint16(419), uint16(312), uint16(278), uint16(278), uint16(285), uint16(285), uint16(1419), uint16(406), uint16(405), uint16(382), uint16(1158), uint16(565), uint16(568), uint16(1158), uint16(1196), uint16(565), uint16(1600), uint16(565), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(453), uint16(1482), uint16(13), uint16(13), uint16(1536), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(201), uint16(568), uint16(354), uint16(1586), uint16(575), uint16(2), uint16(1245), uint16(840), uint16(841), uint16(842), uint16(1562), uint16(317), uint16(1212), uint16(146), uint16(6), uint16(409), uint16(255), uint16(254), uint16(253), uint16(206), uint16(1327), uint16(9), uint16(1196), uint16(262), uint16(71), uint16(71), uint16(424), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(568), uint16(284), uint16(284), uint16(568), uint16(1213), uint16(409), uint16(574), uint16(313), uint16(1245), uint16(349), uint16(1296), uint16(352), uint16(419), uint16(317), uint16(565), uint16(146), uint16(491), uint16(525), uint16(1643), uint16(395), uint16(371), uint16(491), uint16(1327), uint16(70), uint16(70), uint16(1295), uint16(71), uint16(71), uint16(240), uint16(1325), uint16(104), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1114), uint16(284), uint16(284), uint16(428), uint16(448), uint16(1525), uint16(1213), uint16(439), uint16(284), uint16(284), uint16(1489), uint16(1352), uint16(311), uint16(474), uint16(565), uint16(1115), uint16(971), uint16(491), uint16(491), uint16(217), uint16(1263), uint16(565), uint16(1538), uint16(568), uint16(972), uint16(207), uint16(568), uint16(1027), uint16(240), uint16(383), uint16(1116), uint16(519), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1018), uint16(107), uint16(71), uint16(71), uint16(1017), uint16(13), uint16(13), uint16(912), uint16(568), uint16(1495), uint16(568), uint16(284), uint16(284), uint16(97), uint16(526), uint16(491), uint16(448), uint16(913), uint16(1326), uint16(1322), uint16(545), uint16(409), uint16(284), uint16(284), uint16(565), uint16(151), uint16(209), uint16(1495), uint16(1497), uint16(262), uint16(450), uint16(55), uint16(55), uint16(56), uint16(56), uint16(565), uint16(1017), uint16(1017), uint16(1019), uint16(443), uint16(332), uint16(409), uint16(527), uint16(12), uint16(295), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(347), uint16(409), uint16(864), uint16(1534), uint16(1213), uint16(125), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(1137), uint16(1641), uint16(474), uint16(1641), uint16(371), uint16(125), uint16(114), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(1495), uint16(329), uint16(474), uint16(331), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(203), uint16(1419), uint16(568), uint16(1294), uint16(864), uint16(464), uint16(1213), uint16(436), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(553), uint16(1137), uint16(1642), uint16(539), uint16(1642), uint16(15), uint16(15), uint16(892), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(568), uint16(298), uint16(538), uint16(1135), uint16(1419), uint16(1559), uint16(1560), uint16(1331), uint16(409), uint16(6), uint16(6), uint16(1169), uint16(1268), uint16(415), uint16(320), uint16(284), uint16(284), uint16(1419), uint16(508), uint16(565), uint16(525), uint16(300), uint16(457), uint16(43), uint16(43), uint16(568), uint16(893), uint16(12), uint16(565), uint16(330), uint16(478), uint16(425), uint16(407), uint16(126), uint16(80), uint16(1217), uint16(1217), uint16(1050), uint16(1053), uint16(1040), uint16(1040), uint16(123), uint16(123), uint16(124), uint16(124), uint16(124), uint16(124), uint16(568), uint16(57), uint16(57), uint16(288), uint16(1192), uint16(1419), uint16(496), uint16(458), uint16(392), uint16(392), uint16(391), uint16(273), uint16(389), uint16(1135), uint16(1558), uint16(849), uint16(1169), uint16(407), uint16(6), uint16(568), uint16(321), uint16(1158), uint16(470), uint16(44), uint16(44), uint16(1557), uint16(1114), uint16(426), uint16(234), uint16(6), uint16(323), uint16(256), uint16(540), uint16(256), uint16(1158), uint16(431), uint16(568), uint16(1158), uint16(322), uint16(17), uint16(487), uint16(1115), uint16(58), uint16(58), uint16(122), uint16(122), uint16(122), uint16(122), uint16(121), uint16(121), uint16(120), uint16(120), uint16(120), uint16(119), uint16(116), uint16(444), uint16(1116), uint16(216), uint16(481), uint16(59), uint16(59), uint16(1192), uint16(1193), uint16(1194), uint16(111), uint16(560), uint16(324), uint16(4), uint16(236), uint16(456), uint16(526), uint16(568), uint16(237), uint16(456), uint16(568), uint16(437), uint16(168), uint16(556), uint16(420), uint16(141), uint16(479), uint16(563), uint16(568), uint16(293), uint16(568), uint16(1095), uint16(568), uint16(293), uint16(568), uint16(1095), uint16(531), uint16(568), uint16(872), uint16(8), uint16(60), uint16(60), uint16(235), uint16(61), uint16(61), uint16(568), uint16(414), uint16(568), uint16(414), uint16(568), uint16(445), uint16(62), uint16(62), uint16(45), uint16(45), uint16(46), uint16(46), uint16(47), uint16(47), uint16(199), uint16(49), uint16(49), uint16(557), uint16(568), uint16(359), uint16(568), uint16(100), uint16(486), uint16(50), uint16(50), uint16(63), uint16(63), uint16(64), uint16(64), uint16(561), uint16(415), uint16(535), uint16(410), uint16(568), uint16(1027), uint16(568), uint16(534), uint16(316), uint16(559), uint16(316), uint16(559), uint16(65), uint16(65), uint16(14), uint16(14), uint16(568), uint16(1027), uint16(568), uint16(512), uint16(932), uint16(872), uint16(1018), uint16(109), uint16(109), uint16(931), uint16(1017), uint16(66), uint16(66), uint16(131), uint16(131), uint16(110), uint16(451), uint16(445), uint16(570), uint16(569), uint16(416), uint16(177), uint16(1017), uint16(132), uint16(132), uint16(67), uint16(67), uint16(568), uint16(467), uint16(568), uint16(932), uint16(471), uint16(1364), uint16(283), uint16(226), uint16(931), uint16(315), uint16(1363), uint16(407), uint16(568), uint16(459), uint16(407), uint16(1017), uint16(1017), uint16(1019), uint16(239), uint16(407), uint16(86), uint16(213), uint16(1350), uint16(52), uint16(52), uint16(68), uint16(68), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(1585), uint16(1180), uint16(447), uint16(69), uint16(69), uint16(288), uint16(97), uint16(108), uint16(1541), uint16(106), uint16(392), uint16(392), uint16(391), uint16(273), uint16(389), uint16(568), uint16(879), uint16(849), uint16(883), uint16(568), uint16(111), uint16(560), uint16(466), uint16(4), uint16(568), uint16(152), uint16(30), uint16(38), uint16(568), uint16(1132), uint16(234), uint16(396), uint16(323), uint16(111), uint16(560), uint16(527), uint16(4), uint16(563), uint16(53), uint16(53), uint16(322), uint16(568), uint16(163), uint16(163), uint16(568), uint16(337), uint16(468), uint16(164), uint16(164), uint16(333), uint16(563), uint16(76), uint16(76), uint16(568), uint16(289), uint16(1514), uint16(568), uint16(31), uint16(1513), uint16(568), uint16(445), uint16(338), uint16(483), uint16(100), uint16(54), uint16(54), uint16(344), uint16(72), uint16(72), uint16(296), uint16(236), uint16(1080), uint16(557), uint16(445), uint16(879), uint16(1360), uint16(134), uint16(134), uint16(168), uint16(73), uint16(73), uint16(141), uint16(161), uint16(161), uint16(1574), uint16(557), uint16(535), uint16(568), uint16(319), uint16(568), uint16(348), uint16(536), uint16(1009), uint16(473), uint16(261), uint16(261), uint16(891), uint16(890), uint16(235), uint16(535), uint16(568), uint16(1027), uint16(568), uint16(475), uint16(534), uint16(261), uint16(367), uint16(109), uint16(109), uint16(521), uint16(136), uint16(136), uint16(130), uint16(130), uint16(1027), uint16(110), uint16(366), uint16(445), uint16(570), uint16(569), uint16(109), uint16(109), uint16(1017), uint16(162), uint16(162), uint16(156), uint16(156), uint16(568), uint16(110), uint16(1080), uint16(445), uint16(570), uint16(569), uint16(410), uint16(351), uint16(1017), uint16(568), uint16(353), uint16(316), uint16(559), uint16(568), uint16(343), uint16(568), uint16(100), uint16(497), uint16(357), uint16(258), uint16(100), uint16(898), uint16(899), uint16(140), uint16(140), uint16(355), uint16(1310), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(139), uint16(139), uint16(362), uint16(451), uint16(137), uint16(137), uint16(138), uint16(138), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(1180), uint16(447), uint16(568), uint16(372), uint16(288), uint16(111), uint16(560), uint16(1021), uint16(4), uint16(392), uint16(392), uint16(391), uint16(273), uint16(389), uint16(568), uint16(1141), uint16(849), uint16(568), uint16(1076), uint16(568), uint16(258), uint16(492), uint16(563), uint16(568), uint16(211), uint16(75), uint16(75), uint16(555), uint16(962), uint16(234), uint16(261), uint16(323), uint16(111), uint16(560), uint16(929), uint16(4), uint16(113), uint16(77), uint16(77), uint16(322), uint16(74), uint16(74), uint16(42), uint16(42), uint16(1373), uint16(445), uint16(48), uint16(48), uint16(1418), uint16(563), uint16(974), uint16(975), uint16(1092), uint16(1091), uint16(1092), uint16(1091), uint16(862), uint16(557), uint16(150), uint16(930), uint16(1346), uint16(113), uint16(1358), uint16(554), uint16(1424), uint16(1021), uint16(1275), uint16(1266), uint16(1254), uint16(236), uint16(1253), uint16(1255), uint16(445), uint16(1593), uint16(1343), uint16(308), uint16(276), uint16(168), uint16(309), uint16(11), uint16(141), uint16(393), uint16(310), uint16(232), uint16(557), uint16(1405), uint16(1027), uint16(335), uint16(291), uint16(1400), uint16(219), uint16(336), uint16(109), uint16(109), uint16(936), uint16(297), uint16(1410), uint16(235), uint16(341), uint16(477), uint16(110), uint16(502), uint16(445), uint16(570), uint16(569), uint16(1393), uint16(1409), uint16(1017), uint16(400), uint16(1293), uint16(365), uint16(223), uint16(1486), uint16(1027), uint16(1485), uint16(1355), uint16(1356), uint16(1354), uint16(1353), uint16(109), uint16(109), uint16(204), uint16(1596), uint16(1232), uint16(558), uint16(265), uint16(218), uint16(110), uint16(205), uint16(445), uint16(570), uint16(569), uint16(410), uint16(387), uint16(1017), uint16(1533), uint16(179), uint16(316), uint16(559), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(230), uint16(1531), uint16(1229), uint16(79), uint16(560), uint16(85), uint16(4), uint16(418), uint16(215), uint16(548), uint16(81), uint16(84), uint16(188), uint16(1406), uint16(173), uint16(181), uint16(461), uint16(451), uint16(35), uint16(462), uint16(563), uint16(183), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(184), uint16(1491), uint16(185), uint16(186), uint16(495), uint16(242), uint16(98), uint16(398), uint16(1412), uint16(36), uint16(1411), uint16(484), uint16(91), uint16(469), uint16(401), uint16(1414), uint16(445), uint16(192), uint16(1480), uint16(246), uint16(1502), uint16(490), uint16(346), uint16(277), uint16(248), uint16(196), uint16(493), uint16(511), uint16(557), uint16(350), uint16(1256), uint16(249), uint16(250), uint16(403), uint16(1313), uint16(1312), uint16(111), uint16(560), uint16(432), uint16(4), uint16(1311), uint16(1304), uint16(93), uint16(1611), uint16(883), uint16(1610), uint16(224), uint16(404), uint16(434), uint16(520), uint16(263), uint16(435), uint16(1579), uint16(563), uint16(1283), uint16(1282), uint16(364), uint16(1027), uint16(306), uint16(1281), uint16(264), uint16(1609), uint16(1565), uint16(109), uint16(109), uint16(370), uint16(1303), uint16(307), uint16(1564), uint16(438), uint16(128), uint16(110), uint16(1378), uint16(445), uint16(570), uint16(569), uint16(445), uint16(546), uint16(1017), uint16(10), uint16(1466), uint16(105), uint16(381), uint16(1377), uint16(34), uint16(572), uint16(99), uint16(1336), uint16(557), uint16(314), uint16(1186), uint16(530), uint16(272), uint16(274), uint16(379), uint16(210), uint16(1335), uint16(547), uint16(385), uint16(386), uint16(275), uint16(573), uint16(1251), uint16(1246), uint16(411), uint16(412), uint16(1518), uint16(165), uint16(178), uint16(1519), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(1517), uint16(1516), uint16(1027), uint16(78), uint16(147), uint16(166), uint16(220), uint16(221), uint16(109), uint16(109), uint16(836), uint16(304), uint16(167), uint16(446), uint16(212), uint16(318), uint16(110), uint16(231), uint16(445), uint16(570), uint16(569), uint16(144), uint16(1090), uint16(1017), uint16(1088), uint16(326), uint16(180), uint16(169), uint16(1212), uint16(182), uint16(334), uint16(238), uint16(915), uint16(241), uint16(1104), uint16(187), uint16(170), uint16(171), uint16(421), uint16(87), uint16(88), uint16(423), uint16(189), uint16(89), uint16(90), uint16(172), uint16(1107), uint16(243), uint16(1103), uint16(244), uint16(158), uint16(18), uint16(245), uint16(345), uint16(247), uint16(1017), uint16(1017), uint16(1019), uint16(1020), uint16(27), uint16(261), uint16(1096), uint16(193), uint16(1226), uint16(489), uint16(194), uint16(37), uint16(366), uint16(851), uint16(494), uint16(251), uint16(195), uint16(506), uint16(92), uint16(19), uint16(498), uint16(358), uint16(20), uint16(503), uint16(881), uint16(361), uint16(94), uint16(894), uint16(305), uint16(159), uint16(513), uint16(39), uint16(95), uint16(1174), uint16(160), uint16(1056), uint16(966), uint16(1143), uint16(96), uint16(174), uint16(1142), uint16(225), uint16(280), uint16(282), uint16(198), uint16(960), uint16(113), uint16(1164), uint16(1160), uint16(260), uint16(21), uint16(22), uint16(23), uint16(1162), uint16(1168), uint16(1167), uint16(1148), uint16(24), uint16(33), uint16(25), uint16(202), uint16(542), uint16(26), uint16(100), uint16(1071), uint16(102), uint16(1057), uint16(103), uint16(7), uint16(1055), uint16(1059), uint16(1113), uint16(1060), uint16(1112), uint16(266), uint16(267), uint16(28), uint16(40), uint16(390), uint16(1022), uint16(863), uint16(112), uint16(29), uint16(564), uint16(1182), uint16(1181), uint16(268), uint16(176), uint16(143), uint16(925), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(1242), uint16(269), uint16(1602), uint16(1242), uint16(1601), } var yy_lookahead = [2283]uint16{ uint16(193), uint16(193), uint16(193), uint16(274), uint16(275), uint16(276), uint16(193), uint16(274), uint16(275), uint16(276), uint16(193), uint16(223), uint16(219), uint16(225), uint16(206), uint16(210), uint16(211), uint16(212), uint16(193), uint16(19), uint16(219), uint16(233), uint16(216), uint16(216), uint16(217), uint16(216), uint16(217), uint16(193), uint16(295), uint16(216), uint16(217), uint16(31), uint16(193), uint16(216), uint16(217), uint16(193), uint16(228), uint16(213), uint16(230), uint16(39), uint16(206), uint16(216), uint16(217), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(193), uint16(19), uint16(185), uint16(186), uint16(187), uint16(188), uint16(189), uint16(190), uint16(253), uint16(274), uint16(275), uint16(276), uint16(195), uint16(193), uint16(197), uint16(193), uint16(261), uint16(274), uint16(275), uint16(276), uint16(253), uint16(204), uint16(238), uint16(204), uint16(81), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(274), uint16(275), uint16(276), uint16(262), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(239), uint16(240), uint16(239), uint16(240), uint16(210), uint16(211), uint16(212), uint16(314), uint16(315), uint16(314), uint16(59), uint16(316), uint16(86), uint16(252), uint16(88), uint16(252), uint16(19), uint16(314), uint16(315), uint16(256), uint16(257), uint16(113), uint16(25), uint16(72), uint16(296), uint16(138), uint16(139), uint16(266), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(81), uint16(292), uint16(59), uint16(292), uint16(298), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(69), uint16(116), uint16(117), uint16(118), uint16(72), uint16(106), uint16(107), uint16(193), uint16(111), uint16(112), uint16(113), uint16(54), uint16(55), uint16(56), uint16(57), uint16(58), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(120), uint16(25), uint16(216), uint16(217), uint16(145), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(231), uint16(138), uint16(139), uint16(116), uint16(117), uint16(118), uint16(164), uint16(153), uint16(19), uint16(155), uint16(54), uint16(55), uint16(56), uint16(57), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(128), uint16(129), uint16(46), uint16(47), uint16(48), uint16(49), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(216), uint16(193), uint16(25), uint16(59), uint16(193), uint16(19), uint16(165), uint16(166), uint16(193), uint16(67), uint16(24), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(73), uint16(216), uint16(217), uint16(59), uint16(216), uint16(217), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(121), uint16(145), uint16(59), uint16(193), uint16(116), uint16(117), uint16(118), uint16(119), uint16(273), uint16(204), uint16(122), uint16(123), uint16(124), uint16(19), uint16(20), uint16(134), uint16(22), uint16(136), uint16(137), uint16(19), uint16(132), uint16(127), uint16(128), uint16(129), uint16(24), uint16(22), uint16(23), uint16(116), uint16(117), uint16(118), uint16(36), uint16(193), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(239), uint16(240), uint16(311), uint16(312), uint16(215), uint16(106), uint16(107), uint16(241), uint16(19), uint16(59), uint16(216), uint16(217), uint16(223), uint16(252), uint16(115), uint16(116), uint16(117), uint16(118), uint16(151), uint16(120), uint16(26), uint16(71), uint16(193), uint16(308), uint16(309), uint16(193), uint16(149), uint16(128), uint16(313), uint16(216), uint16(269), uint16(81), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(253), uint16(216), uint16(217), uint16(100), uint16(95), uint16(153), uint16(59), uint16(155), uint16(261), uint16(106), uint16(107), uint16(25), uint16(193), uint16(101), uint16(193), uint16(193), uint16(231), uint16(114), uint16(25), uint16(116), uint16(117), uint16(118), uint16(113), uint16(304), uint16(121), uint16(193), uint16(204), uint16(59), uint16(119), uint16(120), uint16(121), uint16(122), uint16(123), uint16(124), uint16(125), uint16(216), uint16(217), uint16(193), uint16(216), uint16(217), uint16(131), uint16(138), uint16(139), uint16(230), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(239), uint16(240), uint16(116), uint16(117), uint16(118), uint16(76), uint16(193), uint16(23), uint16(19), uint16(25), uint16(22), uint16(253), uint16(23), uint16(252), uint16(253), uint16(108), uint16(87), uint16(204), uint16(89), uint16(261), uint16(198), uint16(92), uint16(261), uint16(116), uint16(117), uint16(118), uint16(193), uint16(306), uint16(307), uint16(216), uint16(217), uint16(150), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(59), uint16(193), uint16(216), uint16(217), uint16(19), uint16(239), uint16(240), uint16(283), uint16(23), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(73), uint16(252), uint16(253), uint16(142), uint16(308), uint16(309), uint16(138), uint16(139), uint16(81), uint16(313), uint16(145), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(307), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(281), uint16(116), uint16(117), uint16(118), uint16(285), uint16(23), uint16(193), uint16(25), uint16(119), uint16(59), uint16(193), uint16(122), uint16(123), uint16(124), uint16(59), uint16(127), uint16(203), uint16(59), uint16(205), uint16(19), uint16(268), uint16(132), uint16(25), uint16(23), uint16(22), uint16(193), uint16(138), uint16(139), uint16(249), uint16(204), uint16(251), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(19), uint16(22), uint16(23), uint16(59), uint16(23), uint16(25), uint16(239), uint16(240), uint16(116), uint16(117), uint16(118), uint16(193), uint16(11), uint16(116), uint16(117), uint16(118), uint16(116), uint16(117), uint16(118), uint16(252), uint16(269), uint16(22), uint16(193), uint16(15), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(273), uint16(143), uint16(193), uint16(118), uint16(143), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(76), uint16(118), uint16(59), uint16(241), uint16(116), uint16(117), uint16(118), uint16(304), uint16(216), uint16(217), uint16(292), uint16(143), uint16(60), uint16(89), uint16(241), uint16(19), uint16(92), uint16(193), uint16(193), uint16(23), uint16(22), uint16(311), uint16(312), uint16(231), uint16(101), uint16(22), uint16(143), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(19), uint16(193), uint16(193), uint16(59), uint16(23), uint16(116), uint16(117), uint16(118), uint16(59), uint16(201), uint16(21), uint16(241), uint16(304), uint16(22), uint16(206), uint16(127), uint16(128), uint16(129), uint16(193), uint16(128), uint16(129), uint16(235), uint16(236), uint16(304), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(22), uint16(193), uint16(216), uint16(217), uint16(193), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(231), uint16(193), uint16(193), uint16(193), uint16(116), uint16(117), uint16(118), uint16(216), uint16(217), uint16(116), uint16(117), uint16(118), uint16(226), uint16(80), uint16(193), uint16(19), uint16(235), uint16(236), uint16(304), uint16(23), uint16(211), uint16(212), uint16(231), uint16(204), uint16(216), uint16(217), uint16(205), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(19), uint16(193), uint16(123), uint16(76), uint16(239), uint16(240), uint16(193), uint16(253), uint16(239), uint16(240), uint16(239), uint16(240), uint16(193), uint16(106), uint16(107), uint16(193), uint16(89), uint16(252), uint16(193), uint16(92), uint16(59), uint16(252), uint16(141), uint16(252), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(284), uint16(161), uint16(216), uint16(217), uint16(193), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(231), uint16(193), uint16(16), uint16(187), uint16(188), uint16(189), uint16(190), uint16(7), uint16(8), uint16(9), uint16(309), uint16(195), uint16(25), uint16(197), uint16(313), uint16(19), uint16(127), uint16(128), uint16(129), uint16(262), uint16(204), uint16(22), uint16(117), uint16(24), uint16(216), uint16(217), uint16(263), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(193), uint16(239), uint16(240), uint16(193), uint16(59), uint16(19), uint16(188), uint16(253), uint16(190), uint16(77), uint16(226), uint16(79), uint16(193), uint16(195), uint16(252), uint16(197), uint16(193), uint16(19), uint16(301), uint16(302), uint16(193), uint16(193), uint16(204), uint16(216), uint16(217), uint16(226), uint16(216), uint16(217), uint16(266), uint16(204), uint16(159), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(12), uint16(239), uint16(240), uint16(232), uint16(298), uint16(238), uint16(117), uint16(253), uint16(239), uint16(240), uint16(238), uint16(259), uint16(260), uint16(193), uint16(252), uint16(27), uint16(31), uint16(193), uint16(193), uint16(142), uint16(204), uint16(252), uint16(193), uint16(193), uint16(39), uint16(262), uint16(193), uint16(100), uint16(266), uint16(278), uint16(42), uint16(204), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(117), uint16(159), uint16(216), uint16(217), uint16(121), uint16(216), uint16(217), uint16(63), uint16(193), uint16(193), uint16(193), uint16(239), uint16(240), uint16(115), uint16(116), uint16(193), uint16(298), uint16(73), uint16(238), uint16(238), uint16(231), uint16(19), uint16(239), uint16(240), uint16(252), uint16(22), uint16(24), uint16(211), uint16(212), uint16(24), uint16(193), uint16(216), uint16(217), uint16(216), uint16(217), uint16(252), uint16(153), uint16(154), uint16(155), uint16(253), uint16(16), uint16(19), uint16(144), uint16(213), uint16(268), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(238), uint16(19), uint16(59), uint16(193), uint16(59), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(22), uint16(23), uint16(193), uint16(25), uint16(193), uint16(43), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(284), uint16(77), uint16(193), uint16(79), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(286), uint16(193), uint16(193), uint16(193), uint16(117), uint16(291), uint16(117), uint16(232), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(204), uint16(22), uint16(23), uint16(66), uint16(25), uint16(216), uint16(217), uint16(35), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(193), uint16(268), uint16(85), uint16(101), uint16(193), uint16(309), uint16(309), uint16(240), uint16(19), uint16(313), uint16(313), uint16(94), uint16(208), uint16(209), uint16(193), uint16(239), uint16(240), uint16(193), uint16(66), uint16(252), uint16(19), uint16(268), uint16(244), uint16(216), uint16(217), uint16(193), uint16(74), uint16(213), uint16(252), uint16(161), uint16(19), uint16(263), uint16(254), uint16(44), uint16(45), uint16(46), uint16(47), uint16(48), uint16(49), uint16(50), uint16(51), uint16(52), uint16(53), uint16(54), uint16(55), uint16(56), uint16(57), uint16(193), uint16(216), uint16(217), uint16(5), uint16(59), uint16(193), uint16(19), uint16(244), uint16(10), uint16(11), uint16(12), uint16(13), uint16(14), uint16(101), uint16(309), uint16(17), uint16(146), uint16(254), uint16(313), uint16(193), uint16(193), uint16(76), uint16(115), uint16(216), uint16(217), uint16(309), uint16(12), uint16(263), uint16(30), uint16(313), uint16(32), uint16(46), uint16(87), uint16(46), uint16(89), uint16(130), uint16(193), uint16(92), uint16(40), uint16(22), uint16(263), uint16(27), uint16(216), uint16(217), uint16(102), uint16(103), uint16(104), uint16(105), uint16(106), uint16(107), uint16(108), uint16(109), uint16(110), uint16(111), uint16(112), uint16(113), uint16(42), uint16(150), uint16(291), uint16(216), uint16(217), uint16(116), uint16(117), uint16(118), uint16(19), uint16(20), uint16(193), uint16(22), uint16(70), uint16(260), uint16(116), uint16(193), uint16(24), uint16(264), uint16(193), uint16(263), uint16(78), uint16(63), uint16(61), uint16(81), uint16(116), uint16(36), uint16(193), uint16(260), uint16(193), uint16(29), uint16(193), uint16(264), uint16(193), uint16(33), uint16(145), uint16(193), uint16(59), uint16(48), uint16(216), uint16(217), uint16(98), uint16(216), uint16(217), uint16(193), uint16(115), uint16(193), uint16(115), uint16(193), uint16(59), uint16(216), uint16(217), uint16(216), uint16(217), uint16(216), uint16(217), uint16(216), uint16(217), uint16(255), uint16(216), uint16(217), uint16(71), uint16(193), uint16(131), uint16(193), uint16(25), uint16(65), uint16(216), uint16(217), uint16(216), uint16(217), uint16(216), uint16(217), uint16(208), uint16(209), uint16(85), uint16(133), uint16(193), uint16(100), uint16(193), uint16(90), uint16(138), uint16(139), uint16(138), uint16(139), uint16(216), uint16(217), uint16(216), uint16(217), uint16(193), uint16(100), uint16(193), uint16(108), uint16(135), uint16(116), uint16(117), uint16(106), uint16(107), uint16(140), uint16(121), uint16(216), uint16(217), uint16(216), uint16(217), uint16(114), uint16(162), uint16(116), uint16(117), uint16(118), uint16(299), uint16(300), uint16(121), uint16(216), uint16(217), uint16(216), uint16(217), uint16(193), uint16(244), uint16(193), uint16(135), uint16(244), uint16(193), uint16(256), uint16(257), uint16(140), uint16(244), uint16(193), uint16(254), uint16(193), uint16(193), uint16(254), uint16(153), uint16(154), uint16(155), uint16(141), uint16(254), uint16(149), uint16(150), uint16(258), uint16(216), uint16(217), uint16(216), uint16(217), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(0), uint16(1), uint16(2), uint16(216), uint16(217), uint16(5), uint16(115), uint16(158), uint16(193), uint16(160), uint16(10), uint16(11), uint16(12), uint16(13), uint16(14), uint16(193), uint16(59), uint16(17), uint16(126), uint16(193), uint16(19), uint16(20), uint16(129), uint16(22), uint16(193), uint16(22), uint16(22), uint16(24), uint16(193), uint16(23), uint16(30), uint16(25), uint16(32), uint16(19), uint16(20), uint16(144), uint16(22), uint16(36), uint16(216), uint16(217), uint16(40), uint16(193), uint16(216), uint16(217), uint16(193), uint16(152), uint16(129), uint16(216), uint16(217), uint16(193), uint16(36), uint16(216), uint16(217), uint16(193), uint16(99), uint16(193), uint16(193), uint16(53), uint16(193), uint16(193), uint16(59), uint16(23), uint16(193), uint16(25), uint16(216), uint16(217), uint16(193), uint16(216), uint16(217), uint16(152), uint16(70), uint16(59), uint16(71), uint16(59), uint16(117), uint16(193), uint16(216), uint16(217), uint16(78), uint16(216), uint16(217), uint16(81), uint16(216), uint16(217), uint16(318), uint16(71), uint16(85), uint16(193), uint16(133), uint16(193), uint16(193), uint16(90), uint16(23), uint16(23), uint16(25), uint16(25), uint16(120), uint16(121), uint16(98), uint16(85), uint16(193), uint16(100), uint16(193), uint16(23), uint16(90), uint16(25), uint16(121), uint16(106), uint16(107), uint16(19), uint16(216), uint16(217), uint16(216), uint16(217), uint16(100), uint16(114), uint16(131), uint16(116), uint16(117), uint16(118), uint16(106), uint16(107), uint16(121), uint16(216), uint16(217), uint16(216), uint16(217), uint16(193), uint16(114), uint16(117), uint16(116), uint16(117), uint16(118), uint16(133), uint16(193), uint16(121), uint16(193), uint16(193), uint16(138), uint16(139), uint16(193), uint16(23), uint16(193), uint16(25), uint16(23), uint16(23), uint16(25), uint16(25), uint16(7), uint16(8), uint16(216), uint16(217), uint16(193), uint16(193), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(216), uint16(217), uint16(193), uint16(162), uint16(216), uint16(217), uint16(216), uint16(217), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(1), uint16(2), uint16(193), uint16(193), uint16(5), uint16(19), uint16(20), uint16(59), uint16(22), uint16(10), uint16(11), uint16(12), uint16(13), uint16(14), uint16(193), uint16(97), uint16(17), uint16(193), uint16(23), uint16(193), uint16(25), uint16(288), uint16(36), uint16(193), uint16(242), uint16(216), uint16(217), uint16(236), uint16(23), uint16(30), uint16(25), uint16(32), uint16(19), uint16(20), uint16(23), uint16(22), uint16(25), uint16(216), uint16(217), uint16(40), uint16(216), uint16(217), uint16(216), uint16(217), uint16(193), uint16(59), uint16(216), uint16(217), uint16(193), uint16(36), uint16(83), uint16(84), uint16(153), uint16(153), uint16(155), uint16(155), uint16(23), uint16(71), uint16(25), uint16(23), uint16(193), uint16(25), uint16(193), uint16(193), uint16(193), uint16(117), uint16(193), uint16(193), uint16(193), uint16(70), uint16(193), uint16(193), uint16(59), uint16(193), uint16(255), uint16(255), uint16(287), uint16(78), uint16(255), uint16(243), uint16(81), uint16(191), uint16(255), uint16(297), uint16(71), uint16(271), uint16(100), uint16(293), uint16(245), uint16(267), uint16(214), uint16(246), uint16(106), uint16(107), uint16(108), uint16(246), uint16(271), uint16(98), uint16(245), uint16(293), uint16(114), uint16(220), uint16(116), uint16(117), uint16(118), uint16(267), uint16(271), uint16(121), uint16(271), uint16(225), uint16(219), uint16(229), uint16(219), uint16(100), uint16(219), uint16(259), uint16(259), uint16(259), uint16(259), uint16(106), uint16(107), uint16(249), uint16(196), uint16(60), uint16(280), uint16(141), uint16(243), uint16(114), uint16(249), uint16(116), uint16(117), uint16(118), uint16(133), uint16(245), uint16(121), uint16(200), uint16(297), uint16(138), uint16(139), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(297), uint16(200), uint16(38), uint16(19), uint16(20), uint16(151), uint16(22), uint16(200), uint16(150), uint16(140), uint16(294), uint16(294), uint16(22), uint16(272), uint16(43), uint16(234), uint16(18), uint16(162), uint16(270), uint16(200), uint16(36), uint16(237), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(237), uint16(283), uint16(237), uint16(237), uint16(18), uint16(199), uint16(149), uint16(246), uint16(272), uint16(270), uint16(272), uint16(200), uint16(158), uint16(246), uint16(246), uint16(234), uint16(59), uint16(234), uint16(246), uint16(199), uint16(290), uint16(62), uint16(289), uint16(200), uint16(199), uint16(22), uint16(221), uint16(115), uint16(71), uint16(200), uint16(200), uint16(199), uint16(199), uint16(221), uint16(218), uint16(218), uint16(19), uint16(20), uint16(64), uint16(22), uint16(218), uint16(227), uint16(22), uint16(224), uint16(126), uint16(224), uint16(165), uint16(221), uint16(24), uint16(305), uint16(200), uint16(113), uint16(312), uint16(36), uint16(218), uint16(220), uint16(218), uint16(100), uint16(282), uint16(218), uint16(91), uint16(218), uint16(317), uint16(106), uint16(107), uint16(221), uint16(227), uint16(282), uint16(317), uint16(82), uint16(148), uint16(114), uint16(265), uint16(116), uint16(117), uint16(118), uint16(59), uint16(145), uint16(121), uint16(22), uint16(277), uint16(158), uint16(200), uint16(265), uint16(25), uint16(202), uint16(147), uint16(250), uint16(71), uint16(279), uint16(13), uint16(146), uint16(194), uint16(194), uint16(249), uint16(248), uint16(250), uint16(140), uint16(247), uint16(246), uint16(6), uint16(192), uint16(192), uint16(192), uint16(303), uint16(303), uint16(213), uint16(207), uint16(300), uint16(213), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(213), uint16(213), uint16(100), uint16(213), uint16(222), uint16(207), uint16(214), uint16(214), uint16(106), uint16(107), uint16(4), uint16(222), uint16(207), uint16(3), uint16(22), uint16(163), uint16(114), uint16(15), uint16(116), uint16(117), uint16(118), uint16(16), uint16(23), uint16(121), uint16(23), uint16(139), uint16(151), uint16(130), uint16(25), uint16(142), uint16(16), uint16(24), uint16(20), uint16(144), uint16(1), uint16(142), uint16(130), uint16(130), uint16(61), uint16(53), uint16(53), uint16(37), uint16(151), uint16(53), uint16(53), uint16(130), uint16(116), uint16(34), uint16(1), uint16(141), uint16(5), uint16(22), uint16(115), uint16(161), uint16(141), uint16(153), uint16(154), uint16(155), uint16(156), uint16(157), uint16(25), uint16(68), uint16(68), uint16(75), uint16(41), uint16(115), uint16(24), uint16(131), uint16(20), uint16(19), uint16(125), uint16(22), uint16(96), uint16(22), uint16(22), uint16(67), uint16(23), uint16(22), uint16(67), uint16(59), uint16(24), uint16(22), uint16(28), uint16(67), uint16(23), uint16(22), uint16(22), uint16(149), uint16(23), uint16(23), uint16(23), uint16(116), uint16(23), uint16(25), uint16(37), uint16(97), uint16(141), uint16(23), uint16(23), uint16(22), uint16(143), uint16(25), uint16(75), uint16(88), uint16(34), uint16(34), uint16(34), uint16(34), uint16(86), uint16(75), uint16(93), uint16(23), uint16(34), uint16(22), uint16(34), uint16(25), uint16(24), uint16(34), uint16(25), uint16(23), uint16(142), uint16(23), uint16(142), uint16(44), uint16(23), uint16(23), uint16(23), uint16(11), uint16(23), uint16(25), uint16(22), uint16(22), uint16(22), uint16(15), uint16(23), uint16(23), uint16(22), uint16(22), uint16(25), uint16(1), uint16(1), uint16(141), uint16(25), uint16(23), uint16(135), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(141), uint16(141), uint16(319), uint16(141), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), uint16(319), } var yy_shift_ofst = [576]uint16{ uint16(1648), uint16(1477), uint16(1272), uint16(322), uint16(322), uint16(1), uint16(1319), uint16(1478), uint16(1491), uint16(1837), uint16(1837), uint16(1837), uint16(471), uint16(0), uint16(0), uint16(214), uint16(1093), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(271), uint16(271), uint16(1219), uint16(1219), uint16(216), uint16(88), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(40), uint16(111), uint16(258), uint16(361), uint16(469), uint16(512), uint16(583), uint16(622), uint16(693), uint16(732), uint16(803), uint16(842), uint16(913), uint16(1073), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1093), uint16(1113), uint16(1093), uint16(1216), uint16(957), uint16(957), uint16(1635), uint16(1662), uint16(1777), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(1837), uint16(137), uint16(181), uint16(181), uint16(181), uint16(181), uint16(181), uint16(181), uint16(181), uint16(94), uint16(430), uint16(66), uint16(65), uint16(112), uint16(366), uint16(533), uint16(533), uint16(740), uint16(1261), uint16(533), uint16(533), uint16(79), uint16(79), uint16(533), uint16(412), uint16(412), uint16(412), uint16(77), uint16(412), uint16(123), uint16(113), uint16(113), uint16(22), uint16(22), uint16(2098), uint16(2098), uint16(328), uint16(328), uint16(328), uint16(239), uint16(468), uint16(468), uint16(468), uint16(468), uint16(1015), uint16(1015), uint16(409), uint16(366), uint16(1129), uint16(1186), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(969), uint16(621), uint16(621), uint16(533), uint16(642), uint16(788), uint16(788), uint16(1228), uint16(1228), uint16(822), uint16(822), uint16(67), uint16(1274), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(1307), uint16(954), uint16(954), uint16(585), uint16(472), uint16(640), uint16(387), uint16(695), uint16(538), uint16(541), uint16(700), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(222), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(1179), uint16(1179), uint16(1179), uint16(533), uint16(533), uint16(533), uint16(565), uint16(533), uint16(533), uint16(533), uint16(916), uint16(1144), uint16(533), uint16(533), uint16(1288), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(533), uint16(639), uint16(1330), uint16(209), uint16(1076), uint16(1076), uint16(1076), uint16(1076), uint16(580), uint16(209), uint16(209), uint16(1313), uint16(768), uint16(917), uint16(649), uint16(1181), uint16(1316), uint16(405), uint16(1316), uint16(1238), uint16(249), uint16(1181), uint16(1181), uint16(249), uint16(1181), uint16(405), uint16(1238), uint16(1369), uint16(464), uint16(1259), uint16(1012), uint16(1012), uint16(1012), uint16(1368), uint16(1368), uint16(1368), uint16(1368), uint16(184), uint16(184), uint16(1326), uint16(904), uint16(1287), uint16(1480), uint16(1712), uint16(1712), uint16(1633), uint16(1633), uint16(1757), uint16(1757), uint16(1633), uint16(1647), uint16(1651), uint16(1783), uint16(1764), uint16(1791), uint16(1791), uint16(1791), uint16(1791), uint16(1633), uint16(1806), uint16(1677), uint16(1651), uint16(1651), uint16(1677), uint16(1783), uint16(1764), uint16(1677), uint16(1764), uint16(1677), uint16(1633), uint16(1806), uint16(1674), uint16(1779), uint16(1633), uint16(1806), uint16(1823), uint16(1633), uint16(1806), uint16(1633), uint16(1806), uint16(1823), uint16(1732), uint16(1732), uint16(1732), uint16(1794), uint16(1840), uint16(1840), uint16(1823), uint16(1732), uint16(1738), uint16(1732), uint16(1794), uint16(1732), uint16(1732), uint16(1701), uint16(1844), uint16(1758), uint16(1758), uint16(1823), uint16(1633), uint16(1789), uint16(1789), uint16(1807), uint16(1807), uint16(1742), uint16(1752), uint16(1877), uint16(1633), uint16(1743), uint16(1742), uint16(1759), uint16(1765), uint16(1677), uint16(1879), uint16(1897), uint16(1897), uint16(1914), uint16(1914), uint16(1914), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(2098), uint16(207), uint16(1095), uint16(331), uint16(620), uint16(903), uint16(806), uint16(1074), uint16(1483), uint16(1432), uint16(1481), uint16(1322), uint16(1370), uint16(1394), uint16(1515), uint16(1291), uint16(1546), uint16(1547), uint16(1557), uint16(1595), uint16(1598), uint16(1599), uint16(1434), uint16(1453), uint16(1618), uint16(1462), uint16(1567), uint16(1489), uint16(1644), uint16(1654), uint16(1616), uint16(1660), uint16(1548), uint16(1549), uint16(1682), uint16(1685), uint16(1597), uint16(742), uint16(1941), uint16(1945), uint16(1927), uint16(1787), uint16(1937), uint16(1940), uint16(1934), uint16(1936), uint16(1821), uint16(1810), uint16(1832), uint16(1938), uint16(1938), uint16(1942), uint16(1822), uint16(1947), uint16(1824), uint16(1949), uint16(1968), uint16(1828), uint16(1841), uint16(1938), uint16(1842), uint16(1912), uint16(1939), uint16(1938), uint16(1826), uint16(1921), uint16(1922), uint16(1925), uint16(1926), uint16(1850), uint16(1865), uint16(1948), uint16(1843), uint16(1982), uint16(1980), uint16(1964), uint16(1872), uint16(1827), uint16(1928), uint16(1970), uint16(1929), uint16(1923), uint16(1958), uint16(1848), uint16(1885), uint16(1977), uint16(1983), uint16(1985), uint16(1871), uint16(1880), uint16(1984), uint16(1943), uint16(1986), uint16(1987), uint16(1988), uint16(1990), uint16(1946), uint16(1955), uint16(1991), uint16(1911), uint16(1989), uint16(1994), uint16(1951), uint16(1992), uint16(1996), uint16(1873), uint16(1998), uint16(2000), uint16(2001), uint16(2002), uint16(2003), uint16(2004), uint16(1999), uint16(1933), uint16(1890), uint16(2009), uint16(2010), uint16(1910), uint16(2005), uint16(2012), uint16(1892), uint16(2011), uint16(2006), uint16(2007), uint16(2008), uint16(2013), uint16(1950), uint16(1962), uint16(1957), uint16(2014), uint16(1969), uint16(1952), uint16(2015), uint16(2023), uint16(2026), uint16(2027), uint16(2025), uint16(2028), uint16(2018), uint16(1913), uint16(1915), uint16(2031), uint16(2011), uint16(2033), uint16(2036), uint16(2037), uint16(2038), uint16(2039), uint16(2040), uint16(2043), uint16(2051), uint16(2044), uint16(2045), uint16(2046), uint16(2047), uint16(2049), uint16(2050), uint16(2048), uint16(1944), uint16(1935), uint16(1953), uint16(1954), uint16(1956), uint16(2052), uint16(2055), uint16(2053), uint16(2073), uint16(2074), } var yy_reduce_ofst = [409]int16{ int16(-125), int16(733), int16(789), int16(241), int16(293), int16(-123), int16(-193), int16(-191), int16(-183), int16(-187), int16(166), int16(238), int16(133), int16(-207), int16(-199), int16(-267), int16(-176), int16(-6), int16(204), int16(489), int16(576), int16(-175), int16(598), int16(686), int16(615), int16(725), int16(860), int16(778), int16(781), int16(857), int16(616), int16(887), int16(87), int16(240), int16(-192), int16(408), int16(626), int16(796), int16(843), int16(854), int16(1003), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(80), int16(83), int16(313), int16(886), int16(888), int16(996), int16(1034), int16(1059), int16(1081), int16(1100), int16(1117), int16(1152), int16(1155), int16(1163), int16(1165), int16(1167), int16(1169), int16(1172), int16(1180), int16(1182), int16(1184), int16(1198), int16(1200), int16(1213), int16(1215), int16(1225), int16(1227), int16(1252), int16(1254), int16(1264), int16(1299), int16(1303), int16(1308), int16(1312), int16(1325), int16(1328), int16(1337), int16(1340), int16(1343), int16(1371), int16(1373), int16(1384), int16(1386), int16(1411), int16(1420), int16(1424), int16(1426), int16(1458), int16(1470), int16(1473), int16(1475), int16(1479), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(-271), int16(138), int16(459), int16(396), int16(-158), int16(470), int16(302), int16(-212), int16(521), int16(201), int16(-195), int16(-92), int16(559), int16(630), int16(632), int16(630), int16(-271), int16(632), int16(901), int16(63), int16(407), int16(-271), int16(-271), int16(-271), int16(-271), int16(161), int16(161), int16(161), int16(251), int16(335), int16(847), int16(960), int16(980), int16(537), int16(588), int16(618), int16(628), int16(688), int16(688), int16(-166), int16(-161), int16(674), int16(790), int16(794), int16(799), int16(851), int16(852), int16(-122), int16(680), int16(-120), int16(995), int16(1038), int16(415), int16(1051), int16(893), int16(798), int16(962), int16(400), int16(1086), int16(779), int16(923), int16(924), int16(263), int16(1041), int16(979), int16(990), int16(1083), int16(1097), int16(1031), int16(1194), int16(362), int16(994), int16(1139), int16(1005), int16(1037), int16(1202), int16(1205), int16(1195), int16(1210), int16(-194), int16(56), int16(185), int16(-135), int16(232), int16(522), int16(560), int16(601), int16(617), int16(669), int16(683), int16(711), int16(856), int16(908), int16(941), int16(1048), int16(1101), int16(1147), int16(1257), int16(1262), int16(1265), int16(392), int16(1292), int16(1333), int16(1339), int16(1342), int16(1346), int16(1350), int16(1359), int16(1374), int16(1418), int16(1421), int16(1436), int16(1437), int16(593), int16(755), int16(770), int16(997), int16(1445), int16(1459), int16(1209), int16(1500), int16(1504), int16(1516), int16(1132), int16(1243), int16(1518), int16(1519), int16(1440), int16(1520), int16(560), int16(1522), int16(1523), int16(1524), int16(1526), int16(1527), int16(1529), int16(1382), int16(1438), int16(1431), int16(1468), int16(1469), int16(1472), int16(1476), int16(1209), int16(1431), int16(1431), int16(1485), int16(1525), int16(1539), int16(1435), int16(1463), int16(1471), int16(1492), int16(1487), int16(1443), int16(1494), int16(1474), int16(1484), int16(1498), int16(1486), int16(1502), int16(1455), int16(1530), int16(1531), int16(1533), int16(1540), int16(1542), int16(1544), int16(1505), int16(1506), int16(1507), int16(1508), int16(1521), int16(1528), int16(1493), int16(1537), int16(1532), int16(1575), int16(1488), int16(1496), int16(1584), int16(1594), int16(1509), int16(1510), int16(1600), int16(1538), int16(1534), int16(1541), int16(1574), int16(1577), int16(1583), int16(1585), int16(1586), int16(1612), int16(1626), int16(1581), int16(1556), int16(1558), int16(1587), int16(1559), int16(1601), int16(1588), int16(1603), int16(1592), int16(1631), int16(1640), int16(1550), int16(1553), int16(1643), int16(1645), int16(1625), int16(1649), int16(1652), int16(1650), int16(1653), int16(1632), int16(1636), int16(1637), int16(1642), int16(1634), int16(1639), int16(1641), int16(1646), int16(1656), int16(1655), int16(1658), int16(1659), int16(1661), int16(1663), int16(1560), int16(1564), int16(1596), int16(1605), int16(1664), int16(1670), int16(1565), int16(1571), int16(1627), int16(1638), int16(1657), int16(1665), int16(1623), int16(1702), int16(1630), int16(1666), int16(1667), int16(1671), int16(1673), int16(1703), int16(1718), int16(1719), int16(1729), int16(1730), int16(1731), int16(1621), int16(1622), int16(1628), int16(1720), int16(1713), int16(1716), int16(1722), int16(1723), int16(1733), int16(1717), int16(1724), int16(1727), int16(1728), int16(1725), int16(1740), } var yy_default = [576]uint16{ uint16(1647), uint16(1647), uint16(1647), uint16(1475), uint16(1240), uint16(1351), uint16(1240), uint16(1240), uint16(1240), uint16(1475), uint16(1475), uint16(1475), uint16(1240), uint16(1381), uint16(1381), uint16(1528), uint16(1273), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1474), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1563), uint16(1563), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1390), uint16(1240), uint16(1397), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1476), uint16(1477), uint16(1240), uint16(1240), uint16(1240), uint16(1527), uint16(1529), uint16(1492), uint16(1404), uint16(1403), uint16(1402), uint16(1401), uint16(1510), uint16(1369), uint16(1395), uint16(1388), uint16(1392), uint16(1470), uint16(1471), uint16(1469), uint16(1473), uint16(1477), uint16(1476), uint16(1240), uint16(1391), uint16(1438), uint16(1454), uint16(1437), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1446), uint16(1453), uint16(1452), uint16(1451), uint16(1460), uint16(1450), uint16(1447), uint16(1440), uint16(1439), uint16(1441), uint16(1442), uint16(1240), uint16(1240), uint16(1264), uint16(1240), uint16(1240), uint16(1261), uint16(1315), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1547), uint16(1546), uint16(1240), uint16(1443), uint16(1240), uint16(1273), uint16(1432), uint16(1431), uint16(1457), uint16(1444), uint16(1456), uint16(1455), uint16(1535), uint16(1599), uint16(1598), uint16(1493), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1563), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1371), uint16(1563), uint16(1563), uint16(1240), uint16(1273), uint16(1563), uint16(1563), uint16(1372), uint16(1372), uint16(1269), uint16(1269), uint16(1375), uint16(1240), uint16(1542), uint16(1342), uint16(1342), uint16(1342), uint16(1342), uint16(1351), uint16(1342), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1532), uint16(1530), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1347), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1592), uint16(1240), uint16(1505), uint16(1329), uint16(1347), uint16(1347), uint16(1347), uint16(1347), uint16(1349), uint16(1330), uint16(1328), uint16(1341), uint16(1274), uint16(1247), uint16(1639), uint16(1407), uint16(1396), uint16(1348), uint16(1396), uint16(1636), uint16(1394), uint16(1407), uint16(1407), uint16(1394), uint16(1407), uint16(1348), uint16(1636), uint16(1290), uint16(1615), uint16(1285), uint16(1381), uint16(1381), uint16(1381), uint16(1371), uint16(1371), uint16(1371), uint16(1371), uint16(1375), uint16(1375), uint16(1472), uint16(1348), uint16(1341), uint16(1240), uint16(1639), uint16(1639), uint16(1357), uint16(1357), uint16(1638), uint16(1638), uint16(1357), uint16(1493), uint16(1623), uint16(1416), uint16(1318), uint16(1324), uint16(1324), uint16(1324), uint16(1324), uint16(1357), uint16(1258), uint16(1394), uint16(1623), uint16(1623), uint16(1394), uint16(1416), uint16(1318), uint16(1394), uint16(1318), uint16(1394), uint16(1357), uint16(1258), uint16(1509), uint16(1633), uint16(1357), uint16(1258), uint16(1483), uint16(1357), uint16(1258), uint16(1357), uint16(1258), uint16(1483), uint16(1316), uint16(1316), uint16(1316), uint16(1305), uint16(1240), uint16(1240), uint16(1483), uint16(1316), uint16(1290), uint16(1316), uint16(1305), uint16(1316), uint16(1316), uint16(1581), uint16(1240), uint16(1487), uint16(1487), uint16(1483), uint16(1357), uint16(1573), uint16(1573), uint16(1384), uint16(1384), uint16(1389), uint16(1375), uint16(1478), uint16(1357), uint16(1240), uint16(1389), uint16(1387), uint16(1385), uint16(1394), uint16(1308), uint16(1595), uint16(1595), uint16(1591), uint16(1591), uint16(1591), uint16(1644), uint16(1644), uint16(1542), uint16(1608), uint16(1273), uint16(1273), uint16(1273), uint16(1273), uint16(1608), uint16(1292), uint16(1292), uint16(1274), uint16(1274), uint16(1273), uint16(1608), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1603), uint16(1240), uint16(1537), uint16(1494), uint16(1361), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1548), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1421), uint16(1240), uint16(1243), uint16(1539), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1398), uint16(1399), uint16(1362), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1413), uint16(1240), uint16(1240), uint16(1240), uint16(1408), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1635), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1508), uint16(1507), uint16(1240), uint16(1240), uint16(1359), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1288), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1386), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1578), uint16(1376), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1626), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1240), uint16(1619), uint16(1332), uint16(1423), uint16(1240), uint16(1422), uint16(1426), uint16(1262), uint16(1240), uint16(1252), uint16(1240), uint16(1240), } var yyFallback = [185]uint16{ uint16(0), uint16(0), uint16(59), uint16(59), uint16(59), uint16(59), uint16(0), uint16(59), uint16(59), uint16(59), uint16(0), uint16(59), uint16(59), uint16(59), uint16(59), uint16(0), uint16(0), uint16(0), uint16(59), uint16(0), uint16(0), uint16(59), uint16(0), uint16(0), uint16(0), uint16(0), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(0), uint16(0), uint16(0), uint16(59), uint16(59), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(59), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), uint16(0), } type yyStackEntry = struct { Fstateno uint16 Fmajor uint16 F__ccgo_pad1 [4]byte Fminor YYMINORTYPE } type YyStackEntry = yyStackEntry type yyParser = struct { Fyytos uintptr FpParse uintptr Fyystack [100]YyStackEntry FyystackEnd uintptr } type YyParser = yyParser // Initialize a new parser that has already been allocated. func Xsqlite3ParserInit(tls *libc.TLS, yypRawParser uintptr, pParse uintptr) { var yypParser uintptr = yypRawParser (*YyParser)(unsafe.Pointer(yypParser)).FpParse = pParse (*YyParser)(unsafe.Pointer(yypParser)).Fyytos = yypParser + 16 (*YyStackEntry)(unsafe.Pointer(yypParser + 16)).Fstateno = uint16(0) (*YyStackEntry)(unsafe.Pointer(yypParser + 16)).Fmajor = uint16(0) (*YyParser)(unsafe.Pointer(yypParser)).FyystackEnd = yypParser + 16 + 99*24 } func yy_destructor(tls *libc.TLS, yypParser uintptr, yymajor uint16, yypminor uintptr) { var pParse uintptr = (*YyParser)(unsafe.Pointer(yypParser)).FpParse switch int32(yymajor) { case 204: fallthrough case 239: fallthrough case 240: fallthrough case 252: { Xsqlite3SelectDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 216: fallthrough case 217: fallthrough case 246: fallthrough case 248: fallthrough case 267: fallthrough case 278: fallthrough case 280: fallthrough case 283: fallthrough case 290: fallthrough case 295: fallthrough case 311: { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 221: fallthrough case 231: fallthrough case 232: fallthrough case 244: fallthrough case 247: fallthrough case 249: fallthrough case 253: fallthrough case 254: fallthrough case 261: fallthrough case 268: fallthrough case 277: fallthrough case 279: fallthrough case 310: { Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 238: fallthrough case 245: fallthrough case 256: fallthrough case 257: fallthrough case 262: { Xsqlite3SrcListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 241: { Xsqlite3WithDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 251: fallthrough case 306: { Xsqlite3WindowListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 263: fallthrough case 270: { Xsqlite3IdListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 273: fallthrough case 307: fallthrough case 308: fallthrough case 309: fallthrough case 312: { Xsqlite3WindowDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 286: fallthrough case 291: { Xsqlite3DeleteTriggerStep(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yypminor))) } break case 288: { Xsqlite3IdListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*TrigEvent)(unsafe.Pointer(yypminor)).Fb) } break case 314: fallthrough case 315: fallthrough case 316: { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*FrameBound)(unsafe.Pointer(yypminor)).FpExpr) } break default: break } } func yy_pop_parser_stack(tls *libc.TLS, pParser uintptr) { var yytos uintptr yytos = libc.PostDecUintptr(&(*YyParser)(unsafe.Pointer(pParser)).Fyytos, 24) yy_destructor(tls, pParser, (*YyStackEntry)(unsafe.Pointer(yytos)).Fmajor, yytos+8) } // Clear all secondary memory allocations from the parser func Xsqlite3ParserFinalize(tls *libc.TLS, p uintptr) { var pParser uintptr = p for (*YyParser)(unsafe.Pointer(pParser)).Fyytos > pParser+16 { yy_pop_parser_stack(tls, pParser) } } func yy_find_shift_action(tls *libc.TLS, iLookAhead uint16, stateno uint16) uint16 { var i int32 if int32(stateno) > YY_MAX_SHIFT { return stateno } for __ccgo := true; __ccgo; __ccgo = 1 != 0 { i = int32(yy_shift_ofst[stateno]) i = i + int32(iLookAhead) if int32(yy_lookahead[i]) != int32(iLookAhead) { var iFallback uint16 iFallback = yyFallback[iLookAhead] if int32(iFallback) != 0 { iLookAhead = iFallback continue } { var j int32 = i - int32(iLookAhead) + YYWILDCARD if int32(yy_lookahead[j]) == YYWILDCARD && int32(iLookAhead) > 0 { return yy_action[j] } } return yy_default[stateno] } else { return yy_action[i] } } return uint16(0) } func yy_find_reduce_action(tls *libc.TLS, stateno uint16, iLookAhead uint16) uint16 { var i int32 i = int32(yy_reduce_ofst[stateno]) i = i + int32(iLookAhead) return yy_action[i] } func yyStackOverflow(tls *libc.TLS, yypParser uintptr) { var pParse uintptr = (*YyParser)(unsafe.Pointer(yypParser)).FpParse for (*YyParser)(unsafe.Pointer(yypParser)).Fyytos > yypParser+16 { yy_pop_parser_stack(tls, yypParser) } Xsqlite3ErrorMsg(tls, pParse, ts+24362, 0) (*YyParser)(unsafe.Pointer(yypParser)).FpParse = pParse } func yy_shift(tls *libc.TLS, yypParser uintptr, yyNewState uint16, yyMajor uint16, yyMinor Token) { var yytos uintptr (*YyParser)(unsafe.Pointer(yypParser)).Fyytos += 24 if (*YyParser)(unsafe.Pointer(yypParser)).Fyytos > (*YyParser)(unsafe.Pointer(yypParser)).FyystackEnd { (*YyParser)(unsafe.Pointer(yypParser)).Fyytos -= 24 yyStackOverflow(tls, yypParser) return } if int32(yyNewState) > YY_MAX_SHIFT { yyNewState = uint16(int32(yyNewState) + (YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE)) } yytos = (*YyParser)(unsafe.Pointer(yypParser)).Fyytos (*YyStackEntry)(unsafe.Pointer(yytos)).Fstateno = yyNewState (*YyStackEntry)(unsafe.Pointer(yytos)).Fmajor = yyMajor *(*Token)(unsafe.Pointer(yytos + 8)) = yyMinor } var yyRuleInfoLhs = [405]uint16{ uint16(189), uint16(189), uint16(188), uint16(190), uint16(191), uint16(191), uint16(191), uint16(191), uint16(190), uint16(190), uint16(190), uint16(190), uint16(190), uint16(195), uint16(197), uint16(199), uint16(199), uint16(198), uint16(198), uint16(196), uint16(196), uint16(203), uint16(203), uint16(205), uint16(205), uint16(206), uint16(208), uint16(208), uint16(208), uint16(209), uint16(213), uint16(214), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(215), uint16(224), uint16(224), uint16(220), uint16(220), uint16(222), uint16(222), uint16(225), uint16(225), uint16(225), uint16(225), uint16(226), uint16(226), uint16(226), uint16(226), uint16(226), uint16(223), uint16(223), uint16(227), uint16(227), uint16(227), uint16(202), uint16(229), uint16(230), uint16(230), uint16(230), uint16(230), uint16(230), uint16(233), uint16(218), uint16(218), uint16(234), uint16(234), uint16(235), uint16(235), uint16(190), uint16(237), uint16(237), uint16(190), uint16(190), uint16(190), uint16(204), uint16(204), uint16(204), uint16(239), uint16(242), uint16(242), uint16(242), uint16(240), uint16(240), uint16(252), uint16(252), uint16(243), uint16(243), uint16(243), uint16(254), uint16(244), uint16(244), uint16(244), uint16(255), uint16(255), uint16(245), uint16(245), uint16(257), uint16(257), uint16(256), uint16(256), uint16(256), uint16(256), uint16(256), uint16(200), uint16(200), uint16(238), uint16(238), uint16(262), uint16(262), uint16(262), uint16(262), uint16(258), uint16(258), uint16(258), uint16(258), uint16(259), uint16(259), uint16(259), uint16(264), uint16(260), uint16(260), uint16(249), uint16(249), uint16(231), uint16(231), uint16(219), uint16(219), uint16(219), uint16(265), uint16(265), uint16(265), uint16(247), uint16(247), uint16(248), uint16(248), uint16(250), uint16(250), uint16(250), uint16(250), uint16(190), uint16(246), uint16(246), uint16(267), uint16(267), uint16(267), uint16(267), uint16(190), uint16(268), uint16(268), uint16(268), uint16(268), uint16(190), uint16(190), uint16(271), uint16(271), uint16(271), uint16(271), uint16(271), uint16(271), uint16(272), uint16(269), uint16(269), uint16(270), uint16(270), uint16(263), uint16(263), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(216), uint16(216), uint16(216), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(216), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(274), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(275), uint16(275), uint16(217), uint16(276), uint16(276), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(217), uint16(279), uint16(279), uint16(280), uint16(280), uint16(278), uint16(278), uint16(261), uint16(253), uint16(253), uint16(277), uint16(277), uint16(190), uint16(281), uint16(281), uint16(221), uint16(221), uint16(232), uint16(232), uint16(282), uint16(282), uint16(190), uint16(190), uint16(190), uint16(283), uint16(283), uint16(190), uint16(190), uint16(190), uint16(190), uint16(190), uint16(211), uint16(212), uint16(190), uint16(285), uint16(287), uint16(287), uint16(287), uint16(288), uint16(288), uint16(288), uint16(290), uint16(290), uint16(286), uint16(286), uint16(292), uint16(293), uint16(293), uint16(291), uint16(291), uint16(291), uint16(291), uint16(217), uint16(217), uint16(236), uint16(236), uint16(236), uint16(190), uint16(190), uint16(190), uint16(295), uint16(295), uint16(190), uint16(190), uint16(190), uint16(190), uint16(190), uint16(190), uint16(190), uint16(296), uint16(190), uint16(190), uint16(190), uint16(298), uint16(300), uint16(301), uint16(301), uint16(302), uint16(266), uint16(266), uint16(305), uint16(305), uint16(305), uint16(304), uint16(241), uint16(241), uint16(306), uint16(306), uint16(307), uint16(308), uint16(308), uint16(308), uint16(308), uint16(308), uint16(308), uint16(309), uint16(309), uint16(309), uint16(313), uint16(315), uint16(315), uint16(316), uint16(316), uint16(314), uint16(314), uint16(317), uint16(317), uint16(318), uint16(318), uint16(318), uint16(251), uint16(273), uint16(273), uint16(273), uint16(312), uint16(312), uint16(311), uint16(185), uint16(186), uint16(186), uint16(187), uint16(187), uint16(187), uint16(192), uint16(192), uint16(192), uint16(194), uint16(194), uint16(190), uint16(203), uint16(201), uint16(201), uint16(193), uint16(193), uint16(193), uint16(208), uint16(209), uint16(210), uint16(210), uint16(207), uint16(207), uint16(215), uint16(215), uint16(215), uint16(202), uint16(228), uint16(228), uint16(229), uint16(233), uint16(235), uint16(239), uint16(240), uint16(254), uint16(255), uint16(264), uint16(272), uint16(217), uint16(274), uint16(261), uint16(284), uint16(284), uint16(284), uint16(284), uint16(284), uint16(211), uint16(289), uint16(289), uint16(292), uint16(293), uint16(294), uint16(294), uint16(297), uint16(297), uint16(299), uint16(299), uint16(300), uint16(303), uint16(303), uint16(303), uint16(266), } var yyRuleInfoNRhs = [405]int8{ int8(-1), int8(-3), int8(-1), int8(-3), int8(0), int8(-1), int8(-1), int8(-1), int8(-2), int8(-2), int8(-2), int8(-3), int8(-5), int8(-6), int8(-1), int8(0), int8(-3), int8(-1), int8(0), int8(-5), int8(-2), int8(0), int8(-3), int8(-2), int8(-1), int8(-2), int8(0), int8(-4), int8(-6), int8(-2), int8(0), int8(0), int8(-2), int8(-3), int8(-4), int8(-4), int8(-4), int8(-3), int8(-3), int8(-5), int8(-2), int8(-4), int8(-4), int8(-1), int8(-2), int8(-3), int8(-4), int8(0), int8(-1), int8(0), int8(-2), int8(-2), int8(-3), int8(-3), int8(-3), int8(-2), int8(-2), int8(-1), int8(-1), int8(-2), int8(-3), int8(-2), int8(0), int8(-2), int8(-2), int8(0), int8(-1), int8(-2), int8(-7), int8(-5), int8(-5), int8(-10), int8(0), int8(0), int8(-3), int8(0), int8(-2), int8(-1), int8(-1), int8(-4), int8(-2), int8(0), int8(-9), int8(-4), int8(-1), int8(-3), int8(-4), int8(-1), int8(-3), int8(-1), int8(-2), int8(-1), int8(-9), int8(-10), int8(-4), int8(-5), int8(-1), int8(-1), int8(0), int8(0), int8(-5), int8(-3), int8(-5), int8(-2), int8(0), int8(0), int8(-2), int8(-2), int8(0), int8(-5), int8(-6), int8(-8), int8(-6), int8(-6), int8(0), int8(-2), int8(-1), int8(-3), int8(-1), int8(-3), int8(-5), int8(-3), int8(-1), int8(-2), int8(-3), int8(-4), int8(-2), int8(-4), int8(0), int8(0), int8(-3), int8(-2), int8(0), int8(-3), int8(-5), int8(-3), int8(-1), int8(-1), int8(0), int8(-2), int8(-2), int8(0), int8(0), int8(-3), int8(0), int8(-2), int8(0), int8(-2), int8(-4), int8(-4), int8(-6), int8(0), int8(-2), int8(0), int8(-2), int8(-2), int8(-4), int8(-9), int8(-5), int8(-7), int8(-3), int8(-5), int8(-7), int8(-8), int8(0), int8(-2), int8(-12), int8(-9), int8(-5), int8(-8), int8(-2), int8(-2), int8(-1), int8(0), int8(-3), int8(-3), int8(-1), int8(-3), int8(-1), int8(-1), int8(-3), int8(-5), int8(-1), int8(-1), int8(-1), int8(-1), int8(-3), int8(-6), int8(-5), int8(-4), int8(-6), int8(-5), int8(-1), int8(-5), int8(-3), int8(-3), int8(-3), int8(-3), int8(-3), int8(-3), int8(-3), int8(-3), int8(-2), int8(-3), int8(-5), int8(-2), int8(-3), int8(-3), int8(-4), int8(-6), int8(-5), int8(-2), int8(-2), int8(-2), int8(-3), int8(-1), int8(-2), int8(-5), int8(-1), int8(-2), int8(-5), int8(-3), int8(-5), int8(-5), int8(-4), int8(-5), int8(-5), int8(-4), int8(-2), int8(0), int8(-1), int8(0), int8(0), int8(-3), int8(-1), int8(0), int8(-3), int8(-12), int8(-1), int8(0), int8(0), int8(-3), int8(-5), int8(-3), int8(0), int8(-2), int8(-4), int8(-2), int8(-3), int8(-2), int8(0), int8(-3), int8(-5), int8(-6), int8(-5), int8(-6), int8(-2), int8(-2), int8(-5), int8(-11), int8(-1), int8(-2), int8(0), int8(-1), int8(-1), int8(-3), int8(0), int8(-2), int8(-3), int8(-2), int8(-3), int8(-3), int8(-2), int8(-9), int8(-8), int8(-6), int8(-3), int8(-4), int8(-6), int8(-1), int8(-1), int8(-1), int8(-4), int8(-6), int8(-3), int8(0), int8(-2), int8(-1), int8(-3), int8(-1), int8(-3), int8(-6), int8(-7), int8(-6), int8(-1), int8(-8), int8(-1), int8(-4), int8(-8), int8(0), int8(-1), int8(-3), int8(-1), int8(-2), int8(-3), int8(-1), int8(-2), int8(-3), int8(-6), int8(-1), int8(-3), int8(-1), int8(-3), int8(-5), int8(-5), int8(-6), int8(-4), int8(-5), int8(-1), int8(-2), int8(0), int8(-3), int8(-6), int8(-1), int8(-1), int8(-2), int8(-1), int8(-2), int8(-2), int8(-2), int8(0), int8(-2), int8(-2), int8(-2), int8(-1), int8(-2), int8(-2), int8(-1), int8(-1), int8(-4), int8(-2), int8(-5), int8(-1), int8(-2), int8(-1), int8(-1), int8(-2), int8(-3), int8(0), int8(-1), int8(-2), int8(-1), int8(0), int8(-2), int8(-1), int8(-4), int8(-2), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-2), int8(0), int8(-2), int8(-4), int8(-2), int8(-2), int8(-3), int8(-1), int8(0), int8(-1), int8(-1), int8(-1), int8(-1), int8(-2), int8(-1), int8(-1), int8(0), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(0), int8(-3), int8(-1), int8(0), int8(-1), int8(0), int8(0), int8(-1), int8(-1), int8(-3), int8(-2), int8(0), int8(-4), int8(-2), int8(0), } func yy_reduce(tls *libc.TLS, yypParser uintptr, yyruleno uint32, yyLookahead int32, yyLookaheadToken Token, pParse uintptr) uint16 { bp := tls.Alloc(160) defer tls.Free(160) var yygoto int32 var yyact uint16 var yymsp uintptr var yysize int32 _ = yyLookahead _ = yyLookaheadToken yymsp = (*YyParser)(unsafe.Pointer(yypParser)).Fyytos { switch yyruleno { case uint32(0): { (*Parse)(unsafe.Pointer(pParse)).Fexplain = U8(1) } break case uint32(1): { (*Parse)(unsafe.Pointer(pParse)).Fexplain = U8(2) } break case uint32(2): { Xsqlite3FinishCoding(tls, pParse) } break case uint32(3): { Xsqlite3BeginTransaction(tls, pParse, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(4): { *(*int32)(unsafe.Pointer(yymsp + 1*24 + 8)) = TK_DEFERRED } break case uint32(5): fallthrough case uint32(6): fallthrough case uint32(7): fallthrough case uint32(323): { *(*int32)(unsafe.Pointer(yymsp + 8)) = int32((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor) } break case uint32(8): fallthrough case uint32(9): { Xsqlite3EndTransaction(tls, pParse, int32((*YyStackEntry)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24)).Fmajor)) } break case uint32(10): { Xsqlite3Savepoint(tls, pParse, SAVEPOINT_BEGIN, yymsp+8) } break case uint32(11): { Xsqlite3Savepoint(tls, pParse, SAVEPOINT_RELEASE, yymsp+8) } break case uint32(12): { Xsqlite3Savepoint(tls, pParse, SAVEPOINT_ROLLBACK, yymsp+8) } break case uint32(13): { Xsqlite3StartTable(tls, pParse, yymsp+libc.UintptrFromInt32(-1)*24+8, yymsp+8, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), 0, 0, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) } break case uint32(14): { disableLookaside(tls, pParse) } break case uint32(15): fallthrough case uint32(18): fallthrough case uint32(47): fallthrough case uint32(62): fallthrough case uint32(72): fallthrough case uint32(81): fallthrough case uint32(98): fallthrough case uint32(244): { *(*int32)(unsafe.Pointer(yymsp + 1*24 + 8)) = 0 } break case uint32(16): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = 1 } break case uint32(17): { *(*int32)(unsafe.Pointer(yymsp + 8)) = libc.Bool32(int32((*Sqlite3)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).Fdb)).Finit.Fbusy) == 0) } break case uint32(19): { Xsqlite3EndTable(tls, pParse, yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8, *(*U32)(unsafe.Pointer(yymsp + 8)), uintptr(0)) } break case uint32(20): { Xsqlite3EndTable(tls, pParse, uintptr(0), uintptr(0), uint32(0), *(*uintptr)(unsafe.Pointer(yymsp + 8))) Xsqlite3SelectDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(21): { *(*U32)(unsafe.Pointer(yymsp + 1*24 + 8)) = U32(0) } break case uint32(22): { *(*U32)(unsafe.Pointer(bp + 40)) = *(*U32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) | *(*U32)(unsafe.Pointer(yymsp + 8)) } *(*U32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*U32)(unsafe.Pointer(bp + 40)) break case uint32(23): { if (*Token)(unsafe.Pointer(yymsp+8)).Fn == uint32(5) && Xsqlite3_strnicmp(tls, (*Token)(unsafe.Pointer(yymsp+8)).Fz, ts+17625, 5) == 0 { *(*U32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = U32(TF_WithoutRowid | TF_NoVisibleRowid) } else { *(*U32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = U32(0) Xsqlite3ErrorMsg(tls, pParse, ts+24384, libc.VaList(bp, (*Token)(unsafe.Pointer(yymsp+8)).Fn, (*Token)(unsafe.Pointer(yymsp+8)).Fz)) } } break case uint32(24): { if (*Token)(unsafe.Pointer(yymsp+8)).Fn == uint32(6) && Xsqlite3_strnicmp(tls, (*Token)(unsafe.Pointer(yymsp+8)).Fz, ts+17538, 6) == 0 { *(*U32)(unsafe.Pointer(bp + 40)) = U32(TF_Strict) } else { *(*U32)(unsafe.Pointer(bp + 40)) = U32(0) Xsqlite3ErrorMsg(tls, pParse, ts+24384, libc.VaList(bp+16, (*Token)(unsafe.Pointer(yymsp+8)).Fn, (*Token)(unsafe.Pointer(yymsp+8)).Fz)) } } *(*U32)(unsafe.Pointer(yymsp + 8)) = *(*U32)(unsafe.Pointer(bp + 40)) break case uint32(25): { Xsqlite3AddColumn(tls, pParse, *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*Token)(unsafe.Pointer(yymsp + 8))) } break case uint32(26): fallthrough case uint32(65): fallthrough case uint32(104): { (*Token)(unsafe.Pointer(yymsp + 1*24 + 8)).Fn = uint32(0) (*Token)(unsafe.Pointer(yymsp + 1*24 + 8)).Fz = uintptr(0) } break case uint32(27): { (*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)).Fn = uint32(int32((int64((*Token)(unsafe.Pointer(yymsp+8)).Fz+uintptr((*Token)(unsafe.Pointer(yymsp+8)).Fn)) - int64((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-3)*24+8)).Fz)) / 1)) } break case uint32(28): { (*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)).Fn = uint32(int32((int64((*Token)(unsafe.Pointer(yymsp+8)).Fz+uintptr((*Token)(unsafe.Pointer(yymsp+8)).Fn)) - int64((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-5)*24+8)).Fz)) / 1)) } break case uint32(29): { (*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)).Fn = (*Token)(unsafe.Pointer(yymsp+8)).Fn + uint32(int32((int64((*Token)(unsafe.Pointer(yymsp+8)).Fz)-int64((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fz))/1)) } break case uint32(30): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = yyLookaheadToken.Fz } break case uint32(31): { *(*Token)(unsafe.Pointer(yymsp + 1*24 + 8)) = yyLookaheadToken } break case uint32(32): fallthrough case uint32(67): { (*Parse)(unsafe.Pointer(pParse)).FconstraintName = *(*Token)(unsafe.Pointer(yymsp + 8)) } break case uint32(33): { Xsqlite3AddDefaultValue(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fz, (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fz+uintptr((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fn)) } break case uint32(34): { Xsqlite3AddDefaultValue(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-2)*24+8)).Fz+uintptr(1), (*Token)(unsafe.Pointer(yymsp+8)).Fz) } break case uint32(35): { Xsqlite3AddDefaultValue(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-2)*24+8)).Fz, (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fz+uintptr((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fn)) } break case uint32(36): { var p uintptr = Xsqlite3PExpr(tls, pParse, TK_UMINUS, *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0)) Xsqlite3AddDefaultValue(tls, pParse, p, (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-2)*24+8)).Fz, (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fz+uintptr((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fn)) } break case uint32(37): { var p uintptr = tokenExpr(tls, pParse, TK_STRING, *(*Token)(unsafe.Pointer(yymsp + 8))) if p != 0 { Xsqlite3ExprIdToTrueFalse(tls, p) } Xsqlite3AddDefaultValue(tls, pParse, p, (*Token)(unsafe.Pointer(yymsp+8)).Fz, (*Token)(unsafe.Pointer(yymsp+8)).Fz+uintptr((*Token)(unsafe.Pointer(yymsp+8)).Fn)) } break case uint32(38): { Xsqlite3AddNotNull(tls, pParse, *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(39): { Xsqlite3AddPrimaryKey(tls, pParse, uintptr(0), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) } break case uint32(40): { Xsqlite3CreateIndex(tls, pParse, uintptr(0), uintptr(0), uintptr(0), uintptr(0), *(*int32)(unsafe.Pointer(yymsp + 8)), uintptr(0), uintptr(0), 0, 0, uint8(SQLITE_IDXTYPE_UNIQUE)) } break case uint32(41): { Xsqlite3AddCheckConstraint(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-2)*24+8)).Fz, (*Token)(unsafe.Pointer(yymsp+8)).Fz) } break case uint32(42): { Xsqlite3CreateForeignKey(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-2)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(43): { Xsqlite3DeferForeignKey(tls, pParse, *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(44): { Xsqlite3AddCollateType(tls, pParse, yymsp+8) } break case uint32(45): { Xsqlite3AddGenerated(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uintptr(0)) } break case uint32(46): { Xsqlite3AddGenerated(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), yymsp+8) } break case uint32(48): { *(*int32)(unsafe.Pointer(yymsp + 8)) = 1 } break case uint32(49): { *(*int32)(unsafe.Pointer(yymsp + 1*24 + 8)) = OE_None * 0x0101 } break case uint32(50): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) & ^*(*int32)(unsafe.Pointer(yymsp + 8 + 4)) | *(*int32)(unsafe.Pointer(yymsp + 8)) } break case uint32(51): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = 0 *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8 + 4)) = 0x000000 } break case uint32(52): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = 0 *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8 + 4)) = 0x000000 } break case uint32(53): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*int32)(unsafe.Pointer(yymsp + 8)) *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8 + 4)) = 0x0000ff } break case uint32(54): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*int32)(unsafe.Pointer(yymsp + 8)) << 8 *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8 + 4)) = 0x00ff00 } break case uint32(55): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = OE_SetNull } break case uint32(56): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = OE_SetDflt } break case uint32(57): { *(*int32)(unsafe.Pointer(yymsp + 8)) = OE_Cascade } break case uint32(58): { *(*int32)(unsafe.Pointer(yymsp + 8)) = OE_Restrict } break case uint32(59): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = OE_None } break case uint32(60): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = 0 } break case uint32(61): fallthrough case uint32(76): fallthrough case uint32(171): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*int32)(unsafe.Pointer(yymsp + 8)) } break case uint32(63): fallthrough case uint32(80): fallthrough case uint32(216): fallthrough case uint32(219): fallthrough case uint32(245): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = 1 } break case uint32(64): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = 0 } break case uint32(66): { (*Parse)(unsafe.Pointer(pParse)).FconstraintName.Fn = uint32(0) } break case uint32(68): { Xsqlite3AddPrimaryKey(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), 0) } break case uint32(69): { Xsqlite3CreateIndex(tls, pParse, uintptr(0), uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8)), uintptr(0), uintptr(0), 0, 0, uint8(SQLITE_IDXTYPE_UNIQUE)) } break case uint32(70): { Xsqlite3AddCheckConstraint(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-3)*24+8)).Fz, (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fz) } break case uint32(71): { Xsqlite3CreateForeignKey(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)), yymsp+libc.UintptrFromInt32(-3)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) Xsqlite3DeferForeignKey(tls, pParse, *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(73): fallthrough case uint32(75): { *(*int32)(unsafe.Pointer(yymsp + 1*24 + 8)) = OE_Default } break case uint32(74): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*int32)(unsafe.Pointer(yymsp + 8)) } break case uint32(77): { *(*int32)(unsafe.Pointer(yymsp + 8)) = OE_Ignore } break case uint32(78): fallthrough case uint32(172): { *(*int32)(unsafe.Pointer(yymsp + 8)) = OE_Replace } break case uint32(79): { Xsqlite3DropTable(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), 0, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(82): { Xsqlite3CreateView(tls, pParse, yymsp+libc.UintptrFromInt32(-8)*24+8, yymsp+libc.UintptrFromInt32(-4)*24+8, yymsp+libc.UintptrFromInt32(-3)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8))) } break case uint32(83): { Xsqlite3DropTable(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), 1, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(84): { *(*SelectDest)(unsafe.Pointer(bp + 56)) = SelectDest{FeDest: U8(SRT_Output)} Xsqlite3Select(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), bp+56) Xsqlite3SelectDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(85): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = attachWithToSelect(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(86): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = attachWithToSelect(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(87): { var p uintptr = *(*uintptr)(unsafe.Pointer(yymsp + 8)) if p != 0 { parserDoubleLinkSelect(tls, pParse, p) } *(*uintptr)(unsafe.Pointer(yymsp + 8)) = p } break case uint32(88): { var pRhs uintptr = *(*uintptr)(unsafe.Pointer(yymsp + 8)) var pLhs uintptr = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) if pRhs != 0 && (*Select)(unsafe.Pointer(pRhs)).FpPrior != 0 { var pFrom uintptr (*Token)(unsafe.Pointer(bp + 96)).Fn = uint32(0) parserDoubleLinkSelect(tls, pParse, pRhs) pFrom = Xsqlite3SrcListAppendFromTerm(tls, pParse, uintptr(0), uintptr(0), uintptr(0), bp+96, pRhs, uintptr(0)) pRhs = Xsqlite3SelectNew(tls, pParse, uintptr(0), pFrom, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(0), uintptr(0)) } if pRhs != 0 { (*Select)(unsafe.Pointer(pRhs)).Fop = U8(*(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) (*Select)(unsafe.Pointer(pRhs)).FpPrior = pLhs if pLhs != 0 { *(*U32)(unsafe.Pointer(pLhs + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_MultiValue)) } *(*U32)(unsafe.Pointer(pRhs + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_MultiValue)) if *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) != TK_ALL { (*Parse)(unsafe.Pointer(pParse)).FhasCompound = U8(1) } } else { Xsqlite3SelectDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pLhs) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = pRhs } break case uint32(89): fallthrough case uint32(91): { *(*int32)(unsafe.Pointer(yymsp + 8)) = int32((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor) } break case uint32(90): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = TK_ALL } break case uint32(92): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-8)*24 + 8)) = Xsqlite3SelectNew(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uint32(*(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8))), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(93): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-9)*24 + 8)) = Xsqlite3SelectNew(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uint32(*(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-8)*24 + 8))), *(*uintptr)(unsafe.Pointer(yymsp + 8))) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-9)*24 + 8)) != 0 { (*Select)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-9)*24 + 8)))).FpWinDefn = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) } else { Xsqlite3WindowListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) } } break case uint32(94): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3SelectNew(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(SF_Values), uintptr(0)) } break case uint32(95): { var pRight uintptr var pLeft uintptr = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) pRight = Xsqlite3SelectNew(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(SF_Values|SF_MultiValue), uintptr(0)) if pLeft != 0 { *(*U32)(unsafe.Pointer(pLeft + 4)) &= libc.Uint32FromInt32(libc.CplInt32(SF_MultiValue)) } if pRight != 0 { (*Select)(unsafe.Pointer(pRight)).Fop = U8(TK_ALL) (*Select)(unsafe.Pointer(pRight)).FpPrior = pLeft *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = pRight } else { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = pLeft } } break case uint32(96): { *(*int32)(unsafe.Pointer(yymsp + 8)) = SF_Distinct } break case uint32(97): { *(*int32)(unsafe.Pointer(yymsp + 8)) = SF_All } break case uint32(99): fallthrough case uint32(132): fallthrough case uint32(142): fallthrough case uint32(232): fallthrough case uint32(235): fallthrough case uint32(240): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = uintptr(0) } break case uint32(100): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) if (*Token)(unsafe.Pointer(yymsp+8)).Fn > uint32(0) { Xsqlite3ExprListSetName(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), yymsp+8, 1) } Xsqlite3ExprListSetSpan(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(101): { var p uintptr = Xsqlite3Expr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_ASTERISK, uintptr(0)) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), p) } break case uint32(102): { var pRight uintptr = Xsqlite3PExpr(tls, pParse, TK_ASTERISK, uintptr(0), uintptr(0)) var pLeft uintptr = tokenExpr(tls, pParse, TK_ID, *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) var pDot uintptr = Xsqlite3PExpr(tls, pParse, TK_DOT, pLeft, pRight) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), pDot) } break case uint32(103): fallthrough case uint32(115): fallthrough case uint32(256): fallthrough case uint32(257): { *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*Token)(unsafe.Pointer(yymsp + 8)) } break case uint32(105): fallthrough case uint32(108): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = uintptr(0) } break case uint32(106): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) Xsqlite3SrcListShiftJoinType(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(107): { if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) != 0 && (*SrcList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)))).FnSrc > 0 { (*SrcItem)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) + 8 + uintptr((*SrcList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)))).FnSrc-1)*104)).Ffg.Fjointype = U8(*(*int32)(unsafe.Pointer(yymsp + 8))) } } break case uint32(109): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3SrcListAppendFromTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8, uintptr(0), yymsp+8) } break case uint32(110): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3SrcListAppendFromTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), yymsp+libc.UintptrFromInt32(-4)*24+8, yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-2)*24+8, uintptr(0), yymsp+8) Xsqlite3SrcListIndexedBy(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), yymsp+libc.UintptrFromInt32(-1)*24+8) } break case uint32(111): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)) = Xsqlite3SrcListAppendFromTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)), yymsp+libc.UintptrFromInt32(-6)*24+8, yymsp+libc.UintptrFromInt32(-5)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8, uintptr(0), yymsp+8) Xsqlite3SrcListFuncArgs(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8))) } break case uint32(112): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3SrcListAppendFromTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), uintptr(0), uintptr(0), yymsp+libc.UintptrFromInt32(-1)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), yymsp+8) } break case uint32(113): { if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) == uintptr(0) && (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fn == uint32(0) && (*OnOrUsing)(unsafe.Pointer(yymsp+8)).FpOn == uintptr(0) && (*OnOrUsing)(unsafe.Pointer(yymsp+8)).FpUsing == uintptr(0) { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) } else if (*SrcList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)))).FnSrc == 1 { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3SrcListAppendFromTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), uintptr(0), uintptr(0), yymsp+libc.UintptrFromInt32(-1)*24+8, uintptr(0), yymsp+8) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) != 0 { var pNew uintptr = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) + 8 + uintptr((*SrcList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)))).FnSrc-1)*104 var pOld uintptr = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) + 8 (*SrcItem)(unsafe.Pointer(pNew)).FzName = (*SrcItem)(unsafe.Pointer(pOld)).FzName (*SrcItem)(unsafe.Pointer(pNew)).FzDatabase = (*SrcItem)(unsafe.Pointer(pOld)).FzDatabase (*SrcItem)(unsafe.Pointer(pNew)).FpSelect = (*SrcItem)(unsafe.Pointer(pOld)).FpSelect if (*SrcItem)(unsafe.Pointer(pNew)).FpSelect != 0 && (*Select)(unsafe.Pointer((*SrcItem)(unsafe.Pointer(pNew)).FpSelect)).FselFlags&U32(SF_NestedFrom) != U32(0) { libc.SetBitFieldPtr16Uint32(pNew+60+4, uint32(1), 13, 0x2000) } if uint32(int32(*(*uint16)(unsafe.Pointer(pOld + 60 + 4))&0x4>>2)) != 0 { *(*uintptr)(unsafe.Pointer(pNew + 88)) = *(*uintptr)(unsafe.Pointer(pOld + 88)) *(*uintptr)(unsafe.Pointer(pOld + 88)) = uintptr(0) libc.SetBitFieldPtr16Uint32(pOld+60+4, uint32(0), 2, 0x4) libc.SetBitFieldPtr16Uint32(pNew+60+4, uint32(1), 2, 0x4) } (*SrcItem)(unsafe.Pointer(pOld)).FzName = libc.AssignPtrUintptr(pOld+8, uintptr(0)) (*SrcItem)(unsafe.Pointer(pOld)).FpSelect = uintptr(0) } Xsqlite3SrcListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8))) } else { var pSubquery uintptr Xsqlite3SrcListShiftJoinType(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8))) pSubquery = Xsqlite3SelectNew(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(SF_NestedFrom), uintptr(0)) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3SrcListAppendFromTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), uintptr(0), uintptr(0), yymsp+libc.UintptrFromInt32(-1)*24+8, pSubquery, yymsp+8) } } break case uint32(114): fallthrough case uint32(129): { (*Token)(unsafe.Pointer(yymsp + 1*24 + 8)).Fz = uintptr(0) (*Token)(unsafe.Pointer(yymsp + 1*24 + 8)).Fn = uint32(0) } break case uint32(116): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+8, uintptr(0)) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && *(*uintptr)(unsafe.Pointer(bp + 40)) != 0 { Xsqlite3RenameTokenMap(tls, pParse, (*SrcItem)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 40))+8)).FzName, yymsp+8) } } *(*uintptr)(unsafe.Pointer(yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(117): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+8) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && *(*uintptr)(unsafe.Pointer(bp + 40)) != 0 { Xsqlite3RenameTokenMap(tls, pParse, (*SrcItem)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 40))+8)).FzName, yymsp+8) } } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(118): { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+8, uintptr(0)) } break case uint32(119): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+8) } break case uint32(120): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-4)*24+8, yymsp+libc.UintptrFromInt32(-2)*24+8) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) != 0 { (*SrcItem)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) + 8)).FzAlias = Xsqlite3NameFromToken(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, yymsp+8) } } break case uint32(121): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-2)*24+8, uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) != 0 { (*SrcItem)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) + 8)).FzAlias = Xsqlite3NameFromToken(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, yymsp+8) } } break case uint32(122): { *(*int32)(unsafe.Pointer(yymsp + 8)) = JT_INNER } break case uint32(123): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = Xsqlite3JoinType(tls, pParse, yymsp+libc.UintptrFromInt32(-1)*24+8, uintptr(0), uintptr(0)) } break case uint32(124): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3JoinType(tls, pParse, yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8, uintptr(0)) } break case uint32(125): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3JoinType(tls, pParse, yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8) } break case uint32(126): { (*OnOrUsing)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)).FpOn = *(*uintptr)(unsafe.Pointer(yymsp + 8)) (*OnOrUsing)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)).FpUsing = uintptr(0) } break case uint32(127): { (*OnOrUsing)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)).FpOn = uintptr(0) (*OnOrUsing)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)).FpUsing = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(128): { (*OnOrUsing)(unsafe.Pointer(yymsp + 1*24 + 8)).FpOn = uintptr(0) (*OnOrUsing)(unsafe.Pointer(yymsp + 1*24 + 8)).FpUsing = uintptr(0) } break case uint32(130): { *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*Token)(unsafe.Pointer(yymsp + 8)) } break case uint32(131): { (*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)).Fz = uintptr(0) (*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)).Fn = uint32(1) } break case uint32(133): fallthrough case uint32(143): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } break case uint32(134): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) Xsqlite3ExprListSetSortOrder(tls, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(135): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) Xsqlite3ExprListSetSortOrder(tls, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(136): { *(*int32)(unsafe.Pointer(yymsp + 8)) = SQLITE_SO_ASC } break case uint32(137): { *(*int32)(unsafe.Pointer(yymsp + 8)) = SQLITE_SO_DESC } break case uint32(138): fallthrough case uint32(141): { *(*int32)(unsafe.Pointer(yymsp + 1*24 + 8)) = -1 } break case uint32(139): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = SQLITE_SO_ASC } break case uint32(140): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = SQLITE_SO_DESC } break case uint32(144): fallthrough case uint32(146): fallthrough case uint32(151): fallthrough case uint32(153): fallthrough case uint32(229): fallthrough case uint32(231): fallthrough case uint32(250): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = uintptr(0) } break case uint32(145): fallthrough case uint32(152): fallthrough case uint32(154): fallthrough case uint32(228): fallthrough case uint32(249): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } break case uint32(147): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_LIMIT, *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0)) } break case uint32(148): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_LIMIT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(149): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_LIMIT, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) } break case uint32(150): { Xsqlite3SrcListIndexedBy(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), yymsp+libc.UintptrFromInt32(-1)*24+8) Xsqlite3DeleteFrom(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0), uintptr(0)) } break case uint32(155): { Xsqlite3AddReturning(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = uintptr(0) } break case uint32(156): { Xsqlite3AddReturning(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) } break case uint32(157): { Xsqlite3SrcListIndexedBy(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), yymsp+libc.UintptrFromInt32(-4)*24+8) Xsqlite3ExprListCheckLength(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), ts+24411) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) != 0 { var pFromClause uintptr = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) if (*SrcList)(unsafe.Pointer(pFromClause)).FnSrc > 1 { var pSubquery uintptr pSubquery = Xsqlite3SelectNew(tls, pParse, uintptr(0), pFromClause, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(SF_NestedFrom), uintptr(0)) (*Token)(unsafe.Pointer(bp + 112)).Fn = uint32(0) (*Token)(unsafe.Pointer(bp + 112)).Fz = uintptr(0) pFromClause = Xsqlite3SrcListAppendFromTerm(tls, pParse, uintptr(0), uintptr(0), uintptr(0), bp+112, pSubquery, uintptr(0)) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3SrcListAppendList(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), pFromClause) } Xsqlite3Update(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)), uintptr(0), uintptr(0), uintptr(0)) } break case uint32(158): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) Xsqlite3ExprListSetName(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), yymsp+libc.UintptrFromInt32(-2)*24+8, 1) } break case uint32(159): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)) = Xsqlite3ExprListAppendVector(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(160): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + 8))) Xsqlite3ExprListSetName(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 40)), yymsp+libc.UintptrFromInt32(-2)*24+8, 1) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(161): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprListAppendVector(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(162): { Xsqlite3Insert(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(163): { Xsqlite3Insert(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)), uintptr(0)) } break case uint32(164): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = uintptr(0) } break case uint32(165): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = uintptr(0) Xsqlite3AddReturning(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(166): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-11)*24 + 8)) = Xsqlite3UpsertNew(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-8)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(167): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-8)*24 + 8)) = Xsqlite3UpsertNew(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(168): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3UpsertNew(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0)) } break case uint32(169): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)) = Xsqlite3UpsertNew(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uintptr(0)) } break case uint32(170): { Xsqlite3AddReturning(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(173): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = uintptr(0) } break case uint32(174): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(175): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3IdListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), yymsp+8) } break case uint32(176): { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = Xsqlite3IdListAppend(tls, pParse, uintptr(0), yymsp+8) } break case uint32(177): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(178): fallthrough case uint32(179): { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = tokenExpr(tls, pParse, TK_ID, *(*Token)(unsafe.Pointer(yymsp + 8))) } break case uint32(180): { var temp1 uintptr = tokenExpr(tls, pParse, TK_ID, *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) var temp2 uintptr = tokenExpr(tls, pParse, TK_ID, *(*Token)(unsafe.Pointer(yymsp + 8))) *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3PExpr(tls, pParse, TK_DOT, temp1, temp2) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(181): { var temp1 uintptr = tokenExpr(tls, pParse, TK_ID, *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8))) var temp2 uintptr = tokenExpr(tls, pParse, TK_ID, *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) var temp3 uintptr = tokenExpr(tls, pParse, TK_ID, *(*Token)(unsafe.Pointer(yymsp + 8))) var temp4 uintptr = Xsqlite3PExpr(tls, pParse, TK_DOT, temp2, temp3) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME { Xsqlite3RenameTokenRemap(tls, pParse, uintptr(0), temp1) } *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3PExpr(tls, pParse, TK_DOT, temp1, temp4) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(182): fallthrough case uint32(183): { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = tokenExpr(tls, pParse, int32((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor), *(*Token)(unsafe.Pointer(yymsp + 8))) } break case uint32(184): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_INTEGER, yymsp+8, 1) if *(*uintptr)(unsafe.Pointer(bp + 40)) != 0 { *(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 40)) + 52)) = int32((int64((*Token)(unsafe.Pointer(yymsp+8)).Fz) - int64((*Parse)(unsafe.Pointer(pParse)).FzTail)) / 1) } } *(*uintptr)(unsafe.Pointer(yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(185): { if !(int32(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(yymsp + 8)).Fz))) == '#' && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(yymsp+8)).Fz + 1)))])&0x04 != 0) { var n U32 = (*Token)(unsafe.Pointer(yymsp + 8)).Fn *(*uintptr)(unsafe.Pointer(yymsp + 8)) = tokenExpr(tls, pParse, TK_VARIABLE, *(*Token)(unsafe.Pointer(yymsp + 8))) Xsqlite3ExprAssignVarNumber(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), n) } else { *(*Token)(unsafe.Pointer(bp + 128)) = *(*Token)(unsafe.Pointer(yymsp + 8)) if int32((*Parse)(unsafe.Pointer(pParse)).Fnested) == 0 { Xsqlite3ErrorMsg(tls, pParse, ts+24420, libc.VaList(bp+32, bp+128)) *(*uintptr)(unsafe.Pointer(yymsp + 8)) = uintptr(0) } else { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = Xsqlite3PExpr(tls, pParse, TK_REGISTER, uintptr(0), uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + 8)) != 0 { Xsqlite3GetInt32(tls, (*Token)(unsafe.Pointer(bp+128)).Fz+1, *(*uintptr)(unsafe.Pointer(yymsp + 8))+44) } } } } break case uint32(186): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3ExprAddCollateToken(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), yymsp+8, 1) } break case uint32(187): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3ExprAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_CAST, yymsp+libc.UintptrFromInt32(-1)*24+8, 1) Xsqlite3ExprAttachSubtrees(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), uintptr(0)) } break case uint32(188): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprFunction(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), yymsp+libc.UintptrFromInt32(-4)*24+8, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(189): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprFunction(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-3)*24+8, 0) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(190): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprFunction(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), yymsp+libc.UintptrFromInt32(-5)*24+8, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8))) Xsqlite3WindowAttach(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 40)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(191): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprFunction(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-4)*24+8, 0) Xsqlite3WindowAttach(tls, pParse, *(*uintptr)(unsafe.Pointer(bp + 40)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(192): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprFunction(tls, pParse, uintptr(0), yymsp+8, 0) } *(*uintptr)(unsafe.Pointer(yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(193): { var pList uintptr = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_VECTOR, uintptr(0), uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) != 0 { *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) + 32)) = pList if (*ExprList)(unsafe.Pointer(pList)).FnExpr != 0 { *(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) + 4)) |= (*Expr)(unsafe.Pointer((*ExprList_item)(unsafe.Pointer(pList+8)).FpExpr)).Fflags & U32(EP_Collate|EP_Subquery|EP_HasFunc) } } else { Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pList) } } break case uint32(194): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3ExprAnd(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(195): fallthrough case uint32(196): fallthrough case uint32(197): fallthrough case uint32(198): fallthrough case uint32(199): fallthrough case uint32(200): fallthrough case uint32(201): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3PExpr(tls, pParse, int32((*YyStackEntry)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24)).Fmajor), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(202): { *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*Token)(unsafe.Pointer(yymsp + 8)) *(*uint32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8 + 8)) |= 0x80000000 } break case uint32(203): { var pList uintptr var bNot int32 = int32((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fn & 0x80000000) *(*uint32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8 + 8)) &= uint32(0x7fffffff) pList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + 8))) pList = Xsqlite3ExprListAppend(tls, pParse, pList, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3ExprFunction(tls, pParse, pList, yymsp+libc.UintptrFromInt32(-1)*24+8, 0) if bNot != 0 { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_NOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), uintptr(0)) } if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) != 0 { *(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) + 4)) |= U32(EP_InfixFunc) } } break case uint32(204): { var pList uintptr var bNot int32 = int32((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-3)*24+8)).Fn & 0x80000000) *(*uint32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8 + 8)) &= uint32(0x7fffffff) pList = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) pList = Xsqlite3ExprListAppend(tls, pParse, pList, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8))) pList = Xsqlite3ExprListAppend(tls, pParse, pList, *(*uintptr)(unsafe.Pointer(yymsp + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprFunction(tls, pParse, pList, yymsp+libc.UintptrFromInt32(-3)*24+8, 0) if bNot != 0 { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_NOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) } if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) != 0 { *(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) + 4)) |= U32(EP_InfixFunc) } } break case uint32(205): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = Xsqlite3PExpr(tls, pParse, int32((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uintptr(0)) } break case uint32(206): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_NOTNULL, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), uintptr(0)) } break case uint32(207): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_IS, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) binaryToUnaryIfNull(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), TK_ISNULL) } break case uint32(208): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_ISNOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) binaryToUnaryIfNull(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), TK_NOTNULL) } break case uint32(209): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_IS, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) binaryToUnaryIfNull(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), TK_ISNULL) } break case uint32(210): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_ISNOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) binaryToUnaryIfNull(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), TK_NOTNULL) } break case uint32(211): fallthrough case uint32(212): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = Xsqlite3PExpr(tls, pParse, int32((*YyStackEntry)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24)).Fmajor), *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0)) } break case uint32(213): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = Xsqlite3PExpr(tls, pParse, func() int32 { if int32((*YyStackEntry)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24)).Fmajor) == TK_PLUS { return TK_UPLUS } return TK_UMINUS }(), *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0)) } break case uint32(214): { var pList uintptr = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) pList = Xsqlite3ExprListAppend(tls, pParse, pList, *(*uintptr)(unsafe.Pointer(yymsp + 8))) *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3ExprFunction(tls, pParse, pList, yymsp+libc.UintptrFromInt32(-1)*24+8, 0) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(215): fallthrough case uint32(218): { *(*int32)(unsafe.Pointer(yymsp + 8)) = 0 } break case uint32(217): { var pList uintptr = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) pList = Xsqlite3ExprListAppend(tls, pParse, pList, *(*uintptr)(unsafe.Pointer(yymsp + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_BETWEEN, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) != 0 { *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) + 32)) = pList } else { Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, pList) } if *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) != 0 { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_NOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) } } break case uint32(220): { if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) == uintptr(0) { Xsqlite3ExprUnmapAndDelete(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3Expr(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_STRING, func() uintptr { if *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) != 0 { return ts + 9046 } return ts + 9051 }()) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) != 0 { Xsqlite3ExprIdToTrueFalse(tls, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8))) } } else { var pRHS uintptr = (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) + 8)).FpExpr if (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)))).FnExpr == 1 && Xsqlite3ExprIsConstant(tls, pRHS) != 0 && int32((*Expr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)))).Fop) != TK_VECTOR { (*ExprList_item)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) + 8)).FpExpr = uintptr(0) Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) pRHS = Xsqlite3PExpr(tls, pParse, TK_UPLUS, pRHS, uintptr(0)) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_EQ, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), pRHS) } else if (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)))).FnExpr == 1 && int32((*Expr)(unsafe.Pointer(pRHS)).Fop) == TK_SELECT { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_IN, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) Xsqlite3PExprAddSelect(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(pRHS + 32))) *(*uintptr)(unsafe.Pointer(pRHS + 32)) = uintptr(0) Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } else { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_IN, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) == uintptr(0) { Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } else if int32((*Expr)(unsafe.Pointer((*Expr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)))).FpLeft)).Fop) == TK_VECTOR { var nExpr int32 = (*ExprList)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Expr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)))).FpLeft + 32)))).FnExpr var pSelectRHS uintptr = Xsqlite3ExprListToValues(tls, pParse, nExpr, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) if pSelectRHS != 0 { parserDoubleLinkSelect(tls, pParse, pSelectRHS) Xsqlite3PExprAddSelect(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), pSelectRHS) } } else { *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) + 32)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) Xsqlite3ExprSetHeightAndFlags(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8))) } } if *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) != 0 { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_NOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) } } } break case uint32(221): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_SELECT, uintptr(0), uintptr(0)) Xsqlite3PExprAddSelect(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(222): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_IN, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) Xsqlite3PExprAddSelect(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) if *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) != 0 { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_NOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) } } break case uint32(223): { var pSrc uintptr = Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8) var pSelect uintptr = Xsqlite3SelectNew(tls, pParse, uintptr(0), pSrc, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uint32(0), uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + 8)) != 0 { Xsqlite3SrcListFuncArgs(tls, pParse, func() uintptr { if pSelect != 0 { return pSrc } return uintptr(0) }(), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_IN, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) Xsqlite3PExprAddSelect(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), pSelect) if *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) != 0 { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_NOT, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), uintptr(0)) } } break case uint32(224): { var p uintptr p = libc.AssignPtrUintptr(yymsp+libc.UintptrFromInt32(-3)*24+8, Xsqlite3PExpr(tls, pParse, TK_EXISTS, uintptr(0), uintptr(0))) Xsqlite3PExprAddSelect(tls, pParse, p, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(225): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_CASE, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) != 0 { *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) + 32)) = func() uintptr { if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) != 0 { return Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } return *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) }() Xsqlite3ExprSetHeightAndFlags(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8))) } else { Xsqlite3ExprListDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } } break case uint32(226): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(227): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(230): { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } break case uint32(233): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3ExprListAppend(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(234): { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = Xsqlite3ExprListAppend(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(236): fallthrough case uint32(241): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(237): { Xsqlite3CreateIndex(tls, pParse, yymsp+libc.UintptrFromInt32(-7)*24+8, yymsp+libc.UintptrFromInt32(-6)*24+8, Xsqlite3SrcListAppend(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-4)*24+8, uintptr(0)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-10)*24 + 8)), yymsp+libc.UintptrFromInt32(-11)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + 8)), SQLITE_SO_ASC, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-8)*24 + 8)), uint8(SQLITE_IDXTYPE_APPDEF)) if int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME && (*Parse)(unsafe.Pointer(pParse)).FpNewIndex != 0 { Xsqlite3RenameTokenMap(tls, pParse, (*Index)(unsafe.Pointer((*Parse)(unsafe.Pointer(pParse)).FpNewIndex)).FzName, yymsp+libc.UintptrFromInt32(-4)*24+8) } } break case uint32(238): fallthrough case uint32(280): { *(*int32)(unsafe.Pointer(yymsp + 8)) = OE_Abort } break case uint32(239): { *(*int32)(unsafe.Pointer(yymsp + 1*24 + 8)) = OE_None } break case uint32(242): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = parserAddExprIdListTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), yymsp+libc.UintptrFromInt32(-2)*24+8, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(243): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = parserAddExprIdListTerm(tls, pParse, uintptr(0), yymsp+libc.UintptrFromInt32(-2)*24+8, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + 8))) } break case uint32(246): { Xsqlite3DropIndex(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(247): { Xsqlite3Vacuum(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(248): { Xsqlite3Vacuum(tls, pParse, yymsp+libc.UintptrFromInt32(-1)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(251): { Xsqlite3Pragma(tls, pParse, yymsp+libc.UintptrFromInt32(-1)*24+8, yymsp+8, uintptr(0), 0) } break case uint32(252): { Xsqlite3Pragma(tls, pParse, yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+8, 0) } break case uint32(253): { Xsqlite3Pragma(tls, pParse, yymsp+libc.UintptrFromInt32(-4)*24+8, yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8, 0) } break case uint32(254): { Xsqlite3Pragma(tls, pParse, yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+8, 1) } break case uint32(255): { Xsqlite3Pragma(tls, pParse, yymsp+libc.UintptrFromInt32(-4)*24+8, yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-1)*24+8, 1) } break case uint32(258): { (*Token)(unsafe.Pointer(bp + 144)).Fz = (*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)).Fz (*Token)(unsafe.Pointer(bp + 144)).Fn = uint32(int32((int64((*Token)(unsafe.Pointer(yymsp+8)).Fz)-int64((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-3)*24+8)).Fz))/1)) + (*Token)(unsafe.Pointer(yymsp+8)).Fn Xsqlite3FinishTrigger(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), bp+144) } break case uint32(259): { Xsqlite3BeginTrigger(tls, pParse, yymsp+libc.UintptrFromInt32(-7)*24+8, yymsp+libc.UintptrFromInt32(-6)*24+8, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), (*TrigEvent)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-4)*24+8)).Fa, (*TrigEvent)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-4)*24+8)).Fb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-10)*24 + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-8)*24 + 8))) *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-10)*24 + 8)) = func() Token1 { if (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-6)*24+8)).Fn == uint32(0) { return *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)) } return *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8)) }() } break case uint32(260): { *(*int32)(unsafe.Pointer(yymsp + 8)) = int32((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor) } break case uint32(261): { *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = TK_INSTEAD } break case uint32(262): { *(*int32)(unsafe.Pointer(yymsp + 1*24 + 8)) = TK_BEFORE } break case uint32(263): fallthrough case uint32(264): { (*TrigEvent)(unsafe.Pointer(yymsp + 8)).Fa = int32((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor) (*TrigEvent)(unsafe.Pointer(yymsp + 8)).Fb = uintptr(0) } break case uint32(265): { (*TrigEvent)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)).Fa = TK_UPDATE (*TrigEvent)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)).Fb = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } break case uint32(266): fallthrough case uint32(285): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = uintptr(0) } break case uint32(267): fallthrough case uint32(286): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } break case uint32(268): { (*TriggerStep)(unsafe.Pointer((*TriggerStep)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)))).FpLast)).FpNext = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) (*TriggerStep)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)))).FpLast = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(269): { (*TriggerStep)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)))).FpLast = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(270): { *(*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*Token)(unsafe.Pointer(yymsp + 8)) Xsqlite3ErrorMsg(tls, pParse, ts+24444, 0) } break case uint32(271): { Xsqlite3ErrorMsg(tls, pParse, ts+24539, 0) } break case uint32(272): { Xsqlite3ErrorMsg(tls, pParse, ts+24623, 0) } break case uint32(273): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3TriggerUpdateStep(tls, pParse, yymsp+libc.UintptrFromInt32(-6)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uint8(*(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8))), (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-8)*24+8)).Fz, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-8)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(274): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3TriggerInsertStep(tls, pParse, yymsp+libc.UintptrFromInt32(-4)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), uint8(*(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-6)*24 + 8))), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-7)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(275): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3TriggerDeleteStep(tls, pParse, yymsp+libc.UintptrFromInt32(-3)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-5)*24+8)).Fz, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(276): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3TriggerSelectStep(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(277): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3PExpr(tls, pParse, TK_RAISE, uintptr(0), uintptr(0)) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) != 0 { (*Expr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)))).FaffExpr = int8(OE_Ignore) } } break case uint32(278): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3ExprAlloc(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, TK_RAISE, yymsp+libc.UintptrFromInt32(-1)*24+8, 1) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) != 0 { (*Expr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)))).FaffExpr = int8(*(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8))) } } break case uint32(279): { *(*int32)(unsafe.Pointer(yymsp + 8)) = OE_Rollback } break case uint32(281): { *(*int32)(unsafe.Pointer(yymsp + 8)) = OE_Fail } break case uint32(282): { Xsqlite3DropTrigger(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(283): { Xsqlite3Attach(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(284): { Xsqlite3Detach(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(287): { Xsqlite3Reindex(tls, pParse, uintptr(0), uintptr(0)) } break case uint32(288): { Xsqlite3Reindex(tls, pParse, yymsp+libc.UintptrFromInt32(-1)*24+8, yymsp+8) } break case uint32(289): { Xsqlite3Analyze(tls, pParse, uintptr(0), uintptr(0)) } break case uint32(290): { Xsqlite3Analyze(tls, pParse, yymsp+libc.UintptrFromInt32(-1)*24+8, yymsp+8) } break case uint32(291): { Xsqlite3AlterRenameTable(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), yymsp+8) } break case uint32(292): { (*Token)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)).Fn = uint32(int32((int64((*Parse)(unsafe.Pointer(pParse)).FsLastToken.Fz)-int64((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).Fz))/1)) + (*Parse)(unsafe.Pointer(pParse)).FsLastToken.Fn Xsqlite3AlterFinishAddColumn(tls, pParse, yymsp+libc.UintptrFromInt32(-1)*24+8) } break case uint32(293): { Xsqlite3AlterDropColumn(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)), yymsp+8) } break case uint32(294): { disableLookaside(tls, pParse) Xsqlite3AlterBeginAddColumn(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(295): { Xsqlite3AlterRenameColumn(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+8) } break case uint32(296): { Xsqlite3VtabFinishParse(tls, pParse, uintptr(0)) } break case uint32(297): { Xsqlite3VtabFinishParse(tls, pParse, yymsp+8) } break case uint32(298): { Xsqlite3VtabBeginParse(tls, pParse, yymsp+libc.UintptrFromInt32(-3)*24+8, yymsp+libc.UintptrFromInt32(-2)*24+8, yymsp+8, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8))) } break case uint32(299): { Xsqlite3VtabArgInit(tls, pParse) } break case uint32(300): fallthrough case uint32(301): fallthrough case uint32(302): { Xsqlite3VtabArgExtend(tls, pParse, yymsp+8) } break case uint32(303): fallthrough case uint32(304): { Xsqlite3WithPush(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), uint8(1)) } break case uint32(305): { *(*U8)(unsafe.Pointer(yymsp + 8)) = U8(M10d_Any) } break case uint32(306): { *(*U8)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = U8(M10d_Yes) } break case uint32(307): { *(*U8)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = U8(M10d_No) } break case uint32(308): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = Xsqlite3CteNew(tls, pParse, yymsp+libc.UintptrFromInt32(-5)*24+8, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*U8)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8))) } break case uint32(309): { *(*uintptr)(unsafe.Pointer(yymsp + 8)) = Xsqlite3WithAdd(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(310): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = Xsqlite3WithAdd(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + 8))) } break case uint32(311): { *(*uintptr)(unsafe.Pointer(bp + 40)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } *(*uintptr)(unsafe.Pointer(yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(312): { Xsqlite3WindowChain(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8))) (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + 8)))).FpNextWin = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) *(*uintptr)(unsafe.Pointer(bp + 40)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(313): { if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) != 0 { (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)))).FzName = Xsqlite3DbStrNDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-4)*24+8)).Fz, uint64((*Token)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-4)*24+8)).Fn)) } *(*uintptr)(unsafe.Pointer(bp + 40)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(314): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = Xsqlite3WindowAssemble(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uintptr(0)) } break case uint32(315): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3WindowAssemble(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), yymsp+libc.UintptrFromInt32(-5)*24+8) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(316): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = Xsqlite3WindowAssemble(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), uintptr(0)) } break case uint32(317): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3WindowAssemble(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0), *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)), yymsp+libc.UintptrFromInt32(-4)*24+8) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(318): fallthrough case uint32(337): { *(*uintptr)(unsafe.Pointer(bp + 40)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } *(*uintptr)(unsafe.Pointer(yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(319): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3WindowAssemble(tls, pParse, *(*uintptr)(unsafe.Pointer(yymsp + 8)), uintptr(0), uintptr(0), yymsp+libc.UintptrFromInt32(-1)*24+8) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(320): { *(*uintptr)(unsafe.Pointer(yymsp + 1*24 + 8)) = Xsqlite3WindowAlloc(tls, pParse, 0, TK_UNBOUNDED, uintptr(0), TK_CURRENT, uintptr(0), uint8(0)) } break case uint32(321): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3WindowAlloc(tls, pParse, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)), (*FrameBound)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).FeType, (*FrameBound)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).FpExpr, TK_CURRENT, uintptr(0), *(*U8)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(322): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3WindowAlloc(tls, pParse, *(*int32)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)), (*FrameBound)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-3)*24+8)).FeType, (*FrameBound)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-3)*24+8)).FpExpr, (*FrameBound)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).FeType, (*FrameBound)(unsafe.Pointer(yymsp+libc.UintptrFromInt32(-1)*24+8)).FpExpr, *(*U8)(unsafe.Pointer(yymsp + 8))) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-5)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(324): fallthrough case uint32(326): { *(*FrameBound)(unsafe.Pointer(bp + 40)) = *(*FrameBound)(unsafe.Pointer(yymsp + 8)) } *(*FrameBound)(unsafe.Pointer(yymsp + 8)) = *(*FrameBound)(unsafe.Pointer(bp + 40)) break case uint32(325): fallthrough case uint32(327): fallthrough case uint32(329): { (*FrameBound)(unsafe.Pointer(bp + 40)).FeType = int32((*YyStackEntry)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24)).Fmajor) (*FrameBound)(unsafe.Pointer(bp + 40)).FpExpr = uintptr(0) } *(*FrameBound)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*FrameBound)(unsafe.Pointer(bp + 40)) break case uint32(328): { (*FrameBound)(unsafe.Pointer(bp + 40)).FeType = int32((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor) (*FrameBound)(unsafe.Pointer(bp + 40)).FpExpr = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } *(*FrameBound)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*FrameBound)(unsafe.Pointer(bp + 40)) break case uint32(330): { *(*U8)(unsafe.Pointer(yymsp + 1*24 + 8)) = U8(0) } break case uint32(331): { *(*U8)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*U8)(unsafe.Pointer(yymsp + 8)) } break case uint32(332): fallthrough case uint32(333): { *(*U8)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = U8((*YyStackEntry)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24)).Fmajor) } break case uint32(334): { *(*U8)(unsafe.Pointer(yymsp + 8)) = U8((*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor) } break case uint32(335): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } break case uint32(336): { if *(*uintptr)(unsafe.Pointer(yymsp + 8)) != 0 { (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + 8)))).FpFilter = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } else { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } *(*uintptr)(unsafe.Pointer(bp + 40)) = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(338): { *(*uintptr)(unsafe.Pointer(bp + 40)) = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Window{}))) if *(*uintptr)(unsafe.Pointer(bp + 40)) != 0 { (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 40)))).FeFrmType = U8(TK_FILTER) (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 40)))).FpFilter = *(*uintptr)(unsafe.Pointer(yymsp + 8)) } else { Xsqlite3ExprDelete(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, *(*uintptr)(unsafe.Pointer(yymsp + 8))) } } *(*uintptr)(unsafe.Pointer(yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp + 40)) break case uint32(339): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(340): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = Xsqlite3DbMallocZero(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, uint64(unsafe.Sizeof(Window{}))) if *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) != 0 { (*Window)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)))).FzName = Xsqlite3DbStrNDup(tls, (*Parse)(unsafe.Pointer(pParse)).Fdb, (*Token)(unsafe.Pointer(yymsp+8)).Fz, uint64((*Token)(unsafe.Pointer(yymsp+8)).Fn)) } } break case uint32(341): { *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break default: break } } yygoto = int32(yyRuleInfoLhs[yyruleno]) yysize = int32(yyRuleInfoNRhs[yyruleno]) yyact = yy_find_reduce_action(tls, (*YyStackEntry)(unsafe.Pointer(yymsp+uintptr(yysize)*24)).Fstateno, uint16(yygoto)) yymsp += 24 * uintptr(yysize+1) (*YyParser)(unsafe.Pointer(yypParser)).Fyytos = yymsp (*YyStackEntry)(unsafe.Pointer(yymsp)).Fstateno = yyact (*YyStackEntry)(unsafe.Pointer(yymsp)).Fmajor = uint16(yygoto) return yyact } func yy_syntax_error(tls *libc.TLS, yypParser uintptr, yymajor int32, yyminor Token) { bp := tls.Alloc(24) defer tls.Free(24) *(*Token)(unsafe.Pointer(bp + 8)) = yyminor var pParse uintptr = (*YyParser)(unsafe.Pointer(yypParser)).FpParse _ = yymajor if *(*int8)(unsafe.Pointer((*Token)(unsafe.Pointer(bp + 8)).Fz)) != 0 { Xsqlite3ErrorMsg(tls, pParse, ts+24420, libc.VaList(bp, bp+8)) } else { Xsqlite3ErrorMsg(tls, pParse, ts+24708, 0) } (*YyParser)(unsafe.Pointer(yypParser)).FpParse = pParse } func yy_accept(tls *libc.TLS, yypParser uintptr) { var pParse uintptr = (*YyParser)(unsafe.Pointer(yypParser)).FpParse (*YyParser)(unsafe.Pointer(yypParser)).FpParse = pParse } // The main parser program. // The first argument is a pointer to a structure obtained from // "sqlite3ParserAlloc" which describes the current state of the parser. // The second argument is the major token number. The third is // the minor token. The fourth optional argument is whatever the // user wants (and specified in the grammar) and is available for // use by the action routines. // // Inputs: //
    //
  • A pointer to the parser (an opaque structure.) //
  • The major token number. //
  • The minor token number. //
  • An option argument of a grammar-specified type. //
// // Outputs: // None. func Xsqlite3Parser(tls *libc.TLS, yyp uintptr, yymajor int32, yyminor Token) { bp := tls.Alloc(16) defer tls.Free(16) var yyact uint16 var yypParser uintptr = yyp var pParse uintptr = (*YyParser)(unsafe.Pointer(yypParser)).FpParse yyact = (*YyStackEntry)(unsafe.Pointer((*YyParser)(unsafe.Pointer(yypParser)).Fyytos)).Fstateno for 1 != 0 { yyact = yy_find_shift_action(tls, uint16(yymajor), yyact) if int32(yyact) >= YY_MIN_REDUCE { var yyruleno uint32 = uint32(int32(yyact) - YY_MIN_REDUCE) if int32(yyRuleInfoNRhs[yyruleno]) == 0 { if (*YyParser)(unsafe.Pointer(yypParser)).Fyytos >= (*YyParser)(unsafe.Pointer(yypParser)).FyystackEnd { yyStackOverflow(tls, yypParser) break } } yyact = yy_reduce(tls, yypParser, yyruleno, yymajor, yyminor, pParse) } else if int32(yyact) <= YY_MAX_SHIFTREDUCE { yy_shift(tls, yypParser, yyact, uint16(yymajor), yyminor) break } else if int32(yyact) == YY_ACCEPT_ACTION { (*YyParser)(unsafe.Pointer(yypParser)).Fyytos -= 24 yy_accept(tls, yypParser) return } else { *(*Token)(unsafe.Pointer(bp)) = yyminor yy_syntax_error(tls, yypParser, yymajor, yyminor) yy_destructor(tls, yypParser, uint16(yymajor), bp) break } } return } // Return the fallback token corresponding to canonical token iToken, or // 0 if iToken has no fallback. func Xsqlite3ParserFallback(tls *libc.TLS, iToken int32) int32 { return int32(yyFallback[iToken]) } var aiClass = [256]uint8{ uint8(29), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(7), uint8(7), uint8(28), uint8(7), uint8(7), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(28), uint8(7), uint8(15), uint8(8), uint8(5), uint8(4), uint8(22), uint8(24), uint8(8), uint8(17), uint8(18), uint8(21), uint8(20), uint8(23), uint8(11), uint8(26), uint8(16), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(3), uint8(5), uint8(19), uint8(12), uint8(14), uint8(13), uint8(6), uint8(5), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(0), uint8(2), uint8(2), uint8(9), uint8(28), uint8(28), uint8(28), uint8(2), uint8(8), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(0), uint8(2), uint8(2), uint8(28), uint8(10), uint8(28), uint8(25), uint8(28), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(30), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), } var zKWText = [666]int8{ int8('R'), int8('E'), int8('I'), int8('N'), int8('D'), int8('E'), int8('X'), int8('E'), int8('D'), int8('E'), int8('S'), int8('C'), int8('A'), int8('P'), int8('E'), int8('A'), int8('C'), int8('H'), int8('E'), int8('C'), int8('K'), int8('E'), int8('Y'), int8('B'), int8('E'), int8('F'), int8('O'), int8('R'), int8('E'), int8('I'), int8('G'), int8('N'), int8('O'), int8('R'), int8('E'), int8('G'), int8('E'), int8('X'), int8('P'), int8('L'), int8('A'), int8('I'), int8('N'), int8('S'), int8('T'), int8('E'), int8('A'), int8('D'), int8('D'), int8('A'), int8('T'), int8('A'), int8('B'), int8('A'), int8('S'), int8('E'), int8('L'), int8('E'), int8('C'), int8('T'), int8('A'), int8('B'), int8('L'), int8('E'), int8('F'), int8('T'), int8('H'), int8('E'), int8('N'), int8('D'), int8('E'), int8('F'), int8('E'), int8('R'), int8('R'), int8('A'), int8('B'), int8('L'), int8('E'), int8('L'), int8('S'), int8('E'), int8('X'), int8('C'), int8('L'), int8('U'), int8('D'), int8('E'), int8('L'), int8('E'), int8('T'), int8('E'), int8('M'), int8('P'), int8('O'), int8('R'), int8('A'), int8('R'), int8('Y'), int8('I'), int8('S'), int8('N'), int8('U'), int8('L'), int8('L'), int8('S'), int8('A'), int8('V'), int8('E'), int8('P'), int8('O'), int8('I'), int8('N'), int8('T'), int8('E'), int8('R'), int8('S'), int8('E'), int8('C'), int8('T'), int8('I'), int8('E'), int8('S'), int8('N'), int8('O'), int8('T'), int8('N'), int8('U'), int8('L'), int8('L'), int8('I'), int8('K'), int8('E'), int8('X'), int8('C'), int8('E'), int8('P'), int8('T'), int8('R'), int8('A'), int8('N'), int8('S'), int8('A'), int8('C'), int8('T'), int8('I'), int8('O'), int8('N'), int8('A'), int8('T'), int8('U'), int8('R'), int8('A'), int8('L'), int8('T'), int8('E'), int8('R'), int8('A'), int8('I'), int8('S'), int8('E'), int8('X'), int8('C'), int8('L'), int8('U'), int8('S'), int8('I'), int8('V'), int8('E'), int8('X'), int8('I'), int8('S'), int8('T'), int8('S'), int8('C'), int8('O'), int8('N'), int8('S'), int8('T'), int8('R'), int8('A'), int8('I'), int8('N'), int8('T'), int8('O'), int8('F'), int8('F'), int8('S'), int8('E'), int8('T'), int8('R'), int8('I'), int8('G'), int8('G'), int8('E'), int8('R'), int8('A'), int8('N'), int8('G'), int8('E'), int8('N'), int8('E'), int8('R'), int8('A'), int8('T'), int8('E'), int8('D'), int8('E'), int8('T'), int8('A'), int8('C'), int8('H'), int8('A'), int8('V'), int8('I'), int8('N'), int8('G'), int8('L'), int8('O'), int8('B'), int8('E'), int8('G'), int8('I'), int8('N'), int8('N'), int8('E'), int8('R'), int8('E'), int8('F'), int8('E'), int8('R'), int8('E'), int8('N'), int8('C'), int8('E'), int8('S'), int8('U'), int8('N'), int8('I'), int8('Q'), int8('U'), int8('E'), int8('R'), int8('Y'), int8('W'), int8('I'), int8('T'), int8('H'), int8('O'), int8('U'), int8('T'), int8('E'), int8('R'), int8('E'), int8('L'), int8('E'), int8('A'), int8('S'), int8('E'), int8('A'), int8('T'), int8('T'), int8('A'), int8('C'), int8('H'), int8('B'), int8('E'), int8('T'), int8('W'), int8('E'), int8('E'), int8('N'), int8('O'), int8('T'), int8('H'), int8('I'), int8('N'), int8('G'), int8('R'), int8('O'), int8('U'), int8('P'), int8('S'), int8('C'), int8('A'), int8('S'), int8('C'), int8('A'), int8('D'), int8('E'), int8('F'), int8('A'), int8('U'), int8('L'), int8('T'), int8('C'), int8('A'), int8('S'), int8('E'), int8('C'), int8('O'), int8('L'), int8('L'), int8('A'), int8('T'), int8('E'), int8('C'), int8('R'), int8('E'), int8('A'), int8('T'), int8('E'), int8('C'), int8('U'), int8('R'), int8('R'), int8('E'), int8('N'), int8('T'), int8('_'), int8('D'), int8('A'), int8('T'), int8('E'), int8('I'), int8('M'), int8('M'), int8('E'), int8('D'), int8('I'), int8('A'), int8('T'), int8('E'), int8('J'), int8('O'), int8('I'), int8('N'), int8('S'), int8('E'), int8('R'), int8('T'), int8('M'), int8('A'), int8('T'), int8('C'), int8('H'), int8('P'), int8('L'), int8('A'), int8('N'), int8('A'), int8('L'), int8('Y'), int8('Z'), int8('E'), int8('P'), int8('R'), int8('A'), int8('G'), int8('M'), int8('A'), int8('T'), int8('E'), int8('R'), int8('I'), int8('A'), int8('L'), int8('I'), int8('Z'), int8('E'), int8('D'), int8('E'), int8('F'), int8('E'), int8('R'), int8('R'), int8('E'), int8('D'), int8('I'), int8('S'), int8('T'), int8('I'), int8('N'), int8('C'), int8('T'), int8('U'), int8('P'), int8('D'), int8('A'), int8('T'), int8('E'), int8('V'), int8('A'), int8('L'), int8('U'), int8('E'), int8('S'), int8('V'), int8('I'), int8('R'), int8('T'), int8('U'), int8('A'), int8('L'), int8('W'), int8('A'), int8('Y'), int8('S'), int8('W'), int8('H'), int8('E'), int8('N'), int8('W'), int8('H'), int8('E'), int8('R'), int8('E'), int8('C'), int8('U'), int8('R'), int8('S'), int8('I'), int8('V'), int8('E'), int8('A'), int8('B'), int8('O'), int8('R'), int8('T'), int8('A'), int8('F'), int8('T'), int8('E'), int8('R'), int8('E'), int8('N'), int8('A'), int8('M'), int8('E'), int8('A'), int8('N'), int8('D'), int8('R'), int8('O'), int8('P'), int8('A'), int8('R'), int8('T'), int8('I'), int8('T'), int8('I'), int8('O'), int8('N'), int8('A'), int8('U'), int8('T'), int8('O'), int8('I'), int8('N'), int8('C'), int8('R'), int8('E'), int8('M'), int8('E'), int8('N'), int8('T'), int8('C'), int8('A'), int8('S'), int8('T'), int8('C'), int8('O'), int8('L'), int8('U'), int8('M'), int8('N'), int8('C'), int8('O'), int8('M'), int8('M'), int8('I'), int8('T'), int8('C'), int8('O'), int8('N'), int8('F'), int8('L'), int8('I'), int8('C'), int8('T'), int8('C'), int8('R'), int8('O'), int8('S'), int8('S'), int8('C'), int8('U'), int8('R'), int8('R'), int8('E'), int8('N'), int8('T'), int8('_'), int8('T'), int8('I'), int8('M'), int8('E'), int8('S'), int8('T'), int8('A'), int8('M'), int8('P'), int8('R'), int8('E'), int8('C'), int8('E'), int8('D'), int8('I'), int8('N'), int8('G'), int8('F'), int8('A'), int8('I'), int8('L'), int8('A'), int8('S'), int8('T'), int8('F'), int8('I'), int8('L'), int8('T'), int8('E'), int8('R'), int8('E'), int8('P'), int8('L'), int8('A'), int8('C'), int8('E'), int8('F'), int8('I'), int8('R'), int8('S'), int8('T'), int8('F'), int8('O'), int8('L'), int8('L'), int8('O'), int8('W'), int8('I'), int8('N'), int8('G'), int8('F'), int8('R'), int8('O'), int8('M'), int8('F'), int8('U'), int8('L'), int8('L'), int8('I'), int8('M'), int8('I'), int8('T'), int8('I'), int8('F'), int8('O'), int8('R'), int8('D'), int8('E'), int8('R'), int8('E'), int8('S'), int8('T'), int8('R'), int8('I'), int8('C'), int8('T'), int8('O'), int8('T'), int8('H'), int8('E'), int8('R'), int8('S'), int8('O'), int8('V'), int8('E'), int8('R'), int8('E'), int8('T'), int8('U'), int8('R'), int8('N'), int8('I'), int8('N'), int8('G'), int8('R'), int8('I'), int8('G'), int8('H'), int8('T'), int8('R'), int8('O'), int8('L'), int8('L'), int8('B'), int8('A'), int8('C'), int8('K'), int8('R'), int8('O'), int8('W'), int8('S'), int8('U'), int8('N'), int8('B'), int8('O'), int8('U'), int8('N'), int8('D'), int8('E'), int8('D'), int8('U'), int8('N'), int8('I'), int8('O'), int8('N'), int8('U'), int8('S'), int8('I'), int8('N'), int8('G'), int8('V'), int8('A'), int8('C'), int8('U'), int8('U'), int8('M'), int8('V'), int8('I'), int8('E'), int8('W'), int8('I'), int8('N'), int8('D'), int8('O'), int8('W'), int8('B'), int8('Y'), int8('I'), int8('N'), int8('I'), int8('T'), int8('I'), int8('A'), int8('L'), int8('L'), int8('Y'), int8('P'), int8('R'), int8('I'), int8('M'), int8('A'), int8('R'), int8('Y'), } var aKWHash = [127]uint8{ uint8(84), uint8(92), uint8(134), uint8(82), uint8(105), uint8(29), uint8(0), uint8(0), uint8(94), uint8(0), uint8(85), uint8(72), uint8(0), uint8(53), uint8(35), uint8(86), uint8(15), uint8(0), uint8(42), uint8(97), uint8(54), uint8(89), uint8(135), uint8(19), uint8(0), uint8(0), uint8(140), uint8(0), uint8(40), uint8(129), uint8(0), uint8(22), uint8(107), uint8(0), uint8(9), uint8(0), uint8(0), uint8(123), uint8(80), uint8(0), uint8(78), uint8(6), uint8(0), uint8(65), uint8(103), uint8(147), uint8(0), uint8(136), uint8(115), uint8(0), uint8(0), uint8(48), uint8(0), uint8(90), uint8(24), uint8(0), uint8(17), uint8(0), uint8(27), uint8(70), uint8(23), uint8(26), uint8(5), uint8(60), uint8(142), uint8(110), uint8(122), uint8(0), uint8(73), uint8(91), uint8(71), uint8(145), uint8(61), uint8(120), uint8(74), uint8(0), uint8(49), uint8(0), uint8(11), uint8(41), uint8(0), uint8(113), uint8(0), uint8(0), uint8(0), uint8(109), uint8(10), uint8(111), uint8(116), uint8(125), uint8(14), uint8(50), uint8(124), uint8(0), uint8(100), uint8(0), uint8(18), uint8(121), uint8(144), uint8(56), uint8(130), uint8(139), uint8(88), uint8(83), uint8(37), uint8(30), uint8(126), uint8(0), uint8(0), uint8(108), uint8(51), uint8(131), uint8(128), uint8(0), uint8(34), uint8(0), uint8(0), uint8(132), uint8(0), uint8(98), uint8(38), uint8(39), uint8(0), uint8(20), uint8(45), uint8(117), uint8(93), } var aKWNext = [147]uint8{ uint8(0), uint8(0), uint8(0), uint8(0), uint8(4), uint8(0), uint8(43), uint8(0), uint8(0), uint8(106), uint8(114), uint8(0), uint8(0), uint8(0), uint8(2), uint8(0), uint8(0), uint8(143), uint8(0), uint8(0), uint8(0), uint8(13), uint8(0), uint8(0), uint8(0), uint8(0), uint8(141), uint8(0), uint8(0), uint8(119), uint8(52), uint8(0), uint8(0), uint8(137), uint8(12), uint8(0), uint8(0), uint8(62), uint8(0), uint8(138), uint8(0), uint8(133), uint8(0), uint8(0), uint8(36), uint8(0), uint8(0), uint8(28), uint8(77), uint8(0), uint8(0), uint8(0), uint8(0), uint8(59), uint8(0), uint8(47), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(69), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(146), uint8(3), uint8(0), uint8(58), uint8(0), uint8(1), uint8(75), uint8(0), uint8(0), uint8(0), uint8(31), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(127), uint8(0), uint8(104), uint8(0), uint8(64), uint8(66), uint8(63), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(46), uint8(0), uint8(16), uint8(8), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(81), uint8(101), uint8(0), uint8(112), uint8(21), uint8(7), uint8(67), uint8(0), uint8(79), uint8(96), uint8(118), uint8(0), uint8(0), uint8(68), uint8(0), uint8(0), uint8(99), uint8(44), uint8(0), uint8(55), uint8(0), uint8(76), uint8(0), uint8(95), uint8(32), uint8(33), uint8(57), uint8(25), uint8(0), uint8(102), uint8(0), uint8(0), uint8(87), } var aKWLen = [147]uint8{ uint8(7), uint8(7), uint8(5), uint8(4), uint8(6), uint8(4), uint8(5), uint8(3), uint8(6), uint8(7), uint8(3), uint8(6), uint8(6), uint8(7), uint8(7), uint8(3), uint8(8), uint8(2), uint8(6), uint8(5), uint8(4), uint8(4), uint8(3), uint8(10), uint8(4), uint8(7), uint8(6), uint8(9), uint8(4), uint8(2), uint8(6), uint8(5), uint8(9), uint8(9), uint8(4), uint8(7), uint8(3), uint8(2), uint8(4), uint8(4), uint8(6), uint8(11), uint8(6), uint8(2), uint8(7), uint8(5), uint8(5), uint8(9), uint8(6), uint8(10), uint8(4), uint8(6), uint8(2), uint8(3), uint8(7), uint8(5), uint8(9), uint8(6), uint8(6), uint8(4), uint8(5), uint8(5), uint8(10), uint8(6), uint8(5), uint8(7), uint8(4), uint8(5), uint8(7), uint8(6), uint8(7), uint8(7), uint8(6), uint8(5), uint8(7), uint8(3), uint8(7), uint8(4), uint8(7), uint8(6), uint8(12), uint8(9), uint8(4), uint8(6), uint8(5), uint8(4), uint8(7), uint8(6), uint8(12), uint8(8), uint8(8), uint8(2), uint8(6), uint8(6), uint8(7), uint8(6), uint8(4), uint8(5), uint8(9), uint8(5), uint8(5), uint8(6), uint8(3), uint8(4), uint8(9), uint8(13), uint8(2), uint8(2), uint8(4), uint8(6), uint8(6), uint8(8), uint8(5), uint8(17), uint8(12), uint8(7), uint8(9), uint8(4), uint8(4), uint8(6), uint8(7), uint8(5), uint8(9), uint8(4), uint8(4), uint8(5), uint8(2), uint8(5), uint8(8), uint8(6), uint8(4), uint8(9), uint8(5), uint8(8), uint8(4), uint8(3), uint8(9), uint8(5), uint8(5), uint8(6), uint8(4), uint8(6), uint8(2), uint8(2), uint8(9), uint8(3), uint8(7), } var aKWOffset = [147]uint16{ uint16(0), uint16(2), uint16(2), uint16(8), uint16(9), uint16(14), uint16(16), uint16(20), uint16(23), uint16(25), uint16(25), uint16(29), uint16(33), uint16(36), uint16(41), uint16(46), uint16(48), uint16(53), uint16(54), uint16(59), uint16(62), uint16(65), uint16(67), uint16(69), uint16(78), uint16(81), uint16(86), uint16(90), uint16(90), uint16(94), uint16(99), uint16(101), uint16(105), uint16(111), uint16(119), uint16(123), uint16(123), uint16(123), uint16(126), uint16(129), uint16(132), uint16(137), uint16(142), uint16(146), uint16(147), uint16(152), uint16(156), uint16(160), uint16(168), uint16(174), uint16(181), uint16(184), uint16(184), uint16(187), uint16(189), uint16(195), uint16(198), uint16(206), uint16(211), uint16(216), uint16(219), uint16(222), uint16(226), uint16(236), uint16(239), uint16(244), uint16(244), uint16(248), uint16(252), uint16(259), uint16(265), uint16(271), uint16(277), uint16(277), uint16(283), uint16(284), uint16(288), uint16(295), uint16(299), uint16(306), uint16(312), uint16(324), uint16(333), uint16(335), uint16(341), uint16(346), uint16(348), uint16(355), uint16(359), uint16(370), uint16(377), uint16(378), uint16(385), uint16(391), uint16(397), uint16(402), uint16(408), uint16(412), uint16(415), uint16(424), uint16(429), uint16(433), uint16(439), uint16(441), uint16(444), uint16(453), uint16(455), uint16(457), uint16(466), uint16(470), uint16(476), uint16(482), uint16(490), uint16(495), uint16(495), uint16(495), uint16(511), uint16(520), uint16(523), uint16(527), uint16(532), uint16(539), uint16(544), uint16(553), uint16(557), uint16(560), uint16(565), uint16(567), uint16(571), uint16(579), uint16(585), uint16(588), uint16(597), uint16(602), uint16(610), uint16(610), uint16(614), uint16(623), uint16(628), uint16(633), uint16(639), uint16(642), uint16(645), uint16(648), uint16(650), uint16(655), uint16(659), } var aKWCode = [147]uint8{ uint8(TK_REINDEX), uint8(TK_INDEXED), uint8(TK_INDEX), uint8(TK_DESC), uint8(TK_ESCAPE), uint8(TK_EACH), uint8(TK_CHECK), uint8(TK_KEY), uint8(TK_BEFORE), uint8(TK_FOREIGN), uint8(TK_FOR), uint8(TK_IGNORE), uint8(TK_LIKE_KW), uint8(TK_EXPLAIN), uint8(TK_INSTEAD), uint8(TK_ADD), uint8(TK_DATABASE), uint8(TK_AS), uint8(TK_SELECT), uint8(TK_TABLE), uint8(TK_JOIN_KW), uint8(TK_THEN), uint8(TK_END), uint8(TK_DEFERRABLE), uint8(TK_ELSE), uint8(TK_EXCLUDE), uint8(TK_DELETE), uint8(TK_TEMP), uint8(TK_TEMP), uint8(TK_OR), uint8(TK_ISNULL), uint8(TK_NULLS), uint8(TK_SAVEPOINT), uint8(TK_INTERSECT), uint8(TK_TIES), uint8(TK_NOTNULL), uint8(TK_NOT), uint8(TK_NO), uint8(TK_NULL), uint8(TK_LIKE_KW), uint8(TK_EXCEPT), uint8(TK_TRANSACTION), uint8(TK_ACTION), uint8(TK_ON), uint8(TK_JOIN_KW), uint8(TK_ALTER), uint8(TK_RAISE), uint8(TK_EXCLUSIVE), uint8(TK_EXISTS), uint8(TK_CONSTRAINT), uint8(TK_INTO), uint8(TK_OFFSET), uint8(TK_OF), uint8(TK_SET), uint8(TK_TRIGGER), uint8(TK_RANGE), uint8(TK_GENERATED), uint8(TK_DETACH), uint8(TK_HAVING), uint8(TK_LIKE_KW), uint8(TK_BEGIN), uint8(TK_JOIN_KW), uint8(TK_REFERENCES), uint8(TK_UNIQUE), uint8(TK_QUERY), uint8(TK_WITHOUT), uint8(TK_WITH), uint8(TK_JOIN_KW), uint8(TK_RELEASE), uint8(TK_ATTACH), uint8(TK_BETWEEN), uint8(TK_NOTHING), uint8(TK_GROUPS), uint8(TK_GROUP), uint8(TK_CASCADE), uint8(TK_ASC), uint8(TK_DEFAULT), uint8(TK_CASE), uint8(TK_COLLATE), uint8(TK_CREATE), uint8(TK_CTIME_KW), uint8(TK_IMMEDIATE), uint8(TK_JOIN), uint8(TK_INSERT), uint8(TK_MATCH), uint8(TK_PLAN), uint8(TK_ANALYZE), uint8(TK_PRAGMA), uint8(TK_MATERIALIZED), uint8(TK_DEFERRED), uint8(TK_DISTINCT), uint8(TK_IS), uint8(TK_UPDATE), uint8(TK_VALUES), uint8(TK_VIRTUAL), uint8(TK_ALWAYS), uint8(TK_WHEN), uint8(TK_WHERE), uint8(TK_RECURSIVE), uint8(TK_ABORT), uint8(TK_AFTER), uint8(TK_RENAME), uint8(TK_AND), uint8(TK_DROP), uint8(TK_PARTITION), uint8(TK_AUTOINCR), uint8(TK_TO), uint8(TK_IN), uint8(TK_CAST), uint8(TK_COLUMNKW), uint8(TK_COMMIT), uint8(TK_CONFLICT), uint8(TK_JOIN_KW), uint8(TK_CTIME_KW), uint8(TK_CTIME_KW), uint8(TK_CURRENT), uint8(TK_PRECEDING), uint8(TK_FAIL), uint8(TK_LAST), uint8(TK_FILTER), uint8(TK_REPLACE), uint8(TK_FIRST), uint8(TK_FOLLOWING), uint8(TK_FROM), uint8(TK_JOIN_KW), uint8(TK_LIMIT), uint8(TK_IF), uint8(TK_ORDER), uint8(TK_RESTRICT), uint8(TK_OTHERS), uint8(TK_OVER), uint8(TK_RETURNING), uint8(TK_JOIN_KW), uint8(TK_ROLLBACK), uint8(TK_ROWS), uint8(TK_ROW), uint8(TK_UNBOUNDED), uint8(TK_UNION), uint8(TK_USING), uint8(TK_VACUUM), uint8(TK_VIEW), uint8(TK_WINDOW), uint8(TK_DO), uint8(TK_BY), uint8(TK_INITIALLY), uint8(TK_ALL), uint8(TK_PRIMARY), } func keywordCode(tls *libc.TLS, z uintptr, n int32, pType uintptr) int32 { var i int32 var j int32 var zKW uintptr if n >= 2 { i = (int32(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(z)))])*4 ^ int32(Xsqlite3UpperToLower[uint8(*(*int8)(unsafe.Pointer(z + uintptr(n-1))))])*3 ^ n*1) % 127 for i = int32(aKWHash[i]) - 1; i >= 0; i = int32(aKWNext[i]) - 1 { if int32(aKWLen[i]) != n { continue } zKW = uintptr(unsafe.Pointer(&zKWText)) + uintptr(aKWOffset[i]) if int32(*(*int8)(unsafe.Pointer(z)))&libc.CplInt32(0x20) != int32(*(*int8)(unsafe.Pointer(zKW))) { continue } if int32(*(*int8)(unsafe.Pointer(z + 1)))&libc.CplInt32(0x20) != int32(*(*int8)(unsafe.Pointer(zKW + 1))) { continue } j = 2 for j < n && int32(*(*int8)(unsafe.Pointer(z + uintptr(j))))&libc.CplInt32(0x20) == int32(*(*int8)(unsafe.Pointer(zKW + uintptr(j)))) { j++ } if j < n { continue } *(*int32)(unsafe.Pointer(pType)) = int32(aKWCode[i]) break } } return n } func Xsqlite3KeywordCode(tls *libc.TLS, z uintptr, n int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = TK_ID keywordCode(tls, z, n, bp) return *(*int32)(unsafe.Pointer(bp)) } func Xsqlite3_keyword_name(tls *libc.TLS, i int32, pzName uintptr, pnName uintptr) int32 { if i < 0 || i >= SQLITE_N_KEYWORD { return SQLITE_ERROR } *(*uintptr)(unsafe.Pointer(pzName)) = uintptr(unsafe.Pointer(&zKWText)) + uintptr(aKWOffset[i]) *(*int32)(unsafe.Pointer(pnName)) = int32(aKWLen[i]) return SQLITE_OK } func Xsqlite3_keyword_count(tls *libc.TLS) int32 { return SQLITE_N_KEYWORD } func Xsqlite3_keyword_check(tls *libc.TLS, zName uintptr, nName int32) int32 { return libc.Bool32(TK_ID != Xsqlite3KeywordCode(tls, zName, nName)) } // Make the IdChar function accessible from ctime.c and alter.c func Xsqlite3IsIdChar(tls *libc.TLS, c U8) int32 { return libc.Bool32(int32(Xsqlite3CtypeMap[c])&0x46 != 0) } func getToken(tls *libc.TLS, pz uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var z uintptr = *(*uintptr)(unsafe.Pointer(pz)) for __ccgo := true; __ccgo; __ccgo = *(*int32)(unsafe.Pointer(bp)) == TK_SPACE { z += uintptr(Xsqlite3GetToken(tls, z, bp)) } if *(*int32)(unsafe.Pointer(bp)) == TK_ID || *(*int32)(unsafe.Pointer(bp)) == TK_STRING || *(*int32)(unsafe.Pointer(bp)) == TK_JOIN_KW || *(*int32)(unsafe.Pointer(bp)) == TK_WINDOW || *(*int32)(unsafe.Pointer(bp)) == TK_OVER || Xsqlite3ParserFallback(tls, *(*int32)(unsafe.Pointer(bp))) == TK_ID { *(*int32)(unsafe.Pointer(bp)) = TK_ID } *(*uintptr)(unsafe.Pointer(pz)) = z return *(*int32)(unsafe.Pointer(bp)) } func analyzeWindowKeyword(tls *libc.TLS, z uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = z var t int32 t = getToken(tls, bp) if t != TK_ID { return TK_ID } t = getToken(tls, bp) if t != TK_AS { return TK_ID } return TK_WINDOW } func analyzeOverKeyword(tls *libc.TLS, z uintptr, lastToken int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = z if lastToken == TK_RP { var t int32 = getToken(tls, bp) if t == TK_LP || t == TK_ID { return TK_OVER } } return TK_ID } func analyzeFilterKeyword(tls *libc.TLS, z uintptr, lastToken int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = z if lastToken == TK_RP && getToken(tls, bp) == TK_LP { return TK_FILTER } return TK_ID } // Return the length (in bytes) of the token that begins at z[0]. // Store the token type in *tokenType before returning. func Xsqlite3GetToken(tls *libc.TLS, z uintptr, tokenType uintptr) int32 { var i int32 var c int32 switch int32(aiClass[*(*uint8)(unsafe.Pointer(z))]) { case CC_SPACE: { for i = 1; int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x01 != 0; i++ { } *(*int32)(unsafe.Pointer(tokenType)) = TK_SPACE return i } case CC_MINUS: { if int32(*(*uint8)(unsafe.Pointer(z + 1))) == '-' { for i = 2; libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + uintptr(i))))) != 0 && c != '\n'; i++ { } *(*int32)(unsafe.Pointer(tokenType)) = TK_SPACE return i } else if int32(*(*uint8)(unsafe.Pointer(z + 1))) == '>' { *(*int32)(unsafe.Pointer(tokenType)) = TK_PTR return 2 + libc.Bool32(int32(*(*uint8)(unsafe.Pointer(z + 2))) == '>') } *(*int32)(unsafe.Pointer(tokenType)) = TK_MINUS return 1 } case CC_LP: { *(*int32)(unsafe.Pointer(tokenType)) = TK_LP return 1 } case CC_RP: { *(*int32)(unsafe.Pointer(tokenType)) = TK_RP return 1 } case CC_SEMI: { *(*int32)(unsafe.Pointer(tokenType)) = TK_SEMI return 1 } case CC_PLUS: { *(*int32)(unsafe.Pointer(tokenType)) = TK_PLUS return 1 } case CC_STAR: { *(*int32)(unsafe.Pointer(tokenType)) = TK_STAR return 1 } case CC_SLASH: { if int32(*(*uint8)(unsafe.Pointer(z + 1))) != '*' || int32(*(*uint8)(unsafe.Pointer(z + 2))) == 0 { *(*int32)(unsafe.Pointer(tokenType)) = TK_SLASH return 1 } i = 3 c = int32(*(*uint8)(unsafe.Pointer(z + 2))) for ; (c != '*' || int32(*(*uint8)(unsafe.Pointer(z + uintptr(i)))) != '/') && libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + uintptr(i))))) != 0; i++ { } if c != 0 { i++ } *(*int32)(unsafe.Pointer(tokenType)) = TK_SPACE return i } case CC_PERCENT: { *(*int32)(unsafe.Pointer(tokenType)) = TK_REM return 1 } case CC_EQ: { *(*int32)(unsafe.Pointer(tokenType)) = TK_EQ return 1 + libc.Bool32(int32(*(*uint8)(unsafe.Pointer(z + 1))) == '=') } case CC_LT: { if libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + 1)))) == '=' { *(*int32)(unsafe.Pointer(tokenType)) = TK_LE return 2 } else if c == '>' { *(*int32)(unsafe.Pointer(tokenType)) = TK_NE return 2 } else if c == '<' { *(*int32)(unsafe.Pointer(tokenType)) = TK_LSHIFT return 2 } else { *(*int32)(unsafe.Pointer(tokenType)) = TK_LT return 1 } } fallthrough case CC_GT: { if libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + 1)))) == '=' { *(*int32)(unsafe.Pointer(tokenType)) = TK_GE return 2 } else if c == '>' { *(*int32)(unsafe.Pointer(tokenType)) = TK_RSHIFT return 2 } else { *(*int32)(unsafe.Pointer(tokenType)) = TK_GT return 1 } } fallthrough case CC_BANG: { if int32(*(*uint8)(unsafe.Pointer(z + 1))) != '=' { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL return 1 } else { *(*int32)(unsafe.Pointer(tokenType)) = TK_NE return 2 } } fallthrough case CC_PIPE: { if int32(*(*uint8)(unsafe.Pointer(z + 1))) != '|' { *(*int32)(unsafe.Pointer(tokenType)) = TK_BITOR return 1 } else { *(*int32)(unsafe.Pointer(tokenType)) = TK_CONCAT return 2 } } fallthrough case CC_COMMA: { *(*int32)(unsafe.Pointer(tokenType)) = TK_COMMA return 1 } case CC_AND: { *(*int32)(unsafe.Pointer(tokenType)) = TK_BITAND return 1 } case CC_TILDA: { *(*int32)(unsafe.Pointer(tokenType)) = TK_BITNOT return 1 } case CC_QUOTE: { var delim int32 = int32(*(*uint8)(unsafe.Pointer(z))) for i = 1; libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + uintptr(i))))) != 0; i++ { if c == delim { if int32(*(*uint8)(unsafe.Pointer(z + uintptr(i+1)))) == delim { i++ } else { break } } } if c == '\'' { *(*int32)(unsafe.Pointer(tokenType)) = TK_STRING return i + 1 } else if c != 0 { *(*int32)(unsafe.Pointer(tokenType)) = TK_ID return i + 1 } else { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL return i } } fallthrough case CC_DOT: { if !(int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + 1))])&0x04 != 0) { *(*int32)(unsafe.Pointer(tokenType)) = TK_DOT return 1 } } fallthrough case CC_DIGIT: { *(*int32)(unsafe.Pointer(tokenType)) = TK_INTEGER if int32(*(*uint8)(unsafe.Pointer(z))) == '0' && (int32(*(*uint8)(unsafe.Pointer(z + 1))) == 'x' || int32(*(*uint8)(unsafe.Pointer(z + 1))) == 'X') && int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + 2))])&0x08 != 0 { for i = 3; int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x08 != 0; i++ { } return i } for i = 0; int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x04 != 0; i++ { } if int32(*(*uint8)(unsafe.Pointer(z + uintptr(i)))) == '.' { i++ for int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x04 != 0 { i++ } *(*int32)(unsafe.Pointer(tokenType)) = TK_FLOAT } if (int32(*(*uint8)(unsafe.Pointer(z + uintptr(i)))) == 'e' || int32(*(*uint8)(unsafe.Pointer(z + uintptr(i)))) == 'E') && (int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i+1)))])&0x04 != 0 || (int32(*(*uint8)(unsafe.Pointer(z + uintptr(i+1)))) == '+' || int32(*(*uint8)(unsafe.Pointer(z + uintptr(i+1)))) == '-') && int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i+2)))])&0x04 != 0) { i = i + 2 for int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x04 != 0 { i++ } *(*int32)(unsafe.Pointer(tokenType)) = TK_FLOAT } for int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x46 != 0 { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL i++ } return i } case CC_QUOTE2: { i = 1 c = int32(*(*uint8)(unsafe.Pointer(z))) for ; c != ']' && libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + uintptr(i))))) != 0; i++ { } *(*int32)(unsafe.Pointer(tokenType)) = func() int32 { if c == ']' { return TK_ID } return TK_ILLEGAL }() return i } case CC_VARNUM: { *(*int32)(unsafe.Pointer(tokenType)) = TK_VARIABLE for i = 1; int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x04 != 0; i++ { } return i } case CC_DOLLAR: fallthrough case CC_VARALPHA: { var n int32 = 0 *(*int32)(unsafe.Pointer(tokenType)) = TK_VARIABLE for i = 1; libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + uintptr(i))))) != 0; i++ { if int32(Xsqlite3CtypeMap[uint8(c)])&0x46 != 0 { n++ } else if c == '(' && n > 0 { for __ccgo := true; __ccgo; __ccgo = libc.AssignInt32(&c, int32(*(*uint8)(unsafe.Pointer(z + uintptr(i))))) != 0 && !(int32(Xsqlite3CtypeMap[uint8(c)])&0x01 != 0) && c != ')' { i++ } if c == ')' { i++ } else { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL } break } else if c == ':' && int32(*(*uint8)(unsafe.Pointer(z + uintptr(i+1)))) == ':' { i++ } else { break } } if n == 0 { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL } return i } case CC_KYWD0: { for i = 1; int32(aiClass[*(*uint8)(unsafe.Pointer(z + uintptr(i)))]) <= CC_KYWD; i++ { } if int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x46 != 0 { i++ break } *(*int32)(unsafe.Pointer(tokenType)) = TK_ID return keywordCode(tls, z, i, tokenType) } case CC_X: { if int32(*(*uint8)(unsafe.Pointer(z + 1))) == '\'' { *(*int32)(unsafe.Pointer(tokenType)) = TK_BLOB for i = 2; int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x08 != 0; i++ { } if int32(*(*uint8)(unsafe.Pointer(z + uintptr(i)))) != '\'' || i%2 != 0 { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL for *(*uint8)(unsafe.Pointer(z + uintptr(i))) != 0 && int32(*(*uint8)(unsafe.Pointer(z + uintptr(i)))) != '\'' { i++ } } if *(*uint8)(unsafe.Pointer(z + uintptr(i))) != 0 { i++ } return i } } fallthrough case CC_KYWD: fallthrough case CC_ID: { i = 1 break } case CC_BOM: { if int32(*(*uint8)(unsafe.Pointer(z + 1))) == 0xbb && int32(*(*uint8)(unsafe.Pointer(z + 2))) == 0xbf { *(*int32)(unsafe.Pointer(tokenType)) = TK_SPACE return 3 } i = 1 break } case CC_NUL: { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL return 0 } default: { *(*int32)(unsafe.Pointer(tokenType)) = TK_ILLEGAL return 1 } } for int32(Xsqlite3CtypeMap[*(*uint8)(unsafe.Pointer(z + uintptr(i)))])&0x46 != 0 { i++ } *(*int32)(unsafe.Pointer(tokenType)) = TK_ID return i } // Run the parser on the given SQL string. func Xsqlite3RunParser(tls *libc.TLS, pParse uintptr, zSql uintptr) int32 { bp := tls.Alloc(2480) defer tls.Free(2480) var nErr int32 = 0 var pEngine uintptr var n int32 = 0 var lastTokenParsed int32 = -1 var db uintptr = (*Parse)(unsafe.Pointer(pParse)).Fdb var mxSqlLen int32 var pParentParse uintptr = uintptr(0) mxSqlLen = *(*int32)(unsafe.Pointer(db + 136 + 1*4)) if (*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive == 0 { libc.AtomicStoreNInt32(db+432, int32(0), 0) } (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_OK (*Parse)(unsafe.Pointer(pParse)).FzTail = zSql pEngine = bp + 32 Xsqlite3ParserInit(tls, pEngine, pParse) pParentParse = (*Sqlite3)(unsafe.Pointer(db)).FpParse (*Sqlite3)(unsafe.Pointer(db)).FpParse = pParse for 1 != 0 { n = Xsqlite3GetToken(tls, zSql, bp+2456) mxSqlLen = mxSqlLen - n if mxSqlLen < 0 { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_TOOBIG (*Parse)(unsafe.Pointer(pParse)).FnErr++ break } if *(*int32)(unsafe.Pointer(bp + 2456)) >= TK_WINDOW { if libc.AtomicLoadNInt32(db+432, 0) != 0 { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_INTERRUPT (*Parse)(unsafe.Pointer(pParse)).FnErr++ break } if *(*int32)(unsafe.Pointer(bp + 2456)) == TK_SPACE { zSql += uintptr(n) continue } if int32(*(*int8)(unsafe.Pointer(zSql))) == 0 { if lastTokenParsed == TK_SEMI { *(*int32)(unsafe.Pointer(bp + 2456)) = 0 } else if lastTokenParsed == 0 { break } else { *(*int32)(unsafe.Pointer(bp + 2456)) = TK_SEMI } n = 0 } else if *(*int32)(unsafe.Pointer(bp + 2456)) == TK_WINDOW { *(*int32)(unsafe.Pointer(bp + 2456)) = analyzeWindowKeyword(tls, zSql+6) } else if *(*int32)(unsafe.Pointer(bp + 2456)) == TK_OVER { *(*int32)(unsafe.Pointer(bp + 2456)) = analyzeOverKeyword(tls, zSql+4, lastTokenParsed) } else if *(*int32)(unsafe.Pointer(bp + 2456)) == TK_FILTER { *(*int32)(unsafe.Pointer(bp + 2456)) = analyzeFilterKeyword(tls, zSql+6, lastTokenParsed) } else { (*Token)(unsafe.Pointer(bp + 2464)).Fz = zSql (*Token)(unsafe.Pointer(bp + 2464)).Fn = uint32(n) Xsqlite3ErrorMsg(tls, pParse, ts+24725, libc.VaList(bp, bp+2464)) break } } (*Parse)(unsafe.Pointer(pParse)).FsLastToken.Fz = zSql (*Parse)(unsafe.Pointer(pParse)).FsLastToken.Fn = uint32(n) Xsqlite3Parser(tls, pEngine, *(*int32)(unsafe.Pointer(bp + 2456)), (*Parse)(unsafe.Pointer(pParse)).FsLastToken) lastTokenParsed = *(*int32)(unsafe.Pointer(bp + 2456)) zSql += uintptr(n) if (*Parse)(unsafe.Pointer(pParse)).Frc != SQLITE_OK { break } } Xsqlite3ParserFinalize(tls, pEngine) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { (*Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } if (*Parse)(unsafe.Pointer(pParse)).FzErrMsg != 0 || (*Parse)(unsafe.Pointer(pParse)).Frc != SQLITE_OK && (*Parse)(unsafe.Pointer(pParse)).Frc != SQLITE_DONE { if (*Parse)(unsafe.Pointer(pParse)).FzErrMsg == uintptr(0) { (*Parse)(unsafe.Pointer(pParse)).FzErrMsg = Xsqlite3MPrintf(tls, db, ts+4493, libc.VaList(bp+8, Xsqlite3ErrStr(tls, (*Parse)(unsafe.Pointer(pParse)).Frc))) } Xsqlite3_log(tls, (*Parse)(unsafe.Pointer(pParse)).Frc, ts+24750, libc.VaList(bp+16, (*Parse)(unsafe.Pointer(pParse)).FzErrMsg, (*Parse)(unsafe.Pointer(pParse)).FzTail)) nErr++ } (*Parse)(unsafe.Pointer(pParse)).FzTail = zSql Xsqlite3_free(tls, (*Parse)(unsafe.Pointer(pParse)).FapVtabLock) if (*Parse)(unsafe.Pointer(pParse)).FpNewTable != 0 && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) != PARSE_MODE_NORMAL) { Xsqlite3DeleteTable(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpNewTable) } if (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger != 0 && !(int32((*Parse)(unsafe.Pointer(pParse)).FeParseMode) >= PARSE_MODE_RENAME) { Xsqlite3DeleteTrigger(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpNewTrigger) } if (*Parse)(unsafe.Pointer(pParse)).FpVList != 0 { Xsqlite3DbNNFreeNN(tls, db, (*Parse)(unsafe.Pointer(pParse)).FpVList) } (*Sqlite3)(unsafe.Pointer(db)).FpParse = pParentParse return nErr } // Return TRUE if the given SQL string ends in a semicolon. // // Special handling is require for CREATE TRIGGER statements. // Whenever the CREATE TRIGGER keywords are seen, the statement // must end with ";END;". // // This implementation uses a state machine with 8 states: // // (0) INVALID We have not yet seen a non-whitespace character. // // (1) START At the beginning or end of an SQL statement. This routine // returns 1 if it ends in the START state and 0 if it ends // in any other state. // // (2) NORMAL We are in the middle of statement which ends with a single // semicolon. // // (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of // a statement. // // (4) CREATE The keyword CREATE has been seen at the beginning of a // statement, possibly preceded by EXPLAIN and/or followed by // TEMP or TEMPORARY // // (5) TRIGGER We are in the middle of a trigger definition that must be // ended by a semicolon, the keyword END, and another semicolon. // // (6) SEMI We've seen the first semicolon in the ";END;" that occurs at // the end of a trigger definition. // // (7) END We've seen the ";END" of the ";END;" that occurs at the end // of a trigger definition. // // Transitions between states above are determined by tokens extracted // from the input. The following tokens are significant: // // (0) tkSEMI A semicolon. // (1) tkWS Whitespace. // (2) tkOTHER Any other SQL token. // (3) tkEXPLAIN The "explain" keyword. // (4) tkCREATE The "create" keyword. // (5) tkTEMP The "temp" or "temporary" keyword. // (6) tkTRIGGER The "trigger" keyword. // (7) tkEND The "end" keyword. // // Whitespace never causes a state transition and is always ignored. // This means that a SQL string of all whitespace is invalid. // // If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed // to recognize the end of a trigger can be omitted. All we have to do // is look for a semicolon that is not part of an string or comment. func Xsqlite3_complete(tls *libc.TLS, zSql uintptr) int32 { var state U8 = U8(0) var token U8 for *(*int8)(unsafe.Pointer(zSql)) != 0 { switch int32(*(*int8)(unsafe.Pointer(zSql))) { case ';': { token = U8(TkSEMI) break } case ' ': fallthrough case '\r': fallthrough case '\t': fallthrough case '\n': fallthrough case '\f': { token = U8(TkWS) break } case '/': { if int32(*(*int8)(unsafe.Pointer(zSql + 1))) != '*' { token = U8(TkOTHER) break } zSql += uintptr(2) for *(*int8)(unsafe.Pointer(zSql)) != 0 && (int32(*(*int8)(unsafe.Pointer(zSql))) != '*' || int32(*(*int8)(unsafe.Pointer(zSql + 1))) != '/') { zSql++ } if int32(*(*int8)(unsafe.Pointer(zSql))) == 0 { return 0 } zSql++ token = U8(TkWS) break } case '-': { if int32(*(*int8)(unsafe.Pointer(zSql + 1))) != '-' { token = U8(TkOTHER) break } for *(*int8)(unsafe.Pointer(zSql)) != 0 && int32(*(*int8)(unsafe.Pointer(zSql))) != '\n' { zSql++ } if int32(*(*int8)(unsafe.Pointer(zSql))) == 0 { return libc.Bool32(int32(state) == 1) } token = U8(TkWS) break } case '[': { zSql++ for *(*int8)(unsafe.Pointer(zSql)) != 0 && int32(*(*int8)(unsafe.Pointer(zSql))) != ']' { zSql++ } if int32(*(*int8)(unsafe.Pointer(zSql))) == 0 { return 0 } token = U8(TkOTHER) break } case '`': fallthrough case '"': fallthrough case '\'': { var c int32 = int32(*(*int8)(unsafe.Pointer(zSql))) zSql++ for *(*int8)(unsafe.Pointer(zSql)) != 0 && int32(*(*int8)(unsafe.Pointer(zSql))) != c { zSql++ } if int32(*(*int8)(unsafe.Pointer(zSql))) == 0 { return 0 } token = U8(TkOTHER) break } default: { if int32(Xsqlite3CtypeMap[U8(*(*int8)(unsafe.Pointer(zSql)))])&0x46 != 0 { var nId int32 for nId = 1; int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zSql + uintptr(nId))))])&0x46 != 0; nId++ { } switch int32(*(*int8)(unsafe.Pointer(zSql))) { case 'c': fallthrough case 'C': { if nId == 6 && Xsqlite3_strnicmp(tls, zSql, ts+24761, 6) == 0 { token = U8(TkCREATE) } else { token = U8(TkOTHER) } break } fallthrough case 't': fallthrough case 'T': { if nId == 7 && Xsqlite3_strnicmp(tls, zSql, ts+21347, 7) == 0 { token = U8(TkTRIGGER) } else if nId == 4 && Xsqlite3_strnicmp(tls, zSql, ts+24768, 4) == 0 { token = U8(TkTEMP) } else if nId == 9 && Xsqlite3_strnicmp(tls, zSql, ts+24773, 9) == 0 { token = U8(TkTEMP) } else { token = U8(TkOTHER) } break } fallthrough case 'e': fallthrough case 'E': { if nId == 3 && Xsqlite3_strnicmp(tls, zSql, ts+24783, 3) == 0 { token = U8(TkEND) } else if nId == 7 && Xsqlite3_strnicmp(tls, zSql, ts+24787, 7) == 0 { token = U8(TkEXPLAIN) } else { token = U8(TkOTHER) } break } fallthrough default: { token = U8(TkOTHER) break } } zSql += uintptr(nId - 1) } else { token = U8(TkOTHER) } break } } state = *(*U8)(unsafe.Pointer(uintptr(unsafe.Pointer(&trans)) + uintptr(state)*8 + uintptr(token))) zSql++ } return libc.Bool32(int32(state) == 1) } var trans = [8][8]U8{ {U8(1), U8(0), U8(2), U8(3), U8(4), U8(2), U8(2), U8(2)}, {U8(1), U8(1), U8(2), U8(3), U8(4), U8(2), U8(2), U8(2)}, {U8(1), U8(2), U8(2), U8(2), U8(2), U8(2), U8(2), U8(2)}, {U8(1), U8(3), U8(3), U8(2), U8(4), U8(2), U8(2), U8(2)}, {U8(1), U8(4), U8(2), U8(2), U8(2), U8(4), U8(5), U8(2)}, {U8(6), U8(5), U8(5), U8(5), U8(5), U8(5), U8(5), U8(5)}, {U8(6), U8(6), U8(5), U8(5), U8(5), U8(5), U8(5), U8(7)}, {U8(1), U8(7), U8(5), U8(5), U8(5), U8(5), U8(5), U8(5)}, } // This routine is the same as the sqlite3_complete() routine described // above, except that the parameter is required to be UTF-16 encoded, not // UTF-8. func Xsqlite3_complete16(tls *libc.TLS, zSql uintptr) int32 { var pVal uintptr var zSql8 uintptr var rc int32 rc = Xsqlite3_initialize(tls) if rc != 0 { return rc } pVal = Xsqlite3ValueNew(tls, uintptr(0)) Xsqlite3ValueSetStr(tls, pVal, -1, zSql, uint8(SQLITE_UTF16LE), uintptr(0)) zSql8 = Xsqlite3ValueText(tls, pVal, uint8(SQLITE_UTF8)) if zSql8 != 0 { rc = Xsqlite3_complete(tls, zSql8) } else { rc = SQLITE_NOMEM } Xsqlite3ValueFree(tls, pVal) return rc & 0xff } func sqlite3TestExtInit(tls *libc.TLS, db uintptr) int32 { _ = db return Xsqlite3FaultSim(tls, 500) } var sqlite3BuiltinExtensions = [4]uintptr{ 0, 0, 0, 0, } // IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns // a pointer to the to the sqlite3_version[] string constant. func Xsqlite3_libversion(tls *libc.TLS) uintptr { return uintptr(unsafe.Pointer(&Xsqlite3_version)) } // IMPLEMENTATION-OF: R-35210-63508 The sqlite3_libversion_number() function // returns an integer equal to SQLITE_VERSION_NUMBER. func Xsqlite3_libversion_number(tls *libc.TLS) int32 { return SQLITE_VERSION_NUMBER } // IMPLEMENTATION-OF: R-20790-14025 The sqlite3_threadsafe() function returns // zero if and only if SQLite was compiled with mutexing code omitted due to // the SQLITE_THREADSAFE compile-time option being set to 0. func Xsqlite3_threadsafe(tls *libc.TLS) int32 { return SQLITE_THREADSAFE } // If the following global variable points to a string which is the // name of a directory, then that directory will be used to store // temporary files. // // See also the "PRAGMA temp_store_directory" SQL command. var Xsqlite3_temp_directory uintptr = uintptr(0) // If the following global variable points to a string which is the // name of a directory, then that directory will be used to store // all database files specified with a relative pathname. // // See also the "PRAGMA data_store_directory" SQL command. var Xsqlite3_data_directory uintptr = uintptr(0) var mu mutex func init() { mu.recursive = true } func Xsqlite3_initialize(tls *libc.TLS) int32 { mu.enter(tls.ID) defer mu.leave(tls.ID) var pMainMtx uintptr var rc int32 if Xsqlite3Config.FisInit != 0 { return SQLITE_OK } rc = Xsqlite3MutexInit(tls) if rc != 0 { return rc } pMainMtx = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN) Xsqlite3_mutex_enter(tls, pMainMtx) Xsqlite3Config.FisMutexInit = 1 if !(Xsqlite3Config.FisMallocInit != 0) { rc = Xsqlite3MallocInit(tls) } if rc == SQLITE_OK { Xsqlite3Config.FisMallocInit = 1 if !(int32(Xsqlite3Config.FpInitMutex) != 0) { Xsqlite3Config.FpInitMutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_RECURSIVE) if Xsqlite3Config.FbCoreMutex != 0 && !(int32(Xsqlite3Config.FpInitMutex) != 0) { rc = SQLITE_NOMEM } } } if rc == SQLITE_OK { Xsqlite3Config.FnRefInitMutex++ } Xsqlite3_mutex_leave(tls, pMainMtx) if rc != SQLITE_OK { return rc } Xsqlite3_mutex_enter(tls, Xsqlite3Config.FpInitMutex) if Xsqlite3Config.FisInit == 0 && Xsqlite3Config.FinProgress == 0 { Xsqlite3Config.FinProgress = 1 libc.Xmemset(tls, uintptr(unsafe.Pointer(&Xsqlite3BuiltinFunctions)), 0, uint64(unsafe.Sizeof(Xsqlite3BuiltinFunctions))) Xsqlite3RegisterBuiltinFunctions(tls) if Xsqlite3Config.FisPCacheInit == 0 { rc = Xsqlite3PcacheInitialize(tls) } if rc == SQLITE_OK { Xsqlite3Config.FisPCacheInit = 1 rc = Xsqlite3OsInit(tls) } if rc == SQLITE_OK { rc = Xsqlite3MemdbInit(tls) } if rc == SQLITE_OK { Xsqlite3PCacheBufferSetup(tls, Xsqlite3Config.FpPage, Xsqlite3Config.FszPage, Xsqlite3Config.FnPage) Xsqlite3Config.FisInit = 1 } Xsqlite3Config.FinProgress = 0 } Xsqlite3_mutex_leave(tls, Xsqlite3Config.FpInitMutex) Xsqlite3_mutex_enter(tls, pMainMtx) Xsqlite3Config.FnRefInitMutex-- if Xsqlite3Config.FnRefInitMutex <= 0 { Xsqlite3_mutex_free(tls, Xsqlite3Config.FpInitMutex) Xsqlite3Config.FpInitMutex = uintptr(0) } Xsqlite3_mutex_leave(tls, pMainMtx) return rc } // Undo the effects of sqlite3_initialize(). Must not be called while // there are outstanding database connections or memory allocations or // while any part of SQLite is otherwise in use in any thread. This // routine is not threadsafe. But it is safe to invoke this routine // on when SQLite is already shut down. If SQLite is already shut down // when this routine is invoked, then this routine is a harmless no-op. func Xsqlite3_shutdown(tls *libc.TLS) int32 { if Xsqlite3Config.FisInit != 0 { Xsqlite3_os_end(tls) Xsqlite3_reset_auto_extension(tls) Xsqlite3Config.FisInit = 0 } if Xsqlite3Config.FisPCacheInit != 0 { Xsqlite3PcacheShutdown(tls) Xsqlite3Config.FisPCacheInit = 0 } if Xsqlite3Config.FisMallocInit != 0 { Xsqlite3MallocEnd(tls) Xsqlite3Config.FisMallocInit = 0 Xsqlite3_data_directory = uintptr(0) Xsqlite3_temp_directory = uintptr(0) } if Xsqlite3Config.FisMutexInit != 0 { Xsqlite3MutexEnd(tls) Xsqlite3Config.FisMutexInit = 0 } return SQLITE_OK } // This API allows applications to modify the global configuration of // the SQLite library at run-time. // // This routine should only be called when there are no outstanding // database connections or memory allocations. This routine is not // threadsafe. Failure to heed these warnings can lead to unpredictable // behavior. func Xsqlite3_config(tls *libc.TLS, op int32, va uintptr) int32 { var ap Va_list _ = ap var rc int32 = SQLITE_OK if Xsqlite3Config.FisInit != 0 { return Xsqlite3MisuseError(tls, 174426) } ap = va switch op { case SQLITE_CONFIG_SINGLETHREAD: { Xsqlite3Config.FbCoreMutex = U8(0) Xsqlite3Config.FbFullMutex = U8(0) break } case SQLITE_CONFIG_MULTITHREAD: { Xsqlite3Config.FbCoreMutex = U8(1) Xsqlite3Config.FbFullMutex = U8(0) break } case SQLITE_CONFIG_SERIALIZED: { Xsqlite3Config.FbCoreMutex = U8(1) Xsqlite3Config.FbFullMutex = U8(1) break } case SQLITE_CONFIG_MUTEX: { Xsqlite3Config.Fmutex = *(*Sqlite3_mutex_methods)(unsafe.Pointer(libc.VaUintptr(&ap))) break } case SQLITE_CONFIG_GETMUTEX: { *(*Sqlite3_mutex_methods)(unsafe.Pointer(libc.VaUintptr(&ap))) = Xsqlite3Config.Fmutex break } case SQLITE_CONFIG_MALLOC: { Xsqlite3Config.Fm = *(*Sqlite3_mem_methods)(unsafe.Pointer(libc.VaUintptr(&ap))) break } case SQLITE_CONFIG_GETMALLOC: { if Xsqlite3Config.Fm.FxMalloc == uintptr(0) { Xsqlite3MemSetDefault(tls) } *(*Sqlite3_mem_methods)(unsafe.Pointer(libc.VaUintptr(&ap))) = Xsqlite3Config.Fm break } case SQLITE_CONFIG_MEMSTATUS: { Xsqlite3Config.FbMemstat = libc.VaInt32(&ap) break } case SQLITE_CONFIG_SMALL_MALLOC: { Xsqlite3Config.FbSmallMalloc = U8(libc.VaInt32(&ap)) break } case SQLITE_CONFIG_PAGECACHE: { Xsqlite3Config.FpPage = libc.VaUintptr(&ap) Xsqlite3Config.FszPage = libc.VaInt32(&ap) Xsqlite3Config.FnPage = libc.VaInt32(&ap) break } case SQLITE_CONFIG_PCACHE_HDRSZ: { *(*int32)(unsafe.Pointer(libc.VaUintptr(&ap))) = Xsqlite3HeaderSizeBtree(tls) + Xsqlite3HeaderSizePcache(tls) + Xsqlite3HeaderSizePcache1(tls) break } case SQLITE_CONFIG_PCACHE: { break } case SQLITE_CONFIG_GETPCACHE: { rc = SQLITE_ERROR break } case SQLITE_CONFIG_PCACHE2: { Xsqlite3Config.Fpcache2 = *(*Sqlite3_pcache_methods2)(unsafe.Pointer(libc.VaUintptr(&ap))) break } case SQLITE_CONFIG_GETPCACHE2: { if Xsqlite3Config.Fpcache2.FxInit == uintptr(0) { Xsqlite3PCacheSetDefault(tls) } *(*Sqlite3_pcache_methods2)(unsafe.Pointer(libc.VaUintptr(&ap))) = Xsqlite3Config.Fpcache2 break } case SQLITE_CONFIG_LOOKASIDE: { Xsqlite3Config.FszLookaside = libc.VaInt32(&ap) Xsqlite3Config.FnLookaside = libc.VaInt32(&ap) break } case SQLITE_CONFIG_LOG: { Xsqlite3Config.FxLog = libc.VaUintptr(&ap) Xsqlite3Config.FpLogArg = libc.VaUintptr(&ap) break } case SQLITE_CONFIG_URI: { Xsqlite3Config.FbOpenUri = U8(libc.VaInt32(&ap)) break } case SQLITE_CONFIG_COVERING_INDEX_SCAN: { Xsqlite3Config.FbUseCis = U8(libc.VaInt32(&ap)) break } case SQLITE_CONFIG_MMAP_SIZE: { var szMmap Sqlite3_int64 = libc.VaInt64(&ap) var mxMmap Sqlite3_int64 = libc.VaInt64(&ap) if mxMmap < int64(0) || mxMmap > int64(SQLITE_MAX_MMAP_SIZE) { mxMmap = int64(SQLITE_MAX_MMAP_SIZE) } if szMmap < int64(0) { szMmap = int64(SQLITE_DEFAULT_MMAP_SIZE) } if szMmap > mxMmap { szMmap = mxMmap } Xsqlite3Config.FmxMmap = mxMmap Xsqlite3Config.FszMmap = szMmap break } case SQLITE_CONFIG_PMASZ: { Xsqlite3Config.FszPma = libc.VaUint32(&ap) break } case SQLITE_CONFIG_STMTJRNL_SPILL: { Xsqlite3Config.FnStmtSpill = libc.VaInt32(&ap) break } case SQLITE_CONFIG_MEMDB_MAXSIZE: { Xsqlite3Config.FmxMemdbSize = libc.VaInt64(&ap) break } default: { rc = SQLITE_ERROR break } } _ = ap return rc } func setupLookaside(tls *libc.TLS, db uintptr, pBuf uintptr, sz int32, cnt int32) int32 { var pStart uintptr var szAlloc Sqlite3_int64 = Sqlite3_int64(sz) * Sqlite3_int64(cnt) var nBig int32 var nSm int32 if Xsqlite3LookasideUsed(tls, db, uintptr(0)) > 0 { return SQLITE_BUSY } if (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbMalloced != 0 { Xsqlite3_free(tls, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart) } sz = sz & libc.CplInt32(7) if sz <= int32(unsafe.Sizeof(uintptr(0))) { sz = 0 } if cnt < 0 { cnt = 0 } if sz == 0 || cnt == 0 { sz = 0 pStart = uintptr(0) } else if pBuf == uintptr(0) { Xsqlite3BeginBenignMalloc(tls) pStart = Xsqlite3Malloc(tls, uint64(szAlloc)) Xsqlite3EndBenignMalloc(tls) if pStart != 0 { szAlloc = Sqlite3_int64(Xsqlite3MallocSize(tls, pStart)) } } else { pStart = pBuf } if sz >= LOOKASIDE_SMALL*3 { nBig = int32(szAlloc / Sqlite3_int64(3*LOOKASIDE_SMALL+sz)) nSm = int32((szAlloc - Sqlite3_int64(sz*nBig)) / int64(LOOKASIDE_SMALL)) } else if sz >= LOOKASIDE_SMALL*2 { nBig = int32(szAlloc / Sqlite3_int64(LOOKASIDE_SMALL+sz)) nSm = int32((szAlloc - Sqlite3_int64(sz*nBig)) / int64(LOOKASIDE_SMALL)) } else if sz > 0 { nBig = int32(szAlloc / Sqlite3_int64(sz)) nSm = 0 } else { nBig = libc.AssignInt32(&nSm, 0) } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart = pStart (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpFree = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(sz) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FszTrue = U16(sz) if pStart != 0 { var i int32 var p uintptr p = pStart for i = 0; i < nBig; i++ { (*LookasideSlot)(unsafe.Pointer(p)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpInit = p p = p + uintptr(sz) } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpMiddle = p for i = 0; i < nSm; i++ { (*LookasideSlot)(unsafe.Pointer(p)).FpNext = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit = p p = p + 128 } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = p (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable = U32(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbMalloced = func() uint8 { if pBuf == uintptr(0) { return uint8(1) } return uint8(0) }() (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FnSlot = U32(nBig + nSm) } else { (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallInit = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpSmallFree = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpMiddle = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable = U32(1) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbMalloced = U8(0) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FnSlot = U32(0) } (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpTrueEnd = (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpEnd return SQLITE_OK } // Return the mutex associated with a database connection. func Xsqlite3_db_mutex(tls *libc.TLS, db uintptr) uintptr { return (*Sqlite3)(unsafe.Pointer(db)).Fmutex } // Free up as much memory as we can from the given database // connection. func Xsqlite3_db_release_memory(tls *libc.TLS, db uintptr) int32 { var i int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) Xsqlite3BtreeEnterAll(tls, db) for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 { var pPager uintptr = Xsqlite3BtreePager(tls, pBt) Xsqlite3PagerShrink(tls, pPager) } } Xsqlite3BtreeLeaveAll(tls, db) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } // Flush any dirty pages in the pager-cache for any attached database // to disk. func Xsqlite3_db_cacheflush(tls *libc.TLS, db uintptr) int32 { var i int32 var rc int32 = SQLITE_OK var bSeenBusy int32 = 0 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) Xsqlite3BtreeEnterAll(tls, db) for i = 0; rc == SQLITE_OK && i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if pBt != 0 && Xsqlite3BtreeTxnState(tls, pBt) == SQLITE_TXN_WRITE { var pPager uintptr = Xsqlite3BtreePager(tls, pBt) rc = Xsqlite3PagerFlush(tls, pPager) if rc == SQLITE_BUSY { bSeenBusy = 1 rc = SQLITE_OK } } } Xsqlite3BtreeLeaveAll(tls, db) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return func() int32 { if rc == SQLITE_OK && bSeenBusy != 0 { return SQLITE_BUSY } return rc }() } // Configuration settings for an individual database connection func Xsqlite3_db_config(tls *libc.TLS, db uintptr, op int32, va uintptr) int32 { var ap Va_list _ = ap var rc int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) ap = va switch op { case SQLITE_DBCONFIG_MAINDBNAME: { (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FzDbSName = libc.VaUintptr(&ap) rc = SQLITE_OK break } case SQLITE_DBCONFIG_LOOKASIDE: { var pBuf uintptr = libc.VaUintptr(&ap) var sz int32 = libc.VaInt32(&ap) var cnt int32 = libc.VaInt32(&ap) rc = setupLookaside(tls, db, pBuf, sz, cnt) break } default: { var i uint32 rc = SQLITE_ERROR for i = uint32(0); i < uint32(int32(uint64(unsafe.Sizeof(aFlagOp))/uint64(unsafe.Sizeof(struct { Fop int32 Fmask U32 }{})))); i++ { if aFlagOp[i].Fop == op { var onoff int32 = libc.VaInt32(&ap) var pRes uintptr = libc.VaUintptr(&ap) var oldFlags U64 = (*Sqlite3)(unsafe.Pointer(db)).Fflags if onoff > 0 { *(*U64)(unsafe.Pointer(db + 48)) |= U64(aFlagOp[i].Fmask) } else if onoff == 0 { *(*U64)(unsafe.Pointer(db + 48)) &= ^U64(aFlagOp[i].Fmask) } if oldFlags != (*Sqlite3)(unsafe.Pointer(db)).Fflags { Xsqlite3ExpirePreparedStatements(tls, db, 0) } if pRes != 0 { *(*int32)(unsafe.Pointer(pRes)) = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).Fflags&U64(aFlagOp[i].Fmask) != uint64(0)) } rc = SQLITE_OK break } } break } } _ = ap Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } var aFlagOp = [16]struct { Fop int32 Fmask U32 }{ {Fop: SQLITE_DBCONFIG_ENABLE_FKEY, Fmask: U32(SQLITE_ForeignKeys)}, {Fop: SQLITE_DBCONFIG_ENABLE_TRIGGER, Fmask: U32(SQLITE_EnableTrigger)}, {Fop: SQLITE_DBCONFIG_ENABLE_VIEW, Fmask: SQLITE_EnableView}, {Fop: SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, Fmask: U32(SQLITE_Fts3Tokenizer)}, {Fop: SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, Fmask: U32(SQLITE_LoadExtension)}, {Fop: SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, Fmask: U32(SQLITE_NoCkptOnClose)}, {Fop: SQLITE_DBCONFIG_ENABLE_QPSG, Fmask: U32(SQLITE_EnableQPSG)}, {Fop: SQLITE_DBCONFIG_TRIGGER_EQP, Fmask: U32(SQLITE_TriggerEQP)}, {Fop: SQLITE_DBCONFIG_RESET_DATABASE, Fmask: U32(SQLITE_ResetDatabase)}, {Fop: SQLITE_DBCONFIG_DEFENSIVE, Fmask: U32(SQLITE_Defensive)}, {Fop: SQLITE_DBCONFIG_WRITABLE_SCHEMA, Fmask: U32(SQLITE_WriteSchema | SQLITE_NoSchemaError)}, {Fop: SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, Fmask: U32(SQLITE_LegacyAlter)}, {Fop: SQLITE_DBCONFIG_DQS_DDL, Fmask: U32(SQLITE_DqsDDL)}, {Fop: SQLITE_DBCONFIG_DQS_DML, Fmask: U32(SQLITE_DqsDML)}, {Fop: SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, Fmask: U32(SQLITE_LegacyFileFmt)}, {Fop: SQLITE_DBCONFIG_TRUSTED_SCHEMA, Fmask: U32(SQLITE_TrustedSchema)}, } func binCollFunc(tls *libc.TLS, NotUsed uintptr, nKey1 int32, pKey1 uintptr, nKey2 int32, pKey2 uintptr) int32 { var rc int32 var n int32 _ = NotUsed if nKey1 < nKey2 { n = nKey1 } else { n = nKey2 } rc = libc.Xmemcmp(tls, pKey1, pKey2, uint64(n)) if rc == 0 { rc = nKey1 - nKey2 } return rc } func rtrimCollFunc(tls *libc.TLS, pUser uintptr, nKey1 int32, pKey1 uintptr, nKey2 int32, pKey2 uintptr) int32 { var pK1 uintptr = pKey1 var pK2 uintptr = pKey2 for nKey1 != 0 && int32(*(*U8)(unsafe.Pointer(pK1 + uintptr(nKey1-1)))) == ' ' { nKey1-- } for nKey2 != 0 && int32(*(*U8)(unsafe.Pointer(pK2 + uintptr(nKey2-1)))) == ' ' { nKey2-- } return binCollFunc(tls, pUser, nKey1, pKey1, nKey2, pKey2) } // Return true if CollSeq is the default built-in BINARY. func Xsqlite3IsBinary(tls *libc.TLS, p uintptr) int32 { return libc.Bool32(p == uintptr(0) || (*CollSeq)(unsafe.Pointer(p)).FxCmp == *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 }{binCollFunc}))) } func nocaseCollatingFunc(tls *libc.TLS, NotUsed uintptr, nKey1 int32, pKey1 uintptr, nKey2 int32, pKey2 uintptr) int32 { var r int32 = Xsqlite3_strnicmp(tls, pKey1, pKey2, func() int32 { if nKey1 < nKey2 { return nKey1 } return nKey2 }()) _ = NotUsed if 0 == r { r = nKey1 - nKey2 } return r } // Return the ROWID of the most recent insert func Xsqlite3_last_insert_rowid(tls *libc.TLS, db uintptr) Sqlite_int64 { return (*Sqlite3)(unsafe.Pointer(db)).FlastRowid } // Set the value returned by the sqlite3_last_insert_rowid() API function. func Xsqlite3_set_last_insert_rowid(tls *libc.TLS, db uintptr, iRowid Sqlite3_int64) { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FlastRowid = iRowid Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) } // Return the number of changes in the most recent call to sqlite3_exec(). func Xsqlite3_changes64(tls *libc.TLS, db uintptr) Sqlite3_int64 { return (*Sqlite3)(unsafe.Pointer(db)).FnChange } func Xsqlite3_changes(tls *libc.TLS, db uintptr) int32 { return int32(Xsqlite3_changes64(tls, db)) } // Return the number of changes since the database handle was opened. func Xsqlite3_total_changes64(tls *libc.TLS, db uintptr) Sqlite3_int64 { return (*Sqlite3)(unsafe.Pointer(db)).FnTotalChange } func Xsqlite3_total_changes(tls *libc.TLS, db uintptr) int32 { return int32(Xsqlite3_total_changes64(tls, db)) } // Close all open savepoints. This function only manipulates fields of the // database handle object, it does not close any savepoints that may be open // at the b-tree/pager level. func Xsqlite3CloseSavepoints(tls *libc.TLS, db uintptr) { for (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint != 0 { var pTmp uintptr = (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint (*Sqlite3)(unsafe.Pointer(db)).FpSavepoint = (*Savepoint)(unsafe.Pointer(pTmp)).FpNext Xsqlite3DbFree(tls, db, pTmp) } (*Sqlite3)(unsafe.Pointer(db)).FnSavepoint = 0 (*Sqlite3)(unsafe.Pointer(db)).FnStatement = 0 (*Sqlite3)(unsafe.Pointer(db)).FisTransactionSavepoint = U8(0) } func functionDestroy(tls *libc.TLS, db uintptr, p uintptr) { var pDestructor uintptr pDestructor = *(*uintptr)(unsafe.Pointer(p + 64)) if pDestructor != 0 { (*FuncDestructor)(unsafe.Pointer(pDestructor)).FnRef-- if (*FuncDestructor)(unsafe.Pointer(pDestructor)).FnRef == 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*FuncDestructor)(unsafe.Pointer(pDestructor)).FxDestroy})).f(tls, (*FuncDestructor)(unsafe.Pointer(pDestructor)).FpUserData) Xsqlite3DbFree(tls, db, pDestructor) } } } func disconnectAllVtab(tls *libc.TLS, db uintptr) { var i int32 var p uintptr Xsqlite3BtreeEnterAll(tls, db) for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var pSchema uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpSchema if pSchema != 0 { for p = (*Hash)(unsafe.Pointer(pSchema + 8)).Ffirst; p != 0; p = (*HashElem)(unsafe.Pointer(p)).Fnext { var pTab uintptr = (*HashElem)(unsafe.Pointer(p)).Fdata if int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VTAB { Xsqlite3VtabDisconnect(tls, db, pTab) } } } } for p = (*Hash)(unsafe.Pointer(db + 576)).Ffirst; p != 0; p = (*HashElem)(unsafe.Pointer(p)).Fnext { var pMod uintptr = (*HashElem)(unsafe.Pointer(p)).Fdata if (*Module)(unsafe.Pointer(pMod)).FpEpoTab != 0 { Xsqlite3VtabDisconnect(tls, db, (*Module)(unsafe.Pointer(pMod)).FpEpoTab) } } Xsqlite3VtabUnlockList(tls, db) Xsqlite3BtreeLeaveAll(tls, db) } func connectionIsBusy(tls *libc.TLS, db uintptr) int32 { var j int32 if (*Sqlite3)(unsafe.Pointer(db)).FpVdbe != 0 { return 1 } for j = 0; j < (*Sqlite3)(unsafe.Pointer(db)).FnDb; j++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(j)*32)).FpBt if pBt != 0 && Xsqlite3BtreeIsInBackup(tls, pBt) != 0 { return 1 } } return 0 } func sqlite3Close(tls *libc.TLS, db uintptr, forceZombie int32) int32 { if !(db != 0) { return SQLITE_OK } if !(Xsqlite3SafetyCheckSickOrOk(tls, db) != 0) { return Xsqlite3MisuseError(tls, 175200) } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if int32((*Sqlite3)(unsafe.Pointer(db)).FmTrace)&SQLITE_TRACE_CLOSE != 0 { (*struct { f func(*libc.TLS, U32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(db + 248))})).f(tls, uint32(SQLITE_TRACE_CLOSE), (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg, db, uintptr(0)) } disconnectAllVtab(tls, db) Xsqlite3VtabRollback(tls, db) if !(forceZombie != 0) && connectionIsBusy(tls, db) != 0 { Xsqlite3ErrorWithMsg(tls, db, SQLITE_BUSY, ts+24795, 0) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_BUSY } (*Sqlite3)(unsafe.Pointer(db)).FeOpenState = U8(SQLITE_STATE_ZOMBIE) Xsqlite3LeaveMutexAndCloseZombie(tls, db) return SQLITE_OK } // Return the transaction state for a single databse, or the maximum // transaction state over all attached databases if zSchema is null. func Xsqlite3_txn_state(tls *libc.TLS, db uintptr, zSchema uintptr) int32 { var iDb int32 var nDb int32 var iTxn int32 = -1 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if zSchema != 0 { nDb = libc.AssignInt32(&iDb, Xsqlite3FindDbName(tls, db, zSchema)) if iDb < 0 { nDb-- } } else { iDb = 0 nDb = (*Sqlite3)(unsafe.Pointer(db)).FnDb - 1 } for ; iDb <= nDb; iDb++ { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt var x int32 if pBt != uintptr(0) { x = Xsqlite3BtreeTxnState(tls, pBt) } else { x = SQLITE_TXN_NONE } if x > iTxn { iTxn = x } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return iTxn } // Two variations on the public interface for closing a database // connection. The sqlite3_close() version returns SQLITE_BUSY and // leaves the connection open if there are unfinalized prepared // statements or unfinished sqlite3_backups. The sqlite3_close_v2() // version forces the connection to become a zombie if there are // unclosed resources, and arranges for deallocation when the last // prepare statement or sqlite3_backup closes. func Xsqlite3_close(tls *libc.TLS, db uintptr) int32 { return sqlite3Close(tls, db, 0) } func Xsqlite3_close_v2(tls *libc.TLS, db uintptr) int32 { return sqlite3Close(tls, db, 1) } // Close the mutex on database connection db. // // Furthermore, if database connection db is a zombie (meaning that there // has been a prior call to sqlite3_close(db) or sqlite3_close_v2(db)) and // every sqlite3_stmt has now been finalized and every sqlite3_backup has // finished, then free all resources. func Xsqlite3LeaveMutexAndCloseZombie(tls *libc.TLS, db uintptr) { var i uintptr var j int32 if int32((*Sqlite3)(unsafe.Pointer(db)).FeOpenState) != SQLITE_STATE_ZOMBIE || connectionIsBusy(tls, db) != 0 { Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return } Xsqlite3RollbackAll(tls, db, SQLITE_OK) Xsqlite3CloseSavepoints(tls, db) for j = 0; j < (*Sqlite3)(unsafe.Pointer(db)).FnDb; j++ { var pDb uintptr = (*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(j)*32 if (*Db1)(unsafe.Pointer(pDb)).FpBt != 0 { Xsqlite3BtreeClose(tls, (*Db1)(unsafe.Pointer(pDb)).FpBt) (*Db1)(unsafe.Pointer(pDb)).FpBt = uintptr(0) if j != 1 { (*Db1)(unsafe.Pointer(pDb)).FpSchema = uintptr(0) } } } if (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema != 0 { Xsqlite3SchemaClear(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema) } Xsqlite3VtabUnlockList(tls, db) Xsqlite3CollapseDatabaseArray(tls, db) Xsqlite3ConnectionClosed(tls, db) for i = (*Hash)(unsafe.Pointer(db + 624)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pNext uintptr var p uintptr p = (*HashElem)(unsafe.Pointer(i)).Fdata for __ccgo := true; __ccgo; __ccgo = p != 0 { functionDestroy(tls, db, p) pNext = (*FuncDef)(unsafe.Pointer(p)).FpNext Xsqlite3DbFree(tls, db, p) p = pNext } } Xsqlite3HashClear(tls, db+624) for i = (*Hash)(unsafe.Pointer(db + 648)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pColl uintptr = (*HashElem)(unsafe.Pointer(i)).Fdata for j = 0; j < 3; j++ { if (*CollSeq)(unsafe.Pointer(pColl+uintptr(j)*40)).FxDel != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*CollSeq)(unsafe.Pointer(pColl + uintptr(j)*40)).FxDel})).f(tls, (*CollSeq)(unsafe.Pointer(pColl+uintptr(j)*40)).FpUser) } } Xsqlite3DbFree(tls, db, pColl) } Xsqlite3HashClear(tls, db+648) for i = (*Hash)(unsafe.Pointer(db + 576)).Ffirst; i != 0; i = (*HashElem)(unsafe.Pointer(i)).Fnext { var pMod uintptr = (*HashElem)(unsafe.Pointer(i)).Fdata Xsqlite3VtabEponymousTableClear(tls, db, pMod) Xsqlite3VtabModuleUnref(tls, db, pMod) } Xsqlite3HashClear(tls, db+576) Xsqlite3Error(tls, db, SQLITE_OK) Xsqlite3ValueFree(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) Xsqlite3CloseExtensions(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FeOpenState = U8(SQLITE_STATE_ERROR) Xsqlite3DbFree(tls, db, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+1*32)).FpSchema) if (*Sqlite3)(unsafe.Pointer(db)).FxAutovacDestr != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxAutovacDestr})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpAutovacPagesArg) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FeOpenState = U8(SQLITE_STATE_CLOSED) Xsqlite3_mutex_free(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbMalloced != 0 { Xsqlite3_free(tls, (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FpStart) } Xsqlite3_free(tls, db) } // Rollback all database files. If tripCode is not SQLITE_OK, then // any write cursors are invalidated ("tripped" - as in "tripping a circuit // breaker") and made to return tripCode if there are any further // attempts to use that cursor. Read cursors remain open and valid // but are "saved" in case the table pages are moved around. func Xsqlite3RollbackAll(tls *libc.TLS, db uintptr, tripCode int32) { var i int32 var inTrans int32 = 0 var schemaChange int32 Xsqlite3BeginBenignMalloc(tls) Xsqlite3BtreeEnterAll(tls, db) schemaChange = libc.Bool32((*Sqlite3)(unsafe.Pointer(db)).FmDbFlags&U32(DBFLAG_SchemaChange) != U32(0) && int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) == 0) for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb; i++ { var p uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(i)*32)).FpBt if p != 0 { if Xsqlite3BtreeTxnState(tls, p) == SQLITE_TXN_WRITE { inTrans = 1 } Xsqlite3BtreeRollback(tls, p, tripCode, libc.BoolInt32(!(schemaChange != 0))) } } Xsqlite3VtabRollback(tls, db) Xsqlite3EndBenignMalloc(tls) if schemaChange != 0 { Xsqlite3ExpirePreparedStatements(tls, db, 0) Xsqlite3ResetAllSchemasOfConnection(tls, db) } Xsqlite3BtreeLeaveAll(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FnDeferredCons = int64(0) (*Sqlite3)(unsafe.Pointer(db)).FnDeferredImmCons = int64(0) *(*U64)(unsafe.Pointer(db + 48)) &= libc.CplUint64(uint64(SQLITE_DeferFKs) | uint64(0x00002)<<32) if (*Sqlite3)(unsafe.Pointer(db)).FxRollbackCallback != 0 && (inTrans != 0 || !(int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) != 0)) { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxRollbackCallback})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpRollbackArg) } } // Return a static string that describes the kind of error specified in the // argument. func Xsqlite3ErrStr(tls *libc.TLS, rc int32) uintptr { var zErr uintptr = ts + 24863 switch rc { case SQLITE_ABORT | int32(2)<<8: { zErr = ts + 24877 break } case SQLITE_ROW: { zErr = ts + 24899 break } case SQLITE_DONE: { zErr = ts + 24921 break } default: { rc = rc & 0xff if rc >= 0 && rc < int32(uint64(unsafe.Sizeof(aMsg))/uint64(unsafe.Sizeof(uintptr(0)))) && aMsg[rc] != uintptr(0) { zErr = aMsg[rc] } break } } return zErr } var aMsg = [29]uintptr{ ts + 24944, ts + 24957, uintptr(0), ts + 24973, ts + 24998, ts + 25012, ts + 25031, ts + 1480, ts + 25056, ts + 25093, ts + 25105, ts + 25120, ts + 25153, ts + 25171, ts + 25196, ts + 25225, uintptr(0), ts + 7190, ts + 6686, ts + 25242, ts + 25260, ts + 25278, uintptr(0), ts + 25312, uintptr(0), ts + 25333, ts + 25359, ts + 25382, ts + 25403, } func sqliteDefaultBusyCallback(tls *libc.TLS, ptr uintptr, count int32) int32 { var db uintptr = ptr var tmout int32 = (*Sqlite3)(unsafe.Pointer(db)).FbusyTimeout var delay int32 var prior int32 if count < int32(uint64(unsafe.Sizeof(delays))/uint64(unsafe.Sizeof(U8(0)))) { delay = int32(delays[count]) prior = int32(totals[count]) } else { delay = int32(delays[int32(uint64(unsafe.Sizeof(delays))/uint64(unsafe.Sizeof(U8(0))))-1]) prior = int32(totals[int32(uint64(unsafe.Sizeof(delays))/uint64(unsafe.Sizeof(U8(0))))-1]) + delay*(count-(int32(uint64(unsafe.Sizeof(delays))/uint64(unsafe.Sizeof(U8(0))))-1)) } if prior+delay > tmout { delay = tmout - prior if delay <= 0 { return 0 } } Xsqlite3OsSleep(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, delay*1000) return 1 } var delays = [12]U8{U8(1), U8(2), U8(5), U8(10), U8(15), U8(20), U8(25), U8(25), U8(25), U8(50), U8(50), U8(100)} var totals = [12]U8{U8(0), U8(1), U8(3), U8(8), U8(18), U8(33), U8(53), U8(78), U8(103), U8(128), U8(178), U8(228)} // Invoke the given busy handler. // // This routine is called when an operation failed to acquire a // lock on VFS file pFile. // // If this routine returns non-zero, the lock is retried. If it // returns 0, the operation aborts with an SQLITE_BUSY error. func Xsqlite3InvokeBusyHandler(tls *libc.TLS, p uintptr) int32 { var rc int32 if (*BusyHandler)(unsafe.Pointer(p)).FxBusyHandler == uintptr(0) || (*BusyHandler)(unsafe.Pointer(p)).FnBusy < 0 { return 0 } rc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*BusyHandler)(unsafe.Pointer(p)).FxBusyHandler})).f(tls, (*BusyHandler)(unsafe.Pointer(p)).FpBusyArg, (*BusyHandler)(unsafe.Pointer(p)).FnBusy) if rc == 0 { (*BusyHandler)(unsafe.Pointer(p)).FnBusy = -1 } else { (*BusyHandler)(unsafe.Pointer(p)).FnBusy++ } return rc } // This routine sets the busy callback for an Sqlite database to the // given callback function with the given argument. func Xsqlite3_busy_handler(tls *libc.TLS, db uintptr, xBusy uintptr, pArg uintptr) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FxBusyHandler = xBusy (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FpBusyArg = pArg (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FnBusy = 0 (*Sqlite3)(unsafe.Pointer(db)).FbusyTimeout = 0 Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } // This routine sets the progress callback for an Sqlite database to the // given callback function with the given argument. The progress callback will // be invoked every nOps opcodes. func Xsqlite3_progress_handler(tls *libc.TLS, db uintptr, nOps int32, xProgress uintptr, pArg uintptr) { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if nOps > 0 { (*Sqlite3)(unsafe.Pointer(db)).FxProgress = xProgress (*Sqlite3)(unsafe.Pointer(db)).FnProgressOps = uint32(nOps) (*Sqlite3)(unsafe.Pointer(db)).FpProgressArg = pArg } else { (*Sqlite3)(unsafe.Pointer(db)).FxProgress = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).FnProgressOps = uint32(0) (*Sqlite3)(unsafe.Pointer(db)).FpProgressArg = uintptr(0) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) } // This routine installs a default busy handler that waits for the // specified number of milliseconds before returning 0. func Xsqlite3_busy_timeout(tls *libc.TLS, db uintptr, ms int32) int32 { if ms > 0 { Xsqlite3_busy_handler(tls, db, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32) int32 }{sqliteDefaultBusyCallback})), db) (*Sqlite3)(unsafe.Pointer(db)).FbusyTimeout = ms } else { Xsqlite3_busy_handler(tls, db, uintptr(0), uintptr(0)) } return SQLITE_OK } // Cause any pending operation to stop at its earliest opportunity. func Xsqlite3_interrupt(tls *libc.TLS, db uintptr) { libc.AtomicStoreNInt32(db+432, int32(1), 0) } // Return true or false depending on whether or not an interrupt is // pending on connection db. func Xsqlite3_is_interrupted(tls *libc.TLS, db uintptr) int32 { return libc.Bool32(libc.AtomicLoadNInt32(db+432, 0) != 0) } // This function is exactly the same as sqlite3_create_function(), except // that it is designed to be called by internal code. The difference is // that if a malloc() fails in sqlite3_create_function(), an error code // is returned and the mallocFailed flag cleared. func Xsqlite3CreateFunc(tls *libc.TLS, db uintptr, zFunctionName uintptr, nArg int32, enc int32, pUserData uintptr, xSFunc uintptr, xStep uintptr, xFinal uintptr, xValue uintptr, xInverse uintptr, pDestructor uintptr) int32 { var p uintptr var extraFlags int32 if zFunctionName == uintptr(0) || xSFunc != uintptr(0) && xFinal != uintptr(0) || libc.Bool32(xFinal == uintptr(0)) != libc.Bool32(xStep == uintptr(0)) || libc.Bool32(xValue == uintptr(0)) != libc.Bool32(xInverse == uintptr(0)) || (nArg < -1 || nArg > SQLITE_MAX_FUNCTION_ARG) || 255 < Xsqlite3Strlen30(tls, zFunctionName) { return Xsqlite3MisuseError(tls, 175847) } extraFlags = enc & (SQLITE_DETERMINISTIC | SQLITE_DIRECTONLY | SQLITE_SUBTYPE | SQLITE_INNOCUOUS) enc = enc & (SQLITE_FUNC_ENCMASK | SQLITE_ANY) extraFlags = extraFlags ^ SQLITE_FUNC_UNSAFE switch enc { case SQLITE_UTF16: enc = SQLITE_UTF16LE break case SQLITE_ANY: { var rc int32 rc = Xsqlite3CreateFunc(tls, db, zFunctionName, nArg, SQLITE_UTF8|extraFlags^SQLITE_FUNC_UNSAFE, pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor) if rc == SQLITE_OK { rc = Xsqlite3CreateFunc(tls, db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags^SQLITE_FUNC_UNSAFE, pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor) } if rc != SQLITE_OK { return rc } enc = SQLITE_UTF16BE break } case SQLITE_UTF8: fallthrough case SQLITE_UTF16LE: fallthrough case SQLITE_UTF16BE: break default: enc = SQLITE_UTF8 break } p = Xsqlite3FindFunction(tls, db, zFunctionName, nArg, U8(enc), uint8(0)) if p != 0 && (*FuncDef)(unsafe.Pointer(p)).FfuncFlags&U32(SQLITE_FUNC_ENCMASK) == U32(enc) && int32((*FuncDef)(unsafe.Pointer(p)).FnArg) == nArg { if (*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive != 0 { Xsqlite3ErrorWithMsg(tls, db, SQLITE_BUSY, ts+25419, 0) return SQLITE_BUSY } else { Xsqlite3ExpirePreparedStatements(tls, db, 0) } } else if xSFunc == uintptr(0) && xFinal == uintptr(0) { return SQLITE_OK } p = Xsqlite3FindFunction(tls, db, zFunctionName, nArg, U8(enc), uint8(1)) if !(p != 0) { return SQLITE_NOMEM } functionDestroy(tls, db, p) if pDestructor != 0 { (*FuncDestructor)(unsafe.Pointer(pDestructor)).FnRef++ } *(*uintptr)(unsafe.Pointer(p + 64)) = pDestructor (*FuncDef)(unsafe.Pointer(p)).FfuncFlags = (*FuncDef)(unsafe.Pointer(p)).FfuncFlags&U32(SQLITE_FUNC_ENCMASK) | U32(extraFlags) (*FuncDef)(unsafe.Pointer(p)).FxSFunc = func() uintptr { if xSFunc != 0 { return xSFunc } return xStep }() (*FuncDef)(unsafe.Pointer(p)).FxFinalize = xFinal (*FuncDef)(unsafe.Pointer(p)).FxValue = xValue (*FuncDef)(unsafe.Pointer(p)).FxInverse = xInverse (*FuncDef)(unsafe.Pointer(p)).FpUserData = pUserData (*FuncDef)(unsafe.Pointer(p)).FnArg = I8(U16(nArg)) return SQLITE_OK } func createFunctionApi(tls *libc.TLS, db uintptr, zFunc uintptr, nArg int32, enc int32, p uintptr, xSFunc uintptr, xStep uintptr, xFinal uintptr, xValue uintptr, xInverse uintptr, xDestroy uintptr) int32 { var rc int32 var pArg uintptr rc = SQLITE_ERROR pArg = uintptr(0) Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if !(xDestroy != 0) { goto __1 } pArg = Xsqlite3Malloc(tls, uint64(unsafe.Sizeof(FuncDestructor{}))) if !!(pArg != 0) { goto __2 } Xsqlite3OomFault(tls, db) (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDestroy})).f(tls, p) goto out __2: ; (*FuncDestructor)(unsafe.Pointer(pArg)).FnRef = 0 (*FuncDestructor)(unsafe.Pointer(pArg)).FxDestroy = xDestroy (*FuncDestructor)(unsafe.Pointer(pArg)).FpUserData = p __1: ; rc = Xsqlite3CreateFunc(tls, db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, xValue, xInverse, pArg) if !(pArg != 0 && (*FuncDestructor)(unsafe.Pointer(pArg)).FnRef == 0) { goto __3 } (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDestroy})).f(tls, p) Xsqlite3_free(tls, pArg) __3: ; out: rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Create new user functions. func Xsqlite3_create_function(tls *libc.TLS, db uintptr, zFunc uintptr, nArg int32, enc int32, p uintptr, xSFunc uintptr, xStep uintptr, xFinal uintptr) int32 { return createFunctionApi(tls, db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, uintptr(0), uintptr(0), uintptr(0)) } func Xsqlite3_create_function_v2(tls *libc.TLS, db uintptr, zFunc uintptr, nArg int32, enc int32, p uintptr, xSFunc uintptr, xStep uintptr, xFinal uintptr, xDestroy uintptr) int32 { return createFunctionApi(tls, db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, uintptr(0), uintptr(0), xDestroy) } func Xsqlite3_create_window_function(tls *libc.TLS, db uintptr, zFunc uintptr, nArg int32, enc int32, p uintptr, xStep uintptr, xFinal uintptr, xValue uintptr, xInverse uintptr, xDestroy uintptr) int32 { return createFunctionApi(tls, db, zFunc, nArg, enc, p, uintptr(0), xStep, xFinal, xValue, xInverse, xDestroy) } func Xsqlite3_create_function16(tls *libc.TLS, db uintptr, zFunctionName uintptr, nArg int32, eTextRep int32, p uintptr, xSFunc uintptr, xStep uintptr, xFinal uintptr) int32 { var rc int32 var zFunc8 uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) zFunc8 = Xsqlite3Utf16to8(tls, db, zFunctionName, -1, uint8(SQLITE_UTF16LE)) rc = Xsqlite3CreateFunc(tls, db, zFunc8, nArg, eTextRep, p, xSFunc, xStep, xFinal, uintptr(0), uintptr(0), uintptr(0)) Xsqlite3DbFree(tls, db, zFunc8) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } func sqlite3InvalidFunction(tls *libc.TLS, context uintptr, NotUsed int32, NotUsed2 uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var zName uintptr = Xsqlite3_user_data(tls, context) var zErr uintptr _ = NotUsed _ = NotUsed2 zErr = Xsqlite3_mprintf(tls, ts+25482, libc.VaList(bp, zName)) Xsqlite3_result_error(tls, context, zErr, -1) Xsqlite3_free(tls, zErr) } // Declare that a function has been overloaded by a virtual table. // // If the function already exists as a regular global function, then // this routine is a no-op. If the function does not exist, then create // a new one that always throws a run-time error. // // When virtual tables intend to provide an overloaded function, they // should call this routine to make sure the global function exists. // A global function must exist in order for name resolution to work // properly. func Xsqlite3_overload_function(tls *libc.TLS, db uintptr, zName uintptr, nArg int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var zCopy uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) rc = libc.Bool32(Xsqlite3FindFunction(tls, db, zName, nArg, uint8(SQLITE_UTF8), uint8(0)) != uintptr(0)) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if rc != 0 { return SQLITE_OK } zCopy = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, zName)) if zCopy == uintptr(0) { return SQLITE_NOMEM } return Xsqlite3_create_function_v2(tls, db, zName, nArg, SQLITE_UTF8, zCopy, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{sqlite3InvalidFunction})), uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } // Register a trace function. The pArg from the previously registered trace // is returned. // // A NULL trace function means that no tracing is executes. A non-NULL // trace is a pointer to a function that is invoked at the start of each // SQL statement. func Xsqlite3_trace(tls *libc.TLS, db uintptr, xTrace uintptr, pArg uintptr) uintptr { var pOld uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pOld = (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg (*Sqlite3)(unsafe.Pointer(db)).FmTrace = func() uint8 { if xTrace != 0 { return uint8(SQLITE_TRACE_LEGACY) } return uint8(0) }() *(*uintptr)(unsafe.Pointer(db + 248)) = xTrace (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg = pArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return pOld } // Register a trace callback using the version-2 interface. func Xsqlite3_trace_v2(tls *libc.TLS, db uintptr, mTrace uint32, xTrace uintptr, pArg uintptr) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if mTrace == uint32(0) { xTrace = uintptr(0) } if xTrace == uintptr(0) { mTrace = uint32(0) } (*Sqlite3)(unsafe.Pointer(db)).FmTrace = U8(mTrace) *(*uintptr)(unsafe.Pointer(db + 248)) = xTrace (*Sqlite3)(unsafe.Pointer(db)).FpTraceArg = pArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } // Register a profile function. The pArg from the previously registered // profile function is returned. // // A NULL profile function means that no profiling is executes. A non-NULL // profile is a pointer to a function that is invoked at the conclusion of // each SQL statement that is run. func Xsqlite3_profile(tls *libc.TLS, db uintptr, xProfile uintptr, pArg uintptr) uintptr { var pOld uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pOld = (*Sqlite3)(unsafe.Pointer(db)).FpProfileArg (*Sqlite3)(unsafe.Pointer(db)).FxProfile = xProfile (*Sqlite3)(unsafe.Pointer(db)).FpProfileArg = pArg *(*U8)(unsafe.Pointer(db + 110)) &= U8(SQLITE_TRACE_NONLEGACY_MASK) if (*Sqlite3)(unsafe.Pointer(db)).FxProfile != 0 { *(*U8)(unsafe.Pointer(db + 110)) |= U8(SQLITE_TRACE_XPROFILE) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return pOld } // Register a function to be invoked when a transaction commits. // If the invoked function returns non-zero, then the commit becomes a // rollback. func Xsqlite3_commit_hook(tls *libc.TLS, db uintptr, xCallback uintptr, pArg uintptr) uintptr { var pOld uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pOld = (*Sqlite3)(unsafe.Pointer(db)).FpCommitArg (*Sqlite3)(unsafe.Pointer(db)).FxCommitCallback = xCallback (*Sqlite3)(unsafe.Pointer(db)).FpCommitArg = pArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return pOld } // Register a callback to be invoked each time a row is updated, // inserted or deleted using this database connection. func Xsqlite3_update_hook(tls *libc.TLS, db uintptr, xCallback uintptr, pArg uintptr) uintptr { var pRet uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pRet = (*Sqlite3)(unsafe.Pointer(db)).FpUpdateArg (*Sqlite3)(unsafe.Pointer(db)).FxUpdateCallback = xCallback (*Sqlite3)(unsafe.Pointer(db)).FpUpdateArg = pArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return pRet } // Register a callback to be invoked each time a transaction is rolled // back by this database connection. func Xsqlite3_rollback_hook(tls *libc.TLS, db uintptr, xCallback uintptr, pArg uintptr) uintptr { var pRet uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pRet = (*Sqlite3)(unsafe.Pointer(db)).FpRollbackArg (*Sqlite3)(unsafe.Pointer(db)).FxRollbackCallback = xCallback (*Sqlite3)(unsafe.Pointer(db)).FpRollbackArg = pArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return pRet } // Register a callback to be invoked each time a row is updated, // inserted or deleted using this database connection. func Xsqlite3_preupdate_hook(tls *libc.TLS, db uintptr, xCallback uintptr, pArg uintptr) uintptr { var pRet uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pRet = (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdateArg (*Sqlite3)(unsafe.Pointer(db)).FxPreUpdateCallback = xCallback (*Sqlite3)(unsafe.Pointer(db)).FpPreUpdateArg = pArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return pRet } // Register a function to be invoked prior to each autovacuum that // determines the number of pages to vacuum. func Xsqlite3_autovacuum_pages(tls *libc.TLS, db uintptr, xCallback uintptr, pArg uintptr, xDestructor uintptr) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if (*Sqlite3)(unsafe.Pointer(db)).FxAutovacDestr != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3)(unsafe.Pointer(db)).FxAutovacDestr})).f(tls, (*Sqlite3)(unsafe.Pointer(db)).FpAutovacPagesArg) } (*Sqlite3)(unsafe.Pointer(db)).FxAutovacPages = xCallback (*Sqlite3)(unsafe.Pointer(db)).FpAutovacPagesArg = pArg (*Sqlite3)(unsafe.Pointer(db)).FxAutovacDestr = xDestructor Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } // The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). // Invoke sqlite3_wal_checkpoint if the number of frames in the log file // is greater than sqlite3.pWalArg cast to an integer (the value configured by // wal_autocheckpoint()). func Xsqlite3WalDefaultHook(tls *libc.TLS, pClientData uintptr, db uintptr, zDb uintptr, nFrame int32) int32 { if nFrame >= int32(pClientData) { Xsqlite3BeginBenignMalloc(tls) Xsqlite3_wal_checkpoint(tls, db, zDb) Xsqlite3EndBenignMalloc(tls) } return SQLITE_OK } // Configure an sqlite3_wal_hook() callback to automatically checkpoint // a database after committing a transaction if there are nFrame or // more frames in the log file. Passing zero or a negative value as the // nFrame parameter disables automatic checkpoints entirely. // // The callback registered by this function replaces any existing callback // registered using sqlite3_wal_hook(). Likewise, registering a callback // using sqlite3_wal_hook() disables the automatic checkpoint mechanism // configured by this function. func Xsqlite3_wal_autocheckpoint(tls *libc.TLS, db uintptr, nFrame int32) int32 { if nFrame > 0 { Xsqlite3_wal_hook(tls, db, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32) int32 }{Xsqlite3WalDefaultHook})), uintptr(int64(nFrame))) } else { Xsqlite3_wal_hook(tls, db, uintptr(0), uintptr(0)) } return SQLITE_OK } // Register a callback to be invoked each time a transaction is written // into the write-ahead-log by this database connection. func Xsqlite3_wal_hook(tls *libc.TLS, db uintptr, xCallback uintptr, pArg uintptr) uintptr { var pRet uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pRet = (*Sqlite3)(unsafe.Pointer(db)).FpWalArg (*Sqlite3)(unsafe.Pointer(db)).FxWalCallback = xCallback (*Sqlite3)(unsafe.Pointer(db)).FpWalArg = pArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return pRet } // Checkpoint database zDb. func Xsqlite3_wal_checkpoint_v2(tls *libc.TLS, db uintptr, zDb uintptr, eMode int32, pnLog uintptr, pnCkpt uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 var iDb int32 if pnLog != 0 { *(*int32)(unsafe.Pointer(pnLog)) = -1 } if pnCkpt != 0 { *(*int32)(unsafe.Pointer(pnCkpt)) = -1 } if eMode < SQLITE_CHECKPOINT_PASSIVE || eMode > SQLITE_CHECKPOINT_TRUNCATE { return SQLITE_MISUSE } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if zDb != 0 && *(*int8)(unsafe.Pointer(zDb)) != 0 { iDb = Xsqlite3FindDbName(tls, db, zDb) } else { iDb = SQLITE_MAX_ATTACHED + 2 } if iDb < 0 { rc = SQLITE_ERROR Xsqlite3ErrorWithMsg(tls, db, SQLITE_ERROR, ts+25533, libc.VaList(bp, zDb)) } else { (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FnBusy = 0 rc = Xsqlite3Checkpoint(tls, db, iDb, eMode, pnLog, pnCkpt) Xsqlite3Error(tls, db, rc) } rc = Xsqlite3ApiExit(tls, db, rc) if (*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive == 0 { libc.AtomicStoreNInt32(db+432, int32(0), 0) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points // to contains a zero-length string, all attached databases are // checkpointed. func Xsqlite3_wal_checkpoint(tls *libc.TLS, db uintptr, zDb uintptr) int32 { return Xsqlite3_wal_checkpoint_v2(tls, db, zDb, SQLITE_CHECKPOINT_PASSIVE, uintptr(0), uintptr(0)) } // Run a checkpoint on database iDb. This is a no-op if database iDb is // not currently open in WAL mode. // // If a transaction is open on the database being checkpointed, this // function returns SQLITE_LOCKED and a checkpoint is not attempted. If // an error occurs while running the checkpoint, an SQLite error code is // returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK. // // The mutex on database handle db should be held by the caller. The mutex // associated with the specific b-tree being checkpointed is taken by // this function while the checkpoint is running. // // If iDb is passed SQLITE_MAX_DB then all attached databases are // checkpointed. If an error is encountered it is returned immediately - // no attempt is made to checkpoint any remaining databases. // // Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL, RESTART // or TRUNCATE. func Xsqlite3Checkpoint(tls *libc.TLS, db uintptr, iDb int32, eMode int32, pnLog uintptr, pnCkpt uintptr) int32 { var rc int32 = SQLITE_OK var i int32 var bBusy int32 = 0 for i = 0; i < (*Sqlite3)(unsafe.Pointer(db)).FnDb && rc == SQLITE_OK; i++ { if i == iDb || iDb == SQLITE_MAX_ATTACHED+2 { rc = Xsqlite3BtreeCheckpoint(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb+uintptr(i)*32)).FpBt, eMode, pnLog, pnCkpt) pnLog = uintptr(0) pnCkpt = uintptr(0) if rc == SQLITE_BUSY { bBusy = 1 rc = SQLITE_OK } } } if rc == SQLITE_OK && bBusy != 0 { return SQLITE_BUSY } return rc } // This function returns true if main-memory should be used instead of // a temporary file for transient pager files and statement journals. // The value returned depends on the value of db->temp_store (runtime // parameter) and the compile time value of SQLITE_TEMP_STORE. The // following table describes the relationship between these two values // and this functions return value. // // SQLITE_TEMP_STORE db->temp_store Location of temporary database // ----------------- -------------- ------------------------------ // 0 any file (return 0) // 1 1 file (return 0) // 1 2 memory (return 1) // 1 0 file (return 0) // 2 1 file (return 0) // 2 2 memory (return 1) // 2 0 memory (return 1) // 3 any memory (return 1) func Xsqlite3TempInMemory(tls *libc.TLS, db uintptr) int32 { return libc.Bool32(int32((*Sqlite3)(unsafe.Pointer(db)).Ftemp_store) == 2) } // Return UTF-8 encoded English language explanation of the most recent // error. func Xsqlite3_errmsg(tls *libc.TLS, db uintptr) uintptr { var z uintptr if !(db != 0) { return Xsqlite3ErrStr(tls, SQLITE_NOMEM) } if !(Xsqlite3SafetyCheckSickOrOk(tls, db) != 0) { return Xsqlite3ErrStr(tls, Xsqlite3MisuseError(tls, 176592)) } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { z = Xsqlite3ErrStr(tls, SQLITE_NOMEM) } else { if (*Sqlite3)(unsafe.Pointer(db)).FerrCode != 0 { z = Xsqlite3_value_text(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) } else { z = uintptr(0) } if z == uintptr(0) { z = Xsqlite3ErrStr(tls, (*Sqlite3)(unsafe.Pointer(db)).FerrCode) } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return z } // Return the byte offset of the most recent error func Xsqlite3_error_offset(tls *libc.TLS, db uintptr) int32 { var iOffset int32 = -1 if db != 0 && Xsqlite3SafetyCheckSickOrOk(tls, db) != 0 && (*Sqlite3)(unsafe.Pointer(db)).FerrCode != 0 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) iOffset = (*Sqlite3)(unsafe.Pointer(db)).FerrByteOffset Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) } return iOffset } // Return UTF-16 encoded English language explanation of the most recent // error. func Xsqlite3_errmsg16(tls *libc.TLS, db uintptr) uintptr { var z uintptr if !(db != 0) { return uintptr(unsafe.Pointer(&outOfMem)) } if !(Xsqlite3SafetyCheckSickOrOk(tls, db) != 0) { return uintptr(unsafe.Pointer(&misuse)) } Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { z = uintptr(unsafe.Pointer(&outOfMem)) } else { z = Xsqlite3_value_text16(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) if z == uintptr(0) { Xsqlite3ErrorWithMsg(tls, db, (*Sqlite3)(unsafe.Pointer(db)).FerrCode, Xsqlite3ErrStr(tls, (*Sqlite3)(unsafe.Pointer(db)).FerrCode), 0) z = Xsqlite3_value_text16(tls, (*Sqlite3)(unsafe.Pointer(db)).FpErr) } Xsqlite3OomClear(tls, db) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return z } var outOfMem = [14]U16{ U16('o'), U16('u'), U16('t'), U16(' '), U16('o'), U16('f'), U16(' '), U16('m'), U16('e'), U16('m'), U16('o'), U16('r'), U16('y'), U16(0), } var misuse = [34]U16{ U16('b'), U16('a'), U16('d'), U16(' '), U16('p'), U16('a'), U16('r'), U16('a'), U16('m'), U16('e'), U16('t'), U16('e'), U16('r'), U16(' '), U16('o'), U16('r'), U16(' '), U16('o'), U16('t'), U16('h'), U16('e'), U16('r'), U16(' '), U16('A'), U16('P'), U16('I'), U16(' '), U16('m'), U16('i'), U16('s'), U16('u'), U16('s'), U16('e'), U16(0), } // Return the most recent error code generated by an SQLite routine. If NULL is // passed to this function, we assume a malloc() failed during sqlite3_open(). func Xsqlite3_errcode(tls *libc.TLS, db uintptr) int32 { if db != 0 && !(Xsqlite3SafetyCheckSickOrOk(tls, db) != 0) { return Xsqlite3MisuseError(tls, 176671) } if !(db != 0) || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return SQLITE_NOMEM } return (*Sqlite3)(unsafe.Pointer(db)).FerrCode & (*Sqlite3)(unsafe.Pointer(db)).FerrMask } func Xsqlite3_extended_errcode(tls *libc.TLS, db uintptr) int32 { if db != 0 && !(Xsqlite3SafetyCheckSickOrOk(tls, db) != 0) { return Xsqlite3MisuseError(tls, 176680) } if !(db != 0) || (*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0 { return SQLITE_NOMEM } return (*Sqlite3)(unsafe.Pointer(db)).FerrCode } func Xsqlite3_system_errno(tls *libc.TLS, db uintptr) int32 { if db != 0 { return (*Sqlite3)(unsafe.Pointer(db)).FiSysErrno } return 0 } // Return a string that describes the kind of error specified in the // argument. For now, this simply calls the internal sqlite3ErrStr() // function. func Xsqlite3_errstr(tls *libc.TLS, rc int32) uintptr { return Xsqlite3ErrStr(tls, rc) } func createCollation(tls *libc.TLS, db uintptr, zName uintptr, enc U8, pCtx uintptr, xCompare uintptr, xDel uintptr) int32 { var pColl uintptr var enc2 int32 enc2 = int32(enc) if enc2 == SQLITE_UTF16 || enc2 == SQLITE_UTF16_ALIGNED { enc2 = SQLITE_UTF16LE } if enc2 < SQLITE_UTF8 || enc2 > SQLITE_UTF16BE { return Xsqlite3MisuseError(tls, 176728) } pColl = Xsqlite3FindCollSeq(tls, db, U8(enc2), zName, 0) if pColl != 0 && (*CollSeq)(unsafe.Pointer(pColl)).FxCmp != 0 { if (*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive != 0 { Xsqlite3ErrorWithMsg(tls, db, SQLITE_BUSY, ts+25554, 0) return SQLITE_BUSY } Xsqlite3ExpirePreparedStatements(tls, db, 0) if int32((*CollSeq)(unsafe.Pointer(pColl)).Fenc)&libc.CplInt32(SQLITE_UTF16_ALIGNED) == enc2 { var aColl uintptr = Xsqlite3HashFind(tls, db+648, zName) var j int32 for j = 0; j < 3; j++ { var p uintptr = aColl + uintptr(j)*40 if int32((*CollSeq)(unsafe.Pointer(p)).Fenc) == int32((*CollSeq)(unsafe.Pointer(pColl)).Fenc) { if (*CollSeq)(unsafe.Pointer(p)).FxDel != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*CollSeq)(unsafe.Pointer(p)).FxDel})).f(tls, (*CollSeq)(unsafe.Pointer(p)).FpUser) } (*CollSeq)(unsafe.Pointer(p)).FxCmp = uintptr(0) } } } } pColl = Xsqlite3FindCollSeq(tls, db, U8(enc2), zName, 1) if pColl == uintptr(0) { return SQLITE_NOMEM } (*CollSeq)(unsafe.Pointer(pColl)).FxCmp = xCompare (*CollSeq)(unsafe.Pointer(pColl)).FpUser = pCtx (*CollSeq)(unsafe.Pointer(pColl)).FxDel = xDel (*CollSeq)(unsafe.Pointer(pColl)).Fenc = U8(enc2 | int32(enc)&SQLITE_UTF16_ALIGNED) Xsqlite3Error(tls, db, SQLITE_OK) return SQLITE_OK } var aHardLimit = [12]int32{ SQLITE_MAX_LENGTH, SQLITE_MAX_SQL_LENGTH, SQLITE_MAX_COLUMN, SQLITE_MAX_EXPR_DEPTH, SQLITE_MAX_COMPOUND_SELECT, SQLITE_MAX_VDBE_OP, SQLITE_MAX_FUNCTION_ARG, SQLITE_MAX_ATTACHED, SQLITE_MAX_LIKE_PATTERN_LENGTH, SQLITE_MAX_VARIABLE_NUMBER, SQLITE_MAX_TRIGGER_DEPTH, SQLITE_MAX_WORKER_THREADS, } // Change the value of a limit. Report the old value. // If an invalid limit index is supplied, report -1. // Make no changes but still report the old value if the // new limit is negative. // // A new lower limit does not shrink existing constructs. // It merely prevents new constructs that exceed the limit // from forming. func Xsqlite3_limit(tls *libc.TLS, db uintptr, limitId int32, newLimit int32) int32 { var oldLimit int32 if limitId < 0 || limitId >= SQLITE_LIMIT_WORKER_THREADS+1 { return -1 } oldLimit = *(*int32)(unsafe.Pointer(db + 136 + uintptr(limitId)*4)) if newLimit >= 0 { if newLimit > aHardLimit[limitId] { newLimit = aHardLimit[limitId] } else if newLimit < 1 && limitId == SQLITE_LIMIT_LENGTH { newLimit = 1 } *(*int32)(unsafe.Pointer(db + 136 + uintptr(limitId)*4)) = newLimit } return oldLimit } // This function is used to parse both URIs and non-URI filenames passed by the // user to API functions sqlite3_open() or sqlite3_open_v2(), and for database // URIs specified as part of ATTACH statements. // // The first argument to this function is the name of the VFS to use (or // a NULL to signify the default VFS) if the URI does not contain a "vfs=xxx" // query parameter. The second argument contains the URI (or non-URI filename) // itself. When this function is called the *pFlags variable should contain // the default flags to open the database handle with. The value stored in // *pFlags may be updated before returning if the URI filename contains // "cache=xxx" or "mode=xxx" query parameters. // // If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to // the VFS that should be used to open the database file. *pzFile is set to // point to a buffer containing the name of the file to open. The value // stored in *pzFile is a database name acceptable to sqlite3_uri_parameter() // and is in the same format as names created using sqlite3_create_filename(). // The caller must invoke sqlite3_free_filename() (not sqlite3_free()!) on // the value returned in *pzFile to avoid a memory leak. // // If an error occurs, then an SQLite error code is returned and *pzErrMsg // may be set to point to a buffer containing an English language error // message. It is the responsibility of the caller to eventually release // this buffer by calling sqlite3_free(). func Xsqlite3ParseUri(tls *libc.TLS, zDefaultVfs uintptr, zUri uintptr, pFlags uintptr, ppVfs uintptr, pzFile uintptr, pzErrMsg uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var rc int32 var flags uint32 var zVfs uintptr var zFile uintptr var c int8 var nUri int32 var octet int32 var z uintptr var i int32 var mode int32 var aMode uintptr var zModeType uintptr var mask int32 var limit int32 var nOpt int32 var zVal uintptr var nVal int32 var zOpt uintptr var eState int32 var iIn int32 var iOut int32 var nByte U64 rc = SQLITE_OK flags = *(*uint32)(unsafe.Pointer(pFlags)) zVfs = zDefaultVfs nUri = Xsqlite3Strlen30(tls, zUri) if !((flags&uint32(SQLITE_OPEN_URI) != 0 || Xsqlite3Config.FbOpenUri != 0) && nUri >= 5 && libc.Xmemcmp(tls, zUri, ts+25622, uint64(5)) == 0) { goto __1 } iOut = 0 nByte = U64(nUri + 8) flags = flags | uint32(SQLITE_OPEN_URI) iIn = 0 __3: if !(iIn < nUri) { goto __5 } nByte = nByte + U64(libc.Bool32(int32(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn)))) == '&')) goto __4 __4: iIn++ goto __3 goto __5 __5: ; zFile = Xsqlite3_malloc64(tls, nByte) if !!(zFile != 0) { goto __6 } return SQLITE_NOMEM __6: ; libc.Xmemset(tls, zFile, 0, uint64(4)) zFile += uintptr(4) iIn = 5 if !(int32(*(*int8)(unsafe.Pointer(zUri + 5))) == '/' && int32(*(*int8)(unsafe.Pointer(zUri + 6))) == '/') { goto __7 } iIn = 7 __8: if !(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn))) != 0 && int32(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn)))) != '/') { goto __9 } iIn++ goto __8 __9: ; if !(iIn != 7 && (iIn != 16 || libc.Xmemcmp(tls, ts+25628, zUri+7, uint64(9)) != 0)) { goto __10 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+25638, libc.VaList(bp, iIn-7, zUri+7)) rc = SQLITE_ERROR goto parse_uri_out __10: ; __7: ; eState = 0 __11: if !(int32(libc.AssignInt8(&c, *(*int8)(unsafe.Pointer(zUri + uintptr(iIn))))) != 0 && int32(c) != '#') { goto __12 } iIn++ if !(int32(c) == '%' && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn))))])&0x08 != 0 && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn+1))))])&0x08 != 0) { goto __13 } octet = int32(Xsqlite3HexToInt(tls, int32(*(*int8)(unsafe.Pointer(zUri + uintptr(libc.PostIncInt32(&iIn, 1))))))) << 4 octet = octet + int32(Xsqlite3HexToInt(tls, int32(*(*int8)(unsafe.Pointer(zUri + uintptr(libc.PostIncInt32(&iIn, 1))))))) if !(octet == 0) { goto __15 } __16: if !(int32(libc.AssignInt8(&c, *(*int8)(unsafe.Pointer(zUri + uintptr(iIn))))) != 0 && int32(c) != '#' && (eState != 0 || int32(c) != '?') && (eState != 1 || int32(c) != '=' && int32(c) != '&') && (eState != 2 || int32(c) != '&')) { goto __17 } iIn++ goto __16 __17: ; goto __11 __15: ; c = int8(octet) goto __14 __13: if !(eState == 1 && (int32(c) == '&' || int32(c) == '=')) { goto __18 } if !(int32(*(*int8)(unsafe.Pointer(zFile + uintptr(iOut-1)))) == 0) { goto __20 } __21: if !(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn))) != 0 && int32(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn)))) != '#' && int32(*(*int8)(unsafe.Pointer(zUri + uintptr(iIn-1)))) != '&') { goto __22 } iIn++ goto __21 __22: ; goto __11 __20: ; if !(int32(c) == '&') { goto __23 } *(*int8)(unsafe.Pointer(zFile + uintptr(libc.PostIncInt32(&iOut, 1)))) = int8(0) goto __24 __23: eState = 2 __24: ; c = int8(0) goto __19 __18: if !(eState == 0 && int32(c) == '?' || eState == 2 && int32(c) == '&') { goto __25 } c = int8(0) eState = 1 __25: ; __19: ; __14: ; *(*int8)(unsafe.Pointer(zFile + uintptr(libc.PostIncInt32(&iOut, 1)))) = c goto __11 __12: ; if !(eState == 1) { goto __26 } *(*int8)(unsafe.Pointer(zFile + uintptr(libc.PostIncInt32(&iOut, 1)))) = int8(0) __26: ; libc.Xmemset(tls, zFile+uintptr(iOut), 0, uint64(4)) zOpt = zFile + uintptr(Xsqlite3Strlen30(tls, zFile)+1) __27: if !(*(*int8)(unsafe.Pointer(zOpt)) != 0) { goto __28 } nOpt = Xsqlite3Strlen30(tls, zOpt) zVal = zOpt + uintptr(nOpt+1) nVal = Xsqlite3Strlen30(tls, zVal) if !(nOpt == 3 && libc.Xmemcmp(tls, ts+25666, zOpt, uint64(3)) == 0) { goto __29 } zVfs = zVal goto __30 __29: aMode = uintptr(0) zModeType = uintptr(0) mask = 0 limit = 0 if !(nOpt == 5 && libc.Xmemcmp(tls, ts+25670, zOpt, uint64(5)) == 0) { goto __31 } mask = SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_PRIVATECACHE aMode = uintptr(unsafe.Pointer(&aCacheMode)) limit = mask zModeType = ts + 25670 __31: ; if !(nOpt == 4 && libc.Xmemcmp(tls, ts+25676, zOpt, uint64(4)) == 0) { goto __32 } mask = SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MEMORY aMode = uintptr(unsafe.Pointer(&aOpenMode)) limit = int32(uint32(mask) & flags) zModeType = ts + 25681 __32: ; if !(aMode != 0) { goto __33 } mode = 0 i = 0 __34: if !((*OpenMode)(unsafe.Pointer(aMode+uintptr(i)*16)).Fz != 0) { goto __36 } z = (*OpenMode)(unsafe.Pointer(aMode + uintptr(i)*16)).Fz if !(nVal == Xsqlite3Strlen30(tls, z) && 0 == libc.Xmemcmp(tls, zVal, z, uint64(nVal))) { goto __37 } mode = (*OpenMode)(unsafe.Pointer(aMode + uintptr(i)*16)).Fmode goto __36 __37: ; goto __35 __35: i++ goto __34 goto __36 __36: ; if !(mode == 0) { goto __38 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+25688, libc.VaList(bp+16, zModeType, zVal)) rc = SQLITE_ERROR goto parse_uri_out __38: ; if !(mode&libc.CplInt32(SQLITE_OPEN_MEMORY) > limit) { goto __39 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+25708, libc.VaList(bp+32, zModeType, zVal)) rc = SQLITE_PERM goto parse_uri_out __39: ; flags = flags&uint32(^mask) | uint32(mode) __33: ; __30: ; zOpt = zVal + uintptr(nVal+1) goto __27 __28: ; goto __2 __1: zFile = Xsqlite3_malloc64(tls, uint64(nUri+8)) if !!(zFile != 0) { goto __40 } return SQLITE_NOMEM __40: ; libc.Xmemset(tls, zFile, 0, uint64(4)) zFile += uintptr(4) if !(nUri != 0) { goto __41 } libc.Xmemcpy(tls, zFile, zUri, uint64(nUri)) __41: ; libc.Xmemset(tls, zFile+uintptr(nUri), 0, uint64(4)) flags = flags & libc.Uint32FromInt32(libc.CplInt32(SQLITE_OPEN_URI)) __2: ; *(*uintptr)(unsafe.Pointer(ppVfs)) = Xsqlite3_vfs_find(tls, zVfs) if !(*(*uintptr)(unsafe.Pointer(ppVfs)) == uintptr(0)) { goto __42 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+25732, libc.VaList(bp+48, zVfs)) rc = SQLITE_ERROR __42: ; parse_uri_out: if !(rc != SQLITE_OK) { goto __43 } Xsqlite3_free_filename(tls, zFile) zFile = uintptr(0) __43: ; *(*uint32)(unsafe.Pointer(pFlags)) = flags *(*uintptr)(unsafe.Pointer(pzFile)) = zFile return rc } type OpenMode = struct { Fz uintptr Fmode int32 F__ccgo_pad1 [4]byte } var aCacheMode = [3]OpenMode{ {Fz: ts + 25748, Fmode: SQLITE_OPEN_SHAREDCACHE}, {Fz: ts + 25755, Fmode: SQLITE_OPEN_PRIVATECACHE}, {}, } var aOpenMode = [5]OpenMode{ {Fz: ts + 25763, Fmode: SQLITE_OPEN_READONLY}, {Fz: ts + 25766, Fmode: SQLITE_OPEN_READWRITE}, {Fz: ts + 25769, Fmode: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE}, {Fz: ts + 18731, Fmode: SQLITE_OPEN_MEMORY}, {}, } func uriParameter(tls *libc.TLS, zFilename uintptr, zParam uintptr) uintptr { zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) for zFilename != uintptr(0) && *(*int8)(unsafe.Pointer(zFilename)) != 0 { var x int32 = libc.Xstrcmp(tls, zFilename, zParam) zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) if x == 0 { return zFilename } zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) } return uintptr(0) } func openDatabase(tls *libc.TLS, zFilename uintptr, ppDb uintptr, flags uint32, zVfs uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) *(*uint32)(unsafe.Pointer(bp + 8)) = flags var db uintptr var rc int32 var isThreadsafe int32 var i int32 *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) *(*uintptr)(unsafe.Pointer(ppDb)) = uintptr(0) rc = Xsqlite3_initialize(tls) if !(rc != 0) { goto __1 } return rc __1: ; if !(int32(Xsqlite3Config.FbCoreMutex) == 0) { goto __2 } isThreadsafe = 0 goto __3 __2: if !(*(*uint32)(unsafe.Pointer(bp + 8))&uint32(SQLITE_OPEN_NOMUTEX) != 0) { goto __4 } isThreadsafe = 0 goto __5 __4: if !(*(*uint32)(unsafe.Pointer(bp + 8))&uint32(SQLITE_OPEN_FULLMUTEX) != 0) { goto __6 } isThreadsafe = 1 goto __7 __6: isThreadsafe = int32(Xsqlite3Config.FbFullMutex) __7: ; __5: ; __3: ; if !(*(*uint32)(unsafe.Pointer(bp + 8))&uint32(SQLITE_OPEN_PRIVATECACHE) != 0) { goto __8 } *(*uint32)(unsafe.Pointer(bp + 8)) &= libc.Uint32FromInt32(libc.CplInt32(SQLITE_OPEN_SHAREDCACHE)) goto __9 __8: if !(Xsqlite3Config.FsharedCacheEnabled != 0) { goto __10 } *(*uint32)(unsafe.Pointer(bp + 8)) |= uint32(SQLITE_OPEN_SHAREDCACHE) __10: ; __9: ; *(*uint32)(unsafe.Pointer(bp + 8)) &= libc.Uint32FromInt32(libc.CplInt32(SQLITE_OPEN_DELETEONCLOSE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TRANSIENT_DB | SQLITE_OPEN_MAIN_JOURNAL | SQLITE_OPEN_TEMP_JOURNAL | SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_SUPER_JOURNAL | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_WAL)) db = Xsqlite3MallocZero(tls, uint64(unsafe.Sizeof(Sqlite3{}))) if !(db == uintptr(0)) { goto __11 } goto opendb_out __11: ; if !(isThreadsafe != 0) { goto __12 } (*Sqlite3)(unsafe.Pointer(db)).Fmutex = Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_RECURSIVE) if !((*Sqlite3)(unsafe.Pointer(db)).Fmutex == uintptr(0)) { goto __13 } Xsqlite3_free(tls, db) db = uintptr(0) goto opendb_out __13: ; if !(isThreadsafe == 0) { goto __14 } __14: ; __12: ; Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FerrMask = func() int32 { if *(*uint32)(unsafe.Pointer(bp + 8))&uint32(SQLITE_OPEN_EXRESCODE) != uint32(0) { return libc.Int32FromUint32(0xffffffff) } return 0xff }() (*Sqlite3)(unsafe.Pointer(db)).FnDb = 2 (*Sqlite3)(unsafe.Pointer(db)).FeOpenState = U8(SQLITE_STATE_BUSY) (*Sqlite3)(unsafe.Pointer(db)).FaDb = db + 696 (*Sqlite3)(unsafe.Pointer(db)).Flookaside.FbDisable = U32(1) (*Sqlite3)(unsafe.Pointer(db)).Flookaside.Fsz = U16(0) libc.Xmemcpy(tls, db+136, uintptr(unsafe.Pointer(&aHardLimit)), uint64(unsafe.Sizeof([12]int32{}))) *(*int32)(unsafe.Pointer(db + 136 + 11*4)) = SQLITE_DEFAULT_WORKER_THREADS (*Sqlite3)(unsafe.Pointer(db)).FautoCommit = U8(1) (*Sqlite3)(unsafe.Pointer(db)).FnextAutovac = int8(-1) (*Sqlite3)(unsafe.Pointer(db)).FszMmap = Xsqlite3Config.FszMmap (*Sqlite3)(unsafe.Pointer(db)).FnextPagesize = 0 (*Sqlite3)(unsafe.Pointer(db)).Finit.FazInit = uintptr(unsafe.Pointer(&Xsqlite3StdType)) *(*U64)(unsafe.Pointer(db + 48)) |= uint64(uint32(SQLITE_ShortColNames| SQLITE_EnableTrigger) | SQLITE_EnableView | uint32(SQLITE_CacheSpill) | uint32(SQLITE_TrustedSchema) | uint32(SQLITE_DqsDML) | uint32(SQLITE_DqsDDL) | uint32(SQLITE_AutoIndex)) Xsqlite3HashInit(tls, db+648) Xsqlite3HashInit(tls, db+576) createCollation(tls, db, uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)), uint8(SQLITE_UTF8), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 }{binCollFunc})), uintptr(0)) createCollation(tls, db, uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)), uint8(SQLITE_UTF16BE), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 }{binCollFunc})), uintptr(0)) createCollation(tls, db, uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)), uint8(SQLITE_UTF16LE), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 }{binCollFunc})), uintptr(0)) createCollation(tls, db, ts+23279, uint8(SQLITE_UTF8), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 }{nocaseCollatingFunc})), uintptr(0)) createCollation(tls, db, ts+25773, uint8(SQLITE_UTF8), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32 }{rtrimCollFunc})), uintptr(0)) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __15 } goto opendb_out __15: ; (*Sqlite3)(unsafe.Pointer(db)).FopenFlags = *(*uint32)(unsafe.Pointer(bp + 8)) if !(int32(1)<<(*(*uint32)(unsafe.Pointer(bp + 8))&uint32(7))&0x46 == 0) { goto __16 } rc = Xsqlite3MisuseError(tls, 177397) goto __17 __16: rc = Xsqlite3ParseUri(tls, zVfs, zFilename, bp+8, db, bp+16, bp+24) __17: ; if !(rc != SQLITE_OK) { goto __18 } if !(rc == SQLITE_NOMEM) { goto __19 } Xsqlite3OomFault(tls, db) __19: ; Xsqlite3ErrorWithMsg(tls, db, rc, func() uintptr { if *(*uintptr)(unsafe.Pointer(bp + 24)) != 0 { return ts + 4493 } return uintptr(0) }(), libc.VaList(bp, *(*uintptr)(unsafe.Pointer(bp + 24)))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) goto opendb_out __18: ; rc = Xsqlite3BtreeOpen(tls, (*Sqlite3)(unsafe.Pointer(db)).FpVfs, *(*uintptr)(unsafe.Pointer(bp + 16)), db, (*Sqlite3)(unsafe.Pointer(db)).FaDb+8, 0, int32(*(*uint32)(unsafe.Pointer(bp + 8))|uint32(SQLITE_OPEN_MAIN_DB))) if !(rc != SQLITE_OK) { goto __20 } if !(rc == SQLITE_IOERR|int32(12)<<8) { goto __21 } rc = SQLITE_NOMEM __21: ; Xsqlite3Error(tls, db, rc) goto opendb_out __20: ; Xsqlite3BtreeEnter(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpBt) (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema = Xsqlite3SchemaGet(tls, db, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpBt) if !!(int32((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed) != 0) { goto __22 } Xsqlite3SetTextEncoding(tls, db, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema)).Fenc) __22: ; Xsqlite3BtreeLeave(tls, (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpBt) (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).FpSchema = Xsqlite3SchemaGet(tls, db, uintptr(0)) (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FzDbSName = ts + 7793 (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).Fsafety_level = U8(SQLITE_DEFAULT_SYNCHRONOUS + 1) (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).FzDbSName = ts + 24768 (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + 1*32)).Fsafety_level = U8(PAGER_SYNCHRONOUS_OFF) (*Sqlite3)(unsafe.Pointer(db)).FeOpenState = U8(SQLITE_STATE_OPEN) if !((*Sqlite3)(unsafe.Pointer(db)).FmallocFailed != 0) { goto __23 } goto opendb_out __23: ; Xsqlite3Error(tls, db, SQLITE_OK) Xsqlite3RegisterPerConnectionBuiltinFunctions(tls, db) rc = Xsqlite3_errcode(tls, db) i = 0 __24: if !(rc == SQLITE_OK && i < int32(uint64(unsafe.Sizeof(sqlite3BuiltinExtensions))/uint64(unsafe.Sizeof(uintptr(0))))) { goto __26 } rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{sqlite3BuiltinExtensions[i]})).f(tls, db) goto __25 __25: i++ goto __24 goto __26 __26: ; if !(rc == SQLITE_OK) { goto __27 } Xsqlite3AutoLoadExtensions(tls, db) rc = Xsqlite3_errcode(tls, db) if !(rc != SQLITE_OK) { goto __28 } goto opendb_out __28: ; __27: ; if !(rc != 0) { goto __29 } Xsqlite3Error(tls, db, rc) __29: ; setupLookaside(tls, db, uintptr(0), Xsqlite3Config.FszLookaside, Xsqlite3Config.FnLookaside) Xsqlite3_wal_autocheckpoint(tls, db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT) opendb_out: if !(db != 0) { goto __30 } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) __30: ; rc = Xsqlite3_errcode(tls, db) if !(rc&0xff == SQLITE_NOMEM) { goto __31 } Xsqlite3_close(tls, db) db = uintptr(0) goto __32 __31: if !(rc != SQLITE_OK) { goto __33 } (*Sqlite3)(unsafe.Pointer(db)).FeOpenState = U8(SQLITE_STATE_SICK) __33: ; __32: ; *(*uintptr)(unsafe.Pointer(ppDb)) = db Xsqlite3_free_filename(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) return rc } // Open a new database handle. func Xsqlite3_open(tls *libc.TLS, zFilename uintptr, ppDb uintptr) int32 { return openDatabase(tls, zFilename, ppDb, uint32(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE), uintptr(0)) } func Xsqlite3_open_v2(tls *libc.TLS, filename uintptr, ppDb uintptr, flags int32, zVfs uintptr) int32 { return openDatabase(tls, filename, ppDb, uint32(flags), zVfs) } // Open a new database handle. func Xsqlite3_open16(tls *libc.TLS, zFilename uintptr, ppDb uintptr) int32 { var zFilename8 uintptr var pVal uintptr var rc int32 *(*uintptr)(unsafe.Pointer(ppDb)) = uintptr(0) rc = Xsqlite3_initialize(tls) if rc != 0 { return rc } if zFilename == uintptr(0) { zFilename = ts + 25779 } pVal = Xsqlite3ValueNew(tls, uintptr(0)) Xsqlite3ValueSetStr(tls, pVal, -1, zFilename, uint8(SQLITE_UTF16LE), uintptr(0)) zFilename8 = Xsqlite3ValueText(tls, pVal, uint8(SQLITE_UTF8)) if zFilename8 != 0 { rc = openDatabase(tls, zFilename8, ppDb, uint32(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE), uintptr(0)) if rc == SQLITE_OK && !(int32((*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppDb)))).FaDb)).FpSchema)).FschemaFlags)&DB_SchemaLoaded == DB_SchemaLoaded) { (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(ppDb)))).FaDb)).FpSchema)).Fenc = libc.AssignPtrUint8(*(*uintptr)(unsafe.Pointer(ppDb))+100, U8(SQLITE_UTF16LE)) } } else { rc = SQLITE_NOMEM } Xsqlite3ValueFree(tls, pVal) return rc & 0xff } // Register a new collation sequence with the database handle db. func Xsqlite3_create_collation(tls *libc.TLS, db uintptr, zName uintptr, enc int32, pCtx uintptr, xCompare uintptr) int32 { return Xsqlite3_create_collation_v2(tls, db, zName, enc, pCtx, xCompare, uintptr(0)) } // Register a new collation sequence with the database handle db. func Xsqlite3_create_collation_v2(tls *libc.TLS, db uintptr, zName uintptr, enc int32, pCtx uintptr, xCompare uintptr, xDel uintptr) int32 { var rc int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) rc = createCollation(tls, db, zName, U8(enc), pCtx, xCompare, xDel) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Register a new collation sequence with the database handle db. func Xsqlite3_create_collation16(tls *libc.TLS, db uintptr, zName uintptr, enc int32, pCtx uintptr, xCompare uintptr) int32 { var rc int32 = SQLITE_OK var zName8 uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) zName8 = Xsqlite3Utf16to8(tls, db, zName, -1, uint8(SQLITE_UTF16LE)) if zName8 != 0 { rc = createCollation(tls, db, zName8, U8(enc), pCtx, xCompare, uintptr(0)) Xsqlite3DbFree(tls, db, zName8) } rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Register a collation sequence factory callback with the database handle // db. Replace any previously installed collation sequence factory. func Xsqlite3_collation_needed(tls *libc.TLS, db uintptr, pCollNeededArg uintptr, xCollNeeded uintptr) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded = xCollNeeded (*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded16 = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).FpCollNeededArg = pCollNeededArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } // Register a collation sequence factory callback with the database handle // db. Replace any previously installed collation sequence factory. func Xsqlite3_collation_needed16(tls *libc.TLS, db uintptr, pCollNeededArg uintptr, xCollNeeded16 uintptr) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).FxCollNeeded16 = xCollNeeded16 (*Sqlite3)(unsafe.Pointer(db)).FpCollNeededArg = pCollNeededArg Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } // This function is now an anachronism. It used to be used to recover from a // malloc() failure, but SQLite now does this automatically. func Xsqlite3_global_recover(tls *libc.TLS) int32 { return SQLITE_OK } // Test to see whether or not the database connection is in autocommit // mode. Return TRUE if it is and FALSE if not. Autocommit mode is on // by default. Autocommit is disabled by a BEGIN statement and reenabled // by the next COMMIT or ROLLBACK. func Xsqlite3_get_autocommit(tls *libc.TLS, db uintptr) int32 { return int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) } // The following routines are substitutes for constants SQLITE_CORRUPT, // SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_NOMEM and possibly other error // constants. They serve two purposes: // // 1. Serve as a convenient place to set a breakpoint in a debugger // to detect when version error conditions occurs. // // 2. Invoke sqlite3_log() to provide the source code location where // a low-level error is first detected. func Xsqlite3ReportError(tls *libc.TLS, iErr int32, lineno int32, zType uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) Xsqlite3_log(tls, iErr, ts+25782, libc.VaList(bp, zType, lineno, uintptr(20)+Xsqlite3_sourceid(tls))) return iErr } func Xsqlite3CorruptError(tls *libc.TLS, lineno int32) int32 { return Xsqlite3ReportError(tls, SQLITE_CORRUPT, lineno, ts+25807) } func Xsqlite3MisuseError(tls *libc.TLS, lineno int32) int32 { return Xsqlite3ReportError(tls, SQLITE_MISUSE, lineno, ts+25827) } func Xsqlite3CantopenError(tls *libc.TLS, lineno int32) int32 { return Xsqlite3ReportError(tls, SQLITE_CANTOPEN, lineno, ts+25834) } // This is a convenience routine that makes sure that all thread-specific // data for this thread has been deallocated. // // SQLite no longer uses thread-specific data so this routine is now a // no-op. It is retained for historical compatibility. func Xsqlite3_thread_cleanup(tls *libc.TLS) { } // Return meta information about a specific column of a database table. // See comment in sqlite3.h (sqlite.h.in) for details. func Xsqlite3_table_column_metadata(tls *libc.TLS, db uintptr, zDbName uintptr, zTableName uintptr, zColumnName uintptr, pzDataType uintptr, pzCollSeq uintptr, pNotNull uintptr, pPrimaryKey uintptr, pAutoinc uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var rc int32 var pTab uintptr var pCol uintptr var iCol int32 var zDataType uintptr var zCollSeq uintptr var notnull int32 var primarykey int32 var autoinc int32 *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) pTab = uintptr(0) pCol = uintptr(0) iCol = 0 zDataType = uintptr(0) zCollSeq = uintptr(0) notnull = 0 primarykey = 0 autoinc = 0 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) Xsqlite3BtreeEnterAll(tls, db) rc = Xsqlite3Init(tls, db, bp+24) if !(SQLITE_OK != rc) { goto __1 } goto error_out __1: ; pTab = Xsqlite3FindTable(tls, db, zTableName, zDbName) if !(!(pTab != 0) || int32((*Table)(unsafe.Pointer(pTab)).FeTabType) == TABTYP_VIEW) { goto __2 } pTab = uintptr(0) goto error_out __2: ; if !(zColumnName == uintptr(0)) { goto __3 } goto __4 __3: iCol = 0 __5: if !(iCol < int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __7 } pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24 if !(0 == Xsqlite3StrICmp(tls, (*Column)(unsafe.Pointer(pCol)).FzCnName, zColumnName)) { goto __8 } goto __7 __8: ; goto __6 __6: iCol++ goto __5 goto __7 __7: ; if !(iCol == int32((*Table)(unsafe.Pointer(pTab)).FnCol)) { goto __9 } if !((*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_WithoutRowid) == U32(0) && Xsqlite3IsRowid(tls, zColumnName) != 0) { goto __10 } iCol = int32((*Table)(unsafe.Pointer(pTab)).FiPKey) if iCol >= 0 { pCol = (*Table)(unsafe.Pointer(pTab)).FaCol + uintptr(iCol)*24 } else { pCol = uintptr(0) } goto __11 __10: pTab = uintptr(0) goto error_out __11: ; __9: ; __4: ; if !(pCol != 0) { goto __12 } zDataType = Xsqlite3ColumnType(tls, pCol, uintptr(0)) zCollSeq = Xsqlite3ColumnColl(tls, pCol) notnull = libc.Bool32(int32(*(*uint8)(unsafe.Pointer(pCol + 8))&0xf>>0) != 0) primarykey = libc.Bool32(int32((*Column)(unsafe.Pointer(pCol)).FcolFlags)&COLFLAG_PRIMKEY != 0) autoinc = libc.Bool32(int32((*Table)(unsafe.Pointer(pTab)).FiPKey) == iCol && (*Table)(unsafe.Pointer(pTab)).FtabFlags&U32(TF_Autoincrement) != U32(0)) goto __13 __12: zDataType = ts + 1109 primarykey = 1 __13: ; if !!(zCollSeq != 0) { goto __14 } zCollSeq = uintptr(unsafe.Pointer(&Xsqlite3StrBINARY)) __14: ; error_out: Xsqlite3BtreeLeaveAll(tls, db) if !(pzDataType != 0) { goto __15 } *(*uintptr)(unsafe.Pointer(pzDataType)) = zDataType __15: ; if !(pzCollSeq != 0) { goto __16 } *(*uintptr)(unsafe.Pointer(pzCollSeq)) = zCollSeq __16: ; if !(pNotNull != 0) { goto __17 } *(*int32)(unsafe.Pointer(pNotNull)) = notnull __17: ; if !(pPrimaryKey != 0) { goto __18 } *(*int32)(unsafe.Pointer(pPrimaryKey)) = primarykey __18: ; if !(pAutoinc != 0) { goto __19 } *(*int32)(unsafe.Pointer(pAutoinc)) = autoinc __19: ; if !(SQLITE_OK == rc && !(pTab != 0)) { goto __20 } Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 24))) *(*uintptr)(unsafe.Pointer(bp + 24)) = Xsqlite3MPrintf(tls, db, ts+25851, libc.VaList(bp, zTableName, zColumnName)) rc = SQLITE_ERROR __20: ; Xsqlite3ErrorWithMsg(tls, db, rc, func() uintptr { if *(*uintptr)(unsafe.Pointer(bp + 24)) != 0 { return ts + 4493 } return uintptr(0) }(), libc.VaList(bp+16, *(*uintptr)(unsafe.Pointer(bp + 24)))) Xsqlite3DbFree(tls, db, *(*uintptr)(unsafe.Pointer(bp + 24))) rc = Xsqlite3ApiExit(tls, db, rc) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Sleep for a little while. Return the amount of time slept. func Xsqlite3_sleep(tls *libc.TLS, ms int32) int32 { var pVfs uintptr var rc int32 pVfs = Xsqlite3_vfs_find(tls, uintptr(0)) if pVfs == uintptr(0) { return 0 } rc = Xsqlite3OsSleep(tls, pVfs, 1000*ms) / 1000 return rc } // Enable or disable the extended result codes. func Xsqlite3_extended_result_codes(tls *libc.TLS, db uintptr, onoff int32) int32 { Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) (*Sqlite3)(unsafe.Pointer(db)).FerrMask = func() int32 { if onoff != 0 { return libc.Int32FromUint32(0xffffffff) } return 0xff }() Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return SQLITE_OK } // Invoke the xFileControl method on a particular database. func Xsqlite3_file_control(tls *libc.TLS, db uintptr, zDbName uintptr, op int32, pArg uintptr) int32 { var rc int32 = SQLITE_ERROR var pBtree uintptr Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) pBtree = Xsqlite3DbNameToBtree(tls, db, zDbName) if pBtree != 0 { var pPager uintptr var fd uintptr Xsqlite3BtreeEnter(tls, pBtree) pPager = Xsqlite3BtreePager(tls, pBtree) fd = Xsqlite3PagerFile(tls, pPager) if op == SQLITE_FCNTL_FILE_POINTER { *(*uintptr)(unsafe.Pointer(pArg)) = fd rc = SQLITE_OK } else if op == SQLITE_FCNTL_VFS_POINTER { *(*uintptr)(unsafe.Pointer(pArg)) = Xsqlite3PagerVfs(tls, pPager) rc = SQLITE_OK } else if op == SQLITE_FCNTL_JOURNAL_POINTER { *(*uintptr)(unsafe.Pointer(pArg)) = Xsqlite3PagerJrnlFile(tls, pPager) rc = SQLITE_OK } else if op == SQLITE_FCNTL_DATA_VERSION { *(*uint32)(unsafe.Pointer(pArg)) = Xsqlite3PagerDataVersion(tls, pPager) rc = SQLITE_OK } else if op == SQLITE_FCNTL_RESERVE_BYTES { var iNew int32 = *(*int32)(unsafe.Pointer(pArg)) *(*int32)(unsafe.Pointer(pArg)) = Xsqlite3BtreeGetRequestedReserve(tls, pBtree) if iNew >= 0 && iNew <= 255 { Xsqlite3BtreeSetPageSize(tls, pBtree, 0, iNew, 0) } rc = SQLITE_OK } else if op == SQLITE_FCNTL_RESET_CACHE { Xsqlite3BtreeClearCache(tls, pBtree) rc = SQLITE_OK } else { var nSave int32 = (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FnBusy rc = Xsqlite3OsFileControl(tls, fd, op, pArg) (*Sqlite3)(unsafe.Pointer(db)).FbusyHandler.FnBusy = nSave } Xsqlite3BtreeLeave(tls, pBtree) } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Interface to the testing logic. func Xsqlite3_test_control(tls *libc.TLS, op int32, va uintptr) int32 { var rc int32 = 0 var ap Va_list _ = ap ap = va switch op { case SQLITE_TESTCTRL_PRNG_SAVE: { Xsqlite3PrngSaveState(tls) break } case SQLITE_TESTCTRL_PRNG_RESTORE: { Xsqlite3PrngRestoreState(tls) break } case SQLITE_TESTCTRL_PRNG_SEED: { var x int32 = libc.VaInt32(&ap) var y int32 var db uintptr = libc.VaUintptr(&ap) if db != 0 && libc.AssignInt32(&y, (*Schema)(unsafe.Pointer((*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb)).FpSchema)).Fschema_cookie) != 0 { x = y } Xsqlite3Config.FiPrngSeed = uint32(x) Xsqlite3_randomness(tls, 0, uintptr(0)) break } case SQLITE_TESTCTRL_BITVEC_TEST: { var sz int32 = libc.VaInt32(&ap) var aProg uintptr = libc.VaUintptr(&ap) rc = Xsqlite3BitvecBuiltinTest(tls, sz, aProg) break } case SQLITE_TESTCTRL_FAULT_INSTALL: { Xsqlite3Config.FxTestCallback = libc.VaUintptr(&ap) rc = Xsqlite3FaultSim(tls, 0) break } case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: { var xBenignBegin uintptr var xBenignEnd uintptr xBenignBegin = libc.VaUintptr(&ap) xBenignEnd = libc.VaUintptr(&ap) Xsqlite3BenignMallocHooks(tls, xBenignBegin, xBenignEnd) break } case SQLITE_TESTCTRL_PENDING_BYTE: { rc = Xsqlite3PendingByte { var newVal uint32 = libc.VaUint32(&ap) if newVal != 0 { Xsqlite3PendingByte = int32(newVal) } } break } case SQLITE_TESTCTRL_ASSERT: { var x int32 = 0 rc = x break } case SQLITE_TESTCTRL_ALWAYS: { var x int32 = libc.VaInt32(&ap) if x != 0 { rc = x } else { rc = 0 } break } case SQLITE_TESTCTRL_BYTEORDER: { rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN break } case SQLITE_TESTCTRL_OPTIMIZATIONS: { var db uintptr = libc.VaUintptr(&ap) (*Sqlite3)(unsafe.Pointer(db)).FdbOptFlags = libc.VaUint32(&ap) break } case SQLITE_TESTCTRL_LOCALTIME_FAULT: { Xsqlite3Config.FbLocaltimeFault = libc.VaInt32(&ap) if Xsqlite3Config.FbLocaltimeFault == 2 { Xsqlite3Config.FxAltLocaltime = libc.VaUintptr(&ap) } else { Xsqlite3Config.FxAltLocaltime = uintptr(0) } break } case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { var db uintptr = libc.VaUintptr(&ap) *(*U32)(unsafe.Pointer(db + 44)) ^= U32(DBFLAG_InternalFunc) break } case SQLITE_TESTCTRL_NEVER_CORRUPT: { Xsqlite3Config.FneverCorrupt = libc.VaInt32(&ap) break } case SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS: { Xsqlite3Config.FbExtraSchemaChecks = U8(libc.VaInt32(&ap)) break } case SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD: { Xsqlite3Config.FiOnceResetThreshold = libc.VaInt32(&ap) break } case SQLITE_TESTCTRL_VDBE_COVERAGE: { break } case SQLITE_TESTCTRL_SORTER_MMAP: { var db uintptr = libc.VaUintptr(&ap) (*Sqlite3)(unsafe.Pointer(db)).FnMaxSorterMmap = libc.VaInt32(&ap) break } case SQLITE_TESTCTRL_ISINIT: { if Xsqlite3Config.FisInit == 0 { rc = SQLITE_ERROR } break } case SQLITE_TESTCTRL_IMPOSTER: { var db uintptr = libc.VaUintptr(&ap) var iDb int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) iDb = Xsqlite3FindDbName(tls, db, libc.VaUintptr(&ap)) if iDb >= 0 { (*Sqlite3)(unsafe.Pointer(db)).Finit.FiDb = U8(iDb) (*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy = U8(libc.AssignBitFieldPtr8Uint32(db+192+8, uint32(libc.VaInt32(&ap)), 1, 1, 0x2)) (*Sqlite3)(unsafe.Pointer(db)).Finit.FnewTnum = Pgno(libc.VaInt32(&ap)) if int32((*Sqlite3)(unsafe.Pointer(db)).Finit.Fbusy) == 0 && (*Sqlite3)(unsafe.Pointer(db)).Finit.FnewTnum > Pgno(0) { Xsqlite3ResetAllSchemasOfConnection(tls, db) } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) break } case SQLITE_TESTCTRL_RESULT_INTREAL: { var pCtx uintptr = libc.VaUintptr(&ap) Xsqlite3ResultIntReal(tls, pCtx) break } case SQLITE_TESTCTRL_SEEK_COUNT: { var db uintptr = libc.VaUintptr(&ap) _ = db var pn uintptr = libc.VaUintptr(&ap) *(*U64)(unsafe.Pointer(pn)) = uint64(0) _ = db break } case SQLITE_TESTCTRL_TRACEFLAGS: { var opTrace int32 = libc.VaInt32(&ap) var ptr uintptr = libc.VaUintptr(&ap) switch opTrace { case 0: *(*U32)(unsafe.Pointer(ptr)) = Xsqlite3TreeTrace break case 1: Xsqlite3TreeTrace = *(*U32)(unsafe.Pointer(ptr)) break case 2: *(*U32)(unsafe.Pointer(ptr)) = Xsqlite3WhereTrace break case 3: Xsqlite3WhereTrace = *(*U32)(unsafe.Pointer(ptr)) break } break } case SQLITE_TESTCTRL_LOGEST: { var rIn float64 = libc.VaFloat64(&ap) var rLogEst LogEst = Xsqlite3LogEstFromDouble(tls, rIn) var pI1 uintptr = libc.VaUintptr(&ap) var pU64 uintptr = libc.VaUintptr(&ap) var pI2 uintptr = libc.VaUintptr(&ap) *(*int32)(unsafe.Pointer(pI1)) = int32(rLogEst) *(*U64)(unsafe.Pointer(pU64)) = Xsqlite3LogEstToInt(tls, rLogEst) *(*int32)(unsafe.Pointer(pI2)) = int32(Xsqlite3LogEst(tls, *(*U64)(unsafe.Pointer(pU64)))) break } } _ = ap return rc } func databaseName(tls *libc.TLS, zName uintptr) uintptr { for int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-1)))) != 0 || int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-2)))) != 0 || int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-3)))) != 0 || int32(*(*int8)(unsafe.Pointer(zName + libc.UintptrFromInt32(-4)))) != 0 { zName-- } return zName } func appendText(tls *libc.TLS, p uintptr, z uintptr) uintptr { var n Size_t = libc.Xstrlen(tls, z) libc.Xmemcpy(tls, p, z, n+uint64(1)) return p + uintptr(n) + uintptr(1) } // Allocate memory to hold names for a database, journal file, WAL file, // and query parameters. The pointer returned is valid for use by // sqlite3_filename_database() and sqlite3_uri_parameter() and related // functions. // // Memory layout must be compatible with that generated by the pager // and expected by sqlite3_uri_parameter() and databaseName(). func Xsqlite3_create_filename(tls *libc.TLS, zDatabase uintptr, zJournal uintptr, zWal uintptr, nParam int32, azParam uintptr) uintptr { var nByte Sqlite3_int64 var i int32 var pResult uintptr var p uintptr nByte = Sqlite3_int64(libc.Xstrlen(tls, zDatabase) + libc.Xstrlen(tls, zJournal) + libc.Xstrlen(tls, zWal) + uint64(10)) for i = 0; i < nParam*2; i++ { nByte = Sqlite3_int64(Size_t(nByte) + (libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(azParam + uintptr(i)*8))) + uint64(1))) } pResult = libc.AssignUintptr(&p, Xsqlite3_malloc64(tls, uint64(nByte))) if p == uintptr(0) { return uintptr(0) } libc.Xmemset(tls, p, 0, uint64(4)) p += uintptr(4) p = appendText(tls, p, zDatabase) for i = 0; i < nParam*2; i++ { p = appendText(tls, p, *(*uintptr)(unsafe.Pointer(azParam + uintptr(i)*8))) } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&p, 1))) = int8(0) p = appendText(tls, p, zJournal) p = appendText(tls, p, zWal) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&p, 1))) = int8(0) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&p, 1))) = int8(0) return pResult + uintptr(4) } // Free memory obtained from sqlite3_create_filename(). It is a severe // error to call this routine with any parameter other than a pointer // previously obtained from sqlite3_create_filename() or a NULL pointer. func Xsqlite3_free_filename(tls *libc.TLS, p uintptr) { if p == uintptr(0) { return } p = databaseName(tls, p) Xsqlite3_free(tls, p-uintptr(4)) } // This is a utility routine, useful to VFS implementations, that checks // to see if a database file was a URI that contained a specific query // parameter, and if so obtains the value of the query parameter. // // The zFilename argument is the filename pointer passed into the xOpen() // method of a VFS implementation. The zParam argument is the name of the // query parameter we seek. This routine returns the value of the zParam // parameter if it exists. If the parameter does not exist, this routine // returns a NULL pointer. func Xsqlite3_uri_parameter(tls *libc.TLS, zFilename uintptr, zParam uintptr) uintptr { if zFilename == uintptr(0) || zParam == uintptr(0) { return uintptr(0) } zFilename = databaseName(tls, zFilename) return uriParameter(tls, zFilename, zParam) } // Return a pointer to the name of Nth query parameter of the filename. func Xsqlite3_uri_key(tls *libc.TLS, zFilename uintptr, N int32) uintptr { if zFilename == uintptr(0) || N < 0 { return uintptr(0) } zFilename = databaseName(tls, zFilename) zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) for zFilename != 0 && *(*int8)(unsafe.Pointer(zFilename)) != 0 && libc.PostDecInt32(&N, 1) > 0 { zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) } if *(*int8)(unsafe.Pointer(zFilename)) != 0 { return zFilename } return uintptr(0) } // Return a boolean value for a query parameter. func Xsqlite3_uri_boolean(tls *libc.TLS, zFilename uintptr, zParam uintptr, bDflt int32) int32 { var z uintptr = Xsqlite3_uri_parameter(tls, zFilename, zParam) bDflt = libc.Bool32(bDflt != 0) if z != 0 { return int32(Xsqlite3GetBoolean(tls, z, uint8(bDflt))) } return bDflt } // Return a 64-bit integer value for a query parameter. func Xsqlite3_uri_int64(tls *libc.TLS, zFilename uintptr, zParam uintptr, bDflt Sqlite3_int64) Sqlite3_int64 { bp := tls.Alloc(8) defer tls.Free(8) var z uintptr = Xsqlite3_uri_parameter(tls, zFilename, zParam) if z != 0 && Xsqlite3DecOrHexToI64(tls, z, bp) == 0 { bDflt = *(*Sqlite3_int64)(unsafe.Pointer(bp)) } return bDflt } // Translate a filename that was handed to a VFS routine into the corresponding // database, journal, or WAL file. // // It is an error to pass this routine a filename string that was not // passed into the VFS from the SQLite core. Doing so is similar to // passing free() a pointer that was not obtained from malloc() - it is // an error that we cannot easily detect but that will likely cause memory // corruption. func Xsqlite3_filename_database(tls *libc.TLS, zFilename uintptr) uintptr { if zFilename == uintptr(0) { return uintptr(0) } return databaseName(tls, zFilename) } func Xsqlite3_filename_journal(tls *libc.TLS, zFilename uintptr) uintptr { if zFilename == uintptr(0) { return uintptr(0) } zFilename = databaseName(tls, zFilename) zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) for zFilename != 0 && *(*int8)(unsafe.Pointer(zFilename)) != 0 { zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) } return zFilename + uintptr(1) } func Xsqlite3_filename_wal(tls *libc.TLS, zFilename uintptr) uintptr { zFilename = Xsqlite3_filename_journal(tls, zFilename) if zFilename != 0 { zFilename += uintptr(Xsqlite3Strlen30(tls, zFilename) + 1) } return zFilename } // Return the Btree pointer identified by zDbName. Return NULL if not found. func Xsqlite3DbNameToBtree(tls *libc.TLS, db uintptr, zDbName uintptr) uintptr { var iDb int32 if zDbName != 0 { iDb = Xsqlite3FindDbName(tls, db, zDbName) } else { iDb = 0 } if iDb < 0 { return uintptr(0) } return (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt } // Return the name of the N-th database schema. Return NULL if N is out // of range. func Xsqlite3_db_name(tls *libc.TLS, db uintptr, N int32) uintptr { if N < 0 || N >= (*Sqlite3)(unsafe.Pointer(db)).FnDb { return uintptr(0) } else { return (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(N)*32)).FzDbSName } return uintptr(0) } // Return the filename of the database associated with a database // connection. func Xsqlite3_db_filename(tls *libc.TLS, db uintptr, zDbName uintptr) uintptr { var pBt uintptr pBt = Xsqlite3DbNameToBtree(tls, db, zDbName) if pBt != 0 { return Xsqlite3BtreeGetFilename(tls, pBt) } return uintptr(0) } // Return 1 if database is read-only or 0 if read/write. Return -1 if // no such database exists. func Xsqlite3_db_readonly(tls *libc.TLS, db uintptr, zDbName uintptr) int32 { var pBt uintptr pBt = Xsqlite3DbNameToBtree(tls, db, zDbName) if pBt != 0 { return Xsqlite3BtreeIsReadonly(tls, pBt) } return -1 } // Obtain a snapshot handle for the snapshot of database zDb currently // being read by handle db. func Xsqlite3_snapshot_get(tls *libc.TLS, db uintptr, zDb uintptr, ppSnapshot uintptr) int32 { var rc int32 = SQLITE_ERROR Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) == 0 { var iDb int32 = Xsqlite3FindDbName(tls, db, zDb) if iDb == 0 || iDb > 1 { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt if SQLITE_TXN_WRITE != Xsqlite3BtreeTxnState(tls, pBt) { rc = Xsqlite3BtreeBeginTrans(tls, pBt, 0, uintptr(0)) if rc == SQLITE_OK { rc = Xsqlite3PagerSnapshotGet(tls, Xsqlite3BtreePager(tls, pBt), ppSnapshot) } } } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Open a read-transaction on the snapshot idendified by pSnapshot. func Xsqlite3_snapshot_open(tls *libc.TLS, db uintptr, zDb uintptr, pSnapshot uintptr) int32 { var rc int32 = SQLITE_ERROR Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) if int32((*Sqlite3)(unsafe.Pointer(db)).FautoCommit) == 0 { var iDb int32 iDb = Xsqlite3FindDbName(tls, db, zDb) if iDb == 0 || iDb > 1 { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt if Xsqlite3BtreeTxnState(tls, pBt) != SQLITE_TXN_WRITE { var pPager uintptr = Xsqlite3BtreePager(tls, pBt) var bUnlock int32 = 0 if Xsqlite3BtreeTxnState(tls, pBt) != SQLITE_TXN_NONE { if (*Sqlite3)(unsafe.Pointer(db)).FnVdbeActive == 0 { rc = Xsqlite3PagerSnapshotCheck(tls, pPager, pSnapshot) if rc == SQLITE_OK { bUnlock = 1 rc = Xsqlite3BtreeCommit(tls, pBt) } } } else { rc = SQLITE_OK } if rc == SQLITE_OK { rc = Xsqlite3PagerSnapshotOpen(tls, pPager, pSnapshot) } if rc == SQLITE_OK { rc = Xsqlite3BtreeBeginTrans(tls, pBt, 0, uintptr(0)) Xsqlite3PagerSnapshotOpen(tls, pPager, uintptr(0)) } if bUnlock != 0 { Xsqlite3PagerSnapshotUnlock(tls, pPager) } } } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Recover as many snapshots as possible from the wal file associated with // schema zDb of database db. func Xsqlite3_snapshot_recover(tls *libc.TLS, db uintptr, zDb uintptr) int32 { var rc int32 = SQLITE_ERROR var iDb int32 Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) iDb = Xsqlite3FindDbName(tls, db, zDb) if iDb == 0 || iDb > 1 { var pBt uintptr = (*Db)(unsafe.Pointer((*Sqlite3)(unsafe.Pointer(db)).FaDb + uintptr(iDb)*32)).FpBt if SQLITE_TXN_NONE == Xsqlite3BtreeTxnState(tls, pBt) { rc = Xsqlite3BtreeBeginTrans(tls, pBt, 0, uintptr(0)) if rc == SQLITE_OK { rc = Xsqlite3PagerSnapshotRecover(tls, Xsqlite3BtreePager(tls, pBt)) Xsqlite3BtreeCommit(tls, pBt) } } } Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // Free a snapshot handle obtained from sqlite3_snapshot_get(). func Xsqlite3_snapshot_free(tls *libc.TLS, pSnapshot uintptr) { Xsqlite3_free(tls, pSnapshot) } // Given the name of a compile-time option, return true if that option // was used and false if not. // // The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix // is not required for a match. func Xsqlite3_compileoption_used(tls *libc.TLS, zOptName uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var i int32 var n int32 var azCompileOpt uintptr azCompileOpt = Xsqlite3CompileOptions(tls, bp) if Xsqlite3_strnicmp(tls, zOptName, ts+25879, 7) == 0 { zOptName += uintptr(7) } n = Xsqlite3Strlen30(tls, zOptName) for i = 0; i < *(*int32)(unsafe.Pointer(bp)); i++ { if Xsqlite3_strnicmp(tls, zOptName, *(*uintptr)(unsafe.Pointer(azCompileOpt + uintptr(i)*8)), n) == 0 && Xsqlite3IsIdChar(tls, uint8(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(azCompileOpt + uintptr(i)*8)) + uintptr(n))))) == 0 { return 1 } } return 0 } // Return the N-th compile-time option string. If N is out of range, // return a NULL pointer. func Xsqlite3_compileoption_get(tls *libc.TLS, N int32) uintptr { bp := tls.Alloc(4) defer tls.Free(4) var azCompileOpt uintptr azCompileOpt = Xsqlite3CompileOptions(tls, bp) if N >= 0 && N < *(*int32)(unsafe.Pointer(bp)) { return *(*uintptr)(unsafe.Pointer(azCompileOpt + uintptr(N)*8)) } return uintptr(0) } var sqlite3BlockedList uintptr = uintptr(0) func removeFromBlockedList(tls *libc.TLS, db uintptr) { var pp uintptr for pp = uintptr(unsafe.Pointer(&sqlite3BlockedList)); *(*uintptr)(unsafe.Pointer(pp)) != 0; pp = *(*uintptr)(unsafe.Pointer(pp)) + 840 { if *(*uintptr)(unsafe.Pointer(pp)) == db { *(*uintptr)(unsafe.Pointer(pp)) = (*Sqlite3)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FpNextBlocked break } } } func addToBlockedList(tls *libc.TLS, db uintptr) { var pp uintptr for pp = uintptr(unsafe.Pointer(&sqlite3BlockedList)); *(*uintptr)(unsafe.Pointer(pp)) != 0 && (*Sqlite3)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FxUnlockNotify != (*Sqlite3)(unsafe.Pointer(db)).FxUnlockNotify; pp = *(*uintptr)(unsafe.Pointer(pp)) + 840 { } (*Sqlite3)(unsafe.Pointer(db)).FpNextBlocked = *(*uintptr)(unsafe.Pointer(pp)) *(*uintptr)(unsafe.Pointer(pp)) = db } func enterMutex(tls *libc.TLS) { Xsqlite3_mutex_enter(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN)) } func leaveMutex(tls *libc.TLS) { Xsqlite3_mutex_leave(tls, Xsqlite3MutexAlloc(tls, SQLITE_MUTEX_STATIC_MAIN)) } // Register an unlock-notify callback. // // This is called after connection "db" has attempted some operation // but has received an SQLITE_LOCKED error because another connection // (call it pOther) in the same process was busy using the same shared // cache. pOther is found by looking at db->pBlockingConnection. // // If there is no blocking connection, the callback is invoked immediately, // before this routine returns. // // If pOther is already blocked on db, then report SQLITE_LOCKED, to indicate // a deadlock. // // Otherwise, make arrangements to invoke xNotify when pOther drops // its locks. // // Each call to this routine overrides any prior callbacks registered // on the same "db". If xNotify==0 then any prior callbacks are immediately // cancelled. func Xsqlite3_unlock_notify(tls *libc.TLS, db uintptr, xNotify uintptr, pArg uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = pArg var rc int32 = SQLITE_OK Xsqlite3_mutex_enter(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) enterMutex(tls) if xNotify == uintptr(0) { removeFromBlockedList(tls, db) (*Sqlite3)(unsafe.Pointer(db)).FpBlockingConnection = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).FpUnlockConnection = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).FxUnlockNotify = uintptr(0) (*Sqlite3)(unsafe.Pointer(db)).FpUnlockArg = uintptr(0) } else if uintptr(0) == (*Sqlite3)(unsafe.Pointer(db)).FpBlockingConnection { (*struct { f func(*libc.TLS, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{xNotify})).f(tls, bp, 1) } else { var p uintptr for p = (*Sqlite3)(unsafe.Pointer(db)).FpBlockingConnection; p != 0 && p != db; p = (*Sqlite3)(unsafe.Pointer(p)).FpUnlockConnection { } if p != 0 { rc = SQLITE_LOCKED } else { (*Sqlite3)(unsafe.Pointer(db)).FpUnlockConnection = (*Sqlite3)(unsafe.Pointer(db)).FpBlockingConnection (*Sqlite3)(unsafe.Pointer(db)).FxUnlockNotify = xNotify (*Sqlite3)(unsafe.Pointer(db)).FpUnlockArg = *(*uintptr)(unsafe.Pointer(bp)) removeFromBlockedList(tls, db) addToBlockedList(tls, db) } } leaveMutex(tls) Xsqlite3ErrorWithMsg(tls, db, rc, func() uintptr { if rc != 0 { return ts + 25887 } return uintptr(0) }(), 0) Xsqlite3_mutex_leave(tls, (*Sqlite3)(unsafe.Pointer(db)).Fmutex) return rc } // This function is called while stepping or preparing a statement // associated with connection db. The operation will return SQLITE_LOCKED // to the user because it requires a lock that will not be available // until connection pBlocker concludes its current transaction. func Xsqlite3ConnectionBlocked(tls *libc.TLS, db uintptr, pBlocker uintptr) { enterMutex(tls) if (*Sqlite3)(unsafe.Pointer(db)).FpBlockingConnection == uintptr(0) && (*Sqlite3)(unsafe.Pointer(db)).FpUnlockConnection == uintptr(0) { addToBlockedList(tls, db) } (*Sqlite3)(unsafe.Pointer(db)).FpBlockingConnection = pBlocker leaveMutex(tls) } // This function is called when // the transaction opened by database db has just finished. Locks held // by database connection db have been released. // // This function loops through each entry in the blocked connections // list and does the following: // // 1. If the sqlite3.pBlockingConnection member of a list entry is // set to db, then set pBlockingConnection=0. // // 2. If the sqlite3.pUnlockConnection member of a list entry is // set to db, then invoke the configured unlock-notify callback and // set pUnlockConnection=0. // // 3. If the two steps above mean that pBlockingConnection==0 and // pUnlockConnection==0, remove the entry from the blocked connections // list. func Xsqlite3ConnectionUnlocked(tls *libc.TLS, db uintptr) { bp := tls.Alloc(128) defer tls.Free(128) var xUnlockNotify uintptr = uintptr(0) var nArg int32 = 0 var pp uintptr var aArg uintptr var aDyn uintptr = uintptr(0) aArg = bp enterMutex(tls) for pp = uintptr(unsafe.Pointer(&sqlite3BlockedList)); *(*uintptr)(unsafe.Pointer(pp)) != 0; { var p uintptr = *(*uintptr)(unsafe.Pointer(pp)) if (*Sqlite3)(unsafe.Pointer(p)).FpBlockingConnection == db { (*Sqlite3)(unsafe.Pointer(p)).FpBlockingConnection = uintptr(0) } if (*Sqlite3)(unsafe.Pointer(p)).FpUnlockConnection == db { if (*Sqlite3)(unsafe.Pointer(p)).FxUnlockNotify != xUnlockNotify && nArg != 0 { (*struct { f func(*libc.TLS, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{xUnlockNotify})).f(tls, aArg, nArg) nArg = 0 } Xsqlite3BeginBenignMalloc(tls) if !(aDyn != 0) && nArg == int32(uint64(unsafe.Sizeof([16]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0)))) || aDyn != 0 && nArg == int32(uint64(Xsqlite3MallocSize(tls, aDyn))/uint64(unsafe.Sizeof(uintptr(0)))) { var pNew uintptr = Xsqlite3Malloc(tls, uint64(nArg)*uint64(unsafe.Sizeof(uintptr(0)))*uint64(2)) if pNew != 0 { libc.Xmemcpy(tls, pNew, aArg, uint64(nArg)*uint64(unsafe.Sizeof(uintptr(0)))) Xsqlite3_free(tls, aDyn) aDyn = libc.AssignUintptr(&aArg, pNew) } else { (*struct { f func(*libc.TLS, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{xUnlockNotify})).f(tls, aArg, nArg) nArg = 0 } } Xsqlite3EndBenignMalloc(tls) *(*uintptr)(unsafe.Pointer(aArg + uintptr(libc.PostIncInt32(&nArg, 1))*8)) = (*Sqlite3)(unsafe.Pointer(p)).FpUnlockArg xUnlockNotify = (*Sqlite3)(unsafe.Pointer(p)).FxUnlockNotify (*Sqlite3)(unsafe.Pointer(p)).FpUnlockConnection = uintptr(0) (*Sqlite3)(unsafe.Pointer(p)).FxUnlockNotify = uintptr(0) (*Sqlite3)(unsafe.Pointer(p)).FpUnlockArg = uintptr(0) } if (*Sqlite3)(unsafe.Pointer(p)).FpBlockingConnection == uintptr(0) && (*Sqlite3)(unsafe.Pointer(p)).FpUnlockConnection == uintptr(0) { *(*uintptr)(unsafe.Pointer(pp)) = (*Sqlite3)(unsafe.Pointer(p)).FpNextBlocked (*Sqlite3)(unsafe.Pointer(p)).FpNextBlocked = uintptr(0) } else { pp = p + 840 } } if nArg != 0 { (*struct { f func(*libc.TLS, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{xUnlockNotify})).f(tls, aArg, nArg) } Xsqlite3_free(tls, aDyn) leaveMutex(tls) } // This is called when the database connection passed as an argument is // being closed. The connection is removed from the blocked list. func Xsqlite3ConnectionClosed(tls *libc.TLS, db uintptr) { Xsqlite3ConnectionUnlocked(tls, db) enterMutex(tls) removeFromBlockedList(tls, db) leaveMutex(tls) } var jsonIsSpace = [256]int8{ int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(1), int8(1), int8(0), int8(0), int8(1), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(1), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), } // Objects type JsonString1 = struct { FpCtx uintptr FzBuf uintptr FnAlloc U64 FnUsed U64 FbStatic U8 FbErr U8 FzSpace [100]int8 F__ccgo_pad1 [2]byte } // Objects type JsonString = JsonString1 type JsonNode1 = struct { FeType U8 FjnFlags U8 FeU U8 F__ccgo_pad1 [1]byte Fn U32 Fu struct{ FzJContent uintptr } } type JsonNode = JsonNode1 type JsonParse1 = struct { FnNode U32 FnAlloc U32 FaNode uintptr FzJson uintptr FaUp uintptr Foom U8 FnErr U8 FiDepth U16 FnJson int32 FiHold U32 F__ccgo_pad1 [4]byte } type JsonParse = JsonParse1 var jsonType = [8]uintptr{ ts + 7533, ts + 9046, ts + 9051, ts + 7543, ts + 7538, ts + 9357, ts + 25910, ts + 25916, } func jsonZero(tls *libc.TLS, p uintptr) { (*JsonString)(unsafe.Pointer(p)).FzBuf = p + 34 (*JsonString)(unsafe.Pointer(p)).FnAlloc = U64(unsafe.Sizeof([100]int8{})) (*JsonString)(unsafe.Pointer(p)).FnUsed = uint64(0) (*JsonString)(unsafe.Pointer(p)).FbStatic = U8(1) } func jsonInit(tls *libc.TLS, p uintptr, pCtx uintptr) { (*JsonString)(unsafe.Pointer(p)).FpCtx = pCtx (*JsonString)(unsafe.Pointer(p)).FbErr = U8(0) jsonZero(tls, p) } func jsonReset(tls *libc.TLS, p uintptr) { if !(int32((*JsonString)(unsafe.Pointer(p)).FbStatic) != 0) { Xsqlite3_free(tls, (*JsonString)(unsafe.Pointer(p)).FzBuf) } jsonZero(tls, p) } func jsonOom(tls *libc.TLS, p uintptr) { (*JsonString)(unsafe.Pointer(p)).FbErr = U8(1) Xsqlite3_result_error_nomem(tls, (*JsonString)(unsafe.Pointer(p)).FpCtx) jsonReset(tls, p) } func jsonGrow(tls *libc.TLS, p uintptr, N U32) int32 { var nTotal U64 if U64(N) < (*JsonString)(unsafe.Pointer(p)).FnAlloc { nTotal = (*JsonString)(unsafe.Pointer(p)).FnAlloc * uint64(2) } else { nTotal = (*JsonString)(unsafe.Pointer(p)).FnAlloc + U64(N) + uint64(10) } var zNew uintptr if (*JsonString)(unsafe.Pointer(p)).FbStatic != 0 { if (*JsonString)(unsafe.Pointer(p)).FbErr != 0 { return 1 } zNew = Xsqlite3_malloc64(tls, nTotal) if zNew == uintptr(0) { jsonOom(tls, p) return SQLITE_NOMEM } libc.Xmemcpy(tls, zNew, (*JsonString)(unsafe.Pointer(p)).FzBuf, (*JsonString)(unsafe.Pointer(p)).FnUsed) (*JsonString)(unsafe.Pointer(p)).FzBuf = zNew (*JsonString)(unsafe.Pointer(p)).FbStatic = U8(0) } else { zNew = Xsqlite3_realloc64(tls, (*JsonString)(unsafe.Pointer(p)).FzBuf, nTotal) if zNew == uintptr(0) { jsonOom(tls, p) return SQLITE_NOMEM } (*JsonString)(unsafe.Pointer(p)).FzBuf = zNew } (*JsonString)(unsafe.Pointer(p)).FnAlloc = nTotal return SQLITE_OK } func jsonAppendRaw(tls *libc.TLS, p uintptr, zIn uintptr, N U32) { if N == U32(0) { return } if U64(N)+(*JsonString)(unsafe.Pointer(p)).FnUsed >= (*JsonString)(unsafe.Pointer(p)).FnAlloc && jsonGrow(tls, p, N) != 0 { return } libc.Xmemcpy(tls, (*JsonString)(unsafe.Pointer(p)).FzBuf+uintptr((*JsonString)(unsafe.Pointer(p)).FnUsed), zIn, uint64(N)) *(*U64)(unsafe.Pointer(p + 24)) += U64(N) } func jsonPrintf(tls *libc.TLS, N int32, p uintptr, zFormat uintptr, va uintptr) { var ap Va_list _ = ap if (*JsonString)(unsafe.Pointer(p)).FnUsed+U64(N) >= (*JsonString)(unsafe.Pointer(p)).FnAlloc && jsonGrow(tls, p, uint32(N)) != 0 { return } ap = va Xsqlite3_vsnprintf(tls, N, (*JsonString)(unsafe.Pointer(p)).FzBuf+uintptr((*JsonString)(unsafe.Pointer(p)).FnUsed), zFormat, ap) _ = ap *(*U64)(unsafe.Pointer(p + 24)) += U64(int32(libc.Xstrlen(tls, (*JsonString)(unsafe.Pointer(p)).FzBuf+uintptr((*JsonString)(unsafe.Pointer(p)).FnUsed)))) } func jsonAppendChar(tls *libc.TLS, p uintptr, c int8) { if (*JsonString)(unsafe.Pointer(p)).FnUsed >= (*JsonString)(unsafe.Pointer(p)).FnAlloc && jsonGrow(tls, p, uint32(1)) != 0 { return } *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = c } func jsonAppendSeparator(tls *libc.TLS, p uintptr) { var c int8 if (*JsonString)(unsafe.Pointer(p)).FnUsed == uint64(0) { return } c = *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr((*JsonString)(unsafe.Pointer(p)).FnUsed-uint64(1)))) if int32(c) != '[' && int32(c) != '{' { jsonAppendChar(tls, p, int8(',')) } } func jsonAppendString(tls *libc.TLS, p uintptr, zIn uintptr, N U32) { var i U32 var c uint8 if !(zIn == uintptr(0) || U64(N)+(*JsonString)(unsafe.Pointer(p)).FnUsed+uint64(2) >= (*JsonString)(unsafe.Pointer(p)).FnAlloc && jsonGrow(tls, p, N+U32(2)) != 0) { goto __1 } return __1: ; *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('"') i = U32(0) __2: if !(i < N) { goto __4 } c = *(*uint8)(unsafe.Pointer(zIn + uintptr(i))) if !(int32(c) == '"' || int32(c) == '\\') { goto __5 } json_simple_escape: if !((*JsonString)(unsafe.Pointer(p)).FnUsed+U64(N)+uint64(3)-U64(i) > (*JsonString)(unsafe.Pointer(p)).FnAlloc && jsonGrow(tls, p, N+U32(3)-i) != 0) { goto __7 } return __7: ; *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('\\') goto __6 __5: if !(int32(c) <= 0x1f) { goto __8 } if !(aSpecial[c] != 0) { goto __9 } c = uint8(aSpecial[c]) goto json_simple_escape __9: ; if !((*JsonString)(unsafe.Pointer(p)).FnUsed+U64(N)+uint64(7)+U64(i) > (*JsonString)(unsafe.Pointer(p)).FnAlloc && jsonGrow(tls, p, N+U32(7)-i) != 0) { goto __10 } return __10: ; *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('\\') *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('u') *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('0') *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('0') *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('0' + int32(c)>>4) c = uint8(*(*int8)(unsafe.Pointer(ts + 25923 + uintptr(int32(c)&0xf)))) __8: ; __6: ; *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8(c) goto __3 __3: i++ goto __2 goto __4 __4: ; *(*int8)(unsafe.Pointer((*JsonString)(unsafe.Pointer(p)).FzBuf + uintptr(libc.PostIncUint64(&(*JsonString)(unsafe.Pointer(p)).FnUsed, 1)))) = int8('"') } var aSpecial = [32]int8{ int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8('b'), int8('t'), int8('n'), int8(0), int8('f'), int8('r'), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), } func jsonAppendValue(tls *libc.TLS, p uintptr, pValue uintptr) { switch Xsqlite3_value_type(tls, pValue) { case SQLITE_NULL: { jsonAppendRaw(tls, p, ts+7533, uint32(4)) break } case SQLITE_INTEGER: fallthrough case SQLITE_FLOAT: { var z uintptr = Xsqlite3_value_text(tls, pValue) var n U32 = U32(Xsqlite3_value_bytes(tls, pValue)) jsonAppendRaw(tls, p, z, n) break } case SQLITE_TEXT: { var z uintptr = Xsqlite3_value_text(tls, pValue) var n U32 = U32(Xsqlite3_value_bytes(tls, pValue)) if Xsqlite3_value_subtype(tls, pValue) == uint32(JSON_SUBTYPE) { jsonAppendRaw(tls, p, z, n) } else { jsonAppendString(tls, p, z, n) } break } default: { if int32((*JsonString)(unsafe.Pointer(p)).FbErr) == 0 { Xsqlite3_result_error(tls, (*JsonString)(unsafe.Pointer(p)).FpCtx, ts+25940, -1) (*JsonString)(unsafe.Pointer(p)).FbErr = U8(2) jsonReset(tls, p) } break } } } func jsonResult(tls *libc.TLS, p uintptr) { if int32((*JsonString)(unsafe.Pointer(p)).FbErr) == 0 { Xsqlite3_result_text64(tls, (*JsonString)(unsafe.Pointer(p)).FpCtx, (*JsonString)(unsafe.Pointer(p)).FzBuf, (*JsonString)(unsafe.Pointer(p)).FnUsed, func() uintptr { if (*JsonString)(unsafe.Pointer(p)).FbStatic != 0 { return libc.UintptrFromInt32(-1) } return *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free})) }(), uint8(SQLITE_UTF8)) jsonZero(tls, p) } } func jsonNodeSize(tls *libc.TLS, pNode uintptr) U32 { if int32((*JsonNode)(unsafe.Pointer(pNode)).FeType) >= JSON_ARRAY { return (*JsonNode)(unsafe.Pointer(pNode)).Fn + U32(1) } return uint32(1) } func jsonParseReset(tls *libc.TLS, pParse uintptr) { Xsqlite3_free(tls, (*JsonParse)(unsafe.Pointer(pParse)).FaNode) (*JsonParse)(unsafe.Pointer(pParse)).FaNode = uintptr(0) (*JsonParse)(unsafe.Pointer(pParse)).FnNode = U32(0) (*JsonParse)(unsafe.Pointer(pParse)).FnAlloc = U32(0) Xsqlite3_free(tls, (*JsonParse)(unsafe.Pointer(pParse)).FaUp) (*JsonParse)(unsafe.Pointer(pParse)).FaUp = uintptr(0) } func jsonParseFree(tls *libc.TLS, pParse uintptr) { jsonParseReset(tls, pParse) Xsqlite3_free(tls, pParse) } func jsonRenderNode(tls *libc.TLS, pNode uintptr, pOut uintptr, aReplace uintptr) { if int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&(JNODE_REPLACE|JNODE_PATCH) != 0 { if int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&JNODE_REPLACE != 0 && aReplace != uintptr(0) { jsonAppendValue(tls, pOut, *(*uintptr)(unsafe.Pointer(aReplace + uintptr(*(*U32)(unsafe.Pointer(pNode + 8)))*8))) return } pNode = *(*uintptr)(unsafe.Pointer(pNode + 8)) } switch int32((*JsonNode)(unsafe.Pointer(pNode)).FeType) { default: { jsonAppendRaw(tls, pOut, ts+7533, uint32(4)) break } case JSON_TRUE: { jsonAppendRaw(tls, pOut, ts+9046, uint32(4)) break } case JSON_FALSE: { jsonAppendRaw(tls, pOut, ts+9051, uint32(5)) break } case JSON_STRING: { if int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&JNODE_RAW != 0 { jsonAppendString(tls, pOut, *(*uintptr)(unsafe.Pointer(pNode + 8)), (*JsonNode)(unsafe.Pointer(pNode)).Fn) break } } fallthrough case JSON_REAL: fallthrough case JSON_INT: { jsonAppendRaw(tls, pOut, *(*uintptr)(unsafe.Pointer(pNode + 8)), (*JsonNode)(unsafe.Pointer(pNode)).Fn) break } case JSON_ARRAY: { var j U32 = U32(1) jsonAppendChar(tls, pOut, int8('[')) for { for j <= (*JsonNode)(unsafe.Pointer(pNode)).Fn { if int32((*JsonNode)(unsafe.Pointer(pNode+uintptr(j)*16)).FjnFlags)&JNODE_REMOVE == 0 { jsonAppendSeparator(tls, pOut) jsonRenderNode(tls, pNode+uintptr(j)*16, pOut, aReplace) } j = j + jsonNodeSize(tls, pNode+uintptr(j)*16) } if int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&JNODE_APPEND == 0 { break } pNode = pNode + uintptr(*(*U32)(unsafe.Pointer(pNode + 8)))*16 j = U32(1) } jsonAppendChar(tls, pOut, int8(']')) break } case JSON_OBJECT: { var j U32 = U32(1) jsonAppendChar(tls, pOut, int8('{')) for { for j <= (*JsonNode)(unsafe.Pointer(pNode)).Fn { if int32((*JsonNode)(unsafe.Pointer(pNode+uintptr(j+U32(1))*16)).FjnFlags)&JNODE_REMOVE == 0 { jsonAppendSeparator(tls, pOut) jsonRenderNode(tls, pNode+uintptr(j)*16, pOut, aReplace) jsonAppendChar(tls, pOut, int8(':')) jsonRenderNode(tls, pNode+uintptr(j+U32(1))*16, pOut, aReplace) } j = j + (U32(1) + jsonNodeSize(tls, pNode+uintptr(j+U32(1))*16)) } if int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&JNODE_APPEND == 0 { break } pNode = pNode + uintptr(*(*U32)(unsafe.Pointer(pNode + 8)))*16 j = U32(1) } jsonAppendChar(tls, pOut, int8('}')) break } } } func jsonReturnJson(tls *libc.TLS, pNode uintptr, pCtx uintptr, aReplace uintptr) { bp := tls.Alloc(136) defer tls.Free(136) jsonInit(tls, bp, pCtx) jsonRenderNode(tls, pNode, bp, aReplace) jsonResult(tls, bp) Xsqlite3_result_subtype(tls, pCtx, uint32(JSON_SUBTYPE)) } func jsonHexToInt(tls *libc.TLS, h int32) U8 { h = h + 9*(1&(h>>6)) return U8(h & 0xf) } func jsonHexToInt4(tls *libc.TLS, z uintptr) U32 { var v U32 v = U32(int32(jsonHexToInt(tls, int32(*(*int8)(unsafe.Pointer(z)))))<<12 + int32(jsonHexToInt(tls, int32(*(*int8)(unsafe.Pointer(z + 1)))))<<8 + int32(jsonHexToInt(tls, int32(*(*int8)(unsafe.Pointer(z + 2)))))<<4 + int32(jsonHexToInt(tls, int32(*(*int8)(unsafe.Pointer(z + 3)))))) return v } func jsonReturn(tls *libc.TLS, pNode uintptr, pCtx uintptr, aReplace uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var v uint32 var i Sqlite3_int64 var z uintptr var z1 uintptr var vlo U32 var v1 U32 var c int8 var i1 U32 var n U32 var z2 uintptr var zOut uintptr var j U32 switch int32((*JsonNode)(unsafe.Pointer(pNode)).FeType) { default: goto __2 case JSON_TRUE: goto __3 case JSON_FALSE: goto __4 case JSON_INT: goto __5 case JSON_REAL: goto __6 case JSON_STRING: goto __7 case JSON_ARRAY: goto __8 case JSON_OBJECT: goto __9 } goto __1 __2: ; Xsqlite3_result_null(tls, pCtx) goto __1 __3: Xsqlite3_result_int(tls, pCtx, 1) goto __1 __4: Xsqlite3_result_int(tls, pCtx, 0) goto __1 __5: i = int64(0) z = *(*uintptr)(unsafe.Pointer(pNode + 8)) if !(int32(*(*int8)(unsafe.Pointer(z))) == '-') { goto __10 } z++ __10: ; __11: if !(int32(*(*int8)(unsafe.Pointer(z))) >= '0' && int32(*(*int8)(unsafe.Pointer(z))) <= '9') { goto __12 } v = uint32(int32(*(*int8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1)))) - '0') if !(i >= (int64(0xffffffff)|int64(0x7fffffff)<<32)/int64(10)) { goto __13 } if !(i > (int64(0xffffffff)|int64(0x7fffffff)<<32)/int64(10)) { goto __14 } goto int_as_real __14: ; if !(int32(*(*int8)(unsafe.Pointer(z))) >= '0' && int32(*(*int8)(unsafe.Pointer(z))) <= '9') { goto __15 } goto int_as_real __15: ; if !(v == uint32(9)) { goto __16 } goto int_as_real __16: ; if !(v == uint32(8)) { goto __17 } if !(int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNode + 8))))) == '-') { goto __18 } Xsqlite3_result_int64(tls, pCtx, int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32)) goto int_done goto __19 __18: goto int_as_real __19: ; __17: ; __13: ; i = i*int64(10) + Sqlite3_int64(v) goto __11 __12: ; if !(int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNode + 8))))) == '-') { goto __20 } i = -i __20: ; Xsqlite3_result_int64(tls, pCtx, i) int_done: goto __1 int_as_real: ; __6: ; z1 = *(*uintptr)(unsafe.Pointer(pNode + 8)) Xsqlite3AtoF(tls, z1, bp, Xsqlite3Strlen30(tls, z1), uint8(SQLITE_UTF8)) Xsqlite3_result_double(tls, pCtx, *(*float64)(unsafe.Pointer(bp))) goto __1 __7: ; if !(int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&JNODE_ESCAPE == 0) { goto __21 } Xsqlite3_result_text(tls, pCtx, *(*uintptr)(unsafe.Pointer(pNode + 8))+uintptr(1), int32((*JsonNode)(unsafe.Pointer(pNode)).Fn-U32(2)), libc.UintptrFromInt32(-1)) goto __22 __21: n = (*JsonNode)(unsafe.Pointer(pNode)).Fn z2 = *(*uintptr)(unsafe.Pointer(pNode + 8)) zOut = Xsqlite3_malloc(tls, int32(n+U32(1))) if !(zOut == uintptr(0)) { goto __23 } Xsqlite3_result_error_nomem(tls, pCtx) goto __1 __23: ; i1 = U32(1) j = U32(0) __24: if !(i1 < n-U32(1)) { goto __26 } c = *(*int8)(unsafe.Pointer(z2 + uintptr(i1))) if !(int32(c) != '\\') { goto __27 } *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = c goto __28 __27: c = *(*int8)(unsafe.Pointer(z2 + uintptr(libc.PreIncUint32(&i1, 1)))) if !(int32(c) == 'u') { goto __29 } v1 = jsonHexToInt4(tls, z2+uintptr(i1)+uintptr(1)) i1 = i1 + U32(4) if !(v1 == U32(0)) { goto __31 } goto __26 __31: ; if !(v1 <= U32(0x7f)) { goto __32 } *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(v1) goto __33 __32: if !(v1 <= U32(0x7ff)) { goto __34 } *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0xc0) | v1>>6) *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0x80) | v1&U32(0x3f)) goto __35 __34: if !(v1&U32(0xfc00) == U32(0xd800) && i1 < n-U32(6) && int32(*(*int8)(unsafe.Pointer(z2 + uintptr(i1+U32(1))))) == '\\' && int32(*(*int8)(unsafe.Pointer(z2 + uintptr(i1+U32(2))))) == 'u' && libc.AssignUint32(&vlo, jsonHexToInt4(tls, z2+uintptr(i1)+uintptr(3)))&U32(0xfc00) == U32(0xdc00)) { goto __36 } v1 = v1&U32(0x3ff)<<10 + vlo&U32(0x3ff) + U32(0x10000) i1 = i1 + U32(6) *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0xf0) | v1>>18) *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0x80) | v1>>12&U32(0x3f)) *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0x80) | v1>>6&U32(0x3f)) *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0x80) | v1&U32(0x3f)) goto __37 __36: *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0xe0) | v1>>12) *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0x80) | v1>>6&U32(0x3f)) *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = int8(U32(0x80) | v1&U32(0x3f)) __37: ; __35: ; __33: ; goto __30 __29: if !(int32(c) == 'b') { goto __38 } c = int8('\b') goto __39 __38: if !(int32(c) == 'f') { goto __40 } c = int8('\f') goto __41 __40: if !(int32(c) == 'n') { goto __42 } c = int8('\n') goto __43 __42: if !(int32(c) == 'r') { goto __44 } c = int8('\r') goto __45 __44: if !(int32(c) == 't') { goto __46 } c = int8('\t') __46: ; __45: ; __43: ; __41: ; __39: ; *(*int8)(unsafe.Pointer(zOut + uintptr(libc.PostIncUint32(&j, 1)))) = c __30: ; __28: ; goto __25 __25: i1++ goto __24 goto __26 __26: ; *(*int8)(unsafe.Pointer(zOut + uintptr(j))) = int8(0) Xsqlite3_result_text(tls, pCtx, zOut, int32(j), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) __22: ; goto __1 __8: __9: jsonReturnJson(tls, pNode, pCtx, aReplace) goto __1 __1: } func jsonParseAddNodeExpand(tls *libc.TLS, pParse uintptr, eType U32, n U32, zContent uintptr) int32 { var nNew U32 var pNew uintptr if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { return -1 } nNew = (*JsonParse)(unsafe.Pointer(pParse)).FnAlloc*U32(2) + U32(10) pNew = Xsqlite3_realloc64(tls, (*JsonParse)(unsafe.Pointer(pParse)).FaNode, uint64(unsafe.Sizeof(JsonNode{}))*uint64(nNew)) if pNew == uintptr(0) { (*JsonParse)(unsafe.Pointer(pParse)).Foom = U8(1) return -1 } (*JsonParse)(unsafe.Pointer(pParse)).FnAlloc = nNew (*JsonParse)(unsafe.Pointer(pParse)).FaNode = pNew return jsonParseAddNode(tls, pParse, eType, n, zContent) } func jsonParseAddNode(tls *libc.TLS, pParse uintptr, eType U32, n U32, zContent uintptr) int32 { var p uintptr if (*JsonParse)(unsafe.Pointer(pParse)).FaNode == uintptr(0) || (*JsonParse)(unsafe.Pointer(pParse)).FnNode >= (*JsonParse)(unsafe.Pointer(pParse)).FnAlloc { return jsonParseAddNodeExpand(tls, pParse, eType, n, zContent) } p = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr((*JsonParse)(unsafe.Pointer(pParse)).FnNode)*16 (*JsonNode)(unsafe.Pointer(p)).FeType = U8(eType) (*JsonNode)(unsafe.Pointer(p)).FjnFlags = U8(0) (*JsonNode)(unsafe.Pointer(p)).Fn = n *(*uintptr)(unsafe.Pointer(p + 8)) = zContent return int32(libc.PostIncUint32(&(*JsonParse)(unsafe.Pointer(pParse)).FnNode, 1)) } func jsonIs4Hex(tls *libc.TLS, z uintptr) int32 { var i int32 for i = 0; i < 4; i++ { if !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(i))))])&0x08 != 0) { return 0 } } return 1 } func jsonParseValue(tls *libc.TLS, pParse uintptr, i U32) int32 { var c int8 var j U32 var iThis int32 var x int32 var pNode uintptr var z uintptr = (*JsonParse)(unsafe.Pointer(pParse)).FzJson for jsonIsSpace[uint8(*(*int8)(unsafe.Pointer(z + uintptr(i))))] != 0 { i++ } if int32(libc.AssignInt8(&c, *(*int8)(unsafe.Pointer(z + uintptr(i))))) == '{' { iThis = jsonParseAddNode(tls, pParse, uint32(JSON_OBJECT), uint32(0), uintptr(0)) if iThis < 0 { return -1 } for j = i + U32(1); ; j++ { for jsonIsSpace[uint8(*(*int8)(unsafe.Pointer(z + uintptr(j))))] != 0 { j++ } if int32(libc.PreIncUint16(&(*JsonParse)(unsafe.Pointer(pParse)).FiDepth, 1)) > JSON_MAX_DEPTH { return -1 } x = jsonParseValue(tls, pParse, j) if x < 0 { (*JsonParse)(unsafe.Pointer(pParse)).FiDepth-- if x == -2 && (*JsonParse)(unsafe.Pointer(pParse)).FnNode == U32(iThis)+U32(1) { return int32(j + U32(1)) } return -1 } if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { return -1 } pNode = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr((*JsonParse)(unsafe.Pointer(pParse)).FnNode-U32(1))*16 if int32((*JsonNode)(unsafe.Pointer(pNode)).FeType) != JSON_STRING { return -1 } *(*U8)(unsafe.Pointer(pNode + 1)) |= U8(JNODE_LABEL) j = U32(x) for jsonIsSpace[uint8(*(*int8)(unsafe.Pointer(z + uintptr(j))))] != 0 { j++ } if int32(*(*int8)(unsafe.Pointer(z + uintptr(j)))) != ':' { return -1 } j++ x = jsonParseValue(tls, pParse, j) (*JsonParse)(unsafe.Pointer(pParse)).FiDepth-- if x < 0 { return -1 } j = U32(x) for jsonIsSpace[uint8(*(*int8)(unsafe.Pointer(z + uintptr(j))))] != 0 { j++ } c = *(*int8)(unsafe.Pointer(z + uintptr(j))) if int32(c) == ',' { continue } if int32(c) != '}' { return -1 } break } (*JsonNode)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iThis)*16)).Fn = (*JsonParse)(unsafe.Pointer(pParse)).FnNode - U32(iThis) - U32(1) return int32(j + U32(1)) } else if int32(c) == '[' { iThis = jsonParseAddNode(tls, pParse, uint32(JSON_ARRAY), uint32(0), uintptr(0)) if iThis < 0 { return -1 } libc.Xmemset(tls, (*JsonParse)(unsafe.Pointer(pParse)).FaNode+uintptr(iThis)*16+8, 0, uint64(unsafe.Sizeof(struct{ FzJContent uintptr }{}))) for j = i + U32(1); ; j++ { for jsonIsSpace[uint8(*(*int8)(unsafe.Pointer(z + uintptr(j))))] != 0 { j++ } if int32(libc.PreIncUint16(&(*JsonParse)(unsafe.Pointer(pParse)).FiDepth, 1)) > JSON_MAX_DEPTH { return -1 } x = jsonParseValue(tls, pParse, j) (*JsonParse)(unsafe.Pointer(pParse)).FiDepth-- if x < 0 { if x == -3 && (*JsonParse)(unsafe.Pointer(pParse)).FnNode == U32(iThis)+U32(1) { return int32(j + U32(1)) } return -1 } j = U32(x) for jsonIsSpace[uint8(*(*int8)(unsafe.Pointer(z + uintptr(j))))] != 0 { j++ } c = *(*int8)(unsafe.Pointer(z + uintptr(j))) if int32(c) == ',' { continue } if int32(c) != ']' { return -1 } break } (*JsonNode)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iThis)*16)).Fn = (*JsonParse)(unsafe.Pointer(pParse)).FnNode - U32(iThis) - U32(1) return int32(j + U32(1)) } else if int32(c) == '"' { var jnFlags U8 = U8(0) j = i + U32(1) for { c = *(*int8)(unsafe.Pointer(z + uintptr(j))) if int32(c)&libc.CplInt32(0x1f) == 0 { return -1 } if int32(c) == '\\' { c = *(*int8)(unsafe.Pointer(z + uintptr(libc.PreIncUint32(&j, 1)))) if int32(c) == '"' || int32(c) == '\\' || int32(c) == '/' || int32(c) == 'b' || int32(c) == 'f' || int32(c) == 'n' || int32(c) == 'r' || int32(c) == 't' || int32(c) == 'u' && jsonIs4Hex(tls, z+uintptr(j)+uintptr(1)) != 0 { jnFlags = U8(JNODE_ESCAPE) } else { return -1 } } else if int32(c) == '"' { break } j++ } jsonParseAddNode(tls, pParse, uint32(JSON_STRING), j+U32(1)-i, z+uintptr(i)) if !(int32((*JsonParse)(unsafe.Pointer(pParse)).Foom) != 0) { (*JsonNode)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr((*JsonParse)(unsafe.Pointer(pParse)).FnNode-U32(1))*16)).FjnFlags = jnFlags } return int32(j + U32(1)) } else if int32(c) == 'n' && libc.Xstrncmp(tls, z+uintptr(i), ts+7533, uint64(4)) == 0 && !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(i+U32(4)))))])&0x06 != 0) { jsonParseAddNode(tls, pParse, uint32(JSON_NULL), uint32(0), uintptr(0)) return int32(i + U32(4)) } else if int32(c) == 't' && libc.Xstrncmp(tls, z+uintptr(i), ts+9046, uint64(4)) == 0 && !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(i+U32(4)))))])&0x06 != 0) { jsonParseAddNode(tls, pParse, uint32(JSON_TRUE), uint32(0), uintptr(0)) return int32(i + U32(4)) } else if int32(c) == 'f' && libc.Xstrncmp(tls, z+uintptr(i), ts+9051, uint64(5)) == 0 && !(int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(i+U32(5)))))])&0x06 != 0) { jsonParseAddNode(tls, pParse, uint32(JSON_FALSE), uint32(0), uintptr(0)) return int32(i + U32(5)) } else if int32(c) == '-' || int32(c) >= '0' && int32(c) <= '9' { var seenDP U8 = U8(0) var seenE U8 = U8(0) if int32(c) <= '0' { if int32(c) == '-' { j = i + U32(1) } else { j = i } if int32(*(*int8)(unsafe.Pointer(z + uintptr(j)))) == '0' && int32(*(*int8)(unsafe.Pointer(z + uintptr(j+U32(1))))) >= '0' && int32(*(*int8)(unsafe.Pointer(z + uintptr(j+U32(1))))) <= '9' { return -1 } } j = i + U32(1) for ; ; j++ { c = *(*int8)(unsafe.Pointer(z + uintptr(j))) if int32(c) >= '0' && int32(c) <= '9' { continue } if int32(c) == '.' { if int32(*(*int8)(unsafe.Pointer(z + uintptr(j-U32(1))))) == '-' { return -1 } if seenDP != 0 { return -1 } seenDP = U8(1) continue } if int32(c) == 'e' || int32(c) == 'E' { if int32(*(*int8)(unsafe.Pointer(z + uintptr(j-U32(1))))) < '0' { return -1 } if seenE != 0 { return -1 } seenDP = libc.AssignUint8(&seenE, U8(1)) c = *(*int8)(unsafe.Pointer(z + uintptr(j+U32(1)))) if int32(c) == '+' || int32(c) == '-' { j++ c = *(*int8)(unsafe.Pointer(z + uintptr(j+U32(1)))) } if int32(c) < '0' || int32(c) > '9' { return -1 } continue } break } if int32(*(*int8)(unsafe.Pointer(z + uintptr(j-U32(1))))) < '0' { return -1 } jsonParseAddNode(tls, pParse, func() uint32 { if seenDP != 0 { return uint32(JSON_REAL) } return uint32(JSON_INT) }(), j-i, z+uintptr(i)) return int32(j) } else if int32(c) == '}' { return -2 } else if int32(c) == ']' { return -3 } else if int32(c) == 0 { return 0 } else { return -1 } return int32(0) } func jsonParse(tls *libc.TLS, pParse uintptr, pCtx uintptr, zJson uintptr) int32 { var i int32 libc.Xmemset(tls, pParse, 0, uint64(unsafe.Sizeof(JsonParse{}))) if zJson == uintptr(0) { return 1 } (*JsonParse)(unsafe.Pointer(pParse)).FzJson = zJson i = jsonParseValue(tls, pParse, uint32(0)) if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { i = -1 } if i > 0 { for jsonIsSpace[uint8(*(*int8)(unsafe.Pointer(zJson + uintptr(i))))] != 0 { i++ } if *(*int8)(unsafe.Pointer(zJson + uintptr(i))) != 0 { i = -1 } } if i <= 0 { if pCtx != uintptr(0) { if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { Xsqlite3_result_error_nomem(tls, pCtx) } else { Xsqlite3_result_error(tls, pCtx, ts+25969, -1) } } jsonParseReset(tls, pParse) return 1 } return 0 } func jsonParseFillInParentage(tls *libc.TLS, pParse uintptr, i U32, iParent U32) { var pNode uintptr = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(i)*16 var j U32 *(*U32)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaUp + uintptr(i)*4)) = iParent switch int32((*JsonNode)(unsafe.Pointer(pNode)).FeType) { case JSON_ARRAY: { for j = U32(1); j <= (*JsonNode)(unsafe.Pointer(pNode)).Fn; j = j + jsonNodeSize(tls, pNode+uintptr(j)*16) { jsonParseFillInParentage(tls, pParse, i+j, i) } break } case JSON_OBJECT: { for j = U32(1); j <= (*JsonNode)(unsafe.Pointer(pNode)).Fn; j = j + (jsonNodeSize(tls, pNode+uintptr(j)*16+uintptr(1)*16) + U32(1)) { *(*U32)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaUp + uintptr(i+j)*4)) = i jsonParseFillInParentage(tls, pParse, i+j+U32(1), i) } break } default: { break } } } func jsonParseFindParents(tls *libc.TLS, pParse uintptr) int32 { var aUp uintptr aUp = libc.AssignPtrUintptr(pParse+24, Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(U32(0)))*uint64((*JsonParse)(unsafe.Pointer(pParse)).FnNode))) if aUp == uintptr(0) { (*JsonParse)(unsafe.Pointer(pParse)).Foom = U8(1) return SQLITE_NOMEM } jsonParseFillInParentage(tls, pParse, uint32(0), uint32(0)) return SQLITE_OK } func jsonParseCached(tls *libc.TLS, pCtx uintptr, argv uintptr, pErrCtx uintptr) uintptr { var zJson uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) var nJson int32 = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) var p uintptr var pMatch uintptr = uintptr(0) var iKey int32 var iMinKey int32 = 0 var iMinHold U32 = 0xffffffff var iMaxHold U32 = U32(0) if zJson == uintptr(0) { return uintptr(0) } for iKey = 0; iKey < JSON_CACHE_SZ; iKey++ { p = Xsqlite3_get_auxdata(tls, pCtx, -429938+iKey) if p == uintptr(0) { iMinKey = iKey break } if pMatch == uintptr(0) && (*JsonParse)(unsafe.Pointer(p)).FnJson == nJson && libc.Xmemcmp(tls, (*JsonParse)(unsafe.Pointer(p)).FzJson, zJson, uint64(nJson)) == 0 { (*JsonParse)(unsafe.Pointer(p)).FnErr = U8(0) pMatch = p } else if (*JsonParse)(unsafe.Pointer(p)).FiHold < iMinHold { iMinHold = (*JsonParse)(unsafe.Pointer(p)).FiHold iMinKey = iKey } if (*JsonParse)(unsafe.Pointer(p)).FiHold > iMaxHold { iMaxHold = (*JsonParse)(unsafe.Pointer(p)).FiHold } } if pMatch != 0 { (*JsonParse)(unsafe.Pointer(pMatch)).FnErr = U8(0) (*JsonParse)(unsafe.Pointer(pMatch)).FiHold = iMaxHold + U32(1) return pMatch } p = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(JsonParse{}))+uint64(nJson)+uint64(1)) if p == uintptr(0) { Xsqlite3_result_error_nomem(tls, pCtx) return uintptr(0) } libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(JsonParse{}))) (*JsonParse)(unsafe.Pointer(p)).FzJson = p + 1*48 libc.Xmemcpy(tls, (*JsonParse)(unsafe.Pointer(p)).FzJson, zJson, uint64(nJson+1)) if jsonParse(tls, p, pErrCtx, (*JsonParse)(unsafe.Pointer(p)).FzJson) != 0 { Xsqlite3_free(tls, p) return uintptr(0) } (*JsonParse)(unsafe.Pointer(p)).FnJson = nJson (*JsonParse)(unsafe.Pointer(p)).FiHold = iMaxHold + U32(1) Xsqlite3_set_auxdata(tls, pCtx, -429938+iMinKey, p, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{jsonParseFree}))) return Xsqlite3_get_auxdata(tls, pCtx, -429938+iMinKey) } func jsonLabelCompare(tls *libc.TLS, pNode uintptr, zKey uintptr, nKey U32) int32 { if int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&JNODE_RAW != 0 { if (*JsonNode)(unsafe.Pointer(pNode)).Fn != nKey { return 0 } return libc.Bool32(libc.Xstrncmp(tls, *(*uintptr)(unsafe.Pointer(pNode + 8)), zKey, uint64(nKey)) == 0) } else { if (*JsonNode)(unsafe.Pointer(pNode)).Fn != nKey+U32(2) { return 0 } return libc.Bool32(libc.Xstrncmp(tls, *(*uintptr)(unsafe.Pointer(pNode + 8))+uintptr(1), zKey, uint64(nKey)) == 0) } return int32(0) } func jsonLookupStep(tls *libc.TLS, pParse uintptr, iRoot U32, zPath uintptr, pApnd uintptr, pzErr uintptr) uintptr { var i U32 var j U32 var nKey U32 var zKey uintptr var pRoot uintptr = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iRoot)*16 if int32(*(*int8)(unsafe.Pointer(zPath))) == 0 { return pRoot } if int32((*JsonNode)(unsafe.Pointer(pRoot)).FjnFlags)&JNODE_REPLACE != 0 { return uintptr(0) } if int32(*(*int8)(unsafe.Pointer(zPath))) == '.' { if int32((*JsonNode)(unsafe.Pointer(pRoot)).FeType) != JSON_OBJECT { return uintptr(0) } zPath++ if int32(*(*int8)(unsafe.Pointer(zPath))) == '"' { zKey = zPath + uintptr(1) for i = U32(1); *(*int8)(unsafe.Pointer(zPath + uintptr(i))) != 0 && int32(*(*int8)(unsafe.Pointer(zPath + uintptr(i)))) != '"'; i++ { } nKey = i - U32(1) if *(*int8)(unsafe.Pointer(zPath + uintptr(i))) != 0 { i++ } else { *(*uintptr)(unsafe.Pointer(pzErr)) = zPath return uintptr(0) } } else { zKey = zPath for i = U32(0); *(*int8)(unsafe.Pointer(zPath + uintptr(i))) != 0 && int32(*(*int8)(unsafe.Pointer(zPath + uintptr(i)))) != '.' && int32(*(*int8)(unsafe.Pointer(zPath + uintptr(i)))) != '['; i++ { } nKey = i if nKey == U32(0) { *(*uintptr)(unsafe.Pointer(pzErr)) = zPath return uintptr(0) } } j = U32(1) for { for j <= (*JsonNode)(unsafe.Pointer(pRoot)).Fn { if jsonLabelCompare(tls, pRoot+uintptr(j)*16, zKey, nKey) != 0 { return jsonLookupStep(tls, pParse, iRoot+j+U32(1), zPath+uintptr(i), pApnd, pzErr) } j++ j = j + jsonNodeSize(tls, pRoot+uintptr(j)*16) } if int32((*JsonNode)(unsafe.Pointer(pRoot)).FjnFlags)&JNODE_APPEND == 0 { break } iRoot = iRoot + *(*U32)(unsafe.Pointer(pRoot + 8)) pRoot = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iRoot)*16 j = U32(1) } if pApnd != 0 { var iStart U32 var iLabel U32 var pNode uintptr iStart = U32(jsonParseAddNode(tls, pParse, uint32(JSON_OBJECT), uint32(2), uintptr(0))) iLabel = U32(jsonParseAddNode(tls, pParse, uint32(JSON_STRING), nKey, zKey)) zPath += uintptr(i) pNode = jsonLookupAppend(tls, pParse, zPath, pApnd, pzErr) if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { return uintptr(0) } if pNode != 0 { pRoot = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iRoot)*16 *(*U32)(unsafe.Pointer(pRoot + 8)) = iStart - iRoot *(*U8)(unsafe.Pointer(pRoot + 1)) |= U8(JNODE_APPEND) *(*U8)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iLabel)*16 + 1)) |= U8(JNODE_RAW) } return pNode } } else if int32(*(*int8)(unsafe.Pointer(zPath))) == '[' { i = U32(0) j = U32(1) for int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zPath + uintptr(j))))])&0x04 != 0 { i = i*U32(10) + U32(*(*int8)(unsafe.Pointer(zPath + uintptr(j)))) - U32('0') j++ } if j < U32(2) || int32(*(*int8)(unsafe.Pointer(zPath + uintptr(j)))) != ']' { if int32(*(*int8)(unsafe.Pointer(zPath + 1))) == '#' { var pBase uintptr = pRoot var iBase int32 = int32(iRoot) if int32((*JsonNode)(unsafe.Pointer(pRoot)).FeType) != JSON_ARRAY { return uintptr(0) } for { for j <= (*JsonNode)(unsafe.Pointer(pBase)).Fn { if int32((*JsonNode)(unsafe.Pointer(pBase+uintptr(j)*16)).FjnFlags)&JNODE_REMOVE == 0 { i++ } j = j + jsonNodeSize(tls, pBase+uintptr(j)*16) } if int32((*JsonNode)(unsafe.Pointer(pBase)).FjnFlags)&JNODE_APPEND == 0 { break } iBase = int32(U32(iBase) + *(*U32)(unsafe.Pointer(pBase + 8))) pBase = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iBase)*16 j = U32(1) } j = U32(2) if int32(*(*int8)(unsafe.Pointer(zPath + 2))) == '-' && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zPath + 3)))])&0x04 != 0 { var x uint32 = uint32(0) j = U32(3) for __ccgo := true; __ccgo; __ccgo = int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zPath + uintptr(j))))])&0x04 != 0 { x = x*uint32(10) + uint32(*(*int8)(unsafe.Pointer(zPath + uintptr(j)))) - uint32('0') j++ } if x > i { return uintptr(0) } i = i - x } if int32(*(*int8)(unsafe.Pointer(zPath + uintptr(j)))) != ']' { *(*uintptr)(unsafe.Pointer(pzErr)) = zPath return uintptr(0) } } else { *(*uintptr)(unsafe.Pointer(pzErr)) = zPath return uintptr(0) } } if int32((*JsonNode)(unsafe.Pointer(pRoot)).FeType) != JSON_ARRAY { return uintptr(0) } zPath += uintptr(j + U32(1)) j = U32(1) for { for j <= (*JsonNode)(unsafe.Pointer(pRoot)).Fn && (i > U32(0) || int32((*JsonNode)(unsafe.Pointer(pRoot+uintptr(j)*16)).FjnFlags)&JNODE_REMOVE != 0) { if int32((*JsonNode)(unsafe.Pointer(pRoot+uintptr(j)*16)).FjnFlags)&JNODE_REMOVE == 0 { i-- } j = j + jsonNodeSize(tls, pRoot+uintptr(j)*16) } if int32((*JsonNode)(unsafe.Pointer(pRoot)).FjnFlags)&JNODE_APPEND == 0 { break } iRoot = iRoot + *(*U32)(unsafe.Pointer(pRoot + 8)) pRoot = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iRoot)*16 j = U32(1) } if j <= (*JsonNode)(unsafe.Pointer(pRoot)).Fn { return jsonLookupStep(tls, pParse, iRoot+j, zPath, pApnd, pzErr) } if i == U32(0) && pApnd != 0 { var iStart U32 var pNode uintptr iStart = U32(jsonParseAddNode(tls, pParse, uint32(JSON_ARRAY), uint32(1), uintptr(0))) pNode = jsonLookupAppend(tls, pParse, zPath, pApnd, pzErr) if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { return uintptr(0) } if pNode != 0 { pRoot = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iRoot)*16 *(*U32)(unsafe.Pointer(pRoot + 8)) = iStart - iRoot *(*U8)(unsafe.Pointer(pRoot + 1)) |= U8(JNODE_APPEND) } return pNode } } else { *(*uintptr)(unsafe.Pointer(pzErr)) = zPath } return uintptr(0) } func jsonLookupAppend(tls *libc.TLS, pParse uintptr, zPath uintptr, pApnd uintptr, pzErr uintptr) uintptr { *(*int32)(unsafe.Pointer(pApnd)) = 1 if int32(*(*int8)(unsafe.Pointer(zPath))) == 0 { jsonParseAddNode(tls, pParse, uint32(JSON_NULL), uint32(0), uintptr(0)) if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { return uintptr(0) } return (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr((*JsonParse)(unsafe.Pointer(pParse)).FnNode-U32(1))*16 } if int32(*(*int8)(unsafe.Pointer(zPath))) == '.' { jsonParseAddNode(tls, pParse, uint32(JSON_OBJECT), uint32(0), uintptr(0)) } else if libc.Xstrncmp(tls, zPath, ts+25984, uint64(3)) == 0 { jsonParseAddNode(tls, pParse, uint32(JSON_ARRAY), uint32(0), uintptr(0)) } else { return uintptr(0) } if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { return uintptr(0) } return jsonLookupStep(tls, pParse, (*JsonParse)(unsafe.Pointer(pParse)).FnNode-U32(1), zPath, pApnd, pzErr) } func jsonPathSyntaxError(tls *libc.TLS, zErr uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) return Xsqlite3_mprintf(tls, ts+25988, libc.VaList(bp, zErr)) } func jsonLookup(tls *libc.TLS, pParse uintptr, zPath uintptr, pApnd uintptr, pCtx uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var pNode uintptr var zMsg uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) pNode = uintptr(0) if !(zPath == uintptr(0)) { goto __1 } return uintptr(0) __1: ; if !(int32(*(*int8)(unsafe.Pointer(zPath))) != '$') { goto __2 } *(*uintptr)(unsafe.Pointer(bp)) = zPath goto lookup_err __2: ; zPath++ pNode = jsonLookupStep(tls, pParse, uint32(0), zPath, pApnd, bp) if !(*(*uintptr)(unsafe.Pointer(bp)) == uintptr(0)) { goto __3 } return pNode __3: ; lookup_err: (*JsonParse)(unsafe.Pointer(pParse)).FnErr++ zMsg = jsonPathSyntaxError(tls, *(*uintptr)(unsafe.Pointer(bp))) if !(zMsg != 0) { goto __4 } Xsqlite3_result_error(tls, pCtx, zMsg, -1) Xsqlite3_free(tls, zMsg) goto __5 __4: Xsqlite3_result_error_nomem(tls, pCtx) __5: ; return uintptr(0) } func jsonWrongNumArgs(tls *libc.TLS, pCtx uintptr, zFuncName uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var zMsg uintptr = Xsqlite3_mprintf(tls, ts+26014, libc.VaList(bp, zFuncName)) Xsqlite3_result_error(tls, pCtx, zMsg, -1) Xsqlite3_free(tls, zMsg) } func jsonRemoveAllNulls(tls *libc.TLS, pNode uintptr) { var i int32 var n int32 n = int32((*JsonNode)(unsafe.Pointer(pNode)).Fn) for i = 2; i <= n; i = int32(U32(i) + (jsonNodeSize(tls, pNode+uintptr(i)*16) + U32(1))) { switch int32((*JsonNode)(unsafe.Pointer(pNode + uintptr(i)*16)).FeType) { case JSON_NULL: *(*U8)(unsafe.Pointer(pNode + uintptr(i)*16 + 1)) |= U8(JNODE_REMOVE) break case JSON_OBJECT: jsonRemoveAllNulls(tls, pNode+uintptr(i)*16) break } } } func jsonQuoteFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(136) defer tls.Free(136) _ = argc jsonInit(tls, bp, ctx) jsonAppendValue(tls, bp, *(*uintptr)(unsafe.Pointer(argv))) jsonResult(tls, bp) Xsqlite3_result_subtype(tls, ctx, uint32(JSON_SUBTYPE)) } func jsonArrayFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(136) defer tls.Free(136) var i int32 jsonInit(tls, bp, ctx) jsonAppendChar(tls, bp, int8('[')) for i = 0; i < argc; i++ { jsonAppendSeparator(tls, bp) jsonAppendValue(tls, bp, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) } jsonAppendChar(tls, bp, int8(']')) jsonResult(tls, bp) Xsqlite3_result_subtype(tls, ctx, uint32(JSON_SUBTYPE)) } func jsonArrayLengthFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { var p uintptr var n Sqlite3_int64 = int64(0) var i U32 var pNode uintptr p = jsonParseCached(tls, ctx, argv, ctx) if p == uintptr(0) { return } if argc == 2 { var zPath uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) pNode = jsonLookup(tls, p, zPath, uintptr(0), ctx) } else { pNode = (*JsonParse)(unsafe.Pointer(p)).FaNode } if pNode == uintptr(0) { return } if int32((*JsonNode)(unsafe.Pointer(pNode)).FeType) == JSON_ARRAY { for i = U32(1); i <= (*JsonNode)(unsafe.Pointer(pNode)).Fn; n++ { i = i + jsonNodeSize(tls, pNode+uintptr(i)*16) } } Xsqlite3_result_int64(tls, ctx, n) } func jsonExtractFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(136) defer tls.Free(136) var p uintptr var pNode uintptr var zPath uintptr var flags int32 = int32(Xsqlite3_user_data(tls, ctx)) if argc < 2 { return } p = jsonParseCached(tls, ctx, argv, ctx) if p == uintptr(0) { return } if argc == 2 { zPath = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if zPath == uintptr(0) { return } if flags&JSON_ABPATH != 0 { if int32(*(*int8)(unsafe.Pointer(zPath))) != '$' { jsonInit(tls, bp, ctx) if int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(zPath)))])&0x04 != 0 { jsonAppendRaw(tls, bp, ts+26057, uint32(2)) jsonAppendRaw(tls, bp, zPath, uint32(int32(libc.Xstrlen(tls, zPath)))) jsonAppendRaw(tls, bp, ts+6350, uint32(2)) } else { jsonAppendRaw(tls, bp, ts+26060, uint32(1+libc.Bool32(int32(*(*int8)(unsafe.Pointer(zPath))) != '['))) jsonAppendRaw(tls, bp, zPath, uint32(int32(libc.Xstrlen(tls, zPath)))) jsonAppendChar(tls, bp, int8(0)) } if (*JsonString)(unsafe.Pointer(bp)).FbErr != 0 { pNode = uintptr(0) } else { pNode = jsonLookup(tls, p, (*JsonString)(unsafe.Pointer(bp)).FzBuf, uintptr(0), ctx) } jsonReset(tls, bp) } else { pNode = jsonLookup(tls, p, zPath, uintptr(0), ctx) } if pNode != 0 { if flags&JSON_JSON != 0 { jsonReturnJson(tls, pNode, ctx, uintptr(0)) } else { jsonReturn(tls, pNode, ctx, uintptr(0)) Xsqlite3_result_subtype(tls, ctx, uint32(0)) } } } else { pNode = jsonLookup(tls, p, zPath, uintptr(0), ctx) if int32((*JsonParse)(unsafe.Pointer(p)).FnErr) == 0 && pNode != 0 { jsonReturn(tls, pNode, ctx, uintptr(0)) } } } else { var i int32 jsonInit(tls, bp, ctx) jsonAppendChar(tls, bp, int8('[')) for i = 1; i < argc; i++ { zPath = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) pNode = jsonLookup(tls, p, zPath, uintptr(0), ctx) if (*JsonParse)(unsafe.Pointer(p)).FnErr != 0 { break } jsonAppendSeparator(tls, bp) if pNode != 0 { jsonRenderNode(tls, pNode, bp, uintptr(0)) } else { jsonAppendRaw(tls, bp, ts+7533, uint32(4)) } } if i == argc { jsonAppendChar(tls, bp, int8(']')) jsonResult(tls, bp) Xsqlite3_result_subtype(tls, ctx, uint32(JSON_SUBTYPE)) } jsonReset(tls, bp) } } func jsonMergePatch(tls *libc.TLS, pParse uintptr, iTarget U32, pPatch uintptr) uintptr { var i U32 var j U32 var iRoot U32 var pTarget uintptr if int32((*JsonNode)(unsafe.Pointer(pPatch)).FeType) != JSON_OBJECT { return pPatch } pTarget = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iTarget)*16 if int32((*JsonNode)(unsafe.Pointer(pTarget)).FeType) != JSON_OBJECT { jsonRemoveAllNulls(tls, pPatch) return pPatch } iRoot = iTarget for i = U32(1); i < (*JsonNode)(unsafe.Pointer(pPatch)).Fn; i = i + (jsonNodeSize(tls, pPatch+uintptr(i+U32(1))*16) + U32(1)) { var nKey U32 var zKey uintptr nKey = (*JsonNode)(unsafe.Pointer(pPatch + uintptr(i)*16)).Fn zKey = *(*uintptr)(unsafe.Pointer(pPatch + uintptr(i)*16 + 8)) for j = U32(1); j < (*JsonNode)(unsafe.Pointer(pTarget)).Fn; j = j + (jsonNodeSize(tls, pTarget+uintptr(j+U32(1))*16) + U32(1)) { if (*JsonNode)(unsafe.Pointer(pTarget+uintptr(j)*16)).Fn == nKey && libc.Xstrncmp(tls, *(*uintptr)(unsafe.Pointer(pTarget + uintptr(j)*16 + 8)), zKey, uint64(nKey)) == 0 { if int32((*JsonNode)(unsafe.Pointer(pTarget+uintptr(j+U32(1))*16)).FjnFlags)&(JNODE_REMOVE|JNODE_PATCH) != 0 { break } if int32((*JsonNode)(unsafe.Pointer(pPatch+uintptr(i+U32(1))*16)).FeType) == JSON_NULL { *(*U8)(unsafe.Pointer(pTarget + uintptr(j+U32(1))*16 + 1)) |= U8(JNODE_REMOVE) } else { var pNew uintptr = jsonMergePatch(tls, pParse, iTarget+j+U32(1), pPatch+uintptr(i+U32(1))*16) if pNew == uintptr(0) { return uintptr(0) } pTarget = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iTarget)*16 if pNew != pTarget+uintptr(j+U32(1))*16 { *(*uintptr)(unsafe.Pointer(pTarget + uintptr(j+U32(1))*16 + 8)) = pNew *(*U8)(unsafe.Pointer(pTarget + uintptr(j+U32(1))*16 + 1)) |= U8(JNODE_PATCH) } } break } } if j >= (*JsonNode)(unsafe.Pointer(pTarget)).Fn && int32((*JsonNode)(unsafe.Pointer(pPatch+uintptr(i+U32(1))*16)).FeType) != JSON_NULL { var iStart int32 var iPatch int32 iStart = jsonParseAddNode(tls, pParse, uint32(JSON_OBJECT), uint32(2), uintptr(0)) jsonParseAddNode(tls, pParse, uint32(JSON_STRING), nKey, zKey) iPatch = jsonParseAddNode(tls, pParse, uint32(JSON_TRUE), uint32(0), uintptr(0)) if (*JsonParse)(unsafe.Pointer(pParse)).Foom != 0 { return uintptr(0) } jsonRemoveAllNulls(tls, pPatch) pTarget = (*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iTarget)*16 *(*U8)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iRoot)*16 + 1)) |= U8(JNODE_APPEND) *(*U32)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iRoot)*16 + 8)) = U32(iStart) - iRoot iRoot = U32(iStart) *(*U8)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iPatch)*16 + 1)) |= U8(JNODE_PATCH) *(*uintptr)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(pParse)).FaNode + uintptr(iPatch)*16 + 8)) = pPatch + uintptr(i+U32(1))*16 } } return pTarget } func jsonPatchFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(96) defer tls.Free(96) var pResult uintptr _ = argc if jsonParse(tls, bp, ctx, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv)))) != 0 { return } if jsonParse(tls, bp+48, ctx, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8)))) != 0 { jsonParseReset(tls, bp) return } pResult = jsonMergePatch(tls, bp, uint32(0), (*JsonParse)(unsafe.Pointer(bp+48)).FaNode) if pResult != 0 { jsonReturnJson(tls, pResult, ctx, uintptr(0)) } else { Xsqlite3_result_error_nomem(tls, ctx) } jsonParseReset(tls, bp) jsonParseReset(tls, bp+48) } func jsonObjectFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(136) defer tls.Free(136) var i int32 var z uintptr var n U32 if argc&1 != 0 { Xsqlite3_result_error(tls, ctx, ts+26063, -1) return } jsonInit(tls, bp, ctx) jsonAppendChar(tls, bp, int8('{')) for i = 0; i < argc; i = i + 2 { if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) != SQLITE_TEXT { Xsqlite3_result_error(tls, ctx, ts+26114, -1) jsonReset(tls, bp) return } jsonAppendSeparator(tls, bp) z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) n = U32(Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8)))) jsonAppendString(tls, bp, z, n) jsonAppendChar(tls, bp, int8(':')) jsonAppendValue(tls, bp, *(*uintptr)(unsafe.Pointer(argv + uintptr(i+1)*8))) } jsonAppendChar(tls, bp, int8('}')) jsonResult(tls, bp) Xsqlite3_result_subtype(tls, ctx, uint32(JSON_SUBTYPE)) } func jsonRemoveFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(48) defer tls.Free(48) var pNode uintptr var zPath uintptr var i U32 if !(argc < 1) { goto __1 } return __1: ; if !(jsonParse(tls, bp, ctx, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv)))) != 0) { goto __2 } return __2: ; i = U32(1) __3: if !(i < U32(argc)) { goto __5 } zPath = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) if !(zPath == uintptr(0)) { goto __6 } goto remove_done __6: ; pNode = jsonLookup(tls, bp, zPath, uintptr(0), ctx) if !((*JsonParse)(unsafe.Pointer(bp)).FnErr != 0) { goto __7 } goto remove_done __7: ; if !(pNode != 0) { goto __8 } *(*U8)(unsafe.Pointer(pNode + 1)) |= U8(JNODE_REMOVE) __8: ; goto __4 __4: i++ goto __3 goto __5 __5: ; if !(int32((*JsonNode)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(bp)).FaNode)).FjnFlags)&JNODE_REMOVE == 0) { goto __9 } jsonReturnJson(tls, (*JsonParse)(unsafe.Pointer(bp)).FaNode, ctx, uintptr(0)) __9: ; remove_done: jsonParseReset(tls, bp) } func jsonReplaceFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(48) defer tls.Free(48) var pNode uintptr var zPath uintptr var i U32 if !(argc < 1) { goto __1 } return __1: ; if !(argc&1 == 0) { goto __2 } jsonWrongNumArgs(tls, ctx, ts+16737) return __2: ; if !(jsonParse(tls, bp, ctx, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv)))) != 0) { goto __3 } return __3: ; i = U32(1) __4: if !(i < U32(argc)) { goto __6 } zPath = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) pNode = jsonLookup(tls, bp, zPath, uintptr(0), ctx) if !((*JsonParse)(unsafe.Pointer(bp)).FnErr != 0) { goto __7 } goto replace_err __7: ; if !(pNode != 0) { goto __8 } *(*U8)(unsafe.Pointer(pNode + 1)) |= U8(int32(U8(JNODE_REPLACE))) *(*U32)(unsafe.Pointer(pNode + 8)) = i + U32(1) __8: ; goto __5 __5: i = i + U32(2) goto __4 goto __6 __6: ; if !(int32((*JsonNode)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(bp)).FaNode)).FjnFlags)&JNODE_REPLACE != 0) { goto __9 } Xsqlite3_result_value(tls, ctx, *(*uintptr)(unsafe.Pointer(argv + uintptr(*(*U32)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(bp)).FaNode + 8)))*8))) goto __10 __9: jsonReturnJson(tls, (*JsonParse)(unsafe.Pointer(bp)).FaNode, ctx, argv) __10: ; replace_err: jsonParseReset(tls, bp) } func jsonSetFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { bp := tls.Alloc(52) defer tls.Free(52) var pNode uintptr var zPath uintptr var i U32 var bIsSet int32 bIsSet = libc.Bool32(Xsqlite3_user_data(tls, ctx) != uintptr(0)) if !(argc < 1) { goto __1 } return __1: ; if !(argc&1 == 0) { goto __2 } jsonWrongNumArgs(tls, ctx, func() uintptr { if bIsSet != 0 { return ts + 26148 } return ts + 26152 }()) return __2: ; if !(jsonParse(tls, bp, ctx, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv)))) != 0) { goto __3 } return __3: ; i = U32(1) __4: if !(i < U32(argc)) { goto __6 } zPath = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) *(*int32)(unsafe.Pointer(bp + 48)) = 0 pNode = jsonLookup(tls, bp, zPath, bp+48, ctx) if !((*JsonParse)(unsafe.Pointer(bp)).Foom != 0) { goto __7 } Xsqlite3_result_error_nomem(tls, ctx) goto jsonSetDone goto __8 __7: if !((*JsonParse)(unsafe.Pointer(bp)).FnErr != 0) { goto __9 } goto jsonSetDone goto __10 __9: if !(pNode != 0 && (*(*int32)(unsafe.Pointer(bp + 48)) != 0 || bIsSet != 0)) { goto __11 } *(*U8)(unsafe.Pointer(pNode + 1)) |= U8(int32(U8(JNODE_REPLACE))) *(*U32)(unsafe.Pointer(pNode + 8)) = i + U32(1) __11: ; __10: ; __8: ; goto __5 __5: i = i + U32(2) goto __4 goto __6 __6: ; if !(int32((*JsonNode)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(bp)).FaNode)).FjnFlags)&JNODE_REPLACE != 0) { goto __12 } Xsqlite3_result_value(tls, ctx, *(*uintptr)(unsafe.Pointer(argv + uintptr(*(*U32)(unsafe.Pointer((*JsonParse)(unsafe.Pointer(bp)).FaNode + 8)))*8))) goto __13 __12: jsonReturnJson(tls, (*JsonParse)(unsafe.Pointer(bp)).FaNode, ctx, argv) __13: ; jsonSetDone: jsonParseReset(tls, bp) } func jsonTypeFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { var p uintptr var zPath uintptr var pNode uintptr p = jsonParseCached(tls, ctx, argv, ctx) if p == uintptr(0) { return } if argc == 2 { zPath = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) pNode = jsonLookup(tls, p, zPath, uintptr(0), ctx) } else { pNode = (*JsonParse)(unsafe.Pointer(p)).FaNode } if pNode != 0 { Xsqlite3_result_text(tls, ctx, jsonType[(*JsonNode)(unsafe.Pointer(pNode)).FeType], -1, uintptr(0)) } } func jsonValidFunc(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { var p uintptr _ = argc p = jsonParseCached(tls, ctx, argv, uintptr(0)) Xsqlite3_result_int(tls, ctx, libc.Bool32(p != uintptr(0))) } func jsonArrayStep(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { var pStr uintptr _ = argc pStr = Xsqlite3_aggregate_context(tls, ctx, int32(unsafe.Sizeof(JsonString{}))) if pStr != 0 { if (*JsonString)(unsafe.Pointer(pStr)).FzBuf == uintptr(0) { jsonInit(tls, pStr, ctx) jsonAppendChar(tls, pStr, int8('[')) } else if (*JsonString)(unsafe.Pointer(pStr)).FnUsed > uint64(1) { jsonAppendChar(tls, pStr, int8(',')) } (*JsonString)(unsafe.Pointer(pStr)).FpCtx = ctx jsonAppendValue(tls, pStr, *(*uintptr)(unsafe.Pointer(argv))) } } func jsonArrayCompute(tls *libc.TLS, ctx uintptr, isFinal int32) { var pStr uintptr pStr = Xsqlite3_aggregate_context(tls, ctx, 0) if pStr != 0 { (*JsonString)(unsafe.Pointer(pStr)).FpCtx = ctx jsonAppendChar(tls, pStr, int8(']')) if (*JsonString)(unsafe.Pointer(pStr)).FbErr != 0 { if int32((*JsonString)(unsafe.Pointer(pStr)).FbErr) == 1 { Xsqlite3_result_error_nomem(tls, ctx) } } else if isFinal != 0 { Xsqlite3_result_text(tls, ctx, (*JsonString)(unsafe.Pointer(pStr)).FzBuf, int32((*JsonString)(unsafe.Pointer(pStr)).FnUsed), func() uintptr { if (*JsonString)(unsafe.Pointer(pStr)).FbStatic != 0 { return libc.UintptrFromInt32(-1) } return *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free})) }()) (*JsonString)(unsafe.Pointer(pStr)).FbStatic = U8(1) } else { Xsqlite3_result_text(tls, ctx, (*JsonString)(unsafe.Pointer(pStr)).FzBuf, int32((*JsonString)(unsafe.Pointer(pStr)).FnUsed), libc.UintptrFromInt32(-1)) (*JsonString)(unsafe.Pointer(pStr)).FnUsed-- } } else { Xsqlite3_result_text(tls, ctx, ts+26159, 2, uintptr(0)) } Xsqlite3_result_subtype(tls, ctx, uint32(JSON_SUBTYPE)) } func jsonArrayValue(tls *libc.TLS, ctx uintptr) { jsonArrayCompute(tls, ctx, 0) } func jsonArrayFinal(tls *libc.TLS, ctx uintptr) { jsonArrayCompute(tls, ctx, 1) } func jsonGroupInverse(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { var i uint32 var inStr int32 = 0 var nNest int32 = 0 var z uintptr var c int8 var pStr uintptr _ = argc _ = argv pStr = Xsqlite3_aggregate_context(tls, ctx, 0) if !(pStr != 0) { return } z = (*JsonString)(unsafe.Pointer(pStr)).FzBuf for i = uint32(1); U64(i) < (*JsonString)(unsafe.Pointer(pStr)).FnUsed && (int32(libc.AssignInt8(&c, *(*int8)(unsafe.Pointer(z + uintptr(i))))) != ',' || inStr != 0 || nNest != 0); i++ { if int32(c) == '"' { inStr = libc.BoolInt32(!(inStr != 0)) } else if int32(c) == '\\' { i++ } else if !(inStr != 0) { if int32(c) == '{' || int32(c) == '[' { nNest++ } if int32(c) == '}' || int32(c) == ']' { nNest-- } } } if U64(i) < (*JsonString)(unsafe.Pointer(pStr)).FnUsed { *(*U64)(unsafe.Pointer(pStr + 24)) -= U64(i) libc.Xmemmove(tls, z+1, z+uintptr(i+uint32(1)), (*JsonString)(unsafe.Pointer(pStr)).FnUsed-uint64(1)) *(*int8)(unsafe.Pointer(z + uintptr((*JsonString)(unsafe.Pointer(pStr)).FnUsed))) = int8(0) } else { (*JsonString)(unsafe.Pointer(pStr)).FnUsed = uint64(1) } } func jsonObjectStep(tls *libc.TLS, ctx uintptr, argc int32, argv uintptr) { var pStr uintptr var z uintptr var n U32 _ = argc pStr = Xsqlite3_aggregate_context(tls, ctx, int32(unsafe.Sizeof(JsonString{}))) if pStr != 0 { if (*JsonString)(unsafe.Pointer(pStr)).FzBuf == uintptr(0) { jsonInit(tls, pStr, ctx) jsonAppendChar(tls, pStr, int8('{')) } else if (*JsonString)(unsafe.Pointer(pStr)).FnUsed > uint64(1) { jsonAppendChar(tls, pStr, int8(',')) } (*JsonString)(unsafe.Pointer(pStr)).FpCtx = ctx z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) n = U32(Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv)))) jsonAppendString(tls, pStr, z, n) jsonAppendChar(tls, pStr, int8(':')) jsonAppendValue(tls, pStr, *(*uintptr)(unsafe.Pointer(argv + 1*8))) } } func jsonObjectCompute(tls *libc.TLS, ctx uintptr, isFinal int32) { var pStr uintptr pStr = Xsqlite3_aggregate_context(tls, ctx, 0) if pStr != 0 { jsonAppendChar(tls, pStr, int8('}')) if (*JsonString)(unsafe.Pointer(pStr)).FbErr != 0 { if int32((*JsonString)(unsafe.Pointer(pStr)).FbErr) == 1 { Xsqlite3_result_error_nomem(tls, ctx) } } else if isFinal != 0 { Xsqlite3_result_text(tls, ctx, (*JsonString)(unsafe.Pointer(pStr)).FzBuf, int32((*JsonString)(unsafe.Pointer(pStr)).FnUsed), func() uintptr { if (*JsonString)(unsafe.Pointer(pStr)).FbStatic != 0 { return libc.UintptrFromInt32(-1) } return *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free})) }()) (*JsonString)(unsafe.Pointer(pStr)).FbStatic = U8(1) } else { Xsqlite3_result_text(tls, ctx, (*JsonString)(unsafe.Pointer(pStr)).FzBuf, int32((*JsonString)(unsafe.Pointer(pStr)).FnUsed), libc.UintptrFromInt32(-1)) (*JsonString)(unsafe.Pointer(pStr)).FnUsed-- } } else { Xsqlite3_result_text(tls, ctx, ts+26162, 2, uintptr(0)) } Xsqlite3_result_subtype(tls, ctx, uint32(JSON_SUBTYPE)) } func jsonObjectValue(tls *libc.TLS, ctx uintptr) { jsonObjectCompute(tls, ctx, 0) } func jsonObjectFinal(tls *libc.TLS, ctx uintptr) { jsonObjectCompute(tls, ctx, 1) } // *************************************************************************** // // The json_each virtual table type JsonEachCursor1 = struct { Fbase Sqlite3_vtab_cursor FiRowid U32 FiBegin U32 Fi U32 FiEnd U32 FeType U8 FbRecursive U8 F__ccgo_pad1 [6]byte FzJson uintptr FzRoot uintptr FsParse JsonParse } // *************************************************************************** // // The json_each virtual table type JsonEachCursor = JsonEachCursor1 func jsonEachConnect(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { var pNew uintptr var rc int32 _ = pzErr _ = argv _ = argc _ = pAux rc = Xsqlite3_declare_vtab(tls, db, ts+26165) if rc == SQLITE_OK { pNew = libc.AssignPtrUintptr(ppVtab, Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Sqlite3_vtab{})))) if pNew == uintptr(0) { return SQLITE_NOMEM } libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Sqlite3_vtab{}))) Xsqlite3_vtab_config(tls, db, SQLITE_VTAB_INNOCUOUS, 0) } return rc } func jsonEachDisconnect(tls *libc.TLS, pVtab uintptr) int32 { Xsqlite3_free(tls, pVtab) return SQLITE_OK } func jsonEachOpenEach(tls *libc.TLS, p uintptr, ppCursor uintptr) int32 { var pCur uintptr _ = p pCur = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(JsonEachCursor{}))) if pCur == uintptr(0) { return SQLITE_NOMEM } libc.Xmemset(tls, pCur, 0, uint64(unsafe.Sizeof(JsonEachCursor{}))) *(*uintptr)(unsafe.Pointer(ppCursor)) = pCur return SQLITE_OK } func jsonEachOpenTree(tls *libc.TLS, p uintptr, ppCursor uintptr) int32 { var rc int32 = jsonEachOpenEach(tls, p, ppCursor) if rc == SQLITE_OK { var pCur uintptr = *(*uintptr)(unsafe.Pointer(ppCursor)) (*JsonEachCursor)(unsafe.Pointer(pCur)).FbRecursive = U8(1) } return rc } func jsonEachCursorReset(tls *libc.TLS, p uintptr) { Xsqlite3_free(tls, (*JsonEachCursor)(unsafe.Pointer(p)).FzJson) Xsqlite3_free(tls, (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot) jsonParseReset(tls, p+48) (*JsonEachCursor)(unsafe.Pointer(p)).FiRowid = U32(0) (*JsonEachCursor)(unsafe.Pointer(p)).Fi = U32(0) (*JsonEachCursor)(unsafe.Pointer(p)).FiEnd = U32(0) (*JsonEachCursor)(unsafe.Pointer(p)).FeType = U8(0) (*JsonEachCursor)(unsafe.Pointer(p)).FzJson = uintptr(0) (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot = uintptr(0) } func jsonEachClose(tls *libc.TLS, cur uintptr) int32 { var p uintptr = cur jsonEachCursorReset(tls, p) Xsqlite3_free(tls, cur) return SQLITE_OK } func jsonEachEof(tls *libc.TLS, cur uintptr) int32 { var p uintptr = cur return libc.Bool32((*JsonEachCursor)(unsafe.Pointer(p)).Fi >= (*JsonEachCursor)(unsafe.Pointer(p)).FiEnd) } func jsonEachNext(tls *libc.TLS, cur uintptr) int32 { var p uintptr = cur if (*JsonEachCursor)(unsafe.Pointer(p)).FbRecursive != 0 { if int32((*JsonNode)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode+uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*16)).FjnFlags)&JNODE_LABEL != 0 { (*JsonEachCursor)(unsafe.Pointer(p)).Fi++ } (*JsonEachCursor)(unsafe.Pointer(p)).Fi++ (*JsonEachCursor)(unsafe.Pointer(p)).FiRowid++ if (*JsonEachCursor)(unsafe.Pointer(p)).Fi < (*JsonEachCursor)(unsafe.Pointer(p)).FiEnd { var iUp U32 = *(*U32)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaUp + uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*4)) var pUp uintptr = (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode + uintptr(iUp)*16 (*JsonEachCursor)(unsafe.Pointer(p)).FeType = (*JsonNode)(unsafe.Pointer(pUp)).FeType if int32((*JsonNode)(unsafe.Pointer(pUp)).FeType) == JSON_ARRAY { if iUp == (*JsonEachCursor)(unsafe.Pointer(p)).Fi-U32(1) { *(*U32)(unsafe.Pointer(pUp + 8)) = U32(0) } else { *(*U32)(unsafe.Pointer(pUp + 8))++ } } } } else { switch int32((*JsonEachCursor)(unsafe.Pointer(p)).FeType) { case JSON_ARRAY: { *(*U32)(unsafe.Pointer(p + 16)) += jsonNodeSize(tls, (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode+uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*16) (*JsonEachCursor)(unsafe.Pointer(p)).FiRowid++ break } fallthrough case JSON_OBJECT: { *(*U32)(unsafe.Pointer(p + 16)) += U32(1) + jsonNodeSize(tls, (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode+uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi+U32(1))*16) (*JsonEachCursor)(unsafe.Pointer(p)).FiRowid++ break } fallthrough default: { (*JsonEachCursor)(unsafe.Pointer(p)).Fi = (*JsonEachCursor)(unsafe.Pointer(p)).FiEnd break } } } return SQLITE_OK } func jsonAppendObjectPathElement(tls *libc.TLS, pStr uintptr, pNode uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var jj int32 var nn int32 var z uintptr z = *(*uintptr)(unsafe.Pointer(pNode + 8)) nn = int32((*JsonNode)(unsafe.Pointer(pNode)).Fn) if nn > 2 && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + 1)))])&0x02 != 0 { for jj = 2; jj < nn-1 && int32(Xsqlite3CtypeMap[uint8(*(*int8)(unsafe.Pointer(z + uintptr(jj))))])&0x06 != 0; jj++ { } if jj == nn-1 { z++ nn = nn - 2 } } jsonPrintf(tls, nn+2, pStr, ts+26248, libc.VaList(bp, nn, z)) } func jsonEachComputePath(tls *libc.TLS, p uintptr, pStr uintptr, i U32) { bp := tls.Alloc(8) defer tls.Free(8) var pNode uintptr var pUp uintptr var iUp U32 if i == U32(0) { jsonAppendChar(tls, pStr, int8('$')) return } iUp = *(*U32)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaUp + uintptr(i)*4)) jsonEachComputePath(tls, p, pStr, iUp) pNode = (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode + uintptr(i)*16 pUp = (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode + uintptr(iUp)*16 if int32((*JsonNode)(unsafe.Pointer(pUp)).FeType) == JSON_ARRAY { jsonPrintf(tls, 30, pStr, ts+26254, libc.VaList(bp, *(*U32)(unsafe.Pointer(pUp + 8)))) } else { if int32((*JsonNode)(unsafe.Pointer(pNode)).FjnFlags)&JNODE_LABEL == 0 { pNode -= 16 } jsonAppendObjectPathElement(tls, pStr, pNode) } } func jsonEachColumn(tls *libc.TLS, cur uintptr, ctx uintptr, i int32) int32 { bp := tls.Alloc(280) defer tls.Free(280) var p uintptr = cur var pThis uintptr = (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode + uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*16 switch i { case JEACH_KEY: { if (*JsonEachCursor)(unsafe.Pointer(p)).Fi == U32(0) { break } if int32((*JsonEachCursor)(unsafe.Pointer(p)).FeType) == JSON_OBJECT { jsonReturn(tls, pThis, ctx, uintptr(0)) } else if int32((*JsonEachCursor)(unsafe.Pointer(p)).FeType) == JSON_ARRAY { var iKey U32 if (*JsonEachCursor)(unsafe.Pointer(p)).FbRecursive != 0 { if (*JsonEachCursor)(unsafe.Pointer(p)).FiRowid == U32(0) { break } iKey = *(*U32)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode + uintptr(*(*U32)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaUp + uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*4)))*16 + 8)) } else { iKey = (*JsonEachCursor)(unsafe.Pointer(p)).FiRowid } Xsqlite3_result_int64(tls, ctx, Sqlite3_int64(iKey)) } break } case JEACH_VALUE: { if int32((*JsonNode)(unsafe.Pointer(pThis)).FjnFlags)&JNODE_LABEL != 0 { pThis += 16 } jsonReturn(tls, pThis, ctx, uintptr(0)) break } case JEACH_TYPE: { if int32((*JsonNode)(unsafe.Pointer(pThis)).FjnFlags)&JNODE_LABEL != 0 { pThis += 16 } Xsqlite3_result_text(tls, ctx, jsonType[(*JsonNode)(unsafe.Pointer(pThis)).FeType], -1, uintptr(0)) break } case JEACH_ATOM: { if int32((*JsonNode)(unsafe.Pointer(pThis)).FjnFlags)&JNODE_LABEL != 0 { pThis += 16 } if int32((*JsonNode)(unsafe.Pointer(pThis)).FeType) >= JSON_ARRAY { break } jsonReturn(tls, pThis, ctx, uintptr(0)) break } case JEACH_ID: { Xsqlite3_result_int64(tls, ctx, Sqlite3_int64((*JsonEachCursor)(unsafe.Pointer(p)).Fi)+Sqlite3_int64(libc.Bool32(int32((*JsonNode)(unsafe.Pointer(pThis)).FjnFlags)&JNODE_LABEL != 0))) break } case JEACH_PARENT: { if (*JsonEachCursor)(unsafe.Pointer(p)).Fi > (*JsonEachCursor)(unsafe.Pointer(p)).FiBegin && (*JsonEachCursor)(unsafe.Pointer(p)).FbRecursive != 0 { Xsqlite3_result_int64(tls, ctx, Sqlite3_int64(*(*U32)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaUp + uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*4)))) } break } case JEACH_FULLKEY: { jsonInit(tls, bp+8, ctx) if (*JsonEachCursor)(unsafe.Pointer(p)).FbRecursive != 0 { jsonEachComputePath(tls, p, bp+8, (*JsonEachCursor)(unsafe.Pointer(p)).Fi) } else { if (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot != 0 { jsonAppendRaw(tls, bp+8, (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot, uint32(int32(libc.Xstrlen(tls, (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot)))) } else { jsonAppendChar(tls, bp+8, int8('$')) } if int32((*JsonEachCursor)(unsafe.Pointer(p)).FeType) == JSON_ARRAY { jsonPrintf(tls, 30, bp+8, ts+26254, libc.VaList(bp, (*JsonEachCursor)(unsafe.Pointer(p)).FiRowid)) } else if int32((*JsonEachCursor)(unsafe.Pointer(p)).FeType) == JSON_OBJECT { jsonAppendObjectPathElement(tls, bp+8, pThis) } } jsonResult(tls, bp+8) break } case JEACH_PATH: { if (*JsonEachCursor)(unsafe.Pointer(p)).FbRecursive != 0 { jsonInit(tls, bp+144, ctx) jsonEachComputePath(tls, p, bp+144, *(*U32)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaUp + uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*4))) jsonResult(tls, bp+144) break } } fallthrough default: { var zRoot uintptr = (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot if zRoot == uintptr(0) { zRoot = ts + 26259 } Xsqlite3_result_text(tls, ctx, zRoot, -1, uintptr(0)) break } case JEACH_JSON: { Xsqlite3_result_text(tls, ctx, (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FzJson, -1, uintptr(0)) break } } return SQLITE_OK } func jsonEachRowid(tls *libc.TLS, cur uintptr, pRowid uintptr) int32 { var p uintptr = cur *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = Sqlite_int64((*JsonEachCursor)(unsafe.Pointer(p)).FiRowid) return SQLITE_OK } func jsonEachBestIndex(tls *libc.TLS, tab uintptr, pIdxInfo uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var i int32 var unusableMask int32 = 0 var idxMask int32 = 0 var pConstraint uintptr _ = tab *(*int32)(unsafe.Pointer(bp)) = libc.AssignPtrInt32(bp+1*4, -1) pConstraint = (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint i = 0 __1: if !(i < (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint) { goto __3 } { var iCol int32 var iMask int32 if (*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).FiColumn < JEACH_JSON { goto __2 } iCol = (*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).FiColumn - JEACH_JSON iMask = int32(1) << iCol if int32((*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).Fusable) == 0 { unusableMask = unusableMask | iMask } else if int32((*sqlite3_index_constraint)(unsafe.Pointer(pConstraint)).Fop) == SQLITE_INDEX_CONSTRAINT_EQ { *(*int32)(unsafe.Pointer(bp + uintptr(iCol)*4)) = i idxMask = idxMask | iMask } } goto __2 __2: i++ pConstraint += 12 goto __1 goto __3 __3: ; if (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnOrderBy > 0 && (*sqlite3_index_orderby)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaOrderBy)).FiColumn < 0 && int32((*sqlite3_index_orderby)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaOrderBy)).Fdesc) == 0 { (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).ForderByConsumed = 1 } if unusableMask & ^idxMask != 0 { return SQLITE_CONSTRAINT } if *(*int32)(unsafe.Pointer(bp)) < 0 { (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 0 } else { (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = 1.0 i = *(*int32)(unsafe.Pointer(bp)) (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(i)*8)).FargvIndex = 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(i)*8)).Fomit = uint8(1) if *(*int32)(unsafe.Pointer(bp + 1*4)) < 0 { (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 1 } else { i = *(*int32)(unsafe.Pointer(bp + 1*4)) (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(i)*8)).FargvIndex = 2 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(i)*8)).Fomit = uint8(1) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 3 } } return SQLITE_OK } func jsonEachFilter(tls *libc.TLS, cur uintptr, idxNum int32, idxStr uintptr, argc int32, argv uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr = cur var z uintptr var zRoot uintptr = uintptr(0) var n Sqlite3_int64 _ = idxStr _ = argc jsonEachCursorReset(tls, p) if idxNum == 0 { return SQLITE_OK } z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if z == uintptr(0) { return SQLITE_OK } n = Sqlite3_int64(Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv)))) (*JsonEachCursor)(unsafe.Pointer(p)).FzJson = Xsqlite3_malloc64(tls, uint64(n+int64(1))) if (*JsonEachCursor)(unsafe.Pointer(p)).FzJson == uintptr(0) { return SQLITE_NOMEM } libc.Xmemcpy(tls, (*JsonEachCursor)(unsafe.Pointer(p)).FzJson, z, Size_t(n)+uint64(1)) if jsonParse(tls, p+48, uintptr(0), (*JsonEachCursor)(unsafe.Pointer(p)).FzJson) != 0 { var rc int32 = SQLITE_NOMEM if int32((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.Foom) == 0 { Xsqlite3_free(tls, (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab)).FzErrMsg) (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab)).FzErrMsg = Xsqlite3_mprintf(tls, ts+25969, 0) if (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab)).FzErrMsg != 0 { rc = SQLITE_ERROR } } jsonEachCursorReset(tls, p) return rc } else if (*JsonEachCursor)(unsafe.Pointer(p)).FbRecursive != 0 && jsonParseFindParents(tls, p+48) != 0 { jsonEachCursorReset(tls, p) return SQLITE_NOMEM } else { var pNode uintptr = uintptr(0) if idxNum == 3 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) zRoot = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) if zRoot == uintptr(0) { return SQLITE_OK } n = Sqlite3_int64(Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8)))) (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot = Xsqlite3_malloc64(tls, uint64(n+int64(1))) if (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot == uintptr(0) { return SQLITE_NOMEM } libc.Xmemcpy(tls, (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot, zRoot, Size_t(n)+uint64(1)) if int32(*(*int8)(unsafe.Pointer(zRoot))) != '$' { *(*uintptr)(unsafe.Pointer(bp)) = zRoot } else { pNode = jsonLookupStep(tls, p+48, uint32(0), (*JsonEachCursor)(unsafe.Pointer(p)).FzRoot+uintptr(1), uintptr(0), bp) } if *(*uintptr)(unsafe.Pointer(bp)) != 0 { Xsqlite3_free(tls, (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab)).FzErrMsg) (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab)).FzErrMsg = jsonPathSyntaxError(tls, *(*uintptr)(unsafe.Pointer(bp))) jsonEachCursorReset(tls, p) if (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab)).FzErrMsg != 0 { return SQLITE_ERROR } return SQLITE_NOMEM } else if pNode == uintptr(0) { return SQLITE_OK } } else { pNode = (*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode } (*JsonEachCursor)(unsafe.Pointer(p)).FiBegin = libc.AssignPtrUint32(p+16, U32(int32((int64(pNode)-int64((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode))/16))) (*JsonEachCursor)(unsafe.Pointer(p)).FeType = (*JsonNode)(unsafe.Pointer(pNode)).FeType if int32((*JsonEachCursor)(unsafe.Pointer(p)).FeType) >= JSON_ARRAY { *(*U32)(unsafe.Pointer(pNode + 8)) = U32(0) (*JsonEachCursor)(unsafe.Pointer(p)).FiEnd = (*JsonEachCursor)(unsafe.Pointer(p)).Fi + (*JsonNode)(unsafe.Pointer(pNode)).Fn + U32(1) if (*JsonEachCursor)(unsafe.Pointer(p)).FbRecursive != 0 { (*JsonEachCursor)(unsafe.Pointer(p)).FeType = (*JsonNode)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode + uintptr(*(*U32)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaUp + uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi)*4)))*16)).FeType if (*JsonEachCursor)(unsafe.Pointer(p)).Fi > U32(0) && int32((*JsonNode)(unsafe.Pointer((*JsonEachCursor)(unsafe.Pointer(p)).FsParse.FaNode+uintptr((*JsonEachCursor)(unsafe.Pointer(p)).Fi-U32(1))*16)).FjnFlags)&JNODE_LABEL != 0 { (*JsonEachCursor)(unsafe.Pointer(p)).Fi-- } } else { (*JsonEachCursor)(unsafe.Pointer(p)).Fi++ } } else { (*JsonEachCursor)(unsafe.Pointer(p)).FiEnd = (*JsonEachCursor)(unsafe.Pointer(p)).Fi + U32(1) } } return SQLITE_OK } var jsonEachModule = Sqlite3_module{ FxConnect: 0, FxBestIndex: 0, FxDisconnect: 0, FxOpen: 0, FxClose: 0, FxFilter: 0, FxNext: 0, FxEof: 0, FxColumn: 0, FxRowid: 0, } var jsonTreeModule = Sqlite3_module{ FxConnect: 0, FxBestIndex: 0, FxDisconnect: 0, FxOpen: 0, FxClose: 0, FxFilter: 0, FxNext: 0, FxEof: 0, FxColumn: 0, FxRowid: 0, } // Register JSON functions. func Xsqlite3RegisterJsonFunctions(tls *libc.TLS) { Xsqlite3InsertBuiltinFuncs(tls, uintptr(unsafe.Pointer(&aJsonFunc)), int32(uint64(unsafe.Sizeof(aJsonFunc))/uint64(unsafe.Sizeof(FuncDef{})))) } var aJsonFunc = [19]FuncDef{ {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26261}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26266}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26277}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26277}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26295}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: uintptr(int64(JSON_JSON)), FxSFunc: 0, FzName: ts + 26308}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: uintptr(int64(JSON_SQL)), FxSFunc: 0, FzName: ts + 26311}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26315}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26327}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26339}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26350}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26361}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26373}, {FnArg: int8(-1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FpUserData: uintptr(int64(JSON_ISSET)), FxSFunc: 0, FzName: ts + 26386}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26395}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26395}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_DETERMINISTIC | SQLITE_FUNC_CONSTANT | SQLITE_UTF8), FxSFunc: 0, FzName: ts + 26405}, {FnArg: int8(1), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | SQLITE_SUBTYPE | SQLITE_UTF8 | SQLITE_DETERMINISTIC), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 26416}, {FnArg: int8(2), FfuncFlags: U32(SQLITE_FUNC_BUILTIN | SQLITE_UTF8 | 0*SQLITE_FUNC_NEEDCOLL | SQLITE_SUBTYPE | SQLITE_UTF8 | SQLITE_DETERMINISTIC), FxSFunc: 0, FxFinalize: 0, FxValue: 0, FxInverse: 0, FzName: ts + 26433}} // Register the JSON table-valued functions func Xsqlite3JsonTableFunctions(tls *libc.TLS, db uintptr) int32 { var rc int32 = SQLITE_OK var i uint32 for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(aMod))/uint64(unsafe.Sizeof(struct { FzName uintptr FpModule uintptr }{})) && rc == SQLITE_OK; i++ { rc = Xsqlite3_create_module(tls, db, aMod[i].FzName, aMod[i].FpModule, uintptr(0)) } return rc } var aMod = [2]struct { FzName uintptr FpModule uintptr }{ {FzName: ts + 26451, FpModule: 0}, {FzName: ts + 26461, FpModule: 0}, } type Rtree1 = struct { Fbase Sqlite3_vtab Fdb uintptr FiNodeSize int32 FnDim U8 FnDim2 U8 FeCoordType U8 FnBytesPerCell U8 FinWrTrans U8 FnAux U8 FnAuxNotNull U8 F__ccgo_pad1 [1]byte FiDepth int32 FzDb uintptr FzName uintptr FnBusy U32 F__ccgo_pad2 [4]byte FnRowEst I64 FnCursor U32 FnNodeRef U32 FzReadAuxSql uintptr FpDeleted uintptr FiReinsertHeight int32 F__ccgo_pad3 [4]byte FpNodeBlob uintptr FpWriteNode uintptr FpDeleteNode uintptr FpReadRowid uintptr FpWriteRowid uintptr FpDeleteRowid uintptr FpReadParent uintptr FpWriteParent uintptr FpDeleteParent uintptr FpWriteAux uintptr FaHash [97]uintptr } type Rtree = Rtree1 type RtreeCursor1 = struct { Fbase Sqlite3_vtab_cursor FatEOF U8 FbPoint U8 FbAuxValid U8 F__ccgo_pad1 [1]byte FiStrategy int32 FnConstraint int32 F__ccgo_pad2 [4]byte FaConstraint uintptr FnPointAlloc int32 FnPoint int32 FmxLevel int32 F__ccgo_pad3 [4]byte FaPoint uintptr FpReadAux uintptr FsPoint RtreeSearchPoint FaNode [5]uintptr FanQueue [41]U32 F__ccgo_pad4 [4]byte } type RtreeCursor = RtreeCursor1 type RtreeNode1 = struct { FpParent uintptr FiNode I64 FnRef int32 FisDirty int32 FzData uintptr FpNext uintptr } type RtreeNode = RtreeNode1 type RtreeCell1 = struct { FiRowid I64 FaCoord [10]RtreeCoord } type RtreeCell = RtreeCell1 type RtreeConstraint1 = struct { FiCoord int32 Fop int32 Fu struct{ FrValue RtreeDValue } FpInfo uintptr } type RtreeConstraint = RtreeConstraint1 type RtreeMatchArg1 = struct { FiSize U32 F__ccgo_pad1 [4]byte Fcb RtreeGeomCallback FnParam int32 F__ccgo_pad2 [4]byte FapSqlParam uintptr FaParam [1]RtreeDValue } type RtreeMatchArg = RtreeMatchArg1 type RtreeGeomCallback1 = struct { FxGeom uintptr FxQueryFunc uintptr FxDestructor uintptr FpContext uintptr } type RtreeGeomCallback = RtreeGeomCallback1 type RtreeCoord1 = struct{ Ff RtreeValue } type RtreeCoord = RtreeCoord1 type RtreeSearchPoint1 = struct { FrScore RtreeDValue Fid Sqlite3_int64 FiLevel U8 FeWithin U8 FiCell U8 F__ccgo_pad1 [5]byte } type RtreeSearchPoint = RtreeSearchPoint1 // If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will // only deal with integer coordinates. No floating point operations // will be done. type RtreeDValue = float64 type RtreeValue = float32 func readInt16(tls *libc.TLS, p uintptr) int32 { return int32(*(*U8)(unsafe.Pointer(p)))<<8 + int32(*(*U8)(unsafe.Pointer(p + 1))) } func readCoord(tls *libc.TLS, p uintptr, pCoord uintptr) { *(*U32)(unsafe.Pointer(pCoord)) = libc.X_byteswap_ulong(tls, *(*U32)(unsafe.Pointer(p))) } func readInt64(tls *libc.TLS, p uintptr) I64 { bp := tls.Alloc(8) defer tls.Free(8) libc.Xmemcpy(tls, bp, p, uint64(8)) return I64(libc.X_byteswap_uint64(tls, *(*U64)(unsafe.Pointer(bp)))) } func writeInt16(tls *libc.TLS, p uintptr, i int32) { *(*U8)(unsafe.Pointer(p)) = U8(i >> 8 & 0xFF) *(*U8)(unsafe.Pointer(p + 1)) = U8(i >> 0 & 0xFF) } func writeCoord(tls *libc.TLS, p uintptr, pCoord uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*U32)(unsafe.Pointer(bp)) = libc.X__builtin_bswap32(tls, *(*U32)(unsafe.Pointer(pCoord))) libc.Xmemcpy(tls, p, bp, uint64(4)) return 4 } func writeInt64(tls *libc.TLS, p uintptr, i I64) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*I64)(unsafe.Pointer(bp)) = i *(*I64)(unsafe.Pointer(bp)) = I64(libc.X__builtin_bswap64(tls, U64(*(*I64)(unsafe.Pointer(bp))))) libc.Xmemcpy(tls, p, bp, uint64(8)) return 8 } func nodeReference(tls *libc.TLS, p uintptr) { if p != 0 { (*RtreeNode)(unsafe.Pointer(p)).FnRef++ } } func nodeZero(tls *libc.TLS, pRtree uintptr, p uintptr) { libc.Xmemset(tls, (*RtreeNode)(unsafe.Pointer(p)).FzData+2, 0, uint64((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize-2)) (*RtreeNode)(unsafe.Pointer(p)).FisDirty = 1 } func nodeHash(tls *libc.TLS, iNode I64) uint32 { return uint32(iNode) % uint32(HASHSIZE) } func nodeHashLookup(tls *libc.TLS, pRtree uintptr, iNode I64) uintptr { var p uintptr for p = *(*uintptr)(unsafe.Pointer(pRtree + 192 + uintptr(nodeHash(tls, iNode))*8)); p != 0 && (*RtreeNode)(unsafe.Pointer(p)).FiNode != iNode; p = (*RtreeNode)(unsafe.Pointer(p)).FpNext { } return p } func nodeHashInsert(tls *libc.TLS, pRtree uintptr, pNode uintptr) { var iHash int32 iHash = int32(nodeHash(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode)) (*RtreeNode)(unsafe.Pointer(pNode)).FpNext = *(*uintptr)(unsafe.Pointer(pRtree + 192 + uintptr(iHash)*8)) *(*uintptr)(unsafe.Pointer(pRtree + 192 + uintptr(iHash)*8)) = pNode } func nodeHashDelete(tls *libc.TLS, pRtree uintptr, pNode uintptr) { var pp uintptr if (*RtreeNode)(unsafe.Pointer(pNode)).FiNode != int64(0) { pp = pRtree + 192 + uintptr(nodeHash(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode))*8 for ; *(*uintptr)(unsafe.Pointer(pp)) != pNode; pp = *(*uintptr)(unsafe.Pointer(pp)) + 32 { } *(*uintptr)(unsafe.Pointer(pp)) = (*RtreeNode)(unsafe.Pointer(pNode)).FpNext (*RtreeNode)(unsafe.Pointer(pNode)).FpNext = uintptr(0) } } func nodeNew(tls *libc.TLS, pRtree uintptr, pParent uintptr) uintptr { var pNode uintptr pNode = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(RtreeNode{}))+uint64((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize)) if pNode != 0 { libc.Xmemset(tls, pNode, 0, uint64(unsafe.Sizeof(RtreeNode{}))+uint64((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize)) (*RtreeNode)(unsafe.Pointer(pNode)).FzData = pNode + 1*40 (*RtreeNode)(unsafe.Pointer(pNode)).FnRef = 1 (*Rtree)(unsafe.Pointer(pRtree)).FnNodeRef++ (*RtreeNode)(unsafe.Pointer(pNode)).FpParent = pParent (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty = 1 nodeReference(tls, pParent) } return pNode } func nodeBlobReset(tls *libc.TLS, pRtree uintptr) { if (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob != 0 && int32((*Rtree)(unsafe.Pointer(pRtree)).FinWrTrans) == 0 && (*Rtree)(unsafe.Pointer(pRtree)).FnCursor == U32(0) { var pBlob uintptr = (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob = uintptr(0) Xsqlite3_blob_close(tls, pBlob) } } func nodeAcquire(tls *libc.TLS, pRtree uintptr, iNode I64, pParent uintptr, ppNode uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var pNode uintptr = uintptr(0) if libc.AssignUintptr(&pNode, nodeHashLookup(tls, pRtree, iNode)) != uintptr(0) { if pParent != 0 && pParent != (*RtreeNode)(unsafe.Pointer(pNode)).FpParent { return SQLITE_CORRUPT | int32(1)<<8 } (*RtreeNode)(unsafe.Pointer(pNode)).FnRef++ *(*uintptr)(unsafe.Pointer(ppNode)) = pNode return SQLITE_OK } if (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob != 0 { var pBlob uintptr = (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob = uintptr(0) rc = Xsqlite3_blob_reopen(tls, pBlob, iNode) (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob = pBlob if rc != 0 { nodeBlobReset(tls, pRtree) if rc == SQLITE_NOMEM { return SQLITE_NOMEM } } } if (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob == uintptr(0) { var zTab uintptr = Xsqlite3_mprintf(tls, ts+26471, libc.VaList(bp, (*Rtree)(unsafe.Pointer(pRtree)).FzName)) if zTab == uintptr(0) { return SQLITE_NOMEM } rc = Xsqlite3_blob_open(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, zTab, ts+26479, iNode, 0, pRtree+112) Xsqlite3_free(tls, zTab) } if rc != 0 { nodeBlobReset(tls, pRtree) *(*uintptr)(unsafe.Pointer(ppNode)) = uintptr(0) if rc == SQLITE_ERROR { rc = SQLITE_CORRUPT | int32(1)<<8 } } else if (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize == Xsqlite3_blob_bytes(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob) { pNode = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(RtreeNode{}))+uint64((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize)) if !(pNode != 0) { rc = SQLITE_NOMEM } else { (*RtreeNode)(unsafe.Pointer(pNode)).FpParent = pParent (*RtreeNode)(unsafe.Pointer(pNode)).FzData = pNode + 1*40 (*RtreeNode)(unsafe.Pointer(pNode)).FnRef = 1 (*Rtree)(unsafe.Pointer(pRtree)).FnNodeRef++ (*RtreeNode)(unsafe.Pointer(pNode)).FiNode = iNode (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty = 0 (*RtreeNode)(unsafe.Pointer(pNode)).FpNext = uintptr(0) rc = Xsqlite3_blob_read(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpNodeBlob, (*RtreeNode)(unsafe.Pointer(pNode)).FzData, (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize, 0) } } if rc == SQLITE_OK && pNode != 0 && iNode == int64(1) { (*Rtree)(unsafe.Pointer(pRtree)).FiDepth = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData) if (*Rtree)(unsafe.Pointer(pRtree)).FiDepth > RTREE_MAX_DEPTH { rc = SQLITE_CORRUPT | int32(1)<<8 } } if pNode != 0 && rc == SQLITE_OK { if readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) > ((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize-4)/int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell) { rc = SQLITE_CORRUPT | int32(1)<<8 } } if rc == SQLITE_OK { if pNode != uintptr(0) { nodeReference(tls, pParent) nodeHashInsert(tls, pRtree, pNode) } else { rc = SQLITE_CORRUPT | int32(1)<<8 } *(*uintptr)(unsafe.Pointer(ppNode)) = pNode } else { if pNode != 0 { (*Rtree)(unsafe.Pointer(pRtree)).FnNodeRef-- Xsqlite3_free(tls, pNode) } *(*uintptr)(unsafe.Pointer(ppNode)) = uintptr(0) } return rc } func nodeOverwriteCell(tls *libc.TLS, pRtree uintptr, pNode uintptr, pCell uintptr, iCell int32) { var ii int32 var p uintptr = (*RtreeNode)(unsafe.Pointer(pNode)).FzData + uintptr(4+int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*iCell) p += uintptr(writeInt64(tls, p, (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid)) for ii = 0; ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2); ii++ { p += uintptr(writeCoord(tls, p, pCell+8+uintptr(ii)*4)) } (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty = 1 } func nodeDeleteCell(tls *libc.TLS, pRtree uintptr, pNode uintptr, iCell int32) { var pDst uintptr = (*RtreeNode)(unsafe.Pointer(pNode)).FzData + uintptr(4+int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*iCell) var pSrc uintptr = pDst + uintptr((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell) var nByte int32 = (readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) - iCell - 1) * int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell) libc.Xmemmove(tls, pDst, pSrc, uint64(nByte)) writeInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2, readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2)-1) (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty = 1 } func nodeInsertCell(tls *libc.TLS, pRtree uintptr, pNode uintptr, pCell uintptr) int32 { var nCell int32 var nMaxCell int32 nMaxCell = ((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize - 4) / int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell) nCell = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) if nCell < nMaxCell { nodeOverwriteCell(tls, pRtree, pNode, pCell, nCell) writeInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2, nCell+1) (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty = 1 } return libc.Bool32(nCell == nMaxCell) } func nodeWrite(tls *libc.TLS, pRtree uintptr, pNode uintptr) int32 { var rc int32 = SQLITE_OK if (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty != 0 { var p uintptr = (*Rtree)(unsafe.Pointer(pRtree)).FpWriteNode if (*RtreeNode)(unsafe.Pointer(pNode)).FiNode != 0 { Xsqlite3_bind_int64(tls, p, 1, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) } else { Xsqlite3_bind_null(tls, p, 1) } Xsqlite3_bind_blob(tls, p, 2, (*RtreeNode)(unsafe.Pointer(pNode)).FzData, (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize, uintptr(0)) Xsqlite3_step(tls, p) (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty = 0 rc = Xsqlite3_reset(tls, p) Xsqlite3_bind_null(tls, p, 2) if (*RtreeNode)(unsafe.Pointer(pNode)).FiNode == int64(0) && rc == SQLITE_OK { (*RtreeNode)(unsafe.Pointer(pNode)).FiNode = Xsqlite3_last_insert_rowid(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb) nodeHashInsert(tls, pRtree, pNode) } } return rc } func nodeRelease(tls *libc.TLS, pRtree uintptr, pNode uintptr) int32 { var rc int32 = SQLITE_OK if pNode != 0 { (*RtreeNode)(unsafe.Pointer(pNode)).FnRef-- if (*RtreeNode)(unsafe.Pointer(pNode)).FnRef == 0 { (*Rtree)(unsafe.Pointer(pRtree)).FnNodeRef-- if (*RtreeNode)(unsafe.Pointer(pNode)).FiNode == int64(1) { (*Rtree)(unsafe.Pointer(pRtree)).FiDepth = -1 } if (*RtreeNode)(unsafe.Pointer(pNode)).FpParent != 0 { rc = nodeRelease(tls, pRtree, (*RtreeNode)(unsafe.Pointer(pNode)).FpParent) } if rc == SQLITE_OK { rc = nodeWrite(tls, pRtree, pNode) } nodeHashDelete(tls, pRtree, pNode) Xsqlite3_free(tls, pNode) } } return rc } func nodeGetRowid(tls *libc.TLS, pRtree uintptr, pNode uintptr, iCell int32) I64 { return readInt64(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+uintptr(4+int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*iCell)) } func nodeGetCoord(tls *libc.TLS, pRtree uintptr, pNode uintptr, iCell int32, iCoord int32, pCoord uintptr) { readCoord(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+uintptr(12+int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*iCell+4*iCoord), pCoord) } func nodeGetCell(tls *libc.TLS, pRtree uintptr, pNode uintptr, iCell int32, pCell uintptr) { var pData uintptr var pCoord uintptr var ii int32 = 0 (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid = nodeGetRowid(tls, pRtree, pNode, iCell) pData = (*RtreeNode)(unsafe.Pointer(pNode)).FzData + uintptr(12+int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*iCell) pCoord = pCell + 8 for __ccgo := true; __ccgo; __ccgo = ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) { readCoord(tls, pData, pCoord+uintptr(ii)*4) readCoord(tls, pData+uintptr(4), pCoord+uintptr(ii+1)*4) pData += uintptr(8) ii = ii + 2 } } func rtreeCreate(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return rtreeInit(tls, db, pAux, argc, argv, ppVtab, pzErr, 1) } func rtreeConnect(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return rtreeInit(tls, db, pAux, argc, argv, ppVtab, pzErr, 0) } func rtreeReference(tls *libc.TLS, pRtree uintptr) { (*Rtree)(unsafe.Pointer(pRtree)).FnBusy++ } func rtreeRelease(tls *libc.TLS, pRtree uintptr) { (*Rtree)(unsafe.Pointer(pRtree)).FnBusy-- if (*Rtree)(unsafe.Pointer(pRtree)).FnBusy == U32(0) { (*Rtree)(unsafe.Pointer(pRtree)).FinWrTrans = U8(0) nodeBlobReset(tls, pRtree) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteNode) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteNode) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteRowid) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadParent) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteParent) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteParent) Xsqlite3_finalize(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteAux) Xsqlite3_free(tls, (*Rtree)(unsafe.Pointer(pRtree)).FzReadAuxSql) Xsqlite3_free(tls, pRtree) } } func rtreeDisconnect(tls *libc.TLS, pVtab uintptr) int32 { rtreeRelease(tls, pVtab) return SQLITE_OK } func rtreeDestroy(tls *libc.TLS, pVtab uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var pRtree uintptr = pVtab var rc int32 var zCreate uintptr = Xsqlite3_mprintf(tls, ts+26484, libc.VaList(bp, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName)) if !(zCreate != 0) { rc = SQLITE_NOMEM } else { nodeBlobReset(tls, pRtree) rc = Xsqlite3_exec(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb, zCreate, uintptr(0), uintptr(0), uintptr(0)) Xsqlite3_free(tls, zCreate) } if rc == SQLITE_OK { rtreeRelease(tls, pRtree) } return rc } func rtreeOpen(tls *libc.TLS, pVTab uintptr, ppCursor uintptr) int32 { var rc int32 = SQLITE_NOMEM var pRtree uintptr = pVTab var pCsr uintptr pCsr = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(RtreeCursor{}))) if pCsr != 0 { libc.Xmemset(tls, pCsr, 0, uint64(unsafe.Sizeof(RtreeCursor{}))) (*RtreeCursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab = pVTab rc = SQLITE_OK (*Rtree)(unsafe.Pointer(pRtree)).FnCursor++ } *(*uintptr)(unsafe.Pointer(ppCursor)) = pCsr return rc } func resetCursor(tls *libc.TLS, pCsr uintptr) { var pRtree uintptr = (*RtreeCursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab var ii int32 var pStmt uintptr if (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint != 0 { var i int32 for i = 0; i < (*RtreeCursor)(unsafe.Pointer(pCsr)).FnConstraint; i++ { var pInfo uintptr = (*RtreeConstraint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint + uintptr(i)*24)).FpInfo if pInfo != 0 { if (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FxDelUser != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FxDelUser})).f(tls, (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FpUser) } Xsqlite3_free(tls, pInfo) } } Xsqlite3_free(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint) (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint = uintptr(0) } for ii = 0; ii < RTREE_CACHE_SZ; ii++ { nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(pCsr + 88 + uintptr(ii)*8))) } Xsqlite3_free(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FaPoint) pStmt = (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux libc.Xmemset(tls, pCsr, 0, uint64(unsafe.Sizeof(RtreeCursor{}))) (*RtreeCursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab = pRtree (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux = pStmt } func rtreeClose(tls *libc.TLS, cur uintptr) int32 { var pRtree uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab var pCsr uintptr = cur resetCursor(tls, pCsr) Xsqlite3_finalize(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux) Xsqlite3_free(tls, pCsr) (*Rtree)(unsafe.Pointer(pRtree)).FnCursor-- nodeBlobReset(tls, pRtree) return SQLITE_OK } func rtreeEof(tls *libc.TLS, cur uintptr) int32 { var pCsr uintptr = cur return int32((*RtreeCursor)(unsafe.Pointer(pCsr)).FatEOF) } func rtreeCallbackConstraint(tls *libc.TLS, pConstraint uintptr, eInt int32, pCellData uintptr, pSearch uintptr, prScore uintptr, peWithin uintptr) int32 { bp := tls.Alloc(92) defer tls.Free(92) var pInfo uintptr = (*RtreeConstraint)(unsafe.Pointer(pConstraint)).FpInfo var nCoord int32 = (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FnCoord var rc int32 if (*RtreeConstraint)(unsafe.Pointer(pConstraint)).Fop == RTREE_QUERY && int32((*RtreeSearchPoint)(unsafe.Pointer(pSearch)).FiLevel) == 1 { (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FiRowid = readInt64(tls, pCellData) } pCellData += uintptr(8) if eInt == 0 { switch nCoord { case 10: readCoord(tls, pCellData+uintptr(36), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 9*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(32), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 8*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) fallthrough case 8: readCoord(tls, pCellData+uintptr(28), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 7*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(24), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 6*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) fallthrough case 6: readCoord(tls, pCellData+uintptr(20), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 5*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(16), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 4*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) fallthrough case 4: readCoord(tls, pCellData+uintptr(12), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 3*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(8), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 2*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) fallthrough default: readCoord(tls, pCellData+uintptr(4), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 1*8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) readCoord(tls, pCellData, bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8)) = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) } } else { switch nCoord { case 10: readCoord(tls, pCellData+uintptr(36), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 9*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(32), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 8*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) fallthrough case 8: readCoord(tls, pCellData+uintptr(28), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 7*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(24), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 6*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) fallthrough case 6: readCoord(tls, pCellData+uintptr(20), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 5*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(16), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 4*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) fallthrough case 4: readCoord(tls, pCellData+uintptr(12), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 3*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) readCoord(tls, pCellData+uintptr(8), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 2*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) fallthrough default: readCoord(tls, pCellData+uintptr(4), bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8 + 1*8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) readCoord(tls, pCellData, bp) *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8)) = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) } } if (*RtreeConstraint)(unsafe.Pointer(pConstraint)).Fop == RTREE_MATCH { *(*int32)(unsafe.Pointer(bp + 88)) = 0 rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(pConstraint + 8))})).f(tls, pInfo, nCoord, bp+8, bp+88) if *(*int32)(unsafe.Pointer(bp + 88)) == 0 { *(*int32)(unsafe.Pointer(peWithin)) = NOT_WITHIN } *(*Sqlite3_rtree_dbl)(unsafe.Pointer(prScore)) = 0.0 } else { (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FaCoord = bp + 8 (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FiLevel = int32((*RtreeSearchPoint)(unsafe.Pointer(pSearch)).FiLevel) - 1 (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FrScore = libc.AssignPtrFloat64(pInfo+80, (*RtreeSearchPoint)(unsafe.Pointer(pSearch)).FrScore) (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FeWithin = libc.AssignPtrInt32(pInfo+88, int32((*RtreeSearchPoint)(unsafe.Pointer(pSearch)).FeWithin)) rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{*(*uintptr)(unsafe.Pointer(pConstraint + 8))})).f(tls, pInfo) if (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FeWithin < *(*int32)(unsafe.Pointer(peWithin)) { *(*int32)(unsafe.Pointer(peWithin)) = (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FeWithin } if (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FrScore < *(*Sqlite3_rtree_dbl)(unsafe.Pointer(prScore)) || *(*Sqlite3_rtree_dbl)(unsafe.Pointer(prScore)) < 0.0 { *(*Sqlite3_rtree_dbl)(unsafe.Pointer(prScore)) = (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FrScore } } return rc } func rtreeNonleafConstraint(tls *libc.TLS, p uintptr, eInt int32, pCellData uintptr, peWithin uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var val Sqlite3_rtree_dbl pCellData += uintptr(8 + 4*((*RtreeConstraint)(unsafe.Pointer(p)).FiCoord&0xfe)) switch (*RtreeConstraint)(unsafe.Pointer(p)).Fop { case RTREE_TRUE: return case RTREE_FALSE: break case RTREE_EQ: { *(*U32)(unsafe.Pointer(bp)) = libc.X_byteswap_ulong(tls, *(*U32)(unsafe.Pointer(pCellData))) if eInt != 0 { val = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) } else { val = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) } } if *(*RtreeDValue)(unsafe.Pointer(p + 8)) >= val { pCellData += uintptr(4) { *(*U32)(unsafe.Pointer(bp + 4)) = libc.X_byteswap_ulong(tls, *(*U32)(unsafe.Pointer(pCellData))) if eInt != 0 { val = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp + 4))) } else { val = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp + 4))) } } if *(*RtreeDValue)(unsafe.Pointer(p + 8)) <= val { return } } break case RTREE_LE: fallthrough case RTREE_LT: { *(*U32)(unsafe.Pointer(bp + 8)) = libc.X_byteswap_ulong(tls, *(*U32)(unsafe.Pointer(pCellData))) if eInt != 0 { val = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp + 8))) } else { val = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp + 8))) } } if *(*RtreeDValue)(unsafe.Pointer(p + 8)) >= val { return } break default: pCellData += uintptr(4) { *(*U32)(unsafe.Pointer(bp + 12)) = libc.X_byteswap_ulong(tls, *(*U32)(unsafe.Pointer(pCellData))) if eInt != 0 { val = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp + 12))) } else { val = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp + 12))) } } if *(*RtreeDValue)(unsafe.Pointer(p + 8)) <= val { return } break } *(*int32)(unsafe.Pointer(peWithin)) = NOT_WITHIN } func rtreeLeafConstraint(tls *libc.TLS, p uintptr, eInt int32, pCellData uintptr, peWithin uintptr) { bp := tls.Alloc(4) defer tls.Free(4) var xN RtreeDValue pCellData += uintptr(8 + (*RtreeConstraint)(unsafe.Pointer(p)).FiCoord*4) { *(*U32)(unsafe.Pointer(bp)) = libc.X_byteswap_ulong(tls, *(*U32)(unsafe.Pointer(pCellData))) if eInt != 0 { xN = Sqlite3_rtree_dbl(*(*int32)(unsafe.Pointer(bp))) } else { xN = Sqlite3_rtree_dbl(*(*RtreeValue)(unsafe.Pointer(bp))) } } switch (*RtreeConstraint)(unsafe.Pointer(p)).Fop { case RTREE_TRUE: return case RTREE_FALSE: break case RTREE_LE: if xN <= *(*RtreeDValue)(unsafe.Pointer(p + 8)) { return } break case RTREE_LT: if xN < *(*RtreeDValue)(unsafe.Pointer(p + 8)) { return } break case RTREE_GE: if xN >= *(*RtreeDValue)(unsafe.Pointer(p + 8)) { return } break case RTREE_GT: if xN > *(*RtreeDValue)(unsafe.Pointer(p + 8)) { return } break default: if xN == *(*RtreeDValue)(unsafe.Pointer(p + 8)) { return } break } *(*int32)(unsafe.Pointer(peWithin)) = NOT_WITHIN } func nodeRowidIndex(tls *libc.TLS, pRtree uintptr, pNode uintptr, iRowid I64, piIndex uintptr) int32 { var ii int32 var nCell int32 = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) for ii = 0; ii < nCell; ii++ { if nodeGetRowid(tls, pRtree, pNode, ii) == iRowid { *(*int32)(unsafe.Pointer(piIndex)) = ii return SQLITE_OK } } return SQLITE_CORRUPT | int32(1)<<8 } func nodeParentIndex(tls *libc.TLS, pRtree uintptr, pNode uintptr, piIndex uintptr) int32 { var pParent uintptr = (*RtreeNode)(unsafe.Pointer(pNode)).FpParent if pParent != 0 { return nodeRowidIndex(tls, pRtree, pParent, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode, piIndex) } else { *(*int32)(unsafe.Pointer(piIndex)) = -1 return SQLITE_OK } return int32(0) } func rtreeSearchPointCompare(tls *libc.TLS, pA uintptr, pB uintptr) int32 { if (*RtreeSearchPoint)(unsafe.Pointer(pA)).FrScore < (*RtreeSearchPoint)(unsafe.Pointer(pB)).FrScore { return -1 } if (*RtreeSearchPoint)(unsafe.Pointer(pA)).FrScore > (*RtreeSearchPoint)(unsafe.Pointer(pB)).FrScore { return +1 } if int32((*RtreeSearchPoint)(unsafe.Pointer(pA)).FiLevel) < int32((*RtreeSearchPoint)(unsafe.Pointer(pB)).FiLevel) { return -1 } if int32((*RtreeSearchPoint)(unsafe.Pointer(pA)).FiLevel) > int32((*RtreeSearchPoint)(unsafe.Pointer(pB)).FiLevel) { return +1 } return 0 } func rtreeSearchPointSwap(tls *libc.TLS, p uintptr, i int32, j int32) { var t = *(*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(p)).FaPoint + uintptr(i)*24)) *(*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(p)).FaPoint + uintptr(i)*24)) = *(*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(p)).FaPoint + uintptr(j)*24)) *(*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(p)).FaPoint + uintptr(j)*24)) = t i++ j++ if i < RTREE_CACHE_SZ { if j >= RTREE_CACHE_SZ { nodeRelease(tls, (*RtreeCursor)(unsafe.Pointer(p)).Fbase.FpVtab, *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(i)*8)) = uintptr(0) } else { var pTemp uintptr = *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(i)*8)) *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(j)*8)) *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(j)*8)) = pTemp } } } func rtreeSearchPointFirst(tls *libc.TLS, pCur uintptr) uintptr { if (*RtreeCursor)(unsafe.Pointer(pCur)).FbPoint != 0 { return pCur + 64 } if (*RtreeCursor)(unsafe.Pointer(pCur)).FnPoint != 0 { return (*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint } return uintptr(0) } func rtreeNodeOfFirstSearchPoint(tls *libc.TLS, pCur uintptr, pRC uintptr) uintptr { var id Sqlite3_int64 var ii int32 = 1 - int32((*RtreeCursor)(unsafe.Pointer(pCur)).FbPoint) if *(*uintptr)(unsafe.Pointer(pCur + 88 + uintptr(ii)*8)) == uintptr(0) { if ii != 0 { id = (*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint)).Fid } else { id = (*RtreeCursor)(unsafe.Pointer(pCur)).FsPoint.Fid } *(*int32)(unsafe.Pointer(pRC)) = nodeAcquire(tls, (*RtreeCursor)(unsafe.Pointer(pCur)).Fbase.FpVtab, id, uintptr(0), pCur+88+uintptr(ii)*8) } return *(*uintptr)(unsafe.Pointer(pCur + 88 + uintptr(ii)*8)) } func rtreeEnqueue(tls *libc.TLS, pCur uintptr, rScore RtreeDValue, iLevel U8) uintptr { var i int32 var j int32 var pNew uintptr if (*RtreeCursor)(unsafe.Pointer(pCur)).FnPoint >= (*RtreeCursor)(unsafe.Pointer(pCur)).FnPointAlloc { var nNew int32 = (*RtreeCursor)(unsafe.Pointer(pCur)).FnPointAlloc*2 + 8 pNew = Xsqlite3_realloc64(tls, (*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint, uint64(nNew)*uint64(unsafe.Sizeof(RtreeSearchPoint{}))) if pNew == uintptr(0) { return uintptr(0) } (*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint = pNew (*RtreeCursor)(unsafe.Pointer(pCur)).FnPointAlloc = nNew } i = libc.PostIncInt32(&(*RtreeCursor)(unsafe.Pointer(pCur)).FnPoint, 1) pNew = (*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint + uintptr(i)*24 (*RtreeSearchPoint)(unsafe.Pointer(pNew)).FrScore = rScore (*RtreeSearchPoint)(unsafe.Pointer(pNew)).FiLevel = iLevel for i > 0 { var pParent uintptr j = (i - 1) / 2 pParent = (*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint + uintptr(j)*24 if rtreeSearchPointCompare(tls, pNew, pParent) >= 0 { break } rtreeSearchPointSwap(tls, pCur, j, i) i = j pNew = pParent } return pNew } func rtreeSearchPointNew(tls *libc.TLS, pCur uintptr, rScore RtreeDValue, iLevel U8) uintptr { var pNew uintptr var pFirst uintptr pFirst = rtreeSearchPointFirst(tls, pCur) *(*U32)(unsafe.Pointer(pCur + 128 + uintptr(iLevel)*4))++ if pFirst == uintptr(0) || (*RtreeSearchPoint)(unsafe.Pointer(pFirst)).FrScore > rScore || (*RtreeSearchPoint)(unsafe.Pointer(pFirst)).FrScore == rScore && int32((*RtreeSearchPoint)(unsafe.Pointer(pFirst)).FiLevel) > int32(iLevel) { if (*RtreeCursor)(unsafe.Pointer(pCur)).FbPoint != 0 { var ii int32 pNew = rtreeEnqueue(tls, pCur, rScore, iLevel) if pNew == uintptr(0) { return uintptr(0) } ii = int32((int64(pNew)-int64((*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint))/24) + 1 if ii < RTREE_CACHE_SZ { *(*uintptr)(unsafe.Pointer(pCur + 88 + uintptr(ii)*8)) = *(*uintptr)(unsafe.Pointer(pCur + 88)) } else { nodeRelease(tls, (*RtreeCursor)(unsafe.Pointer(pCur)).Fbase.FpVtab, *(*uintptr)(unsafe.Pointer(pCur + 88))) } *(*uintptr)(unsafe.Pointer(pCur + 88)) = uintptr(0) *(*RtreeSearchPoint)(unsafe.Pointer(pNew)) = (*RtreeCursor)(unsafe.Pointer(pCur)).FsPoint } (*RtreeCursor)(unsafe.Pointer(pCur)).FsPoint.FrScore = rScore (*RtreeCursor)(unsafe.Pointer(pCur)).FsPoint.FiLevel = iLevel (*RtreeCursor)(unsafe.Pointer(pCur)).FbPoint = U8(1) return pCur + 64 } else { return rtreeEnqueue(tls, pCur, rScore, iLevel) } return uintptr(0) } func rtreeSearchPointPop(tls *libc.TLS, p uintptr) { var i int32 var j int32 var k int32 var n int32 i = 1 - int32((*RtreeCursor)(unsafe.Pointer(p)).FbPoint) if *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(i)*8)) != 0 { nodeRelease(tls, (*RtreeCursor)(unsafe.Pointer(p)).Fbase.FpVtab, *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(i)*8)) = uintptr(0) } if (*RtreeCursor)(unsafe.Pointer(p)).FbPoint != 0 { *(*U32)(unsafe.Pointer(p + 128 + uintptr((*RtreeCursor)(unsafe.Pointer(p)).FsPoint.FiLevel)*4))-- (*RtreeCursor)(unsafe.Pointer(p)).FbPoint = U8(0) } else if (*RtreeCursor)(unsafe.Pointer(p)).FnPoint != 0 { *(*U32)(unsafe.Pointer(p + 128 + uintptr((*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(p)).FaPoint)).FiLevel)*4))-- n = libc.PreDecInt32(&(*RtreeCursor)(unsafe.Pointer(p)).FnPoint, 1) *(*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(p)).FaPoint)) = *(*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(p)).FaPoint + uintptr(n)*24)) if n < RTREE_CACHE_SZ-1 { *(*uintptr)(unsafe.Pointer(p + 88 + 1*8)) = *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(n+1)*8)) *(*uintptr)(unsafe.Pointer(p + 88 + uintptr(n+1)*8)) = uintptr(0) } i = 0 for libc.AssignInt32(&j, i*2+1) < n { k = j + 1 if k < n && rtreeSearchPointCompare(tls, (*RtreeCursor)(unsafe.Pointer(p)).FaPoint+uintptr(k)*24, (*RtreeCursor)(unsafe.Pointer(p)).FaPoint+uintptr(j)*24) < 0 { if rtreeSearchPointCompare(tls, (*RtreeCursor)(unsafe.Pointer(p)).FaPoint+uintptr(k)*24, (*RtreeCursor)(unsafe.Pointer(p)).FaPoint+uintptr(i)*24) < 0 { rtreeSearchPointSwap(tls, p, i, k) i = k } else { break } } else { if rtreeSearchPointCompare(tls, (*RtreeCursor)(unsafe.Pointer(p)).FaPoint+uintptr(j)*24, (*RtreeCursor)(unsafe.Pointer(p)).FaPoint+uintptr(i)*24) < 0 { rtreeSearchPointSwap(tls, p, i, j) i = j } else { break } } } } } func rtreeStepToLeaf(tls *libc.TLS, pCur uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) var p uintptr var pRtree uintptr = (*RtreeCursor)(unsafe.Pointer(pCur)).Fbase.FpVtab var pNode uintptr *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var nCell int32 var nConstraint int32 = (*RtreeCursor)(unsafe.Pointer(pCur)).FnConstraint var ii int32 var eInt int32 var x RtreeSearchPoint eInt = libc.Bool32(int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_INT32) for libc.AssignUintptr(&p, rtreeSearchPointFirst(tls, pCur)) != uintptr(0) && int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiLevel) > 0 { var pCellData uintptr pNode = rtreeNodeOfFirstSearchPoint(tls, pCur, bp) if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } nCell = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) pCellData = (*RtreeNode)(unsafe.Pointer(pNode)).FzData + uintptr(4+int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell)) for int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell) < nCell { *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8)) = Sqlite3_rtree_dbl(-1) *(*int32)(unsafe.Pointer(bp + 16)) = FULLY_WITHIN for ii = 0; ii < nConstraint; ii++ { var pConstraint uintptr = (*RtreeCursor)(unsafe.Pointer(pCur)).FaConstraint + uintptr(ii)*24 if (*RtreeConstraint)(unsafe.Pointer(pConstraint)).Fop >= RTREE_MATCH { *(*int32)(unsafe.Pointer(bp)) = rtreeCallbackConstraint(tls, pConstraint, eInt, pCellData, p, bp+8, bp+16) if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } } else if int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiLevel) == 1 { rtreeLeafConstraint(tls, pConstraint, eInt, pCellData, bp+16) } else { rtreeNonleafConstraint(tls, pConstraint, eInt, pCellData, bp+16) } if *(*int32)(unsafe.Pointer(bp + 16)) == NOT_WITHIN { (*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell++ pCellData += uintptr((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell) break } } if *(*int32)(unsafe.Pointer(bp + 16)) == NOT_WITHIN { continue } (*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell++ x.FiLevel = U8(int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiLevel) - 1) if x.FiLevel != 0 { x.Fid = readInt64(tls, pCellData) for ii = 0; ii < (*RtreeCursor)(unsafe.Pointer(pCur)).FnPoint; ii++ { if (*RtreeSearchPoint)(unsafe.Pointer((*RtreeCursor)(unsafe.Pointer(pCur)).FaPoint+uintptr(ii)*24)).Fid == x.Fid { return SQLITE_CORRUPT | int32(1)<<8 } } x.FiCell = U8(0) } else { x.Fid = (*RtreeSearchPoint)(unsafe.Pointer(p)).Fid x.FiCell = U8(int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell) - 1) } if int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell) >= nCell { rtreeSearchPointPop(tls, pCur) } if *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8)) < 0.0 { *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8)) = 0.0 } p = rtreeSearchPointNew(tls, pCur, *(*Sqlite3_rtree_dbl)(unsafe.Pointer(bp + 8)), x.FiLevel) if p == uintptr(0) { return SQLITE_NOMEM } (*RtreeSearchPoint)(unsafe.Pointer(p)).FeWithin = U8(*(*int32)(unsafe.Pointer(bp + 16))) (*RtreeSearchPoint)(unsafe.Pointer(p)).Fid = x.Fid (*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell = x.FiCell break } if int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell) >= nCell { rtreeSearchPointPop(tls, pCur) } } (*RtreeCursor)(unsafe.Pointer(pCur)).FatEOF = U8(libc.Bool32(p == uintptr(0))) return SQLITE_OK } func rtreeNext(tls *libc.TLS, pVtabCursor uintptr) int32 { var pCsr uintptr = pVtabCursor var rc int32 = SQLITE_OK if (*RtreeCursor)(unsafe.Pointer(pCsr)).FbAuxValid != 0 { (*RtreeCursor)(unsafe.Pointer(pCsr)).FbAuxValid = U8(0) Xsqlite3_reset(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux) } rtreeSearchPointPop(tls, pCsr) rc = rtreeStepToLeaf(tls, pCsr) return rc } func rtreeRowid(tls *libc.TLS, pVtabCursor uintptr, pRowid uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pCsr uintptr = pVtabCursor var p uintptr = rtreeSearchPointFirst(tls, pCsr) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var pNode uintptr = rtreeNodeOfFirstSearchPoint(tls, pCsr, bp) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK && p != 0 { *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = nodeGetRowid(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab, pNode, int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell)) } return *(*int32)(unsafe.Pointer(bp)) } func rtreeColumn(tls *libc.TLS, cur uintptr, ctx uintptr, i int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pRtree uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab var pCsr uintptr = cur var p uintptr = rtreeSearchPointFirst(tls, pCsr) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var pNode uintptr = rtreeNodeOfFirstSearchPoint(tls, pCsr, bp) if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } if p == uintptr(0) { return SQLITE_OK } if i == 0 { Xsqlite3_result_int64(tls, ctx, nodeGetRowid(tls, pRtree, pNode, int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell))) } else if i <= int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) { nodeGetCoord(tls, pRtree, pNode, int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell), i-1, bp+4) if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { Xsqlite3_result_double(tls, ctx, float64(*(*RtreeValue)(unsafe.Pointer(bp + 4)))) } else { Xsqlite3_result_int(tls, ctx, *(*int32)(unsafe.Pointer(bp + 4))) } } else { if !(int32((*RtreeCursor)(unsafe.Pointer(pCsr)).FbAuxValid) != 0) { if (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux == uintptr(0) { *(*int32)(unsafe.Pointer(bp)) = Xsqlite3_prepare_v3(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb, (*Rtree)(unsafe.Pointer(pRtree)).FzReadAuxSql, -1, uint32(0), pCsr+56, uintptr(0)) if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } } Xsqlite3_bind_int64(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux, 1, nodeGetRowid(tls, pRtree, pNode, int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell))) *(*int32)(unsafe.Pointer(bp)) = Xsqlite3_step(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_ROW { (*RtreeCursor)(unsafe.Pointer(pCsr)).FbAuxValid = U8(1) } else { Xsqlite3_reset(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_DONE { *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK } return *(*int32)(unsafe.Pointer(bp)) } } Xsqlite3_result_value(tls, ctx, Xsqlite3_column_value(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux, i-int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2)+1)) } return SQLITE_OK } func findLeafNode(tls *libc.TLS, pRtree uintptr, iRowid I64, ppLeaf uintptr, piNode uintptr) int32 { var rc int32 *(*uintptr)(unsafe.Pointer(ppLeaf)) = uintptr(0) Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid, 1, iRowid) if Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) == SQLITE_ROW { var iNode I64 = Xsqlite3_column_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid, 0) if piNode != 0 { *(*Sqlite3_int64)(unsafe.Pointer(piNode)) = iNode } rc = nodeAcquire(tls, pRtree, iNode, uintptr(0), ppLeaf) Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) } else { rc = Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) } return rc } func deserializeGeometry(tls *libc.TLS, pValue uintptr, pCons uintptr) int32 { var pBlob uintptr var pSrc uintptr var pInfo uintptr pSrc = Xsqlite3_value_pointer(tls, pValue, ts+26566) if pSrc == uintptr(0) { return SQLITE_ERROR } pInfo = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(Sqlite3_rtree_query_info{}))+uint64((*RtreeMatchArg)(unsafe.Pointer(pSrc)).FiSize)) if !(pInfo != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, pInfo, 0, uint64(unsafe.Sizeof(Sqlite3_rtree_query_info{}))) pBlob = pInfo + 1*112 libc.Xmemcpy(tls, pBlob, pSrc, uint64((*RtreeMatchArg)(unsafe.Pointer(pSrc)).FiSize)) (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FpContext = (*RtreeMatchArg)(unsafe.Pointer(pBlob)).Fcb.FpContext (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FnParam = (*RtreeMatchArg)(unsafe.Pointer(pBlob)).FnParam (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FaParam = pBlob + 56 (*Sqlite3_rtree_query_info)(unsafe.Pointer(pInfo)).FapSqlParam = (*RtreeMatchArg)(unsafe.Pointer(pBlob)).FapSqlParam if (*RtreeMatchArg)(unsafe.Pointer(pBlob)).Fcb.FxGeom != 0 { *(*uintptr)(unsafe.Pointer(pCons + 8)) = (*RtreeMatchArg)(unsafe.Pointer(pBlob)).Fcb.FxGeom } else { (*RtreeConstraint)(unsafe.Pointer(pCons)).Fop = RTREE_QUERY *(*uintptr)(unsafe.Pointer(pCons + 8)) = (*RtreeMatchArg)(unsafe.Pointer(pBlob)).Fcb.FxQueryFunc } (*RtreeConstraint)(unsafe.Pointer(pCons)).FpInfo = pInfo return SQLITE_OK } func rtreeFilter(tls *libc.TLS, pVtabCursor uintptr, idxNum int32, idxStr uintptr, argc int32, argv uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var pRtree uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pVtabCursor)).FpVtab var pCsr uintptr = pVtabCursor *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) var ii int32 var rc int32 = SQLITE_OK *(*int32)(unsafe.Pointer(bp + 16)) = 0 rtreeReference(tls, pRtree) resetCursor(tls, pCsr) (*RtreeCursor)(unsafe.Pointer(pCsr)).FiStrategy = idxNum if idxNum == 1 { var p uintptr var iRowid I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) *(*I64)(unsafe.Pointer(bp + 8)) = int64(0) var eType int32 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv))) if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT && Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) == float64(iRowid) { rc = findLeafNode(tls, pRtree, iRowid, bp, bp+8) } else { rc = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) } if rc == SQLITE_OK && *(*uintptr)(unsafe.Pointer(bp)) != uintptr(0) { p = rtreeSearchPointNew(tls, pCsr, 0.0, uint8(0)) *(*uintptr)(unsafe.Pointer(pCsr + 88)) = *(*uintptr)(unsafe.Pointer(bp)) (*RtreeSearchPoint)(unsafe.Pointer(p)).Fid = *(*I64)(unsafe.Pointer(bp + 8)) (*RtreeSearchPoint)(unsafe.Pointer(p)).FeWithin = U8(PARTLY_WITHIN) rc = nodeRowidIndex(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp)), iRowid, bp+16) (*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell = U8(*(*int32)(unsafe.Pointer(bp + 16))) } else { (*RtreeCursor)(unsafe.Pointer(pCsr)).FatEOF = U8(1) } } else { rc = nodeAcquire(tls, pRtree, int64(1), uintptr(0), bp+24) if rc == SQLITE_OK && argc > 0 { (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(RtreeConstraint{}))*uint64(argc)) (*RtreeCursor)(unsafe.Pointer(pCsr)).FnConstraint = argc if !(int32((*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint) != 0) { rc = SQLITE_NOMEM } else { libc.Xmemset(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint, 0, uint64(unsafe.Sizeof(RtreeConstraint{}))*uint64(argc)) libc.Xmemset(tls, pCsr+128, 0, uint64(unsafe.Sizeof(U32(0)))*uint64((*Rtree)(unsafe.Pointer(pRtree)).FiDepth+1)) for ii = 0; ii < argc; ii++ { var p uintptr = (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint + uintptr(ii)*24 var eType int32 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(ii)*8))) (*RtreeConstraint)(unsafe.Pointer(p)).Fop = int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(ii*2)))) (*RtreeConstraint)(unsafe.Pointer(p)).FiCoord = int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(ii*2+1)))) - '0' if (*RtreeConstraint)(unsafe.Pointer(p)).Fop >= RTREE_MATCH { rc = deserializeGeometry(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(ii)*8)), p) if rc != SQLITE_OK { break } (*Sqlite3_rtree_query_info)(unsafe.Pointer((*RtreeConstraint)(unsafe.Pointer(p)).FpInfo)).FnCoord = int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) (*Sqlite3_rtree_query_info)(unsafe.Pointer((*RtreeConstraint)(unsafe.Pointer(p)).FpInfo)).FanQueue = pCsr + 128 (*Sqlite3_rtree_query_info)(unsafe.Pointer((*RtreeConstraint)(unsafe.Pointer(p)).FpInfo)).FmxLevel = (*Rtree)(unsafe.Pointer(pRtree)).FiDepth + 1 } else if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { *(*RtreeDValue)(unsafe.Pointer(p + 8)) = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(ii)*8))) } else { *(*RtreeDValue)(unsafe.Pointer(p + 8)) = 0.0 if eType == SQLITE_NULL { (*RtreeConstraint)(unsafe.Pointer(p)).Fop = RTREE_FALSE } else if (*RtreeConstraint)(unsafe.Pointer(p)).Fop == RTREE_LT || (*RtreeConstraint)(unsafe.Pointer(p)).Fop == RTREE_LE { (*RtreeConstraint)(unsafe.Pointer(p)).Fop = RTREE_TRUE } else { (*RtreeConstraint)(unsafe.Pointer(p)).Fop = RTREE_FALSE } } } } } if rc == SQLITE_OK { var pNew uintptr pNew = rtreeSearchPointNew(tls, pCsr, 0.0, U8((*Rtree)(unsafe.Pointer(pRtree)).FiDepth+1)) if pNew == uintptr(0) { return SQLITE_NOMEM } (*RtreeSearchPoint)(unsafe.Pointer(pNew)).Fid = int64(1) (*RtreeSearchPoint)(unsafe.Pointer(pNew)).FiCell = U8(0) (*RtreeSearchPoint)(unsafe.Pointer(pNew)).FeWithin = U8(PARTLY_WITHIN) *(*uintptr)(unsafe.Pointer(pCsr + 88)) = *(*uintptr)(unsafe.Pointer(bp + 24)) *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) rc = rtreeStepToLeaf(tls, pCsr) } } nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 24))) rtreeRelease(tls, pRtree) return rc } func rtreeBestIndex(tls *libc.TLS, tab uintptr, pIdxInfo uintptr) int32 { bp := tls.Alloc(49) defer tls.Free(49) var pRtree uintptr = tab var rc int32 = SQLITE_OK var ii int32 var bMatch int32 = 0 var nRow I64 var iIdx int32 = 0 libc.Xmemset(tls, bp+8, 0, uint64(unsafe.Sizeof([41]int8{}))) for ii = 0; ii < (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint; ii++ { if int32((*sqlite3_index_constraint)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint+uintptr(ii)*12)).Fop) == SQLITE_INDEX_CONSTRAINT_MATCH { bMatch = 1 } } for ii = 0; ii < (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint && iIdx < int32(uint64(unsafe.Sizeof([41]int8{}))-uint64(1)); ii++ { var p uintptr = (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint + uintptr(ii)*12 if bMatch == 0 && (*sqlite3_index_constraint)(unsafe.Pointer(p)).Fusable != 0 && (*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn <= 0 && int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_EQ { var jj int32 for jj = 0; jj < ii; jj++ { (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(jj)*8)).FargvIndex = 0 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(jj)*8)).Fomit = uint8(0) } (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(ii)*8)).FargvIndex = 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(jj)*8)).Fomit = uint8(1) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = 30.0 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = int64(1) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxFlags = SQLITE_INDEX_SCAN_UNIQUE return SQLITE_OK } if (*sqlite3_index_constraint)(unsafe.Pointer(p)).Fusable != 0 && ((*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn > 0 && (*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn <= int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) || int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_MATCH) { var op U8 switch int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) { case SQLITE_INDEX_CONSTRAINT_EQ: op = U8(RTREE_EQ) break fallthrough case SQLITE_INDEX_CONSTRAINT_GT: op = U8(RTREE_GT) break fallthrough case SQLITE_INDEX_CONSTRAINT_LE: op = U8(RTREE_LE) break fallthrough case SQLITE_INDEX_CONSTRAINT_LT: op = U8(RTREE_LT) break fallthrough case SQLITE_INDEX_CONSTRAINT_GE: op = U8(RTREE_GE) break fallthrough case SQLITE_INDEX_CONSTRAINT_MATCH: op = U8(RTREE_MATCH) break fallthrough default: op = U8(0) break } if op != 0 { *(*int8)(unsafe.Pointer(bp + 8 + uintptr(libc.PostIncInt32(&iIdx, 1)))) = int8(op) *(*int8)(unsafe.Pointer(bp + 8 + uintptr(libc.PostIncInt32(&iIdx, 1)))) = int8((*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn - 1 + '0') (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(ii)*8)).FargvIndex = iIdx / 2 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(ii)*8)).Fomit = uint8(1) } } } (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 2 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FneedToFreeIdxStr = 1 if iIdx > 0 && uintptr(0) == libc.AssignPtrUintptr(pIdxInfo+48, Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, bp+8))) { return SQLITE_NOMEM } nRow = (*Rtree)(unsafe.Pointer(pRtree)).FnRowEst >> (iIdx / 2) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = 6.0 * float64(nRow) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = nRow return rc } func cellArea(tls *libc.TLS, pRtree uintptr, p uintptr) RtreeDValue { var area RtreeDValue = RtreeDValue(1) if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { switch int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim) { case 5: area = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(p + 8 + 9*4)) - *(*RtreeValue)(unsafe.Pointer(p + 8 + 8*4))) fallthrough case 4: area = area * float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + 7*4))-*(*RtreeValue)(unsafe.Pointer(p + 8 + 6*4))) fallthrough case 3: area = area * float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + 5*4))-*(*RtreeValue)(unsafe.Pointer(p + 8 + 4*4))) fallthrough case 2: area = area * float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + 3*4))-*(*RtreeValue)(unsafe.Pointer(p + 8 + 2*4))) fallthrough default: area = area * float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + 1*4))-*(*RtreeValue)(unsafe.Pointer(p + 8))) } } else { switch int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim) { case 5: area = RtreeDValue(I64(*(*int32)(unsafe.Pointer(p + 8 + 9*4))) - I64(*(*int32)(unsafe.Pointer(p + 8 + 8*4)))) fallthrough case 4: area = area * float64(I64(*(*int32)(unsafe.Pointer(p + 8 + 7*4)))-I64(*(*int32)(unsafe.Pointer(p + 8 + 6*4)))) fallthrough case 3: area = area * float64(I64(*(*int32)(unsafe.Pointer(p + 8 + 5*4)))-I64(*(*int32)(unsafe.Pointer(p + 8 + 4*4)))) fallthrough case 2: area = area * float64(I64(*(*int32)(unsafe.Pointer(p + 8 + 3*4)))-I64(*(*int32)(unsafe.Pointer(p + 8 + 2*4)))) fallthrough default: area = area * float64(I64(*(*int32)(unsafe.Pointer(p + 8 + 1*4)))-I64(*(*int32)(unsafe.Pointer(p + 8)))) } } return area } func cellMargin(tls *libc.TLS, pRtree uintptr, p uintptr) RtreeDValue { var margin RtreeDValue = RtreeDValue(0) var ii int32 = int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) - 2 for __ccgo := true; __ccgo; __ccgo = ii >= 0 { margin = margin + (func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + uintptr(ii+1)*4))) } return float64(*(*int32)(unsafe.Pointer(p + 8 + uintptr(ii+1)*4))) }() - func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + uintptr(ii)*4))) } return float64(*(*int32)(unsafe.Pointer(p + 8 + uintptr(ii)*4))) }()) ii = ii - 2 } return margin } func cellUnion(tls *libc.TLS, pRtree uintptr, p1 uintptr, p2 uintptr) { var ii int32 = 0 if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { for __ccgo := true; __ccgo; __ccgo = ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) { *(*RtreeValue)(unsafe.Pointer(p1 + 8 + uintptr(ii)*4)) = func() float32 { if *(*RtreeValue)(unsafe.Pointer(p1 + 8 + uintptr(ii)*4)) < *(*RtreeValue)(unsafe.Pointer(p2 + 8 + uintptr(ii)*4)) { return *(*RtreeValue)(unsafe.Pointer(p1 + 8 + uintptr(ii)*4)) } return *(*RtreeValue)(unsafe.Pointer(p2 + 8 + uintptr(ii)*4)) }() *(*RtreeValue)(unsafe.Pointer(p1 + 8 + uintptr(ii+1)*4)) = func() float32 { if *(*RtreeValue)(unsafe.Pointer(p1 + 8 + uintptr(ii+1)*4)) > *(*RtreeValue)(unsafe.Pointer(p2 + 8 + uintptr(ii+1)*4)) { return *(*RtreeValue)(unsafe.Pointer(p1 + 8 + uintptr(ii+1)*4)) } return *(*RtreeValue)(unsafe.Pointer(p2 + 8 + uintptr(ii+1)*4)) }() ii = ii + 2 } } else { for __ccgo1 := true; __ccgo1; __ccgo1 = ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) { *(*int32)(unsafe.Pointer(p1 + 8 + uintptr(ii)*4)) = func() int32 { if *(*int32)(unsafe.Pointer(p1 + 8 + uintptr(ii)*4)) < *(*int32)(unsafe.Pointer(p2 + 8 + uintptr(ii)*4)) { return *(*int32)(unsafe.Pointer(p1 + 8 + uintptr(ii)*4)) } return *(*int32)(unsafe.Pointer(p2 + 8 + uintptr(ii)*4)) }() *(*int32)(unsafe.Pointer(p1 + 8 + uintptr(ii+1)*4)) = func() int32 { if *(*int32)(unsafe.Pointer(p1 + 8 + uintptr(ii+1)*4)) > *(*int32)(unsafe.Pointer(p2 + 8 + uintptr(ii+1)*4)) { return *(*int32)(unsafe.Pointer(p1 + 8 + uintptr(ii+1)*4)) } return *(*int32)(unsafe.Pointer(p2 + 8 + uintptr(ii+1)*4)) }() ii = ii + 2 } } } func cellContains(tls *libc.TLS, pRtree uintptr, p1 uintptr, p2 uintptr) int32 { var ii int32 var isInt int32 = libc.Bool32(int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_INT32) for ii = 0; ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2); ii = ii + 2 { var a1 uintptr = p1 + 8 + uintptr(ii)*4 var a2 uintptr = p2 + 8 + uintptr(ii)*4 if !(isInt != 0) && (*(*RtreeValue)(unsafe.Pointer(a2)) < *(*RtreeValue)(unsafe.Pointer(a1)) || *(*RtreeValue)(unsafe.Pointer(a2 + 1*4)) > *(*RtreeValue)(unsafe.Pointer(a1 + 1*4))) || isInt != 0 && (*(*int32)(unsafe.Pointer(a2)) < *(*int32)(unsafe.Pointer(a1)) || *(*int32)(unsafe.Pointer(a2 + 1*4)) > *(*int32)(unsafe.Pointer(a1 + 1*4))) { return 0 } } return 1 } func cellGrowth(tls *libc.TLS, pRtree uintptr, p uintptr, pCell uintptr) RtreeDValue { bp := tls.Alloc(48) defer tls.Free(48) var area RtreeDValue libc.Xmemcpy(tls, bp, p, uint64(unsafe.Sizeof(RtreeCell{}))) area = cellArea(tls, pRtree, bp) cellUnion(tls, pRtree, bp, pCell) return cellArea(tls, pRtree, bp) - area } func cellOverlap(tls *libc.TLS, pRtree uintptr, p uintptr, aCell uintptr, nCell int32) RtreeDValue { var ii int32 var overlap RtreeDValue = 0.0 for ii = 0; ii < nCell; ii++ { var jj int32 var o RtreeDValue = RtreeDValue(1) for jj = 0; jj < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2); jj = jj + 2 { var x1 RtreeDValue var x2 RtreeDValue x1 = func() float64 { if func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + uintptr(jj)*4))) } return float64(*(*int32)(unsafe.Pointer(p + 8 + uintptr(jj)*4))) }() > func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj)*4))) }() { return func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + uintptr(jj)*4))) } return float64(*(*int32)(unsafe.Pointer(p + 8 + uintptr(jj)*4))) }() } return func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj)*4))) }() }() x2 = func() float64 { if func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + uintptr(jj+1)*4))) } return float64(*(*int32)(unsafe.Pointer(p + 8 + uintptr(jj+1)*4))) }() < func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj+1)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj+1)*4))) }() { return func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(p + 8 + uintptr(jj+1)*4))) } return float64(*(*int32)(unsafe.Pointer(p + 8 + uintptr(jj+1)*4))) }() } return func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj+1)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(jj+1)*4))) }() }() if x2 < x1 { o = RtreeDValue(0) break } else { o = o * (x2 - x1) } } overlap = overlap + o } return overlap } func sChooseLeaf(tls *libc.TLS, pRtree uintptr, pCell uintptr, iHeight int32, ppLeaf uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var rc int32 var ii int32 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = nodeAcquire(tls, pRtree, int64(1), uintptr(0), bp) for ii = 0; rc == SQLITE_OK && ii < (*Rtree)(unsafe.Pointer(pRtree)).FiDepth-iHeight; ii++ { var iCell int32 var iBest Sqlite3_int64 = int64(0) var fMinGrowth RtreeDValue = 0.0 var fMinArea RtreeDValue = 0.0 var nCell int32 = readInt16(tls, (*RtreeNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzData+2) *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) var aCell uintptr = uintptr(0) for iCell = 0; iCell < nCell; iCell++ { var bBest int32 = 0 var growth RtreeDValue var area RtreeDValue nodeGetCell(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp)), iCell, bp+8) growth = cellGrowth(tls, pRtree, bp+8, pCell) area = cellArea(tls, pRtree, bp+8) if iCell == 0 || growth < fMinGrowth || growth == fMinGrowth && area < fMinArea { bBest = 1 } if bBest != 0 { fMinGrowth = growth fMinArea = area iBest = (*RtreeCell)(unsafe.Pointer(bp + 8)).FiRowid } } Xsqlite3_free(tls, aCell) rc = nodeAcquire(tls, pRtree, iBest, *(*uintptr)(unsafe.Pointer(bp)), bp+56) nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp))) *(*uintptr)(unsafe.Pointer(bp)) = *(*uintptr)(unsafe.Pointer(bp + 56)) } *(*uintptr)(unsafe.Pointer(ppLeaf)) = *(*uintptr)(unsafe.Pointer(bp)) return rc } func sAdjustTree(tls *libc.TLS, pRtree uintptr, pNode uintptr, pCell uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var p uintptr = pNode var cnt int32 = 0 var rc int32 for (*RtreeNode)(unsafe.Pointer(p)).FpParent != 0 { var pParent uintptr = (*RtreeNode)(unsafe.Pointer(p)).FpParent cnt++ if cnt > 100 { return SQLITE_CORRUPT | int32(1)<<8 } rc = nodeParentIndex(tls, pRtree, p, bp) if rc != SQLITE_OK { return SQLITE_CORRUPT | int32(1)<<8 } nodeGetCell(tls, pRtree, pParent, *(*int32)(unsafe.Pointer(bp)), bp+8) if !(cellContains(tls, pRtree, bp+8, pCell) != 0) { cellUnion(tls, pRtree, bp+8, pCell) nodeOverwriteCell(tls, pRtree, pParent, bp+8, *(*int32)(unsafe.Pointer(bp))) } p = pParent } return SQLITE_OK } func rowidWrite(tls *libc.TLS, pRtree uintptr, iRowid Sqlite3_int64, iNode Sqlite3_int64) int32 { Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid, 1, iRowid) Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid, 2, iNode) Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid) return Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid) } func parentWrite(tls *libc.TLS, pRtree uintptr, iNode Sqlite3_int64, iPar Sqlite3_int64) int32 { Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteParent, 1, iNode) Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteParent, 2, iPar) Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteParent) return Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteParent) } func sSortByDistance(tls *libc.TLS, aIdx uintptr, nIdx int32, aDistance uintptr, aSpare uintptr) { if nIdx > 1 { var iLeft int32 = 0 var iRight int32 = 0 var nLeft int32 = nIdx / 2 var nRight int32 = nIdx - nLeft var aLeft uintptr = aIdx var aRight uintptr = aIdx + uintptr(nLeft)*4 sSortByDistance(tls, aLeft, nLeft, aDistance, aSpare) sSortByDistance(tls, aRight, nRight, aDistance, aSpare) libc.Xmemcpy(tls, aSpare, aLeft, uint64(unsafe.Sizeof(int32(0)))*uint64(nLeft)) aLeft = aSpare for iLeft < nLeft || iRight < nRight { if iLeft == nLeft { *(*int32)(unsafe.Pointer(aIdx + uintptr(iLeft+iRight)*4)) = *(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)) iRight++ } else if iRight == nRight { *(*int32)(unsafe.Pointer(aIdx + uintptr(iLeft+iRight)*4)) = *(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)) iLeft++ } else { var fLeft RtreeDValue = *(*RtreeDValue)(unsafe.Pointer(aDistance + uintptr(*(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)))*8)) var fRight RtreeDValue = *(*RtreeDValue)(unsafe.Pointer(aDistance + uintptr(*(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)))*8)) if fLeft < fRight { *(*int32)(unsafe.Pointer(aIdx + uintptr(iLeft+iRight)*4)) = *(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)) iLeft++ } else { *(*int32)(unsafe.Pointer(aIdx + uintptr(iLeft+iRight)*4)) = *(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)) iRight++ } } } } } func sSortByDimension(tls *libc.TLS, pRtree uintptr, aIdx uintptr, nIdx int32, iDim int32, aCell uintptr, aSpare uintptr) { if nIdx > 1 { var iLeft int32 = 0 var iRight int32 = 0 var nLeft int32 = nIdx / 2 var nRight int32 = nIdx - nLeft var aLeft uintptr = aIdx var aRight uintptr = aIdx + uintptr(nLeft)*4 sSortByDimension(tls, pRtree, aLeft, nLeft, iDim, aCell, aSpare) sSortByDimension(tls, pRtree, aRight, nRight, iDim, aCell, aSpare) libc.Xmemcpy(tls, aSpare, aLeft, uint64(unsafe.Sizeof(int32(0)))*uint64(nLeft)) aLeft = aSpare for iLeft < nLeft || iRight < nRight { var xleft1 RtreeDValue = func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)))*48 + 8 + uintptr(iDim*2)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)))*48 + 8 + uintptr(iDim*2)*4))) }() var xleft2 RtreeDValue = func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)))*48 + 8 + uintptr(iDim*2+1)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)))*48 + 8 + uintptr(iDim*2+1)*4))) }() var xright1 RtreeDValue = func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)))*48 + 8 + uintptr(iDim*2)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)))*48 + 8 + uintptr(iDim*2)*4))) }() var xright2 RtreeDValue = func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)))*48 + 8 + uintptr(iDim*2+1)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(*(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)))*48 + 8 + uintptr(iDim*2+1)*4))) }() if iLeft != nLeft && (iRight == nRight || xleft1 < xright1 || xleft1 == xright1 && xleft2 < xright2) { *(*int32)(unsafe.Pointer(aIdx + uintptr(iLeft+iRight)*4)) = *(*int32)(unsafe.Pointer(aLeft + uintptr(iLeft)*4)) iLeft++ } else { *(*int32)(unsafe.Pointer(aIdx + uintptr(iLeft+iRight)*4)) = *(*int32)(unsafe.Pointer(aRight + uintptr(iRight)*4)) iRight++ } } } } func splitNodeStartree(tls *libc.TLS, pRtree uintptr, aCell uintptr, nCell int32, pLeft uintptr, pRight uintptr, pBboxLeft uintptr, pBboxRight uintptr) int32 { bp := tls.Alloc(96) defer tls.Free(96) var aaSorted uintptr var aSpare uintptr var ii int32 var iBestDim int32 = 0 var iBestSplit int32 = 0 var fBestMargin RtreeDValue = 0.0 var nByte Sqlite3_int64 = Sqlite3_int64(uint64(int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim)+1) * (uint64(unsafe.Sizeof(uintptr(0))) + uint64(nCell)*uint64(unsafe.Sizeof(int32(0))))) aaSorted = Xsqlite3_malloc64(tls, uint64(nByte)) if !(aaSorted != 0) { return SQLITE_NOMEM } aSpare = aaSorted + uintptr((*Rtree)(unsafe.Pointer(pRtree)).FnDim)*8 + uintptr(int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim)*nCell)*4 libc.Xmemset(tls, aaSorted, 0, uint64(nByte)) for ii = 0; ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim); ii++ { var jj int32 *(*uintptr)(unsafe.Pointer(aaSorted + uintptr(ii)*8)) = aaSorted + uintptr((*Rtree)(unsafe.Pointer(pRtree)).FnDim)*8 + uintptr(ii*nCell)*4 for jj = 0; jj < nCell; jj++ { *(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(ii)*8)) + uintptr(jj)*4)) = jj } sSortByDimension(tls, pRtree, *(*uintptr)(unsafe.Pointer(aaSorted + uintptr(ii)*8)), nCell, ii, aCell, aSpare) } for ii = 0; ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim); ii++ { var margin RtreeDValue = 0.0 var fBestOverlap RtreeDValue = 0.0 var fBestArea RtreeDValue = 0.0 var iBestLeft int32 = 0 var nLeft int32 for nLeft = ((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize - 4) / int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell) / 3; nLeft <= nCell-((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize-4)/int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)/3; nLeft++ { var kk int32 var overlap RtreeDValue var area RtreeDValue libc.Xmemcpy(tls, bp, aCell+uintptr(*(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(ii)*8)))))*48, uint64(unsafe.Sizeof(RtreeCell{}))) libc.Xmemcpy(tls, bp+48, aCell+uintptr(*(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(ii)*8)) + uintptr(nCell-1)*4)))*48, uint64(unsafe.Sizeof(RtreeCell{}))) for kk = 1; kk < nCell-1; kk++ { if kk < nLeft { cellUnion(tls, pRtree, bp, aCell+uintptr(*(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(ii)*8)) + uintptr(kk)*4)))*48) } else { cellUnion(tls, pRtree, bp+48, aCell+uintptr(*(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(ii)*8)) + uintptr(kk)*4)))*48) } } margin = margin + cellMargin(tls, pRtree, bp) margin = margin + cellMargin(tls, pRtree, bp+48) overlap = cellOverlap(tls, pRtree, bp, bp+48, 1) area = cellArea(tls, pRtree, bp) + cellArea(tls, pRtree, bp+48) if nLeft == ((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize-4)/int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)/3 || overlap < fBestOverlap || overlap == fBestOverlap && area < fBestArea { iBestLeft = nLeft fBestOverlap = overlap fBestArea = area } } if ii == 0 || margin < fBestMargin { iBestDim = ii fBestMargin = margin iBestSplit = iBestLeft } } libc.Xmemcpy(tls, pBboxLeft, aCell+uintptr(*(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(iBestDim)*8)))))*48, uint64(unsafe.Sizeof(RtreeCell{}))) libc.Xmemcpy(tls, pBboxRight, aCell+uintptr(*(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(iBestDim)*8)) + uintptr(iBestSplit)*4)))*48, uint64(unsafe.Sizeof(RtreeCell{}))) for ii = 0; ii < nCell; ii++ { var pTarget uintptr if ii < iBestSplit { pTarget = pLeft } else { pTarget = pRight } var pBbox uintptr if ii < iBestSplit { pBbox = pBboxLeft } else { pBbox = pBboxRight } var pCell uintptr = aCell + uintptr(*(*int32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(aaSorted + uintptr(iBestDim)*8)) + uintptr(ii)*4)))*48 nodeInsertCell(tls, pRtree, pTarget, pCell) cellUnion(tls, pRtree, pBbox, pCell) } Xsqlite3_free(tls, aaSorted) return SQLITE_OK } func updateMapping(tls *libc.TLS, pRtree uintptr, iRowid I64, pNode uintptr, iHeight int32) int32 { var xSetMapping uintptr xSetMapping = func() uintptr { if iHeight == 0 { return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, Sqlite3_int64, Sqlite3_int64) int32 }{rowidWrite})) } return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, Sqlite3_int64, Sqlite3_int64) int32 }{parentWrite})) }() if iHeight > 0 { var pChild uintptr = nodeHashLookup(tls, pRtree, iRowid) var p uintptr for p = pNode; p != 0; p = (*RtreeNode)(unsafe.Pointer(p)).FpParent { if p == pChild { return SQLITE_CORRUPT | int32(1)<<8 } } if pChild != 0 { nodeRelease(tls, pRtree, (*RtreeNode)(unsafe.Pointer(pChild)).FpParent) nodeReference(tls, pNode) (*RtreeNode)(unsafe.Pointer(pChild)).FpParent = pNode } } if pNode == uintptr(0) { return SQLITE_ERROR } return (*struct { f func(*libc.TLS, uintptr, Sqlite3_int64, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{xSetMapping})).f(tls, pRtree, iRowid, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) } func sSplitNode(tls *libc.TLS, pRtree uintptr, pNode uintptr, pCell uintptr, iHeight int32) int32 { bp := tls.Alloc(100) defer tls.Free(100) var i int32 var newCellIsRight int32 var rc int32 var nCell int32 var aCell uintptr var aiUsed uintptr var pLeft uintptr var pRight uintptr var pParent uintptr var iRowid I64 var iRowid1 I64 newCellIsRight = 0 rc = SQLITE_OK nCell = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) pLeft = uintptr(0) pRight = uintptr(0) aCell = Xsqlite3_malloc64(tls, (uint64(unsafe.Sizeof(RtreeCell{}))+uint64(unsafe.Sizeof(int32(0))))*uint64(nCell+1)) if !!(aCell != 0) { goto __1 } rc = SQLITE_NOMEM goto splitnode_out __1: ; aiUsed = aCell + uintptr(nCell+1)*48 libc.Xmemset(tls, aiUsed, 0, uint64(unsafe.Sizeof(int32(0)))*uint64(nCell+1)) i = 0 __2: if !(i < nCell) { goto __4 } nodeGetCell(tls, pRtree, pNode, i, aCell+uintptr(i)*48) goto __3 __3: i++ goto __2 goto __4 __4: ; nodeZero(tls, pRtree, pNode) libc.Xmemcpy(tls, aCell+uintptr(nCell)*48, pCell, uint64(unsafe.Sizeof(RtreeCell{}))) nCell++ if !((*RtreeNode)(unsafe.Pointer(pNode)).FiNode == int64(1)) { goto __5 } pRight = nodeNew(tls, pRtree, pNode) pLeft = nodeNew(tls, pRtree, pNode) (*Rtree)(unsafe.Pointer(pRtree)).FiDepth++ (*RtreeNode)(unsafe.Pointer(pNode)).FisDirty = 1 writeInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData, (*Rtree)(unsafe.Pointer(pRtree)).FiDepth) goto __6 __5: pLeft = pNode pRight = nodeNew(tls, pRtree, (*RtreeNode)(unsafe.Pointer(pLeft)).FpParent) (*RtreeNode)(unsafe.Pointer(pLeft)).FnRef++ __6: ; if !(!(pLeft != 0) || !(pRight != 0)) { goto __7 } rc = SQLITE_NOMEM goto splitnode_out __7: ; libc.Xmemset(tls, (*RtreeNode)(unsafe.Pointer(pLeft)).FzData, 0, uint64((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize)) libc.Xmemset(tls, (*RtreeNode)(unsafe.Pointer(pRight)).FzData, 0, uint64((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize)) rc = splitNodeStartree(tls, pRtree, aCell, nCell, pLeft, pRight, bp, bp+48) if !(rc != SQLITE_OK) { goto __8 } goto splitnode_out __8: ; if !(SQLITE_OK != libc.AssignInt32(&rc, nodeWrite(tls, pRtree, pRight)) || int64(0) == (*RtreeNode)(unsafe.Pointer(pLeft)).FiNode && SQLITE_OK != libc.AssignInt32(&rc, nodeWrite(tls, pRtree, pLeft))) { goto __9 } goto splitnode_out __9: ; (*RtreeCell)(unsafe.Pointer(bp + 48)).FiRowid = (*RtreeNode)(unsafe.Pointer(pRight)).FiNode (*RtreeCell)(unsafe.Pointer(bp)).FiRowid = (*RtreeNode)(unsafe.Pointer(pLeft)).FiNode if !((*RtreeNode)(unsafe.Pointer(pNode)).FiNode == int64(1)) { goto __10 } rc = rtreeInsertCell(tls, pRtree, (*RtreeNode)(unsafe.Pointer(pLeft)).FpParent, bp, iHeight+1) if !(rc != SQLITE_OK) { goto __12 } goto splitnode_out __12: ; goto __11 __10: pParent = (*RtreeNode)(unsafe.Pointer(pLeft)).FpParent rc = nodeParentIndex(tls, pRtree, pLeft, bp+96) if !(rc == SQLITE_OK) { goto __13 } nodeOverwriteCell(tls, pRtree, pParent, bp, *(*int32)(unsafe.Pointer(bp + 96))) rc = sAdjustTree(tls, pRtree, pParent, bp) __13: ; if !(rc != SQLITE_OK) { goto __14 } goto splitnode_out __14: ; __11: ; if !(libc.AssignInt32(&rc, rtreeInsertCell(tls, pRtree, (*RtreeNode)(unsafe.Pointer(pRight)).FpParent, bp+48, iHeight+1)) != 0) { goto __15 } goto splitnode_out __15: ; i = 0 __16: if !(i < readInt16(tls, (*RtreeNode)(unsafe.Pointer(pRight)).FzData+2)) { goto __18 } iRowid = nodeGetRowid(tls, pRtree, pRight, i) rc = updateMapping(tls, pRtree, iRowid, pRight, iHeight) if !(iRowid == (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid) { goto __19 } newCellIsRight = 1 __19: ; if !(rc != SQLITE_OK) { goto __20 } goto splitnode_out __20: ; goto __17 __17: i++ goto __16 goto __18 __18: ; if !((*RtreeNode)(unsafe.Pointer(pNode)).FiNode == int64(1)) { goto __21 } i = 0 __23: if !(i < readInt16(tls, (*RtreeNode)(unsafe.Pointer(pLeft)).FzData+2)) { goto __25 } iRowid1 = nodeGetRowid(tls, pRtree, pLeft, i) rc = updateMapping(tls, pRtree, iRowid1, pLeft, iHeight) if !(rc != SQLITE_OK) { goto __26 } goto splitnode_out __26: ; goto __24 __24: i++ goto __23 goto __25 __25: ; goto __22 __21: if !(newCellIsRight == 0) { goto __27 } rc = updateMapping(tls, pRtree, (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid, pLeft, iHeight) __27: ; __22: ; if !(rc == SQLITE_OK) { goto __28 } rc = nodeRelease(tls, pRtree, pRight) pRight = uintptr(0) __28: ; if !(rc == SQLITE_OK) { goto __29 } rc = nodeRelease(tls, pRtree, pLeft) pLeft = uintptr(0) __29: ; splitnode_out: nodeRelease(tls, pRtree, pRight) nodeRelease(tls, pRtree, pLeft) Xsqlite3_free(tls, aCell) return rc } func fixLeafParent(tls *libc.TLS, pRtree uintptr, pLeaf uintptr) int32 { var rc int32 = SQLITE_OK var pChild uintptr = pLeaf for rc == SQLITE_OK && (*RtreeNode)(unsafe.Pointer(pChild)).FiNode != int64(1) && (*RtreeNode)(unsafe.Pointer(pChild)).FpParent == uintptr(0) { var rc2 int32 = SQLITE_OK Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadParent, 1, (*RtreeNode)(unsafe.Pointer(pChild)).FiNode) rc = Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadParent) if rc == SQLITE_ROW { var pTest uintptr var iNode I64 iNode = Xsqlite3_column_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadParent, 0) for pTest = pLeaf; pTest != 0 && (*RtreeNode)(unsafe.Pointer(pTest)).FiNode != iNode; pTest = (*RtreeNode)(unsafe.Pointer(pTest)).FpParent { } if pTest == uintptr(0) { rc2 = nodeAcquire(tls, pRtree, iNode, uintptr(0), pChild) } } rc = Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadParent) if rc == SQLITE_OK { rc = rc2 } if rc == SQLITE_OK && !(int32((*RtreeNode)(unsafe.Pointer(pChild)).FpParent) != 0) { rc = SQLITE_CORRUPT | int32(1)<<8 } pChild = (*RtreeNode)(unsafe.Pointer(pChild)).FpParent } return rc } func removeNode(tls *libc.TLS, pRtree uintptr, pNode uintptr, iHeight int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 var rc2 int32 var pParent uintptr = uintptr(0) rc = nodeParentIndex(tls, pRtree, pNode, bp) if rc == SQLITE_OK { pParent = (*RtreeNode)(unsafe.Pointer(pNode)).FpParent (*RtreeNode)(unsafe.Pointer(pNode)).FpParent = uintptr(0) rc = deleteCell(tls, pRtree, pParent, *(*int32)(unsafe.Pointer(bp)), iHeight+1) } rc2 = nodeRelease(tls, pRtree, pParent) if rc == SQLITE_OK { rc = rc2 } if rc != SQLITE_OK { return rc } Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteNode, 1, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteNode) if SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteNode)) { return rc } Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteParent, 1, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteParent) if SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteParent)) { return rc } nodeHashDelete(tls, pRtree, pNode) (*RtreeNode)(unsafe.Pointer(pNode)).FiNode = I64(iHeight) (*RtreeNode)(unsafe.Pointer(pNode)).FpNext = (*Rtree)(unsafe.Pointer(pRtree)).FpDeleted (*RtreeNode)(unsafe.Pointer(pNode)).FnRef++ (*Rtree)(unsafe.Pointer(pRtree)).FpDeleted = pNode return SQLITE_OK } func fixBoundingBox(tls *libc.TLS, pRtree uintptr, pNode uintptr) int32 { bp := tls.Alloc(100) defer tls.Free(100) var pParent uintptr = (*RtreeNode)(unsafe.Pointer(pNode)).FpParent var rc int32 = SQLITE_OK if pParent != 0 { var nCell int32 = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) nodeGetCell(tls, pRtree, pNode, 0, bp) for *(*int32)(unsafe.Pointer(bp + 96)) = 1; *(*int32)(unsafe.Pointer(bp + 96)) < nCell; *(*int32)(unsafe.Pointer(bp + 96))++ { nodeGetCell(tls, pRtree, pNode, *(*int32)(unsafe.Pointer(bp + 96)), bp+48) cellUnion(tls, pRtree, bp, bp+48) } (*RtreeCell)(unsafe.Pointer(bp)).FiRowid = (*RtreeNode)(unsafe.Pointer(pNode)).FiNode rc = nodeParentIndex(tls, pRtree, pNode, bp+96) if rc == SQLITE_OK { nodeOverwriteCell(tls, pRtree, pParent, bp, *(*int32)(unsafe.Pointer(bp + 96))) rc = fixBoundingBox(tls, pRtree, pParent) } } return rc } func deleteCell(tls *libc.TLS, pRtree uintptr, pNode uintptr, iCell int32, iHeight int32) int32 { var pParent uintptr var rc int32 if SQLITE_OK != libc.AssignInt32(&rc, fixLeafParent(tls, pRtree, pNode)) { return rc } nodeDeleteCell(tls, pRtree, pNode, iCell) pParent = (*RtreeNode)(unsafe.Pointer(pNode)).FpParent if pParent != 0 { if readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) < ((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize-4)/int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)/3 { rc = removeNode(tls, pRtree, pNode, iHeight) } else { rc = fixBoundingBox(tls, pRtree, pNode) } } return rc } func sReinsert(tls *libc.TLS, pRtree uintptr, pNode uintptr, pCell uintptr, iHeight int32) int32 { bp := tls.Alloc(48) defer tls.Free(48) var aOrder uintptr var aSpare uintptr var aCell uintptr var aDistance uintptr var nCell int32 var iDim int32 var ii int32 var rc int32 = SQLITE_OK var n int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(RtreeDValue(0)))*uint64(RTREE_MAX_DIMENSIONS)) nCell = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) + 1 n = (nCell + 1) & libc.CplInt32(1) aCell = Xsqlite3_malloc64(tls, uint64(n)*(uint64(unsafe.Sizeof(RtreeCell{}))+uint64(unsafe.Sizeof(int32(0)))+uint64(unsafe.Sizeof(int32(0)))+uint64(unsafe.Sizeof(RtreeDValue(0))))) if !(aCell != 0) { return SQLITE_NOMEM } aOrder = aCell + uintptr(n)*48 aSpare = aOrder + uintptr(n)*4 aDistance = aSpare + uintptr(n)*4 for ii = 0; ii < nCell; ii++ { if ii == nCell-1 { libc.Xmemcpy(tls, aCell+uintptr(ii)*48, pCell, uint64(unsafe.Sizeof(RtreeCell{}))) } else { nodeGetCell(tls, pRtree, pNode, ii, aCell+uintptr(ii)*48) } *(*int32)(unsafe.Pointer(aOrder + uintptr(ii)*4)) = ii for iDim = 0; iDim < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim); iDim++ { *(*RtreeDValue)(unsafe.Pointer(bp + uintptr(iDim)*8)) += func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2)*4))) }() *(*RtreeDValue)(unsafe.Pointer(bp + uintptr(iDim)*8)) += func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2+1)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2+1)*4))) }() } } for iDim = 0; iDim < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim); iDim++ { *(*RtreeDValue)(unsafe.Pointer(bp + uintptr(iDim)*8)) = *(*RtreeDValue)(unsafe.Pointer(bp + uintptr(iDim)*8)) / (float64(nCell) * RtreeDValue(2)) } for ii = 0; ii < nCell; ii++ { *(*RtreeDValue)(unsafe.Pointer(aDistance + uintptr(ii)*8)) = 0.0 for iDim = 0; iDim < int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim); iDim++ { var coord RtreeDValue = func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2+1)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2+1)*4))) }() - func() float64 { if int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32 { return float64(*(*RtreeValue)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2)*4))) } return float64(*(*int32)(unsafe.Pointer(aCell + uintptr(ii)*48 + 8 + uintptr(iDim*2)*4))) }() *(*RtreeDValue)(unsafe.Pointer(aDistance + uintptr(ii)*8)) += (coord - *(*RtreeDValue)(unsafe.Pointer(bp + uintptr(iDim)*8))) * (coord - *(*RtreeDValue)(unsafe.Pointer(bp + uintptr(iDim)*8))) } } sSortByDistance(tls, aOrder, nCell, aDistance, aSpare) nodeZero(tls, pRtree, pNode) for ii = 0; rc == SQLITE_OK && ii < nCell-(((*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize-4)/int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)/3+1); ii++ { var p uintptr = aCell + uintptr(*(*int32)(unsafe.Pointer(aOrder + uintptr(ii)*4)))*48 nodeInsertCell(tls, pRtree, pNode, p) if (*RtreeCell)(unsafe.Pointer(p)).FiRowid == (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid { if iHeight == 0 { rc = rowidWrite(tls, pRtree, (*RtreeCell)(unsafe.Pointer(p)).FiRowid, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) } else { rc = parentWrite(tls, pRtree, (*RtreeCell)(unsafe.Pointer(p)).FiRowid, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) } } } if rc == SQLITE_OK { rc = fixBoundingBox(tls, pRtree, pNode) } for ; rc == SQLITE_OK && ii < nCell; ii++ { var p uintptr = aCell + uintptr(*(*int32)(unsafe.Pointer(aOrder + uintptr(ii)*4)))*48 rc = sChooseLeaf(tls, pRtree, p, iHeight, bp+40) if rc == SQLITE_OK { var rc2 int32 rc = rtreeInsertCell(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 40)), p, iHeight) rc2 = nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 40))) if rc == SQLITE_OK { rc = rc2 } } } Xsqlite3_free(tls, aCell) return rc } func rtreeInsertCell(tls *libc.TLS, pRtree uintptr, pNode uintptr, pCell uintptr, iHeight int32) int32 { var rc int32 = SQLITE_OK if iHeight > 0 { var pChild uintptr = nodeHashLookup(tls, pRtree, (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid) if pChild != 0 { nodeRelease(tls, pRtree, (*RtreeNode)(unsafe.Pointer(pChild)).FpParent) nodeReference(tls, pNode) (*RtreeNode)(unsafe.Pointer(pChild)).FpParent = pNode } } if nodeInsertCell(tls, pRtree, pNode, pCell) != 0 { if iHeight <= (*Rtree)(unsafe.Pointer(pRtree)).FiReinsertHeight || (*RtreeNode)(unsafe.Pointer(pNode)).FiNode == int64(1) { rc = sSplitNode(tls, pRtree, pNode, pCell, iHeight) } else { (*Rtree)(unsafe.Pointer(pRtree)).FiReinsertHeight = iHeight rc = sReinsert(tls, pRtree, pNode, pCell, iHeight) } } else { rc = sAdjustTree(tls, pRtree, pNode, pCell) if rc == SQLITE_OK { if iHeight == 0 { rc = rowidWrite(tls, pRtree, (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) } else { rc = parentWrite(tls, pRtree, (*RtreeCell)(unsafe.Pointer(pCell)).FiRowid, (*RtreeNode)(unsafe.Pointer(pNode)).FiNode) } } } return rc } func reinsertNodeContent(tls *libc.TLS, pRtree uintptr, pNode uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var ii int32 var rc int32 = SQLITE_OK var nCell int32 = readInt16(tls, (*RtreeNode)(unsafe.Pointer(pNode)).FzData+2) for ii = 0; rc == SQLITE_OK && ii < nCell; ii++ { nodeGetCell(tls, pRtree, pNode, ii, bp) rc = sChooseLeaf(tls, pRtree, bp, int32((*RtreeNode)(unsafe.Pointer(pNode)).FiNode), bp+48) if rc == SQLITE_OK { var rc2 int32 rc = rtreeInsertCell(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 48)), bp, int32((*RtreeNode)(unsafe.Pointer(pNode)).FiNode)) rc2 = nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 48))) if rc == SQLITE_OK { rc = rc2 } } } return rc } func rtreeNewRowid(tls *libc.TLS, pRtree uintptr, piRowid uintptr) int32 { var rc int32 Xsqlite3_bind_null(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid, 1) Xsqlite3_bind_null(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid, 2) Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid) rc = Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpWriteRowid) *(*I64)(unsafe.Pointer(piRowid)) = Xsqlite3_last_insert_rowid(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb) return rc } func rtreeDeleteRowid(tls *libc.TLS, pRtree uintptr, iDelete Sqlite3_int64) int32 { bp := tls.Alloc(32) defer tls.Free(32) var rc int32 *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = nodeAcquire(tls, pRtree, int64(1), uintptr(0), bp) if rc == SQLITE_OK { rc = findLeafNode(tls, pRtree, iDelete, bp+8, uintptr(0)) } if rc == SQLITE_OK && *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { var rc2 int32 rc = nodeRowidIndex(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 8)), iDelete, bp+16) if rc == SQLITE_OK { rc = deleteCell(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 8)), *(*int32)(unsafe.Pointer(bp + 16)), 0) } rc2 = nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 8))) if rc == SQLITE_OK { rc = rc2 } } if rc == SQLITE_OK { Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteRowid, 1, iDelete) Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteRowid) rc = Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpDeleteRowid) } if rc == SQLITE_OK && (*Rtree)(unsafe.Pointer(pRtree)).FiDepth > 0 && readInt16(tls, (*RtreeNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzData+2) == 1 { var rc2 int32 *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) var iChild I64 = nodeGetRowid(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp)), 0) rc = nodeAcquire(tls, pRtree, iChild, *(*uintptr)(unsafe.Pointer(bp)), bp+24) if rc == SQLITE_OK { rc = removeNode(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 24)), (*Rtree)(unsafe.Pointer(pRtree)).FiDepth-1) } rc2 = nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 24))) if rc == SQLITE_OK { rc = rc2 } if rc == SQLITE_OK { (*Rtree)(unsafe.Pointer(pRtree)).FiDepth-- writeInt16(tls, (*RtreeNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzData, (*Rtree)(unsafe.Pointer(pRtree)).FiDepth) (*RtreeNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FisDirty = 1 } } for *(*uintptr)(unsafe.Pointer(bp + 8)) = (*Rtree)(unsafe.Pointer(pRtree)).FpDeleted; *(*uintptr)(unsafe.Pointer(bp + 8)) != 0; *(*uintptr)(unsafe.Pointer(bp + 8)) = (*Rtree)(unsafe.Pointer(pRtree)).FpDeleted { if rc == SQLITE_OK { rc = reinsertNodeContent(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 8))) } (*Rtree)(unsafe.Pointer(pRtree)).FpDeleted = (*RtreeNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpNext (*Rtree)(unsafe.Pointer(pRtree)).FnNodeRef-- Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } if rc == SQLITE_OK { rc = nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp))) } else { nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp))) } return rc } func rtreeValueDown(tls *libc.TLS, v uintptr) RtreeValue { var d float64 = Xsqlite3_value_double(tls, v) var f float32 = float32(d) if float64(f) > d { f = float32(d * func() float64 { if d < float64(0) { return float64(1.0) + float64(1.0)/8388608.0 } return float64(1.0) - float64(1.0)/8388608.0 }()) } return f } func rtreeValueUp(tls *libc.TLS, v uintptr) RtreeValue { var d float64 = Xsqlite3_value_double(tls, v) var f float32 = float32(d) if float64(f) < d { f = float32(d * func() float64 { if d < float64(0) { return float64(1.0) - float64(1.0)/8388608.0 } return float64(1.0) + float64(1.0)/8388608.0 }()) } return f } func rtreeConstraintError(tls *libc.TLS, pRtree uintptr, iCol int32) int32 { bp := tls.Alloc(64) defer tls.Free(64) *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) var zSql uintptr var rc int32 zSql = Xsqlite3_mprintf(tls, ts+26580, libc.VaList(bp, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName)) if zSql != 0 { rc = Xsqlite3_prepare_v2(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb, zSql, -1, bp+56, uintptr(0)) } else { rc = SQLITE_NOMEM } Xsqlite3_free(tls, zSql) if rc == SQLITE_OK { if iCol == 0 { var zCol uintptr = Xsqlite3_column_name(tls, *(*uintptr)(unsafe.Pointer(bp + 56)), 0) (*Rtree)(unsafe.Pointer(pRtree)).Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+26600, libc.VaList(bp+16, (*Rtree)(unsafe.Pointer(pRtree)).FzName, zCol)) } else { var zCol1 uintptr = Xsqlite3_column_name(tls, *(*uintptr)(unsafe.Pointer(bp + 56)), iCol) var zCol2 uintptr = Xsqlite3_column_name(tls, *(*uintptr)(unsafe.Pointer(bp + 56)), iCol+1) (*Rtree)(unsafe.Pointer(pRtree)).Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+26632, libc.VaList(bp+32, (*Rtree)(unsafe.Pointer(pRtree)).FzName, zCol1, zCol2)) } } Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 56))) return func() int32 { if rc == SQLITE_OK { return SQLITE_CONSTRAINT } return rc }() } func rtreeUpdate(tls *libc.TLS, pVtab uintptr, nData int32, aData uintptr, pRowid uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var pRtree uintptr var rc int32 var bHaveRowid int32 var steprc int32 var ii int32 var nn int32 var rc2 int32 var pUp uintptr var jj int32 pRtree = pVtab rc = SQLITE_OK bHaveRowid = 0 if !((*Rtree)(unsafe.Pointer(pRtree)).FnNodeRef != 0) { goto __1 } return SQLITE_LOCKED | int32(2)<<8 __1: ; rtreeReference(tls, pRtree) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(RtreeCell{}))) if !(nData > 1) { goto __2 } nn = nData - 4 if !(nn > int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2)) { goto __3 } nn = int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) __3: ; if !(int32((*Rtree)(unsafe.Pointer(pRtree)).FeCoordType) == RTREE_COORD_REAL32) { goto __4 } ii = 0 __6: if !(ii < nn) { goto __8 } *(*RtreeValue)(unsafe.Pointer(bp + 8 + uintptr(ii)*4)) = rtreeValueDown(tls, *(*uintptr)(unsafe.Pointer(aData + uintptr(ii+3)*8))) *(*RtreeValue)(unsafe.Pointer(bp + 8 + uintptr(ii+1)*4)) = rtreeValueUp(tls, *(*uintptr)(unsafe.Pointer(aData + uintptr(ii+4)*8))) if !(*(*RtreeValue)(unsafe.Pointer(bp + 8 + uintptr(ii)*4)) > *(*RtreeValue)(unsafe.Pointer(bp + 8 + uintptr(ii+1)*4))) { goto __9 } rc = rtreeConstraintError(tls, pRtree, ii+1) goto constraint __9: ; goto __7 __7: ii = ii + 2 goto __6 goto __8 __8: ; goto __5 __4: ii = 0 __10: if !(ii < nn) { goto __12 } *(*int32)(unsafe.Pointer(bp + 8 + uintptr(ii)*4)) = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(aData + uintptr(ii+3)*8))) *(*int32)(unsafe.Pointer(bp + 8 + uintptr(ii+1)*4)) = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(aData + uintptr(ii+4)*8))) if !(*(*int32)(unsafe.Pointer(bp + 8 + uintptr(ii)*4)) > *(*int32)(unsafe.Pointer(bp + 8 + uintptr(ii+1)*4))) { goto __13 } rc = rtreeConstraintError(tls, pRtree, ii+1) goto constraint __13: ; goto __11 __11: ii = ii + 2 goto __10 goto __12 __12: ; __5: ; if !(Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(aData + 2*8))) != SQLITE_NULL) { goto __14 } (*RtreeCell)(unsafe.Pointer(bp)).FiRowid = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(aData + 2*8))) if !(Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(aData))) == SQLITE_NULL || Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(aData))) != (*RtreeCell)(unsafe.Pointer(bp)).FiRowid) { goto __15 } Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid, 1, (*RtreeCell)(unsafe.Pointer(bp)).FiRowid) steprc = Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) rc = Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) if !(SQLITE_ROW == steprc) { goto __16 } if !(Xsqlite3_vtab_on_conflict(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb) == SQLITE_REPLACE) { goto __17 } rc = rtreeDeleteRowid(tls, pRtree, (*RtreeCell)(unsafe.Pointer(bp)).FiRowid) goto __18 __17: rc = rtreeConstraintError(tls, pRtree, 0) goto constraint __18: ; __16: ; __15: ; bHaveRowid = 1 __14: ; __2: ; if !(Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(aData))) != SQLITE_NULL) { goto __19 } rc = rtreeDeleteRowid(tls, pRtree, Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(aData)))) __19: ; if !(rc == SQLITE_OK && nData > 1) { goto __20 } *(*uintptr)(unsafe.Pointer(bp + 48)) = uintptr(0) if !(bHaveRowid == 0) { goto __21 } rc = rtreeNewRowid(tls, pRtree, bp) __21: ; *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = (*RtreeCell)(unsafe.Pointer(bp)).FiRowid if !(rc == SQLITE_OK) { goto __22 } rc = sChooseLeaf(tls, pRtree, bp, 0, bp+48) __22: ; if !(rc == SQLITE_OK) { goto __23 } (*Rtree)(unsafe.Pointer(pRtree)).FiReinsertHeight = -1 rc = rtreeInsertCell(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 48)), bp, 0) rc2 = nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 48))) if !(rc == SQLITE_OK) { goto __24 } rc = rc2 __24: ; __23: ; if !(rc == SQLITE_OK && (*Rtree)(unsafe.Pointer(pRtree)).FnAux != 0) { goto __25 } pUp = (*Rtree)(unsafe.Pointer(pRtree)).FpWriteAux Xsqlite3_bind_int64(tls, pUp, 1, *(*Sqlite_int64)(unsafe.Pointer(pRowid))) jj = 0 __26: if !(jj < int32((*Rtree)(unsafe.Pointer(pRtree)).FnAux)) { goto __28 } Xsqlite3_bind_value(tls, pUp, jj+2, *(*uintptr)(unsafe.Pointer(aData + uintptr(int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2)+3+jj)*8))) goto __27 __27: jj++ goto __26 goto __28 __28: ; Xsqlite3_step(tls, pUp) rc = Xsqlite3_reset(tls, pUp) __25: ; __20: ; constraint: rtreeRelease(tls, pRtree) return rc } func rtreeBeginTransaction(tls *libc.TLS, pVtab uintptr) int32 { var pRtree uintptr = pVtab (*Rtree)(unsafe.Pointer(pRtree)).FinWrTrans++ return SQLITE_OK } func rtreeEndTransaction(tls *libc.TLS, pVtab uintptr) int32 { var pRtree uintptr = pVtab (*Rtree)(unsafe.Pointer(pRtree)).FinWrTrans = U8(0) nodeBlobReset(tls, pRtree) return SQLITE_OK } func rtreeRename(tls *libc.TLS, pVtab uintptr, zNewName uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) var pRtree uintptr = pVtab var rc int32 = SQLITE_NOMEM var zSql uintptr = Xsqlite3_mprintf(tls, ts+26669, libc.VaList(bp, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName, zNewName, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName, zNewName, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName, zNewName)) if zSql != 0 { nodeBlobReset(tls, pRtree) rc = Xsqlite3_exec(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb, zSql, uintptr(0), uintptr(0), uintptr(0)) Xsqlite3_free(tls, zSql) } return rc } func rtreeSavepoint(tls *libc.TLS, pVtab uintptr, iSavepoint int32) int32 { var pRtree uintptr = pVtab var iwt U8 = (*Rtree)(unsafe.Pointer(pRtree)).FinWrTrans _ = iSavepoint (*Rtree)(unsafe.Pointer(pRtree)).FinWrTrans = U8(0) nodeBlobReset(tls, pRtree) (*Rtree)(unsafe.Pointer(pRtree)).FinWrTrans = iwt return SQLITE_OK } func rtreeQueryStat1(tls *libc.TLS, db uintptr, pRtree uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var zFmt uintptr = ts + 26814 var zSql uintptr var rc int32 var nRow I64 = int64(RTREE_MIN_ROWEST) rc = Xsqlite3_table_column_metadata(tls, db, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, ts+12700, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0)) if rc != SQLITE_OK { (*Rtree)(unsafe.Pointer(pRtree)).FnRowEst = int64(RTREE_DEFAULT_ROWEST) if rc == SQLITE_ERROR { return SQLITE_OK } return rc } zSql = Xsqlite3_mprintf(tls, zFmt, libc.VaList(bp, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName)) if zSql == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_prepare_v2(tls, db, zSql, -1, bp+16, uintptr(0)) if rc == SQLITE_OK { if Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) == SQLITE_ROW { nRow = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 0) } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) } Xsqlite3_free(tls, zSql) } (*Rtree)(unsafe.Pointer(pRtree)).FnRowEst = func() int64 { if nRow > int64(RTREE_MIN_ROWEST) { return nRow } return int64(RTREE_MIN_ROWEST) }() return rc } func rtreeShadowName(tls *libc.TLS, zName uintptr) int32 { var i uint32 for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(azName1))/uint64(unsafe.Sizeof(uintptr(0))); i++ { if Xsqlite3_stricmp(tls, zName, azName1[i]) == 0 { return 1 } } return 0 } var azName1 = [3]uintptr{ ts + 26870, ts + 6412, ts + 17625, } var rtreeModule = Sqlite3_module{ FiVersion: 3, FxCreate: 0, FxConnect: 0, FxBestIndex: 0, FxDisconnect: 0, FxDestroy: 0, FxOpen: 0, FxClose: 0, FxFilter: 0, FxNext: 0, FxEof: 0, FxColumn: 0, FxRowid: 0, FxUpdate: 0, FxBegin: 0, FxSync: 0, FxCommit: 0, FxRollback: 0, FxRename: 0, FxSavepoint: 0, FxShadowName: 0, } func rtreeSqlInit(tls *libc.TLS, pRtree uintptr, db uintptr, zDb uintptr, zPrefix uintptr, isCreate int32) int32 { bp := tls.Alloc(232) defer tls.Free(232) var rc int32 = SQLITE_OK var i int32 var f int32 = SQLITE_PREPARE_PERSISTENT | SQLITE_PREPARE_NO_VTAB (*Rtree)(unsafe.Pointer(pRtree)).Fdb = db if isCreate != 0 { var zCreate uintptr var p uintptr = Xsqlite3_str_new(tls, db) var ii int32 Xsqlite3_str_appendf(tls, p, ts+26875, libc.VaList(bp, zDb, zPrefix)) for ii = 0; ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnAux); ii++ { Xsqlite3_str_appendf(tls, p, ts+26937, libc.VaList(bp+16, ii)) } Xsqlite3_str_appendf(tls, p, ts+26942, libc.VaList(bp+24, zDb, zPrefix)) Xsqlite3_str_appendf(tls, p, ts+27006, libc.VaList(bp+40, zDb, zPrefix)) Xsqlite3_str_appendf(tls, p, ts+27076, libc.VaList(bp+56, zDb, zPrefix, (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize)) zCreate = Xsqlite3_str_finish(tls, p) if !(zCreate != 0) { return SQLITE_NOMEM } rc = Xsqlite3_exec(tls, db, zCreate, uintptr(0), uintptr(0), uintptr(0)) Xsqlite3_free(tls, zCreate) if rc != SQLITE_OK { return rc } } *(*uintptr)(unsafe.Pointer(bp + 168)) = pRtree + 120 *(*uintptr)(unsafe.Pointer(bp + 168 + 1*8)) = pRtree + 128 *(*uintptr)(unsafe.Pointer(bp + 168 + 2*8)) = pRtree + 136 *(*uintptr)(unsafe.Pointer(bp + 168 + 3*8)) = pRtree + 144 *(*uintptr)(unsafe.Pointer(bp + 168 + 4*8)) = pRtree + 152 *(*uintptr)(unsafe.Pointer(bp + 168 + 5*8)) = pRtree + 160 *(*uintptr)(unsafe.Pointer(bp + 168 + 6*8)) = pRtree + 168 *(*uintptr)(unsafe.Pointer(bp + 168 + 7*8)) = pRtree + 176 rc = rtreeQueryStat1(tls, db, pRtree) for i = 0; i < N_STATEMENT && rc == SQLITE_OK; i++ { var zSql uintptr var zFormat uintptr if i != 3 || int32((*Rtree)(unsafe.Pointer(pRtree)).FnAux) == 0 { zFormat = azSql[i] } else { zFormat = ts + 27125 } zSql = Xsqlite3_mprintf(tls, zFormat, libc.VaList(bp+80, zDb, zPrefix)) if zSql != 0 { rc = Xsqlite3_prepare_v3(tls, db, zSql, -1, uint32(f), *(*uintptr)(unsafe.Pointer(bp + 168 + uintptr(i)*8)), uintptr(0)) } else { rc = SQLITE_NOMEM } Xsqlite3_free(tls, zSql) } if (*Rtree)(unsafe.Pointer(pRtree)).FnAux != 0 { (*Rtree)(unsafe.Pointer(pRtree)).FzReadAuxSql = Xsqlite3_mprintf(tls, ts+27233, libc.VaList(bp+96, zDb, zPrefix)) if (*Rtree)(unsafe.Pointer(pRtree)).FzReadAuxSql == uintptr(0) { rc = SQLITE_NOMEM } else { var p uintptr = Xsqlite3_str_new(tls, db) var ii int32 var zSql uintptr Xsqlite3_str_appendf(tls, p, ts+27278, libc.VaList(bp+112, zDb, zPrefix)) for ii = 0; ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnAux); ii++ { if ii != 0 { Xsqlite3_str_append(tls, p, ts+14119, 1) } if ii < int32((*Rtree)(unsafe.Pointer(pRtree)).FnAuxNotNull) { Xsqlite3_str_appendf(tls, p, ts+27305, libc.VaList(bp+128, ii, ii+2, ii)) } else { Xsqlite3_str_appendf(tls, p, ts+27327, libc.VaList(bp+152, ii, ii+2)) } } Xsqlite3_str_appendf(tls, p, ts+27335, 0) zSql = Xsqlite3_str_finish(tls, p) if zSql == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_prepare_v3(tls, db, zSql, -1, uint32(f), pRtree+184, uintptr(0)) Xsqlite3_free(tls, zSql) } } } return rc } var azSql = [8]uintptr{ ts + 27351, ts + 27404, ts + 27449, ts + 27501, ts + 27555, ts + 27600, ts + 27658, ts + 27713, } func getIntFromStmt(tls *libc.TLS, db uintptr, zSql uintptr, piVal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_NOMEM if zSql != 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = Xsqlite3_prepare_v2(tls, db, zSql, -1, bp, uintptr(0)) if rc == SQLITE_OK { if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) { *(*int32)(unsafe.Pointer(piVal)) = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp)), 0) } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) } } return rc } func getNodeSize(tls *libc.TLS, db uintptr, pRtree uintptr, isCreate int32, pzErr uintptr) int32 { bp := tls.Alloc(52) defer tls.Free(52) var rc int32 var zSql uintptr if isCreate != 0 { *(*int32)(unsafe.Pointer(bp + 48)) = 0 zSql = Xsqlite3_mprintf(tls, ts+27760, libc.VaList(bp, (*Rtree)(unsafe.Pointer(pRtree)).FzDb)) rc = getIntFromStmt(tls, db, zSql, bp+48) if rc == SQLITE_OK { (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize = *(*int32)(unsafe.Pointer(bp + 48)) - 64 if 4+int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*RTREE_MAXCELLS < (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize { (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize = 4 + int32((*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell)*RTREE_MAXCELLS } } else { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+8, Xsqlite3_errmsg(tls, db))) } } else { zSql = Xsqlite3_mprintf(tls, ts+27780, libc.VaList(bp+16, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, (*Rtree)(unsafe.Pointer(pRtree)).FzName)) rc = getIntFromStmt(tls, db, zSql, pRtree+32) if rc != SQLITE_OK { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+32, Xsqlite3_errmsg(tls, db))) } else if (*Rtree)(unsafe.Pointer(pRtree)).FiNodeSize < 512-64 { rc = SQLITE_CORRUPT | int32(1)<<8 *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+27837, libc.VaList(bp+40, (*Rtree)(unsafe.Pointer(pRtree)).FzName)) } } Xsqlite3_free(tls, zSql) return rc } func rtreeTokenLength(tls *libc.TLS, z uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = 0 return Xsqlite3GetToken(tls, z, bp) } func rtreeInit(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr, isCreate int32) int32 { bp := tls.Alloc(136) defer tls.Free(136) var rc int32 var pRtree uintptr var nDb int32 var nName int32 var eCoordType int32 var pSql uintptr var zSql uintptr var ii int32 var iErr int32 var zArg uintptr rc = SQLITE_OK eCoordType = func() int32 { if pAux != 0 { return RTREE_COORD_INT32 } return RTREE_COORD_REAL32 }() ii = 4 *(*[5]uintptr)(unsafe.Pointer(bp + 96)) = [5]uintptr{ uintptr(0), ts + 27872, ts + 27915, ts + 27950, ts + 27986, } if !(argc < 6 || argc > RTREE_MAX_AUX_COLUMN+3) { goto __1 } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(bp + 96 + uintptr(2+libc.Bool32(argc >= 6))*8)))) return SQLITE_ERROR __1: ; Xsqlite3_vtab_config(tls, db, SQLITE_VTAB_CONSTRAINT_SUPPORT, libc.VaList(bp+8, 1)) nDb = int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8)))) nName = int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8)))) pRtree = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(Rtree{}))+uint64(nDb)+uint64(nName)+uint64(2)) if !!(pRtree != 0) { goto __2 } return SQLITE_NOMEM __2: ; libc.Xmemset(tls, pRtree, 0, uint64(unsafe.Sizeof(Rtree{}))+uint64(nDb)+uint64(nName)+uint64(2)) (*Rtree)(unsafe.Pointer(pRtree)).FnBusy = U32(1) (*Rtree)(unsafe.Pointer(pRtree)).Fbase.FpModule = uintptr(unsafe.Pointer(&rtreeModule)) (*Rtree)(unsafe.Pointer(pRtree)).FzDb = pRtree + 1*968 (*Rtree)(unsafe.Pointer(pRtree)).FzName = (*Rtree)(unsafe.Pointer(pRtree)).FzDb + uintptr(nDb+1) (*Rtree)(unsafe.Pointer(pRtree)).FeCoordType = U8(eCoordType) libc.Xmemcpy(tls, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, *(*uintptr)(unsafe.Pointer(argv + 1*8)), uint64(nDb)) libc.Xmemcpy(tls, (*Rtree)(unsafe.Pointer(pRtree)).FzName, *(*uintptr)(unsafe.Pointer(argv + 2*8)), uint64(nName)) pSql = Xsqlite3_str_new(tls, db) Xsqlite3_str_appendf(tls, pSql, ts+28023, libc.VaList(bp+16, rtreeTokenLength(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8))), *(*uintptr)(unsafe.Pointer(argv + 3*8)))) ii = 4 __3: if !(ii < argc) { goto __5 } zArg = *(*uintptr)(unsafe.Pointer(argv + uintptr(ii)*8)) if !(int32(*(*int8)(unsafe.Pointer(zArg))) == '+') { goto __6 } (*Rtree)(unsafe.Pointer(pRtree)).FnAux++ Xsqlite3_str_appendf(tls, pSql, ts+28047, libc.VaList(bp+32, rtreeTokenLength(tls, zArg+uintptr(1)), zArg+uintptr(1))) goto __7 __6: if !(int32((*Rtree)(unsafe.Pointer(pRtree)).FnAux) > 0) { goto __8 } goto __5 goto __9 __8: (*Rtree)(unsafe.Pointer(pRtree)).FnDim2++ Xsqlite3_str_appendf(tls, pSql, azFormat[eCoordType], libc.VaList(bp+48, rtreeTokenLength(tls, zArg), zArg)) __9: ; __7: ; goto __4 __4: ii++ goto __3 goto __5 __5: ; Xsqlite3_str_appendf(tls, pSql, ts+28053, 0) zSql = Xsqlite3_str_finish(tls, pSql) if !!(zSql != 0) { goto __10 } rc = SQLITE_NOMEM goto __11 __10: if !(ii < argc) { goto __12 } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+64, *(*uintptr)(unsafe.Pointer(bp + 96 + 4*8)))) rc = SQLITE_ERROR goto __13 __12: if !(SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3_declare_vtab(tls, db, zSql))) { goto __14 } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+72, Xsqlite3_errmsg(tls, db))) __14: ; __13: ; __11: ; Xsqlite3_free(tls, zSql) if !(rc != 0) { goto __15 } goto rtreeInit_fail __15: ; (*Rtree)(unsafe.Pointer(pRtree)).FnDim = U8(int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) / 2) if !(int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim) < 1) { goto __16 } iErr = 2 goto __17 __16: if !(int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2) > RTREE_MAX_DIMENSIONS*2) { goto __18 } iErr = 3 goto __19 __18: if !(int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2)%2 != 0) { goto __20 } iErr = 1 goto __21 __20: iErr = 0 __21: ; __19: ; __17: ; if !(iErr != 0) { goto __22 } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+80, *(*uintptr)(unsafe.Pointer(bp + 96 + uintptr(iErr)*8)))) goto rtreeInit_fail __22: ; (*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell = U8(8 + int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2)*4) rc = getNodeSize(tls, db, pRtree, isCreate, pzErr) if !(rc != 0) { goto __23 } goto rtreeInit_fail __23: ; rc = rtreeSqlInit(tls, pRtree, db, *(*uintptr)(unsafe.Pointer(argv + 1*8)), *(*uintptr)(unsafe.Pointer(argv + 2*8)), isCreate) if !(rc != 0) { goto __24 } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+88, Xsqlite3_errmsg(tls, db))) goto rtreeInit_fail __24: ; *(*uintptr)(unsafe.Pointer(ppVtab)) = pRtree return SQLITE_OK rtreeInit_fail: if !(rc == SQLITE_OK) { goto __25 } rc = SQLITE_ERROR __25: ; rtreeRelease(tls, pRtree) return rc } var azFormat = [2]uintptr{ts + 28056, ts + 28067} func rtreenode(tls *libc.TLS, ctx uintptr, nArg int32, apArg uintptr) { bp := tls.Alloc(1072) defer tls.Free(1072) var ii int32 var nData int32 var errCode int32 var pOut uintptr _ = nArg libc.Xmemset(tls, bp+16, 0, uint64(unsafe.Sizeof(RtreeNode{}))) libc.Xmemset(tls, bp+56, 0, uint64(unsafe.Sizeof(Rtree{}))) (*Rtree)(unsafe.Pointer(bp + 56)).FnDim = U8(Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(apArg)))) if int32((*Rtree)(unsafe.Pointer(bp+56)).FnDim) < 1 || int32((*Rtree)(unsafe.Pointer(bp+56)).FnDim) > 5 { return } (*Rtree)(unsafe.Pointer(bp + 56)).FnDim2 = U8(int32((*Rtree)(unsafe.Pointer(bp+56)).FnDim) * 2) (*Rtree)(unsafe.Pointer(bp + 56)).FnBytesPerCell = U8(8 + 8*int32((*Rtree)(unsafe.Pointer(bp+56)).FnDim)) (*RtreeNode)(unsafe.Pointer(bp + 16)).FzData = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(apArg + 1*8))) if (*RtreeNode)(unsafe.Pointer(bp+16)).FzData == uintptr(0) { return } nData = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(apArg + 1*8))) if nData < 4 { return } if nData < readInt16(tls, (*RtreeNode)(unsafe.Pointer(bp+16)).FzData+2)*int32((*Rtree)(unsafe.Pointer(bp+56)).FnBytesPerCell) { return } pOut = Xsqlite3_str_new(tls, uintptr(0)) for ii = 0; ii < readInt16(tls, (*RtreeNode)(unsafe.Pointer(bp+16)).FzData+2); ii++ { var jj int32 nodeGetCell(tls, bp+56, bp+16, ii, bp+1024) if ii > 0 { Xsqlite3_str_append(tls, pOut, ts+12272, 1) } Xsqlite3_str_appendf(tls, pOut, ts+28077, libc.VaList(bp, (*RtreeCell)(unsafe.Pointer(bp+1024)).FiRowid)) for jj = 0; jj < int32((*Rtree)(unsafe.Pointer(bp+56)).FnDim2); jj++ { Xsqlite3_str_appendf(tls, pOut, ts+28083, libc.VaList(bp+8, float64(*(*RtreeValue)(unsafe.Pointer(bp + 1024 + 8 + uintptr(jj)*4))))) } Xsqlite3_str_append(tls, pOut, ts+28087, 1) } errCode = Xsqlite3_str_errcode(tls, pOut) Xsqlite3_result_text(tls, ctx, Xsqlite3_str_finish(tls, pOut), -1, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) Xsqlite3_result_error_code(tls, ctx, errCode) } func rtreedepth(tls *libc.TLS, ctx uintptr, nArg int32, apArg uintptr) { _ = nArg if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(apArg))) != SQLITE_BLOB || Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(apArg))) < 2 { Xsqlite3_result_error(tls, ctx, ts+28089, -1) } else { var zBlob uintptr = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(apArg))) if zBlob != 0 { Xsqlite3_result_int(tls, ctx, readInt16(tls, zBlob)) } else { Xsqlite3_result_error_nomem(tls, ctx) } } } // Context object passed between the various routines that make up the // implementation of integrity-check function rtreecheck(). type RtreeCheck1 = struct { Fdb uintptr FzDb uintptr FzTab uintptr FbInt int32 FnDim int32 FpGetNode uintptr FaCheckMapping [2]uintptr FnLeaf int32 FnNonLeaf int32 Frc int32 F__ccgo_pad1 [4]byte FzReport uintptr FnErr int32 F__ccgo_pad2 [4]byte } // Context object passed between the various routines that make up the // implementation of integrity-check function rtreecheck(). type RtreeCheck = RtreeCheck1 func rtreeCheckReset(tls *libc.TLS, pCheck uintptr, pStmt uintptr) { var rc int32 = Xsqlite3_reset(tls, pStmt) if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc == SQLITE_OK { (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc = rc } } func rtreeCheckPrepare(tls *libc.TLS, pCheck uintptr, zFmt uintptr, va uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var ap Va_list _ = ap var z uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) ap = va z = Xsqlite3_vmprintf(tls, zFmt, ap) if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc == SQLITE_OK { if z == uintptr(0) { (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc = SQLITE_NOMEM } else { (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc = Xsqlite3_prepare_v2(tls, (*RtreeCheck)(unsafe.Pointer(pCheck)).Fdb, z, -1, bp, uintptr(0)) } } Xsqlite3_free(tls, z) _ = ap return *(*uintptr)(unsafe.Pointer(bp)) } func rtreeCheckAppendMsg(tls *libc.TLS, pCheck uintptr, zFmt uintptr, va uintptr) { bp := tls.Alloc(24) defer tls.Free(24) var ap Va_list _ = ap ap = va if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc == SQLITE_OK && (*RtreeCheck)(unsafe.Pointer(pCheck)).FnErr < RTREE_CHECK_MAX_ERROR { var z uintptr = Xsqlite3_vmprintf(tls, zFmt, ap) if z == uintptr(0) { (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc = SQLITE_NOMEM } else { (*RtreeCheck)(unsafe.Pointer(pCheck)).FzReport = Xsqlite3_mprintf(tls, ts+28122, libc.VaList(bp, (*RtreeCheck)(unsafe.Pointer(pCheck)).FzReport, func() uintptr { if (*RtreeCheck)(unsafe.Pointer(pCheck)).FzReport != 0 { return ts + 5414 } return ts + 1544 }(), z)) if (*RtreeCheck)(unsafe.Pointer(pCheck)).FzReport == uintptr(0) { (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc = SQLITE_NOMEM } } (*RtreeCheck)(unsafe.Pointer(pCheck)).FnErr++ } _ = ap } func rtreeCheckGetNode(tls *libc.TLS, pCheck uintptr, iNode I64, pnNode uintptr) uintptr { bp := tls.Alloc(24) defer tls.Free(24) var pRet uintptr = uintptr(0) if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc == SQLITE_OK && (*RtreeCheck)(unsafe.Pointer(pCheck)).FpGetNode == uintptr(0) { (*RtreeCheck)(unsafe.Pointer(pCheck)).FpGetNode = rtreeCheckPrepare(tls, pCheck, ts+28129, libc.VaList(bp, (*RtreeCheck)(unsafe.Pointer(pCheck)).FzDb, (*RtreeCheck)(unsafe.Pointer(pCheck)).FzTab)) } if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc == SQLITE_OK { Xsqlite3_bind_int64(tls, (*RtreeCheck)(unsafe.Pointer(pCheck)).FpGetNode, 1, iNode) if Xsqlite3_step(tls, (*RtreeCheck)(unsafe.Pointer(pCheck)).FpGetNode) == SQLITE_ROW { var nNode int32 = Xsqlite3_column_bytes(tls, (*RtreeCheck)(unsafe.Pointer(pCheck)).FpGetNode, 0) var pNode uintptr = Xsqlite3_column_blob(tls, (*RtreeCheck)(unsafe.Pointer(pCheck)).FpGetNode, 0) pRet = Xsqlite3_malloc64(tls, uint64(nNode)) if pRet == uintptr(0) { (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc = SQLITE_NOMEM } else { libc.Xmemcpy(tls, pRet, pNode, uint64(nNode)) *(*int32)(unsafe.Pointer(pnNode)) = nNode } } rtreeCheckReset(tls, pCheck, (*RtreeCheck)(unsafe.Pointer(pCheck)).FpGetNode) if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc == SQLITE_OK && pRet == uintptr(0) { rtreeCheckAppendMsg(tls, pCheck, ts+28174, libc.VaList(bp+16, iNode)) } } return pRet } func rtreeCheckMapping(tls *libc.TLS, pCheck uintptr, bLeaf int32, iKey I64, iVal I64) { bp := tls.Alloc(96) defer tls.Free(96) var rc int32 var pStmt uintptr *(*[2]uintptr)(unsafe.Pointer(bp + 80)) = [2]uintptr{ ts + 28206, ts + 28260, } if *(*uintptr)(unsafe.Pointer(pCheck + 40 + uintptr(bLeaf)*8)) == uintptr(0) { *(*uintptr)(unsafe.Pointer(pCheck + 40 + uintptr(bLeaf)*8)) = rtreeCheckPrepare(tls, pCheck, *(*uintptr)(unsafe.Pointer(bp + 80 + uintptr(bLeaf)*8)), libc.VaList(bp, (*RtreeCheck)(unsafe.Pointer(pCheck)).FzDb, (*RtreeCheck)(unsafe.Pointer(pCheck)).FzTab)) } if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc != SQLITE_OK { return } pStmt = *(*uintptr)(unsafe.Pointer(pCheck + 40 + uintptr(bLeaf)*8)) Xsqlite3_bind_int64(tls, pStmt, 1, iKey) rc = Xsqlite3_step(tls, pStmt) if rc == SQLITE_DONE { rtreeCheckAppendMsg(tls, pCheck, ts+28308, libc.VaList(bp+16, iKey, iVal, func() uintptr { if bLeaf != 0 { return ts + 28353 } return ts + 28361 }())) } else if rc == SQLITE_ROW { var ii I64 = Xsqlite3_column_int64(tls, pStmt, 0) if ii != iVal { rtreeCheckAppendMsg(tls, pCheck, ts+28370, libc.VaList(bp+40, iKey, ii, func() uintptr { if bLeaf != 0 { return ts + 28353 } return ts + 28361 }(), iKey, iVal)) } } rtreeCheckReset(tls, pCheck, pStmt) } func rtreeCheckCellCoord(tls *libc.TLS, pCheck uintptr, iNode I64, iCell int32, pCell uintptr, pParent uintptr) { bp := tls.Alloc(64) defer tls.Free(64) var i int32 for i = 0; i < (*RtreeCheck)(unsafe.Pointer(pCheck)).FnDim; i++ { readCoord(tls, pCell+uintptr(4*2*i), bp+48) readCoord(tls, pCell+uintptr(4*(2*i+1)), bp+52) if func() int32 { if (*RtreeCheck)(unsafe.Pointer(pCheck)).FbInt != 0 { return libc.Bool32(*(*int32)(unsafe.Pointer(bp + 48)) > *(*int32)(unsafe.Pointer(bp + 52))) } return libc.Bool32(*(*RtreeValue)(unsafe.Pointer(bp + 48)) > *(*RtreeValue)(unsafe.Pointer(bp + 52))) }() != 0 { rtreeCheckAppendMsg(tls, pCheck, ts+28428, libc.VaList(bp, i, iCell, iNode)) } if pParent != 0 { readCoord(tls, pParent+uintptr(4*2*i), bp+56) readCoord(tls, pParent+uintptr(4*(2*i+1)), bp+60) if func() int32 { if (*RtreeCheck)(unsafe.Pointer(pCheck)).FbInt != 0 { return libc.Bool32(*(*int32)(unsafe.Pointer(bp + 48)) < *(*int32)(unsafe.Pointer(bp + 56))) } return libc.Bool32(*(*RtreeValue)(unsafe.Pointer(bp + 48)) < *(*RtreeValue)(unsafe.Pointer(bp + 56))) }() != 0 || func() int32 { if (*RtreeCheck)(unsafe.Pointer(pCheck)).FbInt != 0 { return libc.Bool32(*(*int32)(unsafe.Pointer(bp + 52)) > *(*int32)(unsafe.Pointer(bp + 60))) } return libc.Bool32(*(*RtreeValue)(unsafe.Pointer(bp + 52)) > *(*RtreeValue)(unsafe.Pointer(bp + 60))) }() != 0 { rtreeCheckAppendMsg(tls, pCheck, ts+28476, libc.VaList(bp+24, i, iCell, iNode)) } } } } func rtreeCheckNode(tls *libc.TLS, pCheck uintptr, iDepth int32, aParent uintptr, iNode I64) { bp := tls.Alloc(52) defer tls.Free(52) var aNode uintptr = uintptr(0) *(*int32)(unsafe.Pointer(bp + 48)) = 0 aNode = rtreeCheckGetNode(tls, pCheck, iNode, bp+48) if aNode != 0 { if *(*int32)(unsafe.Pointer(bp + 48)) < 4 { rtreeCheckAppendMsg(tls, pCheck, ts+28543, libc.VaList(bp, iNode, *(*int32)(unsafe.Pointer(bp + 48)))) } else { var nCell int32 var i int32 if aParent == uintptr(0) { iDepth = readInt16(tls, aNode) if iDepth > RTREE_MAX_DEPTH { rtreeCheckAppendMsg(tls, pCheck, ts+28577, libc.VaList(bp+16, iDepth)) Xsqlite3_free(tls, aNode) return } } nCell = readInt16(tls, aNode+2) if 4+nCell*(8+(*RtreeCheck)(unsafe.Pointer(pCheck)).FnDim*2*4) > *(*int32)(unsafe.Pointer(bp + 48)) { rtreeCheckAppendMsg(tls, pCheck, ts+28607, libc.VaList(bp+24, iNode, nCell, *(*int32)(unsafe.Pointer(bp + 48)))) } else { for i = 0; i < nCell; i++ { var pCell uintptr = aNode + uintptr(4+i*(8+(*RtreeCheck)(unsafe.Pointer(pCheck)).FnDim*2*4)) var iVal I64 = readInt64(tls, pCell) rtreeCheckCellCoord(tls, pCheck, iNode, i, pCell+8, aParent) if iDepth > 0 { rtreeCheckMapping(tls, pCheck, 0, iVal, iNode) rtreeCheckNode(tls, pCheck, iDepth-1, pCell+8, iVal) (*RtreeCheck)(unsafe.Pointer(pCheck)).FnNonLeaf++ } else { rtreeCheckMapping(tls, pCheck, 1, iVal, iNode) (*RtreeCheck)(unsafe.Pointer(pCheck)).FnLeaf++ } } } } Xsqlite3_free(tls, aNode) } } func rtreeCheckCount(tls *libc.TLS, pCheck uintptr, zTbl uintptr, nExpect I64) { bp := tls.Alloc(48) defer tls.Free(48) if (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc == SQLITE_OK { var pCount uintptr pCount = rtreeCheckPrepare(tls, pCheck, ts+28662, libc.VaList(bp, (*RtreeCheck)(unsafe.Pointer(pCheck)).FzDb, (*RtreeCheck)(unsafe.Pointer(pCheck)).FzTab, zTbl)) if pCount != 0 { if Xsqlite3_step(tls, pCount) == SQLITE_ROW { var nActual I64 = Xsqlite3_column_int64(tls, pCount, 0) if nActual != nExpect { rtreeCheckAppendMsg(tls, pCheck, ts+28693, libc.VaList(bp+24, zTbl, nExpect, nActual)) } } (*RtreeCheck)(unsafe.Pointer(pCheck)).Frc = Xsqlite3_finalize(tls, pCount) } } } func rtreeCheckTable(tls *libc.TLS, db uintptr, zDb uintptr, zTab uintptr, pzReport uintptr) int32 { bp := tls.Alloc(120) defer tls.Free(120) var pStmt uintptr = uintptr(0) var bEnd int32 = 0 var nAux int32 = 0 libc.Xmemset(tls, bp+32, 0, uint64(unsafe.Sizeof(RtreeCheck{}))) (*RtreeCheck)(unsafe.Pointer(bp + 32)).Fdb = db (*RtreeCheck)(unsafe.Pointer(bp + 32)).FzDb = zDb (*RtreeCheck)(unsafe.Pointer(bp + 32)).FzTab = zTab if Xsqlite3_get_autocommit(tls, db) != 0 { (*RtreeCheck)(unsafe.Pointer(bp + 32)).Frc = Xsqlite3_exec(tls, db, ts+15860, uintptr(0), uintptr(0), uintptr(0)) bEnd = 1 } if (*RtreeCheck)(unsafe.Pointer(bp+32)).Frc == SQLITE_OK { pStmt = rtreeCheckPrepare(tls, bp+32, ts+28760, libc.VaList(bp, zDb, zTab)) if pStmt != 0 { nAux = Xsqlite3_column_count(tls, pStmt) - 2 Xsqlite3_finalize(tls, pStmt) } else if (*RtreeCheck)(unsafe.Pointer(bp+32)).Frc != SQLITE_NOMEM { (*RtreeCheck)(unsafe.Pointer(bp + 32)).Frc = SQLITE_OK } } pStmt = rtreeCheckPrepare(tls, bp+32, ts+26580, libc.VaList(bp+16, zDb, zTab)) if pStmt != 0 { var rc int32 (*RtreeCheck)(unsafe.Pointer(bp + 32)).FnDim = (Xsqlite3_column_count(tls, pStmt) - 1 - nAux) / 2 if (*RtreeCheck)(unsafe.Pointer(bp+32)).FnDim < 1 { rtreeCheckAppendMsg(tls, bp+32, ts+28788, 0) } else if SQLITE_ROW == Xsqlite3_step(tls, pStmt) { (*RtreeCheck)(unsafe.Pointer(bp + 32)).FbInt = libc.Bool32(Xsqlite3_column_type(tls, pStmt, 1) == SQLITE_INTEGER) } rc = Xsqlite3_finalize(tls, pStmt) if rc != SQLITE_CORRUPT { (*RtreeCheck)(unsafe.Pointer(bp + 32)).Frc = rc } } if (*RtreeCheck)(unsafe.Pointer(bp+32)).FnDim >= 1 { if (*RtreeCheck)(unsafe.Pointer(bp+32)).Frc == SQLITE_OK { rtreeCheckNode(tls, bp+32, 0, uintptr(0), int64(1)) } rtreeCheckCount(tls, bp+32, ts+28819, int64((*RtreeCheck)(unsafe.Pointer(bp+32)).FnLeaf)) rtreeCheckCount(tls, bp+32, ts+28826, int64((*RtreeCheck)(unsafe.Pointer(bp+32)).FnNonLeaf)) } Xsqlite3_finalize(tls, (*RtreeCheck)(unsafe.Pointer(bp+32)).FpGetNode) Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 40))) Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 40 + 1*8))) if bEnd != 0 { var rc int32 = Xsqlite3_exec(tls, db, ts+28834, uintptr(0), uintptr(0), uintptr(0)) if (*RtreeCheck)(unsafe.Pointer(bp+32)).Frc == SQLITE_OK { (*RtreeCheck)(unsafe.Pointer(bp + 32)).Frc = rc } } *(*uintptr)(unsafe.Pointer(pzReport)) = (*RtreeCheck)(unsafe.Pointer(bp + 32)).FzReport return (*RtreeCheck)(unsafe.Pointer(bp + 32)).Frc } func rtreecheck(tls *libc.TLS, ctx uintptr, nArg int32, apArg uintptr) { bp := tls.Alloc(8) defer tls.Free(8) if nArg != 1 && nArg != 2 { Xsqlite3_result_error(tls, ctx, ts+28838, -1) } else { var rc int32 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var zDb uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apArg))) var zTab uintptr if nArg == 1 { zTab = zDb zDb = ts + 7793 } else { zTab = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apArg + 1*8))) } rc = rtreeCheckTable(tls, Xsqlite3_context_db_handle(tls, ctx), zDb, zTab, bp) if rc == SQLITE_OK { Xsqlite3_result_text(tls, ctx, func() uintptr { if *(*uintptr)(unsafe.Pointer(bp)) != 0 { return *(*uintptr)(unsafe.Pointer(bp)) } return ts + 19428 }(), -1, libc.UintptrFromInt32(-1)) } else { Xsqlite3_result_error_code(tls, ctx, rc) } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) } } // Datatype for coordinates type GeoCoord = float32 // Internal representation of a polygon. // // The polygon consists of a sequence of vertexes. There is a line // segment between each pair of vertexes, and one final segment from // the last vertex back to the first. (This differs from the GeoJSON // standard in which the final vertex is a repeat of the first.) // // The polygon follows the right-hand rule. The area to the right of // each segment is "outside" and the area to the left is "inside". // // The on-disk representation consists of a 4-byte header followed by // the values. The 4-byte header is: // // encoding (1 byte) 0=big-endian, 1=little-endian // nvertex (3 bytes) Number of vertexes as a big-endian integer // // Enough space is allocated for 4 coordinates, to work around over-zealous // warnings coming from some compiler (notably, clang). In reality, the size // of each GeoPoly memory allocate is adjusted as necessary so that the // GeoPoly.a[] array at the end is the appropriate size. type GeoPoly1 = struct { FnVertex int32 Fhdr [4]uint8 Fa [8]GeoCoord } // Internal representation of a polygon. // // The polygon consists of a sequence of vertexes. There is a line // segment between each pair of vertexes, and one final segment from // the last vertex back to the first. (This differs from the GeoJSON // standard in which the final vertex is a repeat of the first.) // // The polygon follows the right-hand rule. The area to the right of // each segment is "outside" and the area to the left is "inside". // // The on-disk representation consists of a 4-byte header followed by // the values. The 4-byte header is: // // encoding (1 byte) 0=big-endian, 1=little-endian // nvertex (3 bytes) Number of vertexes as a big-endian integer // // Enough space is allocated for 4 coordinates, to work around over-zealous // warnings coming from some compiler (notably, clang). In reality, the size // of each GeoPoly memory allocate is adjusted as necessary so that the // GeoPoly.a[] array at the end is the appropriate size. type GeoPoly = GeoPoly1 // State of a parse of a GeoJSON input. type GeoParse1 = struct { Fz uintptr FnVertex int32 FnAlloc int32 FnErr int32 F__ccgo_pad1 [4]byte Fa uintptr } // State of a parse of a GeoJSON input. type GeoParse = GeoParse1 func geopolySwab32(tls *libc.TLS, a uintptr) { var t uint8 = *(*uint8)(unsafe.Pointer(a)) *(*uint8)(unsafe.Pointer(a)) = *(*uint8)(unsafe.Pointer(a + 3)) *(*uint8)(unsafe.Pointer(a + 3)) = t t = *(*uint8)(unsafe.Pointer(a + 1)) *(*uint8)(unsafe.Pointer(a + 1)) = *(*uint8)(unsafe.Pointer(a + 2)) *(*uint8)(unsafe.Pointer(a + 2)) = t } func geopolySkipSpace(tls *libc.TLS, p uintptr) int8 { for jsonIsSpace[*(*uint8)(unsafe.Pointer((*GeoParse)(unsafe.Pointer(p)).Fz))] != 0 { (*GeoParse)(unsafe.Pointer(p)).Fz++ } return int8(*(*uint8)(unsafe.Pointer((*GeoParse)(unsafe.Pointer(p)).Fz))) } func geopolyParseNumber(tls *libc.TLS, p uintptr, pVal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var c int8 = geopolySkipSpace(tls, p) var z uintptr = (*GeoParse)(unsafe.Pointer(p)).Fz var j int32 = 0 var seenDP int32 = 0 var seenE int32 = 0 if int32(c) == '-' { j = 1 c = int8(*(*uint8)(unsafe.Pointer(z + uintptr(j)))) } if int32(c) == '0' && int32(*(*uint8)(unsafe.Pointer(z + uintptr(j+1)))) >= '0' && int32(*(*uint8)(unsafe.Pointer(z + uintptr(j+1)))) <= '9' { return 0 } for ; ; j++ { c = int8(*(*uint8)(unsafe.Pointer(z + uintptr(j)))) if int32(Xsqlite3CtypeMap[uint8(c)])&0x04 != 0 { continue } if int32(c) == '.' { if int32(*(*uint8)(unsafe.Pointer(z + uintptr(j-1)))) == '-' { return 0 } if seenDP != 0 { return 0 } seenDP = 1 continue } if int32(c) == 'e' || int32(c) == 'E' { if int32(*(*uint8)(unsafe.Pointer(z + uintptr(j-1)))) < '0' { return 0 } if seenE != 0 { return -1 } seenDP = libc.AssignInt32(&seenE, 1) c = int8(*(*uint8)(unsafe.Pointer(z + uintptr(j+1)))) if int32(c) == '+' || int32(c) == '-' { j++ c = int8(*(*uint8)(unsafe.Pointer(z + uintptr(j+1)))) } if int32(c) < '0' || int32(c) > '9' { return 0 } continue } break } if int32(*(*uint8)(unsafe.Pointer(z + uintptr(j-1)))) < '0' { return 0 } if pVal != 0 { Xsqlite3AtoF(tls, (*GeoParse)(unsafe.Pointer(p)).Fz, bp, j, uint8(SQLITE_UTF8)) *(*GeoCoord)(unsafe.Pointer(pVal)) = GeoCoord(*(*float64)(unsafe.Pointer(bp))) } *(*uintptr)(unsafe.Pointer(p)) += uintptr(j) return 1 } func geopolyParseJson(tls *libc.TLS, z uintptr, pRc uintptr) uintptr { bp := tls.Alloc(36) defer tls.Free(36) var rc int32 var aNew uintptr var ii int32 var c int8 var pOut uintptr rc = SQLITE_OK libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(GeoParse{}))) (*GeoParse)(unsafe.Pointer(bp)).Fz = z if !(int32(geopolySkipSpace(tls, bp)) == '[') { goto __1 } (*GeoParse)(unsafe.Pointer(bp)).Fz++ __2: if !(int32(geopolySkipSpace(tls, bp)) == '[') { goto __3 } ii = 0 (*GeoParse)(unsafe.Pointer(bp)).Fz++ if !((*GeoParse)(unsafe.Pointer(bp)).FnVertex >= (*GeoParse)(unsafe.Pointer(bp)).FnAlloc) { goto __4 } (*GeoParse)(unsafe.Pointer(bp)).FnAlloc = (*GeoParse)(unsafe.Pointer(bp)).FnAlloc*2 + 16 aNew = Xsqlite3_realloc64(tls, (*GeoParse)(unsafe.Pointer(bp)).Fa, uint64((*GeoParse)(unsafe.Pointer(bp)).FnAlloc)*uint64(unsafe.Sizeof(GeoCoord(0)))*uint64(2)) if !(aNew == uintptr(0)) { goto __5 } rc = SQLITE_NOMEM (*GeoParse)(unsafe.Pointer(bp)).FnErr++ goto __3 __5: ; (*GeoParse)(unsafe.Pointer(bp)).Fa = aNew __4: ; __6: if !(geopolyParseNumber(tls, bp, func() uintptr { if ii <= 1 { return (*GeoParse)(unsafe.Pointer(bp)).Fa + uintptr((*GeoParse)(unsafe.Pointer(bp)).FnVertex*2+ii)*4 } return uintptr(0) }()) != 0) { goto __7 } ii++ if !(ii == 2) { goto __8 } (*GeoParse)(unsafe.Pointer(bp)).FnVertex++ __8: ; c = geopolySkipSpace(tls, bp) (*GeoParse)(unsafe.Pointer(bp)).Fz++ if !(int32(c) == ',') { goto __9 } goto __6 __9: ; if !(int32(c) == ']' && ii >= 2) { goto __10 } goto __7 __10: ; (*GeoParse)(unsafe.Pointer(bp)).FnErr++ rc = SQLITE_ERROR goto parse_json_err goto __6 __7: ; if !(int32(geopolySkipSpace(tls, bp)) == ',') { goto __11 } (*GeoParse)(unsafe.Pointer(bp)).Fz++ goto __2 __11: ; goto __3 goto __2 __3: ; if !(int32(geopolySkipSpace(tls, bp)) == ']' && (*GeoParse)(unsafe.Pointer(bp)).FnVertex >= 4 && *(*GeoCoord)(unsafe.Pointer((*GeoParse)(unsafe.Pointer(bp)).Fa)) == *(*GeoCoord)(unsafe.Pointer((*GeoParse)(unsafe.Pointer(bp)).Fa + uintptr((*GeoParse)(unsafe.Pointer(bp)).FnVertex*2-2)*4)) && *(*GeoCoord)(unsafe.Pointer((*GeoParse)(unsafe.Pointer(bp)).Fa + 1*4)) == *(*GeoCoord)(unsafe.Pointer((*GeoParse)(unsafe.Pointer(bp)).Fa + uintptr((*GeoParse)(unsafe.Pointer(bp)).FnVertex*2-1)*4)) && func() bool { (*GeoParse)(unsafe.Pointer(bp)).Fz++; return int32(geopolySkipSpace(tls, bp)) == 0 }()) { goto __12 } *(*int32)(unsafe.Pointer(bp + 32)) = 1 (*GeoParse)(unsafe.Pointer(bp)).FnVertex-- pOut = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(GeoPoly{}))+uint64(unsafe.Sizeof(GeoCoord(0)))*uint64(2)*uint64(Sqlite3_int64((*GeoParse)(unsafe.Pointer(bp)).FnVertex)-int64(4))) *(*int32)(unsafe.Pointer(bp + 32)) = 1 if !(pOut == uintptr(0)) { goto __14 } goto parse_json_err __14: ; (*GeoPoly)(unsafe.Pointer(pOut)).FnVertex = (*GeoParse)(unsafe.Pointer(bp)).FnVertex libc.Xmemcpy(tls, pOut+8, (*GeoParse)(unsafe.Pointer(bp)).Fa, uint64((*GeoParse)(unsafe.Pointer(bp)).FnVertex*2)*uint64(unsafe.Sizeof(GeoCoord(0)))) *(*uint8)(unsafe.Pointer(pOut + 4)) = *(*uint8)(unsafe.Pointer(bp + 32)) *(*uint8)(unsafe.Pointer(pOut + 4 + 1)) = uint8((*GeoParse)(unsafe.Pointer(bp)).FnVertex >> 16 & 0xff) *(*uint8)(unsafe.Pointer(pOut + 4 + 2)) = uint8((*GeoParse)(unsafe.Pointer(bp)).FnVertex >> 8 & 0xff) *(*uint8)(unsafe.Pointer(pOut + 4 + 3)) = uint8((*GeoParse)(unsafe.Pointer(bp)).FnVertex & 0xff) Xsqlite3_free(tls, (*GeoParse)(unsafe.Pointer(bp)).Fa) if !(pRc != 0) { goto __15 } *(*int32)(unsafe.Pointer(pRc)) = SQLITE_OK __15: ; return pOut goto __13 __12: (*GeoParse)(unsafe.Pointer(bp)).FnErr++ rc = SQLITE_ERROR __13: ; __1: ; parse_json_err: if !(pRc != 0) { goto __16 } *(*int32)(unsafe.Pointer(pRc)) = rc __16: ; Xsqlite3_free(tls, (*GeoParse)(unsafe.Pointer(bp)).Fa) return uintptr(0) } func geopolyFuncParam(tls *libc.TLS, pCtx uintptr, pVal uintptr, pRc uintptr) uintptr { bp := tls.Alloc(4) defer tls.Free(4) var p uintptr = uintptr(0) var nByte int32 if Xsqlite3_value_type(tls, pVal) == SQLITE_BLOB && libc.AssignInt32(&nByte, Xsqlite3_value_bytes(tls, pVal)) >= int32(uint64(4)+uint64(6)*uint64(unsafe.Sizeof(GeoCoord(0)))) { var a uintptr = Xsqlite3_value_blob(tls, pVal) var nVertex int32 if a == uintptr(0) { if pCtx != 0 { Xsqlite3_result_error_nomem(tls, pCtx) } return uintptr(0) } nVertex = int32(*(*uint8)(unsafe.Pointer(a + 1)))<<16 + int32(*(*uint8)(unsafe.Pointer(a + 2)))<<8 + int32(*(*uint8)(unsafe.Pointer(a + 3))) if (int32(*(*uint8)(unsafe.Pointer(a))) == 0 || int32(*(*uint8)(unsafe.Pointer(a))) == 1) && uint64(nVertex*2)*uint64(unsafe.Sizeof(GeoCoord(0)))+uint64(4) == uint64(uint32(nByte)) { p = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(GeoPoly{}))+uint64((nVertex-1)*2)*uint64(unsafe.Sizeof(GeoCoord(0)))) if p == uintptr(0) { if pRc != 0 { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } if pCtx != 0 { Xsqlite3_result_error_nomem(tls, pCtx) } } else { *(*int32)(unsafe.Pointer(bp)) = 1 (*GeoPoly)(unsafe.Pointer(p)).FnVertex = nVertex libc.Xmemcpy(tls, p+4, a, uint64(nByte)) if int32(*(*uint8)(unsafe.Pointer(a))) != int32(*(*uint8)(unsafe.Pointer(bp))) { var ii int32 for ii = 0; ii < nVertex; ii++ { geopolySwab32(tls, p+8+uintptr(ii*2)*4) geopolySwab32(tls, p+8+uintptr(ii*2+1)*4) } *(*uint8)(unsafe.Pointer(p + 4)) ^= uint8(1) } } } if pRc != 0 { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_OK } return p } else if Xsqlite3_value_type(tls, pVal) == SQLITE_TEXT { var zJson uintptr = Xsqlite3_value_text(tls, pVal) if zJson == uintptr(0) { if pRc != 0 { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } return uintptr(0) } return geopolyParseJson(tls, zJson, pRc) } else { if pRc != 0 { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_ERROR } return uintptr(0) } return uintptr(0) } func geopolyBlobFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) _ = argc if p != 0 { Xsqlite3_result_blob(tls, context, p+4, 4+8*(*GeoPoly)(unsafe.Pointer(p)).FnVertex, libc.UintptrFromInt32(-1)) Xsqlite3_free(tls, p) } } func geopolyJsonFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(32) defer tls.Free(32) var p uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) _ = argc if p != 0 { var db uintptr = Xsqlite3_context_db_handle(tls, context) var x uintptr = Xsqlite3_str_new(tls, db) var i int32 Xsqlite3_str_append(tls, x, ts+28889, 1) for i = 0; i < (*GeoPoly)(unsafe.Pointer(p)).FnVertex; i++ { Xsqlite3_str_appendf(tls, x, ts+28891, libc.VaList(bp, float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(i*2)*4))), float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(i*2+1)*4))))) } Xsqlite3_str_appendf(tls, x, ts+28902, libc.VaList(bp+16, float64(*(*GeoCoord)(unsafe.Pointer(p + 8))), float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + 1*4))))) Xsqlite3_result_text(tls, context, Xsqlite3_str_finish(tls, x), -1, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) Xsqlite3_free(tls, p) } } func geopolySvgFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(48) defer tls.Free(48) var p uintptr if argc < 1 { return } p = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) if p != 0 { var db uintptr = Xsqlite3_context_db_handle(tls, context) var x uintptr = Xsqlite3_str_new(tls, db) var i int32 var cSep int8 = int8('\'') Xsqlite3_str_appendf(tls, x, ts+28913, 0) for i = 0; i < (*GeoPoly)(unsafe.Pointer(p)).FnVertex; i++ { Xsqlite3_str_appendf(tls, x, ts+28931, libc.VaList(bp, int32(cSep), float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(i*2)*4))), float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(i*2+1)*4))))) cSep = int8(' ') } Xsqlite3_str_appendf(tls, x, ts+28939, libc.VaList(bp+24, float64(*(*GeoCoord)(unsafe.Pointer(p + 8))), float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + 1*4))))) for i = 1; i < argc; i++ { var z uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv + uintptr(i)*8))) if z != 0 && *(*int8)(unsafe.Pointer(z)) != 0 { Xsqlite3_str_appendf(tls, x, ts+28947, libc.VaList(bp+40, z)) } } Xsqlite3_str_appendf(tls, x, ts+28951, 0) Xsqlite3_result_text(tls, context, Xsqlite3_str_finish(tls, x), -1, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) Xsqlite3_free(tls, p) } } func geopolyXformFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) var A float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) var B float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) var C float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8))) var D float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 4*8))) var E float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 5*8))) var F float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 6*8))) var x1 GeoCoord var y1 GeoCoord var x0 GeoCoord var y0 GeoCoord var ii int32 _ = argc if p != 0 { for ii = 0; ii < (*GeoPoly)(unsafe.Pointer(p)).FnVertex; ii++ { x0 = *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2)*4)) y0 = *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2+1)*4)) x1 = GeoCoord(A*float64(x0) + B*float64(y0) + E) y1 = GeoCoord(C*float64(x0) + D*float64(y0) + F) *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2)*4)) = x1 *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2+1)*4)) = y1 } Xsqlite3_result_blob(tls, context, p+4, 4+8*(*GeoPoly)(unsafe.Pointer(p)).FnVertex, libc.UintptrFromInt32(-1)) Xsqlite3_free(tls, p) } } func geopolyArea(tls *libc.TLS, p uintptr) float64 { var rArea float64 = 0.0 var ii int32 for ii = 0; ii < (*GeoPoly)(unsafe.Pointer(p)).FnVertex-1; ii++ { rArea = rArea + float64((*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2)*4))-*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr((ii+1)*2)*4)))* (*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2+1)*4))+*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr((ii+1)*2+1)*4))))* 0.5 } rArea = rArea + float64((*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2)*4))-*(*GeoCoord)(unsafe.Pointer(p + 8)))* (*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2+1)*4))+*(*GeoCoord)(unsafe.Pointer(p + 8 + 1*4))))* 0.5 return rArea } func geopolyAreaFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) _ = argc if p != 0 { Xsqlite3_result_double(tls, context, geopolyArea(tls, p)) Xsqlite3_free(tls, p) } } func geopolyCcwFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) _ = argc if p != 0 { if geopolyArea(tls, p) < 0.0 { var ii int32 var jj int32 ii = 1 jj = (*GeoPoly)(unsafe.Pointer(p)).FnVertex - 1 __1: if !(ii < jj) { goto __3 } { var t GeoCoord = *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2)*4)) *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2)*4)) = *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(jj*2)*4)) *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(jj*2)*4)) = t t = *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2+1)*4)) *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(ii*2+1)*4)) = *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(jj*2+1)*4)) *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(jj*2+1)*4)) = t } goto __2 __2: ii++ jj-- goto __1 goto __3 __3: } Xsqlite3_result_blob(tls, context, p+4, 4+8*(*GeoPoly)(unsafe.Pointer(p)).FnVertex, libc.UintptrFromInt32(-1)) Xsqlite3_free(tls, p) } } func geopolySine(tls *libc.TLS, r float64) float64 { if r >= float64(1.5)*3.1415926535897932385 { r = r - float64(2.0)*3.1415926535897932385 } if r >= float64(0.5)*3.1415926535897932385 { return -geopolySine(tls, r-3.1415926535897932385) } else { var r2 float64 = r * r var r3 float64 = r2 * r var r5 float64 = r3 * r2 return 0.9996949*r - 0.1656700*r3 + 0.0075134*r5 } return float64(0) } func geopolyRegularFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(4) defer tls.Free(4) var x float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv))) var y float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) var r float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) var n int32 = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 3*8))) var p uintptr _ = argc if n < 3 || r <= 0.0 { return } if n > 1000 { n = 1000 } p = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(GeoPoly{}))+uint64((n-1)*2)*uint64(unsafe.Sizeof(GeoCoord(0)))) if p == uintptr(0) { Xsqlite3_result_error_nomem(tls, context) return } *(*int32)(unsafe.Pointer(bp)) = 1 *(*uint8)(unsafe.Pointer(p + 4)) = *(*uint8)(unsafe.Pointer(bp)) *(*uint8)(unsafe.Pointer(p + 4 + 1)) = uint8(0) *(*uint8)(unsafe.Pointer(p + 4 + 2)) = uint8(n >> 8 & 0xff) *(*uint8)(unsafe.Pointer(p + 4 + 3)) = uint8(n & 0xff) for *(*int32)(unsafe.Pointer(bp)) = 0; *(*int32)(unsafe.Pointer(bp)) < n; *(*int32)(unsafe.Pointer(bp))++ { var rAngle float64 = float64(2.0) * 3.1415926535897932385 * float64(*(*int32)(unsafe.Pointer(bp))) / float64(n) *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(*(*int32)(unsafe.Pointer(bp))*2)*4)) = GeoCoord(x - r*geopolySine(tls, rAngle-float64(0.5)*3.1415926535897932385)) *(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(*(*int32)(unsafe.Pointer(bp))*2+1)*4)) = GeoCoord(y + r*geopolySine(tls, rAngle)) } Xsqlite3_result_blob(tls, context, p+4, 4+8*n, libc.UintptrFromInt32(-1)) Xsqlite3_free(tls, p) } func geopolyBBox(tls *libc.TLS, context uintptr, pPoly uintptr, aCoord uintptr, pRc uintptr) uintptr { bp := tls.Alloc(4) defer tls.Free(4) var pOut uintptr var p uintptr var mnX float32 var mxX float32 var mnY float32 var mxY float32 var r float64 pOut = uintptr(0) if !(pPoly == uintptr(0) && aCoord != uintptr(0)) { goto __1 } p = uintptr(0) mnX = *(*RtreeValue)(unsafe.Pointer(aCoord)) mxX = *(*RtreeValue)(unsafe.Pointer(aCoord + 1*4)) mnY = *(*RtreeValue)(unsafe.Pointer(aCoord + 2*4)) mxY = *(*RtreeValue)(unsafe.Pointer(aCoord + 3*4)) goto geopolyBboxFill goto __2 __1: p = geopolyFuncParam(tls, context, pPoly, pRc) __2: ; if !(p != 0) { goto __3 } mnX = libc.AssignFloat32(&mxX, *(*GeoCoord)(unsafe.Pointer(p + 8))) mnY = libc.AssignFloat32(&mxY, *(*GeoCoord)(unsafe.Pointer(p + 8 + 1*4))) *(*int32)(unsafe.Pointer(bp)) = 1 __5: if !(*(*int32)(unsafe.Pointer(bp)) < (*GeoPoly)(unsafe.Pointer(p)).FnVertex) { goto __7 } r = float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(*(*int32)(unsafe.Pointer(bp))*2)*4))) if !(r < float64(mnX)) { goto __8 } mnX = float32(r) goto __9 __8: if !(r > float64(mxX)) { goto __10 } mxX = float32(r) __10: ; __9: ; r = float64(*(*GeoCoord)(unsafe.Pointer(p + 8 + uintptr(*(*int32)(unsafe.Pointer(bp))*2+1)*4))) if !(r < float64(mnY)) { goto __11 } mnY = float32(r) goto __12 __11: if !(r > float64(mxY)) { goto __13 } mxY = float32(r) __13: ; __12: ; goto __6 __6: *(*int32)(unsafe.Pointer(bp))++ goto __5 goto __7 __7: ; if !(pRc != 0) { goto __14 } *(*int32)(unsafe.Pointer(pRc)) = SQLITE_OK __14: ; if !(aCoord == uintptr(0)) { goto __15 } geopolyBboxFill: pOut = Xsqlite3_realloc64(tls, p, uint64(unsafe.Sizeof(GeoPoly{}))+uint64(unsafe.Sizeof(GeoCoord(0)))*uint64(2)*uint64(4-4)) if !(pOut == uintptr(0)) { goto __17 } Xsqlite3_free(tls, p) if !(context != 0) { goto __18 } Xsqlite3_result_error_nomem(tls, context) __18: ; if !(pRc != 0) { goto __19 } *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM __19: ; return uintptr(0) __17: ; (*GeoPoly)(unsafe.Pointer(pOut)).FnVertex = 4 *(*int32)(unsafe.Pointer(bp)) = 1 *(*uint8)(unsafe.Pointer(pOut + 4)) = *(*uint8)(unsafe.Pointer(bp)) *(*uint8)(unsafe.Pointer(pOut + 4 + 1)) = uint8(0) *(*uint8)(unsafe.Pointer(pOut + 4 + 2)) = uint8(0) *(*uint8)(unsafe.Pointer(pOut + 4 + 3)) = uint8(4) *(*GeoCoord)(unsafe.Pointer(pOut + 8)) = mnX *(*GeoCoord)(unsafe.Pointer(pOut + 8 + 1*4)) = mnY *(*GeoCoord)(unsafe.Pointer(pOut + 8 + 2*4)) = mxX *(*GeoCoord)(unsafe.Pointer(pOut + 8 + 3*4)) = mnY *(*GeoCoord)(unsafe.Pointer(pOut + 8 + 4*4)) = mxX *(*GeoCoord)(unsafe.Pointer(pOut + 8 + 5*4)) = mxY *(*GeoCoord)(unsafe.Pointer(pOut + 8 + 6*4)) = mnX *(*GeoCoord)(unsafe.Pointer(pOut + 8 + 7*4)) = mxY goto __16 __15: Xsqlite3_free(tls, p) *(*RtreeValue)(unsafe.Pointer(aCoord)) = mnX *(*RtreeValue)(unsafe.Pointer(aCoord + 1*4)) = mxX *(*RtreeValue)(unsafe.Pointer(aCoord + 2*4)) = mnY *(*RtreeValue)(unsafe.Pointer(aCoord + 3*4)) = mxY __16: ; goto __4 __3: if !(aCoord != 0) { goto __20 } libc.Xmemset(tls, aCoord, 0, uint64(unsafe.Sizeof(RtreeCoord{}))*uint64(4)) __20: ; __4: ; return pOut } func geopolyBBoxFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p uintptr = geopolyBBox(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0), uintptr(0)) _ = argc if p != 0 { Xsqlite3_result_blob(tls, context, p+4, 4+8*(*GeoPoly)(unsafe.Pointer(p)).FnVertex, libc.UintptrFromInt32(-1)) Xsqlite3_free(tls, p) } } // State vector for the geopoly_group_bbox() aggregate function. type GeoBBox1 = struct { FisInit int32 Fa [4]RtreeCoord } // State vector for the geopoly_group_bbox() aggregate function. type GeoBBox = GeoBBox1 func geopolyBBoxStep(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(20) defer tls.Free(20) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK _ = argc geopolyBBox(tls, context, *(*uintptr)(unsafe.Pointer(argv)), bp, bp+16) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { var pBBox uintptr pBBox = Xsqlite3_aggregate_context(tls, context, int32(unsafe.Sizeof(GeoBBox{}))) if pBBox == uintptr(0) { return } if (*GeoBBox)(unsafe.Pointer(pBBox)).FisInit == 0 { (*GeoBBox)(unsafe.Pointer(pBBox)).FisInit = 1 libc.Xmemcpy(tls, pBBox+4, bp, uint64(unsafe.Sizeof(RtreeCoord{}))*uint64(4)) } else { if *(*RtreeValue)(unsafe.Pointer(bp)) < *(*RtreeValue)(unsafe.Pointer(pBBox + 4)) { *(*RtreeCoord)(unsafe.Pointer(pBBox + 4)) = *(*RtreeCoord)(unsafe.Pointer(bp)) } if *(*RtreeValue)(unsafe.Pointer(bp + 1*4)) > *(*RtreeValue)(unsafe.Pointer(pBBox + 4 + 1*4)) { *(*RtreeCoord)(unsafe.Pointer(pBBox + 4 + 1*4)) = *(*RtreeCoord)(unsafe.Pointer(bp + 1*4)) } if *(*RtreeValue)(unsafe.Pointer(bp + 2*4)) < *(*RtreeValue)(unsafe.Pointer(pBBox + 4 + 2*4)) { *(*RtreeCoord)(unsafe.Pointer(pBBox + 4 + 2*4)) = *(*RtreeCoord)(unsafe.Pointer(bp + 2*4)) } if *(*RtreeValue)(unsafe.Pointer(bp + 3*4)) > *(*RtreeValue)(unsafe.Pointer(pBBox + 4 + 3*4)) { *(*RtreeCoord)(unsafe.Pointer(pBBox + 4 + 3*4)) = *(*RtreeCoord)(unsafe.Pointer(bp + 3*4)) } } } } func geopolyBBoxFinal(tls *libc.TLS, context uintptr) { var p uintptr var pBBox uintptr pBBox = Xsqlite3_aggregate_context(tls, context, 0) if pBBox == uintptr(0) { return } p = geopolyBBox(tls, context, uintptr(0), pBBox+4, uintptr(0)) if p != 0 { Xsqlite3_result_blob(tls, context, p+4, 4+8*(*GeoPoly)(unsafe.Pointer(p)).FnVertex, libc.UintptrFromInt32(-1)) Xsqlite3_free(tls, p) } } func pointBeneathLine(tls *libc.TLS, x0 float64, y0 float64, x1 float64, y1 float64, x2 float64, y2 float64) int32 { var y float64 if x0 == x1 && y0 == y1 { return 2 } if x1 < x2 { if x0 <= x1 || x0 > x2 { return 0 } } else if x1 > x2 { if x0 <= x2 || x0 > x1 { return 0 } } else { if x0 != x1 { return 0 } if y0 < y1 && y0 < y2 { return 0 } if y0 > y1 && y0 > y2 { return 0 } return 2 } y = y1 + (y2-y1)*(x0-x1)/(x2-x1) if y0 == y { return 2 } if y0 < y { return 1 } return 0 } func geopolyContainsPointFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p1 uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) var x0 float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) var y0 float64 = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8))) var v int32 = 0 var cnt int32 = 0 var ii int32 _ = argc if p1 == uintptr(0) { return } for ii = 0; ii < (*GeoPoly)(unsafe.Pointer(p1)).FnVertex-1; ii++ { v = pointBeneathLine(tls, x0, y0, float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8 + uintptr(ii*2)*4))), float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8 + uintptr(ii*2+1)*4))), float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8 + uintptr((ii+1)*2)*4))), float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8 + uintptr((ii+1)*2+1)*4)))) if v == 2 { break } cnt = cnt + v } if v != 2 { v = pointBeneathLine(tls, x0, y0, float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8 + uintptr(ii*2)*4))), float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8 + uintptr(ii*2+1)*4))), float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8))), float64(*(*GeoCoord)(unsafe.Pointer(p1 + 8 + 1*4)))) } if v == 2 { Xsqlite3_result_int(tls, context, 1) } else if (v+cnt)&1 == 0 { Xsqlite3_result_int(tls, context, 0) } else { Xsqlite3_result_int(tls, context, 2) } Xsqlite3_free(tls, p1) } func geopolyWithinFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p1 uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) var p2 uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv + 1*8)), uintptr(0)) _ = argc if p1 != 0 && p2 != 0 { var x int32 = geopolyOverlap(tls, p1, p2) if x < 0 { Xsqlite3_result_error_nomem(tls, context) } else { Xsqlite3_result_int(tls, context, func() int32 { if x == 2 { return 1 } return func() int32 { if x == 4 { return 2 } return 0 }() }()) } } Xsqlite3_free(tls, p1) Xsqlite3_free(tls, p2) } // Objects used by the overlap algorihm. type GeoEvent1 = struct { Fx float64 FeType int32 F__ccgo_pad1 [4]byte FpSeg uintptr FpNext uintptr } // Objects used by the overlap algorihm. type GeoEvent = GeoEvent1 type GeoSegment1 = struct { FC float64 FB float64 Fy float64 Fy0 float32 Fside uint8 F__ccgo_pad1 [3]byte Fidx uint32 F__ccgo_pad2 [4]byte FpNext uintptr } type GeoSegment = GeoSegment1 type GeoOverlap1 = struct { FaEvent uintptr FaSegment uintptr FnEvent int32 FnSegment int32 } type GeoOverlap = GeoOverlap1 func geopolyAddOneSegment(tls *libc.TLS, p uintptr, x0 GeoCoord, y0 GeoCoord, x1 GeoCoord, y1 GeoCoord, side uint8, idx uint32) { var pSeg uintptr var pEvent uintptr if x0 == x1 { return } if x0 > x1 { var t GeoCoord = x0 x0 = x1 x1 = t t = y0 y0 = y1 y1 = t } pSeg = (*GeoOverlap)(unsafe.Pointer(p)).FaSegment + uintptr((*GeoOverlap)(unsafe.Pointer(p)).FnSegment)*48 (*GeoOverlap)(unsafe.Pointer(p)).FnSegment++ (*GeoSegment)(unsafe.Pointer(pSeg)).FC = float64((y1 - y0) / (x1 - x0)) (*GeoSegment)(unsafe.Pointer(pSeg)).FB = float64(y1) - float64(x1)*(*GeoSegment)(unsafe.Pointer(pSeg)).FC (*GeoSegment)(unsafe.Pointer(pSeg)).Fy0 = y0 (*GeoSegment)(unsafe.Pointer(pSeg)).Fside = side (*GeoSegment)(unsafe.Pointer(pSeg)).Fidx = idx pEvent = (*GeoOverlap)(unsafe.Pointer(p)).FaEvent + uintptr((*GeoOverlap)(unsafe.Pointer(p)).FnEvent)*32 (*GeoOverlap)(unsafe.Pointer(p)).FnEvent++ (*GeoEvent)(unsafe.Pointer(pEvent)).Fx = float64(x0) (*GeoEvent)(unsafe.Pointer(pEvent)).FeType = 0 (*GeoEvent)(unsafe.Pointer(pEvent)).FpSeg = pSeg pEvent = (*GeoOverlap)(unsafe.Pointer(p)).FaEvent + uintptr((*GeoOverlap)(unsafe.Pointer(p)).FnEvent)*32 (*GeoOverlap)(unsafe.Pointer(p)).FnEvent++ (*GeoEvent)(unsafe.Pointer(pEvent)).Fx = float64(x1) (*GeoEvent)(unsafe.Pointer(pEvent)).FeType = 1 (*GeoEvent)(unsafe.Pointer(pEvent)).FpSeg = pSeg } func geopolyAddSegments(tls *libc.TLS, p uintptr, pPoly uintptr, side uint8) { var i uint32 var x uintptr for i = uint32(0); i < uint32((*GeoPoly)(unsafe.Pointer(pPoly)).FnVertex)-uint32(1); i++ { x = pPoly + 8 + uintptr(i*uint32(2))*4 geopolyAddOneSegment(tls, p, *(*GeoCoord)(unsafe.Pointer(x)), *(*GeoCoord)(unsafe.Pointer(x + 1*4)), *(*GeoCoord)(unsafe.Pointer(x + 2*4)), *(*GeoCoord)(unsafe.Pointer(x + 3*4)), side, i) } x = pPoly + 8 + uintptr(i*uint32(2))*4 geopolyAddOneSegment(tls, p, *(*GeoCoord)(unsafe.Pointer(x)), *(*GeoCoord)(unsafe.Pointer(x + 1*4)), *(*GeoCoord)(unsafe.Pointer(pPoly + 8)), *(*GeoCoord)(unsafe.Pointer(pPoly + 8 + 1*4)), side, i) } func geopolyEventMerge(tls *libc.TLS, pLeft uintptr, pRight uintptr) uintptr { bp := tls.Alloc(32) defer tls.Free(32) var pLast uintptr (*GeoEvent)(unsafe.Pointer(bp)).FpNext = uintptr(0) pLast = bp for pRight != 0 && pLeft != 0 { if (*GeoEvent)(unsafe.Pointer(pRight)).Fx <= (*GeoEvent)(unsafe.Pointer(pLeft)).Fx { (*GeoEvent)(unsafe.Pointer(pLast)).FpNext = pRight pLast = pRight pRight = (*GeoEvent)(unsafe.Pointer(pRight)).FpNext } else { (*GeoEvent)(unsafe.Pointer(pLast)).FpNext = pLeft pLast = pLeft pLeft = (*GeoEvent)(unsafe.Pointer(pLeft)).FpNext } } (*GeoEvent)(unsafe.Pointer(pLast)).FpNext = func() uintptr { if pRight != 0 { return pRight } return pLeft }() return (*GeoEvent)(unsafe.Pointer(bp)).FpNext } func geopolySortEventsByX(tls *libc.TLS, aEvent uintptr, nEvent int32) uintptr { bp := tls.Alloc(400) defer tls.Free(400) var mx int32 = 0 var i int32 var j int32 var p uintptr for i = 0; i < nEvent; i++ { p = aEvent + uintptr(i)*32 (*GeoEvent)(unsafe.Pointer(p)).FpNext = uintptr(0) for j = 0; j < mx && *(*uintptr)(unsafe.Pointer(bp + uintptr(j)*8)) != 0; j++ { p = geopolyEventMerge(tls, *(*uintptr)(unsafe.Pointer(bp + uintptr(j)*8)), p) *(*uintptr)(unsafe.Pointer(bp + uintptr(j)*8)) = uintptr(0) } *(*uintptr)(unsafe.Pointer(bp + uintptr(j)*8)) = p if j >= mx { mx = j + 1 } } p = uintptr(0) for i = 0; i < mx; i++ { p = geopolyEventMerge(tls, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)), p) } return p } func geopolySegmentMerge(tls *libc.TLS, pLeft uintptr, pRight uintptr) uintptr { bp := tls.Alloc(48) defer tls.Free(48) var pLast uintptr (*GeoSegment)(unsafe.Pointer(bp)).FpNext = uintptr(0) pLast = bp for pRight != 0 && pLeft != 0 { var r float64 = (*GeoSegment)(unsafe.Pointer(pRight)).Fy - (*GeoSegment)(unsafe.Pointer(pLeft)).Fy if r == 0.0 { r = (*GeoSegment)(unsafe.Pointer(pRight)).FC - (*GeoSegment)(unsafe.Pointer(pLeft)).FC } if r < 0.0 { (*GeoSegment)(unsafe.Pointer(pLast)).FpNext = pRight pLast = pRight pRight = (*GeoSegment)(unsafe.Pointer(pRight)).FpNext } else { (*GeoSegment)(unsafe.Pointer(pLast)).FpNext = pLeft pLast = pLeft pLeft = (*GeoSegment)(unsafe.Pointer(pLeft)).FpNext } } (*GeoSegment)(unsafe.Pointer(pLast)).FpNext = func() uintptr { if pRight != 0 { return pRight } return pLeft }() return (*GeoSegment)(unsafe.Pointer(bp)).FpNext } func geopolySortSegmentsByYAndC(tls *libc.TLS, pList uintptr) uintptr { bp := tls.Alloc(400) defer tls.Free(400) var mx int32 = 0 var i int32 var p uintptr for pList != 0 { p = pList pList = (*GeoSegment)(unsafe.Pointer(pList)).FpNext (*GeoSegment)(unsafe.Pointer(p)).FpNext = uintptr(0) for i = 0; i < mx && *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) != 0; i++ { p = geopolySegmentMerge(tls, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)), p) *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = uintptr(0) } *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)) = p if i >= mx { mx = i + 1 } } p = uintptr(0) for i = 0; i < mx; i++ { p = geopolySegmentMerge(tls, *(*uintptr)(unsafe.Pointer(bp + uintptr(i)*8)), p) } return p } func geopolyOverlap(tls *libc.TLS, p1 uintptr, p2 uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var nVertex Sqlite3_int64 var p uintptr var nByte Sqlite3_int64 var pThisEvent uintptr var rX float64 var rc int32 var needSort int32 var pActive uintptr var pSeg uintptr var y float64 var pPrev uintptr var iMask int32 nVertex = Sqlite3_int64((*GeoPoly)(unsafe.Pointer(p1)).FnVertex + (*GeoPoly)(unsafe.Pointer(p2)).FnVertex + 2) rc = 0 needSort = 0 pActive = uintptr(0) nByte = Sqlite3_int64(uint64(unsafe.Sizeof(GeoEvent{}))*uint64(nVertex)*uint64(2) + uint64(unsafe.Sizeof(GeoSegment{}))*uint64(nVertex) + uint64(unsafe.Sizeof(GeoOverlap{}))) p = Xsqlite3_malloc64(tls, uint64(nByte)) if !(p == uintptr(0)) { goto __1 } return -1 __1: ; (*GeoOverlap)(unsafe.Pointer(p)).FaEvent = p + 1*24 (*GeoOverlap)(unsafe.Pointer(p)).FaSegment = (*GeoOverlap)(unsafe.Pointer(p)).FaEvent + uintptr(nVertex*int64(2))*32 (*GeoOverlap)(unsafe.Pointer(p)).FnEvent = libc.AssignPtrInt32(p+20, 0) geopolyAddSegments(tls, p, p1, uint8(1)) geopolyAddSegments(tls, p, p2, uint8(2)) pThisEvent = geopolySortEventsByX(tls, (*GeoOverlap)(unsafe.Pointer(p)).FaEvent, (*GeoOverlap)(unsafe.Pointer(p)).FnEvent) if pThisEvent != 0 && (*GeoEvent)(unsafe.Pointer(pThisEvent)).Fx == 0.0 { rX = -1.0 } else { rX = 0.0 } libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([4]uint8{}))) __2: if !(pThisEvent != 0) { goto __3 } if !((*GeoEvent)(unsafe.Pointer(pThisEvent)).Fx != rX) { goto __4 } pPrev = uintptr(0) iMask = 0 rX = (*GeoEvent)(unsafe.Pointer(pThisEvent)).Fx if !(needSort != 0) { goto __5 } pActive = geopolySortSegmentsByYAndC(tls, pActive) needSort = 0 __5: ; pSeg = pActive __6: if !(pSeg != 0) { goto __8 } if !(pPrev != 0) { goto __9 } if !((*GeoSegment)(unsafe.Pointer(pPrev)).Fy != (*GeoSegment)(unsafe.Pointer(pSeg)).Fy) { goto __10 } *(*uint8)(unsafe.Pointer(bp + uintptr(iMask))) = uint8(1) __10: ; __9: ; iMask = iMask ^ int32((*GeoSegment)(unsafe.Pointer(pSeg)).Fside) pPrev = pSeg goto __7 __7: pSeg = (*GeoSegment)(unsafe.Pointer(pSeg)).FpNext goto __6 goto __8 __8: ; pPrev = uintptr(0) pSeg = pActive __11: if !(pSeg != 0) { goto __13 } y = (*GeoSegment)(unsafe.Pointer(pSeg)).FC*rX + (*GeoSegment)(unsafe.Pointer(pSeg)).FB (*GeoSegment)(unsafe.Pointer(pSeg)).Fy = y if !(pPrev != 0) { goto __14 } if !((*GeoSegment)(unsafe.Pointer(pPrev)).Fy > (*GeoSegment)(unsafe.Pointer(pSeg)).Fy && int32((*GeoSegment)(unsafe.Pointer(pPrev)).Fside) != int32((*GeoSegment)(unsafe.Pointer(pSeg)).Fside)) { goto __15 } rc = 1 goto geopolyOverlapDone goto __16 __15: if !((*GeoSegment)(unsafe.Pointer(pPrev)).Fy != (*GeoSegment)(unsafe.Pointer(pSeg)).Fy) { goto __17 } *(*uint8)(unsafe.Pointer(bp + uintptr(iMask))) = uint8(1) __17: ; __16: ; __14: ; iMask = iMask ^ int32((*GeoSegment)(unsafe.Pointer(pSeg)).Fside) pPrev = pSeg goto __12 __12: pSeg = (*GeoSegment)(unsafe.Pointer(pSeg)).FpNext goto __11 goto __13 __13: ; __4: ; if !((*GeoEvent)(unsafe.Pointer(pThisEvent)).FeType == 0) { goto __18 } pSeg = (*GeoEvent)(unsafe.Pointer(pThisEvent)).FpSeg (*GeoSegment)(unsafe.Pointer(pSeg)).Fy = float64((*GeoSegment)(unsafe.Pointer(pSeg)).Fy0) (*GeoSegment)(unsafe.Pointer(pSeg)).FpNext = pActive pActive = pSeg needSort = 1 goto __19 __18: if !(pActive == (*GeoEvent)(unsafe.Pointer(pThisEvent)).FpSeg) { goto __20 } if pActive != 0 { pActive = (*GeoSegment)(unsafe.Pointer(pActive)).FpNext } else { pActive = uintptr(0) } goto __21 __20: pSeg = pActive __22: if !(pSeg != 0) { goto __24 } if !((*GeoSegment)(unsafe.Pointer(pSeg)).FpNext == (*GeoEvent)(unsafe.Pointer(pThisEvent)).FpSeg) { goto __25 } (*GeoSegment)(unsafe.Pointer(pSeg)).FpNext = func() uintptr { if (*GeoSegment)(unsafe.Pointer(pSeg)).FpNext != 0 { return (*GeoSegment)(unsafe.Pointer((*GeoSegment)(unsafe.Pointer(pSeg)).FpNext)).FpNext } return uintptr(0) }() goto __24 __25: ; goto __23 __23: pSeg = (*GeoSegment)(unsafe.Pointer(pSeg)).FpNext goto __22 goto __24 __24: ; __21: ; __19: ; pThisEvent = (*GeoEvent)(unsafe.Pointer(pThisEvent)).FpNext goto __2 __3: ; if !(int32(*(*uint8)(unsafe.Pointer(bp + 3))) == 0) { goto __26 } rc = 0 goto __27 __26: if !(int32(*(*uint8)(unsafe.Pointer(bp + 1))) != 0 && int32(*(*uint8)(unsafe.Pointer(bp + 2))) == 0) { goto __28 } rc = 3 goto __29 __28: if !(int32(*(*uint8)(unsafe.Pointer(bp + 1))) == 0 && int32(*(*uint8)(unsafe.Pointer(bp + 2))) != 0) { goto __30 } rc = 2 goto __31 __30: if !(int32(*(*uint8)(unsafe.Pointer(bp + 1))) == 0 && int32(*(*uint8)(unsafe.Pointer(bp + 2))) == 0) { goto __32 } rc = 4 goto __33 __32: rc = 1 __33: ; __31: ; __29: ; __27: ; geopolyOverlapDone: Xsqlite3_free(tls, p) return rc } func geopolyOverlapFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var p1 uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv)), uintptr(0)) var p2 uintptr = geopolyFuncParam(tls, context, *(*uintptr)(unsafe.Pointer(argv + 1*8)), uintptr(0)) _ = argc if p1 != 0 && p2 != 0 { var x int32 = geopolyOverlap(tls, p1, p2) if x < 0 { Xsqlite3_result_error_nomem(tls, context) } else { Xsqlite3_result_int(tls, context, x) } } Xsqlite3_free(tls, p1) Xsqlite3_free(tls, p2) } func geopolyDebugFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { _ = context _ = argc _ = argv } func geopolyInit(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr, isCreate int32) int32 { bp := tls.Alloc(32) defer tls.Free(32) var rc int32 var pRtree uintptr var nDb Sqlite3_int64 var nName Sqlite3_int64 var pSql uintptr var zSql uintptr var ii int32 rc = SQLITE_OK _ = pAux Xsqlite3_vtab_config(tls, db, SQLITE_VTAB_CONSTRAINT_SUPPORT, libc.VaList(bp, 1)) nDb = Sqlite3_int64(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8)))) nName = Sqlite3_int64(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(argv + 2*8)))) pRtree = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(Rtree{}))+uint64(nDb)+uint64(nName)+uint64(2)) if !!(pRtree != 0) { goto __1 } return SQLITE_NOMEM __1: ; libc.Xmemset(tls, pRtree, 0, uint64(unsafe.Sizeof(Rtree{}))+uint64(nDb)+uint64(nName)+uint64(2)) (*Rtree)(unsafe.Pointer(pRtree)).FnBusy = U32(1) (*Rtree)(unsafe.Pointer(pRtree)).Fbase.FpModule = uintptr(unsafe.Pointer(&rtreeModule)) (*Rtree)(unsafe.Pointer(pRtree)).FzDb = pRtree + 1*968 (*Rtree)(unsafe.Pointer(pRtree)).FzName = (*Rtree)(unsafe.Pointer(pRtree)).FzDb + uintptr(nDb+int64(1)) (*Rtree)(unsafe.Pointer(pRtree)).FeCoordType = U8(RTREE_COORD_REAL32) (*Rtree)(unsafe.Pointer(pRtree)).FnDim = U8(2) (*Rtree)(unsafe.Pointer(pRtree)).FnDim2 = U8(4) libc.Xmemcpy(tls, (*Rtree)(unsafe.Pointer(pRtree)).FzDb, *(*uintptr)(unsafe.Pointer(argv + 1*8)), uint64(nDb)) libc.Xmemcpy(tls, (*Rtree)(unsafe.Pointer(pRtree)).FzName, *(*uintptr)(unsafe.Pointer(argv + 2*8)), uint64(nName)) pSql = Xsqlite3_str_new(tls, db) Xsqlite3_str_appendf(tls, pSql, ts+28964, 0) (*Rtree)(unsafe.Pointer(pRtree)).FnAux = U8(1) (*Rtree)(unsafe.Pointer(pRtree)).FnAuxNotNull = U8(1) ii = 3 __2: if !(ii < argc) { goto __4 } (*Rtree)(unsafe.Pointer(pRtree)).FnAux++ Xsqlite3_str_appendf(tls, pSql, ts+28986, libc.VaList(bp+8, *(*uintptr)(unsafe.Pointer(argv + uintptr(ii)*8)))) goto __3 __3: ii++ goto __2 goto __4 __4: ; Xsqlite3_str_appendf(tls, pSql, ts+28053, 0) zSql = Xsqlite3_str_finish(tls, pSql) if !!(zSql != 0) { goto __5 } rc = SQLITE_NOMEM goto __6 __5: if !(SQLITE_OK != libc.AssignInt32(&rc, Xsqlite3_declare_vtab(tls, db, zSql))) { goto __7 } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+16, Xsqlite3_errmsg(tls, db))) __7: ; __6: ; Xsqlite3_free(tls, zSql) if !(rc != 0) { goto __8 } goto geopolyInit_fail __8: ; (*Rtree)(unsafe.Pointer(pRtree)).FnBytesPerCell = U8(8 + int32((*Rtree)(unsafe.Pointer(pRtree)).FnDim2)*4) rc = getNodeSize(tls, db, pRtree, isCreate, pzErr) if !(rc != 0) { goto __9 } goto geopolyInit_fail __9: ; rc = rtreeSqlInit(tls, pRtree, db, *(*uintptr)(unsafe.Pointer(argv + 1*8)), *(*uintptr)(unsafe.Pointer(argv + 2*8)), isCreate) if !(rc != 0) { goto __10 } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+24, Xsqlite3_errmsg(tls, db))) goto geopolyInit_fail __10: ; *(*uintptr)(unsafe.Pointer(ppVtab)) = pRtree return SQLITE_OK geopolyInit_fail: if !(rc == SQLITE_OK) { goto __11 } rc = SQLITE_ERROR __11: ; rtreeRelease(tls, pRtree) return rc } func geopolyCreate(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return geopolyInit(tls, db, pAux, argc, argv, ppVtab, pzErr, 1) } func geopolyConnect(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return geopolyInit(tls, db, pAux, argc, argv, ppVtab, pzErr, 0) } func geopolyFilter(tls *libc.TLS, pVtabCursor uintptr, idxNum int32, idxStr uintptr, argc int32, argv uintptr) int32 { bp := tls.Alloc(52) defer tls.Free(52) var pRtree uintptr var pCsr uintptr var p uintptr var iRowid I64 var p1 uintptr var pNew uintptr pRtree = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pVtabCursor)).FpVtab pCsr = pVtabCursor *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 48)) = SQLITE_OK *(*int32)(unsafe.Pointer(bp + 16)) = 0 _ = idxStr rtreeReference(tls, pRtree) resetCursor(tls, pCsr) (*RtreeCursor)(unsafe.Pointer(pCsr)).FiStrategy = idxNum if !(idxNum == 1) { goto __1 } iRowid = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) *(*I64)(unsafe.Pointer(bp + 8)) = int64(0) *(*int32)(unsafe.Pointer(bp + 48)) = findLeafNode(tls, pRtree, iRowid, bp, bp+8) if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK && *(*uintptr)(unsafe.Pointer(bp)) != uintptr(0)) { goto __3 } p = rtreeSearchPointNew(tls, pCsr, 0.0, uint8(0)) *(*uintptr)(unsafe.Pointer(pCsr + 88)) = *(*uintptr)(unsafe.Pointer(bp)) (*RtreeSearchPoint)(unsafe.Pointer(p)).Fid = *(*I64)(unsafe.Pointer(bp + 8)) (*RtreeSearchPoint)(unsafe.Pointer(p)).FeWithin = U8(PARTLY_WITHIN) *(*int32)(unsafe.Pointer(bp + 48)) = nodeRowidIndex(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp)), iRowid, bp+16) (*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell = U8(*(*int32)(unsafe.Pointer(bp + 16))) goto __4 __3: (*RtreeCursor)(unsafe.Pointer(pCsr)).FatEOF = U8(1) __4: ; goto __2 __1: *(*int32)(unsafe.Pointer(bp + 48)) = nodeAcquire(tls, pRtree, int64(1), uintptr(0), bp+24) if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK && idxNum <= 3) { goto __5 } geopolyBBox(tls, uintptr(0), *(*uintptr)(unsafe.Pointer(argv)), bp+32, bp+48) if !(*(*int32)(unsafe.Pointer(bp + 48)) != 0) { goto __6 } goto geopoly_filter_end __6: ; (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint = libc.AssignUintptr(&p1, Xsqlite3_malloc(tls, int32(uint64(unsafe.Sizeof(RtreeConstraint{}))*uint64(4)))) (*RtreeCursor)(unsafe.Pointer(pCsr)).FnConstraint = 4 if !(p1 == uintptr(0)) { goto __7 } *(*int32)(unsafe.Pointer(bp + 48)) = SQLITE_NOMEM goto __8 __7: libc.Xmemset(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FaConstraint, 0, uint64(unsafe.Sizeof(RtreeConstraint{}))*uint64(4)) libc.Xmemset(tls, pCsr+128, 0, uint64(unsafe.Sizeof(U32(0)))*uint64((*Rtree)(unsafe.Pointer(pRtree)).FiDepth+1)) if !(idxNum == 2) { goto __9 } (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'B' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 0 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32 + 1*4))) p1 += 24 (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'D' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 1 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32))) p1 += 24 (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'B' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 2 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32 + 3*4))) p1 += 24 (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'D' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 3 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32 + 2*4))) goto __10 __9: (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'D' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 0 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32))) p1 += 24 (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'B' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 1 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32 + 1*4))) p1 += 24 (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'D' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 2 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32 + 2*4))) p1 += 24 (*RtreeConstraint)(unsafe.Pointer(p1)).Fop = 'B' (*RtreeConstraint)(unsafe.Pointer(p1)).FiCoord = 3 *(*RtreeDValue)(unsafe.Pointer(p1 + 8)) = RtreeDValue(*(*RtreeValue)(unsafe.Pointer(bp + 32 + 3*4))) __10: ; __8: ; __5: ; if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK) { goto __11 } pNew = rtreeSearchPointNew(tls, pCsr, 0.0, U8((*Rtree)(unsafe.Pointer(pRtree)).FiDepth+1)) if !(pNew == uintptr(0)) { goto __12 } *(*int32)(unsafe.Pointer(bp + 48)) = SQLITE_NOMEM goto geopoly_filter_end __12: ; (*RtreeSearchPoint)(unsafe.Pointer(pNew)).Fid = int64(1) (*RtreeSearchPoint)(unsafe.Pointer(pNew)).FiCell = U8(0) (*RtreeSearchPoint)(unsafe.Pointer(pNew)).FeWithin = U8(PARTLY_WITHIN) *(*uintptr)(unsafe.Pointer(pCsr + 88)) = *(*uintptr)(unsafe.Pointer(bp + 24)) *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 48)) = rtreeStepToLeaf(tls, pCsr) __11: ; __2: ; geopoly_filter_end: nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 24))) rtreeRelease(tls, pRtree) return *(*int32)(unsafe.Pointer(bp + 48)) } func geopolyBestIndex(tls *libc.TLS, tab uintptr, pIdxInfo uintptr) int32 { var ii int32 var iRowidTerm int32 = -1 var iFuncTerm int32 = -1 var idxNum int32 = 0 _ = tab for ii = 0; ii < (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FnConstraint; ii++ { var p uintptr = (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraint + uintptr(ii)*12 if !(int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fusable) != 0) { continue } if (*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn < 0 && int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_EQ { iRowidTerm = ii break } if (*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn == 0 && int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) >= SQLITE_INDEX_CONSTRAINT_FUNCTION { iFuncTerm = ii idxNum = int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) - SQLITE_INDEX_CONSTRAINT_FUNCTION + 2 } } if iRowidTerm >= 0 { (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 1 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxStr = ts + 17625 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(iRowidTerm)*8)).FargvIndex = 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(iRowidTerm)*8)).Fomit = uint8(1) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = 30.0 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = int64(1) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxFlags = SQLITE_INDEX_SCAN_UNIQUE return SQLITE_OK } if iFuncTerm >= 0 { (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = idxNum (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxStr = ts + 28990 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(iFuncTerm)*8)).FargvIndex = 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FaConstraintUsage + uintptr(iFuncTerm)*8)).Fomit = uint8(0) (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = 300.0 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = int64(10) return SQLITE_OK } (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxNum = 4 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FidxStr = ts + 28996 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedCost = 3000000.0 (*Sqlite3_index_info)(unsafe.Pointer(pIdxInfo)).FestimatedRows = int64(100000) return SQLITE_OK } func geopolyColumn(tls *libc.TLS, cur uintptr, ctx uintptr, i int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pRtree uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(cur)).FpVtab var pCsr uintptr = cur var p uintptr = rtreeSearchPointFirst(tls, pCsr) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var pNode uintptr = rtreeNodeOfFirstSearchPoint(tls, pCsr, bp) if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } if p == uintptr(0) { return SQLITE_OK } if i == 0 && Xsqlite3_vtab_nochange(tls, ctx) != 0 { return SQLITE_OK } if i <= int32((*Rtree)(unsafe.Pointer(pRtree)).FnAux) { if !(int32((*RtreeCursor)(unsafe.Pointer(pCsr)).FbAuxValid) != 0) { if (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux == uintptr(0) { *(*int32)(unsafe.Pointer(bp)) = Xsqlite3_prepare_v3(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb, (*Rtree)(unsafe.Pointer(pRtree)).FzReadAuxSql, -1, uint32(0), pCsr+56, uintptr(0)) if *(*int32)(unsafe.Pointer(bp)) != 0 { return *(*int32)(unsafe.Pointer(bp)) } } Xsqlite3_bind_int64(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux, 1, nodeGetRowid(tls, pRtree, pNode, int32((*RtreeSearchPoint)(unsafe.Pointer(p)).FiCell))) *(*int32)(unsafe.Pointer(bp)) = Xsqlite3_step(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_ROW { (*RtreeCursor)(unsafe.Pointer(pCsr)).FbAuxValid = U8(1) } else { Xsqlite3_reset(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_DONE { *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK } return *(*int32)(unsafe.Pointer(bp)) } } Xsqlite3_result_value(tls, ctx, Xsqlite3_column_value(tls, (*RtreeCursor)(unsafe.Pointer(pCsr)).FpReadAux, i+2)) } return SQLITE_OK } func geopolyUpdate(tls *libc.TLS, pVtab uintptr, nData int32, aData uintptr, pRowid uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var pRtree uintptr var oldRowid I64 var oldRowidValid int32 var newRowid I64 var newRowidValid int32 var coordChange int32 var steprc int32 var rc2 int32 var p uintptr var pUp uintptr var jj int32 var nChange int32 pRtree = pVtab *(*int32)(unsafe.Pointer(bp + 48)) = SQLITE_OK coordChange = 0 if !((*Rtree)(unsafe.Pointer(pRtree)).FnNodeRef != 0) { goto __1 } return SQLITE_LOCKED | int32(2)<<8 __1: ; rtreeReference(tls, pRtree) oldRowidValid = libc.Bool32(Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(aData))) != SQLITE_NULL) if oldRowidValid != 0 { oldRowid = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(aData))) } else { oldRowid = int64(0) } newRowidValid = libc.Bool32(nData > 1 && Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(aData + 1*8))) != SQLITE_NULL) if newRowidValid != 0 { newRowid = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(aData + 1*8))) } else { newRowid = int64(0) } (*RtreeCell)(unsafe.Pointer(bp)).FiRowid = newRowid if !(nData > 1 && (!(oldRowidValid != 0) || !(Xsqlite3_value_nochange(tls, *(*uintptr)(unsafe.Pointer(aData + 2*8))) != 0) || oldRowid != newRowid)) { goto __2 } geopolyBBox(tls, uintptr(0), *(*uintptr)(unsafe.Pointer(aData + 2*8)), bp+8, bp+48) if !(*(*int32)(unsafe.Pointer(bp + 48)) != 0) { goto __3 } if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_ERROR) { goto __4 } (*Sqlite3_vtab)(unsafe.Pointer(pVtab)).FzErrMsg = Xsqlite3_mprintf(tls, ts+29005, 0) __4: ; goto geopoly_update_end __3: ; coordChange = 1 if !(newRowidValid != 0 && (!(oldRowidValid != 0) || oldRowid != newRowid)) { goto __5 } Xsqlite3_bind_int64(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid, 1, (*RtreeCell)(unsafe.Pointer(bp)).FiRowid) steprc = Xsqlite3_step(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) *(*int32)(unsafe.Pointer(bp + 48)) = Xsqlite3_reset(tls, (*Rtree)(unsafe.Pointer(pRtree)).FpReadRowid) if !(SQLITE_ROW == steprc) { goto __6 } if !(Xsqlite3_vtab_on_conflict(tls, (*Rtree)(unsafe.Pointer(pRtree)).Fdb) == SQLITE_REPLACE) { goto __7 } *(*int32)(unsafe.Pointer(bp + 48)) = rtreeDeleteRowid(tls, pRtree, (*RtreeCell)(unsafe.Pointer(bp)).FiRowid) goto __8 __7: *(*int32)(unsafe.Pointer(bp + 48)) = rtreeConstraintError(tls, pRtree, 0) __8: ; __6: ; __5: ; __2: ; if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK && (nData == 1 || coordChange != 0 && oldRowidValid != 0)) { goto __9 } *(*int32)(unsafe.Pointer(bp + 48)) = rtreeDeleteRowid(tls, pRtree, oldRowid) __9: ; if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK && nData > 1 && coordChange != 0) { goto __10 } *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) if !!(newRowidValid != 0) { goto __11 } *(*int32)(unsafe.Pointer(bp + 48)) = rtreeNewRowid(tls, pRtree, bp) __11: ; *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = (*RtreeCell)(unsafe.Pointer(bp)).FiRowid if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK) { goto __12 } *(*int32)(unsafe.Pointer(bp + 48)) = sChooseLeaf(tls, pRtree, bp, 0, bp+56) __12: ; if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK) { goto __13 } (*Rtree)(unsafe.Pointer(pRtree)).FiReinsertHeight = -1 *(*int32)(unsafe.Pointer(bp + 48)) = rtreeInsertCell(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 56)), bp, 0) rc2 = nodeRelease(tls, pRtree, *(*uintptr)(unsafe.Pointer(bp + 56))) if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK) { goto __14 } *(*int32)(unsafe.Pointer(bp + 48)) = rc2 __14: ; __13: ; __10: ; if !(*(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK && nData > 1) { goto __15 } pUp = (*Rtree)(unsafe.Pointer(pRtree)).FpWriteAux nChange = 0 Xsqlite3_bind_int64(tls, pUp, 1, (*RtreeCell)(unsafe.Pointer(bp)).FiRowid) if !(Xsqlite3_value_nochange(tls, *(*uintptr)(unsafe.Pointer(aData + 2*8))) != 0) { goto __16 } Xsqlite3_bind_null(tls, pUp, 2) goto __17 __16: p = uintptr(0) if !(Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(aData + 2*8))) == SQLITE_TEXT && libc.AssignUintptr(&p, geopolyFuncParam(tls, uintptr(0), *(*uintptr)(unsafe.Pointer(aData + 2*8)), bp+48)) != uintptr(0) && *(*int32)(unsafe.Pointer(bp + 48)) == SQLITE_OK) { goto __18 } Xsqlite3_bind_blob(tls, pUp, 2, p+4, 4+8*(*GeoPoly)(unsafe.Pointer(p)).FnVertex, libc.UintptrFromInt32(-1)) goto __19 __18: Xsqlite3_bind_value(tls, pUp, 2, *(*uintptr)(unsafe.Pointer(aData + 2*8))) __19: ; Xsqlite3_free(tls, p) nChange = 1 __17: ; jj = 1 __20: if !(jj < nData-2) { goto __22 } nChange++ Xsqlite3_bind_value(tls, pUp, jj+2, *(*uintptr)(unsafe.Pointer(aData + uintptr(jj+2)*8))) goto __21 __21: jj++ goto __20 goto __22 __22: ; if !(nChange != 0) { goto __23 } Xsqlite3_step(tls, pUp) *(*int32)(unsafe.Pointer(bp + 48)) = Xsqlite3_reset(tls, pUp) __23: ; __15: ; geopoly_update_end: rtreeRelease(tls, pRtree) return *(*int32)(unsafe.Pointer(bp + 48)) } func geopolyFindFunction(tls *libc.TLS, pVtab uintptr, nArg int32, zName uintptr, pxFunc uintptr, ppArg uintptr) int32 { _ = pVtab _ = nArg if Xsqlite3_stricmp(tls, zName, ts+29045) == 0 { *(*uintptr)(unsafe.Pointer(pxFunc)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{geopolyOverlapFunc})) *(*uintptr)(unsafe.Pointer(ppArg)) = uintptr(0) return SQLITE_INDEX_CONSTRAINT_FUNCTION } if Xsqlite3_stricmp(tls, zName, ts+29061) == 0 { *(*uintptr)(unsafe.Pointer(pxFunc)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{geopolyWithinFunc})) *(*uintptr)(unsafe.Pointer(ppArg)) = uintptr(0) return SQLITE_INDEX_CONSTRAINT_FUNCTION + 1 } return 0 } var geopolyModule = Sqlite3_module{ FiVersion: 3, FxCreate: 0, FxConnect: 0, FxBestIndex: 0, FxDisconnect: 0, FxDestroy: 0, FxOpen: 0, FxClose: 0, FxFilter: 0, FxNext: 0, FxEof: 0, FxColumn: 0, FxRowid: 0, FxUpdate: 0, FxBegin: 0, FxSync: 0, FxCommit: 0, FxRollback: 0, FxFindFunction: 0, FxRename: 0, FxSavepoint: 0, FxShadowName: 0, } func sqlite3_geopoly_init(tls *libc.TLS, db uintptr) int32 { var rc int32 = SQLITE_OK var i uint32 for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(aFunc))/uint64(unsafe.Sizeof(struct { FxFunc uintptr FnArg int8 FbPure uint8 F__ccgo_pad1 [6]byte FzName uintptr }{})) && rc == SQLITE_OK; i++ { var enc int32 if aFunc[i].FbPure != 0 { enc = SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS } else { enc = SQLITE_UTF8 | SQLITE_DIRECTONLY } rc = Xsqlite3_create_function(tls, db, aFunc[i].FzName, int32(aFunc[i].FnArg), enc, uintptr(0), aFunc[i].FxFunc, uintptr(0), uintptr(0)) } for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(aAgg))/uint64(unsafe.Sizeof(struct { FxStep uintptr FxFinal uintptr FzName uintptr }{})) && rc == SQLITE_OK; i++ { rc = Xsqlite3_create_function(tls, db, aAgg[i].FzName, 1, SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS, uintptr(0), uintptr(0), aAgg[i].FxStep, aAgg[i].FxFinal) } if rc == SQLITE_OK { rc = Xsqlite3_create_module_v2(tls, db, ts+29076, uintptr(unsafe.Pointer(&geopolyModule)), uintptr(0), uintptr(0)) } return rc } var aFunc = [12]struct { FxFunc uintptr FnArg int8 FbPure uint8 F__ccgo_pad1 [6]byte FzName uintptr }{ {FxFunc: 0, FnArg: int8(1), FbPure: uint8(1), FzName: ts + 29084}, {FxFunc: 0, FnArg: int8(1), FbPure: uint8(1), FzName: ts + 29097}, {FxFunc: 0, FnArg: int8(1), FbPure: uint8(1), FzName: ts + 29110}, {FxFunc: 0, FnArg: int8(-1), FbPure: uint8(1), FzName: ts + 29123}, {FxFunc: 0, FnArg: int8(2), FbPure: uint8(1), FzName: ts + 29061}, {FxFunc: 0, FnArg: int8(3), FbPure: uint8(1), FzName: ts + 29135}, {FxFunc: 0, FnArg: int8(2), FbPure: uint8(1), FzName: ts + 29045}, {FxFunc: 0, FnArg: int8(1), FzName: ts + 29158}, {FxFunc: 0, FnArg: int8(1), FbPure: uint8(1), FzName: ts + 29172}, {FxFunc: 0, FnArg: int8(7), FbPure: uint8(1), FzName: ts + 29185}, {FxFunc: 0, FnArg: int8(4), FbPure: uint8(1), FzName: ts + 29199}, {FxFunc: 0, FnArg: int8(1), FbPure: uint8(1), FzName: ts + 29215}, } var aAgg = [1]struct { FxStep uintptr FxFinal uintptr FzName uintptr }{ {FxStep: 0, FxFinal: 0, FzName: ts + 29227}, } // Register the r-tree module with database handle db. This creates the // virtual table module "rtree" and the debugging/analysis scalar // function "rtreenode". func Xsqlite3RtreeInit(tls *libc.TLS, db uintptr) int32 { var utf8 int32 = SQLITE_UTF8 var rc int32 rc = Xsqlite3_create_function(tls, db, ts+29246, 2, utf8, uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{rtreenode})), uintptr(0), uintptr(0)) if rc == SQLITE_OK { rc = Xsqlite3_create_function(tls, db, ts+29256, 1, utf8, uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{rtreedepth})), uintptr(0), uintptr(0)) } if rc == SQLITE_OK { rc = Xsqlite3_create_function(tls, db, ts+29267, -1, utf8, uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{rtreecheck})), uintptr(0), uintptr(0)) } if rc == SQLITE_OK { var c uintptr = uintptr(RTREE_COORD_REAL32) rc = Xsqlite3_create_module_v2(tls, db, ts+28990, uintptr(unsafe.Pointer(&rtreeModule)), c, uintptr(0)) } if rc == SQLITE_OK { var c uintptr = uintptr(RTREE_COORD_INT32) rc = Xsqlite3_create_module_v2(tls, db, ts+29278, uintptr(unsafe.Pointer(&rtreeModule)), c, uintptr(0)) } if rc == SQLITE_OK { rc = sqlite3_geopoly_init(tls, db) } return rc } func rtreeFreeCallback(tls *libc.TLS, p uintptr) { var pInfo uintptr = p if (*RtreeGeomCallback)(unsafe.Pointer(pInfo)).FxDestructor != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*RtreeGeomCallback)(unsafe.Pointer(pInfo)).FxDestructor})).f(tls, (*RtreeGeomCallback)(unsafe.Pointer(pInfo)).FpContext) } Xsqlite3_free(tls, p) } func rtreeMatchArgFree(tls *libc.TLS, pArg uintptr) { var i int32 var p uintptr = pArg for i = 0; i < (*RtreeMatchArg)(unsafe.Pointer(p)).FnParam; i++ { Xsqlite3_value_free(tls, *(*uintptr)(unsafe.Pointer((*RtreeMatchArg)(unsafe.Pointer(p)).FapSqlParam + uintptr(i)*8))) } Xsqlite3_free(tls, p) } func geomCallback(tls *libc.TLS, ctx uintptr, nArg int32, aArg uintptr) { var pGeomCtx uintptr = Xsqlite3_user_data(tls, ctx) var pBlob uintptr var nBlob Sqlite3_int64 var memErr int32 = 0 nBlob = Sqlite3_int64(uint64(unsafe.Sizeof(RtreeMatchArg{})) + uint64(nArg-1)*uint64(unsafe.Sizeof(RtreeDValue(0))) + uint64(nArg)*uint64(unsafe.Sizeof(uintptr(0)))) pBlob = Xsqlite3_malloc64(tls, uint64(nBlob)) if !(pBlob != 0) { Xsqlite3_result_error_nomem(tls, ctx) } else { var i int32 (*RtreeMatchArg)(unsafe.Pointer(pBlob)).FiSize = U32(nBlob) (*RtreeMatchArg)(unsafe.Pointer(pBlob)).Fcb = *(*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)) (*RtreeMatchArg)(unsafe.Pointer(pBlob)).FapSqlParam = pBlob + 56 + uintptr(nArg)*8 (*RtreeMatchArg)(unsafe.Pointer(pBlob)).FnParam = nArg for i = 0; i < nArg; i++ { *(*uintptr)(unsafe.Pointer((*RtreeMatchArg)(unsafe.Pointer(pBlob)).FapSqlParam + uintptr(i)*8)) = Xsqlite3_value_dup(tls, *(*uintptr)(unsafe.Pointer(aArg + uintptr(i)*8))) if *(*uintptr)(unsafe.Pointer((*RtreeMatchArg)(unsafe.Pointer(pBlob)).FapSqlParam + uintptr(i)*8)) == uintptr(0) { memErr = 1 } *(*RtreeDValue)(unsafe.Pointer(pBlob + 56 + uintptr(i)*8)) = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(aArg + uintptr(i)*8))) } if memErr != 0 { Xsqlite3_result_error_nomem(tls, ctx) rtreeMatchArgFree(tls, pBlob) } else { Xsqlite3_result_pointer(tls, ctx, pBlob, ts+26566, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{rtreeMatchArgFree}))) } } } // Register a new geometry function for use with the r-tree MATCH operator. func Xsqlite3_rtree_geometry_callback(tls *libc.TLS, db uintptr, zGeom uintptr, xGeom uintptr, pContext uintptr) int32 { var pGeomCtx uintptr pGeomCtx = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(RtreeGeomCallback{}))) if !(pGeomCtx != 0) { return SQLITE_NOMEM } (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FxGeom = xGeom (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FxQueryFunc = uintptr(0) (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FxDestructor = uintptr(0) (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FpContext = pContext return Xsqlite3_create_function_v2(tls, db, zGeom, -1, SQLITE_ANY, pGeomCtx, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{geomCallback})), uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{rtreeFreeCallback}))) } // Register a new 2nd-generation geometry function for use with the // r-tree MATCH operator. func Xsqlite3_rtree_query_callback(tls *libc.TLS, db uintptr, zQueryFunc uintptr, xQueryFunc uintptr, pContext uintptr, xDestructor uintptr) int32 { var pGeomCtx uintptr pGeomCtx = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(RtreeGeomCallback{}))) if !(pGeomCtx != 0) { if xDestructor != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDestructor})).f(tls, pContext) } return SQLITE_NOMEM } (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FxGeom = uintptr(0) (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FxQueryFunc = xQueryFunc (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FxDestructor = xDestructor (*RtreeGeomCallback)(unsafe.Pointer(pGeomCtx)).FpContext = pContext return Xsqlite3_create_function_v2(tls, db, zQueryFunc, -1, SQLITE_ANY, pGeomCtx, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{geomCallback})), uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{rtreeFreeCallback}))) } type sqlite3rbu = struct { FeStage int32 F__ccgo_pad1 [4]byte FdbMain uintptr FdbRbu uintptr FzTarget uintptr FzRbu uintptr FzState uintptr FzStateDb [5]int8 F__ccgo_pad2 [3]byte Frc int32 F__ccgo_pad3 [4]byte FzErrmsg uintptr FnStep int32 FnProgress int32 Fobjiter RbuObjIter FzVfsName uintptr FpTargetFd uintptr FnPagePerSector int32 F__ccgo_pad4 [4]byte FiOalSz I64 FnPhaseOneStep I64 FpRenameArg uintptr FxRename uintptr FiMaxFrame U32 FmLock U32 FnFrame int32 FnFrameAlloc int32 FaFrame uintptr Fpgsz int32 F__ccgo_pad5 [4]byte FaBuf uintptr FiWalCksum I64 FszTemp I64 FszTempLimit I64 FnRbu int32 F__ccgo_pad6 [4]byte FpRbuFd uintptr } type Sqlite3rbu = sqlite3rbu type RbuFrame1 = struct { FiDbPage U32 FiWalFrame U32 } type RbuFrame = RbuFrame1 type RbuObjIter1 = struct { FpTblIter uintptr FpIdxIter uintptr FnTblCol int32 F__ccgo_pad1 [4]byte FazTblCol uintptr FazTblType uintptr FaiSrcOrder uintptr FabTblPk uintptr FabNotNull uintptr FabIndexed uintptr FeType int32 FbCleanup int32 FzTbl uintptr FzDataTbl uintptr FzIdx uintptr FiTnum int32 FiPkTnum int32 FbUnique int32 FnIndex int32 FnCol int32 F__ccgo_pad2 [4]byte FpSelect uintptr FpInsert uintptr FpDelete uintptr FpTmpInsert uintptr FnIdxCol int32 F__ccgo_pad3 [4]byte FaIdxCol uintptr FzIdxSql uintptr FpRbuUpdate uintptr } type RbuObjIter = RbuObjIter1 type RbuState1 = struct { FeStage int32 F__ccgo_pad1 [4]byte FzTbl uintptr FzDataTbl uintptr FzIdx uintptr FiWalCksum I64 FnRow int32 F__ccgo_pad2 [4]byte FnProgress I64 FiCookie U32 F__ccgo_pad3 [4]byte FiOalSz I64 FnPhaseOneStep I64 } type RbuState = RbuState1 type RbuSpan1 = struct { FzSpan uintptr FnSpan int32 F__ccgo_pad1 [4]byte } type RbuSpan = RbuSpan1 type rbu_vfs = struct { Fbase Sqlite3_vfs FpRealVfs uintptr Fmutex uintptr FpRbu uintptr FpMain uintptr FpMainRbu uintptr } type Rbu_vfs = rbu_vfs type rbu_file = struct { Fbase Sqlite3_file FpReal uintptr FpRbuVfs uintptr FpRbu uintptr Fsz I64 FopenFlags int32 FiCookie U32 FiWriteVer U8 FbNolock U8 F__ccgo_pad1 [2]byte FnShm int32 FapShm uintptr FzDel uintptr FzWal uintptr FpWalFd uintptr FpMainNext uintptr FpMainRbuNext uintptr } type Rbu_file = rbu_file type RbuUpdateStmt1 = struct { FzMask uintptr FpUpdate uintptr FpNext uintptr } type RbuUpdateStmt = RbuUpdateStmt1 func rbuDeltaGetInt(tls *libc.TLS, pz uintptr, pLen uintptr) uint32 { var v uint32 = uint32(0) var c int32 var z uintptr = *(*uintptr)(unsafe.Pointer(pz)) var zStart uintptr = z for libc.AssignInt32(&c, int32(zValue[0x7f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&z, 1))))])) >= 0 { v = v<<6 + uint32(c) } z-- *(*int32)(unsafe.Pointer(pLen)) -= int32((int64(z) - int64(zStart)) / 1) *(*uintptr)(unsafe.Pointer(pz)) = z return v } var zValue = [128]int8{ int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(0), int8(1), int8(2), int8(3), int8(4), int8(5), int8(6), int8(7), int8(8), int8(9), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(-1), int8(10), int8(11), int8(12), int8(13), int8(14), int8(15), int8(16), int8(17), int8(18), int8(19), int8(20), int8(21), int8(22), int8(23), int8(24), int8(25), int8(26), int8(27), int8(28), int8(29), int8(30), int8(31), int8(32), int8(33), int8(34), int8(35), int8(-1), int8(-1), int8(-1), int8(-1), int8(36), int8(-1), int8(37), int8(38), int8(39), int8(40), int8(41), int8(42), int8(43), int8(44), int8(45), int8(46), int8(47), int8(48), int8(49), int8(50), int8(51), int8(52), int8(53), int8(54), int8(55), int8(56), int8(57), int8(58), int8(59), int8(60), int8(61), int8(62), int8(-1), int8(-1), int8(-1), int8(63), int8(-1), } func rbuDeltaApply(tls *libc.TLS, zSrc uintptr, lenSrc int32, zDelta uintptr, lenDelta int32, zOut uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) *(*uintptr)(unsafe.Pointer(bp)) = zDelta *(*int32)(unsafe.Pointer(bp + 8)) = lenDelta var limit uint32 var total uint32 = uint32(0) limit = rbuDeltaGetInt(tls, bp, bp+8) if int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) != '\n' { return -1 } *(*uintptr)(unsafe.Pointer(bp))++ *(*int32)(unsafe.Pointer(bp + 8))-- for *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))) != 0 && *(*int32)(unsafe.Pointer(bp + 8)) > 0 { var cnt uint32 var ofst uint32 cnt = rbuDeltaGetInt(tls, bp, bp+8) switch int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) { case '@': { *(*uintptr)(unsafe.Pointer(bp))++ *(*int32)(unsafe.Pointer(bp + 8))-- ofst = rbuDeltaGetInt(tls, bp, bp+8) if *(*int32)(unsafe.Pointer(bp + 8)) > 0 && int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) != ',' { return -1 } *(*uintptr)(unsafe.Pointer(bp))++ *(*int32)(unsafe.Pointer(bp + 8))-- total = total + cnt if total > limit { return -1 } if int32(ofst+cnt) > lenSrc { return -1 } libc.Xmemcpy(tls, zOut, zSrc+uintptr(ofst), uint64(cnt)) zOut += uintptr(cnt) break } case ':': { *(*uintptr)(unsafe.Pointer(bp))++ *(*int32)(unsafe.Pointer(bp + 8))-- total = total + cnt if total > limit { return -1 } if int32(cnt) > *(*int32)(unsafe.Pointer(bp + 8)) { return -1 } libc.Xmemcpy(tls, zOut, *(*uintptr)(unsafe.Pointer(bp)), uint64(cnt)) zOut += uintptr(cnt) *(*uintptr)(unsafe.Pointer(bp)) += uintptr(cnt) *(*int32)(unsafe.Pointer(bp + 8)) -= int32(cnt) break } case ';': { *(*uintptr)(unsafe.Pointer(bp))++ *(*int32)(unsafe.Pointer(bp + 8))-- *(*int8)(unsafe.Pointer(zOut)) = int8(0) if total != limit { return -1 } return int32(total) } default: { return -1 } } } return -1 } func rbuDeltaOutputSize(tls *libc.TLS, zDelta uintptr, lenDelta int32) int32 { bp := tls.Alloc(12) defer tls.Free(12) *(*uintptr)(unsafe.Pointer(bp)) = zDelta *(*int32)(unsafe.Pointer(bp + 8)) = lenDelta var size int32 size = int32(rbuDeltaGetInt(tls, bp, bp+8)) if int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) != '\n' { return -1 } return size } func rbuFossilDeltaFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { var aDelta uintptr var nDelta int32 var aOrig uintptr var nOrig int32 var nOut int32 var nOut2 int32 var aOut uintptr nOrig = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv))) aOrig = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv))) nDelta = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) aDelta = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) nOut = rbuDeltaOutputSize(tls, aDelta, nDelta) if nOut < 0 { Xsqlite3_result_error(tls, context, ts+29288, -1) return } aOut = Xsqlite3_malloc(tls, nOut+1) if aOut == uintptr(0) { Xsqlite3_result_error_nomem(tls, context) } else { nOut2 = rbuDeltaApply(tls, aOrig, nOrig, aDelta, nDelta, aOut) if nOut2 != nOut { Xsqlite3_free(tls, aOut) Xsqlite3_result_error(tls, context, ts+29288, -1) } else { Xsqlite3_result_blob(tls, context, aOut, nOut, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } } } func prepareAndCollectError(tls *libc.TLS, db uintptr, ppStmt uintptr, pzErrmsg uintptr, zSql uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = Xsqlite3_prepare_v2(tls, db, zSql, -1, ppStmt, uintptr(0)) if rc != SQLITE_OK { *(*uintptr)(unsafe.Pointer(pzErrmsg)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, Xsqlite3_errmsg(tls, db))) *(*uintptr)(unsafe.Pointer(ppStmt)) = uintptr(0) } return rc } func resetAndCollectError(tls *libc.TLS, pStmt uintptr, pzErrmsg uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = Xsqlite3_reset(tls, pStmt) if rc != SQLITE_OK { *(*uintptr)(unsafe.Pointer(pzErrmsg)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, Xsqlite3_errmsg(tls, Xsqlite3_db_handle(tls, pStmt)))) } return rc } func prepareFreeAndCollectError(tls *libc.TLS, db uintptr, ppStmt uintptr, pzErrmsg uintptr, zSql uintptr) int32 { var rc int32 if zSql == uintptr(0) { rc = SQLITE_NOMEM *(*uintptr)(unsafe.Pointer(ppStmt)) = uintptr(0) } else { rc = prepareAndCollectError(tls, db, ppStmt, pzErrmsg, zSql) Xsqlite3_free(tls, zSql) } return rc } func rbuObjIterFreeCols(tls *libc.TLS, pIter uintptr) { var i int32 for i = 0; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType + uintptr(i)*8))) } Xsqlite3_free(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol) (*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FabNotNull = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol = 0 (*RbuObjIter)(unsafe.Pointer(pIter)).FeType = 0 } func rbuObjIterClearStatements(tls *libc.TLS, pIter uintptr) { var pUp uintptr Xsqlite3_finalize(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpSelect) Xsqlite3_finalize(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpInsert) Xsqlite3_finalize(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpDelete) Xsqlite3_finalize(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpTmpInsert) pUp = (*RbuObjIter)(unsafe.Pointer(pIter)).FpRbuUpdate for pUp != 0 { var pTmp uintptr = (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpNext Xsqlite3_finalize(tls, (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpUpdate) Xsqlite3_free(tls, pUp) pUp = pTmp } Xsqlite3_free(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol) Xsqlite3_free(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdxSql) (*RbuObjIter)(unsafe.Pointer(pIter)).FpSelect = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FpInsert = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FpDelete = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FpRbuUpdate = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FpTmpInsert = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FnCol = 0 (*RbuObjIter)(unsafe.Pointer(pIter)).FnIdxCol = 0 (*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol = uintptr(0) (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdxSql = uintptr(0) } func rbuObjIterFinalize(tls *libc.TLS, pIter uintptr) { rbuObjIterClearStatements(tls, pIter) Xsqlite3_finalize(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpTblIter) Xsqlite3_finalize(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpIdxIter) rbuObjIterFreeCols(tls, pIter) libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(RbuObjIter{}))) } func rbuObjIterNext(tls *libc.TLS, p uintptr, pIter uintptr) int32 { var rc int32 = (*Sqlite3rbu)(unsafe.Pointer(p)).Frc if rc == SQLITE_OK { rbuObjIterClearStatements(tls, pIter) if (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx == uintptr(0) { rc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+29309, uintptr(0), uintptr(0), p+64) } if rc == SQLITE_OK { if (*RbuObjIter)(unsafe.Pointer(pIter)).FbCleanup != 0 { rbuObjIterFreeCols(tls, pIter) (*RbuObjIter)(unsafe.Pointer(pIter)).FbCleanup = 0 rc = Xsqlite3_step(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpTblIter) if rc != SQLITE_ROW { rc = resetAndCollectError(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpTblIter, p+64) (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl = uintptr(0) } else { (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl = Xsqlite3_column_text(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpTblIter, 0) (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl = Xsqlite3_column_text(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpTblIter, 1) if (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl != 0 && (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl != 0 { rc = SQLITE_OK } else { rc = SQLITE_NOMEM } } } else { if (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx == uintptr(0) { var pIdx uintptr = (*RbuObjIter)(unsafe.Pointer(pIter)).FpIdxIter rc = Xsqlite3_bind_text(tls, pIdx, 1, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, -1, uintptr(0)) } if rc == SQLITE_OK { rc = Xsqlite3_step(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpIdxIter) if rc != SQLITE_ROW { rc = resetAndCollectError(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpIdxIter, p+64) (*RbuObjIter)(unsafe.Pointer(pIter)).FbCleanup = 1 (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx = uintptr(0) } else { (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx = Xsqlite3_column_text(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpIdxIter, 0) (*RbuObjIter)(unsafe.Pointer(pIter)).FiTnum = Xsqlite3_column_int(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpIdxIter, 1) (*RbuObjIter)(unsafe.Pointer(pIter)).FbUnique = Xsqlite3_column_int(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FpIdxIter, 2) if (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx != 0 { rc = SQLITE_OK } else { rc = SQLITE_NOMEM } } } } } } if rc != SQLITE_OK { rbuObjIterFinalize(tls, pIter) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc } return rc } func rbuTargetNameFunc(tls *libc.TLS, pCtx uintptr, argc int32, argv uintptr) { var p uintptr = Xsqlite3_user_data(tls, pCtx) var zIn uintptr zIn = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(argv))) if zIn != 0 { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { if argc == 1 || 0 == Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) { Xsqlite3_result_text(tls, pCtx, zIn, -1, uintptr(0)) } } else { if libc.Xstrlen(tls, zIn) > uint64(4) && libc.Xmemcmp(tls, ts+26479, zIn, uint64(4)) == 0 { var i int32 for i = 4; int32(*(*int8)(unsafe.Pointer(zIn + uintptr(i)))) >= '0' && int32(*(*int8)(unsafe.Pointer(zIn + uintptr(i)))) <= '9'; i++ { } if int32(*(*int8)(unsafe.Pointer(zIn + uintptr(i)))) == '_' && *(*int8)(unsafe.Pointer(zIn + uintptr(i+1))) != 0 { Xsqlite3_result_text(tls, pCtx, zIn+uintptr(i+1), -1, uintptr(0)) } } } } } func rbuObjIterFirst(tls *libc.TLS, p uintptr, pIter uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(RbuObjIter{}))) rc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, pIter, p+64, Xsqlite3_mprintf(tls, ts+29480, libc.VaList(bp, func() uintptr { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { return ts + 29630 } return ts + 1544 }()))) if rc == SQLITE_OK { rc = prepareAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, pIter+8, p+64, ts+29671) } (*RbuObjIter)(unsafe.Pointer(pIter)).FbCleanup = 1 (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc return rbuObjIterNext(tls, p, pIter) } func rbuMPrintf(tls *libc.TLS, p uintptr, zFmt uintptr, va uintptr) uintptr { var zSql uintptr = uintptr(0) var ap Va_list _ = ap ap = va zSql = Xsqlite3_vmprintf(tls, zFmt, ap) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { if zSql == uintptr(0) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } } else { Xsqlite3_free(tls, zSql) zSql = uintptr(0) } _ = ap return zSql } func rbuMPrintfExec(tls *libc.TLS, p uintptr, db uintptr, zFmt uintptr, va uintptr) int32 { var ap Va_list _ = ap var zSql uintptr ap = va zSql = Xsqlite3_vmprintf(tls, zFmt, ap) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { if zSql == uintptr(0) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } else { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_exec(tls, db, zSql, uintptr(0), uintptr(0), p+64) } } Xsqlite3_free(tls, zSql) _ = ap return (*Sqlite3rbu)(unsafe.Pointer(p)).Frc } func rbuMalloc(tls *libc.TLS, p uintptr, nByte Sqlite3_int64) uintptr { var pRet uintptr = uintptr(0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { pRet = Xsqlite3_malloc64(tls, uint64(nByte)) if pRet == uintptr(0) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } else { libc.Xmemset(tls, pRet, 0, uint64(nByte)) } } return pRet } func rbuAllocateIterArrays(tls *libc.TLS, p uintptr, pIter uintptr, nCol int32) { var nByte Sqlite3_int64 = Sqlite3_int64((uint64(2)*uint64(unsafe.Sizeof(uintptr(0))) + uint64(unsafe.Sizeof(int32(0))) + uint64(3)*uint64(unsafe.Sizeof(U8(0)))) * uint64(nCol)) var azNew uintptr azNew = rbuMalloc(tls, p, nByte) if azNew != 0 { (*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol = azNew (*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType = azNew + uintptr(nCol)*8 (*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder = (*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType + uintptr(nCol)*8 (*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk = (*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder + uintptr(nCol)*4 (*RbuObjIter)(unsafe.Pointer(pIter)).FabNotNull = (*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(nCol) (*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed = (*RbuObjIter)(unsafe.Pointer(pIter)).FabNotNull + uintptr(nCol) } } func rbuStrndup(tls *libc.TLS, zStr uintptr, pRc uintptr) uintptr { var zRet uintptr = uintptr(0) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { if zStr != 0 { var nCopy Size_t = libc.Xstrlen(tls, zStr) + uint64(1) zRet = Xsqlite3_malloc64(tls, nCopy) if zRet != 0 { libc.Xmemcpy(tls, zRet, zStr, nCopy) } else { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } } return zRet } func rbuFinalize(tls *libc.TLS, p uintptr, pStmt uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var db uintptr = Xsqlite3_db_handle(tls, pStmt) var rc int32 = Xsqlite3_finalize(tls, pStmt) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && rc != SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, Xsqlite3_errmsg(tls, db))) } } func rbuTableType(tls *libc.TLS, p uintptr, zTab uintptr, peType uintptr, piTnum uintptr, piPk uintptr) { bp := tls.Alloc(64) defer tls.Free(64) var zOrig uintptr var zIdx uintptr var i uint32 *(*[4]uintptr)(unsafe.Pointer(bp + 32)) = [4]uintptr{uintptr(0), uintptr(0), uintptr(0), uintptr(0)} *(*int32)(unsafe.Pointer(peType)) = RBU_PK_NOTABLE *(*int32)(unsafe.Pointer(piPk)) = 0 (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+32, p+64, Xsqlite3_mprintf(tls, ts+29796, libc.VaList(bp, zTab))) if !((*Sqlite3rbu)(unsafe.Pointer(p)).Frc != SQLITE_OK || Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 32))) != SQLITE_ROW) { goto __1 } goto rbuTableType_end __1: ; if !(Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 32)), 0) != 0) { goto __2 } *(*int32)(unsafe.Pointer(peType)) = RBU_PK_VTAB goto rbuTableType_end __2: ; *(*int32)(unsafe.Pointer(piTnum)) = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 32)), 1) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+32+1*8, p+64, Xsqlite3_mprintf(tls, ts+29915, libc.VaList(bp+8, zTab))) if !((*Sqlite3rbu)(unsafe.Pointer(p)).Frc != 0) { goto __3 } goto rbuTableType_end __3: ; __4: if !(Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 1*8))) == SQLITE_ROW) { goto __5 } zOrig = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 1*8)), 3) zIdx = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 1*8)), 1) if !(zOrig != 0 && zIdx != 0 && int32(*(*U8)(unsafe.Pointer(zOrig))) == 'p') { goto __6 } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+32+2*8, p+64, Xsqlite3_mprintf(tls, ts+29936, libc.VaList(bp+16, zIdx))) if !((*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __7 } if !(Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 2*8))) == SQLITE_ROW) { goto __8 } *(*int32)(unsafe.Pointer(piPk)) = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 2*8)), 0) *(*int32)(unsafe.Pointer(peType)) = RBU_PK_EXTERNAL goto __9 __8: *(*int32)(unsafe.Pointer(peType)) = RBU_PK_WITHOUT_ROWID __9: ; __7: ; goto rbuTableType_end __6: ; goto __4 __5: ; (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+32+3*8, p+64, Xsqlite3_mprintf(tls, ts+29987, libc.VaList(bp+24, zTab))) if !((*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __10 } __11: if !(Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 3*8))) == SQLITE_ROW) { goto __12 } if !(Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 32 + 3*8)), 5) > 0) { goto __13 } *(*int32)(unsafe.Pointer(peType)) = RBU_PK_IPK goto rbuTableType_end __13: ; goto __11 __12: ; *(*int32)(unsafe.Pointer(peType)) = RBU_PK_NONE __10: ; rbuTableType_end: i = uint32(0) __14: if !(uint64(i) < uint64(unsafe.Sizeof([4]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0)))) { goto __16 } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 32 + uintptr(i)*8))) goto __15 __15: i++ goto __14 goto __16 __16: } func rbuObjIterCacheIndexedCols(tls *libc.TLS, p uintptr, pIter uintptr) { bp := tls.Alloc(32) defer tls.Free(32) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var bIndex int32 = 0 if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { libc.Xmemcpy(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed, (*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk, uint64(unsafe.Sizeof(U8(0)))*uint64((*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol)) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+16, p+64, Xsqlite3_mprintf(tls, ts+30008, libc.VaList(bp, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl))) } (*RbuObjIter)(unsafe.Pointer(pIter)).FnIndex = 0 for (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) { var zIdx uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 1) var bPartial int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 4) *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) if zIdx == uintptr(0) { break } if bPartial != 0 { libc.Xmemset(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed, 0x01, uint64(unsafe.Sizeof(U8(0)))*uint64((*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol)) } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+24, p+64, Xsqlite3_mprintf(tls, ts+30036, libc.VaList(bp+8, zIdx))) for (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) { var iCid int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), 1) if iCid >= 0 { *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed + uintptr(iCid))) = U8(1) } if iCid == -2 { libc.Xmemset(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed, 0x01, uint64(unsafe.Sizeof(U8(0)))*uint64((*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol)) } } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 24))) bIndex = 1 (*RbuObjIter)(unsafe.Pointer(pIter)).FnIndex++ } if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_WITHOUT_ROWID { (*RbuObjIter)(unsafe.Pointer(pIter)).FnIndex-- } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 16))) if bIndex == 0 { (*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed = uintptr(0) } } func rbuObjIterCacheTableInfo(tls *libc.TLS, p uintptr, pIter uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) if (*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol == uintptr(0) { *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) var nCol int32 = 0 var i int32 var bRbuRowid int32 = 0 var iOrder int32 = 0 *(*int32)(unsafe.Pointer(bp + 56)) = 0 rbuTableType(tls, p, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, pIter+72, bp+56, pIter+108) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NOTABLE { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+20905, libc.VaList(bp, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl)) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc != 0 { return (*Sqlite3rbu)(unsafe.Pointer(p)).Frc } if (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx == uintptr(0) { (*RbuObjIter)(unsafe.Pointer(pIter)).FiTnum = *(*int32)(unsafe.Pointer(bp + 56)) } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, bp+64, p+64, Xsqlite3_mprintf(tls, ts+30065, libc.VaList(bp+8, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl))) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { nCol = Xsqlite3_column_count(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) rbuAllocateIterArrays(tls, p, pIter, nCol) } for i = 0; (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && i < nCol; i++ { var zName uintptr = Xsqlite3_column_name(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), i) if Xsqlite3_strnicmp(tls, ts+30084, zName, 4) != 0 { var zCopy uintptr = rbuStrndup(tls, zName, p+56) *(*int32)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder + uintptr((*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol)*4)) = (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(libc.PostIncInt32(&(*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol, 1))*8)) = zCopy } else if 0 == Xsqlite3_stricmp(tls, ts+30089, zName) { bRbuRowid = 1 } } Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && libc.Bool32((*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0)) == 0 && bRbuRowid != libc.Bool32((*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_VTAB || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+30099, libc.VaList(bp+16, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, func() uintptr { if bRbuRowid != 0 { return ts + 30128 } return ts + 30141 }())) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+64, p+64, Xsqlite3_mprintf(tls, ts+30150, libc.VaList(bp+32, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl))) } for (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) { var zName uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), 1) if zName == uintptr(0) { break } for i = iOrder; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { if 0 == libc.Xstrcmp(tls, zName, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8))) { break } } if i == (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+30172, libc.VaList(bp+40, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, zName)) } else { var iPk int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), 5) var bNotNull int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), 3) var zType uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), 2) if i != iOrder { { var t int32 = *(*int32)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder + uintptr(i)*4)) *(*int32)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder + uintptr(i)*4)) = *(*int32)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder + uintptr(iOrder)*4)) *(*int32)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder + uintptr(iOrder)*4)) = t } { var t uintptr = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(iOrder)*8)) *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(iOrder)*8)) = t } } *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType + uintptr(iOrder)*8)) = rbuStrndup(tls, zType, p+56) *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(iOrder))) = U8(iPk) *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabNotNull + uintptr(iOrder))) = U8(libc.Bool32(U8(bNotNull) != 0 || iPk != 0)) iOrder++ } } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 64))) rbuObjIterCacheIndexedCols(tls, p, pIter) } return (*Sqlite3rbu)(unsafe.Pointer(p)).Frc } func rbuObjIterGetCollist(tls *libc.TLS, p uintptr, pIter uintptr) uintptr { bp := tls.Alloc(24) defer tls.Free(24) var zList uintptr = uintptr(0) var zSep uintptr = ts + 1544 var i int32 for i = 0; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { var z uintptr = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) zList = rbuMPrintf(tls, p, ts+30199, libc.VaList(bp, zList, zSep, z)) zSep = ts + 15971 } return zList } func rbuObjIterGetPkList(tls *libc.TLS, p uintptr, pIter uintptr, zPre uintptr, zSeparator uintptr, zPost uintptr) uintptr { bp := tls.Alloc(40) defer tls.Free(40) var iPk int32 = 1 var zRet uintptr = uintptr(0) var zSep uintptr = ts + 1544 for 1 != 0 { var i int32 for i = 0; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { if int32(*(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(i)))) == iPk { var zCol uintptr = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) zRet = rbuMPrintf(tls, p, ts+30208, libc.VaList(bp, zRet, zSep, zPre, zCol, zPost)) zSep = zSeparator break } } if i == (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol { break } iPk++ } return zRet } func rbuVacuumTableStart(tls *libc.TLS, p uintptr, pIter uintptr, bRowid int32, zWrite uintptr) uintptr { bp := tls.Alloc(80) defer tls.Free(80) *(*uintptr)(unsafe.Pointer(bp + 72)) = uintptr(0) var zRet uintptr = uintptr(0) if bRowid != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+72, p+64, Xsqlite3_mprintf(tls, ts+30221, libc.VaList(bp, zWrite, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl))) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 72))) { var iMax Sqlite3_int64 = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 72)), 0) zRet = rbuMPrintf(tls, p, ts+30253, libc.VaList(bp+16, iMax)) } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 72))) } else { var zOrder uintptr = rbuObjIterGetPkList(tls, p, pIter, ts+1544, ts+15971, ts+30276) var zSelect uintptr = rbuObjIterGetPkList(tls, p, pIter, ts+30282, ts+30289, ts+6309) var zList uintptr = rbuObjIterGetPkList(tls, p, pIter, ts+1544, ts+15971, ts+1544) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+72, p+64, Xsqlite3_mprintf(tls, ts+30297, libc.VaList(bp+24, zSelect, zWrite, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, zOrder))) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 72))) { var zVal uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 72)), 0) zRet = rbuMPrintf(tls, p, ts+30339, libc.VaList(bp+56, zList, zVal)) } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 72))) } Xsqlite3_free(tls, zOrder) Xsqlite3_free(tls, zSelect) Xsqlite3_free(tls, zList) } return zRet } func rbuVacuumIndexStart(tls *libc.TLS, p uintptr, pIter uintptr) uintptr { bp := tls.Alloc(192) defer tls.Free(192) var zOrder uintptr var zLhs uintptr var zSelect uintptr var zVector uintptr var zRet uintptr var bFailed int32 var zSep uintptr var iCol int32 var i int32 var iCid int32 var zCollate uintptr var zCol uintptr var zQuoted uintptr zOrder = uintptr(0) zLhs = uintptr(0) zSelect = uintptr(0) zVector = uintptr(0) zRet = uintptr(0) bFailed = 0 zSep = ts + 1544 iCol = 0 *(*uintptr)(unsafe.Pointer(bp + 176)) = uintptr(0) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+176, p+64, Xsqlite3_mprintf(tls, ts+30036, libc.VaList(bp, (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx))) __1: if !((*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 176)))) { goto __2 } iCid = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), 1) zCollate = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), 4) if !(Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), 3) != 0) { goto __3 } bFailed = 1 goto __2 __3: ; if !(iCid < 0) { goto __4 } if !((*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_IPK) { goto __6 } i = 0 __8: if !(int32(*(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(i)))) == 0) { goto __10 } goto __9 __9: i++ goto __8 goto __10 __10: ; zCol = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) goto __7 __6: zCol = ts + 30359 __7: ; goto __5 __4: zCol = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(iCid)*8)) __5: ; zLhs = rbuMPrintf(tls, p, ts+30367, libc.VaList(bp+8, zLhs, zSep, zCol, zCollate)) zOrder = rbuMPrintf(tls, p, ts+30388, libc.VaList(bp+40, zOrder, zSep, iCol, zCol, zCollate)) zSelect = rbuMPrintf(tls, p, ts+30424, libc.VaList(bp+80, zSelect, zSep, iCol, zCol)) zSep = ts + 15971 iCol++ goto __1 __2: ; rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 176))) if !(bFailed != 0) { goto __11 } goto index_start_out __11: ; if !((*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __12 } *(*uintptr)(unsafe.Pointer(bp + 184)) = uintptr(0) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+184, p+64, Xsqlite3_mprintf(tls, ts+30451, libc.VaList(bp+112, zSelect, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, zOrder))) if !((*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 184)))) { goto __13 } zSep = ts + 1544 iCol = 0 __14: if !(iCol < (*RbuObjIter)(unsafe.Pointer(pIter)).FnCol) { goto __16 } zQuoted = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 184)), iCol) if !(zQuoted == uintptr(0)) { goto __17 } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM goto __18 __17: if !(int32(*(*int8)(unsafe.Pointer(zQuoted))) == 'N') { goto __19 } bFailed = 1 goto __16 __19: ; __18: ; zVector = rbuMPrintf(tls, p, ts+30499, libc.VaList(bp+136, zVector, zSep, zQuoted)) zSep = ts + 15971 goto __15 __15: iCol++ goto __14 goto __16 __16: ; if !!(bFailed != 0) { goto __20 } zRet = rbuMPrintf(tls, p, ts+30506, libc.VaList(bp+160, zLhs, zVector)) __20: ; __13: ; rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 184))) __12: ; index_start_out: Xsqlite3_free(tls, zOrder) Xsqlite3_free(tls, zSelect) Xsqlite3_free(tls, zVector) Xsqlite3_free(tls, zLhs) return zRet } func rbuObjIterGetIndexCols(tls *libc.TLS, p uintptr, pIter uintptr, pzImposterCols uintptr, pzImposterPk uintptr, pzWhere uintptr, pnBind uintptr) uintptr { bp := tls.Alloc(208) defer tls.Free(208) var rc int32 = (*Sqlite3rbu)(unsafe.Pointer(p)).Frc var rc2 int32 var zRet uintptr = uintptr(0) var zImpCols uintptr = uintptr(0) var zImpPK uintptr = uintptr(0) var zWhere uintptr = uintptr(0) var nBind int32 = 0 var zCom uintptr = ts + 1544 var zAnd uintptr = ts + 1544 *(*uintptr)(unsafe.Pointer(bp + 200)) = uintptr(0) if rc == SQLITE_OK { rc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+200, p+64, Xsqlite3_mprintf(tls, ts+30036, libc.VaList(bp, (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx))) } for rc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 200))) { var iCid int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 200)), 1) var bDesc int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 200)), 3) var zCollate uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 200)), 4) var zCol uintptr = uintptr(0) var zType uintptr if iCid == -2 { var iSeq int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 200)), 0) zRet = Xsqlite3_mprintf(tls, ts+30518, libc.VaList(bp+8, zRet, zCom, (*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol+uintptr(iSeq)*16)).FnSpan, (*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol+uintptr(iSeq)*16)).FzSpan, zCollate)) zType = ts + 1544 } else { if iCid < 0 { if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_IPK { var i int32 for i = 0; int32(*(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(i)))) == 0; i++ { } zCol = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) } else if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { zCol = ts + 30359 } else { zCol = ts + 30089 } zType = ts + 1109 } else { zCol = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(iCid)*8)) zType = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType + uintptr(iCid)*8)) } zRet = Xsqlite3_mprintf(tls, ts+30540, libc.VaList(bp+48, zRet, zCom, zCol, zCollate)) } if (*RbuObjIter)(unsafe.Pointer(pIter)).FbUnique == 0 || Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 200)), 5) != 0 { var zOrder uintptr = func() uintptr { if bDesc != 0 { return ts + 30276 } return ts + 1544 }() zImpPK = Xsqlite3_mprintf(tls, ts+30560, libc.VaList(bp+80, zImpPK, zCom, nBind, zCol, zOrder)) } zImpCols = Xsqlite3_mprintf(tls, ts+30581, libc.VaList(bp+120, zImpCols, zCom, nBind, zCol, zType, zCollate)) zWhere = Xsqlite3_mprintf(tls, ts+30614, libc.VaList(bp+168, zWhere, zAnd, nBind, zCol)) if zRet == uintptr(0) || zImpPK == uintptr(0) || zImpCols == uintptr(0) || zWhere == uintptr(0) { rc = SQLITE_NOMEM } zCom = ts + 15971 zAnd = ts + 22941 nBind++ } rc2 = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 200))) if rc == SQLITE_OK { rc = rc2 } if rc != SQLITE_OK { Xsqlite3_free(tls, zRet) Xsqlite3_free(tls, zImpCols) Xsqlite3_free(tls, zImpPK) Xsqlite3_free(tls, zWhere) zRet = uintptr(0) zImpCols = uintptr(0) zImpPK = uintptr(0) zWhere = uintptr(0) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc } *(*uintptr)(unsafe.Pointer(pzImposterCols)) = zImpCols *(*uintptr)(unsafe.Pointer(pzImposterPk)) = zImpPK *(*uintptr)(unsafe.Pointer(pzWhere)) = zWhere *(*int32)(unsafe.Pointer(pnBind)) = nBind return zRet } func rbuObjIterGetOldlist(tls *libc.TLS, p uintptr, pIter uintptr, zObj uintptr) uintptr { bp := tls.Alloc(64) defer tls.Free(64) var zList uintptr = uintptr(0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed != 0 { var zS uintptr = ts + 1544 var i int32 for i = 0; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { if *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed + uintptr(i))) != 0 { var zCol uintptr = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) zList = Xsqlite3_mprintf(tls, ts+30638, libc.VaList(bp, zList, zS, zObj, zCol)) } else { zList = Xsqlite3_mprintf(tls, ts+30650, libc.VaList(bp+32, zList, zS)) } zS = ts + 15971 if zList == uintptr(0) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM break } } if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE { zList = rbuMPrintf(tls, p, ts+30659, libc.VaList(bp+48, zList, zObj)) } } return zList } func rbuObjIterGetWhere(tls *libc.TLS, p uintptr, pIter uintptr) uintptr { bp := tls.Alloc(80) defer tls.Free(80) var zList uintptr = uintptr(0) if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_VTAB || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE { zList = rbuMPrintf(tls, p, ts+30674, libc.VaList(bp, (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol+1)) } else if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL { var zSep uintptr = ts + 1544 var i int32 for i = 0; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { if *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(i))) != 0 { zList = rbuMPrintf(tls, p, ts+30688, libc.VaList(bp+8, zList, zSep, i, i+1)) zSep = ts + 22941 } } zList = rbuMPrintf(tls, p, ts+30700, libc.VaList(bp+40, zList)) } else { var zSep uintptr = ts + 1544 var i int32 for i = 0; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { if *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(i))) != 0 { var zCol uintptr = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)) zList = rbuMPrintf(tls, p, ts+30750, libc.VaList(bp+48, zList, zSep, zCol, i+1)) zSep = ts + 22941 } } } return zList } func rbuBadControlError(tls *libc.TLS, p uintptr) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+30763, 0) } func rbuObjIterGetSetlist(tls *libc.TLS, p uintptr, pIter uintptr, zMask uintptr) uintptr { bp := tls.Alloc(112) defer tls.Free(112) var zList uintptr = uintptr(0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var i int32 if int32(libc.Xstrlen(tls, zMask)) != (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol { rbuBadControlError(tls, p) } else { var zSep uintptr = ts + 1544 for i = 0; i < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; i++ { var c int8 = *(*int8)(unsafe.Pointer(zMask + uintptr(*(*int32)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaiSrcOrder + uintptr(i)*4))))) if int32(c) == 'x' { zList = rbuMPrintf(tls, p, ts+30750, libc.VaList(bp, zList, zSep, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)), i+1)) zSep = ts + 15971 } else if int32(c) == 'd' { zList = rbuMPrintf(tls, p, ts+30789, libc.VaList(bp+32, zList, zSep, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)), *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)), i+1)) zSep = ts + 15971 } else if int32(c) == 'f' { zList = rbuMPrintf(tls, p, ts+30819, libc.VaList(bp+72, zList, zSep, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)), *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(i)*8)), i+1)) zSep = ts + 15971 } } } } return zList } func rbuObjIterGetBindlist(tls *libc.TLS, p uintptr, nBind int32) uintptr { var zRet uintptr = uintptr(0) var nByte Sqlite3_int64 = int64(2)*Sqlite3_int64(nBind) + int64(1) zRet = rbuMalloc(tls, p, nByte) if zRet != 0 { var i int32 for i = 0; i < nBind; i++ { *(*int8)(unsafe.Pointer(zRet + uintptr(i*2))) = int8('?') *(*int8)(unsafe.Pointer(zRet + uintptr(i*2+1))) = func() int8 { if i+1 == nBind { return int8(0) } return int8(',') }() } } return zRet } func rbuWithoutRowidPK(tls *libc.TLS, p uintptr, pIter uintptr) uintptr { bp := tls.Alloc(72) defer tls.Free(72) var z uintptr = uintptr(0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var zSep uintptr = ts + 30856 *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+56, p+64, Xsqlite3_mprintf(tls, ts+30008, libc.VaList(bp, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl))) for (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 56))) { var zOrig uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 56)), 3) if zOrig != 0 && libc.Xstrcmp(tls, zOrig, ts+17513) == 0 { var zIdx uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 56)), 1) if zIdx != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+64, p+64, Xsqlite3_mprintf(tls, ts+30036, libc.VaList(bp+8, zIdx))) } break } } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 56))) for (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) { if Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), 5) != 0 { var zCol uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), 2) var zDesc uintptr if Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 64)), 3) != 0 { zDesc = ts + 30276 } else { zDesc = ts + 1544 } z = rbuMPrintf(tls, p, ts+30869, libc.VaList(bp+16, z, zSep, zCol, zDesc)) zSep = ts + 15971 } } z = rbuMPrintf(tls, p, ts+30880, libc.VaList(bp+48, z)) rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 64))) } return z } func rbuCreateImposterTable2(tls *libc.TLS, p uintptr, pIter uintptr) { bp := tls.Alloc(184) defer tls.Free(184) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL { var tnum int32 = (*RbuObjIter)(unsafe.Pointer(pIter)).FiPkTnum *(*uintptr)(unsafe.Pointer(bp + 168)) = uintptr(0) var zIdx uintptr = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 176)) = uintptr(0) var zComma uintptr = ts + 1544 var zCols uintptr = uintptr(0) var zPk uintptr = uintptr(0) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+168, p+64, ts+30884) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { Xsqlite3_bind_int(tls, *(*uintptr)(unsafe.Pointer(bp + 168)), 1, tnum) if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 168))) { zIdx = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 168)), 0) } } if zIdx != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp+176, p+64, Xsqlite3_mprintf(tls, ts+30036, libc.VaList(bp, zIdx))) } rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 168))) for (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 176))) { var bKey int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), 5) if bKey != 0 { var iCid int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), 1) var bDesc int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), 3) var zCollate uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), 4) zCols = rbuMPrintf(tls, p, ts+30934, libc.VaList(bp+8, zCols, zComma, iCid, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType + uintptr(iCid)*8)), zCollate)) zPk = rbuMPrintf(tls, p, ts+30956, libc.VaList(bp+48, zPk, zComma, iCid, func() uintptr { if bDesc != 0 { return ts + 30276 } return ts + 1544 }())) zComma = ts + 15971 } } zCols = rbuMPrintf(tls, p, ts+30966, libc.VaList(bp+80, zCols)) rbuFinalize(tls, p, *(*uintptr)(unsafe.Pointer(bp + 176))) Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp+88, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 1, tnum)) rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+30981, libc.VaList(bp+120, zCols, zPk)) Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp+136, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 0, 0)) } } func rbuCreateImposterTable(tls *libc.TLS, p uintptr, pIter uintptr) { bp := tls.Alloc(200) defer tls.Free(200) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*RbuObjIter)(unsafe.Pointer(pIter)).FeType != RBU_PK_VTAB { var tnum int32 = (*RbuObjIter)(unsafe.Pointer(pIter)).FiTnum var zComma uintptr = ts + 1544 var zSql uintptr = uintptr(0) var iCol int32 Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 0, 1)) for iCol = 0; (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && iCol < (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol; iCol++ { var zPk uintptr = ts + 1544 var zCol uintptr = *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblCol + uintptr(iCol)*8)) *(*uintptr)(unsafe.Pointer(bp + 192)) = uintptr(0) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_table_column_metadata(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, zCol, uintptr(0), bp+192, uintptr(0), uintptr(0), uintptr(0)) if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_IPK && *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabTblPk + uintptr(iCol))) != 0 { zPk = ts + 31043 } zSql = rbuMPrintf(tls, p, ts+31056, libc.VaList(bp+32, zSql, zComma, zCol, *(*uintptr)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FazTblType + uintptr(iCol)*8)), zPk, *(*uintptr)(unsafe.Pointer(bp + 192)), func() uintptr { if *(*U8)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FabNotNull + uintptr(iCol))) != 0 { return ts + 31083 } return ts + 1544 }())) zComma = ts + 15971 } if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_WITHOUT_ROWID { var zPk uintptr = rbuWithoutRowidPK(tls, p, pIter) if zPk != 0 { zSql = rbuMPrintf(tls, p, ts+31093, libc.VaList(bp+88, zSql, zPk)) } } Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp+104, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 1, tnum)) rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+31100, libc.VaList(bp+136, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, zSql, func() uintptr { if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_WITHOUT_ROWID { return ts + 31132 } return ts + 1544 }())) Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp+160, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 0, 0)) } } func rbuObjIterPrepareTmpInsert(tls *libc.TLS, p uintptr, pIter uintptr, zCollist uintptr, zRbuRowid uintptr) { bp := tls.Alloc(40) defer tls.Free(40) var bRbuRowid int32 = libc.Bool32((*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE) var zBind uintptr = rbuObjIterGetBindlist(tls, p, (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol+1+bRbuRowid) if zBind != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, pIter+152, p+64, Xsqlite3_mprintf(tls, ts+31147, libc.VaList(bp, p+48, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, zCollist, zRbuRowid, zBind))) } } func rbuTmpInsertFunc(tls *libc.TLS, pCtx uintptr, nVal int32, apVal uintptr) { var p uintptr = Xsqlite3_user_data(tls, pCtx) var rc int32 = SQLITE_OK var i int32 if Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(apVal))) != 0 { *(*I64)(unsafe.Pointer(p + 304)) += I64((*Sqlite3rbu)(unsafe.Pointer(p)).Fobjiter.FnIndex) } for i = 0; rc == SQLITE_OK && i < nVal; i++ { rc = Xsqlite3_bind_value(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).Fobjiter.FpTmpInsert, i+1, *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8))) } if rc == SQLITE_OK { Xsqlite3_step(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).Fobjiter.FpTmpInsert) rc = Xsqlite3_reset(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).Fobjiter.FpTmpInsert) } if rc != SQLITE_OK { Xsqlite3_result_error_code(tls, pCtx, rc) } } func rbuObjIterGetIndexWhere(tls *libc.TLS, p uintptr, pIter uintptr) uintptr { bp := tls.Alloc(12) defer tls.Free(12) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 8)) = (*Sqlite3rbu)(unsafe.Pointer(p)).Frc var zRet uintptr = uintptr(0) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 8)) = prepareAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, bp, p+64, ts+31204) } if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { var rc2 int32 *(*int32)(unsafe.Pointer(bp + 8)) = Xsqlite3_bind_text(tls, *(*uintptr)(unsafe.Pointer(bp)), 1, (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx, -1, uintptr(0)) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) { var zSql uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp)), 0) if zSql != 0 { (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdxSql = libc.AssignUintptr(&zSql, rbuStrndup(tls, zSql, bp+8)) } if zSql != 0 { var nParen int32 = 0 var i int32 var iIdxCol int32 = 0 var nIdxAlloc int32 = 0 for i = 0; *(*int8)(unsafe.Pointer(zSql + uintptr(i))) != 0; i++ { var c int8 = *(*int8)(unsafe.Pointer(zSql + uintptr(i))) if iIdxCol == nIdxAlloc { var aIdxCol uintptr = Xsqlite3_realloc(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol, int32(uint64(nIdxAlloc+16)*uint64(unsafe.Sizeof(RbuSpan{})))) if aIdxCol == uintptr(0) { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_NOMEM break } (*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol = aIdxCol nIdxAlloc = nIdxAlloc + 16 } if int32(c) == '(' { if nParen == 0 { (*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol)).FzSpan = zSql + uintptr(i+1) } nParen++ } else if int32(c) == ')' { nParen-- if nParen == 0 { var nSpan int32 = int32((int64(zSql+uintptr(i)) - int64((*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol+uintptr(iIdxCol)*16)).FzSpan)) / 1) (*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol + uintptr(libc.PostIncInt32(&iIdxCol, 1))*16)).FnSpan = nSpan i++ break } } else if int32(c) == ',' && nParen == 1 { var nSpan int32 = int32((int64(zSql+uintptr(i)) - int64((*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol+uintptr(iIdxCol)*16)).FzSpan)) / 1) (*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol + uintptr(libc.PostIncInt32(&iIdxCol, 1))*16)).FnSpan = nSpan (*RbuSpan)(unsafe.Pointer((*RbuObjIter)(unsafe.Pointer(pIter)).FaIdxCol + uintptr(iIdxCol)*16)).FzSpan = zSql + uintptr(i+1) } else if int32(c) == '"' || int32(c) == '\'' || int32(c) == '`' { for i++; 1 != 0; i++ { if int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i)))) == int32(c) { if int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i+1)))) != int32(c) { break } i++ } } } else if int32(c) == '[' { for i++; 1 != 0; i++ { if int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i)))) == ']' { break } } } else if int32(c) == '-' && int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i+1)))) == '-' { for i = i + 2; *(*int8)(unsafe.Pointer(zSql + uintptr(i))) != 0 && int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i)))) != '\n'; i++ { } if int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i)))) == 0 { break } } else if int32(c) == '/' && int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i+1)))) == '*' { for i = i + 2; *(*int8)(unsafe.Pointer(zSql + uintptr(i))) != 0 && (int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i)))) != '*' || int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i+1)))) != '/'); i++ { } if int32(*(*int8)(unsafe.Pointer(zSql + uintptr(i)))) == 0 { break } i++ } } if *(*int8)(unsafe.Pointer(zSql + uintptr(i))) != 0 { zRet = rbuStrndup(tls, zSql+uintptr(i), bp+8) } (*RbuObjIter)(unsafe.Pointer(pIter)).FnIdxCol = iIdxCol } } rc2 = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 8)) = rc2 } } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = *(*int32)(unsafe.Pointer(bp + 8)) return zRet } func rbuObjIterPrepareAll(tls *libc.TLS, p uintptr, pIter uintptr, nOffset int32) int32 { bp := tls.Alloc(628) defer tls.Free(628) if (*RbuObjIter)(unsafe.Pointer(pIter)).FpSelect == uintptr(0) && rbuObjIterCacheTableInfo(tls, p, pIter) == SQLITE_OK { var tnum int32 = (*RbuObjIter)(unsafe.Pointer(pIter)).FiTnum var zCollist uintptr = uintptr(0) var pz uintptr = p + 64 var zIdx uintptr = (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx var zLimit uintptr = uintptr(0) if nOffset != 0 { zLimit = Xsqlite3_mprintf(tls, ts+31270, libc.VaList(bp, nOffset)) if !(zLimit != 0) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } } if zIdx != 0 { var zTbl uintptr = (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl *(*uintptr)(unsafe.Pointer(bp + 600)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 608)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 616)) = uintptr(0) var zBind uintptr = uintptr(0) var zPart uintptr = uintptr(0) *(*int32)(unsafe.Pointer(bp + 624)) = 0 zPart = rbuObjIterGetIndexWhere(tls, p, pIter) zCollist = rbuObjIterGetIndexCols(tls, p, pIter, bp+600, bp+608, bp+616, bp+624) zBind = rbuObjIterGetBindlist(tls, p, *(*int32)(unsafe.Pointer(bp + 624))) Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp+8, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 0, 1)) Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp+40, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 1, tnum)) rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+31290, libc.VaList(bp+72, zTbl, *(*uintptr)(unsafe.Pointer(bp + 600)), *(*uintptr)(unsafe.Pointer(bp + 608)))) Xsqlite3_test_control(tls, SQLITE_TESTCTRL_IMPOSTER, libc.VaList(bp+96, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, 0, 0)) (*RbuObjIter)(unsafe.Pointer(pIter)).FnCol = *(*int32)(unsafe.Pointer(bp + 624)) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, pIter+136, p+64, Xsqlite3_mprintf(tls, ts+31355, libc.VaList(bp+128, zTbl, zBind))) } if libc.Bool32((*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0)) == 0 && (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, pIter+144, p+64, Xsqlite3_mprintf(tls, ts+31391, libc.VaList(bp+144, zTbl, *(*uintptr)(unsafe.Pointer(bp + 616))))) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var zSql uintptr if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { var zStart uintptr = uintptr(0) if nOffset != 0 { zStart = rbuVacuumIndexStart(tls, p, pIter) if zStart != 0 { Xsqlite3_free(tls, zLimit) zLimit = uintptr(0) } } zSql = Xsqlite3_mprintf(tls, ts+31425, libc.VaList(bp+160, zCollist, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, zPart, func() uintptr { if zStart != 0 { return func() uintptr { if zPart != 0 { return ts + 31486 } return ts + 31490 }() } return ts + 1544 }(), zStart, zCollist, zLimit)) Xsqlite3_free(tls, zStart) } else if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE { zSql = Xsqlite3_mprintf(tls, ts+31496, libc.VaList(bp+216, zCollist, p+48, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, zPart, zCollist, zLimit)) } else { zSql = Xsqlite3_mprintf(tls, ts+31557, libc.VaList(bp+264, zCollist, p+48, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, zPart, zCollist, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, zPart, func() uintptr { if zPart != 0 { return ts + 31486 } return ts + 31490 }(), zCollist, zLimit)) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, pIter+128, pz, zSql) } else { Xsqlite3_free(tls, zSql) } } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 600))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 608))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 616))) Xsqlite3_free(tls, zBind) Xsqlite3_free(tls, zPart) } else { var bRbuRowid int32 = libc.Bool32((*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_VTAB || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL && (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0)) var zTbl uintptr = (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl var zWrite uintptr var zBindings uintptr = rbuObjIterGetBindlist(tls, p, (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol+bRbuRowid) var zWhere uintptr = rbuObjIterGetWhere(tls, p, pIter) var zOldlist uintptr = rbuObjIterGetOldlist(tls, p, pIter, ts+7804) var zNewlist uintptr = rbuObjIterGetOldlist(tls, p, pIter, ts+7800) zCollist = rbuObjIterGetCollist(tls, p, pIter) (*RbuObjIter)(unsafe.Pointer(pIter)).FnCol = (*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol rbuCreateImposterTable(tls, p, pIter) rbuCreateImposterTable2(tls, p, pIter) zWrite = func() uintptr { if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_VTAB { return ts + 1544 } return ts + 31716 }() if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, pIter+136, pz, Xsqlite3_mprintf(tls, ts+31725, libc.VaList(bp+344, zWrite, zTbl, zCollist, func() uintptr { if bRbuRowid != 0 { return ts + 31761 } return ts + 1544 }(), zBindings))) } if libc.Bool32((*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0)) == 0 && (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, pIter+144, pz, Xsqlite3_mprintf(tls, ts+31771, libc.VaList(bp+384, zWrite, zTbl, zWhere))) } if libc.Bool32((*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0)) == 0 && (*RbuObjIter)(unsafe.Pointer(pIter)).FabIndexed != 0 { var zRbuRowid uintptr = ts + 1544 if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE { zRbuRowid = ts + 31799 } rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+31811, libc.VaList(bp+408, p+48, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, func() uintptr { if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL { return ts + 31887 } return ts + 1544 }(), (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl)) rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+31904, libc.VaList(bp+440, zWrite, zTbl, zOldlist, zWrite, zTbl, zOldlist, zWrite, zTbl, zNewlist)) if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_EXTERNAL || (*RbuObjIter)(unsafe.Pointer(pIter)).FeType == RBU_PK_NONE { rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+32203, libc.VaList(bp+512, zWrite, zTbl, zNewlist)) } rbuObjIterPrepareTmpInsert(tls, p, pIter, zCollist, zRbuRowid) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var zRbuRowid uintptr = ts + 1544 var zStart uintptr = uintptr(0) var zOrder uintptr = uintptr(0) if bRbuRowid != 0 { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { zRbuRowid = ts + 32302 } else { zRbuRowid = ts + 32312 } } if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { if nOffset != 0 { zStart = rbuVacuumTableStart(tls, p, pIter, bRbuRowid, zWrite) if zStart != 0 { Xsqlite3_free(tls, zLimit) zLimit = uintptr(0) } } if bRbuRowid != 0 { zOrder = rbuMPrintf(tls, p, ts+30359, 0) } else { zOrder = rbuObjIterGetPkList(tls, p, pIter, ts+1544, ts+15971, ts+1544) } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, pIter+128, pz, Xsqlite3_mprintf(tls, ts+32323, libc.VaList(bp+536, zCollist, func() uintptr { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { return ts + 32371 } return ts + 1544 }(), zRbuRowid, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, func() uintptr { if zStart != 0 { return zStart } return ts + 1544 }(), func() uintptr { if zOrder != 0 { return ts + 24275 } return ts + 1544 }(), zOrder, zLimit))) } Xsqlite3_free(tls, zStart) Xsqlite3_free(tls, zOrder) } Xsqlite3_free(tls, zWhere) Xsqlite3_free(tls, zOldlist) Xsqlite3_free(tls, zNewlist) Xsqlite3_free(tls, zBindings) } Xsqlite3_free(tls, zCollist) Xsqlite3_free(tls, zLimit) } return (*Sqlite3rbu)(unsafe.Pointer(p)).Frc } func rbuGetUpdateStmt(tls *libc.TLS, p uintptr, pIter uintptr, zMask uintptr, ppStmt uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var pp uintptr var pUp uintptr = uintptr(0) var nUp int32 = 0 *(*uintptr)(unsafe.Pointer(ppStmt)) = uintptr(0) for pp = pIter + 184; *(*uintptr)(unsafe.Pointer(pp)) != 0; pp = *(*uintptr)(unsafe.Pointer(pp)) + 16 { pUp = *(*uintptr)(unsafe.Pointer(pp)) if libc.Xstrcmp(tls, (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FzMask, zMask) == 0 { *(*uintptr)(unsafe.Pointer(pp)) = (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpNext (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpNext = (*RbuObjIter)(unsafe.Pointer(pIter)).FpRbuUpdate (*RbuObjIter)(unsafe.Pointer(pIter)).FpRbuUpdate = pUp *(*uintptr)(unsafe.Pointer(ppStmt)) = (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpUpdate return SQLITE_OK } nUp++ } if nUp >= SQLITE_RBU_UPDATE_CACHESIZE { for pp = pIter + 184; *(*uintptr)(unsafe.Pointer(pp)) != pUp; pp = *(*uintptr)(unsafe.Pointer(pp)) + 16 { } *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) Xsqlite3_finalize(tls, (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpUpdate) (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpUpdate = uintptr(0) } else { pUp = rbuMalloc(tls, p, int64(uint64(unsafe.Sizeof(RbuUpdateStmt{}))+uint64((*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol)+uint64(1))) } if pUp != 0 { var zWhere uintptr = rbuObjIterGetWhere(tls, p, pIter) var zSet uintptr = rbuObjIterGetSetlist(tls, p, pIter, zMask) var zUpdate uintptr = uintptr(0) (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FzMask = pUp + 1*24 libc.Xmemcpy(tls, (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FzMask, zMask, uint64((*RbuObjIter)(unsafe.Pointer(pIter)).FnTblCol)) (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpNext = (*RbuObjIter)(unsafe.Pointer(pIter)).FpRbuUpdate (*RbuObjIter)(unsafe.Pointer(pIter)).FpRbuUpdate = pUp if zSet != 0 { var zPrefix uintptr = ts + 1544 if (*RbuObjIter)(unsafe.Pointer(pIter)).FeType != RBU_PK_VTAB { zPrefix = ts + 31716 } zUpdate = Xsqlite3_mprintf(tls, ts+32377, libc.VaList(bp, zPrefix, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, zSet, zWhere)) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, pUp+8, p+64, zUpdate) *(*uintptr)(unsafe.Pointer(ppStmt)) = (*RbuUpdateStmt)(unsafe.Pointer(pUp)).FpUpdate } Xsqlite3_free(tls, zWhere) Xsqlite3_free(tls, zSet) } return (*Sqlite3rbu)(unsafe.Pointer(p)).Frc } func rbuOpenDbhandle(tls *libc.TLS, p uintptr, zName uintptr, bUseVfs int32) uintptr { bp := tls.Alloc(16) defer tls.Free(16) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var flags int32 = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_URI (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_open_v2(tls, zName, bp+8, flags, func() uintptr { if bUseVfs != 0 { return (*Sqlite3rbu)(unsafe.Pointer(p)).FzVfsName } return uintptr(0) }()) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, Xsqlite3_errmsg(tls, *(*uintptr)(unsafe.Pointer(bp + 8))))) Xsqlite3_close(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) } } return *(*uintptr)(unsafe.Pointer(bp + 8)) } func rbuFreeState(tls *libc.TLS, p uintptr) { if p != 0 { Xsqlite3_free(tls, (*RbuState)(unsafe.Pointer(p)).FzTbl) Xsqlite3_free(tls, (*RbuState)(unsafe.Pointer(p)).FzDataTbl) Xsqlite3_free(tls, (*RbuState)(unsafe.Pointer(p)).FzIdx) Xsqlite3_free(tls, p) } } func rbuLoadState(tls *libc.TLS, p uintptr) uintptr { bp := tls.Alloc(20) defer tls.Free(20) var pRet uintptr = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var rc2 int32 pRet = rbuMalloc(tls, p, int64(unsafe.Sizeof(RbuState{}))) if pRet == uintptr(0) { return uintptr(0) } *(*int32)(unsafe.Pointer(bp + 16)) = prepareFreeAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, bp+8, p+64, Xsqlite3_mprintf(tls, ts+32407, libc.VaList(bp, p+48))) for *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) { switch Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 0) { case RBU_STATE_STAGE: (*RbuState)(unsafe.Pointer(pRet)).FeStage = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1) if (*RbuState)(unsafe.Pointer(pRet)).FeStage != RBU_STAGE_OAL && (*RbuState)(unsafe.Pointer(pRet)).FeStage != RBU_STAGE_MOVE && (*RbuState)(unsafe.Pointer(pRet)).FeStage != RBU_STAGE_CKPT { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT } break case RBU_STATE_TBL: (*RbuState)(unsafe.Pointer(pRet)).FzTbl = rbuStrndup(tls, Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1), bp+16) break case RBU_STATE_IDX: (*RbuState)(unsafe.Pointer(pRet)).FzIdx = rbuStrndup(tls, Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1), bp+16) break case RBU_STATE_ROW: (*RbuState)(unsafe.Pointer(pRet)).FnRow = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1) break case RBU_STATE_PROGRESS: (*RbuState)(unsafe.Pointer(pRet)).FnProgress = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1) break case RBU_STATE_CKPT: (*RbuState)(unsafe.Pointer(pRet)).FiWalCksum = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1) break case RBU_STATE_COOKIE: (*RbuState)(unsafe.Pointer(pRet)).FiCookie = U32(Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1)) break case RBU_STATE_OALSZ: (*RbuState)(unsafe.Pointer(pRet)).FiOalSz = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1) break case RBU_STATE_PHASEONESTEP: (*RbuState)(unsafe.Pointer(pRet)).FnPhaseOneStep = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1) break case RBU_STATE_DATATBL: (*RbuState)(unsafe.Pointer(pRet)).FzDataTbl = rbuStrndup(tls, Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 1), bp+16) break default: *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_CORRUPT break } } rc2 = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = rc2 } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = *(*int32)(unsafe.Pointer(bp + 16)) return pRet } func rbuOpenDatabase(tls *libc.TLS, p uintptr, dbMain uintptr, pbRetry uintptr) { bp := tls.Alloc(56) defer tls.Free(56) (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu = rbuOpenDbhandle(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FzRbu, 1) (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain = dbMain if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { Xsqlite3_file_control(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+7793, SQLITE_FCNTL_RBUCNT, p) if (*Sqlite3rbu)(unsafe.Pointer(p)).FzState == uintptr(0) { var zFile uintptr = Xsqlite3_db_filename(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+7793) (*Sqlite3rbu)(unsafe.Pointer(p)).FzState = rbuMPrintf(tls, p, ts+32437, libc.VaList(bp, zFile, zFile)) } } if (*Sqlite3rbu)(unsafe.Pointer(p)).FzState != 0 { rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+32465, libc.VaList(bp+16, (*Sqlite3rbu)(unsafe.Pointer(p)).FzState)) libc.Xmemcpy(tls, p+48, ts+14829, uint64(4)) } else { libc.Xmemcpy(tls, p+48, ts+7793, uint64(4)) } rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+32483, libc.VaList(bp+24, p+48)) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { var bOpen int32 = 0 var rc int32 (*Sqlite3rbu)(unsafe.Pointer(p)).FnRbu = 0 (*Sqlite3rbu)(unsafe.Pointer(p)).FpRbuFd = uintptr(0) rc = Xsqlite3_file_control(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+7793, SQLITE_FCNTL_RBUCNT, p) if rc != SQLITE_NOTFOUND { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc } if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage >= RBU_STAGE_MOVE { bOpen = 1 } else { var pState uintptr = rbuLoadState(tls, p) if pState != 0 { bOpen = libc.Bool32((*RbuState)(unsafe.Pointer(pState)).FeStage >= RBU_STAGE_MOVE) rbuFreeState(tls, pState) } } if bOpen != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain = rbuOpenDbhandle(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FzRbu, libc.Bool32((*Sqlite3rbu)(unsafe.Pointer(p)).FnRbu <= 1)) } } (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = 0 if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain == uintptr(0) { if !((*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0)) { (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain = rbuOpenDbhandle(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget, 1) } else if (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpRbuFd)).FpWalFd != 0 { if pbRetry != 0 { (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpRbuFd)).FbNolock = U8(0) Xsqlite3_close(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu) Xsqlite3_close(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain) (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain = uintptr(0) (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu = uintptr(0) *(*int32)(unsafe.Pointer(pbRetry)) = 1 return } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+32549, 0) } else { var zTarget uintptr var zExtra uintptr = uintptr(0) if libc.Xstrlen(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzRbu) >= uint64(5) && 0 == libc.Xmemcmp(tls, ts+25622, (*Sqlite3rbu)(unsafe.Pointer(p)).FzRbu, uint64(5)) { zExtra = (*Sqlite3rbu)(unsafe.Pointer(p)).FzRbu + 5 for *(*int8)(unsafe.Pointer(zExtra)) != 0 { if int32(*(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zExtra, 1)))) == '?' { break } } if int32(*(*int8)(unsafe.Pointer(zExtra))) == 0 { zExtra = uintptr(0) } } zTarget = Xsqlite3_mprintf(tls, ts+32581, libc.VaList(bp+32, Xsqlite3_db_filename(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+7793), func() uintptr { if zExtra == uintptr(0) { return ts + 1544 } return ts + 32613 }(), func() uintptr { if zExtra == uintptr(0) { return ts + 1544 } return zExtra }())) if zTarget == uintptr(0) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM return } (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain = rbuOpenDbhandle(tls, p, zTarget, libc.Bool32((*Sqlite3rbu)(unsafe.Pointer(p)).FnRbu <= 1)) Xsqlite3_free(tls, zTarget) } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_create_function(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+32615, -1, SQLITE_UTF8, p, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{rbuTmpInsertFunc})), uintptr(0), uintptr(0)) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_create_function(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+32630, 2, SQLITE_UTF8, uintptr(0), *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{rbuFossilDeltaFunc})), uintptr(0), uintptr(0)) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_create_function(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+32647, -1, SQLITE_UTF8, p, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{rbuTargetNameFunc})), uintptr(0), uintptr(0)) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_file_control(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, SQLITE_FCNTL_RBU, p) } rbuMPrintfExec(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+32663, 0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_file_control(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, SQLITE_FCNTL_RBU, p) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_NOTFOUND { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+32691, 0) } } func rbuFileSuffix3(tls *libc.TLS, zBase uintptr, z uintptr) { } func rbuShmChecksum(tls *libc.TLS, p uintptr) I64 { bp := tls.Alloc(8) defer tls.Free(8) var iRet I64 = int64(0) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var pDb uintptr = (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd)).FpReal (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = (*struct { f func(*libc.TLS, uintptr, int32, int32, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pDb)).FpMethods)).FxShmMap})).f(tls, pDb, 0, 32*1024, 0, bp) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { iRet = I64(*(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)) + 10*4)))<<32 + I64(*(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)) + 11*4))) } } return iRet } func rbuSetupCheckpoint(tls *libc.TLS, p uintptr, pState uintptr) { if pState == uintptr(0) { (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = 0 if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+32663, uintptr(0), uintptr(0), uintptr(0)) } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var rc2 int32 (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_CAPTURE rc2 = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+32709, uintptr(0), uintptr(0), uintptr(0)) if rc2 != SQLITE_NOTICE { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc2 } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FnFrame > 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_CKPT (*Sqlite3rbu)(unsafe.Pointer(p)).FnStep = func() int32 { if pState != 0 { return (*RbuState)(unsafe.Pointer(pState)).FnRow } return 0 }() (*Sqlite3rbu)(unsafe.Pointer(p)).FaBuf = rbuMalloc(tls, p, int64((*Sqlite3rbu)(unsafe.Pointer(p)).Fpgsz)) (*Sqlite3rbu)(unsafe.Pointer(p)).FiWalCksum = rbuShmChecksum(tls, p) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { if (*Sqlite3rbu)(unsafe.Pointer(p)).FnFrame == 0 || pState != 0 && (*RbuState)(unsafe.Pointer(pState)).FiWalCksum != (*Sqlite3rbu)(unsafe.Pointer(p)).FiWalCksum { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_DONE (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_DONE } else { var nSectorSize int32 var pDb uintptr = (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd)).FpReal var pWal uintptr = (*Rbu_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd)).FpWalFd)).FpReal nSectorSize = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pDb)).FpMethods)).FxSectorSize})).f(tls, pDb) if nSectorSize > (*Sqlite3rbu)(unsafe.Pointer(p)).Fpgsz { (*Sqlite3rbu)(unsafe.Pointer(p)).FnPagePerSector = nSectorSize / (*Sqlite3rbu)(unsafe.Pointer(p)).Fpgsz } else { (*Sqlite3rbu)(unsafe.Pointer(p)).FnPagePerSector = 1 } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pWal)).FpMethods)).FxSync})).f(tls, pWal, SQLITE_SYNC_NORMAL) } } } func rbuCaptureWalRead(tls *libc.TLS, pRbu uintptr, iOff I64, iAmt int32) int32 { var mReq U32 = U32(int32(1)<= (*Sqlite3rbu)(unsafe.Pointer(p)).FnFrame { var pDb uintptr = (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd)).FpReal (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pDb)).FpMethods)).FxSync})).f(tls, pDb, SQLITE_SYNC_NORMAL) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = (*struct { f func(*libc.TLS, uintptr, int32, int32, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pDb)).FpMethods)).FxShmMap})).f(tls, pDb, 0, 32*1024, 0, bp+16) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { *(*U32)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)) + 24*4)) = (*Sqlite3rbu)(unsafe.Pointer(p)).FiMaxFrame } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_DONE (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_DONE } } else { var iSector U32 for __ccgo := true; __ccgo; __ccgo = (*Sqlite3rbu)(unsafe.Pointer(p)).FnStep < (*Sqlite3rbu)(unsafe.Pointer(p)).FnFrame && iSector == ((*RbuFrame)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FaFrame+uintptr((*Sqlite3rbu)(unsafe.Pointer(p)).FnStep)*8)).FiDbPage-U32(1))/U32((*Sqlite3rbu)(unsafe.Pointer(p)).FnPagePerSector) && (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var pFrame uintptr = (*Sqlite3rbu)(unsafe.Pointer(p)).FaFrame + uintptr((*Sqlite3rbu)(unsafe.Pointer(p)).FnStep)*8 iSector = ((*RbuFrame)(unsafe.Pointer(pFrame)).FiDbPage - U32(1)) / U32((*Sqlite3rbu)(unsafe.Pointer(p)).FnPagePerSector) rbuCheckpointFrame(tls, p, pFrame) (*Sqlite3rbu)(unsafe.Pointer(p)).FnStep++ } } (*Sqlite3rbu)(unsafe.Pointer(p)).FnProgress++ } break } fallthrough default: break } return (*Sqlite3rbu)(unsafe.Pointer(p)).Frc } else { return SQLITE_NOMEM } return int32(0) } func rbuStrCompare(tls *libc.TLS, z1 uintptr, z2 uintptr) int32 { if z1 == uintptr(0) && z2 == uintptr(0) { return 0 } if z1 == uintptr(0) || z2 == uintptr(0) { return 1 } return libc.Bool32(Xsqlite3_stricmp(tls, z1, z2) != 0) } func rbuSetupOal(tls *libc.TLS, p uintptr, pState uintptr) { if (*RbuState)(unsafe.Pointer(pState)).FzTbl != 0 { var pIter uintptr = p + 80 var rc int32 = SQLITE_OK for rc == SQLITE_OK && (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl != 0 && ((*RbuObjIter)(unsafe.Pointer(pIter)).FbCleanup != 0 || rbuStrCompare(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FzIdx, (*RbuState)(unsafe.Pointer(pState)).FzIdx) != 0 || (*RbuState)(unsafe.Pointer(pState)).FzDataTbl == uintptr(0) && rbuStrCompare(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl, (*RbuState)(unsafe.Pointer(pState)).FzTbl) != 0 || (*RbuState)(unsafe.Pointer(pState)).FzDataTbl != 0 && rbuStrCompare(tls, (*RbuObjIter)(unsafe.Pointer(pIter)).FzDataTbl, (*RbuState)(unsafe.Pointer(pState)).FzDataTbl) != 0) { rc = rbuObjIterNext(tls, p, pIter) } if rc == SQLITE_OK && !(int32((*RbuObjIter)(unsafe.Pointer(pIter)).FzTbl) != 0) { rc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+33320, 0) } if rc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).FnStep = (*RbuState)(unsafe.Pointer(pState)).FnRow rc = rbuObjIterPrepareAll(tls, p, p+80, (*Sqlite3rbu)(unsafe.Pointer(p)).FnStep) } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc } } func rbuDeleteOalFile(tls *libc.TLS, p uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var zOal uintptr = rbuMPrintf(tls, p, ts+32769, libc.VaList(bp, (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget)) if zOal != 0 { *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) Xsqlite3_file_control(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+7793, SQLITE_FCNTL_VFS_POINTER, bp+8) (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FxDelete})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), zOal, 0) Xsqlite3_free(tls, zOal) } } func rbuCreateVfs(tls *libc.TLS, p uintptr) { bp := tls.Alloc(76) defer tls.Free(76) Xsqlite3_randomness(tls, int32(unsafe.Sizeof(int32(0))), bp+8) Xsqlite3_snprintf(tls, int32(unsafe.Sizeof([64]int8{})), bp+12, ts+33345, libc.VaList(bp, *(*int32)(unsafe.Pointer(bp + 8)))) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3rbu_create_vfs(tls, bp+12, uintptr(0)) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var pVfs uintptr = Xsqlite3_vfs_find(tls, bp+12) (*Sqlite3rbu)(unsafe.Pointer(p)).FzVfsName = (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FzName (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRbu = p } } func rbuDeleteVfs(tls *libc.TLS, p uintptr) { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzVfsName != 0 { Xsqlite3rbu_destroy_vfs(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzVfsName) (*Sqlite3rbu)(unsafe.Pointer(p)).FzVfsName = uintptr(0) } } func rbuIndexCntFunc(tls *libc.TLS, pCtx uintptr, nVal int32, apVal uintptr) { bp := tls.Alloc(24) defer tls.Free(24) var p uintptr = Xsqlite3_user_data(tls, pCtx) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var rc int32 var db uintptr = func() uintptr { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { return (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu } return (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain }() rc = prepareFreeAndCollectError(tls, db, bp+8, bp+16, Xsqlite3_mprintf(tls, ts+33356, libc.VaList(bp, Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal)))))) if rc != SQLITE_OK { Xsqlite3_result_error(tls, pCtx, *(*uintptr)(unsafe.Pointer(bp + 16)), -1) } else { var nIndex int32 = 0 if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) { nIndex = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), 0) } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) if rc == SQLITE_OK { Xsqlite3_result_int(tls, pCtx, nIndex) } else { Xsqlite3_result_error(tls, pCtx, Xsqlite3_errmsg(tls, db), -1) } } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) } func rbuInitPhaseOneSteps(tls *libc.TLS, p uintptr) { bp := tls.Alloc(8) defer tls.Free(8) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var bExists int32 = 0 (*Sqlite3rbu)(unsafe.Pointer(p)).FnPhaseOneStep = int64(-1) (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_create_function(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+33428, 1, SQLITE_UTF8, p, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{rbuIndexCntFunc})), uintptr(0), uintptr(0)) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, bp, p+64, ts+33442) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) { bExists = 1 } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && bExists != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = prepareAndCollectError(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, bp, p+64, ts+33499) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) { (*Sqlite3rbu)(unsafe.Pointer(p)).FnPhaseOneStep = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp)), 0) } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) } } } } func openRbuHandle(tls *libc.TLS, zTarget uintptr, zRbu uintptr, zState uintptr) uintptr { bp := tls.Alloc(20) defer tls.Free(20) var p uintptr var nTarget Size_t if zTarget != 0 { nTarget = libc.Xstrlen(tls, zTarget) } else { nTarget = uint64(0) } var nRbu Size_t = libc.Xstrlen(tls, zRbu) var nByte Size_t = uint64(unsafe.Sizeof(Sqlite3rbu{})) + nTarget + uint64(1) + nRbu + uint64(1) p = Xsqlite3_malloc64(tls, nByte) if p != 0 { var pState uintptr = uintptr(0) libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(Sqlite3rbu{}))) Xsqlite3rbu_rename_handler(tls, p, uintptr(0), uintptr(0)) rbuCreateVfs(tls, p) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var pCsr uintptr = p + 1*408 *(*int32)(unsafe.Pointer(bp + 16)) = 0 if zTarget != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget = pCsr libc.Xmemcpy(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget, zTarget, nTarget+uint64(1)) pCsr += uintptr(nTarget + uint64(1)) } (*Sqlite3rbu)(unsafe.Pointer(p)).FzRbu = pCsr libc.Xmemcpy(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzRbu, zRbu, nRbu+uint64(1)) pCsr += uintptr(nRbu + uint64(1)) if zState != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).FzState = rbuMPrintf(tls, p, ts+4493, libc.VaList(bp, zState)) } rbuOpenDatabase(tls, p, uintptr(0), bp+16) if *(*int32)(unsafe.Pointer(bp + 16)) != 0 { rbuOpenDatabase(tls, p, uintptr(0), uintptr(0)) } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { pState = rbuLoadState(tls, p) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { if (*RbuState)(unsafe.Pointer(pState)).FeStage == 0 { rbuDeleteOalFile(tls, p) rbuInitPhaseOneSteps(tls, p) (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_OAL } else { (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = (*RbuState)(unsafe.Pointer(pState)).FeStage (*Sqlite3rbu)(unsafe.Pointer(p)).FnPhaseOneStep = (*RbuState)(unsafe.Pointer(pState)).FnPhaseOneStep } (*Sqlite3rbu)(unsafe.Pointer(p)).FnProgress = int32((*RbuState)(unsafe.Pointer(pState)).FnProgress) (*Sqlite3rbu)(unsafe.Pointer(p)).FiOalSz = (*RbuState)(unsafe.Pointer(pState)).FiOalSz } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd)).FpWalFd != 0 { if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_OAL { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+33573, 0) } else if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_MOVE { (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_CKPT (*Sqlite3rbu)(unsafe.Pointer(p)).FnStep = 0 } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && ((*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_OAL || (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_MOVE) && (*RbuState)(unsafe.Pointer(pState)).FeStage != 0 { var pFd uintptr = func() uintptr { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { return (*Sqlite3rbu)(unsafe.Pointer(p)).FpRbuFd } return (*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd }() if (*Rbu_file)(unsafe.Pointer(pFd)).FiCookie != (*RbuState)(unsafe.Pointer(pState)).FiCookie { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_BUSY (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg = Xsqlite3_mprintf(tls, ts+33605, libc.VaList(bp+8, func() uintptr { if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { return ts + 33637 } return ts + 33644 }())) } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_OAL { var db uintptr = (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+15860, uintptr(0), uintptr(0), p+64) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rbuObjIterFirst(tls, p, p+80) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).Fobjiter.FzTbl == uintptr(0) { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_DONE (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_DONE } else { if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*RbuState)(unsafe.Pointer(pState)).FeStage == 0 && (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { rbuCopyPragma(tls, p, ts+18333) rbuCopyPragma(tls, p, ts+17724) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_exec(tls, db, ts+33651, uintptr(0), uintptr(0), p+64) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { var frc int32 = Xsqlite3_file_control(tls, db, ts+7793, SQLITE_FCNTL_ZIPVFS, uintptr(0)) if frc == SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_exec(tls, db, ts+33667, uintptr(0), uintptr(0), p+64) } } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK { rbuSetupOal(tls, p, pState) } } } else if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_MOVE { } else if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_CKPT { if !((*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0)) && rbuExclusiveCheckpoint(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain) != 0 { (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_DONE rbuLockDatabase(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain) (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage = RBU_STAGE_CKPT } rbuSetupCheckpoint(tls, p, pState) } else if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_DONE { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_DONE } else { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT } } rbuFreeState(tls, pState) } return p } func rbuMisuseError(tls *libc.TLS) uintptr { var pRet uintptr pRet = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(Sqlite3rbu{}))) if pRet != 0 { libc.Xmemset(tls, pRet, 0, uint64(unsafe.Sizeof(Sqlite3rbu{}))) (*Sqlite3rbu)(unsafe.Pointer(pRet)).Frc = SQLITE_MISUSE } return pRet } // Open and return a new RBU handle. func Xsqlite3rbu_open(tls *libc.TLS, zTarget uintptr, zRbu uintptr, zState uintptr) uintptr { if zTarget == uintptr(0) || zRbu == uintptr(0) { return rbuMisuseError(tls) } return openRbuHandle(tls, zTarget, zRbu, zState) } // Open a handle to begin or resume an RBU VACUUM operation. func Xsqlite3rbu_vacuum(tls *libc.TLS, zTarget uintptr, zState uintptr) uintptr { if zTarget == uintptr(0) { return rbuMisuseError(tls) } if zState != 0 { var n int32 = int32(libc.Xstrlen(tls, zState)) if n >= 7 && 0 == libc.Xmemcmp(tls, ts+33691, zState+uintptr(n-7), uint64(7)) { return rbuMisuseError(tls) } } return openRbuHandle(tls, uintptr(0), zTarget, zState) } // Return the database handle used by pRbu. func Xsqlite3rbu_db(tls *libc.TLS, pRbu uintptr, bRbu int32) uintptr { var db uintptr = uintptr(0) if pRbu != 0 { db = func() uintptr { if bRbu != 0 { return (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FdbRbu } return (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FdbMain }() } return db } func rbuEditErrmsg(tls *libc.TLS, p uintptr) { if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_CONSTRAINT && (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg != 0 { var i uint32 var nErrmsg Size_t = libc.Xstrlen(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg) for i = uint32(0); Size_t(i) < nErrmsg-uint64(8); i++ { if libc.Xmemcmp(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg+uintptr(i), ts+31716, uint64(8)) == 0 { var nDel int32 = 8 for int32(*(*int8)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg + uintptr(i+uint32(nDel))))) >= '0' && int32(*(*int8)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg + uintptr(i+uint32(nDel))))) <= '9' { nDel++ } libc.Xmemmove(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg+uintptr(i), (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg+uintptr(i+uint32(nDel)), nErrmsg+uint64(1)-Size_t(i)-Size_t(nDel)) nErrmsg = nErrmsg - Size_t(nDel) } } } } // Close the RBU handle. func Xsqlite3rbu_close(tls *libc.TLS, p uintptr, pzErrmsg uintptr) int32 { var rc int32 if p != 0 { if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_OAL { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+15875, uintptr(0), uintptr(0), p+64) } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_CKPT { var pDb uintptr = (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd)).FpReal (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pDb)).FpMethods)).FxSync})).f(tls, pDb, SQLITE_SYNC_NORMAL) } rbuSaveState(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_OAL { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+15875, uintptr(0), uintptr(0), p+64) } rbuObjIterFinalize(tls, p+80) if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) && (*Sqlite3rbu)(unsafe.Pointer(p)).Frc != SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu != 0 { var rc2 int32 = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+33699, uintptr(0), uintptr(0), uintptr(0)) if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc == SQLITE_DONE && rc2 != SQLITE_OK { (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc2 } } Xsqlite3_close(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu) Xsqlite3_close(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain) rbuDeleteVfs(tls, p) Xsqlite3_free(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FaBuf) Xsqlite3_free(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FaFrame) rbuEditErrmsg(tls, p) rc = (*Sqlite3rbu)(unsafe.Pointer(p)).Frc if pzErrmsg != 0 { *(*uintptr)(unsafe.Pointer(pzErrmsg)) = (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg } else { Xsqlite3_free(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzErrmsg) } Xsqlite3_free(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FzState) Xsqlite3_free(tls, p) } else { rc = SQLITE_NOMEM *(*uintptr)(unsafe.Pointer(pzErrmsg)) = uintptr(0) } return rc } // Return the total number of key-value operations (inserts, deletes or // updates) that have been performed on the target database since the // current RBU update was started. func Xsqlite3rbu_progress(tls *libc.TLS, pRbu uintptr) Sqlite3_int64 { return Sqlite3_int64((*Sqlite3rbu)(unsafe.Pointer(pRbu)).FnProgress) } // Return permyriadage progress indications for the two main stages of // an RBU update. func Xsqlite3rbu_bp_progress(tls *libc.TLS, p uintptr, pnOne uintptr, pnTwo uintptr) { var MAX_PROGRESS int32 = 10000 switch (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage { case RBU_STAGE_OAL: if (*Sqlite3rbu)(unsafe.Pointer(p)).FnPhaseOneStep > int64(0) { *(*int32)(unsafe.Pointer(pnOne)) = int32(I64(MAX_PROGRESS) * I64((*Sqlite3rbu)(unsafe.Pointer(p)).FnProgress) / (*Sqlite3rbu)(unsafe.Pointer(p)).FnPhaseOneStep) } else { *(*int32)(unsafe.Pointer(pnOne)) = -1 } *(*int32)(unsafe.Pointer(pnTwo)) = 0 break case RBU_STAGE_MOVE: *(*int32)(unsafe.Pointer(pnOne)) = MAX_PROGRESS *(*int32)(unsafe.Pointer(pnTwo)) = 0 break case RBU_STAGE_CKPT: *(*int32)(unsafe.Pointer(pnOne)) = MAX_PROGRESS *(*int32)(unsafe.Pointer(pnTwo)) = int32(I64(MAX_PROGRESS) * I64((*Sqlite3rbu)(unsafe.Pointer(p)).FnStep) / I64((*Sqlite3rbu)(unsafe.Pointer(p)).FnFrame)) break case RBU_STAGE_DONE: *(*int32)(unsafe.Pointer(pnOne)) = MAX_PROGRESS *(*int32)(unsafe.Pointer(pnTwo)) = MAX_PROGRESS break default: } } // Return the current state of the RBU vacuum or update operation. func Xsqlite3rbu_state(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) *(*[6]int32)(unsafe.Pointer(bp)) = [6]int32{ 0, SQLITE_RBU_STATE_OAL, SQLITE_RBU_STATE_MOVE, 0, SQLITE_RBU_STATE_CHECKPOINT, SQLITE_RBU_STATE_DONE, } if (*Sqlite3rbu)(unsafe.Pointer(p)).Frc != SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).Frc != SQLITE_DONE { return SQLITE_RBU_STATE_ERROR } else { return *(*int32)(unsafe.Pointer(bp + uintptr((*Sqlite3rbu)(unsafe.Pointer(p)).FeStage)*4)) } return int32(0) } func Xsqlite3rbu_savestate(tls *libc.TLS, p uintptr) int32 { var rc int32 = (*Sqlite3rbu)(unsafe.Pointer(p)).Frc if rc == SQLITE_DONE { return SQLITE_OK } if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_OAL { if rc == SQLITE_OK { rc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+15875, uintptr(0), uintptr(0), uintptr(0)) } } if rc == SQLITE_OK && (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_CKPT { var pDb uintptr = (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(p)).FpTargetFd)).FpReal rc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pDb)).FpMethods)).FxSync})).f(tls, pDb, SQLITE_SYNC_NORMAL) } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc rbuSaveState(tls, p, (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage) rc = (*Sqlite3rbu)(unsafe.Pointer(p)).Frc if (*Sqlite3rbu)(unsafe.Pointer(p)).FeStage == RBU_STAGE_OAL { if rc == SQLITE_OK { rc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, ts+15875, uintptr(0), uintptr(0), uintptr(0)) } if rc == SQLITE_OK { var zBegin uintptr if (*Sqlite3rbu)(unsafe.Pointer(p)).FzTarget == uintptr(0) { zBegin = ts + 15860 } else { zBegin = ts + 33651 } rc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbRbu, zBegin, uintptr(0), uintptr(0), uintptr(0)) } if rc == SQLITE_OK { rc = Xsqlite3_exec(tls, (*Sqlite3rbu)(unsafe.Pointer(p)).FdbMain, ts+33651, uintptr(0), uintptr(0), uintptr(0)) } } (*Sqlite3rbu)(unsafe.Pointer(p)).Frc = rc return rc } func xDefaultRename(tls *libc.TLS, pArg uintptr, zOld uintptr, zNew uintptr) int32 { var rc int32 = SQLITE_OK if libc.Xrename(tls, zOld, zNew) != 0 { rc = SQLITE_IOERR } else { rc = SQLITE_OK } return rc } func Xsqlite3rbu_rename_handler(tls *libc.TLS, pRbu uintptr, pArg uintptr, xRename uintptr) { if xRename != 0 { (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FxRename = xRename (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FpRenameArg = pArg } else { (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FxRename = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) int32 }{xDefaultRename})) (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FpRenameArg = uintptr(0) } } func rbuUnlockShm(tls *libc.TLS, p uintptr) { if (*Rbu_file)(unsafe.Pointer(p)).FpRbu != 0 { var xShmLock uintptr = (*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxShmLock var i int32 for i = 0; i < SQLITE_SHM_NLOCK; i++ { if U32(int32(1)< (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FszTempLimit { return SQLITE_FULL } return SQLITE_OK } func rbuMainlistAdd(tls *libc.TLS, p uintptr) { var pRbuVfs uintptr = (*Rbu_file)(unsafe.Pointer(p)).FpRbuVfs var pIter uintptr Xsqlite3_mutex_enter(tls, (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).Fmutex) if (*Rbu_file)(unsafe.Pointer(p)).FpRbu == uintptr(0) { for pIter = (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMain; pIter != 0; pIter = (*Rbu_file)(unsafe.Pointer(pIter)).FpMainNext { } (*Rbu_file)(unsafe.Pointer(p)).FpMainNext = (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMain (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMain = p } else { for pIter = (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMainRbu; pIter != 0 && pIter != p; pIter = (*Rbu_file)(unsafe.Pointer(pIter)).FpMainRbuNext { } if pIter == uintptr(0) { (*Rbu_file)(unsafe.Pointer(p)).FpMainRbuNext = (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMainRbu (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMainRbu = p } } Xsqlite3_mutex_leave(tls, (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).Fmutex) } func rbuMainlistRemove(tls *libc.TLS, p uintptr) { var pp uintptr Xsqlite3_mutex_enter(tls, (*Rbu_vfs)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpRbuVfs)).Fmutex) for pp = (*Rbu_file)(unsafe.Pointer(p)).FpRbuVfs + 192; *(*uintptr)(unsafe.Pointer(pp)) != 0 && *(*uintptr)(unsafe.Pointer(pp)) != p; pp = *(*uintptr)(unsafe.Pointer(pp)) + 88 { } if *(*uintptr)(unsafe.Pointer(pp)) != 0 { *(*uintptr)(unsafe.Pointer(pp)) = (*Rbu_file)(unsafe.Pointer(p)).FpMainNext } (*Rbu_file)(unsafe.Pointer(p)).FpMainNext = uintptr(0) for pp = (*Rbu_file)(unsafe.Pointer(p)).FpRbuVfs + 200; *(*uintptr)(unsafe.Pointer(pp)) != 0 && *(*uintptr)(unsafe.Pointer(pp)) != p; pp = *(*uintptr)(unsafe.Pointer(pp)) + 96 { } if *(*uintptr)(unsafe.Pointer(pp)) != 0 { *(*uintptr)(unsafe.Pointer(pp)) = (*Rbu_file)(unsafe.Pointer(p)).FpMainRbuNext } (*Rbu_file)(unsafe.Pointer(p)).FpMainRbuNext = uintptr(0) Xsqlite3_mutex_leave(tls, (*Rbu_vfs)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpRbuVfs)).Fmutex) } func rbuFindMaindb(tls *libc.TLS, pRbuVfs uintptr, zWal uintptr, bRbu int32) uintptr { var pDb uintptr Xsqlite3_mutex_enter(tls, (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).Fmutex) if bRbu != 0 { for pDb = (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMainRbu; pDb != 0 && (*Rbu_file)(unsafe.Pointer(pDb)).FzWal != zWal; pDb = (*Rbu_file)(unsafe.Pointer(pDb)).FpMainRbuNext { } } else { for pDb = (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).FpMain; pDb != 0 && (*Rbu_file)(unsafe.Pointer(pDb)).FzWal != zWal; pDb = (*Rbu_file)(unsafe.Pointer(pDb)).FpMainNext { } } Xsqlite3_mutex_leave(tls, (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).Fmutex) return pDb } func rbuVfsClose(tls *libc.TLS, pFile uintptr) int32 { var p uintptr = pFile var rc int32 var i int32 for i = 0; i < (*Rbu_file)(unsafe.Pointer(p)).FnShm; i++ { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FapShm + uintptr(i)*8))) } Xsqlite3_free(tls, (*Rbu_file)(unsafe.Pointer(p)).FapShm) (*Rbu_file)(unsafe.Pointer(p)).FapShm = uintptr(0) Xsqlite3_free(tls, (*Rbu_file)(unsafe.Pointer(p)).FzDel) if (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_MAIN_DB != 0 { var pMeth uintptr = (*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods rbuMainlistRemove(tls, p) rbuUnlockShm(tls, p) if (*Sqlite3_io_methods)(unsafe.Pointer(pMeth)).FiVersion > 1 && (*Sqlite3_io_methods)(unsafe.Pointer(pMeth)).FxShmUnmap != 0 { (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_io_methods)(unsafe.Pointer(pMeth)).FxShmUnmap})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, 0) } } else if (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_DELETEONCLOSE != 0 && (*Rbu_file)(unsafe.Pointer(p)).FpRbu != 0 { rbuUpdateTempSize(tls, p, int64(0)) } rc = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxClose})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal) return rc } func rbuGetU32(tls *libc.TLS, aBuf uintptr) U32 { return U32(*(*U8)(unsafe.Pointer(aBuf)))<<24 + U32(*(*U8)(unsafe.Pointer(aBuf + 1)))<<16 + U32(*(*U8)(unsafe.Pointer(aBuf + 2)))<<8 + U32(*(*U8)(unsafe.Pointer(aBuf + 3))) } func rbuPutU32(tls *libc.TLS, aBuf uintptr, iVal U32) { *(*U8)(unsafe.Pointer(aBuf)) = U8(iVal >> 24 & U32(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 1)) = U8(iVal >> 16 & U32(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 2)) = U8(iVal >> 8 & U32(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 3)) = U8(iVal >> 0 & U32(0xFF)) } func rbuPutU16(tls *libc.TLS, aBuf uintptr, iVal U16) { *(*U8)(unsafe.Pointer(aBuf)) = U8(int32(iVal) >> 8 & 0xFF) *(*U8)(unsafe.Pointer(aBuf + 1)) = U8(int32(iVal) >> 0 & 0xFF) } func rbuVfsRead(tls *libc.TLS, pFile uintptr, zBuf uintptr, iAmt int32, iOfst Sqlite_int64) int32 { var p uintptr = pFile var pRbu uintptr = (*Rbu_file)(unsafe.Pointer(p)).FpRbu var rc int32 if pRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_CAPTURE { rc = rbuCaptureWalRead(tls, (*Rbu_file)(unsafe.Pointer(p)).FpRbu, iOfst, iAmt) } else { if pRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_OAL && (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_WAL != 0 && iOfst >= (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FiOalSz { rc = SQLITE_OK libc.Xmemset(tls, zBuf, 0, uint64(iAmt)) } else { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxRead})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, zBuf, iAmt, iOfst) if pRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FzTarget == uintptr(0) && rc == SQLITE_IOERR|int32(2)<<8 && iOfst == int64(0) && (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_MAIN_DB != 0 && (*Sqlite3rbu)(unsafe.Pointer(pRbu)).Frc == SQLITE_OK { var pFd uintptr = (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FpRbuFd rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer(pFd)).FpMethods)).FxRead})).f(tls, pFd, zBuf, iAmt, iOfst) if rc == SQLITE_OK { var aBuf uintptr = zBuf var iRoot U32 if rbuGetU32(tls, aBuf+52) != 0 { iRoot = uint32(1) } else { iRoot = uint32(0) } rbuPutU32(tls, aBuf+52, iRoot) rbuPutU32(tls, aBuf+36, uint32(0)) rbuPutU32(tls, aBuf+32, uint32(0)) rbuPutU32(tls, aBuf+28, uint32(1)) rbuPutU32(tls, aBuf+24, (*Rbu_file)(unsafe.Pointer((*Sqlite3rbu)(unsafe.Pointer(pRbu)).FpRbuFd)).FiCookie+U32(1)) if iAmt > 100 { libc.Xmemset(tls, aBuf+100, 0, uint64(iAmt-100)) rbuPutU16(tls, aBuf+105, uint16(iAmt&0xFFFF)) *(*U8)(unsafe.Pointer(aBuf + 100)) = U8(0x0D) } } } } if rc == SQLITE_OK && iOfst == int64(0) && (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_MAIN_DB != 0 { var pBuf uintptr = zBuf (*Rbu_file)(unsafe.Pointer(p)).FiCookie = rbuGetU32(tls, pBuf+24) (*Rbu_file)(unsafe.Pointer(p)).FiWriteVer = *(*U8)(unsafe.Pointer(pBuf + 19)) } } return rc } func rbuVfsWrite(tls *libc.TLS, pFile uintptr, zBuf uintptr, iAmt int32, iOfst Sqlite_int64) int32 { var p uintptr = pFile var pRbu uintptr = (*Rbu_file)(unsafe.Pointer(p)).FpRbu var rc int32 if pRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_CAPTURE { rc = rbuCaptureDbWrite(tls, (*Rbu_file)(unsafe.Pointer(p)).FpRbu, iOfst) } else { if pRbu != 0 { if (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_OAL && (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_WAL != 0 && iOfst >= (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FiOalSz { (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FiOalSz = Sqlite_int64(iAmt) + iOfst } else if (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_DELETEONCLOSE != 0 { var szNew I64 = Sqlite_int64(iAmt) + iOfst if szNew > (*Rbu_file)(unsafe.Pointer(p)).Fsz { rc = rbuUpdateTempSize(tls, p, szNew) if rc != SQLITE_OK { return rc } } } } rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxWrite})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, zBuf, iAmt, iOfst) if rc == SQLITE_OK && iOfst == int64(0) && (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_MAIN_DB != 0 { var pBuf uintptr = zBuf (*Rbu_file)(unsafe.Pointer(p)).FiCookie = rbuGetU32(tls, pBuf+24) (*Rbu_file)(unsafe.Pointer(p)).FiWriteVer = *(*U8)(unsafe.Pointer(pBuf + 19)) } } return rc } func rbuVfsTruncate(tls *libc.TLS, pFile uintptr, size Sqlite_int64) int32 { var p uintptr = pFile if (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_DELETEONCLOSE != 0 && (*Rbu_file)(unsafe.Pointer(p)).FpRbu != 0 { var rc int32 = rbuUpdateTempSize(tls, p, size) if rc != SQLITE_OK { return rc } } return (*struct { f func(*libc.TLS, uintptr, Sqlite3_int64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxTruncate})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, size) } func rbuVfsSync(tls *libc.TLS, pFile uintptr, flags int32) int32 { var p uintptr = pFile if (*Rbu_file)(unsafe.Pointer(p)).FpRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpRbu)).FeStage == RBU_STAGE_CAPTURE { if (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_MAIN_DB != 0 { return SQLITE_NOTICE | int32(3)<<8 } return SQLITE_OK } return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxSync})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, flags) } func rbuVfsFileSize(tls *libc.TLS, pFile uintptr, pSize uintptr) int32 { var p uintptr = pFile var rc int32 rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxFileSize})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, pSize) if rc == SQLITE_OK && *(*Sqlite_int64)(unsafe.Pointer(pSize)) == int64(0) && (*Rbu_file)(unsafe.Pointer(p)).FpRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpRbu)).FzTarget == uintptr(0) && (*Rbu_file)(unsafe.Pointer(p)).FopenFlags&SQLITE_OPEN_MAIN_DB != 0 { *(*Sqlite_int64)(unsafe.Pointer(pSize)) = int64(1024) } return rc } func rbuVfsLock(tls *libc.TLS, pFile uintptr, eLock int32) int32 { var p uintptr = pFile var pRbu uintptr = (*Rbu_file)(unsafe.Pointer(p)).FpRbu var rc int32 = SQLITE_OK if eLock == SQLITE_LOCK_EXCLUSIVE && ((*Rbu_file)(unsafe.Pointer(p)).FbNolock != 0 || pRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage != RBU_STAGE_DONE) { rc = SQLITE_BUSY } else { rc = (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxLock})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, eLock) } return rc } func rbuVfsUnlock(tls *libc.TLS, pFile uintptr, eLock int32) int32 { var p uintptr = pFile return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxUnlock})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, eLock) } func rbuVfsCheckReservedLock(tls *libc.TLS, pFile uintptr, pResOut uintptr) int32 { var p uintptr = pFile return (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxCheckReservedLock})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, pResOut) } func rbuVfsFileControl(tls *libc.TLS, pFile uintptr, op int32, pArg uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var p uintptr = pFile var xControl uintptr = (*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxFileControl var rc int32 if op == SQLITE_FCNTL_RBU { var pRbu uintptr = pArg rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xControl})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, op, pArg) if rc == SQLITE_NOTFOUND { *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xControl})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, SQLITE_FCNTL_ZIPVFS, bp+16) if rc == SQLITE_OK { rc = SQLITE_ERROR (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FzErrmsg = Xsqlite3_mprintf(tls, ts+33726, 0) } else if rc == SQLITE_NOTFOUND { (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FpTargetFd = p (*Rbu_file)(unsafe.Pointer(p)).FpRbu = pRbu rbuMainlistAdd(tls, p) if (*Rbu_file)(unsafe.Pointer(p)).FpWalFd != 0 { (*Rbu_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpWalFd)).FpRbu = pRbu } rc = SQLITE_OK } } return rc } else if op == SQLITE_FCNTL_RBUCNT { var pRbu uintptr = pArg (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FnRbu++ (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FpRbuFd = p (*Rbu_file)(unsafe.Pointer(p)).FbNolock = U8(1) } rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xControl})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, op, pArg) if rc == SQLITE_OK && op == SQLITE_FCNTL_VFSNAME { var pRbuVfs uintptr = (*Rbu_file)(unsafe.Pointer(p)).FpRbuVfs var zIn uintptr = *(*uintptr)(unsafe.Pointer(pArg)) var zOut uintptr = Xsqlite3_mprintf(tls, ts+33749, libc.VaList(bp, (*Rbu_vfs)(unsafe.Pointer(pRbuVfs)).Fbase.FzName, zIn)) *(*uintptr)(unsafe.Pointer(pArg)) = zOut if zOut == uintptr(0) { rc = SQLITE_NOMEM } } return rc } func rbuVfsSectorSize(tls *libc.TLS, pFile uintptr) int32 { var p uintptr = pFile return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxSectorSize})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal) } func rbuVfsDeviceCharacteristics(tls *libc.TLS, pFile uintptr) int32 { var p uintptr = pFile return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxDeviceCharacteristics})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal) } func rbuVfsShmLock(tls *libc.TLS, pFile uintptr, ofst int32, n int32, flags int32) int32 { var p uintptr = pFile var pRbu uintptr = (*Rbu_file)(unsafe.Pointer(p)).FpRbu var rc int32 = SQLITE_OK if pRbu != 0 && ((*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_OAL || (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_MOVE || (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_DONE) { if ofst == WAL_LOCK_CKPT && n == 1 { rc = SQLITE_BUSY } } else { var bCapture int32 = 0 if pRbu != 0 && (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FeStage == RBU_STAGE_CAPTURE { bCapture = 1 } if bCapture == 0 || 0 == flags&SQLITE_SHM_UNLOCK { rc = (*struct { f func(*libc.TLS, uintptr, int32, int32, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*sqlite3_io_methods)(unsafe.Pointer((*Sqlite3_file)(unsafe.Pointer((*Rbu_file)(unsafe.Pointer(p)).FpReal)).FpMethods)).FxShmLock})).f(tls, (*Rbu_file)(unsafe.Pointer(p)).FpReal, ofst, n, flags) if bCapture != 0 && rc == SQLITE_OK { *(*U32)(unsafe.Pointer(pRbu + 332)) |= U32((int32(1)< int64(0)) } } } return rc } func rbuVfsFullPathname(tls *libc.TLS, pVfs uintptr, zPath uintptr, nOut int32, zOut uintptr) int32 { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs return (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxFullPathname})).f(tls, pRealVfs, zPath, nOut, zOut) } func rbuVfsDlOpen(tls *libc.TLS, pVfs uintptr, zPath uintptr) uintptr { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs return (*struct { f func(*libc.TLS, uintptr, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxDlOpen})).f(tls, pRealVfs, zPath) } func rbuVfsDlError(tls *libc.TLS, pVfs uintptr, nByte int32, zErrMsg uintptr) { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs (*struct { f func(*libc.TLS, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxDlError})).f(tls, pRealVfs, nByte, zErrMsg) } func rbuVfsDlSym(tls *libc.TLS, pVfs uintptr, pArg uintptr, zSym uintptr) uintptr { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs return (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxDlSym})).f(tls, pRealVfs, pArg, zSym) } func rbuVfsDlClose(tls *libc.TLS, pVfs uintptr, pHandle uintptr) { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxDlClose})).f(tls, pRealVfs, pHandle) } func rbuVfsRandomness(tls *libc.TLS, pVfs uintptr, nByte int32, zBufOut uintptr) int32 { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs return (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxRandomness})).f(tls, pRealVfs, nByte, zBufOut) } func rbuVfsSleep(tls *libc.TLS, pVfs uintptr, nMicro int32) int32 { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs return (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxSleep})).f(tls, pRealVfs, nMicro) } func rbuVfsCurrentTime(tls *libc.TLS, pVfs uintptr, pTimeOut uintptr) int32 { var pRealVfs uintptr = (*Rbu_vfs)(unsafe.Pointer(pVfs)).FpRealVfs return (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_vfs)(unsafe.Pointer(pRealVfs)).FxCurrentTime})).f(tls, pRealVfs, pTimeOut) } func rbuVfsGetLastError(tls *libc.TLS, pVfs uintptr, a int32, b uintptr) int32 { return 0 } // Deregister and destroy an RBU vfs created by an earlier call to // sqlite3rbu_create_vfs(). func Xsqlite3rbu_destroy_vfs(tls *libc.TLS, zName uintptr) { var pVfs uintptr = Xsqlite3_vfs_find(tls, zName) if pVfs != 0 && (*Sqlite3_vfs)(unsafe.Pointer(pVfs)).FxOpen == *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) int32 }{rbuVfsOpen})) { Xsqlite3_mutex_free(tls, (*Rbu_vfs)(unsafe.Pointer(pVfs)).Fmutex) Xsqlite3_vfs_unregister(tls, pVfs) Xsqlite3_free(tls, pVfs) } } // Create an RBU VFS named zName that accesses the underlying file-system // via existing VFS zParent. The new object is registered as a non-default // VFS with SQLite before returning. func Xsqlite3rbu_create_vfs(tls *libc.TLS, zName uintptr, zParent uintptr) int32 { var pNew uintptr = uintptr(0) var rc int32 = SQLITE_OK var nName Size_t var nByte Size_t nName = libc.Xstrlen(tls, zName) nByte = uint64(unsafe.Sizeof(Rbu_vfs{})) + nName + uint64(1) pNew = Xsqlite3_malloc64(tls, nByte) if pNew == uintptr(0) { rc = SQLITE_NOMEM } else { var pParent uintptr libc.Xmemset(tls, pNew, 0, nByte) pParent = Xsqlite3_vfs_find(tls, zParent) if pParent == uintptr(0) { rc = SQLITE_NOTFOUND } else { var zSpace uintptr libc.Xmemcpy(tls, pNew, uintptr(unsafe.Pointer(&vfs_template)), uint64(unsafe.Sizeof(Sqlite3_vfs{}))) (*Rbu_vfs)(unsafe.Pointer(pNew)).Fbase.FmxPathname = (*Sqlite3_vfs)(unsafe.Pointer(pParent)).FmxPathname (*Rbu_vfs)(unsafe.Pointer(pNew)).Fbase.FszOsFile = int32(uint64(unsafe.Sizeof(Rbu_file{})) + uint64((*Sqlite3_vfs)(unsafe.Pointer(pParent)).FszOsFile)) (*Rbu_vfs)(unsafe.Pointer(pNew)).FpRealVfs = pParent (*Rbu_vfs)(unsafe.Pointer(pNew)).Fbase.FzName = libc.AssignUintptr(&zSpace, pNew+1*208) libc.Xmemcpy(tls, zSpace, zName, nName) (*Rbu_vfs)(unsafe.Pointer(pNew)).Fmutex = Xsqlite3_mutex_alloc(tls, SQLITE_MUTEX_RECURSIVE) if (*Rbu_vfs)(unsafe.Pointer(pNew)).Fmutex == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_vfs_register(tls, pNew, 0) } } if rc != SQLITE_OK { Xsqlite3_mutex_free(tls, (*Rbu_vfs)(unsafe.Pointer(pNew)).Fmutex) Xsqlite3_free(tls, pNew) } } return rc } var vfs_template = Sqlite3_vfs{ FiVersion: 1, FxOpen: 0, FxDelete: 0, FxAccess: 0, FxFullPathname: 0, FxDlOpen: 0, FxDlError: 0, FxDlSym: 0, FxDlClose: 0, FxRandomness: 0, FxSleep: 0, FxCurrentTime: 0, FxGetLastError: 0, } // Configure the aggregate temp file size limit for this RBU handle. func Xsqlite3rbu_temp_size_limit(tls *libc.TLS, pRbu uintptr, n Sqlite3_int64) Sqlite3_int64 { if n >= int64(0) { (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FszTempLimit = n } return (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FszTempLimit } func Xsqlite3rbu_temp_size(tls *libc.TLS, pRbu uintptr) Sqlite3_int64 { return (*Sqlite3rbu)(unsafe.Pointer(pRbu)).FszTemp } type SessionTable1 = struct { FpNext uintptr FzName uintptr FnCol int32 FbStat1 int32 FazCol uintptr FabPK uintptr FnEntry int32 FnChange int32 FapChange uintptr } type SessionTable = SessionTable1 type SessionChange1 = struct { Fop U8 FbIndirect U8 F__ccgo_pad1 [2]byte FnMaxSize int32 FnRecord int32 F__ccgo_pad2 [4]byte FaRecord uintptr FpNext uintptr } type SessionChange = SessionChange1 type SessionBuffer1 = struct { FaBuf uintptr FnBuf int32 FnAlloc int32 } type SessionBuffer = SessionBuffer1 type SessionInput1 = struct { FbNoDiscard int32 FiCurrent int32 FiNext int32 F__ccgo_pad1 [4]byte FaData uintptr FnData int32 F__ccgo_pad2 [4]byte Fbuf SessionBuffer FxInput uintptr FpIn uintptr FbEof int32 F__ccgo_pad3 [4]byte } type SessionInput = SessionInput1 var sessions_strm_chunk_size int32 = SESSIONS_STRM_CHUNK_SIZE type SessionHook1 = struct { FpCtx uintptr FxOld uintptr FxNew uintptr FxCount uintptr FxDepth uintptr } type SessionHook = SessionHook1 func sessionVarintPut(tls *libc.TLS, aBuf uintptr, iVal int32) int32 { return int32(func() uint8 { if U32(iVal) < U32(0x80) { return uint8(func() int32 { *(*U8)(unsafe.Pointer(aBuf)) = uint8(iVal); return 1 }()) } return uint8(Xsqlite3PutVarint(tls, aBuf, uint64(iVal))) }()) } func sessionVarintLen(tls *libc.TLS, iVal int32) int32 { return Xsqlite3VarintLen(tls, uint64(iVal)) } func sessionVarintGet(tls *libc.TLS, aBuf uintptr, piVal uintptr) int32 { return int32(func() uint8 { if int32(*(*U8)(unsafe.Pointer(aBuf))) < int32(U8(0x80)) { return uint8(func() int32 { *(*int32)(unsafe.Pointer(piVal)) = int32(U32(*(*U8)(unsafe.Pointer(aBuf)))); return 1 }()) } return Xsqlite3GetVarint32(tls, aBuf, piVal) }()) } func sessionGetI64(tls *libc.TLS, aRec uintptr) Sqlite3_int64 { var x U64 = U64(U32(*(*U8)(unsafe.Pointer(aRec)))<<24 | U32(int32(*(*U8)(unsafe.Pointer(aRec + 1)))<<16) | U32(int32(*(*U8)(unsafe.Pointer(aRec + 2)))<<8) | U32(*(*U8)(unsafe.Pointer(aRec + 3)))) var y U32 = U32(*(*U8)(unsafe.Pointer(aRec + uintptr(4))))<<24 | U32(int32(*(*U8)(unsafe.Pointer(aRec + uintptr(4) + 1)))<<16) | U32(int32(*(*U8)(unsafe.Pointer(aRec + uintptr(4) + 2)))<<8) | U32(*(*U8)(unsafe.Pointer(aRec + uintptr(4) + 3))) x = x<<32 + U64(y) return Sqlite3_int64(x) } func sessionPutI64(tls *libc.TLS, aBuf uintptr, i Sqlite3_int64) { *(*U8)(unsafe.Pointer(aBuf)) = U8(i >> 56 & int64(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 1)) = U8(i >> 48 & int64(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 2)) = U8(i >> 40 & int64(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 3)) = U8(i >> 32 & int64(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 4)) = U8(i >> 24 & int64(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 5)) = U8(i >> 16 & int64(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 6)) = U8(i >> 8 & int64(0xFF)) *(*U8)(unsafe.Pointer(aBuf + 7)) = U8(i >> 0 & int64(0xFF)) } func sessionSerializeValue(tls *libc.TLS, aBuf uintptr, pValue uintptr, pnWrite uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var nByte int32 if pValue != 0 { var eType int32 eType = Xsqlite3_value_type(tls, pValue) if aBuf != 0 { *(*U8)(unsafe.Pointer(aBuf)) = U8(eType) } switch eType { case SQLITE_NULL: nByte = 1 break fallthrough case SQLITE_INTEGER: fallthrough case SQLITE_FLOAT: if aBuf != 0 { if eType == SQLITE_INTEGER { *(*U64)(unsafe.Pointer(bp)) = U64(Xsqlite3_value_int64(tls, pValue)) } else { *(*float64)(unsafe.Pointer(bp + 8)) = Xsqlite3_value_double(tls, pValue) libc.Xmemcpy(tls, bp, bp+8, uint64(8)) } sessionPutI64(tls, aBuf+1, int64(*(*U64)(unsafe.Pointer(bp)))) } nByte = 9 break fallthrough default: { var z uintptr var n int32 var nVarint int32 if eType == SQLITE_TEXT { z = Xsqlite3_value_text(tls, pValue) } else { z = Xsqlite3_value_blob(tls, pValue) } n = Xsqlite3_value_bytes(tls, pValue) if z == uintptr(0) && (eType != SQLITE_BLOB || n > 0) { return SQLITE_NOMEM } nVarint = sessionVarintLen(tls, n) if aBuf != 0 { sessionVarintPut(tls, aBuf+1, n) if n > 0 { libc.Xmemcpy(tls, aBuf+uintptr(nVarint+1), z, uint64(n)) } } nByte = 1 + nVarint + n break } } } else { nByte = 1 if aBuf != 0 { *(*U8)(unsafe.Pointer(aBuf)) = U8(0) } } if pnWrite != 0 { *(*Sqlite3_int64)(unsafe.Pointer(pnWrite)) += Sqlite3_int64(nByte) } return SQLITE_OK } func sessionMalloc64(tls *libc.TLS, pSession uintptr, nByte I64) uintptr { var pRet uintptr = Xsqlite3_malloc64(tls, uint64(nByte)) if pSession != 0 { *(*I64)(unsafe.Pointer(pSession + 56)) += I64(Xsqlite3_msize(tls, pRet)) } return pRet } func sessionFree(tls *libc.TLS, pSession uintptr, pFree uintptr) { if pSession != 0 { *(*I64)(unsafe.Pointer(pSession + 56)) -= I64(Xsqlite3_msize(tls, pFree)) } Xsqlite3_free(tls, pFree) } func sessionHashAppendI64(tls *libc.TLS, h uint32, i I64) uint32 { h = h<<3 ^ h ^ uint32(i&int64(0xFFFFFFFF)) return h<<3 ^ h ^ uint32(i>>32&int64(0xFFFFFFFF)) } func sessionHashAppendBlob(tls *libc.TLS, h uint32, n int32, z uintptr) uint32 { var i int32 for i = 0; i < n; i++ { h = h<<3 ^ h ^ uint32(*(*U8)(unsafe.Pointer(z + uintptr(i)))) } return h } func sessionHashAppendType(tls *libc.TLS, h uint32, eType int32) uint32 { return h<<3 ^ h ^ uint32(eType) } func sessionPreupdateHash(tls *libc.TLS, pSession uintptr, pTab uintptr, bNew int32, piHash uintptr, pbNullPK uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var h uint32 = uint32(0) var i int32 for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; i++ { if *(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i))) != 0 { var rc int32 var eType int32 if bNew != 0 { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, i, bp) } else { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxOld})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, i, bp) } if rc != SQLITE_OK { return rc } eType = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp))) h = sessionHashAppendType(tls, h, eType) if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { if eType == SQLITE_INTEGER { *(*I64)(unsafe.Pointer(bp + 8)) = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(bp))) } else { *(*float64)(unsafe.Pointer(bp + 16)) = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(bp))) libc.Xmemcpy(tls, bp+8, bp+16, uint64(8)) } h = sessionHashAppendI64(tls, h, *(*I64)(unsafe.Pointer(bp + 8))) } else if eType == SQLITE_TEXT || eType == SQLITE_BLOB { var z uintptr var n int32 if eType == SQLITE_TEXT { z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(bp))) } else { z = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(bp))) } n = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(bp))) if !(z != 0) && (eType != SQLITE_BLOB || n > 0) { return SQLITE_NOMEM } h = sessionHashAppendBlob(tls, h, n, z) } else { *(*int32)(unsafe.Pointer(pbNullPK)) = 1 } } } *(*int32)(unsafe.Pointer(piHash)) = int32(h % uint32((*SessionTable)(unsafe.Pointer(pTab)).FnChange)) return SQLITE_OK } func sessionSerialLen(tls *libc.TLS, a uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var e int32 = int32(*(*U8)(unsafe.Pointer(a))) if e == 0 || e == 0xFF { return 1 } if e == SQLITE_NULL { return 1 } if e == SQLITE_INTEGER || e == SQLITE_FLOAT { return 9 } return sessionVarintGet(tls, a+1, bp) + 1 + *(*int32)(unsafe.Pointer(bp)) } func sessionChangeHash(tls *libc.TLS, pTab uintptr, bPkOnly int32, aRecord uintptr, nBucket int32) uint32 { bp := tls.Alloc(4) defer tls.Free(4) var h uint32 = uint32(0) var i int32 var a uintptr = aRecord for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; i++ { var eType int32 = int32(*(*U8)(unsafe.Pointer(a))) var isPK int32 = int32(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i)))) if bPkOnly != 0 && isPK == 0 { continue } if isPK != 0 { a++ h = sessionHashAppendType(tls, h, eType) if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { h = sessionHashAppendI64(tls, h, sessionGetI64(tls, a)) a += uintptr(8) } else { a += uintptr(sessionVarintGet(tls, a, bp)) h = sessionHashAppendBlob(tls, h, *(*int32)(unsafe.Pointer(bp)), a) a += uintptr(*(*int32)(unsafe.Pointer(bp))) } } else { a += uintptr(sessionSerialLen(tls, a)) } } return h % uint32(nBucket) } func sessionChangeEqual(tls *libc.TLS, pTab uintptr, bLeftPkOnly int32, aLeft uintptr, bRightPkOnly int32, aRight uintptr) int32 { var a1 uintptr = aLeft var a2 uintptr = aRight var iCol int32 for iCol = 0; iCol < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; iCol++ { if *(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(iCol))) != 0 { var n1 int32 = sessionSerialLen(tls, a1) var n2 int32 = sessionSerialLen(tls, a2) if n1 != n2 || libc.Xmemcmp(tls, a1, a2, uint64(n1)) != 0 { return 0 } a1 += uintptr(n1) a2 += uintptr(n2) } else { if bLeftPkOnly == 0 { a1 += uintptr(sessionSerialLen(tls, a1)) } if bRightPkOnly == 0 { a2 += uintptr(sessionSerialLen(tls, a2)) } } } return 1 } func sessionMergeRecord(tls *libc.TLS, paOut uintptr, nCol int32, aLeft uintptr, aRight uintptr) { var a1 uintptr = aLeft var a2 uintptr = aRight var aOut uintptr = *(*uintptr)(unsafe.Pointer(paOut)) var iCol int32 for iCol = 0; iCol < nCol; iCol++ { var n1 int32 = sessionSerialLen(tls, a1) var n2 int32 = sessionSerialLen(tls, a2) if *(*U8)(unsafe.Pointer(a2)) != 0 { libc.Xmemcpy(tls, aOut, a2, uint64(n2)) aOut += uintptr(n2) } else { libc.Xmemcpy(tls, aOut, a1, uint64(n1)) aOut += uintptr(n1) } a1 += uintptr(n1) a2 += uintptr(n2) } *(*uintptr)(unsafe.Pointer(paOut)) = aOut } func sessionMergeValue(tls *libc.TLS, paOne uintptr, paTwo uintptr, pnVal uintptr) uintptr { var a1 uintptr = *(*uintptr)(unsafe.Pointer(paOne)) var a2 uintptr = *(*uintptr)(unsafe.Pointer(paTwo)) var pRet uintptr = uintptr(0) var n1 int32 if a2 != 0 { var n2 int32 = sessionSerialLen(tls, a2) if *(*U8)(unsafe.Pointer(a2)) != 0 { *(*int32)(unsafe.Pointer(pnVal)) = n2 pRet = a2 } *(*uintptr)(unsafe.Pointer(paTwo)) = a2 + uintptr(n2) } n1 = sessionSerialLen(tls, a1) if pRet == uintptr(0) { *(*int32)(unsafe.Pointer(pnVal)) = n1 pRet = a1 } *(*uintptr)(unsafe.Pointer(paOne)) = a1 + uintptr(n1) return pRet } func sessionMergeUpdate(tls *libc.TLS, paOut uintptr, pTab uintptr, bPatchset int32, aOldRecord1 uintptr, aOldRecord2 uintptr, aNewRecord1 uintptr, aNewRecord2 uintptr) int32 { bp := tls.Alloc(52) defer tls.Free(52) *(*uintptr)(unsafe.Pointer(bp)) = aOldRecord1 *(*uintptr)(unsafe.Pointer(bp + 8)) = aOldRecord2 *(*uintptr)(unsafe.Pointer(bp + 24)) = aNewRecord1 *(*uintptr)(unsafe.Pointer(bp + 32)) = aNewRecord2 var aOut uintptr = *(*uintptr)(unsafe.Pointer(paOut)) var i int32 if bPatchset == 0 { var bRequired int32 = 0 for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; i++ { var aOld uintptr var aNew uintptr aOld = sessionMergeValue(tls, bp, bp+8, bp+16) aNew = sessionMergeValue(tls, bp+24, bp+32, bp+40) if *(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i))) != 0 || *(*int32)(unsafe.Pointer(bp + 16)) != *(*int32)(unsafe.Pointer(bp + 40)) || libc.Xmemcmp(tls, aOld, aNew, uint64(*(*int32)(unsafe.Pointer(bp + 40)))) != 0 { if int32(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i)))) == 0 { bRequired = 1 } libc.Xmemcpy(tls, aOut, aOld, uint64(*(*int32)(unsafe.Pointer(bp + 16)))) aOut += uintptr(*(*int32)(unsafe.Pointer(bp + 16))) } else { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&aOut, 1))) = U8(0) } } if !(bRequired != 0) { return 0 } } *(*uintptr)(unsafe.Pointer(bp)) = aOldRecord1 *(*uintptr)(unsafe.Pointer(bp + 8)) = aOldRecord2 *(*uintptr)(unsafe.Pointer(bp + 24)) = aNewRecord1 *(*uintptr)(unsafe.Pointer(bp + 32)) = aNewRecord2 for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; i++ { var aOld uintptr var aNew uintptr aOld = sessionMergeValue(tls, bp, bp+8, bp+44) aNew = sessionMergeValue(tls, bp+24, bp+32, bp+48) if bPatchset == 0 && (*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i))) != 0 || *(*int32)(unsafe.Pointer(bp + 44)) == *(*int32)(unsafe.Pointer(bp + 48)) && 0 == libc.Xmemcmp(tls, aOld, aNew, uint64(*(*int32)(unsafe.Pointer(bp + 48))))) { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&aOut, 1))) = U8(0) } else { libc.Xmemcpy(tls, aOut, aNew, uint64(*(*int32)(unsafe.Pointer(bp + 48)))) aOut += uintptr(*(*int32)(unsafe.Pointer(bp + 48))) } } *(*uintptr)(unsafe.Pointer(paOut)) = aOut return 1 } func sessionPreupdateEqual(tls *libc.TLS, pSession uintptr, pTab uintptr, pChange uintptr, op int32) int32 { bp := tls.Alloc(28) defer tls.Free(28) var iCol int32 var a uintptr = (*SessionChange)(unsafe.Pointer(pChange)).FaRecord for iCol = 0; iCol < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; iCol++ { if !(int32(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(iCol)))) != 0) { a += uintptr(sessionSerialLen(tls, a)) } else { var rc int32 _ = rc var eType int32 = int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&a, 1)))) if op == SQLITE_INSERT { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, iCol, bp) } else { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxOld})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, iCol, bp) } if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp))) != eType { return 0 } if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { *(*I64)(unsafe.Pointer(bp + 16)) = sessionGetI64(tls, a) a += uintptr(8) if eType == SQLITE_INTEGER { if Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(bp))) != *(*I64)(unsafe.Pointer(bp + 16)) { return 0 } } else { libc.Xmemcpy(tls, bp+8, bp+16, uint64(8)) if Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(bp))) != *(*float64)(unsafe.Pointer(bp + 8)) { return 0 } } } else { var z uintptr a += uintptr(sessionVarintGet(tls, a, bp+24)) if Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(bp))) != *(*int32)(unsafe.Pointer(bp + 24)) { return 0 } if eType == SQLITE_TEXT { z = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(bp))) } else { z = Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(bp))) } if *(*int32)(unsafe.Pointer(bp + 24)) > 0 && libc.Xmemcmp(tls, a, z, uint64(*(*int32)(unsafe.Pointer(bp + 24)))) != 0 { return 0 } a += uintptr(*(*int32)(unsafe.Pointer(bp + 24))) } } } return 1 } func sessionGrowHash(tls *libc.TLS, pSession uintptr, bPatchset int32, pTab uintptr) int32 { if (*SessionTable)(unsafe.Pointer(pTab)).FnChange == 0 || (*SessionTable)(unsafe.Pointer(pTab)).FnEntry >= (*SessionTable)(unsafe.Pointer(pTab)).FnChange/2 { var i int32 var apNew uintptr var nNew Sqlite3_int64 = int64(2) * func() int64 { if (*SessionTable)(unsafe.Pointer(pTab)).FnChange != 0 { return int64((*SessionTable)(unsafe.Pointer(pTab)).FnChange) } return int64(128) }() apNew = sessionMalloc64(tls, pSession, int64(uint64(unsafe.Sizeof(uintptr(0)))*uint64(nNew))) if apNew == uintptr(0) { if (*SessionTable)(unsafe.Pointer(pTab)).FnChange == 0 { return SQLITE_ERROR } return SQLITE_OK } libc.Xmemset(tls, apNew, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64(nNew)) for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnChange; i++ { var p uintptr var pNext uintptr for p = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(i)*8)); p != 0; p = pNext { var bPkOnly int32 = libc.Bool32(int32((*SessionChange)(unsafe.Pointer(p)).Fop) == SQLITE_DELETE && bPatchset != 0) var iHash int32 = int32(sessionChangeHash(tls, pTab, bPkOnly, (*SessionChange)(unsafe.Pointer(p)).FaRecord, int32(nNew))) pNext = (*SessionChange)(unsafe.Pointer(p)).FpNext (*SessionChange)(unsafe.Pointer(p)).FpNext = *(*uintptr)(unsafe.Pointer(apNew + uintptr(iHash)*8)) *(*uintptr)(unsafe.Pointer(apNew + uintptr(iHash)*8)) = p } } sessionFree(tls, pSession, (*SessionTable)(unsafe.Pointer(pTab)).FapChange) (*SessionTable)(unsafe.Pointer(pTab)).FnChange = int32(nNew) (*SessionTable)(unsafe.Pointer(pTab)).FapChange = apNew } return SQLITE_OK } func sessionTableInfo(tls *libc.TLS, pSession uintptr, db uintptr, zDb uintptr, zThis uintptr, pnCol uintptr, pzTab uintptr, pazCol uintptr, pabPK uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var zPragma uintptr var rc int32 var nByte Sqlite3_int64 var nDbCol int32 = 0 var nThis int32 var i int32 var pAlloc uintptr = uintptr(0) var azCol uintptr = uintptr(0) var abPK uintptr = uintptr(0) nThis = Xsqlite3Strlen30(tls, zThis) if nThis == 12 && 0 == Xsqlite3_stricmp(tls, ts+12700, zThis) { rc = Xsqlite3_table_column_metadata(tls, db, zDb, zThis, uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0), uintptr(0)) if rc == SQLITE_OK { zPragma = Xsqlite3_mprintf(tls, ts+33771, 0) } else if rc == SQLITE_ERROR { zPragma = Xsqlite3_mprintf(tls, ts+1544, 0) } else { *(*uintptr)(unsafe.Pointer(pazCol)) = uintptr(0) *(*uintptr)(unsafe.Pointer(pabPK)) = uintptr(0) *(*int32)(unsafe.Pointer(pnCol)) = 0 if pzTab != 0 { *(*uintptr)(unsafe.Pointer(pzTab)) = uintptr(0) } return rc } } else { zPragma = Xsqlite3_mprintf(tls, ts+33892, libc.VaList(bp, zDb, zThis)) } if !(zPragma != 0) { *(*uintptr)(unsafe.Pointer(pazCol)) = uintptr(0) *(*uintptr)(unsafe.Pointer(pabPK)) = uintptr(0) *(*int32)(unsafe.Pointer(pnCol)) = 0 if pzTab != 0 { *(*uintptr)(unsafe.Pointer(pzTab)) = uintptr(0) } return SQLITE_NOMEM } rc = Xsqlite3_prepare_v2(tls, db, zPragma, -1, bp+16, uintptr(0)) Xsqlite3_free(tls, zPragma) if rc != SQLITE_OK { *(*uintptr)(unsafe.Pointer(pazCol)) = uintptr(0) *(*uintptr)(unsafe.Pointer(pabPK)) = uintptr(0) *(*int32)(unsafe.Pointer(pnCol)) = 0 if pzTab != 0 { *(*uintptr)(unsafe.Pointer(pzTab)) = uintptr(0) } return rc } nByte = Sqlite3_int64(nThis + 1) for SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) { nByte = nByte + Sqlite3_int64(Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 1)) nDbCol++ } rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if rc == SQLITE_OK { nByte = Sqlite3_int64(uint64(nByte) + uint64(nDbCol)*(uint64(unsafe.Sizeof(uintptr(0)))+uint64(unsafe.Sizeof(U8(0)))+uint64(1))) pAlloc = sessionMalloc64(tls, pSession, nByte) if pAlloc == uintptr(0) { rc = SQLITE_NOMEM } } if rc == SQLITE_OK { azCol = pAlloc pAlloc = azCol + uintptr(nDbCol)*8 abPK = pAlloc pAlloc = abPK + uintptr(nDbCol) if pzTab != 0 { libc.Xmemcpy(tls, pAlloc, zThis, uint64(nThis+1)) *(*uintptr)(unsafe.Pointer(pzTab)) = pAlloc pAlloc += uintptr(nThis + 1) } i = 0 for SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) { var nName int32 = Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 1) var zName uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 1) if zName == uintptr(0) { break } libc.Xmemcpy(tls, pAlloc, zName, uint64(nName+1)) *(*uintptr)(unsafe.Pointer(azCol + uintptr(i)*8)) = pAlloc pAlloc += uintptr(nName + 1) *(*U8)(unsafe.Pointer(abPK + uintptr(i))) = U8(Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 5)) i++ } rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) } if rc == SQLITE_OK { *(*uintptr)(unsafe.Pointer(pazCol)) = azCol *(*uintptr)(unsafe.Pointer(pabPK)) = abPK *(*int32)(unsafe.Pointer(pnCol)) = nDbCol } else { *(*uintptr)(unsafe.Pointer(pazCol)) = uintptr(0) *(*uintptr)(unsafe.Pointer(pabPK)) = uintptr(0) *(*int32)(unsafe.Pointer(pnCol)) = 0 if pzTab != 0 { *(*uintptr)(unsafe.Pointer(pzTab)) = uintptr(0) } sessionFree(tls, pSession, azCol) } Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) return rc } func sessionInitTable(tls *libc.TLS, pSession uintptr, pTab uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) if (*SessionTable)(unsafe.Pointer(pTab)).FnCol == 0 { (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc = sessionTableInfo(tls, pSession, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb, (*Sqlite3_session)(unsafe.Pointer(pSession)).FzDb, (*SessionTable)(unsafe.Pointer(pTab)).FzName, pTab+16, uintptr(0), pTab+24, bp) if (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc == SQLITE_OK { var i int32 for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; i++ { if *(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)) + uintptr(i))) != 0 { (*SessionTable)(unsafe.Pointer(pTab)).FabPK = *(*uintptr)(unsafe.Pointer(bp)) break } } if 0 == Xsqlite3_stricmp(tls, ts+12700, (*SessionTable)(unsafe.Pointer(pTab)).FzName) { (*SessionTable)(unsafe.Pointer(pTab)).FbStat1 = 1 } if (*Sqlite3_session)(unsafe.Pointer(pSession)).FbEnableSize != 0 { *(*I64)(unsafe.Pointer(pSession + 64)) += I64(Size_t(1+sessionVarintLen(tls, (*SessionTable)(unsafe.Pointer(pTab)).FnCol)+(*SessionTable)(unsafe.Pointer(pTab)).FnCol) + libc.Xstrlen(tls, (*SessionTable)(unsafe.Pointer(pTab)).FzName) + uint64(1)) } } } return libc.Bool32((*Sqlite3_session)(unsafe.Pointer(pSession)).Frc != 0 || (*SessionTable)(unsafe.Pointer(pTab)).FabPK == uintptr(0)) } // Versions of the four methods in object SessionHook for use with the // sqlite_stat1 table. The purpose of this is to substitute a zero-length // blob each time a NULL value is read from the "idx" column of the // sqlite_stat1 table. type SessionStat1Ctx1 = struct { Fhook SessionHook FpSession uintptr } // Versions of the four methods in object SessionHook for use with the // sqlite_stat1 table. The purpose of this is to substitute a zero-length // blob each time a NULL value is read from the "idx" column of the // sqlite_stat1 table. type SessionStat1Ctx = SessionStat1Ctx1 func sessionStat1Old(tls *libc.TLS, pCtx uintptr, iCol int32, ppVal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr = pCtx *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FxOld})).f(tls, (*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FpCtx, iCol, bp) if rc == SQLITE_OK && iCol == 1 && Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp))) == SQLITE_NULL { *(*uintptr)(unsafe.Pointer(bp)) = (*Sqlite3_session)(unsafe.Pointer((*SessionStat1Ctx)(unsafe.Pointer(p)).FpSession)).FpZeroBlob } *(*uintptr)(unsafe.Pointer(ppVal)) = *(*uintptr)(unsafe.Pointer(bp)) return rc } func sessionStat1New(tls *libc.TLS, pCtx uintptr, iCol int32, ppVal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var p uintptr = pCtx *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FxNew})).f(tls, (*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FpCtx, iCol, bp) if rc == SQLITE_OK && iCol == 1 && Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp))) == SQLITE_NULL { *(*uintptr)(unsafe.Pointer(bp)) = (*Sqlite3_session)(unsafe.Pointer((*SessionStat1Ctx)(unsafe.Pointer(p)).FpSession)).FpZeroBlob } *(*uintptr)(unsafe.Pointer(ppVal)) = *(*uintptr)(unsafe.Pointer(bp)) return rc } func sessionStat1Count(tls *libc.TLS, pCtx uintptr) int32 { var p uintptr = pCtx return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FxCount})).f(tls, (*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FpCtx) } func sessionStat1Depth(tls *libc.TLS, pCtx uintptr) int32 { var p uintptr = pCtx return (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FxDepth})).f(tls, (*SessionStat1Ctx)(unsafe.Pointer(p)).Fhook.FpCtx) } func sessionUpdateMaxSize(tls *libc.TLS, op int32, pSession uintptr, pTab uintptr, pC uintptr) int32 { bp := tls.Alloc(44) defer tls.Free(44) *(*I64)(unsafe.Pointer(bp + 8)) = int64(2) if int32((*SessionChange)(unsafe.Pointer(pC)).Fop) == SQLITE_INSERT { if op != SQLITE_DELETE { var ii int32 for ii = 0; ii < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; ii++ { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, ii, bp) sessionSerializeValue(tls, uintptr(0), *(*uintptr)(unsafe.Pointer(bp)), bp+8) } } } else if op == SQLITE_DELETE { *(*I64)(unsafe.Pointer(bp + 8)) += I64((*SessionChange)(unsafe.Pointer(pC)).FnRecord) if Xsqlite3_preupdate_blobwrite(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb) >= 0 { *(*I64)(unsafe.Pointer(bp + 8)) += I64((*SessionChange)(unsafe.Pointer(pC)).FnRecord) } } else { var ii int32 var pCsr uintptr = (*SessionChange)(unsafe.Pointer(pC)).FaRecord for ii = 0; ii < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; ii++ { var bChanged int32 = 1 var nOld int32 = 0 var eType int32 *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, ii, bp+16) if *(*uintptr)(unsafe.Pointer(bp + 16)) == uintptr(0) { return SQLITE_NOMEM } eType = int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pCsr, 1)))) switch eType { case SQLITE_NULL: bChanged = libc.Bool32(Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) != SQLITE_NULL) break fallthrough case SQLITE_FLOAT: fallthrough case SQLITE_INTEGER: { if eType == Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) { *(*Sqlite3_int64)(unsafe.Pointer(bp + 32)) = sessionGetI64(tls, pCsr) if eType == SQLITE_INTEGER { bChanged = libc.Bool32(*(*Sqlite3_int64)(unsafe.Pointer(bp + 32)) != Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 16)))) } else { libc.Xmemcpy(tls, bp+24, bp+32, uint64(8)) bChanged = libc.Bool32(*(*float64)(unsafe.Pointer(bp + 24)) != Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(bp + 16)))) } } nOld = 8 pCsr += uintptr(8) break } fallthrough default: { nOld = sessionVarintGet(tls, pCsr, bp+40) pCsr += uintptr(nOld) nOld = nOld + *(*int32)(unsafe.Pointer(bp + 40)) if eType == Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) && *(*int32)(unsafe.Pointer(bp + 40)) == Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) && (*(*int32)(unsafe.Pointer(bp + 40)) == 0 || 0 == libc.Xmemcmp(tls, pCsr, Xsqlite3_value_blob(tls, *(*uintptr)(unsafe.Pointer(bp + 16))), uint64(*(*int32)(unsafe.Pointer(bp + 40))))) { bChanged = 0 } pCsr += uintptr(*(*int32)(unsafe.Pointer(bp + 40))) break } } if bChanged != 0 && *(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(ii))) != 0 { *(*I64)(unsafe.Pointer(bp + 8)) = I64((*SessionChange)(unsafe.Pointer(pC)).FnRecord + 2) break } if bChanged != 0 { *(*I64)(unsafe.Pointer(bp + 8)) += I64(1 + nOld) sessionSerializeValue(tls, uintptr(0), *(*uintptr)(unsafe.Pointer(bp + 16)), bp+8) } else if *(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(ii))) != 0 { *(*I64)(unsafe.Pointer(bp + 8)) += I64(2 + nOld) } else { *(*I64)(unsafe.Pointer(bp + 8)) += int64(2) } } } if *(*I64)(unsafe.Pointer(bp + 8)) > I64((*SessionChange)(unsafe.Pointer(pC)).FnMaxSize) { var nIncr int32 = int32(*(*I64)(unsafe.Pointer(bp + 8)) - I64((*SessionChange)(unsafe.Pointer(pC)).FnMaxSize)) (*SessionChange)(unsafe.Pointer(pC)).FnMaxSize = int32(*(*I64)(unsafe.Pointer(bp + 8))) *(*I64)(unsafe.Pointer(pSession + 64)) += I64(nIncr) } return SQLITE_OK } func sessionPreupdateOneChange(tls *libc.TLS, op int32, pSession uintptr, pTab uintptr) { bp := tls.Alloc(80) defer tls.Free(80) var rc int32 var p uintptr var i int32 var pC uintptr *(*int32)(unsafe.Pointer(bp + 52)) = 0 rc = SQLITE_OK *(*SessionStat1Ctx)(unsafe.Pointer(bp)) = SessionStat1Ctx{} if !((*Sqlite3_session)(unsafe.Pointer(pSession)).Frc != 0) { goto __1 } return __1: ; if !(sessionInitTable(tls, pSession, pTab) != 0) { goto __2 } return __2: ; if !((*SessionTable)(unsafe.Pointer(pTab)).FnCol != (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxCount})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx)) { goto __3 } (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc = SQLITE_SCHEMA return __3: ; if !(sessionGrowHash(tls, pSession, 0, pTab) != 0) { goto __4 } (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc = SQLITE_NOMEM return __4: ; if !((*SessionTable)(unsafe.Pointer(pTab)).FbStat1 != 0) { goto __5 } (*SessionStat1Ctx)(unsafe.Pointer(bp)).Fhook = (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook (*SessionStat1Ctx)(unsafe.Pointer(bp)).FpSession = pSession (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx = bp (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{sessionStat1New})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxOld = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{sessionStat1Old})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxCount = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) int32 }{sessionStat1Count})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxDepth = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) int32 }{sessionStat1Depth})) if !((*Sqlite3_session)(unsafe.Pointer(pSession)).FpZeroBlob == uintptr(0)) { goto __6 } p = Xsqlite3ValueNew(tls, uintptr(0)) if !(p == uintptr(0)) { goto __7 } rc = SQLITE_NOMEM goto error_out __7: ; Xsqlite3ValueSetStr(tls, p, 0, ts+1544, uint8(0), uintptr(0)) (*Sqlite3_session)(unsafe.Pointer(pSession)).FpZeroBlob = p __6: ; __5: ; rc = sessionPreupdateHash(tls, pSession, pTab, libc.Bool32(op == SQLITE_INSERT), bp+48, bp+52) if !(rc != SQLITE_OK) { goto __8 } goto error_out __8: ; if !(*(*int32)(unsafe.Pointer(bp + 52)) == 0) { goto __9 } pC = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(*(*int32)(unsafe.Pointer(bp + 48)))*8)) __10: if !(pC != 0) { goto __12 } if !(sessionPreupdateEqual(tls, pSession, pTab, pC, op) != 0) { goto __13 } goto __12 __13: ; goto __11 __11: pC = (*SessionChange)(unsafe.Pointer(pC)).FpNext goto __10 goto __12 __12: ; if !(pC == uintptr(0)) { goto __14 } (*SessionTable)(unsafe.Pointer(pTab)).FnEntry++ *(*Sqlite3_int64)(unsafe.Pointer(bp + 64)) = Sqlite3_int64(unsafe.Sizeof(SessionChange{})) i = 0 __16: if !(i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol) { goto __18 } *(*uintptr)(unsafe.Pointer(bp + 56)) = uintptr(0) if !(op != SQLITE_INSERT) { goto __19 } (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxOld})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, i, bp+56) goto __20 __19: if !(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i))) != 0) { goto __21 } (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, i, bp+56) __21: ; __20: ; rc = sessionSerializeValue(tls, uintptr(0), *(*uintptr)(unsafe.Pointer(bp + 56)), bp+64) if !(rc != SQLITE_OK) { goto __22 } goto error_out __22: ; goto __17 __17: i++ goto __16 goto __18 __18: ; pC = sessionMalloc64(tls, pSession, *(*Sqlite3_int64)(unsafe.Pointer(bp + 64))) if !!(pC != 0) { goto __23 } rc = SQLITE_NOMEM goto error_out goto __24 __23: libc.Xmemset(tls, pC, 0, uint64(unsafe.Sizeof(SessionChange{}))) (*SessionChange)(unsafe.Pointer(pC)).FaRecord = pC + 1*32 __24: ; *(*Sqlite3_int64)(unsafe.Pointer(bp + 64)) = int64(0) i = 0 __25: if !(i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol) { goto __27 } *(*uintptr)(unsafe.Pointer(bp + 72)) = uintptr(0) if !(op != SQLITE_INSERT) { goto __28 } (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxOld})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, i, bp+72) goto __29 __28: if !(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i))) != 0) { goto __30 } (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx, i, bp+72) __30: ; __29: ; sessionSerializeValue(tls, (*SessionChange)(unsafe.Pointer(pC)).FaRecord+uintptr(*(*Sqlite3_int64)(unsafe.Pointer(bp + 64))), *(*uintptr)(unsafe.Pointer(bp + 72)), bp+64) goto __26 __26: i++ goto __25 goto __27 __27: ; if !((*Sqlite3_session)(unsafe.Pointer(pSession)).FbIndirect != 0 || (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxDepth})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx) != 0) { goto __31 } (*SessionChange)(unsafe.Pointer(pC)).FbIndirect = U8(1) __31: ; (*SessionChange)(unsafe.Pointer(pC)).FnRecord = int32(*(*Sqlite3_int64)(unsafe.Pointer(bp + 64))) (*SessionChange)(unsafe.Pointer(pC)).Fop = U8(op) (*SessionChange)(unsafe.Pointer(pC)).FpNext = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(*(*int32)(unsafe.Pointer(bp + 48)))*8)) *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(*(*int32)(unsafe.Pointer(bp + 48)))*8)) = pC goto __15 __14: if !((*SessionChange)(unsafe.Pointer(pC)).FbIndirect != 0) { goto __32 } if !((*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxDepth})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx) == 0 && (*Sqlite3_session)(unsafe.Pointer(pSession)).FbIndirect == 0) { goto __33 } (*SessionChange)(unsafe.Pointer(pC)).FbIndirect = U8(0) __33: ; __32: ; __15: ; if !((*Sqlite3_session)(unsafe.Pointer(pSession)).FbEnableSize != 0) { goto __34 } rc = sessionUpdateMaxSize(tls, op, pSession, pTab, pC) __34: ; __9: ; error_out: if !((*SessionTable)(unsafe.Pointer(pTab)).FbStat1 != 0) { goto __35 } (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook = (*SessionStat1Ctx)(unsafe.Pointer(bp)).Fhook __35: ; if !(rc != SQLITE_OK) { goto __36 } (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc = rc __36: } func sessionFindTable(tls *libc.TLS, pSession uintptr, zName uintptr, ppTab uintptr) int32 { var rc int32 = SQLITE_OK var nName int32 = Xsqlite3Strlen30(tls, zName) var pRet uintptr for pRet = (*Sqlite3_session)(unsafe.Pointer(pSession)).FpTable; pRet != 0; pRet = (*SessionTable)(unsafe.Pointer(pRet)).FpNext { if 0 == Xsqlite3_strnicmp(tls, (*SessionTable)(unsafe.Pointer(pRet)).FzName, zName, nName+1) { break } } if pRet == uintptr(0) && (*Sqlite3_session)(unsafe.Pointer(pSession)).FbAutoAttach != 0 { if (*Sqlite3_session)(unsafe.Pointer(pSession)).FxTableFilter == uintptr(0) || (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Sqlite3_session)(unsafe.Pointer(pSession)).FxTableFilter})).f(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).FpFilterCtx, zName) != 0 { rc = Xsqlite3session_attach(tls, pSession, zName) if rc == SQLITE_OK { pRet = (*Sqlite3_session)(unsafe.Pointer(pSession)).FpTable for pRet != 0 && (*SessionTable)(unsafe.Pointer(pRet)).FpNext != 0 { pRet = (*SessionTable)(unsafe.Pointer(pRet)).FpNext } } } } *(*uintptr)(unsafe.Pointer(ppTab)) = pRet return rc } func xPreUpdate(tls *libc.TLS, pCtx uintptr, db uintptr, op int32, zDb uintptr, zName uintptr, iKey1 Sqlite3_int64, iKey2 Sqlite3_int64) { bp := tls.Alloc(8) defer tls.Free(8) var pSession uintptr var nDb int32 = Xsqlite3Strlen30(tls, zDb) _ = iKey1 _ = iKey2 for pSession = pCtx; pSession != 0; pSession = (*Sqlite3_session)(unsafe.Pointer(pSession)).FpNext { if (*Sqlite3_session)(unsafe.Pointer(pSession)).FbEnable == 0 { continue } if (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc != 0 { continue } if Xsqlite3_strnicmp(tls, zDb, (*Sqlite3_session)(unsafe.Pointer(pSession)).FzDb, nDb+1) != 0 { continue } (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc = sessionFindTable(tls, pSession, zName, bp) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { sessionPreupdateOneChange(tls, op, pSession, *(*uintptr)(unsafe.Pointer(bp))) if op == SQLITE_UPDATE { sessionPreupdateOneChange(tls, SQLITE_INSERT, pSession, *(*uintptr)(unsafe.Pointer(bp))) } } } } func sessionPreupdateOld(tls *libc.TLS, pCtx uintptr, iVal int32, ppVal uintptr) int32 { return Xsqlite3_preupdate_old(tls, pCtx, iVal, ppVal) } func sessionPreupdateNew(tls *libc.TLS, pCtx uintptr, iVal int32, ppVal uintptr) int32 { return Xsqlite3_preupdate_new(tls, pCtx, iVal, ppVal) } func sessionPreupdateCount(tls *libc.TLS, pCtx uintptr) int32 { return Xsqlite3_preupdate_count(tls, pCtx) } func sessionPreupdateDepth(tls *libc.TLS, pCtx uintptr) int32 { return Xsqlite3_preupdate_depth(tls, pCtx) } func sessionPreupdateHooks(tls *libc.TLS, pSession uintptr) { (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx = (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxOld = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{sessionPreupdateOld})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{sessionPreupdateNew})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxCount = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) int32 }{sessionPreupdateCount})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxDepth = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) int32 }{sessionPreupdateDepth})) } type SessionDiffCtx1 = struct { FpStmt uintptr FnOldOff int32 F__ccgo_pad1 [4]byte } type SessionDiffCtx = SessionDiffCtx1 func sessionDiffOld(tls *libc.TLS, pCtx uintptr, iVal int32, ppVal uintptr) int32 { var p uintptr = pCtx *(*uintptr)(unsafe.Pointer(ppVal)) = Xsqlite3_column_value(tls, (*SessionDiffCtx)(unsafe.Pointer(p)).FpStmt, iVal+(*SessionDiffCtx)(unsafe.Pointer(p)).FnOldOff) return SQLITE_OK } func sessionDiffNew(tls *libc.TLS, pCtx uintptr, iVal int32, ppVal uintptr) int32 { var p uintptr = pCtx *(*uintptr)(unsafe.Pointer(ppVal)) = Xsqlite3_column_value(tls, (*SessionDiffCtx)(unsafe.Pointer(p)).FpStmt, iVal) return SQLITE_OK } func sessionDiffCount(tls *libc.TLS, pCtx uintptr) int32 { var p uintptr = pCtx if (*SessionDiffCtx)(unsafe.Pointer(p)).FnOldOff != 0 { return (*SessionDiffCtx)(unsafe.Pointer(p)).FnOldOff } return Xsqlite3_column_count(tls, (*SessionDiffCtx)(unsafe.Pointer(p)).FpStmt) } func sessionDiffDepth(tls *libc.TLS, pCtx uintptr) int32 { _ = pCtx return 0 } func sessionDiffHooks(tls *libc.TLS, pSession uintptr, pDiffCtx uintptr) { (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx = pDiffCtx (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxOld = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{sessionDiffOld})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxNew = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{sessionDiffNew})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxCount = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) int32 }{sessionDiffCount})) (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FxDepth = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) int32 }{sessionDiffDepth})) } func sessionExprComparePK(tls *libc.TLS, nCol int32, zDb1 uintptr, zDb2 uintptr, zTab uintptr, azCol uintptr, abPK uintptr) uintptr { bp := tls.Alloc(64) defer tls.Free(64) var i int32 var zSep uintptr = ts + 1544 var zRet uintptr = uintptr(0) for i = 0; i < nCol; i++ { if *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { zRet = Xsqlite3_mprintf(tls, ts+33921, libc.VaList(bp, zRet, zSep, zDb1, zTab, *(*uintptr)(unsafe.Pointer(azCol + uintptr(i)*8)), zDb2, zTab, *(*uintptr)(unsafe.Pointer(azCol + uintptr(i)*8)))) zSep = ts + 22941 if zRet == uintptr(0) { break } } } return zRet } func sessionExprCompareOther(tls *libc.TLS, nCol int32, zDb1 uintptr, zDb2 uintptr, zTab uintptr, azCol uintptr, abPK uintptr) uintptr { bp := tls.Alloc(64) defer tls.Free(64) var i int32 var zSep uintptr = ts + 1544 var zRet uintptr = uintptr(0) var bHave int32 = 0 for i = 0; i < nCol; i++ { if int32(*(*U8)(unsafe.Pointer(abPK + uintptr(i)))) == 0 { bHave = 1 zRet = Xsqlite3_mprintf(tls, ts+33955, libc.VaList(bp, zRet, zSep, zDb1, zTab, *(*uintptr)(unsafe.Pointer(azCol + uintptr(i)*8)), zDb2, zTab, *(*uintptr)(unsafe.Pointer(azCol + uintptr(i)*8)))) zSep = ts + 33996 if zRet == uintptr(0) { break } } } if bHave == 0 { zRet = Xsqlite3_mprintf(tls, ts+8871, 0) } return zRet } func sessionSelectFindNew(tls *libc.TLS, zDb1 uintptr, zDb2 uintptr, zTbl uintptr, zExpr uintptr) uintptr { bp := tls.Alloc(40) defer tls.Free(40) var zRet uintptr = Xsqlite3_mprintf(tls, ts+34001, libc.VaList(bp, zDb1, zTbl, zDb2, zTbl, zExpr)) return zRet } func sessionDiffFindNew(tls *libc.TLS, op int32, pSession uintptr, pTab uintptr, zDb1 uintptr, zDb2 uintptr, zExpr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var zStmt uintptr = sessionSelectFindNew(tls, zDb1, zDb2, (*SessionTable)(unsafe.Pointer(pTab)).FzName, zExpr) if zStmt == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_prepare(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb, zStmt, -1, bp, uintptr(0)) if rc == SQLITE_OK { var pDiffCtx uintptr = (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx (*SessionDiffCtx)(unsafe.Pointer(pDiffCtx)).FpStmt = *(*uintptr)(unsafe.Pointer(bp)) (*SessionDiffCtx)(unsafe.Pointer(pDiffCtx)).FnOldOff = 0 for SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) { sessionPreupdateOneChange(tls, op, pSession, pTab) } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) } Xsqlite3_free(tls, zStmt) } return rc } func sessionDiffFindModified(tls *libc.TLS, pSession uintptr, pTab uintptr, zFrom uintptr, zExpr uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var rc int32 = SQLITE_OK var zExpr2 uintptr = sessionExprCompareOther(tls, (*SessionTable)(unsafe.Pointer(pTab)).FnCol, (*Sqlite3_session)(unsafe.Pointer(pSession)).FzDb, zFrom, (*SessionTable)(unsafe.Pointer(pTab)).FzName, (*SessionTable)(unsafe.Pointer(pTab)).FazCol, (*SessionTable)(unsafe.Pointer(pTab)).FabPK) if zExpr2 == uintptr(0) { rc = SQLITE_NOMEM } else { var zStmt uintptr = Xsqlite3_mprintf(tls, ts+34079, libc.VaList(bp, (*Sqlite3_session)(unsafe.Pointer(pSession)).FzDb, (*SessionTable)(unsafe.Pointer(pTab)).FzName, zFrom, (*SessionTable)(unsafe.Pointer(pTab)).FzName, zExpr, zExpr2)) if zStmt == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_prepare(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb, zStmt, -1, bp+48, uintptr(0)) if rc == SQLITE_OK { var pDiffCtx uintptr = (*Sqlite3_session)(unsafe.Pointer(pSession)).Fhook.FpCtx (*SessionDiffCtx)(unsafe.Pointer(pDiffCtx)).FpStmt = *(*uintptr)(unsafe.Pointer(bp + 48)) (*SessionDiffCtx)(unsafe.Pointer(pDiffCtx)).FnOldOff = (*SessionTable)(unsafe.Pointer(pTab)).FnCol for SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 48))) { sessionPreupdateOneChange(tls, SQLITE_UPDATE, pSession, pTab) } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 48))) } Xsqlite3_free(tls, zStmt) } } return rc } func Xsqlite3session_diff(tls *libc.TLS, pSession uintptr, zFrom uintptr, zTbl uintptr, pzErrMsg uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var zDb uintptr var rc int32 var i int32 var bHasPk int32 var bMismatch int32 var zExpr uintptr var db uintptr zDb = (*Sqlite3_session)(unsafe.Pointer(pSession)).FzDb rc = (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(SessionDiffCtx{}))) sessionDiffHooks(tls, pSession, bp) Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) if !(pzErrMsg != 0) { goto __1 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = uintptr(0) __1: ; if !(rc == SQLITE_OK) { goto __2 } zExpr = uintptr(0) db = (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb rc = sessionFindTable(tls, pSession, zTbl, bp+16) if !(*(*uintptr)(unsafe.Pointer(bp + 16)) == uintptr(0)) { goto __3 } goto diff_out __3: ; if !(sessionInitTable(tls, pSession, *(*uintptr)(unsafe.Pointer(bp + 16))) != 0) { goto __4 } rc = (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc goto diff_out __4: ; if !(rc == SQLITE_OK) { goto __5 } bHasPk = 0 bMismatch = 0 *(*uintptr)(unsafe.Pointer(bp + 32)) = uintptr(0) rc = sessionTableInfo(tls, uintptr(0), db, zFrom, zTbl, bp+24, uintptr(0), bp+32, bp+40) if !(rc == SQLITE_OK) { goto __6 } if !((*SessionTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FnCol != *(*int32)(unsafe.Pointer(bp + 24))) { goto __7 } bMismatch = 1 goto __8 __7: i = 0 __9: if !(i < *(*int32)(unsafe.Pointer(bp + 24))) { goto __11 } if !(int32(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FabPK + uintptr(i)))) != int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 40)) + uintptr(i))))) { goto __12 } bMismatch = 1 __12: ; if !(Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 32)) + uintptr(i)*8)), *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FazCol + uintptr(i)*8))) != 0) { goto __13 } bMismatch = 1 __13: ; if !(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 40)) + uintptr(i))) != 0) { goto __14 } bHasPk = 1 __14: ; goto __10 __10: i++ goto __9 goto __11 __11: ; __8: ; __6: ; Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 32))) if !(bMismatch != 0) { goto __15 } if !(pzErrMsg != 0) { goto __16 } *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+34132, 0) __16: ; rc = SQLITE_SCHEMA __15: ; if !(bHasPk == 0) { goto __17 } goto diff_out __17: ; __5: ; if !(rc == SQLITE_OK) { goto __18 } zExpr = sessionExprComparePK(tls, (*SessionTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FnCol, zDb, zFrom, (*SessionTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FzName, (*SessionTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FazCol, (*SessionTable)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FabPK) __18: ; if !(rc == SQLITE_OK) { goto __19 } rc = sessionDiffFindNew(tls, SQLITE_INSERT, pSession, *(*uintptr)(unsafe.Pointer(bp + 16)), zDb, zFrom, zExpr) __19: ; if !(rc == SQLITE_OK) { goto __20 } rc = sessionDiffFindNew(tls, SQLITE_DELETE, pSession, *(*uintptr)(unsafe.Pointer(bp + 16)), zFrom, zDb, zExpr) __20: ; if !(rc == SQLITE_OK) { goto __21 } rc = sessionDiffFindModified(tls, pSession, *(*uintptr)(unsafe.Pointer(bp + 16)), zFrom, zExpr) __21: ; Xsqlite3_free(tls, zExpr) __2: ; diff_out: sessionPreupdateHooks(tls, pSession) Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) return rc } // Create a session object. This session object will record changes to // database zDb attached to connection db. func Xsqlite3session_create(tls *libc.TLS, db uintptr, zDb uintptr, ppSession uintptr) int32 { var pNew uintptr var pOld uintptr var nDb int32 = Xsqlite3Strlen30(tls, zDb) *(*uintptr)(unsafe.Pointer(ppSession)) = uintptr(0) pNew = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(Sqlite3_session{}))+uint64(nDb)+uint64(1)) if !(pNew != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Sqlite3_session{}))) (*Sqlite3_session)(unsafe.Pointer(pNew)).Fdb = db (*Sqlite3_session)(unsafe.Pointer(pNew)).FzDb = pNew + 1*136 (*Sqlite3_session)(unsafe.Pointer(pNew)).FbEnable = 1 libc.Xmemcpy(tls, (*Sqlite3_session)(unsafe.Pointer(pNew)).FzDb, zDb, uint64(nDb+1)) sessionPreupdateHooks(tls, pNew) Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, db)) pOld = Xsqlite3_preupdate_hook(tls, db, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, Sqlite3_int64, Sqlite3_int64) }{xPreUpdate})), pNew) (*Sqlite3_session)(unsafe.Pointer(pNew)).FpNext = pOld Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, db)) *(*uintptr)(unsafe.Pointer(ppSession)) = pNew return SQLITE_OK } func sessionDeleteTable(tls *libc.TLS, pSession uintptr, pList uintptr) { var pNext uintptr var pTab uintptr for pTab = pList; pTab != 0; pTab = pNext { var i int32 pNext = (*SessionTable)(unsafe.Pointer(pTab)).FpNext for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnChange; i++ { var p uintptr var pNextChange uintptr for p = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(i)*8)); p != 0; p = pNextChange { pNextChange = (*SessionChange)(unsafe.Pointer(p)).FpNext sessionFree(tls, pSession, p) } } sessionFree(tls, pSession, (*SessionTable)(unsafe.Pointer(pTab)).FazCol) sessionFree(tls, pSession, (*SessionTable)(unsafe.Pointer(pTab)).FapChange) sessionFree(tls, pSession, pTab) } } // Delete a session object previously allocated using sqlite3session_create(). func Xsqlite3session_delete(tls *libc.TLS, pSession uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var db uintptr = (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb var pp uintptr Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, db)) *(*uintptr)(unsafe.Pointer(bp)) = Xsqlite3_preupdate_hook(tls, db, uintptr(0), uintptr(0)) for pp = bp; *(*uintptr)(unsafe.Pointer(pp)) != uintptr(0); pp = *(*uintptr)(unsafe.Pointer(pp)) + 80 { if *(*uintptr)(unsafe.Pointer(pp)) == pSession { *(*uintptr)(unsafe.Pointer(pp)) = (*Sqlite3_session)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FpNext if *(*uintptr)(unsafe.Pointer(bp)) != 0 { Xsqlite3_preupdate_hook(tls, db, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, Sqlite3_int64, Sqlite3_int64) }{xPreUpdate})), *(*uintptr)(unsafe.Pointer(bp))) } break } } Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, db)) Xsqlite3ValueFree(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).FpZeroBlob) sessionDeleteTable(tls, pSession, (*Sqlite3_session)(unsafe.Pointer(pSession)).FpTable) Xsqlite3_free(tls, pSession) } // Set a table filter on a Session Object. func Xsqlite3session_table_filter(tls *libc.TLS, pSession uintptr, xFilter uintptr, pCtx uintptr) { (*Sqlite3_session)(unsafe.Pointer(pSession)).FbAutoAttach = 1 (*Sqlite3_session)(unsafe.Pointer(pSession)).FpFilterCtx = pCtx (*Sqlite3_session)(unsafe.Pointer(pSession)).FxTableFilter = xFilter } // Attach a table to a session. All subsequent changes made to the table // while the session object is enabled will be recorded. // // Only tables that have a PRIMARY KEY defined may be attached. It does // not matter if the PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) // or not. func Xsqlite3session_attach(tls *libc.TLS, pSession uintptr, zName uintptr) int32 { var rc int32 = SQLITE_OK Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) if !(zName != 0) { (*Sqlite3_session)(unsafe.Pointer(pSession)).FbAutoAttach = 1 } else { var pTab uintptr var nName int32 nName = Xsqlite3Strlen30(tls, zName) for pTab = (*Sqlite3_session)(unsafe.Pointer(pSession)).FpTable; pTab != 0; pTab = (*SessionTable)(unsafe.Pointer(pTab)).FpNext { if 0 == Xsqlite3_strnicmp(tls, (*SessionTable)(unsafe.Pointer(pTab)).FzName, zName, nName+1) { break } } if !(pTab != 0) { var nByte int32 = int32(uint64(unsafe.Sizeof(SessionTable{})) + uint64(nName) + uint64(1)) pTab = sessionMalloc64(tls, pSession, int64(nByte)) if !(pTab != 0) { rc = SQLITE_NOMEM } else { var ppTab uintptr libc.Xmemset(tls, pTab, 0, uint64(unsafe.Sizeof(SessionTable{}))) (*SessionTable)(unsafe.Pointer(pTab)).FzName = pTab + 1*56 libc.Xmemcpy(tls, (*SessionTable)(unsafe.Pointer(pTab)).FzName, zName, uint64(nName+1)) for ppTab = pSession + 88; *(*uintptr)(unsafe.Pointer(ppTab)) != 0; ppTab = *(*uintptr)(unsafe.Pointer(ppTab)) { } *(*uintptr)(unsafe.Pointer(ppTab)) = pTab } } } Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) return rc } func sessionBufferGrow(tls *libc.TLS, p uintptr, nByte I64, pRc uintptr) int32 { var nReq I64 = I64((*SessionBuffer)(unsafe.Pointer(p)).FnBuf) + nByte if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK && nReq > I64((*SessionBuffer)(unsafe.Pointer(p)).FnAlloc) { var aNew uintptr var nNew I64 if (*SessionBuffer)(unsafe.Pointer(p)).FnAlloc != 0 { nNew = int64((*SessionBuffer)(unsafe.Pointer(p)).FnAlloc) } else { nNew = int64(128) } for __ccgo := true; __ccgo; __ccgo = nNew < nReq { nNew = nNew * int64(2) } if nNew > int64(0x7FFFFF00-1) { nNew = int64(0x7FFFFF00 - 1) if nNew < nReq { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM return 1 } } aNew = Xsqlite3_realloc64(tls, (*SessionBuffer)(unsafe.Pointer(p)).FaBuf, uint64(nNew)) if uintptr(0) == aNew { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } else { (*SessionBuffer)(unsafe.Pointer(p)).FaBuf = aNew (*SessionBuffer)(unsafe.Pointer(p)).FnAlloc = int32(nNew) } } return libc.Bool32(*(*int32)(unsafe.Pointer(pRc)) != SQLITE_OK) } func sessionAppendValue(tls *libc.TLS, p uintptr, pVal uintptr, pRc uintptr) { bp := tls.Alloc(12) defer tls.Free(12) *(*int32)(unsafe.Pointer(bp + 8)) = *(*int32)(unsafe.Pointer(pRc)) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*Sqlite3_int64)(unsafe.Pointer(bp)) = int64(0) *(*int32)(unsafe.Pointer(bp + 8)) = sessionSerializeValue(tls, uintptr(0), pVal, bp) sessionBufferGrow(tls, p, *(*Sqlite3_int64)(unsafe.Pointer(bp)), bp+8) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 8)) = sessionSerializeValue(tls, (*SessionBuffer)(unsafe.Pointer(p)).FaBuf+uintptr((*SessionBuffer)(unsafe.Pointer(p)).FnBuf), pVal, uintptr(0)) *(*int32)(unsafe.Pointer(p + 8)) += int32(*(*Sqlite3_int64)(unsafe.Pointer(bp))) } else { *(*int32)(unsafe.Pointer(pRc)) = *(*int32)(unsafe.Pointer(bp + 8)) } } } func sessionAppendByte(tls *libc.TLS, p uintptr, v U8, pRc uintptr) { if 0 == sessionBufferGrow(tls, p, int64(1), pRc) { *(*U8)(unsafe.Pointer((*SessionBuffer)(unsafe.Pointer(p)).FaBuf + uintptr(libc.PostIncInt32(&(*SessionBuffer)(unsafe.Pointer(p)).FnBuf, 1)))) = v } } func sessionAppendVarint(tls *libc.TLS, p uintptr, v int32, pRc uintptr) { if 0 == sessionBufferGrow(tls, p, int64(9), pRc) { *(*int32)(unsafe.Pointer(p + 8)) += sessionVarintPut(tls, (*SessionBuffer)(unsafe.Pointer(p)).FaBuf+uintptr((*SessionBuffer)(unsafe.Pointer(p)).FnBuf), v) } } func sessionAppendBlob(tls *libc.TLS, p uintptr, aBlob uintptr, nBlob int32, pRc uintptr) { if nBlob > 0 && 0 == sessionBufferGrow(tls, p, int64(nBlob), pRc) { libc.Xmemcpy(tls, (*SessionBuffer)(unsafe.Pointer(p)).FaBuf+uintptr((*SessionBuffer)(unsafe.Pointer(p)).FnBuf), aBlob, uint64(nBlob)) *(*int32)(unsafe.Pointer(p + 8)) += nBlob } } func sessionAppendStr(tls *libc.TLS, p uintptr, zStr uintptr, pRc uintptr) { var nStr int32 = Xsqlite3Strlen30(tls, zStr) if 0 == sessionBufferGrow(tls, p, int64(nStr), pRc) { libc.Xmemcpy(tls, (*SessionBuffer)(unsafe.Pointer(p)).FaBuf+uintptr((*SessionBuffer)(unsafe.Pointer(p)).FnBuf), zStr, uint64(nStr)) *(*int32)(unsafe.Pointer(p + 8)) += nStr } } func sessionAppendInteger(tls *libc.TLS, p uintptr, iVal int32, pRc uintptr) { bp := tls.Alloc(32) defer tls.Free(32) Xsqlite3_snprintf(tls, int32(uint64(unsafe.Sizeof([24]int8{}))-uint64(1)), bp+8, ts+6327, libc.VaList(bp, iVal)) sessionAppendStr(tls, p, bp+8, pRc) } func sessionAppendIdent(tls *libc.TLS, p uintptr, zStr uintptr, pRc uintptr) { var nStr int32 = Xsqlite3Strlen30(tls, zStr)*2 + 2 + 1 if 0 == sessionBufferGrow(tls, p, int64(nStr), pRc) { var zOut uintptr = (*SessionBuffer)(unsafe.Pointer(p)).FaBuf + uintptr((*SessionBuffer)(unsafe.Pointer(p)).FnBuf) var zIn uintptr = zStr *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8('"') for *(*int8)(unsafe.Pointer(zIn)) != 0 { if int32(*(*int8)(unsafe.Pointer(zIn))) == '"' { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8('"') } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))) } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8('"') (*SessionBuffer)(unsafe.Pointer(p)).FnBuf = int32((int64(zOut) - int64((*SessionBuffer)(unsafe.Pointer(p)).FaBuf)) / 1) } } func sessionAppendCol(tls *libc.TLS, p uintptr, pStmt uintptr, iCol int32, pRc uintptr) { bp := tls.Alloc(24) defer tls.Free(24) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var eType int32 = Xsqlite3_column_type(tls, pStmt, iCol) sessionAppendByte(tls, p, U8(eType), pRc) if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { if eType == SQLITE_INTEGER { *(*Sqlite3_int64)(unsafe.Pointer(bp)) = Xsqlite3_column_int64(tls, pStmt, iCol) } else { *(*float64)(unsafe.Pointer(bp + 8)) = Xsqlite3_column_double(tls, pStmt, iCol) libc.Xmemcpy(tls, bp, bp+8, uint64(8)) } sessionPutI64(tls, bp+16, *(*Sqlite3_int64)(unsafe.Pointer(bp))) sessionAppendBlob(tls, p, bp+16, 8, pRc) } if eType == SQLITE_BLOB || eType == SQLITE_TEXT { var z uintptr var nByte int32 if eType == SQLITE_BLOB { z = Xsqlite3_column_blob(tls, pStmt, iCol) } else { z = Xsqlite3_column_text(tls, pStmt, iCol) } nByte = Xsqlite3_column_bytes(tls, pStmt, iCol) if z != 0 || eType == SQLITE_BLOB && nByte == 0 { sessionAppendVarint(tls, p, nByte, pRc) sessionAppendBlob(tls, p, z, nByte, pRc) } else { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } } } func sessionAppendUpdate(tls *libc.TLS, pBuf uintptr, bPatchset int32, pStmt uintptr, p uintptr, abPK uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK *(*SessionBuffer)(unsafe.Pointer(bp + 32)) = SessionBuffer{} var bNoop int32 = 1 var nRewind int32 = (*SessionBuffer)(unsafe.Pointer(pBuf)).FnBuf var i int32 var pCsr uintptr = (*SessionChange)(unsafe.Pointer(p)).FaRecord sessionAppendByte(tls, pBuf, uint8(SQLITE_UPDATE), bp) sessionAppendByte(tls, pBuf, (*SessionChange)(unsafe.Pointer(p)).FbIndirect, bp) for i = 0; i < Xsqlite3_column_count(tls, pStmt); i++ { var bChanged int32 = 0 var nAdvance int32 var eType int32 = int32(*(*U8)(unsafe.Pointer(pCsr))) switch eType { case SQLITE_NULL: nAdvance = 1 if Xsqlite3_column_type(tls, pStmt, i) != SQLITE_NULL { bChanged = 1 } break case SQLITE_FLOAT: fallthrough case SQLITE_INTEGER: { nAdvance = 9 if eType == Xsqlite3_column_type(tls, pStmt, i) { *(*Sqlite3_int64)(unsafe.Pointer(bp + 16)) = sessionGetI64(tls, pCsr+1) if eType == SQLITE_INTEGER { if *(*Sqlite3_int64)(unsafe.Pointer(bp + 16)) == Xsqlite3_column_int64(tls, pStmt, i) { break } } else { libc.Xmemcpy(tls, bp+8, bp+16, uint64(8)) if *(*float64)(unsafe.Pointer(bp + 8)) == Xsqlite3_column_double(tls, pStmt, i) { break } } } bChanged = 1 break } default: { var nHdr int32 = 1 + sessionVarintGet(tls, pCsr+1, bp+24) nAdvance = nHdr + *(*int32)(unsafe.Pointer(bp + 24)) if eType == Xsqlite3_column_type(tls, pStmt, i) && *(*int32)(unsafe.Pointer(bp + 24)) == Xsqlite3_column_bytes(tls, pStmt, i) && (*(*int32)(unsafe.Pointer(bp + 24)) == 0 || 0 == libc.Xmemcmp(tls, pCsr+uintptr(nHdr), Xsqlite3_column_blob(tls, pStmt, i), uint64(*(*int32)(unsafe.Pointer(bp + 24))))) { break } bChanged = 1 } } if bChanged != 0 { bNoop = 0 } if bPatchset == 0 { if bChanged != 0 || *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { sessionAppendBlob(tls, pBuf, pCsr, nAdvance, bp) } else { sessionAppendByte(tls, pBuf, uint8(0), bp) } } if bChanged != 0 || bPatchset != 0 && *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { sessionAppendCol(tls, bp+32, pStmt, i, bp) } else { sessionAppendByte(tls, bp+32, uint8(0), bp) } pCsr += uintptr(nAdvance) } if bNoop != 0 { (*SessionBuffer)(unsafe.Pointer(pBuf)).FnBuf = nRewind } else { sessionAppendBlob(tls, pBuf, (*SessionBuffer)(unsafe.Pointer(bp+32)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp+32)).FnBuf, bp) } Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp+32)).FaBuf) return *(*int32)(unsafe.Pointer(bp)) } func sessionAppendDelete(tls *libc.TLS, pBuf uintptr, bPatchset int32, p uintptr, nCol int32, abPK uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK sessionAppendByte(tls, pBuf, uint8(SQLITE_DELETE), bp) sessionAppendByte(tls, pBuf, (*SessionChange)(unsafe.Pointer(p)).FbIndirect, bp) if bPatchset == 0 { sessionAppendBlob(tls, pBuf, (*SessionChange)(unsafe.Pointer(p)).FaRecord, (*SessionChange)(unsafe.Pointer(p)).FnRecord, bp) } else { var i int32 var a uintptr = (*SessionChange)(unsafe.Pointer(p)).FaRecord for i = 0; i < nCol; i++ { var pStart uintptr = a var eType int32 = int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&a, 1)))) switch eType { case 0: fallthrough case SQLITE_NULL: break fallthrough case SQLITE_FLOAT: fallthrough case SQLITE_INTEGER: a += uintptr(8) break fallthrough default: { a += uintptr(sessionVarintGet(tls, a, bp+4)) a += uintptr(*(*int32)(unsafe.Pointer(bp + 4))) break } } if *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { sessionAppendBlob(tls, pBuf, pStart, int32((int64(a)-int64(pStart))/1), bp) } } } return *(*int32)(unsafe.Pointer(bp)) } func sessionSelectStmt(tls *libc.TLS, db uintptr, zDb uintptr, zTab uintptr, nCol int32, azCol uintptr, abPK uintptr, ppStmt uintptr) int32 { bp := tls.Alloc(28) defer tls.Free(28) *(*int32)(unsafe.Pointer(bp + 24)) = SQLITE_OK var zSql uintptr = uintptr(0) var nSql int32 = -1 if 0 == Xsqlite3_stricmp(tls, ts+12700, zTab) { zSql = Xsqlite3_mprintf(tls, ts+34159, libc.VaList(bp, zDb)) if zSql == uintptr(0) { *(*int32)(unsafe.Pointer(bp + 24)) = SQLITE_NOMEM } } else { var i int32 var zSep uintptr = ts + 1544 *(*SessionBuffer)(unsafe.Pointer(bp + 8)) = SessionBuffer{} sessionAppendStr(tls, bp+8, ts+34269, bp+24) sessionAppendIdent(tls, bp+8, zDb, bp+24) sessionAppendStr(tls, bp+8, ts+1557, bp+24) sessionAppendIdent(tls, bp+8, zTab, bp+24) sessionAppendStr(tls, bp+8, ts+34284, bp+24) for i = 0; i < nCol; i++ { if *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { sessionAppendStr(tls, bp+8, zSep, bp+24) sessionAppendIdent(tls, bp+8, *(*uintptr)(unsafe.Pointer(azCol + uintptr(i)*8)), bp+24) sessionAppendStr(tls, bp+8, ts+34292, bp+24) sessionAppendInteger(tls, bp+8, i+1, bp+24) zSep = ts + 22941 } } zSql = (*SessionBuffer)(unsafe.Pointer(bp + 8)).FaBuf nSql = (*SessionBuffer)(unsafe.Pointer(bp + 8)).FnBuf } if *(*int32)(unsafe.Pointer(bp + 24)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 24)) = Xsqlite3_prepare_v2(tls, db, zSql, nSql, ppStmt, uintptr(0)) } Xsqlite3_free(tls, zSql) return *(*int32)(unsafe.Pointer(bp + 24)) } func sessionSelectBind(tls *libc.TLS, pSelect uintptr, nCol int32, abPK uintptr, pChange uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var i int32 var rc int32 = SQLITE_OK var a uintptr = (*SessionChange)(unsafe.Pointer(pChange)).FaRecord for i = 0; i < nCol && rc == SQLITE_OK; i++ { var eType int32 = int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&a, 1)))) switch eType { case 0: fallthrough case SQLITE_NULL: break case SQLITE_INTEGER: { if *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { var iVal I64 = sessionGetI64(tls, a) rc = Xsqlite3_bind_int64(tls, pSelect, i+1, iVal) } a += uintptr(8) break } case SQLITE_FLOAT: { if *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { *(*I64)(unsafe.Pointer(bp + 8)) = sessionGetI64(tls, a) libc.Xmemcpy(tls, bp, bp+8, uint64(8)) rc = Xsqlite3_bind_double(tls, pSelect, i+1, *(*float64)(unsafe.Pointer(bp))) } a += uintptr(8) break } case SQLITE_TEXT: { a += uintptr(sessionVarintGet(tls, a, bp+16)) if *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { rc = Xsqlite3_bind_text(tls, pSelect, i+1, a, *(*int32)(unsafe.Pointer(bp + 16)), libc.UintptrFromInt32(-1)) } a += uintptr(*(*int32)(unsafe.Pointer(bp + 16))) break } default: { a += uintptr(sessionVarintGet(tls, a, bp+20)) if *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { rc = Xsqlite3_bind_blob(tls, pSelect, i+1, a, *(*int32)(unsafe.Pointer(bp + 20)), libc.UintptrFromInt32(-1)) } a += uintptr(*(*int32)(unsafe.Pointer(bp + 20))) break } } } return rc } func sessionAppendTableHdr(tls *libc.TLS, pBuf uintptr, bPatchset int32, pTab uintptr, pRc uintptr) { sessionAppendByte(tls, pBuf, func() uint8 { if bPatchset != 0 { return uint8('P') } return uint8('T') }(), pRc) sessionAppendVarint(tls, pBuf, (*SessionTable)(unsafe.Pointer(pTab)).FnCol, pRc) sessionAppendBlob(tls, pBuf, (*SessionTable)(unsafe.Pointer(pTab)).FabPK, (*SessionTable)(unsafe.Pointer(pTab)).FnCol, pRc) sessionAppendBlob(tls, pBuf, (*SessionTable)(unsafe.Pointer(pTab)).FzName, int32(libc.Xstrlen(tls, (*SessionTable)(unsafe.Pointer(pTab)).FzName))+1, pRc) } func sessionGenerateChangeset(tls *libc.TLS, pSession uintptr, bPatchset int32, xOutput uintptr, pOut uintptr, pnChangeset uintptr, ppChangeset uintptr) int32 { bp := tls.Alloc(56) defer tls.Free(56) var db uintptr = (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb var pTab uintptr *(*SessionBuffer)(unsafe.Pointer(bp + 24)) = SessionBuffer{} if xOutput == uintptr(0) { *(*int32)(unsafe.Pointer(pnChangeset)) = 0 *(*uintptr)(unsafe.Pointer(ppChangeset)) = uintptr(0) } if (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc != 0 { return (*Sqlite3_session)(unsafe.Pointer(pSession)).Frc } *(*int32)(unsafe.Pointer(bp + 40)) = Xsqlite3_exec(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb, ts+34298, uintptr(0), uintptr(0), uintptr(0)) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 40)) } Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, db)) for pTab = (*Sqlite3_session)(unsafe.Pointer(pSession)).FpTable; *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && pTab != 0; pTab = (*SessionTable)(unsafe.Pointer(pTab)).FpNext { if (*SessionTable)(unsafe.Pointer(pTab)).FnEntry != 0 { var zName uintptr = (*SessionTable)(unsafe.Pointer(pTab)).FzName *(*int32)(unsafe.Pointer(bp)) = 0 *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var i int32 *(*uintptr)(unsafe.Pointer(bp + 48)) = uintptr(0) var nRewind int32 = (*SessionBuffer)(unsafe.Pointer(bp + 24)).FnBuf var nNoop int32 *(*int32)(unsafe.Pointer(bp + 40)) = sessionTableInfo(tls, uintptr(0), db, (*Sqlite3_session)(unsafe.Pointer(pSession)).FzDb, zName, bp, uintptr(0), bp+8, bp+16) if !(*(*int32)(unsafe.Pointer(bp + 40)) != 0) && ((*SessionTable)(unsafe.Pointer(pTab)).FnCol != *(*int32)(unsafe.Pointer(bp)) || libc.Xmemcmp(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), (*SessionTable)(unsafe.Pointer(pTab)).FabPK, uint64(*(*int32)(unsafe.Pointer(bp)))) != 0) { *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_SCHEMA } sessionAppendTableHdr(tls, bp+24, bPatchset, pTab, bp+40) if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = sessionSelectStmt(tls, db, (*Sqlite3_session)(unsafe.Pointer(pSession)).FzDb, zName, *(*int32)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 8)), *(*uintptr)(unsafe.Pointer(bp + 16)), bp+48) } nNoop = (*SessionBuffer)(unsafe.Pointer(bp + 24)).FnBuf for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnChange && *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK; i++ { var p uintptr for p = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(i)*8)); *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && p != 0; p = (*SessionChange)(unsafe.Pointer(p)).FpNext { *(*int32)(unsafe.Pointer(bp + 40)) = sessionSelectBind(tls, *(*uintptr)(unsafe.Pointer(bp + 48)), *(*int32)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 16)), p) if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { continue } if Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 48))) == SQLITE_ROW { if int32((*SessionChange)(unsafe.Pointer(p)).Fop) == SQLITE_INSERT { var iCol int32 sessionAppendByte(tls, bp+24, uint8(SQLITE_INSERT), bp+40) sessionAppendByte(tls, bp+24, (*SessionChange)(unsafe.Pointer(p)).FbIndirect, bp+40) for iCol = 0; iCol < *(*int32)(unsafe.Pointer(bp)); iCol++ { sessionAppendCol(tls, bp+24, *(*uintptr)(unsafe.Pointer(bp + 48)), iCol, bp+40) } } else { *(*int32)(unsafe.Pointer(bp + 40)) = sessionAppendUpdate(tls, bp+24, bPatchset, *(*uintptr)(unsafe.Pointer(bp + 48)), p, *(*uintptr)(unsafe.Pointer(bp + 16))) } } else if int32((*SessionChange)(unsafe.Pointer(p)).Fop) != SQLITE_INSERT { *(*int32)(unsafe.Pointer(bp + 40)) = sessionAppendDelete(tls, bp+24, bPatchset, p, *(*int32)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(bp + 16))) } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp + 48))) } if xOutput != 0 && *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && (*SessionBuffer)(unsafe.Pointer(bp+24)).FnBuf > nNoop && (*SessionBuffer)(unsafe.Pointer(bp+24)).FnBuf > sessions_strm_chunk_size { *(*int32)(unsafe.Pointer(bp + 40)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp+24)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp+24)).FnBuf) nNoop = -1 (*SessionBuffer)(unsafe.Pointer(bp + 24)).FnBuf = 0 } } } Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 48))) if (*SessionBuffer)(unsafe.Pointer(bp+24)).FnBuf == nNoop { (*SessionBuffer)(unsafe.Pointer(bp + 24)).FnBuf = nRewind } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { if xOutput == uintptr(0) { *(*int32)(unsafe.Pointer(pnChangeset)) = (*SessionBuffer)(unsafe.Pointer(bp + 24)).FnBuf *(*uintptr)(unsafe.Pointer(ppChangeset)) = (*SessionBuffer)(unsafe.Pointer(bp + 24)).FaBuf (*SessionBuffer)(unsafe.Pointer(bp + 24)).FaBuf = uintptr(0) } else if (*SessionBuffer)(unsafe.Pointer(bp+24)).FnBuf > 0 { *(*int32)(unsafe.Pointer(bp + 40)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp+24)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp+24)).FnBuf) } } Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp+24)).FaBuf) Xsqlite3_exec(tls, db, ts+34318, uintptr(0), uintptr(0), uintptr(0)) Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, db)) return *(*int32)(unsafe.Pointer(bp + 40)) } // Obtain a changeset object containing all changes recorded by the // session object passed as the first argument. // // It is the responsibility of the caller to eventually free the buffer // using sqlite3_free(). func Xsqlite3session_changeset(tls *libc.TLS, pSession uintptr, pnChangeset uintptr, ppChangeset uintptr) int32 { var rc int32 if pnChangeset == uintptr(0) || ppChangeset == uintptr(0) { return SQLITE_MISUSE } rc = sessionGenerateChangeset(tls, pSession, 0, uintptr(0), uintptr(0), pnChangeset, ppChangeset) return rc } // Streaming version of sqlite3session_changeset(). func Xsqlite3session_changeset_strm(tls *libc.TLS, pSession uintptr, xOutput uintptr, pOut uintptr) int32 { if xOutput == uintptr(0) { return SQLITE_MISUSE } return sessionGenerateChangeset(tls, pSession, 0, xOutput, pOut, uintptr(0), uintptr(0)) } // Streaming version of sqlite3session_patchset(). func Xsqlite3session_patchset_strm(tls *libc.TLS, pSession uintptr, xOutput uintptr, pOut uintptr) int32 { if xOutput == uintptr(0) { return SQLITE_MISUSE } return sessionGenerateChangeset(tls, pSession, 1, xOutput, pOut, uintptr(0), uintptr(0)) } // Obtain a patchset object containing all changes recorded by the // session object passed as the first argument. // // It is the responsibility of the caller to eventually free the buffer // using sqlite3_free(). func Xsqlite3session_patchset(tls *libc.TLS, pSession uintptr, pnPatchset uintptr, ppPatchset uintptr) int32 { if pnPatchset == uintptr(0) || ppPatchset == uintptr(0) { return SQLITE_MISUSE } return sessionGenerateChangeset(tls, pSession, 1, uintptr(0), uintptr(0), pnPatchset, ppPatchset) } // Enable or disable the session object passed as the first argument. func Xsqlite3session_enable(tls *libc.TLS, pSession uintptr, bEnable int32) int32 { var ret int32 Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) if bEnable >= 0 { (*Sqlite3_session)(unsafe.Pointer(pSession)).FbEnable = bEnable } ret = (*Sqlite3_session)(unsafe.Pointer(pSession)).FbEnable Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) return ret } // Enable or disable the session object passed as the first argument. func Xsqlite3session_indirect(tls *libc.TLS, pSession uintptr, bIndirect int32) int32 { var ret int32 Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) if bIndirect >= 0 { (*Sqlite3_session)(unsafe.Pointer(pSession)).FbIndirect = bIndirect } ret = (*Sqlite3_session)(unsafe.Pointer(pSession)).FbIndirect Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) return ret } // Return true if there have been no changes to monitored tables recorded // by the session object passed as the only argument. func Xsqlite3session_isempty(tls *libc.TLS, pSession uintptr) int32 { var ret int32 = 0 var pTab uintptr Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) for pTab = (*Sqlite3_session)(unsafe.Pointer(pSession)).FpTable; pTab != 0 && ret == 0; pTab = (*SessionTable)(unsafe.Pointer(pTab)).FpNext { ret = libc.Bool32((*SessionTable)(unsafe.Pointer(pTab)).FnEntry > 0) } Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, (*Sqlite3_session)(unsafe.Pointer(pSession)).Fdb)) return libc.Bool32(ret == 0) } // Return the amount of heap memory in use. func Xsqlite3session_memory_used(tls *libc.TLS, pSession uintptr) Sqlite3_int64 { return (*Sqlite3_session)(unsafe.Pointer(pSession)).FnMalloc } // Configure the session object passed as the first argument. func Xsqlite3session_object_config(tls *libc.TLS, pSession uintptr, op int32, pArg uintptr) int32 { var rc int32 = SQLITE_OK switch op { case SQLITE_SESSION_OBJCONFIG_SIZE: { var iArg int32 = *(*int32)(unsafe.Pointer(pArg)) if iArg >= 0 { if (*Sqlite3_session)(unsafe.Pointer(pSession)).FpTable != 0 { rc = SQLITE_MISUSE } else { (*Sqlite3_session)(unsafe.Pointer(pSession)).FbEnableSize = libc.Bool32(iArg != 0) } } *(*int32)(unsafe.Pointer(pArg)) = (*Sqlite3_session)(unsafe.Pointer(pSession)).FbEnableSize break } default: rc = SQLITE_MISUSE } return rc } // Return the maximum size of sqlite3session_changeset() output. func Xsqlite3session_changeset_size(tls *libc.TLS, pSession uintptr) Sqlite3_int64 { return (*Sqlite3_session)(unsafe.Pointer(pSession)).FnMaxChangesetSize } func sessionChangesetStart(tls *libc.TLS, pp uintptr, xInput uintptr, pIn uintptr, nChangeset int32, pChangeset uintptr, bInvert int32, bSkipEmpty int32) int32 { var pRet uintptr var nByte int32 *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) nByte = int32(unsafe.Sizeof(Sqlite3_changeset_iter{})) pRet = Xsqlite3_malloc(tls, nByte) if !(pRet != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, pRet, 0, uint64(unsafe.Sizeof(Sqlite3_changeset_iter{}))) (*Sqlite3_changeset_iter)(unsafe.Pointer(pRet)).Fin.FaData = pChangeset (*Sqlite3_changeset_iter)(unsafe.Pointer(pRet)).Fin.FnData = nChangeset (*Sqlite3_changeset_iter)(unsafe.Pointer(pRet)).Fin.FxInput = xInput (*Sqlite3_changeset_iter)(unsafe.Pointer(pRet)).Fin.FpIn = pIn (*Sqlite3_changeset_iter)(unsafe.Pointer(pRet)).Fin.FbEof = func() int32 { if xInput != 0 { return 0 } return 1 }() (*Sqlite3_changeset_iter)(unsafe.Pointer(pRet)).FbInvert = bInvert (*Sqlite3_changeset_iter)(unsafe.Pointer(pRet)).FbSkipEmpty = bSkipEmpty *(*uintptr)(unsafe.Pointer(pp)) = pRet return SQLITE_OK } // Create an iterator used to iterate through the contents of a changeset. func Xsqlite3changeset_start(tls *libc.TLS, pp uintptr, nChangeset int32, pChangeset uintptr) int32 { return sessionChangesetStart(tls, pp, uintptr(0), uintptr(0), nChangeset, pChangeset, 0, 0) } func Xsqlite3changeset_start_v2(tls *libc.TLS, pp uintptr, nChangeset int32, pChangeset uintptr, flags int32) int32 { var bInvert int32 = libc.BoolInt32(!!(flags&SQLITE_CHANGESETSTART_INVERT != 0)) return sessionChangesetStart(tls, pp, uintptr(0), uintptr(0), nChangeset, pChangeset, bInvert, 0) } // Streaming version of sqlite3changeset_start(). func Xsqlite3changeset_start_strm(tls *libc.TLS, pp uintptr, xInput uintptr, pIn uintptr) int32 { return sessionChangesetStart(tls, pp, xInput, pIn, 0, uintptr(0), 0, 0) } func Xsqlite3changeset_start_v2_strm(tls *libc.TLS, pp uintptr, xInput uintptr, pIn uintptr, flags int32) int32 { var bInvert int32 = libc.BoolInt32(!!(flags&SQLITE_CHANGESETSTART_INVERT != 0)) return sessionChangesetStart(tls, pp, xInput, pIn, 0, uintptr(0), bInvert, 0) } func sessionDiscardData(tls *libc.TLS, pIn uintptr) { if (*SessionInput)(unsafe.Pointer(pIn)).FxInput != 0 && (*SessionInput)(unsafe.Pointer(pIn)).FiNext >= sessions_strm_chunk_size { var nMove int32 = (*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FnBuf - (*SessionInput)(unsafe.Pointer(pIn)).FiNext if nMove > 0 { libc.Xmemmove(tls, (*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FaBuf, (*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FaBuf+uintptr((*SessionInput)(unsafe.Pointer(pIn)).FiNext), uint64(nMove)) } *(*int32)(unsafe.Pointer(pIn + 32 + 8)) -= (*SessionInput)(unsafe.Pointer(pIn)).FiNext (*SessionInput)(unsafe.Pointer(pIn)).FiNext = 0 (*SessionInput)(unsafe.Pointer(pIn)).FnData = (*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FnBuf } } func sessionInputBuffer(tls *libc.TLS, pIn uintptr, nByte int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK if (*SessionInput)(unsafe.Pointer(pIn)).FxInput != 0 { for !((*SessionInput)(unsafe.Pointer(pIn)).FbEof != 0) && (*SessionInput)(unsafe.Pointer(pIn)).FiNext+nByte >= (*SessionInput)(unsafe.Pointer(pIn)).FnData && *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 4)) = sessions_strm_chunk_size if (*SessionInput)(unsafe.Pointer(pIn)).FbNoDiscard == 0 { sessionDiscardData(tls, pIn) } if SQLITE_OK == sessionBufferGrow(tls, pIn+32, int64(*(*int32)(unsafe.Pointer(bp + 4))), bp) { *(*int32)(unsafe.Pointer(bp)) = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*SessionInput)(unsafe.Pointer(pIn)).FxInput})).f(tls, (*SessionInput)(unsafe.Pointer(pIn)).FpIn, (*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FaBuf+uintptr((*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FnBuf), bp+4) if *(*int32)(unsafe.Pointer(bp + 4)) == 0 { (*SessionInput)(unsafe.Pointer(pIn)).FbEof = 1 } else { *(*int32)(unsafe.Pointer(pIn + 32 + 8)) += *(*int32)(unsafe.Pointer(bp + 4)) } } (*SessionInput)(unsafe.Pointer(pIn)).FaData = (*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FaBuf (*SessionInput)(unsafe.Pointer(pIn)).FnData = (*SessionInput)(unsafe.Pointer(pIn)).Fbuf.FnBuf } } return *(*int32)(unsafe.Pointer(bp)) } func sessionSkipRecord(tls *libc.TLS, ppRec uintptr, nCol int32) { bp := tls.Alloc(4) defer tls.Free(4) var aRec uintptr = *(*uintptr)(unsafe.Pointer(ppRec)) var i int32 for i = 0; i < nCol; i++ { var eType int32 = int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&aRec, 1)))) if eType == SQLITE_TEXT || eType == SQLITE_BLOB { aRec += uintptr(sessionVarintGet(tls, aRec, bp)) aRec += uintptr(*(*int32)(unsafe.Pointer(bp))) } else if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { aRec += uintptr(8) } } *(*uintptr)(unsafe.Pointer(ppRec)) = aRec } func sessionValueSetStr(tls *libc.TLS, pVal uintptr, aData uintptr, nData int32, enc U8) int32 { var aCopy uintptr = Xsqlite3_malloc64(tls, uint64(Sqlite3_int64(nData)+int64(1))) if aCopy == uintptr(0) { return SQLITE_NOMEM } libc.Xmemcpy(tls, aCopy, aData, uint64(nData)) Xsqlite3ValueSetStr(tls, pVal, nData, aCopy, enc, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) return SQLITE_OK } func sessionReadRecord(tls *libc.TLS, pIn uintptr, nCol int32, abPK uintptr, apOut uintptr, pbEmpty uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var i int32 var rc int32 = SQLITE_OK if pbEmpty != 0 { *(*int32)(unsafe.Pointer(pbEmpty)) = 1 } for i = 0; i < nCol && rc == SQLITE_OK; i++ { var eType int32 = 0 if abPK != 0 && int32(*(*U8)(unsafe.Pointer(abPK + uintptr(i)))) == 0 { continue } rc = sessionInputBuffer(tls, pIn, 9) if rc == SQLITE_OK { if (*SessionInput)(unsafe.Pointer(pIn)).FiNext >= (*SessionInput)(unsafe.Pointer(pIn)).FnData { rc = Xsqlite3CorruptError(tls, 219169) } else { eType = int32(*(*U8)(unsafe.Pointer((*SessionInput)(unsafe.Pointer(pIn)).FaData + uintptr(libc.PostIncInt32(&(*SessionInput)(unsafe.Pointer(pIn)).FiNext, 1))))) if eType != 0 { if pbEmpty != 0 { *(*int32)(unsafe.Pointer(pbEmpty)) = 0 } *(*uintptr)(unsafe.Pointer(apOut + uintptr(i)*8)) = Xsqlite3ValueNew(tls, uintptr(0)) if !(int32(*(*uintptr)(unsafe.Pointer(apOut + uintptr(i)*8))) != 0) { rc = SQLITE_NOMEM } } } } if rc == SQLITE_OK { var aVal uintptr = (*SessionInput)(unsafe.Pointer(pIn)).FaData + uintptr((*SessionInput)(unsafe.Pointer(pIn)).FiNext) if eType == SQLITE_TEXT || eType == SQLITE_BLOB { *(*int32)(unsafe.Pointer(pIn + 8)) += sessionVarintGet(tls, aVal, bp) rc = sessionInputBuffer(tls, pIn, *(*int32)(unsafe.Pointer(bp))) if rc == SQLITE_OK { if *(*int32)(unsafe.Pointer(bp)) < 0 || *(*int32)(unsafe.Pointer(bp)) > (*SessionInput)(unsafe.Pointer(pIn)).FnData-(*SessionInput)(unsafe.Pointer(pIn)).FiNext { rc = Xsqlite3CorruptError(tls, 219189) } else { var enc U8 = func() uint8 { if eType == SQLITE_TEXT { return uint8(SQLITE_UTF8) } return uint8(0) }() rc = sessionValueSetStr(tls, *(*uintptr)(unsafe.Pointer(apOut + uintptr(i)*8)), (*SessionInput)(unsafe.Pointer(pIn)).FaData+uintptr((*SessionInput)(unsafe.Pointer(pIn)).FiNext), *(*int32)(unsafe.Pointer(bp)), enc) *(*int32)(unsafe.Pointer(pIn + 8)) += *(*int32)(unsafe.Pointer(bp)) } } } if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { *(*Sqlite3_int64)(unsafe.Pointer(bp + 16)) = sessionGetI64(tls, aVal) if eType == SQLITE_INTEGER { Xsqlite3VdbeMemSetInt64(tls, *(*uintptr)(unsafe.Pointer(apOut + uintptr(i)*8)), *(*Sqlite3_int64)(unsafe.Pointer(bp + 16))) } else { libc.Xmemcpy(tls, bp+8, bp+16, uint64(8)) Xsqlite3VdbeMemSetDouble(tls, *(*uintptr)(unsafe.Pointer(apOut + uintptr(i)*8)), *(*float64)(unsafe.Pointer(bp + 8))) } *(*int32)(unsafe.Pointer(pIn + 8)) += 8 } } } return rc } func sessionChangesetBufferTblhdr(tls *libc.TLS, pIn uintptr, pnByte uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 = SQLITE_OK *(*int32)(unsafe.Pointer(bp)) = 0 var nRead int32 = 0 rc = sessionInputBuffer(tls, pIn, 9) if rc == SQLITE_OK { nRead = nRead + sessionVarintGet(tls, (*SessionInput)(unsafe.Pointer(pIn)).FaData+uintptr((*SessionInput)(unsafe.Pointer(pIn)).FiNext+nRead), bp) if *(*int32)(unsafe.Pointer(bp)) < 0 || *(*int32)(unsafe.Pointer(bp)) > 65536 { rc = Xsqlite3CorruptError(tls, 219243) } else { rc = sessionInputBuffer(tls, pIn, nRead+*(*int32)(unsafe.Pointer(bp))+100) nRead = nRead + *(*int32)(unsafe.Pointer(bp)) } } for rc == SQLITE_OK { for (*SessionInput)(unsafe.Pointer(pIn)).FiNext+nRead < (*SessionInput)(unsafe.Pointer(pIn)).FnData && *(*U8)(unsafe.Pointer((*SessionInput)(unsafe.Pointer(pIn)).FaData + uintptr((*SessionInput)(unsafe.Pointer(pIn)).FiNext+nRead))) != 0 { nRead++ } if (*SessionInput)(unsafe.Pointer(pIn)).FiNext+nRead < (*SessionInput)(unsafe.Pointer(pIn)).FnData { break } rc = sessionInputBuffer(tls, pIn, nRead+100) } *(*int32)(unsafe.Pointer(pnByte)) = nRead + 1 return rc } func sessionChangesetBufferRecord(tls *libc.TLS, pIn uintptr, nCol int32, pnByte uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 = SQLITE_OK var nByte int32 = 0 var i int32 for i = 0; rc == SQLITE_OK && i < nCol; i++ { var eType int32 rc = sessionInputBuffer(tls, pIn, nByte+10) if rc == SQLITE_OK { eType = int32(*(*U8)(unsafe.Pointer((*SessionInput)(unsafe.Pointer(pIn)).FaData + uintptr((*SessionInput)(unsafe.Pointer(pIn)).FiNext+libc.PostIncInt32(&nByte, 1))))) if eType == SQLITE_TEXT || eType == SQLITE_BLOB { nByte = nByte + sessionVarintGet(tls, (*SessionInput)(unsafe.Pointer(pIn)).FaData+uintptr((*SessionInput)(unsafe.Pointer(pIn)).FiNext+nByte), bp) nByte = nByte + *(*int32)(unsafe.Pointer(bp)) rc = sessionInputBuffer(tls, pIn, nByte) } else if eType == SQLITE_INTEGER || eType == SQLITE_FLOAT { nByte = nByte + 8 } } } *(*int32)(unsafe.Pointer(pnByte)) = nByte return rc } func sessionChangesetReadTblhdr(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*int32)(unsafe.Pointer(bp + 4)) = sessionChangesetBufferTblhdr(tls, p, bp) if *(*int32)(unsafe.Pointer(bp + 4)) == SQLITE_OK { var nByte int32 var nVarint int32 nVarint = sessionVarintGet(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FaData+uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext), p+120) if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol > 0 { *(*int32)(unsafe.Pointer(bp)) -= nVarint *(*int32)(unsafe.Pointer(p + 8)) += nVarint nByte = int32(uint64((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol)*uint64(unsafe.Sizeof(uintptr(0)))*uint64(2) + uint64(*(*int32)(unsafe.Pointer(bp)))) (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Ftblhdr.FnBuf = 0 sessionBufferGrow(tls, p+72, int64(nByte), bp+4) } else { *(*int32)(unsafe.Pointer(bp + 4)) = Xsqlite3CorruptError(tls, 219331) } } if *(*int32)(unsafe.Pointer(bp + 4)) == SQLITE_OK { var iPK Size_t = uint64(unsafe.Sizeof(uintptr(0))) * uint64((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol) * uint64(2) libc.Xmemset(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Ftblhdr.FaBuf, 0, iPK) libc.Xmemcpy(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Ftblhdr.FaBuf+uintptr(iPK), (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FaData+uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext), uint64(*(*int32)(unsafe.Pointer(bp)))) *(*int32)(unsafe.Pointer(p + 8)) += *(*int32)(unsafe.Pointer(bp)) } (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Ftblhdr.FaBuf if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue == uintptr(0) { (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK = uintptr(0) (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FzTab = uintptr(0) } else { (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol*2)*8 (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FzTab = func() uintptr { if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK != 0 { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol) } return uintptr(0) }() } return libc.AssignPtrInt32(p+100, *(*int32)(unsafe.Pointer(bp + 4))) } func sessionChangesetNextOne(tls *libc.TLS, p uintptr, paRec uintptr, pnRec uintptr, pbNew uintptr, pbEmpty uintptr) int32 { var i int32 var op U8 if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc != SQLITE_OK { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc } if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue != 0 { for i = 0; i < (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol*2; i++ { Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i)*8))) } libc.Xmemset(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol)*uint64(2)) } (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc = sessionInputBuffer(tls, p, 2) if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc != SQLITE_OK { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc } if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext >= (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FnData { return SQLITE_DONE } sessionDiscardData(tls, p) (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiCurrent = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext op = *(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FaData + uintptr(libc.PostIncInt32(&(*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext, 1)))) for int32(op) == 'T' || int32(op) == 'P' { if pbNew != 0 { *(*int32)(unsafe.Pointer(pbNew)) = 1 } (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset = libc.Bool32(int32(op) == 'P') if sessionChangesetReadTblhdr(tls, p) != 0 { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc } if libc.AssignPtrInt32(p+100, sessionInputBuffer(tls, p, 2)) != 0 { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc } (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiCurrent = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext >= (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FnData { return SQLITE_DONE } op = *(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FaData + uintptr(libc.PostIncInt32(&(*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext, 1)))) } if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FzTab == uintptr(0) || (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset != 0 && (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbInvert != 0 { return libc.AssignPtrInt32(p+100, Xsqlite3CorruptError(tls, 219417)) } (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop = int32(op) (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbIndirect = int32(*(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FaData + uintptr(libc.PostIncInt32(&(*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext, 1))))) if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop != SQLITE_UPDATE && (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop != SQLITE_DELETE && (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop != SQLITE_INSERT { return libc.AssignPtrInt32(p+100, Xsqlite3CorruptError(tls, 219423)) } if paRec != 0 { var nVal int32 if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset == 0 && int32(op) == SQLITE_UPDATE { nVal = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol * 2 } else if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset != 0 && int32(op) == SQLITE_DELETE { nVal = 0 for i = 0; i < (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol; i++ { if *(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK + uintptr(i))) != 0 { nVal++ } } } else { nVal = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol } (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc = sessionChangesetBufferRecord(tls, p, nVal, pnRec) if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc != SQLITE_OK { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc } *(*uintptr)(unsafe.Pointer(paRec)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FaData + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.FiNext) *(*int32)(unsafe.Pointer(p + 8)) += *(*int32)(unsafe.Pointer(pnRec)) } else { var apOld uintptr = func() uintptr { if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbInvert != 0 { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol)*8 } return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue }() var apNew uintptr = func() uintptr { if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbInvert != 0 { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue } return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol)*8 }() if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop != SQLITE_INSERT && ((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset == 0 || (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop == SQLITE_DELETE) { var abPK uintptr if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset != 0 { abPK = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK } else { abPK = uintptr(0) } (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc = sessionReadRecord(tls, p, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol, abPK, apOld, uintptr(0)) if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc != SQLITE_OK { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc } } if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop != SQLITE_DELETE { (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc = sessionReadRecord(tls, p, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol, uintptr(0), apNew, pbEmpty) if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc != SQLITE_OK { return (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc } } if ((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset != 0 || (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbInvert != 0) && (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop == SQLITE_UPDATE { for i = 0; i < (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol; i++ { if *(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK + uintptr(i))) != 0 { *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i+(*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol)*8)) if *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i)*8)) == uintptr(0) { return libc.AssignPtrInt32(p+100, Xsqlite3CorruptError(tls, 219467)) } *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i+(*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol)*8)) = uintptr(0) } } } else if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbInvert != 0 { if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop == SQLITE_INSERT { (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop = SQLITE_DELETE } else if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop == SQLITE_DELETE { (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop = SQLITE_INSERT } } if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbPatchset == 0 && (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fop == SQLITE_UPDATE { for i = 0; i < (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol; i++ { if int32(*(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FabPK + uintptr(i)))) == 0 && *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i+(*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol)*8)) == uintptr(0) { Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i)*8)) = uintptr(0) } } } } return SQLITE_ROW } func sessionChangesetNext(tls *libc.TLS, p uintptr, paRec uintptr, pnRec uintptr, pbNew uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 for __ccgo := true; __ccgo; __ccgo = rc == SQLITE_ROW && (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FbSkipEmpty != 0 && *(*int32)(unsafe.Pointer(bp)) != 0 { *(*int32)(unsafe.Pointer(bp)) = 0 rc = sessionChangesetNextOne(tls, p, paRec, pnRec, pbNew, bp) } return rc } // Advance an iterator created by sqlite3changeset_start() to the next // change in the changeset. This function may return SQLITE_ROW, SQLITE_DONE // or SQLITE_CORRUPT. // // This function may not be called on iterators passed to a conflict handler // callback by changeset_apply(). func Xsqlite3changeset_next(tls *libc.TLS, p uintptr) int32 { return sessionChangesetNext(tls, p, uintptr(0), uintptr(0), uintptr(0)) } // The following function extracts information on the current change // from a changeset iterator. It may only be called after changeset_next() // has returned SQLITE_ROW. func Xsqlite3changeset_op(tls *libc.TLS, pIter uintptr, pzTab uintptr, pnCol uintptr, pOp uintptr, pbIndirect uintptr) int32 { *(*int32)(unsafe.Pointer(pOp)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop *(*int32)(unsafe.Pointer(pnCol)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol *(*uintptr)(unsafe.Pointer(pzTab)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FzTab if pbIndirect != 0 { *(*int32)(unsafe.Pointer(pbIndirect)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbIndirect } return SQLITE_OK } // Return information regarding the PRIMARY KEY and number of columns in // the database table affected by the change that pIter currently points // to. This function may only be called after changeset_next() returns // SQLITE_ROW. func Xsqlite3changeset_pk(tls *libc.TLS, pIter uintptr, pabPK uintptr, pnCol uintptr) int32 { *(*uintptr)(unsafe.Pointer(pabPK)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FabPK if pnCol != 0 { *(*int32)(unsafe.Pointer(pnCol)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol } return SQLITE_OK } // This function may only be called while the iterator is pointing to an // SQLITE_UPDATE or SQLITE_DELETE change (see sqlite3changeset_op()). // Otherwise, SQLITE_MISUSE is returned. // // It sets *ppValue to point to an sqlite3_value structure containing the // iVal'th value in the old.* record. Or, if that particular value is not // included in the record (because the change is an UPDATE and the field // was not modified and is not a PK column), set *ppValue to NULL. // // If value iVal is out-of-range, SQLITE_RANGE is returned and *ppValue is // not modified. Otherwise, SQLITE_OK. func Xsqlite3changeset_old(tls *libc.TLS, pIter uintptr, iVal int32, ppValue uintptr) int32 { if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop != SQLITE_UPDATE && (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop != SQLITE_DELETE { return SQLITE_MISUSE } if iVal < 0 || iVal >= (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol { return SQLITE_RANGE } *(*uintptr)(unsafe.Pointer(ppValue)) = *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue + uintptr(iVal)*8)) return SQLITE_OK } // This function may only be called while the iterator is pointing to an // SQLITE_UPDATE or SQLITE_INSERT change (see sqlite3changeset_op()). // Otherwise, SQLITE_MISUSE is returned. // // It sets *ppValue to point to an sqlite3_value structure containing the // iVal'th value in the new.* record. Or, if that particular value is not // included in the record (because the change is an UPDATE and the field // was not modified), set *ppValue to NULL. // // If value iVal is out-of-range, SQLITE_RANGE is returned and *ppValue is // not modified. Otherwise, SQLITE_OK. func Xsqlite3changeset_new(tls *libc.TLS, pIter uintptr, iVal int32, ppValue uintptr) int32 { if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop != SQLITE_UPDATE && (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop != SQLITE_INSERT { return SQLITE_MISUSE } if iVal < 0 || iVal >= (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol { return SQLITE_RANGE } *(*uintptr)(unsafe.Pointer(ppValue)) = *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol+iVal)*8)) return SQLITE_OK } // This function may only be called with a changeset iterator that has been // passed to an SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT // conflict-handler function. Otherwise, SQLITE_MISUSE is returned. // // If successful, *ppValue is set to point to an sqlite3_value structure // containing the iVal'th value of the conflicting record. // // If value iVal is out-of-range or some other error occurs, an SQLite error // code is returned. Otherwise, SQLITE_OK. func Xsqlite3changeset_conflict(tls *libc.TLS, pIter uintptr, iVal int32, ppValue uintptr) int32 { if !(int32((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FpConflict) != 0) { return SQLITE_MISUSE } if iVal < 0 || iVal >= (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol { return SQLITE_RANGE } *(*uintptr)(unsafe.Pointer(ppValue)) = Xsqlite3_column_value(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FpConflict, iVal) return SQLITE_OK } // This function may only be called with an iterator passed to an // SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case // it sets the output variable to the total number of known foreign key // violations in the destination database and returns SQLITE_OK. // // In all other cases this function returns SQLITE_MISUSE. func Xsqlite3changeset_fk_conflicts(tls *libc.TLS, pIter uintptr, pnOut uintptr) int32 { if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FpConflict != 0 || (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue != 0 { return SQLITE_MISUSE } *(*int32)(unsafe.Pointer(pnOut)) = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol return SQLITE_OK } // Finalize an iterator allocated with sqlite3changeset_start(). // // This function may not be called on iterators passed to a conflict handler // callback by changeset_apply(). func Xsqlite3changeset_finalize(tls *libc.TLS, p uintptr) int32 { var rc int32 = SQLITE_OK if p != 0 { var i int32 rc = (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Frc if (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue != 0 { for i = 0; i < (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FnCol*2; i++ { Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(p)).FapValue + uintptr(i)*8))) } } Xsqlite3_free(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Ftblhdr.FaBuf) Xsqlite3_free(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(p)).Fin.Fbuf.FaBuf) Xsqlite3_free(tls, p) } return rc } func sessionChangesetInvert(tls *libc.TLS, pInput uintptr, xOutput uintptr, pOut uintptr, pnInverted uintptr, ppInverted uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var abPK uintptr var apVal uintptr var nVar int32 var bIndirect int32 var eType2 int32 var pVal uintptr var pVal1 uintptr var iCol int32 var eType U8 *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_OK *(*int32)(unsafe.Pointer(bp + 20)) = 0 abPK = uintptr(0) apVal = uintptr(0) *(*SessionBuffer)(unsafe.Pointer(bp + 24)) = SessionBuffer{} libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(SessionBuffer{}))) if !(ppInverted != 0) { goto __1 } *(*uintptr)(unsafe.Pointer(ppInverted)) = uintptr(0) *(*int32)(unsafe.Pointer(pnInverted)) = 0 __1: ; __2: if !(1 != 0) { goto __3 } if !(libc.AssignPtrInt32(bp+40, sessionInputBuffer(tls, pInput, 2)) != 0) { goto __4 } goto finished_invert __4: ; if !((*SessionInput)(unsafe.Pointer(pInput)).FiNext >= (*SessionInput)(unsafe.Pointer(pInput)).FnData) { goto __5 } goto __3 __5: ; eType = *(*U8)(unsafe.Pointer((*SessionInput)(unsafe.Pointer(pInput)).FaData + uintptr((*SessionInput)(unsafe.Pointer(pInput)).FiNext))) switch int32(eType) { case 'T': goto __7 case SQLITE_INSERT: goto __8 case SQLITE_DELETE: goto __9 case SQLITE_UPDATE: goto __10 default: goto __11 } goto __6 __7: (*SessionInput)(unsafe.Pointer(pInput)).FiNext++ if !(libc.AssignPtrInt32(bp+40, sessionChangesetBufferTblhdr(tls, pInput, bp+16)) != 0) { goto __12 } goto finished_invert __12: ; nVar = sessionVarintGet(tls, (*SessionInput)(unsafe.Pointer(pInput)).FaData+uintptr((*SessionInput)(unsafe.Pointer(pInput)).FiNext), bp+20) (*SessionBuffer)(unsafe.Pointer(bp + 24)).FnBuf = 0 sessionAppendBlob(tls, bp+24, (*SessionInput)(unsafe.Pointer(pInput)).FaData+uintptr((*SessionInput)(unsafe.Pointer(pInput)).FiNext+nVar), *(*int32)(unsafe.Pointer(bp + 20)), bp+40) sessionAppendByte(tls, bp, eType, bp+40) sessionAppendBlob(tls, bp, (*SessionInput)(unsafe.Pointer(pInput)).FaData+uintptr((*SessionInput)(unsafe.Pointer(pInput)).FiNext), *(*int32)(unsafe.Pointer(bp + 16)), bp+40) if !(*(*int32)(unsafe.Pointer(bp + 40)) != 0) { goto __13 } goto finished_invert __13: ; *(*int32)(unsafe.Pointer(pInput + 8)) += *(*int32)(unsafe.Pointer(bp + 16)) Xsqlite3_free(tls, apVal) apVal = uintptr(0) abPK = (*SessionBuffer)(unsafe.Pointer(bp + 24)).FaBuf goto __6 __8: __9: bIndirect = int32(*(*U8)(unsafe.Pointer((*SessionInput)(unsafe.Pointer(pInput)).FaData + uintptr((*SessionInput)(unsafe.Pointer(pInput)).FiNext+1)))) eType2 = func() int32 { if int32(eType) == SQLITE_DELETE { return SQLITE_INSERT } return SQLITE_DELETE }() *(*int32)(unsafe.Pointer(pInput + 8)) += 2 *(*int32)(unsafe.Pointer(bp + 40)) = sessionChangesetBufferRecord(tls, pInput, *(*int32)(unsafe.Pointer(bp + 20)), bp+44) sessionAppendByte(tls, bp, uint8(eType2), bp+40) sessionAppendByte(tls, bp, uint8(bIndirect), bp+40) sessionAppendBlob(tls, bp, (*SessionInput)(unsafe.Pointer(pInput)).FaData+uintptr((*SessionInput)(unsafe.Pointer(pInput)).FiNext), *(*int32)(unsafe.Pointer(bp + 44)), bp+40) *(*int32)(unsafe.Pointer(pInput + 8)) += *(*int32)(unsafe.Pointer(bp + 44)) if !(*(*int32)(unsafe.Pointer(bp + 40)) != 0) { goto __14 } goto finished_invert __14: ; goto __6 __10: if !(uintptr(0) == apVal) { goto __15 } apVal = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(uintptr(0)))*uint64(*(*int32)(unsafe.Pointer(bp + 20)))*uint64(2)) if !(uintptr(0) == apVal) { goto __16 } *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_NOMEM goto finished_invert __16: ; libc.Xmemset(tls, apVal, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64(*(*int32)(unsafe.Pointer(bp + 20)))*uint64(2)) __15: ; sessionAppendByte(tls, bp, eType, bp+40) sessionAppendByte(tls, bp, *(*U8)(unsafe.Pointer((*SessionInput)(unsafe.Pointer(pInput)).FaData + uintptr((*SessionInput)(unsafe.Pointer(pInput)).FiNext+1))), bp+40) *(*int32)(unsafe.Pointer(pInput + 8)) += 2 *(*int32)(unsafe.Pointer(bp + 40)) = sessionReadRecord(tls, pInput, *(*int32)(unsafe.Pointer(bp + 20)), uintptr(0), apVal, uintptr(0)) if !(*(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK) { goto __17 } *(*int32)(unsafe.Pointer(bp + 40)) = sessionReadRecord(tls, pInput, *(*int32)(unsafe.Pointer(bp + 20)), uintptr(0), apVal+uintptr(*(*int32)(unsafe.Pointer(bp + 20)))*8, uintptr(0)) __17: ; iCol = 0 __18: if !(iCol < *(*int32)(unsafe.Pointer(bp + 20))) { goto __20 } pVal = *(*uintptr)(unsafe.Pointer(apVal + uintptr(iCol+func() int32 { if *(*U8)(unsafe.Pointer(abPK + uintptr(iCol))) != 0 { return 0 } return *(*int32)(unsafe.Pointer(bp + 20)) }())*8)) sessionAppendValue(tls, bp, pVal, bp+40) goto __19 __19: iCol++ goto __18 goto __20 __20: ; iCol = 0 __21: if !(iCol < *(*int32)(unsafe.Pointer(bp + 20))) { goto __23 } pVal1 = func() uintptr { if *(*U8)(unsafe.Pointer(abPK + uintptr(iCol))) != 0 { return uintptr(0) } return *(*uintptr)(unsafe.Pointer(apVal + uintptr(iCol)*8)) }() sessionAppendValue(tls, bp, pVal1, bp+40) goto __22 __22: iCol++ goto __21 goto __23 __23: ; iCol = 0 __24: if !(iCol < *(*int32)(unsafe.Pointer(bp + 20))*2) { goto __26 } Xsqlite3ValueFree(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(iCol)*8))) goto __25 __25: iCol++ goto __24 goto __26 __26: ; libc.Xmemset(tls, apVal, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64(*(*int32)(unsafe.Pointer(bp + 20)))*uint64(2)) if !(*(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK) { goto __27 } goto finished_invert __27: ; goto __6 __11: *(*int32)(unsafe.Pointer(bp + 40)) = Xsqlite3CorruptError(tls, 219832) goto finished_invert __6: ; if !(xOutput != 0 && (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf >= sessions_strm_chunk_size) { goto __28 } *(*int32)(unsafe.Pointer(bp + 40)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf) (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf = 0 if !(*(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK) { goto __29 } goto finished_invert __29: ; __28: ; goto __2 __3: ; if !(pnInverted != 0 && ppInverted != 0) { goto __30 } *(*int32)(unsafe.Pointer(pnInverted)) = (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf *(*uintptr)(unsafe.Pointer(ppInverted)) = (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf = uintptr(0) goto __31 __30: if !((*SessionBuffer)(unsafe.Pointer(bp)).FnBuf > 0 && xOutput != uintptr(0)) { goto __32 } *(*int32)(unsafe.Pointer(bp + 40)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf) __32: ; __31: ; finished_invert: Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf) Xsqlite3_free(tls, apVal) Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp+24)).FaBuf) return *(*int32)(unsafe.Pointer(bp + 40)) } // Invert a changeset object. func Xsqlite3changeset_invert(tls *libc.TLS, nChangeset int32, pChangeset uintptr, pnInverted uintptr, ppInverted uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(SessionInput{}))) (*SessionInput)(unsafe.Pointer(bp)).FnData = nChangeset (*SessionInput)(unsafe.Pointer(bp)).FaData = pChangeset return sessionChangesetInvert(tls, bp, uintptr(0), uintptr(0), pnInverted, ppInverted) } // Streaming version of sqlite3changeset_invert(). func Xsqlite3changeset_invert_strm(tls *libc.TLS, xInput uintptr, pIn uintptr, xOutput uintptr, pOut uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) var rc int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(SessionInput{}))) (*SessionInput)(unsafe.Pointer(bp)).FxInput = xInput (*SessionInput)(unsafe.Pointer(bp)).FpIn = pIn rc = sessionChangesetInvert(tls, bp, xOutput, pOut, uintptr(0), uintptr(0)) Xsqlite3_free(tls, (*SessionInput)(unsafe.Pointer(bp)).Fbuf.FaBuf) return rc } type SessionUpdate1 = struct { FpStmt uintptr FaMask uintptr FpNext uintptr } type SessionUpdate = SessionUpdate1 type SessionApplyCtx1 = struct { Fdb uintptr FpDelete uintptr FpInsert uintptr FpSelect uintptr FnCol int32 F__ccgo_pad1 [4]byte FazCol uintptr FabPK uintptr FaUpdateMask uintptr FpUp uintptr FbStat1 int32 FbDeferConstraints int32 FbInvertConstraints int32 F__ccgo_pad2 [4]byte Fconstraints SessionBuffer Frebase SessionBuffer FbRebaseStarted U8 FbRebase U8 F__ccgo_pad3 [6]byte } type SessionApplyCtx = SessionApplyCtx1 func sessionUpdateFind(tls *libc.TLS, pIter uintptr, p uintptr, bPatchset int32, ppStmt uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK var pUp uintptr = uintptr(0) var nCol int32 = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol var nU32 int32 = ((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol + 33) / 32 var ii int32 if (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask == uintptr(0) { (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask = Xsqlite3_malloc(tls, int32(uint64(nU32)*uint64(unsafe.Sizeof(U32(0))))) if (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask == uintptr(0) { *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_NOMEM } } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { libc.Xmemset(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask, 0, uint64(nU32)*uint64(unsafe.Sizeof(U32(0)))) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_CORRUPT for ii = 0; ii < (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol; ii++ { if *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol+ii)*8)) != 0 { *(*U32)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask + uintptr(ii/32)*4)) |= U32(int32(1) << (ii % 32)) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK } } } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { if bPatchset != 0 { *(*U32)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask + uintptr(nCol/32)*4)) |= U32(int32(1) << (nCol % 32)) } if (*SessionApplyCtx)(unsafe.Pointer(p)).FpUp != 0 { var nUp int32 = 0 var pp uintptr = p + 64 for 1 != 0 { nUp++ if 0 == libc.Xmemcmp(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask, (*SessionUpdate)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FaMask, uint64(nU32)*uint64(unsafe.Sizeof(U32(0)))) { pUp = *(*uintptr)(unsafe.Pointer(pp)) *(*uintptr)(unsafe.Pointer(pp)) = (*SessionUpdate)(unsafe.Pointer(pUp)).FpNext (*SessionUpdate)(unsafe.Pointer(pUp)).FpNext = (*SessionApplyCtx)(unsafe.Pointer(p)).FpUp (*SessionApplyCtx)(unsafe.Pointer(p)).FpUp = pUp break } if (*SessionUpdate)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FpNext != 0 { pp = *(*uintptr)(unsafe.Pointer(pp)) + 16 } else { if nUp >= SESSION_UPDATE_CACHE_SZ { Xsqlite3_finalize(tls, (*SessionUpdate)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FpStmt) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(pp))) *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) } break } } } if pUp == uintptr(0) { var nByte int32 = int32(uint64(unsafe.Sizeof(SessionUpdate{})) * uint64(nU32) * uint64(unsafe.Sizeof(U32(0)))) var bStat1 int32 = libc.Bool32(Xsqlite3_stricmp(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FzTab, ts+12700) == 0) pUp = Xsqlite3_malloc(tls, nByte) if pUp == uintptr(0) { *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_NOMEM } else { var zSep uintptr = ts + 1544 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(SessionBuffer{}))) (*SessionUpdate)(unsafe.Pointer(pUp)).FaMask = pUp + 1*24 libc.Xmemcpy(tls, (*SessionUpdate)(unsafe.Pointer(pUp)).FaMask, (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask, uint64(nU32)*uint64(unsafe.Sizeof(U32(0)))) sessionAppendStr(tls, bp, ts+34336, bp+16) sessionAppendIdent(tls, bp, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FzTab, bp+16) sessionAppendStr(tls, bp, ts+34349, bp+16) for ii = 0; ii < (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol; ii++ { if int32(*(*U8)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FabPK + uintptr(ii)))) == 0 && *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol+ii)*8)) != 0 { sessionAppendStr(tls, bp, zSep, bp+16) sessionAppendIdent(tls, bp, *(*uintptr)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FazCol + uintptr(ii)*8)), bp+16) sessionAppendStr(tls, bp, ts+34355, bp+16) sessionAppendInteger(tls, bp, ii*2+1, bp+16) zSep = ts + 15971 } } zSep = ts + 1544 sessionAppendStr(tls, bp, ts+34284, bp+16) for ii = 0; ii < (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol; ii++ { if *(*U8)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FabPK + uintptr(ii))) != 0 || bPatchset == 0 && *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue + uintptr(ii)*8)) != 0 { sessionAppendStr(tls, bp, zSep, bp+16) if bStat1 != 0 && ii == 1 { sessionAppendStr(tls, bp, ts+34360, bp+16) } else { sessionAppendIdent(tls, bp, *(*uintptr)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FazCol + uintptr(ii)*8)), bp+16) sessionAppendStr(tls, bp, ts+34292, bp+16) sessionAppendInteger(tls, bp, ii*2+2, bp+16) } zSep = ts + 22941 } } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { var zSql uintptr = (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf *(*int32)(unsafe.Pointer(bp + 16)) = Xsqlite3_prepare_v2(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).Fdb, zSql, (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf, pUp, uintptr(0)) } if *(*int32)(unsafe.Pointer(bp + 16)) != SQLITE_OK { Xsqlite3_free(tls, pUp) pUp = uintptr(0) } else { (*SessionUpdate)(unsafe.Pointer(pUp)).FpNext = (*SessionApplyCtx)(unsafe.Pointer(p)).FpUp (*SessionApplyCtx)(unsafe.Pointer(p)).FpUp = pUp } Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf) } } } if pUp != 0 { *(*uintptr)(unsafe.Pointer(ppStmt)) = (*SessionUpdate)(unsafe.Pointer(pUp)).FpStmt } else { *(*uintptr)(unsafe.Pointer(ppStmt)) = uintptr(0) } return *(*int32)(unsafe.Pointer(bp + 16)) } func sessionUpdateFree(tls *libc.TLS, p uintptr) { var pUp uintptr var pNext uintptr for pUp = (*SessionApplyCtx)(unsafe.Pointer(p)).FpUp; pUp != 0; pUp = pNext { pNext = (*SessionUpdate)(unsafe.Pointer(pUp)).FpNext Xsqlite3_finalize(tls, (*SessionUpdate)(unsafe.Pointer(pUp)).FpStmt) Xsqlite3_free(tls, pUp) } (*SessionApplyCtx)(unsafe.Pointer(p)).FpUp = uintptr(0) Xsqlite3_free(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask) (*SessionApplyCtx)(unsafe.Pointer(p)).FaUpdateMask = uintptr(0) } func sessionDeleteRow(tls *libc.TLS, db uintptr, zTab uintptr, p uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) var i int32 var zSep uintptr = ts + 1544 *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK *(*SessionBuffer)(unsafe.Pointer(bp)) = SessionBuffer{} var nPk int32 = 0 sessionAppendStr(tls, bp, ts+34435, bp+16) sessionAppendIdent(tls, bp, zTab, bp+16) sessionAppendStr(tls, bp, ts+34284, bp+16) for i = 0; i < (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol; i++ { if *(*U8)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FabPK + uintptr(i))) != 0 { nPk++ sessionAppendStr(tls, bp, zSep, bp+16) sessionAppendIdent(tls, bp, *(*uintptr)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FazCol + uintptr(i)*8)), bp+16) sessionAppendStr(tls, bp, ts+34355, bp+16) sessionAppendInteger(tls, bp, i+1, bp+16) zSep = ts + 22941 } } if nPk < (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol { sessionAppendStr(tls, bp, ts+34453, bp+16) sessionAppendInteger(tls, bp, (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol+1, bp+16) sessionAppendStr(tls, bp, ts+33996, bp+16) zSep = ts + 1544 for i = 0; i < (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol; i++ { if !(int32(*(*U8)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FabPK + uintptr(i)))) != 0) { sessionAppendStr(tls, bp, zSep, bp+16) sessionAppendIdent(tls, bp, *(*uintptr)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FazCol + uintptr(i)*8)), bp+16) sessionAppendStr(tls, bp, ts+34292, bp+16) sessionAppendInteger(tls, bp, i+1, bp+16) zSep = ts + 34461 } } sessionAppendStr(tls, bp, ts+6309, bp+16) } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = Xsqlite3_prepare_v2(tls, db, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf, p+8, uintptr(0)) } Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf) return *(*int32)(unsafe.Pointer(bp + 16)) } func sessionSelectRow(tls *libc.TLS, db uintptr, zTab uintptr, p uintptr) int32 { return sessionSelectStmt(tls, db, ts+7793, zTab, (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol, (*SessionApplyCtx)(unsafe.Pointer(p)).FazCol, (*SessionApplyCtx)(unsafe.Pointer(p)).FabPK, p+24) } func sessionInsertRow(tls *libc.TLS, db uintptr, zTab uintptr, p uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK var i int32 *(*SessionBuffer)(unsafe.Pointer(bp)) = SessionBuffer{} sessionAppendStr(tls, bp, ts+34466, bp+16) sessionAppendIdent(tls, bp, zTab, bp+16) sessionAppendStr(tls, bp, ts+22947, bp+16) for i = 0; i < (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol; i++ { if i != 0 { sessionAppendStr(tls, bp, ts+15971, bp+16) } sessionAppendIdent(tls, bp, *(*uintptr)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FazCol + uintptr(i)*8)), bp+16) } sessionAppendStr(tls, bp, ts+34484, bp+16) for i = 1; i < (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol; i++ { sessionAppendStr(tls, bp, ts+34495, bp+16) } sessionAppendStr(tls, bp, ts+6309, bp+16) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = Xsqlite3_prepare_v2(tls, db, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf, p+16, uintptr(0)) } Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf) return *(*int32)(unsafe.Pointer(bp + 16)) } func sessionPrepare(tls *libc.TLS, db uintptr, pp uintptr, zSql uintptr) int32 { return Xsqlite3_prepare_v2(tls, db, zSql, -1, pp, uintptr(0)) } func sessionStat1Sql(tls *libc.TLS, db uintptr, p uintptr) int32 { var rc int32 = sessionSelectRow(tls, db, ts+12700, p) if rc == SQLITE_OK { rc = sessionPrepare(tls, db, p+16, ts+34499) } if rc == SQLITE_OK { rc = sessionPrepare(tls, db, p+8, ts+34612) } return rc } func sessionBindValue(tls *libc.TLS, pStmt uintptr, i int32, pVal uintptr) int32 { var eType int32 = Xsqlite3_value_type(tls, pVal) if (eType == SQLITE_TEXT || eType == SQLITE_BLOB) && (*Sqlite3_value)(unsafe.Pointer(pVal)).Fz == uintptr(0) { return SQLITE_NOMEM } return Xsqlite3_bind_value(tls, pStmt, i, pVal) } func sessionBindRow(tls *libc.TLS, pIter uintptr, xValue uintptr, nCol int32, abPK uintptr, pStmt uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var i int32 var rc int32 = SQLITE_OK for i = 0; rc == SQLITE_OK && i < nCol; i++ { if !(abPK != 0) || *(*U8)(unsafe.Pointer(abPK + uintptr(i))) != 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xValue})).f(tls, pIter, i, bp) if *(*uintptr)(unsafe.Pointer(bp)) == uintptr(0) { rc = Xsqlite3CorruptError(tls, 220310) } else { rc = sessionBindValue(tls, pStmt, i+1, *(*uintptr)(unsafe.Pointer(bp))) } } } return rc } func sessionSeekToRow(tls *libc.TLS, pIter uintptr, abPK uintptr, pSelect uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 Xsqlite3changeset_op(tls, pIter, bp, bp+8, bp+12, uintptr(0)) rc = sessionBindRow(tls, pIter, func() uintptr { if *(*int32)(unsafe.Pointer(bp + 12)) == SQLITE_INSERT { return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{Xsqlite3changeset_new})) } return *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{Xsqlite3changeset_old})) }(), *(*int32)(unsafe.Pointer(bp + 8)), abPK, pSelect) if rc == SQLITE_OK { rc = Xsqlite3_step(tls, pSelect) if rc != SQLITE_ROW { rc = Xsqlite3_reset(tls, pSelect) } } return rc } func sessionRebaseAdd(tls *libc.TLS, p uintptr, eType int32, pIter uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK if (*SessionApplyCtx)(unsafe.Pointer(p)).FbRebase != 0 { var i int32 var eOp int32 = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop if int32((*SessionApplyCtx)(unsafe.Pointer(p)).FbRebaseStarted) == 0 { var zTab uintptr = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FzTab sessionAppendByte(tls, p+104, uint8('T'), bp) sessionAppendVarint(tls, p+104, (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol, bp) sessionAppendBlob(tls, p+104, (*SessionApplyCtx)(unsafe.Pointer(p)).FabPK, (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol, bp) sessionAppendBlob(tls, p+104, zTab, int32(libc.Xstrlen(tls, zTab))+1, bp) (*SessionApplyCtx)(unsafe.Pointer(p)).FbRebaseStarted = U8(1) } sessionAppendByte(tls, p+104, func() uint8 { if eOp == SQLITE_DELETE { return uint8(SQLITE_DELETE) } return uint8(SQLITE_INSERT) }(), bp) sessionAppendByte(tls, p+104, uint8(libc.Bool32(eType == SQLITE_CHANGESET_REPLACE)), bp) for i = 0; i < (*SessionApplyCtx)(unsafe.Pointer(p)).FnCol; i++ { *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) if eOp == SQLITE_DELETE || eOp == SQLITE_UPDATE && *(*U8)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FabPK + uintptr(i))) != 0 { Xsqlite3changeset_old(tls, pIter, i, bp+8) } else { Xsqlite3changeset_new(tls, pIter, i, bp+8) } sessionAppendValue(tls, p+104, *(*uintptr)(unsafe.Pointer(bp + 8)), bp) } } return *(*int32)(unsafe.Pointer(bp)) } func sessionConflictHandler(tls *libc.TLS, eType int32, p uintptr, pIter uintptr, xConflict uintptr, pCtx uintptr, pbReplace uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) var res int32 = 0 Xsqlite3changeset_op(tls, pIter, bp, bp+8, bp+12, uintptr(0)) if pbReplace != 0 { *(*int32)(unsafe.Pointer(bp + 16)) = sessionSeekToRow(tls, pIter, (*SessionApplyCtx)(unsafe.Pointer(p)).FabPK, (*SessionApplyCtx)(unsafe.Pointer(p)).FpSelect) } else { *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_ROW { (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FpConflict = (*SessionApplyCtx)(unsafe.Pointer(p)).FpSelect res = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xConflict})).f(tls, pCtx, eType, pIter) (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FpConflict = uintptr(0) *(*int32)(unsafe.Pointer(bp + 16)) = Xsqlite3_reset(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpSelect) } else if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { if (*SessionApplyCtx)(unsafe.Pointer(p)).FbDeferConstraints != 0 && eType == SQLITE_CHANGESET_CONFLICT { var aBlob uintptr = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fin.FaData + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fin.FiCurrent) var nBlob int32 = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fin.FiNext - (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fin.FiCurrent sessionAppendBlob(tls, p+88, aBlob, nBlob, bp+16) return SQLITE_OK } else { res = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xConflict})).f(tls, pCtx, eType+1, pIter) if res == SQLITE_CHANGESET_REPLACE { *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_MISUSE } } } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { switch res { case SQLITE_CHANGESET_REPLACE: *(*int32)(unsafe.Pointer(pbReplace)) = 1 break fallthrough case SQLITE_CHANGESET_OMIT: break fallthrough case SQLITE_CHANGESET_ABORT: *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_ABORT break fallthrough default: *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_MISUSE break } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = sessionRebaseAdd(tls, p, res, pIter) } } return *(*int32)(unsafe.Pointer(bp + 16)) } func sessionApplyOneOp(tls *libc.TLS, pIter uintptr, p uintptr, xConflict uintptr, pCtx uintptr, pbReplace uintptr, pbRetry uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 = SQLITE_OK Xsqlite3changeset_op(tls, pIter, bp, bp+8, bp+12, uintptr(0)) if *(*int32)(unsafe.Pointer(bp + 12)) == SQLITE_DELETE { var abPK uintptr = func() uintptr { if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset != 0 { return (*SessionApplyCtx)(unsafe.Pointer(p)).FabPK } return uintptr(0) }() rc = sessionBindRow(tls, pIter, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{Xsqlite3changeset_old})), *(*int32)(unsafe.Pointer(bp + 8)), abPK, (*SessionApplyCtx)(unsafe.Pointer(p)).FpDelete) if rc == SQLITE_OK && Xsqlite3_bind_parameter_count(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpDelete) > *(*int32)(unsafe.Pointer(bp + 8)) { rc = Xsqlite3_bind_int(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpDelete, *(*int32)(unsafe.Pointer(bp + 8))+1, libc.Bool32(pbRetry == uintptr(0) || abPK != 0)) } if rc != SQLITE_OK { return rc } Xsqlite3_step(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpDelete) rc = Xsqlite3_reset(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpDelete) if rc == SQLITE_OK && Xsqlite3_changes(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).Fdb) == 0 { rc = sessionConflictHandler(tls, SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry) } else if rc&0xff == SQLITE_CONSTRAINT { rc = sessionConflictHandler(tls, SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, uintptr(0)) } } else if *(*int32)(unsafe.Pointer(bp + 12)) == SQLITE_UPDATE { var i int32 *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var bPatchset int32 = libc.Bool32(pbRetry == uintptr(0) || (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset != 0) rc = sessionUpdateFind(tls, pIter, p, bPatchset, bp+16) for i = 0; rc == SQLITE_OK && i < *(*int32)(unsafe.Pointer(bp + 8)); i++ { var pOld uintptr = *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue + uintptr(i)*8)) var pNew uintptr = *(*uintptr)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FapValue + uintptr((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol+i)*8)) if *(*U8)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(p)).FabPK + uintptr(i))) != 0 || bPatchset == 0 && pOld != 0 { rc = sessionBindValue(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), i*2+2, pOld) } if rc == SQLITE_OK && pNew != 0 { rc = sessionBindValue(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), i*2+1, pNew) } } if rc != SQLITE_OK { return rc } Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if rc == SQLITE_OK && Xsqlite3_changes(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).Fdb) == 0 { rc = sessionConflictHandler(tls, SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry) } else if rc&0xff == SQLITE_CONSTRAINT { rc = sessionConflictHandler(tls, SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, uintptr(0)) } } else { if (*SessionApplyCtx)(unsafe.Pointer(p)).FbStat1 != 0 { rc = sessionSeekToRow(tls, pIter, (*SessionApplyCtx)(unsafe.Pointer(p)).FabPK, (*SessionApplyCtx)(unsafe.Pointer(p)).FpSelect) if rc == SQLITE_ROW { rc = SQLITE_CONSTRAINT Xsqlite3_reset(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpSelect) } } if rc == SQLITE_OK { rc = sessionBindRow(tls, pIter, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{Xsqlite3changeset_new})), *(*int32)(unsafe.Pointer(bp + 8)), uintptr(0), (*SessionApplyCtx)(unsafe.Pointer(p)).FpInsert) if rc != SQLITE_OK { return rc } Xsqlite3_step(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpInsert) rc = Xsqlite3_reset(tls, (*SessionApplyCtx)(unsafe.Pointer(p)).FpInsert) } if rc&0xff == SQLITE_CONSTRAINT { rc = sessionConflictHandler(tls, SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, pbReplace) } } return rc } func sessionApplyOneWithRetry(tls *libc.TLS, db uintptr, pIter uintptr, pApply uintptr, xConflict uintptr, pCtx uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*int32)(unsafe.Pointer(bp)) = 0 *(*int32)(unsafe.Pointer(bp + 4)) = 0 var rc int32 rc = sessionApplyOneOp(tls, pIter, pApply, xConflict, pCtx, bp, bp+4) if rc == SQLITE_OK { if *(*int32)(unsafe.Pointer(bp + 4)) != 0 { rc = sessionApplyOneOp(tls, pIter, pApply, xConflict, pCtx, uintptr(0), uintptr(0)) } else if *(*int32)(unsafe.Pointer(bp)) != 0 { rc = Xsqlite3_exec(tls, db, ts+34756, uintptr(0), uintptr(0), uintptr(0)) if rc == SQLITE_OK { rc = sessionBindRow(tls, pIter, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 }{Xsqlite3changeset_new})), (*SessionApplyCtx)(unsafe.Pointer(pApply)).FnCol, (*SessionApplyCtx)(unsafe.Pointer(pApply)).FabPK, (*SessionApplyCtx)(unsafe.Pointer(pApply)).FpDelete) Xsqlite3_bind_int(tls, (*SessionApplyCtx)(unsafe.Pointer(pApply)).FpDelete, (*SessionApplyCtx)(unsafe.Pointer(pApply)).FnCol+1, 1) } if rc == SQLITE_OK { Xsqlite3_step(tls, (*SessionApplyCtx)(unsafe.Pointer(pApply)).FpDelete) rc = Xsqlite3_reset(tls, (*SessionApplyCtx)(unsafe.Pointer(pApply)).FpDelete) } if rc == SQLITE_OK { rc = sessionApplyOneOp(tls, pIter, pApply, xConflict, pCtx, uintptr(0), uintptr(0)) } if rc == SQLITE_OK { rc = Xsqlite3_exec(tls, db, ts+34777, uintptr(0), uintptr(0), uintptr(0)) } } } return rc } func sessionRetryConstraints(tls *libc.TLS, db uintptr, bPatchset int32, zTab uintptr, pApply uintptr, xConflict uintptr, pCtx uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_OK for (*SessionApplyCtx)(unsafe.Pointer(pApply)).Fconstraints.FnBuf != 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var cons = (*SessionApplyCtx)(unsafe.Pointer(pApply)).Fconstraints libc.Xmemset(tls, pApply+88, 0, uint64(unsafe.Sizeof(SessionBuffer{}))) *(*int32)(unsafe.Pointer(bp + 8)) = sessionChangesetStart(tls, bp, uintptr(0), uintptr(0), cons.FnBuf, cons.FaBuf, (*SessionApplyCtx)(unsafe.Pointer(pApply)).FbInvertConstraints, 1) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { var nByte Size_t = uint64(2*(*SessionApplyCtx)(unsafe.Pointer(pApply)).FnCol) * uint64(unsafe.Sizeof(uintptr(0))) var rc2 int32 (*Sqlite3_changeset_iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FbPatchset = bPatchset (*Sqlite3_changeset_iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FzTab = zTab (*Sqlite3_changeset_iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnCol = (*SessionApplyCtx)(unsafe.Pointer(pApply)).FnCol (*Sqlite3_changeset_iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FabPK = (*SessionApplyCtx)(unsafe.Pointer(pApply)).FabPK sessionBufferGrow(tls, *(*uintptr)(unsafe.Pointer(bp))+72, int64(nByte), bp+8) (*Sqlite3_changeset_iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FapValue = (*Sqlite3_changeset_iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Ftblhdr.FaBuf if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { libc.Xmemset(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FapValue, 0, nByte) } for *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK && SQLITE_ROW == Xsqlite3changeset_next(tls, *(*uintptr)(unsafe.Pointer(bp))) { *(*int32)(unsafe.Pointer(bp + 8)) = sessionApplyOneWithRetry(tls, db, *(*uintptr)(unsafe.Pointer(bp)), pApply, xConflict, pCtx) } rc2 = Xsqlite3changeset_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 8)) = rc2 } } Xsqlite3_free(tls, cons.FaBuf) if *(*int32)(unsafe.Pointer(bp + 8)) != SQLITE_OK { break } if (*SessionApplyCtx)(unsafe.Pointer(pApply)).Fconstraints.FnBuf >= cons.FnBuf { (*SessionApplyCtx)(unsafe.Pointer(pApply)).FbDeferConstraints = 0 } } return *(*int32)(unsafe.Pointer(bp + 8)) } func sessionChangesetApply(tls *libc.TLS, db uintptr, pIter uintptr, xFilter uintptr, xConflict uintptr, pCtx uintptr, ppRebase uintptr, pnRebase uintptr, flags int32) int32 { bp := tls.Alloc(368) defer tls.Free(368) var schemaMismatch int32 = 0 var rc int32 = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp + 200)) = uintptr(0) var nTab int32 = 0 var bPatchset int32 (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fin.FbNoDiscard = 1 libc.Xmemset(tls, bp+48, 0, uint64(unsafe.Sizeof(SessionApplyCtx{}))) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FbRebase = U8(libc.Bool32(ppRebase != 0 && pnRebase != 0)) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FbInvertConstraints = libc.BoolInt32(!!(flags&SQLITE_CHANGESETAPPLY_INVERT != 0)) Xsqlite3_mutex_enter(tls, Xsqlite3_db_mutex(tls, db)) if flags&SQLITE_CHANGESETAPPLY_NOSAVEPOINT == 0 { rc = Xsqlite3_exec(tls, db, ts+34796, uintptr(0), uintptr(0), uintptr(0)) } if rc == SQLITE_OK { rc = Xsqlite3_exec(tls, db, ts+34822, uintptr(0), uintptr(0), uintptr(0)) } for rc == SQLITE_OK && SQLITE_ROW == Xsqlite3changeset_next(tls, pIter) { Xsqlite3changeset_op(tls, pIter, bp+176, bp+184, bp+188, uintptr(0)) if *(*uintptr)(unsafe.Pointer(bp + 200)) == uintptr(0) || Xsqlite3_strnicmp(tls, *(*uintptr)(unsafe.Pointer(bp + 176)), *(*uintptr)(unsafe.Pointer(bp + 200)), nTab+1) != 0 { rc = sessionRetryConstraints(tls, db, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset, *(*uintptr)(unsafe.Pointer(bp + 200)), bp+48, xConflict, pCtx) if rc != SQLITE_OK { break } sessionUpdateFree(tls, bp+48) Xsqlite3_free(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FazCol) Xsqlite3_finalize(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FpDelete) Xsqlite3_finalize(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FpInsert) Xsqlite3_finalize(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FpSelect) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).Fdb = db (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FpDelete = uintptr(0) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FpInsert = uintptr(0) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FpSelect = uintptr(0) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FnCol = 0 (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FazCol = uintptr(0) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FabPK = uintptr(0) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FbStat1 = 0 (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FbDeferConstraints = 1 (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FbRebaseStarted = U8(0) libc.Xmemset(tls, bp+48+88, 0, uint64(unsafe.Sizeof(SessionBuffer{}))) schemaMismatch = libc.Bool32(xFilter != 0 && 0 == (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xFilter})).f(tls, pCtx, *(*uintptr)(unsafe.Pointer(bp + 176)))) if schemaMismatch != 0 { *(*uintptr)(unsafe.Pointer(bp + 200)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(bp + 176)))) if *(*uintptr)(unsafe.Pointer(bp + 200)) == uintptr(0) { rc = SQLITE_NOMEM break } nTab = int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(bp + 200)))) (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FazCol = *(*uintptr)(unsafe.Pointer(bp + 200)) } else { var nMinCol int32 = 0 var i int32 Xsqlite3changeset_pk(tls, pIter, bp+192, uintptr(0)) rc = sessionTableInfo(tls, uintptr(0), db, ts+7793, *(*uintptr)(unsafe.Pointer(bp + 176)), bp+48+32, bp+200, bp+48+40, bp+48+48) if rc != SQLITE_OK { break } for i = 0; i < (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FnCol; i++ { if *(*U8)(unsafe.Pointer((*SessionApplyCtx)(unsafe.Pointer(bp+48)).FabPK + uintptr(i))) != 0 { nMinCol = i + 1 } } if (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FnCol == 0 { schemaMismatch = 1 Xsqlite3_log(tls, SQLITE_SCHEMA, ts+34852, libc.VaList(bp+8, *(*uintptr)(unsafe.Pointer(bp + 200)))) } else if (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FnCol < *(*int32)(unsafe.Pointer(bp + 184)) { schemaMismatch = 1 Xsqlite3_log(tls, SQLITE_SCHEMA, ts+34896, libc.VaList(bp+16, *(*uintptr)(unsafe.Pointer(bp + 200)), (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FnCol, *(*int32)(unsafe.Pointer(bp + 184)))) } else if *(*int32)(unsafe.Pointer(bp + 184)) < nMinCol || libc.Xmemcmp(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FabPK, *(*uintptr)(unsafe.Pointer(bp + 192)), uint64(*(*int32)(unsafe.Pointer(bp + 184)))) != 0 { schemaMismatch = 1 Xsqlite3_log(tls, SQLITE_SCHEMA, ts+34967, libc.VaList(bp+40, *(*uintptr)(unsafe.Pointer(bp + 200)))) } else { (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FnCol = *(*int32)(unsafe.Pointer(bp + 184)) if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(bp + 200)), ts+12700) { if libc.AssignInt32(&rc, sessionStat1Sql(tls, db, bp+48)) != 0 { break } (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FbStat1 = 1 } else { if libc.AssignInt32(&rc, sessionSelectRow(tls, db, *(*uintptr)(unsafe.Pointer(bp + 200)), bp+48)) != 0 || libc.AssignInt32(&rc, sessionDeleteRow(tls, db, *(*uintptr)(unsafe.Pointer(bp + 200)), bp+48)) != 0 || libc.AssignInt32(&rc, sessionInsertRow(tls, db, *(*uintptr)(unsafe.Pointer(bp + 200)), bp+48)) != 0 { break } (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).FbStat1 = 0 } } nTab = Xsqlite3Strlen30(tls, *(*uintptr)(unsafe.Pointer(bp + 200))) } } if schemaMismatch != 0 { continue } rc = sessionApplyOneWithRetry(tls, db, pIter, bp+48, xConflict, pCtx) } bPatchset = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset if rc == SQLITE_OK { rc = Xsqlite3changeset_finalize(tls, pIter) } else { Xsqlite3changeset_finalize(tls, pIter) } if rc == SQLITE_OK { rc = sessionRetryConstraints(tls, db, bPatchset, *(*uintptr)(unsafe.Pointer(bp + 200)), bp+48, xConflict, pCtx) } if rc == SQLITE_OK { Xsqlite3_db_status(tls, db, SQLITE_DBSTATUS_DEFERRED_FKS, bp+208, bp+212, 0) if *(*int32)(unsafe.Pointer(bp + 208)) != 0 { var res int32 = SQLITE_CHANGESET_ABORT libc.Xmemset(tls, bp+216, 0, uint64(unsafe.Sizeof(Sqlite3_changeset_iter{}))) (*Sqlite3_changeset_iter)(unsafe.Pointer(bp + 216)).FnCol = *(*int32)(unsafe.Pointer(bp + 208)) res = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xConflict})).f(tls, pCtx, SQLITE_CHANGESET_FOREIGN_KEY, bp+216) if res != SQLITE_CHANGESET_OMIT { rc = SQLITE_CONSTRAINT } } } Xsqlite3_exec(tls, db, ts+35027, uintptr(0), uintptr(0), uintptr(0)) if flags&SQLITE_CHANGESETAPPLY_NOSAVEPOINT == 0 { if rc == SQLITE_OK { rc = Xsqlite3_exec(tls, db, ts+35057, uintptr(0), uintptr(0), uintptr(0)) } else { Xsqlite3_exec(tls, db, ts+35081, uintptr(0), uintptr(0), uintptr(0)) Xsqlite3_exec(tls, db, ts+35057, uintptr(0), uintptr(0), uintptr(0)) } } if rc == SQLITE_OK && bPatchset == 0 && (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FbRebase != 0 { *(*uintptr)(unsafe.Pointer(ppRebase)) = (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).Frebase.FaBuf *(*int32)(unsafe.Pointer(pnRebase)) = (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).Frebase.FnBuf (*SessionApplyCtx)(unsafe.Pointer(bp + 48)).Frebase.FaBuf = uintptr(0) } sessionUpdateFree(tls, bp+48) Xsqlite3_finalize(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FpInsert) Xsqlite3_finalize(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FpDelete) Xsqlite3_finalize(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FpSelect) Xsqlite3_free(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).FazCol) Xsqlite3_free(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).Fconstraints.FaBuf) Xsqlite3_free(tls, (*SessionApplyCtx)(unsafe.Pointer(bp+48)).Frebase.FaBuf) Xsqlite3_mutex_leave(tls, Xsqlite3_db_mutex(tls, db)) return rc } // Apply the changeset passed via pChangeset/nChangeset to the main // database attached to handle "db". func Xsqlite3changeset_apply_v2(tls *libc.TLS, db uintptr, nChangeset int32, pChangeset uintptr, xFilter uintptr, xConflict uintptr, pCtx uintptr, ppRebase uintptr, pnRebase uintptr, flags int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var bInv int32 = libc.BoolInt32(!!(flags&SQLITE_CHANGESETAPPLY_INVERT != 0)) var rc int32 = sessionChangesetStart(tls, bp, uintptr(0), uintptr(0), nChangeset, pChangeset, bInv, 1) if rc == SQLITE_OK { rc = sessionChangesetApply(tls, db, *(*uintptr)(unsafe.Pointer(bp)), xFilter, xConflict, pCtx, ppRebase, pnRebase, flags) } return rc } // Apply the changeset passed via pChangeset/nChangeset to the main database // attached to handle "db". Invoke the supplied conflict handler callback // to resolve any conflicts encountered while applying the change. func Xsqlite3changeset_apply(tls *libc.TLS, db uintptr, nChangeset int32, pChangeset uintptr, xFilter uintptr, xConflict uintptr, pCtx uintptr) int32 { return Xsqlite3changeset_apply_v2(tls, db, nChangeset, pChangeset, xFilter, xConflict, pCtx, uintptr(0), uintptr(0), 0) } // Apply the changeset passed via xInput/pIn to the main database // attached to handle "db". Invoke the supplied conflict handler callback // to resolve any conflicts encountered while applying the change. func Xsqlite3changeset_apply_v2_strm(tls *libc.TLS, db uintptr, xInput uintptr, pIn uintptr, xFilter uintptr, xConflict uintptr, pCtx uintptr, ppRebase uintptr, pnRebase uintptr, flags int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var bInverse int32 = libc.BoolInt32(!!(flags&SQLITE_CHANGESETAPPLY_INVERT != 0)) var rc int32 = sessionChangesetStart(tls, bp, xInput, pIn, 0, uintptr(0), bInverse, 1) if rc == SQLITE_OK { rc = sessionChangesetApply(tls, db, *(*uintptr)(unsafe.Pointer(bp)), xFilter, xConflict, pCtx, ppRebase, pnRebase, flags) } return rc } func Xsqlite3changeset_apply_strm(tls *libc.TLS, db uintptr, xInput uintptr, pIn uintptr, xFilter uintptr, xConflict uintptr, pCtx uintptr) int32 { return Xsqlite3changeset_apply_v2_strm(tls, db, xInput, pIn, xFilter, xConflict, pCtx, uintptr(0), uintptr(0), 0) } func sessionChangeMerge(tls *libc.TLS, pTab uintptr, bRebase int32, bPatchset int32, pExist uintptr, op2 int32, bIndirect int32, aRec uintptr, nRec int32, ppNew uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var pNew uintptr = uintptr(0) var rc int32 = SQLITE_OK if !(pExist != 0) { pNew = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(SessionChange{}))+uint64(nRec)) if !(pNew != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(SessionChange{}))) (*SessionChange)(unsafe.Pointer(pNew)).Fop = U8(op2) (*SessionChange)(unsafe.Pointer(pNew)).FbIndirect = U8(bIndirect) (*SessionChange)(unsafe.Pointer(pNew)).FaRecord = pNew + 1*32 if bIndirect == 0 || bRebase == 0 { (*SessionChange)(unsafe.Pointer(pNew)).FnRecord = nRec libc.Xmemcpy(tls, (*SessionChange)(unsafe.Pointer(pNew)).FaRecord, aRec, uint64(nRec)) } else { var i int32 var pIn uintptr = aRec var pOut uintptr = (*SessionChange)(unsafe.Pointer(pNew)).FaRecord for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; i++ { var nIn int32 = sessionSerialLen(tls, pIn) if int32(*(*U8)(unsafe.Pointer(pIn))) == 0 { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pOut, 1))) = U8(0) } else if int32(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i)))) == 0 { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pOut, 1))) = U8(0xFF) } else { libc.Xmemcpy(tls, pOut, pIn, uint64(nIn)) pOut += uintptr(nIn) } pIn += uintptr(nIn) } (*SessionChange)(unsafe.Pointer(pNew)).FnRecord = int32((int64(pOut) - int64((*SessionChange)(unsafe.Pointer(pNew)).FaRecord)) / 1) } } else if bRebase != 0 { if int32((*SessionChange)(unsafe.Pointer(pExist)).Fop) == SQLITE_DELETE && (*SessionChange)(unsafe.Pointer(pExist)).FbIndirect != 0 { *(*uintptr)(unsafe.Pointer(ppNew)) = pExist } else { var nByte Sqlite3_int64 = Sqlite3_int64(uint64(nRec+(*SessionChange)(unsafe.Pointer(pExist)).FnRecord) + uint64(unsafe.Sizeof(SessionChange{}))) pNew = Xsqlite3_malloc64(tls, uint64(nByte)) if pNew == uintptr(0) { rc = SQLITE_NOMEM } else { var i int32 var a1 uintptr = (*SessionChange)(unsafe.Pointer(pExist)).FaRecord var a2 uintptr = aRec var pOut uintptr libc.Xmemset(tls, pNew, 0, uint64(nByte)) (*SessionChange)(unsafe.Pointer(pNew)).FbIndirect = U8(libc.Bool32(bIndirect != 0 || (*SessionChange)(unsafe.Pointer(pExist)).FbIndirect != 0)) (*SessionChange)(unsafe.Pointer(pNew)).Fop = U8(op2) pOut = libc.AssignPtrUintptr(pNew+16, pNew+1*32) for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnCol; i++ { var n1 int32 = sessionSerialLen(tls, a1) var n2 int32 = sessionSerialLen(tls, a2) if int32(*(*U8)(unsafe.Pointer(a1))) == 0xFF || int32(*(*U8)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(i)))) == 0 && bIndirect != 0 { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pOut, 1))) = U8(0xFF) } else if int32(*(*U8)(unsafe.Pointer(a2))) == 0 { libc.Xmemcpy(tls, pOut, a1, uint64(n1)) pOut += uintptr(n1) } else { libc.Xmemcpy(tls, pOut, a2, uint64(n2)) pOut += uintptr(n2) } a1 += uintptr(n1) a2 += uintptr(n2) } (*SessionChange)(unsafe.Pointer(pNew)).FnRecord = int32((int64(pOut) - int64((*SessionChange)(unsafe.Pointer(pNew)).FaRecord)) / 1) } Xsqlite3_free(tls, pExist) } } else { var op1 int32 = int32((*SessionChange)(unsafe.Pointer(pExist)).Fop) if op1 == SQLITE_INSERT && op2 == SQLITE_INSERT || op1 == SQLITE_UPDATE && op2 == SQLITE_INSERT || op1 == SQLITE_DELETE && op2 == SQLITE_UPDATE || op1 == SQLITE_DELETE && op2 == SQLITE_DELETE { pNew = pExist } else if op1 == SQLITE_INSERT && op2 == SQLITE_DELETE { Xsqlite3_free(tls, pExist) } else { var aExist uintptr = (*SessionChange)(unsafe.Pointer(pExist)).FaRecord var nByte Sqlite3_int64 nByte = Sqlite3_int64(uint64(unsafe.Sizeof(SessionChange{})) + uint64((*SessionChange)(unsafe.Pointer(pExist)).FnRecord) + uint64(nRec)) pNew = Xsqlite3_malloc64(tls, uint64(nByte)) if !(pNew != 0) { Xsqlite3_free(tls, pExist) return SQLITE_NOMEM } libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(SessionChange{}))) (*SessionChange)(unsafe.Pointer(pNew)).FbIndirect = U8(libc.Bool32(bIndirect != 0 && (*SessionChange)(unsafe.Pointer(pExist)).FbIndirect != 0)) *(*uintptr)(unsafe.Pointer(bp + 8)) = libc.AssignPtrUintptr(pNew+16, pNew+1*32) if op1 == SQLITE_INSERT { *(*uintptr)(unsafe.Pointer(bp)) = aRec (*SessionChange)(unsafe.Pointer(pNew)).Fop = U8(SQLITE_INSERT) if bPatchset == 0 { sessionSkipRecord(tls, bp, (*SessionTable)(unsafe.Pointer(pTab)).FnCol) } sessionMergeRecord(tls, bp+8, (*SessionTable)(unsafe.Pointer(pTab)).FnCol, aExist, *(*uintptr)(unsafe.Pointer(bp))) } else if op1 == SQLITE_DELETE { (*SessionChange)(unsafe.Pointer(pNew)).Fop = U8(SQLITE_UPDATE) if bPatchset != 0 { libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), aRec, uint64(nRec)) *(*uintptr)(unsafe.Pointer(bp + 8)) += uintptr(nRec) } else { if 0 == sessionMergeUpdate(tls, bp+8, pTab, bPatchset, aExist, uintptr(0), aRec, uintptr(0)) { Xsqlite3_free(tls, pNew) pNew = uintptr(0) } } } else if op2 == SQLITE_UPDATE { *(*uintptr)(unsafe.Pointer(bp + 16)) = aExist *(*uintptr)(unsafe.Pointer(bp + 24)) = aRec if bPatchset == 0 { sessionSkipRecord(tls, bp+16, (*SessionTable)(unsafe.Pointer(pTab)).FnCol) sessionSkipRecord(tls, bp+24, (*SessionTable)(unsafe.Pointer(pTab)).FnCol) } (*SessionChange)(unsafe.Pointer(pNew)).Fop = U8(SQLITE_UPDATE) if 0 == sessionMergeUpdate(tls, bp+8, pTab, bPatchset, aRec, aExist, *(*uintptr)(unsafe.Pointer(bp + 16)), *(*uintptr)(unsafe.Pointer(bp + 24))) { Xsqlite3_free(tls, pNew) pNew = uintptr(0) } } else { (*SessionChange)(unsafe.Pointer(pNew)).Fop = U8(SQLITE_DELETE) if bPatchset != 0 { libc.Xmemcpy(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), aRec, uint64(nRec)) *(*uintptr)(unsafe.Pointer(bp + 8)) += uintptr(nRec) } else { sessionMergeRecord(tls, bp+8, (*SessionTable)(unsafe.Pointer(pTab)).FnCol, aRec, aExist) } } if pNew != 0 { (*SessionChange)(unsafe.Pointer(pNew)).FnRecord = int32((int64(*(*uintptr)(unsafe.Pointer(bp + 8))) - int64((*SessionChange)(unsafe.Pointer(pNew)).FaRecord)) / 1) } Xsqlite3_free(tls, pExist) } } *(*uintptr)(unsafe.Pointer(ppNew)) = pNew return rc } func sessionChangesetToHash(tls *libc.TLS, pIter uintptr, pGrp uintptr, bRebase int32) int32 { bp := tls.Alloc(56) defer tls.Free(56) var rc int32 = SQLITE_OK var pTab uintptr = uintptr(0) for SQLITE_ROW == sessionChangesetNext(tls, pIter, bp, bp+8, uintptr(0)) { var iHash int32 var pExist uintptr = uintptr(0) var pp uintptr if (*Sqlite3_changegroup)(unsafe.Pointer(pGrp)).FpList == uintptr(0) { (*Sqlite3_changegroup)(unsafe.Pointer(pGrp)).FbPatch = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset } else if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset != (*Sqlite3_changegroup)(unsafe.Pointer(pGrp)).FbPatch { rc = SQLITE_ERROR break } Xsqlite3changeset_op(tls, pIter, bp+16, bp+24, bp+28, bp+32) if !(pTab != 0) || Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), (*SessionTable)(unsafe.Pointer(pTab)).FzName) != 0 { var nNew int32 = int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(bp + 16)))) Xsqlite3changeset_pk(tls, pIter, bp+40, uintptr(0)) for pTab = (*Sqlite3_changegroup)(unsafe.Pointer(pGrp)).FpList; pTab != 0; pTab = (*SessionTable)(unsafe.Pointer(pTab)).FpNext { if 0 == Xsqlite3_strnicmp(tls, (*SessionTable)(unsafe.Pointer(pTab)).FzName, *(*uintptr)(unsafe.Pointer(bp + 16)), nNew+1) { break } } if !(pTab != 0) { var ppTab uintptr pTab = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(SessionTable{}))+uint64(*(*int32)(unsafe.Pointer(bp + 24)))+uint64(nNew)+uint64(1)) if !(pTab != 0) { rc = SQLITE_NOMEM break } libc.Xmemset(tls, pTab, 0, uint64(unsafe.Sizeof(SessionTable{}))) (*SessionTable)(unsafe.Pointer(pTab)).FnCol = *(*int32)(unsafe.Pointer(bp + 24)) (*SessionTable)(unsafe.Pointer(pTab)).FabPK = pTab + 1*56 libc.Xmemcpy(tls, (*SessionTable)(unsafe.Pointer(pTab)).FabPK, *(*uintptr)(unsafe.Pointer(bp + 40)), uint64(*(*int32)(unsafe.Pointer(bp + 24)))) (*SessionTable)(unsafe.Pointer(pTab)).FzName = (*SessionTable)(unsafe.Pointer(pTab)).FabPK + uintptr(*(*int32)(unsafe.Pointer(bp + 24))) libc.Xmemcpy(tls, (*SessionTable)(unsafe.Pointer(pTab)).FzName, *(*uintptr)(unsafe.Pointer(bp + 16)), uint64(nNew+1)) for ppTab = pGrp + 8; *(*uintptr)(unsafe.Pointer(ppTab)) != 0; ppTab = *(*uintptr)(unsafe.Pointer(ppTab)) { } *(*uintptr)(unsafe.Pointer(ppTab)) = pTab } else if (*SessionTable)(unsafe.Pointer(pTab)).FnCol != *(*int32)(unsafe.Pointer(bp + 24)) || libc.Xmemcmp(tls, (*SessionTable)(unsafe.Pointer(pTab)).FabPK, *(*uintptr)(unsafe.Pointer(bp + 40)), uint64(*(*int32)(unsafe.Pointer(bp + 24)))) != 0 { rc = SQLITE_SCHEMA break } } if sessionGrowHash(tls, uintptr(0), (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset, pTab) != 0 { rc = SQLITE_NOMEM break } iHash = int32(sessionChangeHash(tls, pTab, libc.Bool32((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset != 0 && *(*int32)(unsafe.Pointer(bp + 28)) == SQLITE_DELETE), *(*uintptr)(unsafe.Pointer(bp)), (*SessionTable)(unsafe.Pointer(pTab)).FnChange)) for pp = (*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(iHash)*8; *(*uintptr)(unsafe.Pointer(pp)) != 0; pp = *(*uintptr)(unsafe.Pointer(pp)) + 24 { var bPkOnly1 int32 = 0 var bPkOnly2 int32 = 0 if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset != 0 { bPkOnly1 = libc.Bool32(int32((*SessionChange)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).Fop) == SQLITE_DELETE) bPkOnly2 = libc.Bool32(*(*int32)(unsafe.Pointer(bp + 28)) == SQLITE_DELETE) } if sessionChangeEqual(tls, pTab, bPkOnly1, (*SessionChange)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FaRecord, bPkOnly2, *(*uintptr)(unsafe.Pointer(bp))) != 0 { pExist = *(*uintptr)(unsafe.Pointer(pp)) *(*uintptr)(unsafe.Pointer(pp)) = (*SessionChange)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FpNext (*SessionTable)(unsafe.Pointer(pTab)).FnEntry-- break } } rc = sessionChangeMerge(tls, pTab, bRebase, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset, pExist, *(*int32)(unsafe.Pointer(bp + 28)), *(*int32)(unsafe.Pointer(bp + 32)), *(*uintptr)(unsafe.Pointer(bp)), *(*int32)(unsafe.Pointer(bp + 8)), bp+48) if rc != 0 { break } if *(*uintptr)(unsafe.Pointer(bp + 48)) != 0 { (*SessionChange)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 48)))).FpNext = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(iHash)*8)) *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(iHash)*8)) = *(*uintptr)(unsafe.Pointer(bp + 48)) (*SessionTable)(unsafe.Pointer(pTab)).FnEntry++ } } if rc == SQLITE_OK { rc = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Frc } return rc } func sessionChangegroupOutput(tls *libc.TLS, pGrp uintptr, xOutput uintptr, pOut uintptr, pnOut uintptr, ppOut uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK *(*SessionBuffer)(unsafe.Pointer(bp)) = SessionBuffer{} var pTab uintptr for pTab = (*Sqlite3_changegroup)(unsafe.Pointer(pGrp)).FpList; *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK && pTab != 0; pTab = (*SessionTable)(unsafe.Pointer(pTab)).FpNext { var i int32 if (*SessionTable)(unsafe.Pointer(pTab)).FnEntry == 0 { continue } sessionAppendTableHdr(tls, bp, (*Sqlite3_changegroup)(unsafe.Pointer(pGrp)).FbPatch, pTab, bp+16) for i = 0; i < (*SessionTable)(unsafe.Pointer(pTab)).FnChange; i++ { var p uintptr for p = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(i)*8)); p != 0; p = (*SessionChange)(unsafe.Pointer(p)).FpNext { sessionAppendByte(tls, bp, (*SessionChange)(unsafe.Pointer(p)).Fop, bp+16) sessionAppendByte(tls, bp, (*SessionChange)(unsafe.Pointer(p)).FbIndirect, bp+16) sessionAppendBlob(tls, bp, (*SessionChange)(unsafe.Pointer(p)).FaRecord, (*SessionChange)(unsafe.Pointer(p)).FnRecord, bp+16) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK && xOutput != 0 && (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf >= sessions_strm_chunk_size { *(*int32)(unsafe.Pointer(bp + 16)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf) (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf = 0 } } } } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { if xOutput != 0 { if (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf > 0 { *(*int32)(unsafe.Pointer(bp + 16)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf) } } else if ppOut != 0 { *(*uintptr)(unsafe.Pointer(ppOut)) = (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf if pnOut != 0 { *(*int32)(unsafe.Pointer(pnOut)) = (*SessionBuffer)(unsafe.Pointer(bp)).FnBuf } (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf = uintptr(0) } } Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp)).FaBuf) return *(*int32)(unsafe.Pointer(bp + 16)) } // Allocate a new, empty, sqlite3_changegroup. func Xsqlite3changegroup_new(tls *libc.TLS, pp uintptr) int32 { var rc int32 = SQLITE_OK var p uintptr p = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Sqlite3_changegroup{}))) if p == uintptr(0) { rc = SQLITE_NOMEM } else { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(Sqlite3_changegroup{}))) } *(*uintptr)(unsafe.Pointer(pp)) = p return rc } // Add the changeset currently stored in buffer pData, size nData bytes, // to changeset-group p. func Xsqlite3changegroup_add(tls *libc.TLS, pGrp uintptr, nData int32, pData uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = Xsqlite3changeset_start(tls, bp, nData, pData) if rc == SQLITE_OK { rc = sessionChangesetToHash(tls, *(*uintptr)(unsafe.Pointer(bp)), pGrp, 0) } Xsqlite3changeset_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } // Obtain a buffer containing a changeset representing the concatenation // of all changesets added to the group so far. func Xsqlite3changegroup_output(tls *libc.TLS, pGrp uintptr, pnData uintptr, ppData uintptr) int32 { return sessionChangegroupOutput(tls, pGrp, uintptr(0), uintptr(0), pnData, ppData) } // Streaming versions of changegroup_add(). func Xsqlite3changegroup_add_strm(tls *libc.TLS, pGrp uintptr, xInput uintptr, pIn uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = Xsqlite3changeset_start_strm(tls, bp, xInput, pIn) if rc == SQLITE_OK { rc = sessionChangesetToHash(tls, *(*uintptr)(unsafe.Pointer(bp)), pGrp, 0) } Xsqlite3changeset_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } // Streaming versions of changegroup_output(). func Xsqlite3changegroup_output_strm(tls *libc.TLS, pGrp uintptr, xOutput uintptr, pOut uintptr) int32 { return sessionChangegroupOutput(tls, pGrp, xOutput, pOut, uintptr(0), uintptr(0)) } // Delete a changegroup object. func Xsqlite3changegroup_delete(tls *libc.TLS, pGrp uintptr) { if pGrp != 0 { sessionDeleteTable(tls, uintptr(0), (*Sqlite3_changegroup)(unsafe.Pointer(pGrp)).FpList) Xsqlite3_free(tls, pGrp) } } // Combine two changesets together. func Xsqlite3changeset_concat(tls *libc.TLS, nLeft int32, pLeft uintptr, nRight int32, pRight uintptr, pnOut uintptr, ppOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = Xsqlite3changegroup_new(tls, bp) if rc == SQLITE_OK { rc = Xsqlite3changegroup_add(tls, *(*uintptr)(unsafe.Pointer(bp)), nLeft, pLeft) } if rc == SQLITE_OK { rc = Xsqlite3changegroup_add(tls, *(*uintptr)(unsafe.Pointer(bp)), nRight, pRight) } if rc == SQLITE_OK { rc = Xsqlite3changegroup_output(tls, *(*uintptr)(unsafe.Pointer(bp)), pnOut, ppOut) } Xsqlite3changegroup_delete(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } // Streaming version of sqlite3changeset_concat(). func Xsqlite3changeset_concat_strm(tls *libc.TLS, xInputA uintptr, pInA uintptr, xInputB uintptr, pInB uintptr, xOutput uintptr, pOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 rc = Xsqlite3changegroup_new(tls, bp) if rc == SQLITE_OK { rc = Xsqlite3changegroup_add_strm(tls, *(*uintptr)(unsafe.Pointer(bp)), xInputA, pInA) } if rc == SQLITE_OK { rc = Xsqlite3changegroup_add_strm(tls, *(*uintptr)(unsafe.Pointer(bp)), xInputB, pInB) } if rc == SQLITE_OK { rc = Xsqlite3changegroup_output_strm(tls, *(*uintptr)(unsafe.Pointer(bp)), xOutput, pOut) } Xsqlite3changegroup_delete(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } func sessionAppendRecordMerge(tls *libc.TLS, pBuf uintptr, nCol int32, a1 uintptr, n1 int32, a2 uintptr, n2 int32, pRc uintptr) { sessionBufferGrow(tls, pBuf, int64(n1+n2), pRc) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var i int32 var pOut uintptr = (*SessionBuffer)(unsafe.Pointer(pBuf)).FaBuf + uintptr((*SessionBuffer)(unsafe.Pointer(pBuf)).FnBuf) for i = 0; i < nCol; i++ { var nn1 int32 = sessionSerialLen(tls, a1) var nn2 int32 = sessionSerialLen(tls, a2) if int32(*(*U8)(unsafe.Pointer(a1))) == 0 || int32(*(*U8)(unsafe.Pointer(a1))) == 0xFF { libc.Xmemcpy(tls, pOut, a2, uint64(nn2)) pOut += uintptr(nn2) } else { libc.Xmemcpy(tls, pOut, a1, uint64(nn1)) pOut += uintptr(nn1) } a1 += uintptr(nn1) a2 += uintptr(nn2) } (*SessionBuffer)(unsafe.Pointer(pBuf)).FnBuf = int32((int64(pOut) - int64((*SessionBuffer)(unsafe.Pointer(pBuf)).FaBuf)) / 1) } } func sessionAppendPartialUpdate(tls *libc.TLS, pBuf uintptr, pIter uintptr, aRec uintptr, nRec int32, aChange uintptr, nChange int32, pRc uintptr) { sessionBufferGrow(tls, pBuf, int64(2+nRec+nChange), pRc) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var bData int32 = 0 var pOut uintptr = (*SessionBuffer)(unsafe.Pointer(pBuf)).FaBuf + uintptr((*SessionBuffer)(unsafe.Pointer(pBuf)).FnBuf) var i int32 var a1 uintptr = aRec var a2 uintptr = aChange *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pOut, 1))) = U8(SQLITE_UPDATE) *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pOut, 1))) = U8((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbIndirect) for i = 0; i < (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol; i++ { var n1 int32 = sessionSerialLen(tls, a1) var n2 int32 = sessionSerialLen(tls, a2) if *(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FabPK + uintptr(i))) != 0 || int32(*(*U8)(unsafe.Pointer(a2))) == 0 { if !(int32(*(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FabPK + uintptr(i)))) != 0) && *(*U8)(unsafe.Pointer(a1)) != 0 { bData = 1 } libc.Xmemcpy(tls, pOut, a1, uint64(n1)) pOut += uintptr(n1) } else if int32(*(*U8)(unsafe.Pointer(a2))) != 0xFF && *(*U8)(unsafe.Pointer(a1)) != 0 { bData = 1 libc.Xmemcpy(tls, pOut, a2, uint64(n2)) pOut += uintptr(n2) } else { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pOut, 1))) = U8(0) } a1 += uintptr(n1) a2 += uintptr(n2) } if bData != 0 { a2 = aChange for i = 0; i < (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol; i++ { var n1 int32 = sessionSerialLen(tls, a1) var n2 int32 = sessionSerialLen(tls, a2) if *(*U8)(unsafe.Pointer((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FabPK + uintptr(i))) != 0 || int32(*(*U8)(unsafe.Pointer(a2))) != 0xFF { libc.Xmemcpy(tls, pOut, a1, uint64(n1)) pOut += uintptr(n1) } else { *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&pOut, 1))) = U8(0) } a1 += uintptr(n1) a2 += uintptr(n2) } (*SessionBuffer)(unsafe.Pointer(pBuf)).FnBuf = int32((int64(pOut) - int64((*SessionBuffer)(unsafe.Pointer(pBuf)).FaBuf)) / 1) } } } func sessionRebase(tls *libc.TLS, p uintptr, pIter uintptr, xOutput uintptr, pOut uintptr, pnOut uintptr, ppOut uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 8)) = 0 *(*int32)(unsafe.Pointer(bp + 12)) = 0 var pTab uintptr = uintptr(0) *(*SessionBuffer)(unsafe.Pointer(bp + 16)) = SessionBuffer{} for SQLITE_ROW == sessionChangesetNext(tls, pIter, bp, bp+8, bp+12) { var pChange uintptr = uintptr(0) var bDone int32 = 0 if *(*int32)(unsafe.Pointer(bp + 12)) != 0 { var zTab uintptr = (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FzTab for pTab = (*Sqlite3_rebaser)(unsafe.Pointer(p)).Fgrp.FpList; pTab != 0; pTab = (*SessionTable)(unsafe.Pointer(pTab)).FpNext { if 0 == Xsqlite3_stricmp(tls, (*SessionTable)(unsafe.Pointer(pTab)).FzName, zTab) { break } } *(*int32)(unsafe.Pointer(bp + 12)) = 0 if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset != 0 { *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_ERROR } sessionAppendByte(tls, bp+16, func() uint8 { if (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbPatchset != 0 { return uint8('P') } return uint8('T') }(), bp+32) sessionAppendVarint(tls, bp+16, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol, bp+32) sessionAppendBlob(tls, bp+16, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FabPK, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol, bp+32) sessionAppendBlob(tls, bp+16, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FzTab, int32(libc.Xstrlen(tls, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FzTab))+1, bp+32) } if pTab != 0 && *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK { var iHash int32 = int32(sessionChangeHash(tls, pTab, 0, *(*uintptr)(unsafe.Pointer(bp)), (*SessionTable)(unsafe.Pointer(pTab)).FnChange)) for pChange = *(*uintptr)(unsafe.Pointer((*SessionTable)(unsafe.Pointer(pTab)).FapChange + uintptr(iHash)*8)); pChange != 0; pChange = (*SessionChange)(unsafe.Pointer(pChange)).FpNext { if sessionChangeEqual(tls, pTab, 0, *(*uintptr)(unsafe.Pointer(bp)), 0, (*SessionChange)(unsafe.Pointer(pChange)).FaRecord) != 0 { break } } } if pChange != 0 { switch (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop { case SQLITE_INSERT: if int32((*SessionChange)(unsafe.Pointer(pChange)).Fop) == SQLITE_INSERT { bDone = 1 if int32((*SessionChange)(unsafe.Pointer(pChange)).FbIndirect) == 0 { sessionAppendByte(tls, bp+16, uint8(SQLITE_UPDATE), bp+32) sessionAppendByte(tls, bp+16, uint8((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbIndirect), bp+32) sessionAppendBlob(tls, bp+16, (*SessionChange)(unsafe.Pointer(pChange)).FaRecord, (*SessionChange)(unsafe.Pointer(pChange)).FnRecord, bp+32) sessionAppendBlob(tls, bp+16, *(*uintptr)(unsafe.Pointer(bp)), *(*int32)(unsafe.Pointer(bp + 8)), bp+32) } } break fallthrough case SQLITE_UPDATE: bDone = 1 if int32((*SessionChange)(unsafe.Pointer(pChange)).Fop) == SQLITE_DELETE { if int32((*SessionChange)(unsafe.Pointer(pChange)).FbIndirect) == 0 { *(*uintptr)(unsafe.Pointer(bp + 40)) = *(*uintptr)(unsafe.Pointer(bp)) sessionSkipRecord(tls, bp+40, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol) sessionAppendByte(tls, bp+16, uint8(SQLITE_INSERT), bp+32) sessionAppendByte(tls, bp+16, uint8((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbIndirect), bp+32) sessionAppendRecordMerge(tls, bp+16, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol, *(*uintptr)(unsafe.Pointer(bp + 40)), int32(int64(*(*int32)(unsafe.Pointer(bp + 8)))-(int64(*(*uintptr)(unsafe.Pointer(bp + 40)))-int64(*(*uintptr)(unsafe.Pointer(bp))))/1), (*SessionChange)(unsafe.Pointer(pChange)).FaRecord, (*SessionChange)(unsafe.Pointer(pChange)).FnRecord, bp+32) } } else { sessionAppendPartialUpdate(tls, bp+16, pIter, *(*uintptr)(unsafe.Pointer(bp)), *(*int32)(unsafe.Pointer(bp + 8)), (*SessionChange)(unsafe.Pointer(pChange)).FaRecord, (*SessionChange)(unsafe.Pointer(pChange)).FnRecord, bp+32) } break fallthrough default: bDone = 1 if int32((*SessionChange)(unsafe.Pointer(pChange)).Fop) == SQLITE_INSERT { sessionAppendByte(tls, bp+16, uint8(SQLITE_DELETE), bp+32) sessionAppendByte(tls, bp+16, uint8((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbIndirect), bp+32) sessionAppendRecordMerge(tls, bp+16, (*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FnCol, (*SessionChange)(unsafe.Pointer(pChange)).FaRecord, (*SessionChange)(unsafe.Pointer(pChange)).FnRecord, *(*uintptr)(unsafe.Pointer(bp)), *(*int32)(unsafe.Pointer(bp + 8)), bp+32) } break } } if bDone == 0 { sessionAppendByte(tls, bp+16, uint8((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).Fop), bp+32) sessionAppendByte(tls, bp+16, uint8((*Sqlite3_changeset_iter)(unsafe.Pointer(pIter)).FbIndirect), bp+32) sessionAppendBlob(tls, bp+16, *(*uintptr)(unsafe.Pointer(bp)), *(*int32)(unsafe.Pointer(bp + 8)), bp+32) } if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK && xOutput != 0 && (*SessionBuffer)(unsafe.Pointer(bp+16)).FnBuf > sessions_strm_chunk_size { *(*int32)(unsafe.Pointer(bp + 32)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp+16)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp+16)).FnBuf) (*SessionBuffer)(unsafe.Pointer(bp + 16)).FnBuf = 0 } if *(*int32)(unsafe.Pointer(bp + 32)) != 0 { break } } if *(*int32)(unsafe.Pointer(bp + 32)) != SQLITE_OK { Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp+16)).FaBuf) libc.Xmemset(tls, bp+16, 0, uint64(unsafe.Sizeof(SessionBuffer{}))) } if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK { if xOutput != 0 { if (*SessionBuffer)(unsafe.Pointer(bp+16)).FnBuf > 0 { *(*int32)(unsafe.Pointer(bp + 32)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xOutput})).f(tls, pOut, (*SessionBuffer)(unsafe.Pointer(bp+16)).FaBuf, (*SessionBuffer)(unsafe.Pointer(bp+16)).FnBuf) } } else if ppOut != 0 { *(*uintptr)(unsafe.Pointer(ppOut)) = (*SessionBuffer)(unsafe.Pointer(bp + 16)).FaBuf *(*int32)(unsafe.Pointer(pnOut)) = (*SessionBuffer)(unsafe.Pointer(bp + 16)).FnBuf (*SessionBuffer)(unsafe.Pointer(bp + 16)).FaBuf = uintptr(0) } } Xsqlite3_free(tls, (*SessionBuffer)(unsafe.Pointer(bp+16)).FaBuf) return *(*int32)(unsafe.Pointer(bp + 32)) } // Create a new rebaser object. func Xsqlite3rebaser_create(tls *libc.TLS, ppNew uintptr) int32 { var rc int32 = SQLITE_OK var pNew uintptr pNew = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Sqlite3_rebaser{}))) if pNew == uintptr(0) { rc = SQLITE_NOMEM } else { libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Sqlite3_rebaser{}))) } *(*uintptr)(unsafe.Pointer(ppNew)) = pNew return rc } // Call this one or more times to configure a rebaser. func Xsqlite3rebaser_configure(tls *libc.TLS, p uintptr, nRebase int32, pRebase uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 rc = Xsqlite3changeset_start(tls, bp, nRebase, pRebase) if rc == SQLITE_OK { rc = sessionChangesetToHash(tls, *(*uintptr)(unsafe.Pointer(bp)), p, 1) } Xsqlite3changeset_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } // Rebase a changeset according to current rebaser configuration func Xsqlite3rebaser_rebase(tls *libc.TLS, p uintptr, nIn int32, pIn uintptr, pnOut uintptr, ppOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 = Xsqlite3changeset_start(tls, bp, nIn, pIn) if rc == SQLITE_OK { rc = sessionRebase(tls, p, *(*uintptr)(unsafe.Pointer(bp)), uintptr(0), uintptr(0), pnOut, ppOut) Xsqlite3changeset_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) } return rc } // Rebase a changeset according to current rebaser configuration func Xsqlite3rebaser_rebase_strm(tls *libc.TLS, p uintptr, xInput uintptr, pIn uintptr, xOutput uintptr, pOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 = Xsqlite3changeset_start_strm(tls, bp, xInput, pIn) if rc == SQLITE_OK { rc = sessionRebase(tls, p, *(*uintptr)(unsafe.Pointer(bp)), xOutput, pOut, uintptr(0), uintptr(0)) Xsqlite3changeset_finalize(tls, *(*uintptr)(unsafe.Pointer(bp))) } return rc } // Destroy a rebaser object func Xsqlite3rebaser_delete(tls *libc.TLS, p uintptr) { if p != 0 { sessionDeleteTable(tls, uintptr(0), (*Sqlite3_rebaser)(unsafe.Pointer(p)).Fgrp.FpList) Xsqlite3_free(tls, p) } } // Global configuration func Xsqlite3session_config(tls *libc.TLS, op int32, pArg uintptr) int32 { var rc int32 = SQLITE_OK switch op { case SQLITE_SESSION_CONFIG_STRMSIZE: { var pInt uintptr = pArg if *(*int32)(unsafe.Pointer(pInt)) > 0 { sessions_strm_chunk_size = *(*int32)(unsafe.Pointer(pInt)) } *(*int32)(unsafe.Pointer(pInt)) = sessions_strm_chunk_size break } default: rc = SQLITE_MISUSE break } return rc } type Fts5Global1 = struct { Fapi Fts5_api Fdb uintptr FiNextId I64 FpAux uintptr FpTok uintptr FpDfltTok uintptr FpCsr uintptr } type Fts5Global = Fts5Global1 type Fts5Colset1 = struct { FnCol int32 FaiCol [1]int32 } type Fts5Colset = Fts5Colset1 type Fts5Config1 = struct { Fdb uintptr FzDb uintptr FzName uintptr FnCol int32 F__ccgo_pad1 [4]byte FazCol uintptr FabUnindexed uintptr FnPrefix int32 F__ccgo_pad2 [4]byte FaPrefix uintptr FeContent int32 F__ccgo_pad3 [4]byte FzContent uintptr FzContentRowid uintptr FbColumnsize int32 FeDetail int32 FzContentExprlist uintptr FpTok uintptr FpTokApi uintptr FbLock int32 FePattern int32 FiCookie int32 Fpgsz int32 FnAutomerge int32 FnCrisisMerge int32 FnUsermerge int32 FnHashSize int32 FzRank uintptr FzRankArgs uintptr FpzErrmsg uintptr } type Fts5Config = Fts5Config1 // Buffer object for the incremental building of string data. type Fts5Buffer1 = struct { Fp uintptr Fn int32 FnSpace int32 } // Buffer object for the incremental building of string data. type Fts5Buffer = Fts5Buffer1 type Fts5PoslistReader1 = struct { Fa uintptr Fn int32 Fi int32 FbFlag U8 FbEof U8 F__ccgo_pad1 [6]byte FiPos I64 } type Fts5PoslistReader = Fts5PoslistReader1 type Fts5PoslistWriter1 = struct{ FiPrev I64 } type Fts5PoslistWriter = Fts5PoslistWriter1 // Bucket of terms object used by the integrity-check in offsets=0 mode. type Fts5Termset1 = struct{ FapHash [512]uintptr } // Bucket of terms object used by the integrity-check in offsets=0 mode. type Fts5Termset = Fts5Termset1 type Fts5Index1 = struct { FpConfig uintptr FzDataTbl uintptr FnWorkUnit int32 F__ccgo_pad1 [4]byte FpHash uintptr FnPendingData int32 F__ccgo_pad2 [4]byte FiWriteRowid I64 FbDelete int32 Frc int32 FpReader uintptr FpWriter uintptr FpDeleter uintptr FpIdxWriter uintptr FpIdxDeleter uintptr FpIdxSelect uintptr FnRead int32 F__ccgo_pad3 [4]byte FpDataVersion uintptr FiStructVersion I64 FpStruct uintptr } type Fts5Index = Fts5Index1 type Fts5IndexIter1 = struct { FiRowid I64 FpData uintptr FnData int32 FbEof U8 F__ccgo_pad1 [3]byte } type Fts5IndexIter = Fts5IndexIter1 // Virtual-table object. type Fts5Table1 = struct { Fbase Sqlite3_vtab FpConfig uintptr FpIndex uintptr } // Virtual-table object. type Fts5Table = Fts5Table1 // ************************************************************************* // // Interface to code in fts5_hash.c. type Fts5Hash1 = struct { FeDetail int32 F__ccgo_pad1 [4]byte FpnByte uintptr FnEntry int32 FnSlot int32 FpScan uintptr FaSlot uintptr } // ************************************************************************* // // Interface to code in fts5_hash.c. type Fts5Hash = Fts5Hash1 type Fts5Storage1 = struct { FpConfig uintptr FpIndex uintptr FbTotalsValid int32 F__ccgo_pad1 [4]byte FnTotalRow I64 FaTotalSize uintptr FaStmt [11]uintptr } type Fts5Storage = Fts5Storage1 // ************************************************************************* // // Interface to code in fts5_expr.c. type Fts5Expr1 = struct { FpIndex uintptr FpConfig uintptr FpRoot uintptr FbDesc int32 FnPhrase int32 FapExprPhrase uintptr } // ************************************************************************* // // Interface to code in fts5_expr.c. type Fts5Expr = Fts5Expr1 type Fts5ExprNode1 = struct { FeType int32 FbEof int32 FbNomatch int32 F__ccgo_pad1 [4]byte FxNext uintptr FiRowid I64 FpNear uintptr FnChild int32 F__ccgo_pad2 [4]byte FapChild [1]uintptr } type Fts5ExprNode = Fts5ExprNode1 type Fts5Parse1 = struct { FpConfig uintptr FzErr uintptr Frc int32 FnPhrase int32 FapPhrase uintptr FpExpr uintptr FbPhraseToAnd int32 F__ccgo_pad1 [4]byte } type Fts5Parse = Fts5Parse1 type Fts5Token1 = struct { Fp uintptr Fn int32 F__ccgo_pad1 [4]byte } type Fts5Token = Fts5Token1 type Fts5ExprPhrase1 = struct { FpNode uintptr Fposlist Fts5Buffer FnTerm int32 F__ccgo_pad1 [4]byte FaTerm [1]Fts5ExprTerm } type Fts5ExprPhrase = Fts5ExprPhrase1 type Fts5ExprNearset1 = struct { FnNear int32 F__ccgo_pad1 [4]byte FpColset uintptr FnPhrase int32 F__ccgo_pad2 [4]byte FapPhrase [1]uintptr } type Fts5ExprNearset = Fts5ExprNearset1 type Fts5PoslistPopulator1 = struct { Fwriter Fts5PoslistWriter FbOk int32 FbMiss int32 } type Fts5PoslistPopulator = Fts5PoslistPopulator1 // The next sections is a series of control #defines. // various aspects of the generated parser. // // fts5YYCODETYPE is the data type used to store the integer codes // that represent terminal and non-terminal symbols. // "unsigned char" is used if there are fewer than // 256 symbols. Larger types otherwise. // fts5YYNOCODE is a number of type fts5YYCODETYPE that is not used for // any terminal or nonterminal symbol. // fts5YYFALLBACK If defined, this indicates that one or more tokens // (also known as: "terminal symbols") have fall-back // values which should be used if the original symbol // would not parse. This permits keywords to sometimes // be used as identifiers, for example. // fts5YYACTIONTYPE is the data type used for "action codes" - numbers // that indicate what to do in response to the next // token. // sqlite3Fts5ParserFTS5TOKENTYPE is the data type used for minor type for terminal // symbols. Background: A "minor type" is a semantic // value associated with a terminal or non-terminal // symbols. For example, for an "ID" terminal symbol, // the minor type might be the name of the identifier. // Each non-terminal can have a different minor type. // Terminal symbols all have the same minor type, though. // This macros defines the minor type for terminal // symbols. // fts5YYMINORTYPE is the data type used for all minor types. // This is typically a union of many types, one of // which is sqlite3Fts5ParserFTS5TOKENTYPE. The entry in the union // for terminal symbols is called "fts5yy0". // fts5YYSTACKDEPTH is the maximum depth of the parser's stack. If // zero the stack is dynamically sized using realloc() // sqlite3Fts5ParserARG_SDECL A static variable declaration for the %extra_argument // sqlite3Fts5ParserARG_PDECL A parameter declaration for the %extra_argument // sqlite3Fts5ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter // sqlite3Fts5ParserARG_STORE Code to store %extra_argument into fts5yypParser // sqlite3Fts5ParserARG_FETCH Code to extract %extra_argument from fts5yypParser // sqlite3Fts5ParserCTX_* As sqlite3Fts5ParserARG_ except for %extra_context // fts5YYERRORSYMBOL is the code number of the error symbol. If not // defined, then do no error processing. // fts5YYNSTATE the combined number of states. // fts5YYNRULE the number of rules in the grammar // fts5YYNFTS5TOKEN Number of terminal symbols // fts5YY_MAX_SHIFT Maximum value for shift actions // fts5YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions // fts5YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions // fts5YY_ERROR_ACTION The fts5yy_action[] code for syntax error // fts5YY_ACCEPT_ACTION The fts5yy_action[] code for accept // fts5YY_NO_ACTION The fts5yy_action[] code for no-op // fts5YY_MIN_REDUCE Minimum value for reduce actions // fts5YY_MAX_REDUCE Maximum value for reduce actions // // ************ Begin control #defines **************************************** type Fts5YYMINORTYPE = struct { F__ccgo_pad1 [0]uint64 Ffts5yyinit int32 F__ccgo_pad2 [12]byte } var fts5yy_action = [105]uint8{ uint8(81), uint8(20), uint8(96), uint8(6), uint8(28), uint8(99), uint8(98), uint8(26), uint8(26), uint8(18), uint8(96), uint8(6), uint8(28), uint8(17), uint8(98), uint8(56), uint8(26), uint8(19), uint8(96), uint8(6), uint8(28), uint8(14), uint8(98), uint8(14), uint8(26), uint8(31), uint8(92), uint8(96), uint8(6), uint8(28), uint8(108), uint8(98), uint8(25), uint8(26), uint8(21), uint8(96), uint8(6), uint8(28), uint8(78), uint8(98), uint8(58), uint8(26), uint8(29), uint8(96), uint8(6), uint8(28), uint8(107), uint8(98), uint8(22), uint8(26), uint8(24), uint8(16), uint8(12), uint8(11), uint8(1), uint8(13), uint8(13), uint8(24), uint8(16), uint8(23), uint8(11), uint8(33), uint8(34), uint8(13), uint8(97), uint8(8), uint8(27), uint8(32), uint8(98), uint8(7), uint8(26), uint8(3), uint8(4), uint8(5), uint8(3), uint8(4), uint8(5), uint8(3), uint8(83), uint8(4), uint8(5), uint8(3), uint8(63), uint8(5), uint8(3), uint8(62), uint8(12), uint8(2), uint8(86), uint8(13), uint8(9), uint8(30), uint8(10), uint8(10), uint8(54), uint8(57), uint8(75), uint8(78), uint8(78), uint8(53), uint8(57), uint8(15), uint8(82), uint8(82), uint8(71), } var fts5yy_lookahead = [121]uint8{ uint8(16), uint8(17), uint8(18), uint8(19), uint8(20), uint8(22), uint8(22), uint8(24), uint8(24), uint8(17), uint8(18), uint8(19), uint8(20), uint8(7), uint8(22), uint8(9), uint8(24), uint8(17), uint8(18), uint8(19), uint8(20), uint8(9), uint8(22), uint8(9), uint8(24), uint8(13), uint8(17), uint8(18), uint8(19), uint8(20), uint8(26), uint8(22), uint8(24), uint8(24), uint8(17), uint8(18), uint8(19), uint8(20), uint8(15), uint8(22), uint8(9), uint8(24), uint8(17), uint8(18), uint8(19), uint8(20), uint8(26), uint8(22), uint8(21), uint8(24), uint8(6), uint8(7), uint8(9), uint8(9), uint8(10), uint8(12), uint8(12), uint8(6), uint8(7), uint8(21), uint8(9), uint8(24), uint8(25), uint8(12), uint8(18), uint8(5), uint8(20), uint8(14), uint8(22), uint8(5), uint8(24), uint8(3), uint8(1), uint8(2), uint8(3), uint8(1), uint8(2), uint8(3), uint8(0), uint8(1), uint8(2), uint8(3), uint8(11), uint8(2), uint8(3), uint8(11), uint8(9), uint8(10), uint8(5), uint8(12), uint8(23), uint8(24), uint8(10), uint8(10), uint8(8), uint8(9), uint8(9), uint8(15), uint8(15), uint8(8), uint8(9), uint8(9), uint8(27), uint8(27), uint8(11), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), uint8(27), } var fts5yy_shift_ofst = [35]uint8{ uint8(44), uint8(44), uint8(44), uint8(44), uint8(44), uint8(44), uint8(51), uint8(77), uint8(43), uint8(12), uint8(14), uint8(83), uint8(82), uint8(14), uint8(23), uint8(23), uint8(31), uint8(31), uint8(71), uint8(74), uint8(78), uint8(81), uint8(86), uint8(91), uint8(6), uint8(53), uint8(53), uint8(60), uint8(64), uint8(68), uint8(53), uint8(87), uint8(92), uint8(53), uint8(93), } var fts5yy_reduce_ofst = [18]int8{ int8(-16), int8(-8), int8(0), int8(9), int8(17), int8(25), int8(46), int8(-17), int8(-17), int8(37), int8(67), int8(4), int8(4), int8(8), int8(4), int8(20), int8(27), int8(38), } var fts5yy_default = [35]uint8{ uint8(80), uint8(80), uint8(80), uint8(80), uint8(80), uint8(80), uint8(95), uint8(80), uint8(80), uint8(105), uint8(80), uint8(110), uint8(110), uint8(80), uint8(110), uint8(110), uint8(80), uint8(80), uint8(80), uint8(80), uint8(80), uint8(91), uint8(80), uint8(80), uint8(80), uint8(101), uint8(100), uint8(80), uint8(80), uint8(90), uint8(103), uint8(80), uint8(80), uint8(104), uint8(80), } type fts5yyStackEntry = struct { Fstateno uint8 Fmajor uint8 F__ccgo_pad1 [6]byte Fminor Fts5YYMINORTYPE } type Fts5yyStackEntry = fts5yyStackEntry type fts5yyParser = struct { Ffts5yytos uintptr FpParse uintptr Ffts5yystack [100]Fts5yyStackEntry Ffts5yystackEnd uintptr } type Fts5yyParser = fts5yyParser func sqlite3Fts5ParserInit(tls *libc.TLS, fts5yypRawParser uintptr) { var fts5yypParser uintptr = fts5yypRawParser (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos = fts5yypParser + 16 (*Fts5yyStackEntry)(unsafe.Pointer(fts5yypParser + 16)).Fstateno = uint8(0) (*Fts5yyStackEntry)(unsafe.Pointer(fts5yypParser + 16)).Fmajor = uint8(0) (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yystackEnd = fts5yypParser + 16 + 99*24 } func sqlite3Fts5ParserAlloc(tls *libc.TLS, mallocProc uintptr) uintptr { var fts5yypParser uintptr fts5yypParser = (*struct{ f func(*libc.TLS, U64) uintptr })(unsafe.Pointer(&struct{ uintptr }{mallocProc})).f(tls, U64(unsafe.Sizeof(Fts5yyParser{}))) if fts5yypParser != 0 { sqlite3Fts5ParserInit(tls, fts5yypParser) } return fts5yypParser } func fts5yy_destructor(tls *libc.TLS, fts5yypParser uintptr, fts5yymajor uint8, fts5yypminor uintptr) { var pParse uintptr = (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse _ = pParse switch int32(fts5yymajor) { case 16: { _ = pParse } break case 17: fallthrough case 18: fallthrough case 19: { sqlite3Fts5ParseNodeFree(tls, *(*uintptr)(unsafe.Pointer(fts5yypminor))) } break case 20: fallthrough case 21: { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(fts5yypminor))) } break case 22: fallthrough case 23: { sqlite3Fts5ParseNearsetFree(tls, *(*uintptr)(unsafe.Pointer(fts5yypminor))) } break case 24: { sqlite3Fts5ParsePhraseFree(tls, *(*uintptr)(unsafe.Pointer(fts5yypminor))) } break default: break } } func fts5yy_pop_parser_stack(tls *libc.TLS, pParser uintptr) { var fts5yytos uintptr fts5yytos = libc.PostDecUintptr(&(*Fts5yyParser)(unsafe.Pointer(pParser)).Ffts5yytos, 24) fts5yy_destructor(tls, pParser, (*Fts5yyStackEntry)(unsafe.Pointer(fts5yytos)).Fmajor, fts5yytos+8) } func sqlite3Fts5ParserFinalize(tls *libc.TLS, p uintptr) { var pParser uintptr = p for (*Fts5yyParser)(unsafe.Pointer(pParser)).Ffts5yytos > pParser+16 { fts5yy_pop_parser_stack(tls, pParser) } } func sqlite3Fts5ParserFree(tls *libc.TLS, p uintptr, freeProc uintptr) { if p == uintptr(0) { return } sqlite3Fts5ParserFinalize(tls, p) (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{freeProc})).f(tls, p) } func fts5yy_find_shift_action(tls *libc.TLS, iLookAhead uint8, stateno uint8) uint8 { var i int32 if int32(stateno) > Fts5YY_MAX_SHIFT { return stateno } for __ccgo := true; __ccgo; __ccgo = 1 != 0 { i = int32(fts5yy_shift_ofst[stateno]) i = i + int32(iLookAhead) if int32(fts5yy_lookahead[i]) != int32(iLookAhead) { return fts5yy_default[stateno] } else { return fts5yy_action[i] } } return uint8(0) } func fts5yy_find_reduce_action(tls *libc.TLS, stateno uint8, iLookAhead uint8) uint8 { var i int32 i = int32(fts5yy_reduce_ofst[stateno]) i = i + int32(iLookAhead) return fts5yy_action[i] } func fts5yyStackOverflow(tls *libc.TLS, fts5yypParser uintptr) { var pParse uintptr = (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse for (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos > fts5yypParser+16 { fts5yy_pop_parser_stack(tls, fts5yypParser) } sqlite3Fts5ParseError(tls, pParse, ts+35109, 0) (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse = pParse } func fts5yy_shift(tls *libc.TLS, fts5yypParser uintptr, fts5yyNewState uint8, fts5yyMajor uint8, fts5yyMinor Fts5Token) { var fts5yytos uintptr (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos += 24 if (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos > (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yystackEnd { (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos -= 24 fts5yyStackOverflow(tls, fts5yypParser) return } if int32(fts5yyNewState) > Fts5YY_MAX_SHIFT { fts5yyNewState = uint8(int32(fts5yyNewState) + (Fts5YY_MIN_REDUCE - Fts5YY_MIN_SHIFTREDUCE)) } fts5yytos = (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos (*Fts5yyStackEntry)(unsafe.Pointer(fts5yytos)).Fstateno = fts5yyNewState (*Fts5yyStackEntry)(unsafe.Pointer(fts5yytos)).Fmajor = fts5yyMajor *(*Fts5Token)(unsafe.Pointer(fts5yytos + 8)) = fts5yyMinor } var fts5yyRuleInfoLhs = [28]uint8{ uint8(16), uint8(20), uint8(20), uint8(20), uint8(20), uint8(21), uint8(21), uint8(17), uint8(17), uint8(17), uint8(17), uint8(17), uint8(17), uint8(19), uint8(19), uint8(18), uint8(18), uint8(22), uint8(22), uint8(22), uint8(23), uint8(23), uint8(25), uint8(25), uint8(24), uint8(24), uint8(26), uint8(26), } var fts5yyRuleInfoNRhs = [28]int8{ int8(-1), int8(-4), int8(-3), int8(-1), int8(-2), int8(-2), int8(-1), int8(-3), int8(-3), int8(-3), int8(-5), int8(-3), int8(-1), int8(-1), int8(-2), int8(-1), int8(-3), int8(-1), int8(-2), int8(-5), int8(-1), int8(-2), int8(0), int8(-2), int8(-4), int8(-2), int8(-1), int8(0), } func fts5yy_reduce(tls *libc.TLS, fts5yypParser uintptr, fts5yyruleno uint32, fts5yyLookahead int32, fts5yyLookaheadToken Fts5Token) uint8 { bp := tls.Alloc(16) defer tls.Free(16) var fts5yygoto int32 var fts5yyact uint8 var fts5yymsp uintptr var fts5yysize int32 var pParse uintptr = (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse _ = fts5yyLookahead _ = fts5yyLookaheadToken fts5yymsp = (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos { switch fts5yyruleno { case uint32(0): { sqlite3Fts5ParseFinished(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) } break case uint32(1): { *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = sqlite3Fts5ParseColsetInvert(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(2): { *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(3): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseColset(tls, pParse, uintptr(0), fts5yymsp+8) } *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(4): { *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = sqlite3Fts5ParseColset(tls, pParse, uintptr(0), fts5yymsp+8) *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = sqlite3Fts5ParseColsetInvert(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8))) } break case uint32(5): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseColset(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)), fts5yymsp+8) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(6): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseColset(tls, pParse, uintptr(0), fts5yymsp+8) } *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(7): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNode(tls, pParse, FTS5_AND, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)), uintptr(0)) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(8): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNode(tls, pParse, FTS5_OR, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)), uintptr(0)) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(9): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNode(tls, pParse, FTS5_NOT, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)), uintptr(0)) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(10): { sqlite3Fts5ParseSetColset(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-4)*24 + 8))) *(*uintptr)(unsafe.Pointer(bp)) = *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(11): { *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) } break case uint32(12): fallthrough case uint32(13): { *(*uintptr)(unsafe.Pointer(bp)) = *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)) } *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(14): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseImplicitAnd(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(15): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNode(tls, pParse, FTS5_STRING, uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(16): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNode(tls, pParse, FTS5_STRING, uintptr(0), uintptr(0), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) sqlite3Fts5ParseSetColset(tls, pParse, *(*uintptr)(unsafe.Pointer(bp)), *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(17): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNearset(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(18): { sqlite3Fts5ParseSetCaret(tls, *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = sqlite3Fts5ParseNearset(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) } break case uint32(19): { sqlite3Fts5ParseNear(tls, pParse, fts5yymsp+libc.UintptrFromInt32(-4)*24+8) sqlite3Fts5ParseSetDistance(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)), fts5yymsp+libc.UintptrFromInt32(-1)*24+8) *(*uintptr)(unsafe.Pointer(bp)) = *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-2)*24 + 8)) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-4)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(20): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNearset(tls, pParse, uintptr(0), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(21): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseNearset(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)), *(*uintptr)(unsafe.Pointer(fts5yymsp + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(22): { (*Fts5Token)(unsafe.Pointer(fts5yymsp + 1*24 + 8)).Fp = uintptr(0) (*Fts5Token)(unsafe.Pointer(fts5yymsp + 1*24 + 8)).Fn = 0 } break case uint32(23): { *(*Fts5Token)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*Fts5Token)(unsafe.Pointer(fts5yymsp + 8)) } break case uint32(24): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseTerm(tls, pParse, *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-3)*24 + 8)), fts5yymsp+libc.UintptrFromInt32(-1)*24+8, *(*int32)(unsafe.Pointer(fts5yymsp + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-3)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(25): { *(*uintptr)(unsafe.Pointer(bp)) = sqlite3Fts5ParseTerm(tls, pParse, uintptr(0), fts5yymsp+libc.UintptrFromInt32(-1)*24+8, *(*int32)(unsafe.Pointer(fts5yymsp + 8))) } *(*uintptr)(unsafe.Pointer(fts5yymsp + libc.UintptrFromInt32(-1)*24 + 8)) = *(*uintptr)(unsafe.Pointer(bp)) break case uint32(26): { *(*int32)(unsafe.Pointer(fts5yymsp + 8)) = 1 } break case uint32(27): { *(*int32)(unsafe.Pointer(fts5yymsp + 1*24 + 8)) = 0 } break default: break } } fts5yygoto = int32(fts5yyRuleInfoLhs[fts5yyruleno]) fts5yysize = int32(fts5yyRuleInfoNRhs[fts5yyruleno]) fts5yyact = fts5yy_find_reduce_action(tls, (*Fts5yyStackEntry)(unsafe.Pointer(fts5yymsp+uintptr(fts5yysize)*24)).Fstateno, uint8(fts5yygoto)) fts5yymsp += 24 * uintptr(fts5yysize+1) (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos = fts5yymsp (*Fts5yyStackEntry)(unsafe.Pointer(fts5yymsp)).Fstateno = fts5yyact (*Fts5yyStackEntry)(unsafe.Pointer(fts5yymsp)).Fmajor = uint8(fts5yygoto) return fts5yyact } func fts5yy_syntax_error(tls *libc.TLS, fts5yypParser uintptr, fts5yymajor int32, fts5yyminor Fts5Token) { bp := tls.Alloc(16) defer tls.Free(16) var pParse uintptr = (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse _ = fts5yymajor sqlite3Fts5ParseError(tls, pParse, ts+35137, libc.VaList(bp, fts5yyminor.Fn, fts5yyminor.Fp)) (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse = pParse } func fts5yy_accept(tls *libc.TLS, fts5yypParser uintptr) { var pParse uintptr = (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse = pParse } func sqlite3Fts5Parser(tls *libc.TLS, fts5yyp uintptr, fts5yymajor int32, fts5yyminor Fts5Token, pParse uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var fts5yyact uint8 var fts5yypParser uintptr = fts5yyp (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).FpParse = pParse fts5yyact = (*Fts5yyStackEntry)(unsafe.Pointer((*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos)).Fstateno for 1 != 0 { fts5yyact = fts5yy_find_shift_action(tls, uint8(fts5yymajor), fts5yyact) if int32(fts5yyact) >= Fts5YY_MIN_REDUCE { var fts5yyruleno uint32 = uint32(int32(fts5yyact) - Fts5YY_MIN_REDUCE) if int32(fts5yyRuleInfoNRhs[fts5yyruleno]) == 0 { if (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos >= (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yystackEnd { fts5yyStackOverflow(tls, fts5yypParser) break } } fts5yyact = fts5yy_reduce(tls, fts5yypParser, fts5yyruleno, fts5yymajor, fts5yyminor) } else if int32(fts5yyact) <= Fts5YY_MAX_SHIFTREDUCE { fts5yy_shift(tls, fts5yypParser, fts5yyact, uint8(fts5yymajor), fts5yyminor) break } else if int32(fts5yyact) == Fts5YY_ACCEPT_ACTION { (*Fts5yyParser)(unsafe.Pointer(fts5yypParser)).Ffts5yytos -= 24 fts5yy_accept(tls, fts5yypParser) return } else { *(*Fts5Token)(unsafe.Pointer(bp)) = fts5yyminor fts5yy_syntax_error(tls, fts5yypParser, fts5yymajor, fts5yyminor) fts5yy_destructor(tls, fts5yypParser, uint8(fts5yymajor), bp) break } } return } func sqlite3Fts5ParserFallback(tls *libc.TLS, iToken int32) int32 { _ = iToken return 0 } // Object used to iterate through all "coalesced phrase instances" in // a single column of the current row. If the phrase instances in the // column being considered do not overlap, this object simply iterates // through them. Or, if they do overlap (share one or more tokens in // common), each set of overlapping instances is treated as a single // match. See documentation for the highlight() auxiliary function for // details. // // Usage is: // // for(rc = fts5CInstIterNext(pApi, pFts, iCol, &iter); // (rc==SQLITE_OK && 0==fts5CInstIterEof(&iter); // rc = fts5CInstIterNext(&iter) // ){ // printf("instance starts at %d, ends at %d\n", iter.iStart, iter.iEnd); // } type CInstIter1 = struct { FpApi uintptr FpFts uintptr FiCol int32 FiInst int32 FnInst int32 FiStart int32 FiEnd int32 F__ccgo_pad1 [4]byte } // Object used to iterate through all "coalesced phrase instances" in // a single column of the current row. If the phrase instances in the // column being considered do not overlap, this object simply iterates // through them. Or, if they do overlap (share one or more tokens in // common), each set of overlapping instances is treated as a single // match. See documentation for the highlight() auxiliary function for // details. // // Usage is: // // for(rc = fts5CInstIterNext(pApi, pFts, iCol, &iter); // (rc==SQLITE_OK && 0==fts5CInstIterEof(&iter); // rc = fts5CInstIterNext(&iter) // ){ // printf("instance starts at %d, ends at %d\n", iter.iStart, iter.iEnd); // } type CInstIter = CInstIter1 func fts5CInstIterNext(tls *libc.TLS, pIter uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var rc int32 = SQLITE_OK (*CInstIter)(unsafe.Pointer(pIter)).FiStart = -1 (*CInstIter)(unsafe.Pointer(pIter)).FiEnd = -1 for rc == SQLITE_OK && (*CInstIter)(unsafe.Pointer(pIter)).FiInst < (*CInstIter)(unsafe.Pointer(pIter)).FnInst { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer((*CInstIter)(unsafe.Pointer(pIter)).FpApi)).FxInst})).f(tls, (*CInstIter)(unsafe.Pointer(pIter)).FpFts, (*CInstIter)(unsafe.Pointer(pIter)).FiInst, bp, bp+4, bp+8) if rc == SQLITE_OK { if *(*int32)(unsafe.Pointer(bp + 4)) == (*CInstIter)(unsafe.Pointer(pIter)).FiCol { var iEnd int32 = *(*int32)(unsafe.Pointer(bp + 8)) - 1 + (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer((*CInstIter)(unsafe.Pointer(pIter)).FpApi)).FxPhraseSize})).f(tls, (*CInstIter)(unsafe.Pointer(pIter)).FpFts, *(*int32)(unsafe.Pointer(bp))) if (*CInstIter)(unsafe.Pointer(pIter)).FiStart < 0 { (*CInstIter)(unsafe.Pointer(pIter)).FiStart = *(*int32)(unsafe.Pointer(bp + 8)) (*CInstIter)(unsafe.Pointer(pIter)).FiEnd = iEnd } else if *(*int32)(unsafe.Pointer(bp + 8)) <= (*CInstIter)(unsafe.Pointer(pIter)).FiEnd { if iEnd > (*CInstIter)(unsafe.Pointer(pIter)).FiEnd { (*CInstIter)(unsafe.Pointer(pIter)).FiEnd = iEnd } } else { break } } (*CInstIter)(unsafe.Pointer(pIter)).FiInst++ } } return rc } func fts5CInstIterInit(tls *libc.TLS, pApi uintptr, pFts uintptr, iCol int32, pIter uintptr) int32 { var rc int32 libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(CInstIter{}))) (*CInstIter)(unsafe.Pointer(pIter)).FpApi = pApi (*CInstIter)(unsafe.Pointer(pIter)).FpFts = pFts (*CInstIter)(unsafe.Pointer(pIter)).FiCol = iCol rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxInstCount})).f(tls, pFts, pIter+24) if rc == SQLITE_OK { rc = fts5CInstIterNext(tls, pIter) } return rc } // ************************************************************************ // // Start of highlight() implementation. type HighlightContext1 = struct { Fiter CInstIter FiPos int32 FiRangeStart int32 FiRangeEnd int32 F__ccgo_pad1 [4]byte FzOpen uintptr FzClose uintptr FzIn uintptr FnIn int32 FiOff int32 FzOut uintptr } // ************************************************************************ // // Start of highlight() implementation. type HighlightContext = HighlightContext1 func fts5HighlightAppend(tls *libc.TLS, pRc uintptr, p uintptr, z uintptr, n int32) { bp := tls.Alloc(24) defer tls.Free(24) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK && z != 0 { if n < 0 { n = int32(libc.Xstrlen(tls, z)) } (*HighlightContext)(unsafe.Pointer(p)).FzOut = Xsqlite3_mprintf(tls, ts+35168, libc.VaList(bp, (*HighlightContext)(unsafe.Pointer(p)).FzOut, n, z)) if (*HighlightContext)(unsafe.Pointer(p)).FzOut == uintptr(0) { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } } func fts5HighlightCb(tls *libc.TLS, pContext uintptr, tflags int32, pToken uintptr, nToken int32, iStartOff int32, iEndOff int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var p uintptr = pContext *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var iPos int32 _ = pToken _ = nToken if tflags&FTS5_TOKEN_COLOCATED != 0 { return SQLITE_OK } iPos = libc.PostIncInt32(&(*HighlightContext)(unsafe.Pointer(p)).FiPos, 1) if (*HighlightContext)(unsafe.Pointer(p)).FiRangeEnd > 0 { if iPos < (*HighlightContext)(unsafe.Pointer(p)).FiRangeStart || iPos > (*HighlightContext)(unsafe.Pointer(p)).FiRangeEnd { return SQLITE_OK } if (*HighlightContext)(unsafe.Pointer(p)).FiRangeStart != 0 && iPos == (*HighlightContext)(unsafe.Pointer(p)).FiRangeStart { (*HighlightContext)(unsafe.Pointer(p)).FiOff = iStartOff } } if iPos == (*HighlightContext)(unsafe.Pointer(p)).Fiter.FiStart { fts5HighlightAppend(tls, bp, p, (*HighlightContext)(unsafe.Pointer(p)).FzIn+uintptr((*HighlightContext)(unsafe.Pointer(p)).FiOff), iStartOff-(*HighlightContext)(unsafe.Pointer(p)).FiOff) fts5HighlightAppend(tls, bp, p, (*HighlightContext)(unsafe.Pointer(p)).FzOpen, -1) (*HighlightContext)(unsafe.Pointer(p)).FiOff = iStartOff } if iPos == (*HighlightContext)(unsafe.Pointer(p)).Fiter.FiEnd { if (*HighlightContext)(unsafe.Pointer(p)).FiRangeEnd != 0 && (*HighlightContext)(unsafe.Pointer(p)).Fiter.FiStart < (*HighlightContext)(unsafe.Pointer(p)).FiRangeStart { fts5HighlightAppend(tls, bp, p, (*HighlightContext)(unsafe.Pointer(p)).FzOpen, -1) } fts5HighlightAppend(tls, bp, p, (*HighlightContext)(unsafe.Pointer(p)).FzIn+uintptr((*HighlightContext)(unsafe.Pointer(p)).FiOff), iEndOff-(*HighlightContext)(unsafe.Pointer(p)).FiOff) fts5HighlightAppend(tls, bp, p, (*HighlightContext)(unsafe.Pointer(p)).FzClose, -1) (*HighlightContext)(unsafe.Pointer(p)).FiOff = iEndOff if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp)) = fts5CInstIterNext(tls, p) } } if (*HighlightContext)(unsafe.Pointer(p)).FiRangeEnd > 0 && iPos == (*HighlightContext)(unsafe.Pointer(p)).FiRangeEnd { fts5HighlightAppend(tls, bp, p, (*HighlightContext)(unsafe.Pointer(p)).FzIn+uintptr((*HighlightContext)(unsafe.Pointer(p)).FiOff), iEndOff-(*HighlightContext)(unsafe.Pointer(p)).FiOff) (*HighlightContext)(unsafe.Pointer(p)).FiOff = iEndOff if iPos >= (*HighlightContext)(unsafe.Pointer(p)).Fiter.FiStart && iPos < (*HighlightContext)(unsafe.Pointer(p)).Fiter.FiEnd { fts5HighlightAppend(tls, bp, p, (*HighlightContext)(unsafe.Pointer(p)).FzClose, -1) } } return *(*int32)(unsafe.Pointer(bp)) } func fts5HighlightFunction(tls *libc.TLS, pApi uintptr, pFts uintptr, pCtx uintptr, nVal int32, apVal uintptr) { bp := tls.Alloc(100) defer tls.Free(100) var iCol int32 if nVal != 3 { var zErr uintptr = ts + 35175 Xsqlite3_result_error(tls, pCtx, zErr, -1) return } iCol = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(apVal))) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(HighlightContext{}))) (*HighlightContext)(unsafe.Pointer(bp)).FzOpen = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) (*HighlightContext)(unsafe.Pointer(bp)).FzClose = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal + 2*8))) *(*int32)(unsafe.Pointer(bp + 96)) = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnText})).f(tls, pFts, iCol, bp+72, bp+80) if (*HighlightContext)(unsafe.Pointer(bp)).FzIn != 0 { if *(*int32)(unsafe.Pointer(bp + 96)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 96)) = fts5CInstIterInit(tls, pApi, pFts, iCol, bp) } if *(*int32)(unsafe.Pointer(bp + 96)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 96)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxTokenize})).f(tls, pFts, (*HighlightContext)(unsafe.Pointer(bp)).FzIn, (*HighlightContext)(unsafe.Pointer(bp)).FnIn, bp, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5HighlightCb}))) } fts5HighlightAppend(tls, bp+96, bp, (*HighlightContext)(unsafe.Pointer(bp)).FzIn+uintptr((*HighlightContext)(unsafe.Pointer(bp)).FiOff), (*HighlightContext)(unsafe.Pointer(bp)).FnIn-(*HighlightContext)(unsafe.Pointer(bp)).FiOff) if *(*int32)(unsafe.Pointer(bp + 96)) == SQLITE_OK { Xsqlite3_result_text(tls, pCtx, (*HighlightContext)(unsafe.Pointer(bp)).FzOut, -1, libc.UintptrFromInt32(-1)) } Xsqlite3_free(tls, (*HighlightContext)(unsafe.Pointer(bp)).FzOut) } if *(*int32)(unsafe.Pointer(bp + 96)) != SQLITE_OK { Xsqlite3_result_error_code(tls, pCtx, *(*int32)(unsafe.Pointer(bp + 96))) } } // Context object passed to the fts5SentenceFinderCb() function. type Fts5SFinder1 = struct { FiPos int32 FnFirstAlloc int32 FnFirst int32 F__ccgo_pad1 [4]byte FaFirst uintptr FzDoc uintptr } // Context object passed to the fts5SentenceFinderCb() function. type Fts5SFinder = Fts5SFinder1 func fts5SentenceFinderAdd(tls *libc.TLS, p uintptr, iAdd int32) int32 { if (*Fts5SFinder)(unsafe.Pointer(p)).FnFirstAlloc == (*Fts5SFinder)(unsafe.Pointer(p)).FnFirst { var nNew int32 if (*Fts5SFinder)(unsafe.Pointer(p)).FnFirstAlloc != 0 { nNew = (*Fts5SFinder)(unsafe.Pointer(p)).FnFirstAlloc * 2 } else { nNew = 64 } var aNew uintptr aNew = Xsqlite3_realloc64(tls, (*Fts5SFinder)(unsafe.Pointer(p)).FaFirst, uint64(nNew)*uint64(unsafe.Sizeof(int32(0)))) if aNew == uintptr(0) { return SQLITE_NOMEM } (*Fts5SFinder)(unsafe.Pointer(p)).FaFirst = aNew (*Fts5SFinder)(unsafe.Pointer(p)).FnFirstAlloc = nNew } *(*int32)(unsafe.Pointer((*Fts5SFinder)(unsafe.Pointer(p)).FaFirst + uintptr(libc.PostIncInt32(&(*Fts5SFinder)(unsafe.Pointer(p)).FnFirst, 1))*4)) = iAdd return SQLITE_OK } func fts5SentenceFinderCb(tls *libc.TLS, pContext uintptr, tflags int32, pToken uintptr, nToken int32, iStartOff int32, iEndOff int32) int32 { var rc int32 = SQLITE_OK _ = pToken _ = nToken _ = iEndOff if tflags&FTS5_TOKEN_COLOCATED == 0 { var p uintptr = pContext if (*Fts5SFinder)(unsafe.Pointer(p)).FiPos > 0 { var i int32 var c int8 = int8(0) for i = iStartOff - 1; i >= 0; i-- { c = *(*int8)(unsafe.Pointer((*Fts5SFinder)(unsafe.Pointer(p)).FzDoc + uintptr(i))) if int32(c) != ' ' && int32(c) != '\t' && int32(c) != '\n' && int32(c) != '\r' { break } } if i != iStartOff-1 && (int32(c) == '.' || int32(c) == ':') { rc = fts5SentenceFinderAdd(tls, p, (*Fts5SFinder)(unsafe.Pointer(p)).FiPos) } } else { rc = fts5SentenceFinderAdd(tls, p, 0) } (*Fts5SFinder)(unsafe.Pointer(p)).FiPos++ } return rc } func fts5SnippetScore(tls *libc.TLS, pApi uintptr, pFts uintptr, nDocsize int32, aSeen uintptr, iCol int32, iPos int32, nToken int32, pnScore uintptr, piPos uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 var i int32 *(*int32)(unsafe.Pointer(bp + 4)) = 0 *(*int32)(unsafe.Pointer(bp + 8)) = 0 *(*int32)(unsafe.Pointer(bp + 12)) = 0 var iFirst int32 = -1 var nScore int32 = 0 var iLast int32 = 0 var iEnd Sqlite3_int64 = Sqlite3_int64(iPos) + Sqlite3_int64(nToken) rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxInstCount})).f(tls, pFts, bp) for i = 0; i < *(*int32)(unsafe.Pointer(bp)) && rc == SQLITE_OK; i++ { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxInst})).f(tls, pFts, i, bp+4, bp+8, bp+12) if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 8)) == iCol && *(*int32)(unsafe.Pointer(bp + 12)) >= iPos && Sqlite3_int64(*(*int32)(unsafe.Pointer(bp + 12))) < iEnd { nScore = nScore + func() int32 { if *(*uint8)(unsafe.Pointer(aSeen + uintptr(*(*int32)(unsafe.Pointer(bp + 4))))) != 0 { return 1 } return 1000 }() *(*uint8)(unsafe.Pointer(aSeen + uintptr(*(*int32)(unsafe.Pointer(bp + 4))))) = uint8(1) if iFirst < 0 { iFirst = *(*int32)(unsafe.Pointer(bp + 12)) } iLast = *(*int32)(unsafe.Pointer(bp + 12)) + (*struct { f func(*libc.TLS, uintptr, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxPhraseSize})).f(tls, pFts, *(*int32)(unsafe.Pointer(bp + 4))) } } *(*int32)(unsafe.Pointer(pnScore)) = nScore if piPos != 0 { var iAdj Sqlite3_int64 = Sqlite3_int64(iFirst - (nToken-(iLast-iFirst))/2) if iAdj+Sqlite3_int64(nToken) > Sqlite3_int64(nDocsize) { iAdj = Sqlite3_int64(nDocsize - nToken) } if iAdj < int64(0) { iAdj = int64(0) } *(*int32)(unsafe.Pointer(piPos)) = int32(iAdj) } return rc } func fts5ValueToText(tls *libc.TLS, pVal uintptr) uintptr { var zRet uintptr = Xsqlite3_value_text(tls, pVal) if zRet != 0 { return zRet } return ts + 1544 } func fts5SnippetFunction(tls *libc.TLS, pApi uintptr, pFts uintptr, pCtx uintptr, nVal int32, apVal uintptr) { bp := tls.Alloc(172) defer tls.Free(172) *(*int32)(unsafe.Pointer(bp + 168)) = SQLITE_OK var iCol int32 var zEllips uintptr var nToken int32 *(*int32)(unsafe.Pointer(bp + 96)) = 0 var i int32 var nPhrase int32 var aSeen uintptr var iBestCol int32 var iBestStart int32 = 0 var nBestScore int32 = 0 *(*int32)(unsafe.Pointer(bp + 164)) = 0 var nCol int32 if nVal != 5 { var zErr uintptr = ts + 35225 Xsqlite3_result_error(tls, pCtx, zErr, -1) return } nCol = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnCount})).f(tls, pFts) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(HighlightContext{}))) iCol = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(apVal))) (*HighlightContext)(unsafe.Pointer(bp)).FzOpen = fts5ValueToText(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) (*HighlightContext)(unsafe.Pointer(bp)).FzClose = fts5ValueToText(tls, *(*uintptr)(unsafe.Pointer(apVal + 2*8))) zEllips = fts5ValueToText(tls, *(*uintptr)(unsafe.Pointer(apVal + 3*8))) nToken = Xsqlite3_value_int(tls, *(*uintptr)(unsafe.Pointer(apVal + 4*8))) iBestCol = func() int32 { if iCol >= 0 { return iCol } return 0 }() nPhrase = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxPhraseCount})).f(tls, pFts) aSeen = Xsqlite3_malloc(tls, nPhrase) if aSeen == uintptr(0) { *(*int32)(unsafe.Pointer(bp + 168)) = SQLITE_NOMEM } if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxInstCount})).f(tls, pFts, bp+96) } libc.Xmemset(tls, bp+104, 0, uint64(unsafe.Sizeof(Fts5SFinder{}))) for i = 0; i < nCol; i++ { if iCol < 0 || iCol == i { var ii int32 (*Fts5SFinder)(unsafe.Pointer(bp + 104)).FiPos = 0 (*Fts5SFinder)(unsafe.Pointer(bp + 104)).FnFirst = 0 *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnText})).f(tls, pFts, i, bp+104+24, bp+136) if *(*int32)(unsafe.Pointer(bp + 168)) != SQLITE_OK { break } *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxTokenize})).f(tls, pFts, (*Fts5SFinder)(unsafe.Pointer(bp+104)).FzDoc, *(*int32)(unsafe.Pointer(bp + 136)), bp+104, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5SentenceFinderCb}))) if *(*int32)(unsafe.Pointer(bp + 168)) != SQLITE_OK { break } *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnSize})).f(tls, pFts, i, bp+140) if *(*int32)(unsafe.Pointer(bp + 168)) != SQLITE_OK { break } for ii = 0; *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK && ii < *(*int32)(unsafe.Pointer(bp + 96)); ii++ { var jj int32 *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxInst})).f(tls, pFts, ii, bp+144, bp+148, bp+152) if *(*int32)(unsafe.Pointer(bp + 148)) != i { continue } if *(*int32)(unsafe.Pointer(bp + 152)) > *(*int32)(unsafe.Pointer(bp + 140)) { *(*int32)(unsafe.Pointer(bp + 168)) = SQLITE_CORRUPT | int32(1)<<8 } if *(*int32)(unsafe.Pointer(bp + 168)) != SQLITE_OK { continue } libc.Xmemset(tls, aSeen, 0, uint64(nPhrase)) *(*int32)(unsafe.Pointer(bp + 168)) = fts5SnippetScore(tls, pApi, pFts, *(*int32)(unsafe.Pointer(bp + 140)), aSeen, i, *(*int32)(unsafe.Pointer(bp + 152)), nToken, bp+156, bp+160) if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 156)) > nBestScore { nBestScore = *(*int32)(unsafe.Pointer(bp + 156)) iBestCol = i iBestStart = *(*int32)(unsafe.Pointer(bp + 160)) *(*int32)(unsafe.Pointer(bp + 164)) = *(*int32)(unsafe.Pointer(bp + 140)) } if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK && (*Fts5SFinder)(unsafe.Pointer(bp+104)).FnFirst != 0 && *(*int32)(unsafe.Pointer(bp + 140)) > nToken { for jj = 0; jj < (*Fts5SFinder)(unsafe.Pointer(bp+104)).FnFirst-1; jj++ { if *(*int32)(unsafe.Pointer((*Fts5SFinder)(unsafe.Pointer(bp+104)).FaFirst + uintptr(jj+1)*4)) > *(*int32)(unsafe.Pointer(bp + 152)) { break } } if *(*int32)(unsafe.Pointer((*Fts5SFinder)(unsafe.Pointer(bp+104)).FaFirst + uintptr(jj)*4)) < *(*int32)(unsafe.Pointer(bp + 152)) { libc.Xmemset(tls, aSeen, 0, uint64(nPhrase)) *(*int32)(unsafe.Pointer(bp + 168)) = fts5SnippetScore(tls, pApi, pFts, *(*int32)(unsafe.Pointer(bp + 140)), aSeen, i, *(*int32)(unsafe.Pointer((*Fts5SFinder)(unsafe.Pointer(bp+104)).FaFirst + uintptr(jj)*4)), nToken, bp+156, uintptr(0)) *(*int32)(unsafe.Pointer(bp + 156)) += func() int32 { if *(*int32)(unsafe.Pointer((*Fts5SFinder)(unsafe.Pointer(bp+104)).FaFirst + uintptr(jj)*4)) == 0 { return 120 } return 100 }() if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 156)) > nBestScore { nBestScore = *(*int32)(unsafe.Pointer(bp + 156)) iBestCol = i iBestStart = *(*int32)(unsafe.Pointer((*Fts5SFinder)(unsafe.Pointer(bp+104)).FaFirst + uintptr(jj)*4)) *(*int32)(unsafe.Pointer(bp + 164)) = *(*int32)(unsafe.Pointer(bp + 140)) } } } } } } if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnText})).f(tls, pFts, iBestCol, bp+72, bp+80) } if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK && *(*int32)(unsafe.Pointer(bp + 164)) == 0 { *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnSize})).f(tls, pFts, iBestCol, bp+164) } if (*HighlightContext)(unsafe.Pointer(bp)).FzIn != 0 { if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 168)) = fts5CInstIterInit(tls, pApi, pFts, iBestCol, bp) } (*HighlightContext)(unsafe.Pointer(bp)).FiRangeStart = iBestStart (*HighlightContext)(unsafe.Pointer(bp)).FiRangeEnd = iBestStart + nToken - 1 if iBestStart > 0 { fts5HighlightAppend(tls, bp+168, bp, zEllips, -1) } for (*HighlightContext)(unsafe.Pointer(bp)).Fiter.FiStart >= 0 && (*HighlightContext)(unsafe.Pointer(bp)).Fiter.FiStart < iBestStart && *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 168)) = fts5CInstIterNext(tls, bp) } if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 168)) = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxTokenize})).f(tls, pFts, (*HighlightContext)(unsafe.Pointer(bp)).FzIn, (*HighlightContext)(unsafe.Pointer(bp)).FnIn, bp, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5HighlightCb}))) } if (*HighlightContext)(unsafe.Pointer(bp)).FiRangeEnd >= *(*int32)(unsafe.Pointer(bp + 164))-1 { fts5HighlightAppend(tls, bp+168, bp, (*HighlightContext)(unsafe.Pointer(bp)).FzIn+uintptr((*HighlightContext)(unsafe.Pointer(bp)).FiOff), (*HighlightContext)(unsafe.Pointer(bp)).FnIn-(*HighlightContext)(unsafe.Pointer(bp)).FiOff) } else { fts5HighlightAppend(tls, bp+168, bp, zEllips, -1) } } if *(*int32)(unsafe.Pointer(bp + 168)) == SQLITE_OK { Xsqlite3_result_text(tls, pCtx, (*HighlightContext)(unsafe.Pointer(bp)).FzOut, -1, libc.UintptrFromInt32(-1)) } else { Xsqlite3_result_error_code(tls, pCtx, *(*int32)(unsafe.Pointer(bp + 168))) } Xsqlite3_free(tls, (*HighlightContext)(unsafe.Pointer(bp)).FzOut) Xsqlite3_free(tls, aSeen) Xsqlite3_free(tls, (*Fts5SFinder)(unsafe.Pointer(bp+104)).FaFirst) } // The first time the bm25() function is called for a query, an instance // of the following structure is allocated and populated. type Fts5Bm25Data1 = struct { FnPhrase int32 F__ccgo_pad1 [4]byte Favgdl float64 FaIDF uintptr FaFreq uintptr } // The first time the bm25() function is called for a query, an instance // of the following structure is allocated and populated. type Fts5Bm25Data = Fts5Bm25Data1 func fts5CountCb(tls *libc.TLS, pApi uintptr, pFts uintptr, pUserData uintptr) int32 { var pn uintptr = pUserData _ = pApi _ = pFts *(*Sqlite3_int64)(unsafe.Pointer(pn))++ return SQLITE_OK } func fts5Bm25GetData(tls *libc.TLS, pApi uintptr, pFts uintptr, ppData uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 = SQLITE_OK var p uintptr p = (*struct { f func(*libc.TLS, uintptr, int32) uintptr })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxGetAuxdata})).f(tls, pFts, 0) if p == uintptr(0) { var nPhrase int32 *(*Sqlite3_int64)(unsafe.Pointer(bp)) = int64(0) *(*Sqlite3_int64)(unsafe.Pointer(bp + 8)) = int64(0) var nByte Sqlite3_int64 var i int32 nPhrase = (*struct { f func(*libc.TLS, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxPhraseCount})).f(tls, pFts) nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Bm25Data{})) + uint64(nPhrase*2)*uint64(unsafe.Sizeof(float64(0)))) p = Xsqlite3_malloc64(tls, uint64(nByte)) if p == uintptr(0) { rc = SQLITE_NOMEM } else { libc.Xmemset(tls, p, 0, Size_t(nByte)) (*Fts5Bm25Data)(unsafe.Pointer(p)).FnPhrase = nPhrase (*Fts5Bm25Data)(unsafe.Pointer(p)).FaIDF = p + 1*32 (*Fts5Bm25Data)(unsafe.Pointer(p)).FaFreq = (*Fts5Bm25Data)(unsafe.Pointer(p)).FaIDF + uintptr(nPhrase)*8 } if rc == SQLITE_OK { rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxRowCount})).f(tls, pFts, bp) } if rc == SQLITE_OK { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnTotalSize})).f(tls, pFts, -1, bp+8) } if rc == SQLITE_OK { (*Fts5Bm25Data)(unsafe.Pointer(p)).Favgdl = float64(*(*Sqlite3_int64)(unsafe.Pointer(bp + 8))) / float64(*(*Sqlite3_int64)(unsafe.Pointer(bp))) } for i = 0; rc == SQLITE_OK && i < nPhrase; i++ { *(*Sqlite3_int64)(unsafe.Pointer(bp + 16)) = int64(0) rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxQueryPhrase})).f(tls, pFts, i, bp+16, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) int32 }{fts5CountCb}))) if rc == SQLITE_OK { var idf float64 = libc.Xlog(tls, (float64(*(*Sqlite3_int64)(unsafe.Pointer(bp))-*(*Sqlite3_int64)(unsafe.Pointer(bp + 16)))+0.5)/(float64(*(*Sqlite3_int64)(unsafe.Pointer(bp + 16)))+0.5)) if idf <= 0.0 { idf = 1e-6 } *(*float64)(unsafe.Pointer((*Fts5Bm25Data)(unsafe.Pointer(p)).FaIDF + uintptr(i)*8)) = idf } } if rc != SQLITE_OK { Xsqlite3_free(tls, p) } else { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxSetAuxdata})).f(tls, pFts, p, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) } if rc != SQLITE_OK { p = uintptr(0) } } *(*uintptr)(unsafe.Pointer(ppData)) = p return rc } func fts5Bm25Function(tls *libc.TLS, pApi uintptr, pFts uintptr, pCtx uintptr, nVal int32, apVal uintptr) { bp := tls.Alloc(28) defer tls.Free(28) var k1 float64 = 1.2 var b float64 = 0.75 var rc int32 var score float64 = 0.0 var i int32 *(*int32)(unsafe.Pointer(bp + 8)) = 0 var D float64 = 0.0 var aFreq uintptr = uintptr(0) rc = fts5Bm25GetData(tls, pApi, pFts, bp) if rc == SQLITE_OK { aFreq = (*Fts5Bm25Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaFreq libc.Xmemset(tls, aFreq, 0, uint64(unsafe.Sizeof(float64(0)))*uint64((*Fts5Bm25Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnPhrase)) rc = (*struct { f func(*libc.TLS, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxInstCount})).f(tls, pFts, bp+8) } for i = 0; rc == SQLITE_OK && i < *(*int32)(unsafe.Pointer(bp + 8)); i++ { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxInst})).f(tls, pFts, i, bp+12, bp+16, bp+20) if rc == SQLITE_OK { var w float64 if nVal > *(*int32)(unsafe.Pointer(bp + 16)) { w = Xsqlite3_value_double(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(*(*int32)(unsafe.Pointer(bp + 16)))*8))) } else { w = 1.0 } *(*float64)(unsafe.Pointer(aFreq + uintptr(*(*int32)(unsafe.Pointer(bp + 12)))*8)) += w } } if rc == SQLITE_OK { rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExtensionApi)(unsafe.Pointer(pApi)).FxColumnSize})).f(tls, pFts, -1, bp+24) D = float64(*(*int32)(unsafe.Pointer(bp + 24))) } if rc == SQLITE_OK { for i = 0; i < (*Fts5Bm25Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnPhrase; i++ { score = score + *(*float64)(unsafe.Pointer((*Fts5Bm25Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaIDF + uintptr(i)*8))*(*(*float64)(unsafe.Pointer(aFreq + uintptr(i)*8))*(k1+1.0)/(*(*float64)(unsafe.Pointer(aFreq + uintptr(i)*8))+k1*(float64(1)-b+b*D/(*Fts5Bm25Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Favgdl))) } Xsqlite3_result_double(tls, pCtx, -1.0*score) } else { Xsqlite3_result_error_code(tls, pCtx, rc) } } func sqlite3Fts5AuxInit(tls *libc.TLS, pApi uintptr) int32 { bp := tls.Alloc(96) defer tls.Free(96) *(*[3]Builtin)(unsafe.Pointer(bp)) = [3]Builtin{ {FzFunc: ts + 35273, FxFunc: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) }{fts5SnippetFunction}))}, {FzFunc: ts + 35281, FxFunc: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) }{fts5HighlightFunction}))}, {FzFunc: ts + 35291, FxFunc: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) }{fts5Bm25Function}))}, } var rc int32 = SQLITE_OK var i int32 for i = 0; rc == SQLITE_OK && i < int32(uint64(unsafe.Sizeof([3]Builtin{}))/uint64(unsafe.Sizeof(Builtin{}))); i++ { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, Fts5_extension_function, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5_api)(unsafe.Pointer(pApi)).FxCreateFunction})).f(tls, pApi, (*Builtin)(unsafe.Pointer(bp+uintptr(i)*32)).FzFunc, (*Builtin)(unsafe.Pointer(bp+uintptr(i)*32)).FpUserData, (*Builtin)(unsafe.Pointer(bp+uintptr(i)*32)).FxFunc, (*Builtin)(unsafe.Pointer(bp+uintptr(i)*32)).FxDestroy) } return rc } type Builtin = struct { FzFunc uintptr FpUserData uintptr FxFunc Fts5_extension_function FxDestroy uintptr } func sqlite3Fts5BufferSize(tls *libc.TLS, pRc uintptr, pBuf uintptr, nByte U32) int32 { if U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace) < nByte { var nNew U64 if (*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace != 0 { nNew = uint64((*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace) } else { nNew = uint64(64) } var pNew uintptr for nNew < U64(nByte) { nNew = nNew * uint64(2) } pNew = Xsqlite3_realloc64(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp, nNew) if pNew == uintptr(0) { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM return 1 } else { (*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace = int32(nNew) (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp = pNew } } return 0 } func sqlite3Fts5BufferAppendVarint(tls *libc.TLS, pRc uintptr, pBuf uintptr, iVal I64) { if func() int32 { if U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)+U32(9) <= U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace) { return 0 } return sqlite3Fts5BufferSize(tls, pRc, pBuf, uint32(9+(*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)) }() != 0 { return } *(*int32)(unsafe.Pointer(pBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), uint64(iVal)) } func sqlite3Fts5Put32(tls *libc.TLS, aBuf uintptr, iVal int32) { *(*U8)(unsafe.Pointer(aBuf)) = U8(iVal >> 24 & 0x00FF) *(*U8)(unsafe.Pointer(aBuf + 1)) = U8(iVal >> 16 & 0x00FF) *(*U8)(unsafe.Pointer(aBuf + 2)) = U8(iVal >> 8 & 0x00FF) *(*U8)(unsafe.Pointer(aBuf + 3)) = U8(iVal >> 0 & 0x00FF) } func sqlite3Fts5Get32(tls *libc.TLS, aBuf uintptr) int32 { return int32(U32(*(*U8)(unsafe.Pointer(aBuf)))<<24 + U32(int32(*(*U8)(unsafe.Pointer(aBuf + 1)))<<16) + U32(int32(*(*U8)(unsafe.Pointer(aBuf + 2)))<<8) + U32(*(*U8)(unsafe.Pointer(aBuf + 3)))) } func sqlite3Fts5BufferAppendBlob(tls *libc.TLS, pRc uintptr, pBuf uintptr, nData U32, pData uintptr) { if nData != 0 { if func() int32 { if U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)+nData <= U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace) { return 0 } return sqlite3Fts5BufferSize(tls, pRc, pBuf, nData+U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)) }() != 0 { return } libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), pData, uint64(nData)) *(*int32)(unsafe.Pointer(pBuf + 8)) += int32(nData) } } func sqlite3Fts5BufferAppendString(tls *libc.TLS, pRc uintptr, pBuf uintptr, zStr uintptr) { var nStr int32 = int32(libc.Xstrlen(tls, zStr)) sqlite3Fts5BufferAppendBlob(tls, pRc, pBuf, uint32(nStr+1), zStr) (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn-- } func sqlite3Fts5BufferAppendPrintf(tls *libc.TLS, pRc uintptr, pBuf uintptr, zFmt uintptr, va uintptr) { if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var zTmp uintptr var ap Va_list _ = ap ap = va zTmp = Xsqlite3_vmprintf(tls, zFmt, ap) _ = ap if zTmp == uintptr(0) { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } else { sqlite3Fts5BufferAppendString(tls, pRc, pBuf, zTmp) Xsqlite3_free(tls, zTmp) } } } func sqlite3Fts5Mprintf(tls *libc.TLS, pRc uintptr, zFmt uintptr, va uintptr) uintptr { var zRet uintptr = uintptr(0) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var ap Va_list _ = ap ap = va zRet = Xsqlite3_vmprintf(tls, zFmt, ap) _ = ap if zRet == uintptr(0) { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } return zRet } func sqlite3Fts5BufferFree(tls *libc.TLS, pBuf uintptr) { Xsqlite3_free(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp) libc.Xmemset(tls, pBuf, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) } func sqlite3Fts5BufferZero(tls *libc.TLS, pBuf uintptr) { (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn = 0 } func sqlite3Fts5BufferSet(tls *libc.TLS, pRc uintptr, pBuf uintptr, nData int32, pData uintptr) { (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn = 0 sqlite3Fts5BufferAppendBlob(tls, pRc, pBuf, uint32(nData), pData) } func sqlite3Fts5PoslistNext64(tls *libc.TLS, a uintptr, n int32, pi uintptr, piOff uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var i int32 = *(*int32)(unsafe.Pointer(pi)) if i >= n { *(*I64)(unsafe.Pointer(piOff)) = int64(-1) return 1 } else { var iOff I64 = *(*I64)(unsafe.Pointer(piOff)) { *(*U32)(unsafe.Pointer(bp)) = U32(*(*U8)(unsafe.Pointer(a + uintptr(libc.PostIncInt32(&i, 1))))) if *(*U32)(unsafe.Pointer(bp))&U32(0x80) != 0 { i-- i = i + sqlite3Fts5GetVarint32(tls, a+uintptr(i), bp) } } if *(*U32)(unsafe.Pointer(bp)) <= U32(1) { if *(*U32)(unsafe.Pointer(bp)) == U32(0) { *(*int32)(unsafe.Pointer(pi)) = i return 0 } { *(*U32)(unsafe.Pointer(bp)) = U32(*(*U8)(unsafe.Pointer(a + uintptr(libc.PostIncInt32(&i, 1))))) if *(*U32)(unsafe.Pointer(bp))&U32(0x80) != 0 { i-- i = i + sqlite3Fts5GetVarint32(tls, a+uintptr(i), bp) } } iOff = I64(*(*U32)(unsafe.Pointer(bp))) << 32 { *(*U32)(unsafe.Pointer(bp)) = U32(*(*U8)(unsafe.Pointer(a + uintptr(libc.PostIncInt32(&i, 1))))) if *(*U32)(unsafe.Pointer(bp))&U32(0x80) != 0 { i-- i = i + sqlite3Fts5GetVarint32(tls, a+uintptr(i), bp) } } if *(*U32)(unsafe.Pointer(bp)) < U32(2) { *(*I64)(unsafe.Pointer(piOff)) = int64(-1) return 1 } *(*I64)(unsafe.Pointer(piOff)) = iOff + I64((*(*U32)(unsafe.Pointer(bp))-U32(2))&U32(0x7FFFFFFF)) } else { *(*I64)(unsafe.Pointer(piOff)) = iOff&(int64(0x7FFFFFFF)<<32) + (iOff+I64(*(*U32)(unsafe.Pointer(bp))-U32(2)))&int64(0x7FFFFFFF) } *(*int32)(unsafe.Pointer(pi)) = i return 0 } return int32(0) } func sqlite3Fts5PoslistReaderNext(tls *libc.TLS, pIter uintptr) int32 { if sqlite3Fts5PoslistNext64(tls, (*Fts5PoslistReader)(unsafe.Pointer(pIter)).Fa, (*Fts5PoslistReader)(unsafe.Pointer(pIter)).Fn, pIter+12, pIter+24) != 0 { (*Fts5PoslistReader)(unsafe.Pointer(pIter)).FbEof = U8(1) } return int32((*Fts5PoslistReader)(unsafe.Pointer(pIter)).FbEof) } func sqlite3Fts5PoslistReaderInit(tls *libc.TLS, a uintptr, n int32, pIter uintptr) int32 { libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(Fts5PoslistReader{}))) (*Fts5PoslistReader)(unsafe.Pointer(pIter)).Fa = a (*Fts5PoslistReader)(unsafe.Pointer(pIter)).Fn = n sqlite3Fts5PoslistReaderNext(tls, pIter) return int32((*Fts5PoslistReader)(unsafe.Pointer(pIter)).FbEof) } func sqlite3Fts5PoslistSafeAppend(tls *libc.TLS, pBuf uintptr, piPrev uintptr, iPos I64) { if iPos >= *(*I64)(unsafe.Pointer(piPrev)) { if iPos&colmask != *(*I64)(unsafe.Pointer(piPrev))&colmask { *(*U8)(unsafe.Pointer((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp + uintptr(libc.PostIncInt32(&(*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn, 1)))) = U8(1) *(*int32)(unsafe.Pointer(pBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), uint64(iPos>>32)) *(*I64)(unsafe.Pointer(piPrev)) = iPos & colmask } *(*int32)(unsafe.Pointer(pBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), uint64(iPos-*(*I64)(unsafe.Pointer(piPrev))+int64(2))) *(*I64)(unsafe.Pointer(piPrev)) = iPos } } var colmask I64 = int64(0x7FFFFFFF) << 32 func sqlite3Fts5PoslistWriterAppend(tls *libc.TLS, pBuf uintptr, pWriter uintptr, iPos I64) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = 0 if func() int32 { if U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)+U32(5+5+5) <= U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace) { return 0 } return sqlite3Fts5BufferSize(tls, bp, pBuf, uint32(5+5+5+(*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)) }() != 0 { return *(*int32)(unsafe.Pointer(bp)) } sqlite3Fts5PoslistSafeAppend(tls, pBuf, pWriter, iPos) return SQLITE_OK } func sqlite3Fts5MallocZero(tls *libc.TLS, pRc uintptr, nByte Sqlite3_int64) uintptr { var pRet uintptr = uintptr(0) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { pRet = Xsqlite3_malloc64(tls, uint64(nByte)) if pRet == uintptr(0) { if nByte > int64(0) { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } else { libc.Xmemset(tls, pRet, 0, Size_t(nByte)) } } return pRet } func sqlite3Fts5Strndup(tls *libc.TLS, pRc uintptr, pIn uintptr, nIn int32) uintptr { var zRet uintptr = uintptr(0) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { if nIn < 0 { nIn = int32(libc.Xstrlen(tls, pIn)) } zRet = Xsqlite3_malloc(tls, nIn+1) if zRet != 0 { libc.Xmemcpy(tls, zRet, pIn, uint64(nIn)) *(*int8)(unsafe.Pointer(zRet + uintptr(nIn))) = int8(0) } else { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } return zRet } func sqlite3Fts5IsBareword(tls *libc.TLS, t int8) int32 { bp := tls.Alloc(128) defer tls.Free(128) *(*[128]U8)(unsafe.Pointer(bp)) = [128]U8{ U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(1), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(0), U8(0), U8(0), U8(0), U8(1), U8(0), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(1), U8(0), U8(0), U8(0), U8(0), U8(0), } return libc.Bool32(int32(t)&0x80 != 0 || *(*U8)(unsafe.Pointer(bp + uintptr(int32(t)))) != 0) } // ************************************************************************ type Fts5TermsetEntry1 = struct { FpTerm uintptr FnTerm int32 FiIdx int32 FpNext uintptr } // ************************************************************************ type Fts5TermsetEntry = Fts5TermsetEntry1 func sqlite3Fts5TermsetNew(tls *libc.TLS, pp uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK *(*uintptr)(unsafe.Pointer(pp)) = sqlite3Fts5MallocZero(tls, bp, int64(unsafe.Sizeof(Fts5Termset{}))) return *(*int32)(unsafe.Pointer(bp)) } func sqlite3Fts5TermsetAdd(tls *libc.TLS, p uintptr, iIdx int32, pTerm uintptr, nTerm int32, pbPresent uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK *(*int32)(unsafe.Pointer(pbPresent)) = 0 if p != 0 { var i int32 var hash U32 = U32(13) var pEntry uintptr for i = nTerm - 1; i >= 0; i-- { hash = hash<<3 ^ hash ^ U32(*(*int8)(unsafe.Pointer(pTerm + uintptr(i)))) } hash = hash<<3 ^ hash ^ U32(iIdx) hash = hash % U32(int32(uint64(unsafe.Sizeof([512]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0))))) for pEntry = *(*uintptr)(unsafe.Pointer(p + uintptr(hash)*8)); pEntry != 0; pEntry = (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FpNext { if (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FiIdx == iIdx && (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FnTerm == nTerm && libc.Xmemcmp(tls, (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FpTerm, pTerm, uint64(nTerm)) == 0 { *(*int32)(unsafe.Pointer(pbPresent)) = 1 break } } if pEntry == uintptr(0) { pEntry = sqlite3Fts5MallocZero(tls, bp, int64(uint64(unsafe.Sizeof(Fts5TermsetEntry{}))+uint64(nTerm))) if pEntry != 0 { (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FpTerm = pEntry + 1*24 (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FnTerm = nTerm (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FiIdx = iIdx libc.Xmemcpy(tls, (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FpTerm, pTerm, uint64(nTerm)) (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FpNext = *(*uintptr)(unsafe.Pointer(p + uintptr(hash)*8)) *(*uintptr)(unsafe.Pointer(p + uintptr(hash)*8)) = pEntry } } } return *(*int32)(unsafe.Pointer(bp)) } func sqlite3Fts5TermsetFree(tls *libc.TLS, p uintptr) { if p != 0 { var i U32 for i = U32(0); i < U32(int32(uint64(unsafe.Sizeof([512]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0))))); i++ { var pEntry uintptr = *(*uintptr)(unsafe.Pointer(p + uintptr(i)*8)) for pEntry != 0 { var pDel uintptr = pEntry pEntry = (*Fts5TermsetEntry)(unsafe.Pointer(pEntry)).FpNext Xsqlite3_free(tls, pDel) } } Xsqlite3_free(tls, p) } } func fts5_iswhitespace(tls *libc.TLS, x int8) int32 { return libc.Bool32(int32(x) == ' ') } func fts5_isopenquote(tls *libc.TLS, x int8) int32 { return libc.Bool32(int32(x) == '"' || int32(x) == '\'' || int32(x) == '[' || int32(x) == '`') } func fts5ConfigSkipWhitespace(tls *libc.TLS, pIn uintptr) uintptr { var p uintptr = pIn if p != 0 { for fts5_iswhitespace(tls, *(*int8)(unsafe.Pointer(p))) != 0 { p++ } } return p } func fts5ConfigSkipBareword(tls *libc.TLS, pIn uintptr) uintptr { var p uintptr = pIn for sqlite3Fts5IsBareword(tls, *(*int8)(unsafe.Pointer(p))) != 0 { p++ } if p == pIn { p = uintptr(0) } return p } func fts5_isdigit(tls *libc.TLS, a int8) int32 { return libc.Bool32(int32(a) >= '0' && int32(a) <= '9') } func fts5ConfigSkipLiteral(tls *libc.TLS, pIn uintptr) uintptr { var p uintptr = pIn switch int32(*(*int8)(unsafe.Pointer(p))) { case 'n': fallthrough case 'N': if Xsqlite3_strnicmp(tls, ts+7533, p, 4) == 0 { p = p + 4 } else { p = uintptr(0) } break case 'x': fallthrough case 'X': p++ if int32(*(*int8)(unsafe.Pointer(p))) == '\'' { p++ for int32(*(*int8)(unsafe.Pointer(p))) >= 'a' && int32(*(*int8)(unsafe.Pointer(p))) <= 'f' || int32(*(*int8)(unsafe.Pointer(p))) >= 'A' && int32(*(*int8)(unsafe.Pointer(p))) <= 'F' || int32(*(*int8)(unsafe.Pointer(p))) >= '0' && int32(*(*int8)(unsafe.Pointer(p))) <= '9' { p++ } if int32(*(*int8)(unsafe.Pointer(p))) == '\'' && int64(0) == (int64(p)-int64(pIn))/1%int64(2) { p++ } else { p = uintptr(0) } } else { p = uintptr(0) } break case '\'': p++ for p != 0 { if int32(*(*int8)(unsafe.Pointer(p))) == '\'' { p++ if int32(*(*int8)(unsafe.Pointer(p))) != '\'' { break } } p++ if int32(*(*int8)(unsafe.Pointer(p))) == 0 { p = uintptr(0) } } break default: if int32(*(*int8)(unsafe.Pointer(p))) == '+' || int32(*(*int8)(unsafe.Pointer(p))) == '-' { p++ } for fts5_isdigit(tls, *(*int8)(unsafe.Pointer(p))) != 0 { p++ } if int32(*(*int8)(unsafe.Pointer(p))) == '.' && fts5_isdigit(tls, *(*int8)(unsafe.Pointer(p + 1))) != 0 { p += uintptr(2) for fts5_isdigit(tls, *(*int8)(unsafe.Pointer(p))) != 0 { p++ } } if p == pIn { p = uintptr(0) } break } return p } func fts5Dequote(tls *libc.TLS, z uintptr) int32 { var q int8 var iIn int32 = 1 var iOut int32 = 0 q = *(*int8)(unsafe.Pointer(z)) if int32(q) == '[' { q = int8(']') } for *(*int8)(unsafe.Pointer(z + uintptr(iIn))) != 0 { if int32(*(*int8)(unsafe.Pointer(z + uintptr(iIn)))) == int32(q) { if int32(*(*int8)(unsafe.Pointer(z + uintptr(iIn+1)))) != int32(q) { iIn++ break } else { iIn = iIn + 2 *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&iOut, 1)))) = q } } else { *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&iOut, 1)))) = *(*int8)(unsafe.Pointer(z + uintptr(libc.PostIncInt32(&iIn, 1)))) } } *(*int8)(unsafe.Pointer(z + uintptr(iOut))) = int8(0) return iIn } func sqlite3Fts5Dequote(tls *libc.TLS, z uintptr) { var quote int8 quote = *(*int8)(unsafe.Pointer(z)) if int32(quote) == '[' || int32(quote) == '\'' || int32(quote) == '"' || int32(quote) == '`' { fts5Dequote(tls, z) } } type Fts5Enum1 = struct { FzName uintptr FeVal int32 F__ccgo_pad1 [4]byte } type Fts5Enum = Fts5Enum1 func fts5ConfigSetEnum(tls *libc.TLS, aEnum uintptr, zEnum uintptr, peVal uintptr) int32 { var nEnum int32 = int32(libc.Xstrlen(tls, zEnum)) var i int32 var iVal int32 = -1 for i = 0; (*Fts5Enum)(unsafe.Pointer(aEnum+uintptr(i)*16)).FzName != 0; i++ { if Xsqlite3_strnicmp(tls, (*Fts5Enum)(unsafe.Pointer(aEnum+uintptr(i)*16)).FzName, zEnum, nEnum) == 0 { if iVal >= 0 { return SQLITE_ERROR } iVal = (*Fts5Enum)(unsafe.Pointer(aEnum + uintptr(i)*16)).FeVal } } *(*int32)(unsafe.Pointer(peVal)) = iVal if iVal < 0 { return SQLITE_ERROR } return SQLITE_OK } func fts5ConfigParseSpecial(tls *libc.TLS, pGlobal uintptr, pConfig uintptr, zCmd uintptr, zArg uintptr, pzErr uintptr) int32 { bp := tls.Alloc(112) defer tls.Free(112) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_OK var nCmd int32 = int32(libc.Xstrlen(tls, zCmd)) if Xsqlite3_strnicmp(tls, ts+35296, zCmd, nCmd) == 0 { var nByte int32 = int32(uint64(unsafe.Sizeof(int32(0))) * uint64(FTS5_MAX_PREFIX_INDEXES)) var p uintptr var bFirst int32 = 1 if (*Fts5Config)(unsafe.Pointer(pConfig)).FaPrefix == uintptr(0) { (*Fts5Config)(unsafe.Pointer(pConfig)).FaPrefix = sqlite3Fts5MallocZero(tls, bp+40, int64(nByte)) if *(*int32)(unsafe.Pointer(bp + 40)) != 0 { return *(*int32)(unsafe.Pointer(bp + 40)) } } p = zArg for 1 != 0 { var nPre int32 = 0 for int32(*(*int8)(unsafe.Pointer(p))) == ' ' { p++ } if bFirst == 0 && int32(*(*int8)(unsafe.Pointer(p))) == ',' { p++ for int32(*(*int8)(unsafe.Pointer(p))) == ' ' { p++ } } else if int32(*(*int8)(unsafe.Pointer(p))) == 0 { break } if int32(*(*int8)(unsafe.Pointer(p))) < '0' || int32(*(*int8)(unsafe.Pointer(p))) > '9' { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35303, 0) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR break } if (*Fts5Config)(unsafe.Pointer(pConfig)).FnPrefix == FTS5_MAX_PREFIX_INDEXES { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35334, libc.VaList(bp, FTS5_MAX_PREFIX_INDEXES)) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR break } for int32(*(*int8)(unsafe.Pointer(p))) >= '0' && int32(*(*int8)(unsafe.Pointer(p))) <= '9' && nPre < 1000 { nPre = nPre*10 + (int32(*(*int8)(unsafe.Pointer(p))) - '0') p++ } if nPre <= 0 || nPre >= 1000 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35367, 0) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR break } *(*int32)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FaPrefix + uintptr((*Fts5Config)(unsafe.Pointer(pConfig)).FnPrefix)*4)) = nPre (*Fts5Config)(unsafe.Pointer(pConfig)).FnPrefix++ bFirst = 0 } return *(*int32)(unsafe.Pointer(bp + 40)) } if Xsqlite3_strnicmp(tls, ts+35404, zCmd, nCmd) == 0 { var p uintptr = zArg var nArg Sqlite3_int64 = Sqlite3_int64(libc.Xstrlen(tls, zArg) + uint64(1)) var azArg uintptr = sqlite3Fts5MallocZero(tls, bp+40, int64(uint64(unsafe.Sizeof(uintptr(0)))*uint64(nArg))) var pDel uintptr = sqlite3Fts5MallocZero(tls, bp+40, nArg*int64(2)) var pSpace uintptr = pDel if azArg != 0 && pSpace != 0 { if (*Fts5Config)(unsafe.Pointer(pConfig)).FpTok != 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35413, 0) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR } else { for nArg = int64(0); p != 0 && *(*int8)(unsafe.Pointer(p)) != 0; nArg++ { var p2 uintptr = fts5ConfigSkipWhitespace(tls, p) if int32(*(*int8)(unsafe.Pointer(p2))) == '\'' { p = fts5ConfigSkipLiteral(tls, p2) } else { p = fts5ConfigSkipBareword(tls, p2) } if p != 0 { libc.Xmemcpy(tls, pSpace, p2, uint64((int64(p)-int64(p2))/1)) *(*uintptr)(unsafe.Pointer(azArg + uintptr(nArg)*8)) = pSpace sqlite3Fts5Dequote(tls, pSpace) pSpace += uintptr((int64(p)-int64(p2))/1 + int64(1)) p = fts5ConfigSkipWhitespace(tls, p) } } if p == uintptr(0) { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35446, 0) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR } else { *(*int32)(unsafe.Pointer(bp + 40)) = sqlite3Fts5GetTokenizer(tls, pGlobal, azArg, int32(nArg), pConfig, pzErr) } } } Xsqlite3_free(tls, azArg) Xsqlite3_free(tls, pDel) return *(*int32)(unsafe.Pointer(bp + 40)) } if Xsqlite3_strnicmp(tls, ts+35480, zCmd, nCmd) == 0 { if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent != FTS5_CONTENT_NORMAL { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35488, 0) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR } else { if *(*int8)(unsafe.Pointer(zArg)) != 0 { (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent = FTS5_CONTENT_EXTERNAL (*Fts5Config)(unsafe.Pointer(pConfig)).FzContent = sqlite3Fts5Mprintf(tls, bp+40, ts+35520, libc.VaList(bp+8, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, zArg)) } else { (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent = FTS5_CONTENT_NONE } } return *(*int32)(unsafe.Pointer(bp + 40)) } if Xsqlite3_strnicmp(tls, ts+35526, zCmd, nCmd) == 0 { if (*Fts5Config)(unsafe.Pointer(pConfig)).FzContentRowid != 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35540, 0) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR } else { (*Fts5Config)(unsafe.Pointer(pConfig)).FzContentRowid = sqlite3Fts5Strndup(tls, bp+40, zArg, -1) } return *(*int32)(unsafe.Pointer(bp + 40)) } if Xsqlite3_strnicmp(tls, ts+35578, zCmd, nCmd) == 0 { if int32(*(*int8)(unsafe.Pointer(zArg))) != '0' && int32(*(*int8)(unsafe.Pointer(zArg))) != '1' || int32(*(*int8)(unsafe.Pointer(zArg + 1))) != 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35589, 0) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR } else { (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize = libc.Bool32(int32(*(*int8)(unsafe.Pointer(zArg))) == '1') } return *(*int32)(unsafe.Pointer(bp + 40)) } if Xsqlite3_strnicmp(tls, ts+6427, zCmd, nCmd) == 0 { *(*[4]Fts5Enum)(unsafe.Pointer(bp + 48)) = [4]Fts5Enum{ {FzName: ts + 9378, FeVal: FTS5_DETAIL_NONE}, {FzName: ts + 18714}, {FzName: ts + 35624, FeVal: FTS5_DETAIL_COLUMNS}, {}, } if libc.AssignPtrInt32(bp+40, fts5ConfigSetEnum(tls, bp+48, zArg, pConfig+92)) != 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35632, 0) } return *(*int32)(unsafe.Pointer(bp + 40)) } *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35663, libc.VaList(bp+24, nCmd, zCmd)) return SQLITE_ERROR } func fts5ConfigDefaultTokenizer(tls *libc.TLS, pGlobal uintptr, pConfig uintptr) int32 { return sqlite3Fts5GetTokenizer(tls, pGlobal, uintptr(0), 0, pConfig, uintptr(0)) } func fts5ConfigGobbleWord(tls *libc.TLS, pRc uintptr, zIn uintptr, pzOut uintptr, pbQuoted uintptr) uintptr { var zRet uintptr = uintptr(0) var nIn Sqlite3_int64 = Sqlite3_int64(libc.Xstrlen(tls, zIn)) var zOut uintptr = Xsqlite3_malloc64(tls, uint64(nIn+int64(1))) *(*int32)(unsafe.Pointer(pbQuoted)) = 0 *(*uintptr)(unsafe.Pointer(pzOut)) = uintptr(0) if zOut == uintptr(0) { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } else { libc.Xmemcpy(tls, zOut, zIn, Size_t(nIn+int64(1))) if fts5_isopenquote(tls, *(*int8)(unsafe.Pointer(zOut))) != 0 { var ii int32 = fts5Dequote(tls, zOut) zRet = zIn + uintptr(ii) *(*int32)(unsafe.Pointer(pbQuoted)) = 1 } else { zRet = fts5ConfigSkipBareword(tls, zIn) if zRet != 0 { *(*int8)(unsafe.Pointer(zOut + uintptr((int64(zRet)-int64(zIn))/1))) = int8(0) } } } if zRet == uintptr(0) { Xsqlite3_free(tls, zOut) } else { *(*uintptr)(unsafe.Pointer(pzOut)) = zOut } return zRet } func fts5ConfigParseColumn(tls *libc.TLS, p uintptr, zCol uintptr, zArg uintptr, pzErr uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 = SQLITE_OK if 0 == Xsqlite3_stricmp(tls, zCol, ts+23607) || 0 == Xsqlite3_stricmp(tls, zCol, ts+17625) { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35691, libc.VaList(bp, zCol)) rc = SQLITE_ERROR } else if zArg != 0 { if 0 == Xsqlite3_stricmp(tls, zArg, ts+35721) { *(*U8)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(p)).FabUnindexed + uintptr((*Fts5Config)(unsafe.Pointer(p)).FnCol))) = U8(1) } else { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35731, libc.VaList(bp+8, zArg)) rc = SQLITE_ERROR } } *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(p)).FazCol + uintptr(libc.PostIncInt32(&(*Fts5Config)(unsafe.Pointer(p)).FnCol, 1))*8)) = zCol return rc } func fts5ConfigMakeExprlist(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var i int32 *(*int32)(unsafe.Pointer(bp + 24)) = SQLITE_OK *(*Fts5Buffer)(unsafe.Pointer(bp + 32)) = Fts5Buffer{} sqlite3Fts5BufferAppendPrintf(tls, bp+24, bp+32, ts+35762, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(p)).FzContentRowid)) if (*Fts5Config)(unsafe.Pointer(p)).FeContent != FTS5_CONTENT_NONE { for i = 0; i < (*Fts5Config)(unsafe.Pointer(p)).FnCol; i++ { if (*Fts5Config)(unsafe.Pointer(p)).FeContent == FTS5_CONTENT_EXTERNAL { sqlite3Fts5BufferAppendPrintf(tls, bp+24, bp+32, ts+35767, libc.VaList(bp+8, *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(p)).FazCol + uintptr(i)*8)))) } else { sqlite3Fts5BufferAppendPrintf(tls, bp+24, bp+32, ts+35774, libc.VaList(bp+16, i)) } } } (*Fts5Config)(unsafe.Pointer(p)).FzContentExprlist = (*Fts5Buffer)(unsafe.Pointer(bp + 32)).Fp return *(*int32)(unsafe.Pointer(bp + 24)) } func sqlite3Fts5ConfigParse(tls *libc.TLS, pGlobal uintptr, db uintptr, nArg int32, azArg uintptr, ppOut uintptr, pzErr uintptr) int32 { bp := tls.Alloc(76) defer tls.Free(76) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_OK var pRet uintptr var i int32 var nByte Sqlite3_int64 *(*uintptr)(unsafe.Pointer(ppOut)) = libc.AssignUintptr(&pRet, Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Fts5Config{})))) if pRet == uintptr(0) { return SQLITE_NOMEM } libc.Xmemset(tls, pRet, 0, uint64(unsafe.Sizeof(Fts5Config{}))) (*Fts5Config)(unsafe.Pointer(pRet)).Fdb = db (*Fts5Config)(unsafe.Pointer(pRet)).FiCookie = -1 nByte = Sqlite3_int64(uint64(nArg) * (uint64(unsafe.Sizeof(uintptr(0))) + uint64(unsafe.Sizeof(U8(0))))) (*Fts5Config)(unsafe.Pointer(pRet)).FazCol = sqlite3Fts5MallocZero(tls, bp+40, nByte) (*Fts5Config)(unsafe.Pointer(pRet)).FabUnindexed = func() uintptr { if (*Fts5Config)(unsafe.Pointer(pRet)).FazCol != 0 { return (*Fts5Config)(unsafe.Pointer(pRet)).FazCol + uintptr(nArg)*8 } return uintptr(0) }() (*Fts5Config)(unsafe.Pointer(pRet)).FzDb = sqlite3Fts5Strndup(tls, bp+40, *(*uintptr)(unsafe.Pointer(azArg + 1*8)), -1) (*Fts5Config)(unsafe.Pointer(pRet)).FzName = sqlite3Fts5Strndup(tls, bp+40, *(*uintptr)(unsafe.Pointer(azArg + 2*8)), -1) (*Fts5Config)(unsafe.Pointer(pRet)).FbColumnsize = 1 (*Fts5Config)(unsafe.Pointer(pRet)).FeDetail = FTS5_DETAIL_FULL if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && Xsqlite3_stricmp(tls, (*Fts5Config)(unsafe.Pointer(pRet)).FzName, ts+23607) == 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35782, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pRet)).FzName)) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR } for i = 3; *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && i < nArg; i++ { var zOrig uintptr = *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)) var z uintptr *(*uintptr)(unsafe.Pointer(bp + 48)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) var bOption int32 = 0 *(*int32)(unsafe.Pointer(bp + 56)) = 0 z = fts5ConfigGobbleWord(tls, bp+40, zOrig, bp+48, bp+56) z = fts5ConfigSkipWhitespace(tls, z) if z != 0 && int32(*(*int8)(unsafe.Pointer(z))) == '=' { bOption = 1 z++ if *(*int32)(unsafe.Pointer(bp + 56)) != 0 { z = uintptr(0) } } z = fts5ConfigSkipWhitespace(tls, z) if z != 0 && *(*int8)(unsafe.Pointer(z)) != 0 { z = fts5ConfigGobbleWord(tls, bp+40, z, bp+64, bp+72) if z != 0 && *(*int8)(unsafe.Pointer(z)) != 0 { z = uintptr(0) } } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { if z == uintptr(0) { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+35811, libc.VaList(bp+8, zOrig)) *(*int32)(unsafe.Pointer(bp + 40)) = SQLITE_ERROR } else { if bOption != 0 { *(*int32)(unsafe.Pointer(bp + 40)) = fts5ConfigParseSpecial(tls, pGlobal, pRet, func() uintptr { if *(*uintptr)(unsafe.Pointer(bp + 48)) != 0 { return *(*uintptr)(unsafe.Pointer(bp + 48)) } return ts + 1544 }(), func() uintptr { if *(*uintptr)(unsafe.Pointer(bp + 64)) != 0 { return *(*uintptr)(unsafe.Pointer(bp + 64)) } return ts + 1544 }(), pzErr) } else { *(*int32)(unsafe.Pointer(bp + 40)) = fts5ConfigParseColumn(tls, pRet, *(*uintptr)(unsafe.Pointer(bp + 48)), *(*uintptr)(unsafe.Pointer(bp + 64)), pzErr) *(*uintptr)(unsafe.Pointer(bp + 48)) = uintptr(0) } } } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 48))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pRet)).FpTok == uintptr(0) { *(*int32)(unsafe.Pointer(bp + 40)) = fts5ConfigDefaultTokenizer(tls, pGlobal, pRet) } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pRet)).FzContent == uintptr(0) { var zTail uintptr = uintptr(0) if (*Fts5Config)(unsafe.Pointer(pRet)).FeContent == FTS5_CONTENT_NORMAL { zTail = ts + 35480 } else if (*Fts5Config)(unsafe.Pointer(pRet)).FbColumnsize != 0 { zTail = ts + 35831 } if zTail != 0 { (*Fts5Config)(unsafe.Pointer(pRet)).FzContent = sqlite3Fts5Mprintf(tls, bp+40, ts+35839, libc.VaList(bp+16, (*Fts5Config)(unsafe.Pointer(pRet)).FzDb, (*Fts5Config)(unsafe.Pointer(pRet)).FzName, zTail)) } } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pRet)).FzContentRowid == uintptr(0) { (*Fts5Config)(unsafe.Pointer(pRet)).FzContentRowid = sqlite3Fts5Strndup(tls, bp+40, ts+17625, -1) } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = fts5ConfigMakeExprlist(tls, pRet) } if *(*int32)(unsafe.Pointer(bp + 40)) != SQLITE_OK { sqlite3Fts5ConfigFree(tls, pRet) *(*uintptr)(unsafe.Pointer(ppOut)) = uintptr(0) } return *(*int32)(unsafe.Pointer(bp + 40)) } func sqlite3Fts5ConfigFree(tls *libc.TLS, pConfig uintptr) { if pConfig != 0 { var i int32 if (*Fts5Config)(unsafe.Pointer(pConfig)).FpTok != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5_tokenizer)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FpTokApi)).FxDelete})).f(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FpTok) } Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName) for i = 0; i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FazCol + uintptr(i)*8))) } Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FazCol) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FaPrefix) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzRank) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzRankArgs) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzContent) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzContentRowid) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzContentExprlist) Xsqlite3_free(tls, pConfig) } } func sqlite3Fts5ConfigDeclareVtab(tls *libc.TLS, pConfig uintptr) int32 { bp := tls.Alloc(52) defer tls.Free(52) var i int32 *(*int32)(unsafe.Pointer(bp + 48)) = SQLITE_OK var zSql uintptr zSql = sqlite3Fts5Mprintf(tls, bp+48, ts+35850, 0) for i = 0; zSql != 0 && i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { var zSep uintptr = func() uintptr { if i == 0 { return ts + 1544 } return ts + 15971 }() zSql = sqlite3Fts5Mprintf(tls, bp+48, ts+35866, libc.VaList(bp, zSql, zSep, *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FazCol + uintptr(i)*8)))) } zSql = sqlite3Fts5Mprintf(tls, bp+48, ts+35873, libc.VaList(bp+24, zSql, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, ts+23607)) if zSql != 0 { *(*int32)(unsafe.Pointer(bp + 48)) = Xsqlite3_declare_vtab(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, zSql) Xsqlite3_free(tls, zSql) } return *(*int32)(unsafe.Pointer(bp + 48)) } func sqlite3Fts5Tokenize(tls *libc.TLS, pConfig uintptr, flags int32, pText uintptr, nText int32, pCtx uintptr, xToken uintptr) int32 { if pText == uintptr(0) { return SQLITE_OK } return (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5_tokenizer)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FpTokApi)).FxTokenize})).f(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FpTok, pCtx, flags, pText, nText, xToken) } func fts5ConfigSkipArgs(tls *libc.TLS, pIn uintptr) uintptr { var p uintptr = pIn for 1 != 0 { p = fts5ConfigSkipWhitespace(tls, p) p = fts5ConfigSkipLiteral(tls, p) p = fts5ConfigSkipWhitespace(tls, p) if p == uintptr(0) || int32(*(*int8)(unsafe.Pointer(p))) == ')' { break } if int32(*(*int8)(unsafe.Pointer(p))) != ',' { p = uintptr(0) break } p++ } return p } func sqlite3Fts5ConfigParseRank(tls *libc.TLS, zIn uintptr, pzRank uintptr, pzRankArgs uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var p uintptr = zIn var pRank uintptr var zRank uintptr = uintptr(0) var zRankArgs uintptr = uintptr(0) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK *(*uintptr)(unsafe.Pointer(pzRank)) = uintptr(0) *(*uintptr)(unsafe.Pointer(pzRankArgs)) = uintptr(0) if p == uintptr(0) { *(*int32)(unsafe.Pointer(bp)) = SQLITE_ERROR } else { p = fts5ConfigSkipWhitespace(tls, p) pRank = p p = fts5ConfigSkipBareword(tls, p) if p != 0 { zRank = sqlite3Fts5MallocZero(tls, bp, (int64(uintptr(1)+p)-int64(pRank))/1) if zRank != 0 { libc.Xmemcpy(tls, zRank, pRank, uint64((int64(p)-int64(pRank))/1)) } } else { *(*int32)(unsafe.Pointer(bp)) = SQLITE_ERROR } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { p = fts5ConfigSkipWhitespace(tls, p) if int32(*(*int8)(unsafe.Pointer(p))) != '(' { *(*int32)(unsafe.Pointer(bp)) = SQLITE_ERROR } p++ } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { var pArgs uintptr p = fts5ConfigSkipWhitespace(tls, p) pArgs = p if int32(*(*int8)(unsafe.Pointer(p))) != ')' { p = fts5ConfigSkipArgs(tls, p) if p == uintptr(0) { *(*int32)(unsafe.Pointer(bp)) = SQLITE_ERROR } else { zRankArgs = sqlite3Fts5MallocZero(tls, bp, (int64(uintptr(1)+p)-int64(pArgs))/1) if zRankArgs != 0 { libc.Xmemcpy(tls, zRankArgs, pArgs, uint64((int64(p)-int64(pArgs))/1)) } } } } } if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { Xsqlite3_free(tls, zRank) } else { *(*uintptr)(unsafe.Pointer(pzRank)) = zRank *(*uintptr)(unsafe.Pointer(pzRankArgs)) = zRankArgs } return *(*int32)(unsafe.Pointer(bp)) } func sqlite3Fts5ConfigSetValue(tls *libc.TLS, pConfig uintptr, zKey uintptr, pVal uintptr, pbBadkey uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 = SQLITE_OK if 0 == Xsqlite3_stricmp(tls, zKey, ts+35899) { var pgsz int32 = 0 if SQLITE_INTEGER == Xsqlite3_value_numeric_type(tls, pVal) { pgsz = Xsqlite3_value_int(tls, pVal) } if pgsz < 32 || pgsz > 64*1024 { *(*int32)(unsafe.Pointer(pbBadkey)) = 1 } else { (*Fts5Config)(unsafe.Pointer(pConfig)).Fpgsz = pgsz } } else if 0 == Xsqlite3_stricmp(tls, zKey, ts+35904) { var nHashSize int32 = -1 if SQLITE_INTEGER == Xsqlite3_value_numeric_type(tls, pVal) { nHashSize = Xsqlite3_value_int(tls, pVal) } if nHashSize <= 0 { *(*int32)(unsafe.Pointer(pbBadkey)) = 1 } else { (*Fts5Config)(unsafe.Pointer(pConfig)).FnHashSize = nHashSize } } else if 0 == Xsqlite3_stricmp(tls, zKey, ts+35913) { var nAutomerge int32 = -1 if SQLITE_INTEGER == Xsqlite3_value_numeric_type(tls, pVal) { nAutomerge = Xsqlite3_value_int(tls, pVal) } if nAutomerge < 0 || nAutomerge > 64 { *(*int32)(unsafe.Pointer(pbBadkey)) = 1 } else { if nAutomerge == 1 { nAutomerge = FTS5_DEFAULT_AUTOMERGE } (*Fts5Config)(unsafe.Pointer(pConfig)).FnAutomerge = nAutomerge } } else if 0 == Xsqlite3_stricmp(tls, zKey, ts+35923) { var nUsermerge int32 = -1 if SQLITE_INTEGER == Xsqlite3_value_numeric_type(tls, pVal) { nUsermerge = Xsqlite3_value_int(tls, pVal) } if nUsermerge < 2 || nUsermerge > 16 { *(*int32)(unsafe.Pointer(pbBadkey)) = 1 } else { (*Fts5Config)(unsafe.Pointer(pConfig)).FnUsermerge = nUsermerge } } else if 0 == Xsqlite3_stricmp(tls, zKey, ts+35933) { var nCrisisMerge int32 = -1 if SQLITE_INTEGER == Xsqlite3_value_numeric_type(tls, pVal) { nCrisisMerge = Xsqlite3_value_int(tls, pVal) } if nCrisisMerge < 0 { *(*int32)(unsafe.Pointer(pbBadkey)) = 1 } else { if nCrisisMerge <= 1 { nCrisisMerge = FTS5_DEFAULT_CRISISMERGE } if nCrisisMerge >= FTS5_MAX_SEGMENT { nCrisisMerge = FTS5_MAX_SEGMENT - 1 } (*Fts5Config)(unsafe.Pointer(pConfig)).FnCrisisMerge = nCrisisMerge } } else if 0 == Xsqlite3_stricmp(tls, zKey, ts+23607) { var zIn uintptr = Xsqlite3_value_text(tls, pVal) rc = sqlite3Fts5ConfigParseRank(tls, zIn, bp, bp+8) if rc == SQLITE_OK { Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzRank) Xsqlite3_free(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).FzRankArgs) (*Fts5Config)(unsafe.Pointer(pConfig)).FzRank = *(*uintptr)(unsafe.Pointer(bp)) (*Fts5Config)(unsafe.Pointer(pConfig)).FzRankArgs = *(*uintptr)(unsafe.Pointer(bp + 8)) } else if rc == SQLITE_ERROR { rc = SQLITE_OK *(*int32)(unsafe.Pointer(pbBadkey)) = 1 } } else { *(*int32)(unsafe.Pointer(pbBadkey)) = 1 } return rc } func sqlite3Fts5ConfigLoad(tls *libc.TLS, pConfig uintptr, iCookie int32) int32 { bp := tls.Alloc(52) defer tls.Free(52) var zSelect uintptr = ts + 35945 var zSql uintptr *(*uintptr)(unsafe.Pointer(bp + 40)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_OK var iVersion int32 = 0 (*Fts5Config)(unsafe.Pointer(pConfig)).Fpgsz = FTS5_DEFAULT_PAGE_SIZE (*Fts5Config)(unsafe.Pointer(pConfig)).FnAutomerge = FTS5_DEFAULT_AUTOMERGE (*Fts5Config)(unsafe.Pointer(pConfig)).FnUsermerge = FTS5_DEFAULT_USERMERGE (*Fts5Config)(unsafe.Pointer(pConfig)).FnCrisisMerge = FTS5_DEFAULT_CRISISMERGE (*Fts5Config)(unsafe.Pointer(pConfig)).FnHashSize = 1024 * 1024 zSql = sqlite3Fts5Mprintf(tls, bp+32, zSelect, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) if zSql != 0 { *(*int32)(unsafe.Pointer(bp + 32)) = Xsqlite3_prepare_v2(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, zSql, -1, bp+40, uintptr(0)) Xsqlite3_free(tls, zSql) } if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK { for SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 40))) { var zK uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 40)), 0) var pVal uintptr = Xsqlite3_column_value(tls, *(*uintptr)(unsafe.Pointer(bp + 40)), 1) if 0 == Xsqlite3_stricmp(tls, zK, ts+35977) { iVersion = Xsqlite3_value_int(tls, pVal) } else { *(*int32)(unsafe.Pointer(bp + 48)) = 0 sqlite3Fts5ConfigSetValue(tls, pConfig, zK, pVal, bp+48) } } *(*int32)(unsafe.Pointer(bp + 32)) = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 40))) } if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK && iVersion != FTS5_CURRENT_VERSION { *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_ERROR if (*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg != 0 { *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg)) = Xsqlite3_mprintf(tls, ts+35985, libc.VaList(bp+16, iVersion, FTS5_CURRENT_VERSION)) } } if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK { (*Fts5Config)(unsafe.Pointer(pConfig)).FiCookie = iCookie } return *(*int32)(unsafe.Pointer(bp + 32)) } type Fts5ExprTerm1 = struct { FbPrefix U8 FbFirst U8 F__ccgo_pad1 [6]byte FzTerm uintptr FpIter uintptr FpSynonym uintptr } type Fts5ExprTerm = Fts5ExprTerm1 func sqlite3Fts5ParseError(tls *libc.TLS, pParse uintptr, zFmt uintptr, va uintptr) { var ap Va_list _ = ap ap = va if (*Fts5Parse)(unsafe.Pointer(pParse)).Frc == SQLITE_OK { (*Fts5Parse)(unsafe.Pointer(pParse)).FzErr = Xsqlite3_vmprintf(tls, zFmt, ap) (*Fts5Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_ERROR } _ = ap } func fts5ExprIsspace(tls *libc.TLS, t int8) int32 { return libc.Bool32(int32(t) == ' ' || int32(t) == '\t' || int32(t) == '\n' || int32(t) == '\r') } func fts5ExprGetToken(tls *libc.TLS, pParse uintptr, pz uintptr, pToken uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var z uintptr = *(*uintptr)(unsafe.Pointer(pz)) var tok int32 for fts5ExprIsspace(tls, *(*int8)(unsafe.Pointer(z))) != 0 { z++ } (*Fts5Token)(unsafe.Pointer(pToken)).Fp = z (*Fts5Token)(unsafe.Pointer(pToken)).Fn = 1 switch int32(*(*int8)(unsafe.Pointer(z))) { case '(': tok = FTS5_LP break case ')': tok = FTS5_RP break case '{': tok = FTS5_LCP break case '}': tok = FTS5_RCP break case ':': tok = FTS5_COLON break case ',': tok = FTS5_COMMA break case '+': tok = FTS5_PLUS break case '*': tok = FTS5_STAR break case '-': tok = FTS5_MINUS break case '^': tok = FTS5_CARET break case 0: tok = FTS5_EOF break case '"': { var z2 uintptr tok = FTS5_STRING for z2 = z + 1; 1 != 0; z2++ { if int32(*(*int8)(unsafe.Pointer(z2))) == '"' { z2++ if int32(*(*int8)(unsafe.Pointer(z2))) != '"' { break } } if int32(*(*int8)(unsafe.Pointer(z2))) == 0 { sqlite3Fts5ParseError(tls, pParse, ts+36050, 0) return FTS5_EOF } } (*Fts5Token)(unsafe.Pointer(pToken)).Fn = int32((int64(z2) - int64(z)) / 1) break } default: { var z2 uintptr if sqlite3Fts5IsBareword(tls, *(*int8)(unsafe.Pointer(z))) == 0 { sqlite3Fts5ParseError(tls, pParse, ts+36070, libc.VaList(bp, z)) return FTS5_EOF } tok = FTS5_STRING for z2 = z + 1; sqlite3Fts5IsBareword(tls, *(*int8)(unsafe.Pointer(z2))) != 0; z2++ { } (*Fts5Token)(unsafe.Pointer(pToken)).Fn = int32((int64(z2) - int64(z)) / 1) if (*Fts5Token)(unsafe.Pointer(pToken)).Fn == 2 && libc.Xmemcmp(tls, (*Fts5Token)(unsafe.Pointer(pToken)).Fp, ts+36101, uint64(2)) == 0 { tok = FTS5_OR } if (*Fts5Token)(unsafe.Pointer(pToken)).Fn == 3 && libc.Xmemcmp(tls, (*Fts5Token)(unsafe.Pointer(pToken)).Fp, ts+36104, uint64(3)) == 0 { tok = FTS5_NOT } if (*Fts5Token)(unsafe.Pointer(pToken)).Fn == 3 && libc.Xmemcmp(tls, (*Fts5Token)(unsafe.Pointer(pToken)).Fp, ts+31486, uint64(3)) == 0 { tok = FTS5_AND } break } } *(*uintptr)(unsafe.Pointer(pz)) = (*Fts5Token)(unsafe.Pointer(pToken)).Fp + uintptr((*Fts5Token)(unsafe.Pointer(pToken)).Fn) return tok } func fts5ParseAlloc(tls *libc.TLS, t U64) uintptr { return Xsqlite3_malloc64(tls, uint64(Sqlite3_int64(t))) } func fts5ParseFree(tls *libc.TLS, p uintptr) { Xsqlite3_free(tls, p) } func sqlite3Fts5ExprNew(tls *libc.TLS, pConfig uintptr, bPhraseToAnd int32, iCol int32, zExpr uintptr, ppNew uintptr, pzErr uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) *(*uintptr)(unsafe.Pointer(bp + 48)) = zExpr var t int32 var pEngine uintptr var pNew uintptr *(*uintptr)(unsafe.Pointer(ppNew)) = uintptr(0) *(*uintptr)(unsafe.Pointer(pzErr)) = uintptr(0) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Parse{}))) (*Fts5Parse)(unsafe.Pointer(bp)).FbPhraseToAnd = bPhraseToAnd pEngine = sqlite3Fts5ParserAlloc(tls, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, U64) uintptr }{fts5ParseAlloc}))) if pEngine == uintptr(0) { return SQLITE_NOMEM } (*Fts5Parse)(unsafe.Pointer(bp)).FpConfig = pConfig for __ccgo := true; __ccgo; __ccgo = (*Fts5Parse)(unsafe.Pointer(bp)).Frc == SQLITE_OK && t != FTS5_EOF { t = fts5ExprGetToken(tls, bp, bp+48, bp+56) sqlite3Fts5Parser(tls, pEngine, t, *(*Fts5Token)(unsafe.Pointer(bp + 56)), bp) } sqlite3Fts5ParserFree(tls, pEngine, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{fts5ParseFree}))) if iCol < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol && (*Fts5Parse)(unsafe.Pointer(bp)).FpExpr != 0 && (*Fts5Parse)(unsafe.Pointer(bp)).Frc == SQLITE_OK { var n int32 = int32(unsafe.Sizeof(Fts5Colset{})) var pColset uintptr = sqlite3Fts5MallocZero(tls, bp+16, int64(n)) if pColset != 0 { (*Fts5Colset)(unsafe.Pointer(pColset)).FnCol = 1 *(*int32)(unsafe.Pointer(pColset + 4)) = iCol sqlite3Fts5ParseSetColset(tls, bp, (*Fts5Parse)(unsafe.Pointer(bp)).FpExpr, pColset) } } if (*Fts5Parse)(unsafe.Pointer(bp)).Frc == SQLITE_OK { *(*uintptr)(unsafe.Pointer(ppNew)) = libc.AssignUintptr(&pNew, Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Fts5Expr{})))) if pNew == uintptr(0) { (*Fts5Parse)(unsafe.Pointer(bp)).Frc = SQLITE_NOMEM sqlite3Fts5ParseNodeFree(tls, (*Fts5Parse)(unsafe.Pointer(bp)).FpExpr) } else { if !(int32((*Fts5Parse)(unsafe.Pointer(bp)).FpExpr) != 0) { var nByte int32 = int32(unsafe.Sizeof(Fts5ExprNode{})) (*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot = sqlite3Fts5MallocZero(tls, bp+16, int64(nByte)) if (*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot != 0 { (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FbEof = 1 } } else { (*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot = (*Fts5Parse)(unsafe.Pointer(bp)).FpExpr } (*Fts5Expr)(unsafe.Pointer(pNew)).FpIndex = uintptr(0) (*Fts5Expr)(unsafe.Pointer(pNew)).FpConfig = pConfig (*Fts5Expr)(unsafe.Pointer(pNew)).FapExprPhrase = (*Fts5Parse)(unsafe.Pointer(bp)).FapPhrase (*Fts5Expr)(unsafe.Pointer(pNew)).FnPhrase = (*Fts5Parse)(unsafe.Pointer(bp)).FnPhrase (*Fts5Expr)(unsafe.Pointer(pNew)).FbDesc = 0 (*Fts5Parse)(unsafe.Pointer(bp)).FapPhrase = uintptr(0) } } else { sqlite3Fts5ParseNodeFree(tls, (*Fts5Parse)(unsafe.Pointer(bp)).FpExpr) } Xsqlite3_free(tls, (*Fts5Parse)(unsafe.Pointer(bp)).FapPhrase) *(*uintptr)(unsafe.Pointer(pzErr)) = (*Fts5Parse)(unsafe.Pointer(bp)).FzErr return (*Fts5Parse)(unsafe.Pointer(bp)).Frc } func fts5ExprCountChar(tls *libc.TLS, z uintptr, nByte int32) int32 { var nRet int32 = 0 var ii int32 for ii = 0; ii < nByte; ii++ { if int32(*(*int8)(unsafe.Pointer(z + uintptr(ii))))&0xC0 != 0x80 { nRet++ } } return nRet } func sqlite3Fts5ExprPattern(tls *libc.TLS, pConfig uintptr, bGlob int32, iCol int32, zText uintptr, pp uintptr) int32 { bp := tls.Alloc(3) defer tls.Free(3) var nText I64 = I64(libc.Xstrlen(tls, zText)) var zExpr uintptr = Xsqlite3_malloc64(tls, uint64(nText*int64(4)+int64(1))) var rc int32 = SQLITE_OK if zExpr == uintptr(0) { rc = SQLITE_NOMEM } else { var iOut int32 = 0 var i int32 = 0 var iFirst int32 = 0 if bGlob == 0 { *(*int8)(unsafe.Pointer(bp)) = int8('_') *(*int8)(unsafe.Pointer(bp + 1)) = int8('%') *(*int8)(unsafe.Pointer(bp + 2)) = int8(0) } else { *(*int8)(unsafe.Pointer(bp)) = int8('*') *(*int8)(unsafe.Pointer(bp + 1)) = int8('?') *(*int8)(unsafe.Pointer(bp + 2)) = int8('[') } for I64(i) <= nText { if I64(i) == nText || int32(*(*int8)(unsafe.Pointer(zText + uintptr(i)))) == int32(*(*int8)(unsafe.Pointer(bp))) || int32(*(*int8)(unsafe.Pointer(zText + uintptr(i)))) == int32(*(*int8)(unsafe.Pointer(bp + 1))) || int32(*(*int8)(unsafe.Pointer(zText + uintptr(i)))) == int32(*(*int8)(unsafe.Pointer(bp + 2))) { if fts5ExprCountChar(tls, zText+uintptr(iFirst), i-iFirst) >= 3 { var jj int32 *(*int8)(unsafe.Pointer(zExpr + uintptr(libc.PostIncInt32(&iOut, 1)))) = int8('"') for jj = iFirst; jj < i; jj++ { *(*int8)(unsafe.Pointer(zExpr + uintptr(libc.PostIncInt32(&iOut, 1)))) = *(*int8)(unsafe.Pointer(zText + uintptr(jj))) if int32(*(*int8)(unsafe.Pointer(zText + uintptr(jj)))) == '"' { *(*int8)(unsafe.Pointer(zExpr + uintptr(libc.PostIncInt32(&iOut, 1)))) = int8('"') } } *(*int8)(unsafe.Pointer(zExpr + uintptr(libc.PostIncInt32(&iOut, 1)))) = int8('"') *(*int8)(unsafe.Pointer(zExpr + uintptr(libc.PostIncInt32(&iOut, 1)))) = int8(' ') } if int32(*(*int8)(unsafe.Pointer(zText + uintptr(i)))) == int32(*(*int8)(unsafe.Pointer(bp + 2))) { i = i + 2 if int32(*(*int8)(unsafe.Pointer(zText + uintptr(i-1)))) == '^' { i++ } for I64(i) < nText && int32(*(*int8)(unsafe.Pointer(zText + uintptr(i)))) != ']' { i++ } } iFirst = i + 1 } i++ } if iOut > 0 { var bAnd int32 = 0 if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail != FTS5_DETAIL_FULL { bAnd = 1 if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_NONE { iCol = (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol } } *(*int8)(unsafe.Pointer(zExpr + uintptr(iOut))) = int8(0) rc = sqlite3Fts5ExprNew(tls, pConfig, bAnd, iCol, zExpr, pp, (*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg) } else { *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) } Xsqlite3_free(tls, zExpr) } return rc } func sqlite3Fts5ParseNodeFree(tls *libc.TLS, p uintptr) { if p != 0 { var i int32 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(p)).FnChild; i++ { sqlite3Fts5ParseNodeFree(tls, *(*uintptr)(unsafe.Pointer(p + 48 + uintptr(i)*8))) } sqlite3Fts5ParseNearsetFree(tls, (*Fts5ExprNode)(unsafe.Pointer(p)).FpNear) Xsqlite3_free(tls, p) } } func sqlite3Fts5ExprFree(tls *libc.TLS, p uintptr) { if p != 0 { sqlite3Fts5ParseNodeFree(tls, (*Fts5Expr)(unsafe.Pointer(p)).FpRoot) Xsqlite3_free(tls, (*Fts5Expr)(unsafe.Pointer(p)).FapExprPhrase) Xsqlite3_free(tls, p) } } func sqlite3Fts5ExprAnd(tls *libc.TLS, pp1 uintptr, p2 uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Parse{}))) if *(*uintptr)(unsafe.Pointer(pp1)) != 0 { var p1 uintptr = *(*uintptr)(unsafe.Pointer(pp1)) var nPhrase int32 = (*Fts5Expr)(unsafe.Pointer(p1)).FnPhrase + (*Fts5Expr)(unsafe.Pointer(p2)).FnPhrase (*Fts5Expr)(unsafe.Pointer(p1)).FpRoot = sqlite3Fts5ParseNode(tls, bp, FTS5_AND, (*Fts5Expr)(unsafe.Pointer(p1)).FpRoot, (*Fts5Expr)(unsafe.Pointer(p2)).FpRoot, uintptr(0)) (*Fts5Expr)(unsafe.Pointer(p2)).FpRoot = uintptr(0) if (*Fts5Parse)(unsafe.Pointer(bp)).Frc == SQLITE_OK { var ap uintptr = Xsqlite3_realloc(tls, (*Fts5Expr)(unsafe.Pointer(p1)).FapExprPhrase, int32(uint64(nPhrase)*uint64(unsafe.Sizeof(uintptr(0))))) if ap == uintptr(0) { (*Fts5Parse)(unsafe.Pointer(bp)).Frc = SQLITE_NOMEM } else { var i int32 libc.Xmemmove(tls, ap+uintptr((*Fts5Expr)(unsafe.Pointer(p2)).FnPhrase)*8, ap, uint64((*Fts5Expr)(unsafe.Pointer(p1)).FnPhrase)*uint64(unsafe.Sizeof(uintptr(0)))) for i = 0; i < (*Fts5Expr)(unsafe.Pointer(p2)).FnPhrase; i++ { *(*uintptr)(unsafe.Pointer(ap + uintptr(i)*8)) = *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(p2)).FapExprPhrase + uintptr(i)*8)) } (*Fts5Expr)(unsafe.Pointer(p1)).FnPhrase = nPhrase (*Fts5Expr)(unsafe.Pointer(p1)).FapExprPhrase = ap } } Xsqlite3_free(tls, (*Fts5Expr)(unsafe.Pointer(p2)).FapExprPhrase) Xsqlite3_free(tls, p2) } else { *(*uintptr)(unsafe.Pointer(pp1)) = p2 } return (*Fts5Parse)(unsafe.Pointer(bp)).Frc } func fts5ExprSynonymRowid(tls *libc.TLS, pTerm uintptr, bDesc int32, pbEof uintptr) I64 { var iRet I64 = int64(0) var bRetValid int32 = 0 var p uintptr for p = pTerm; p != 0; p = (*Fts5ExprTerm)(unsafe.Pointer(p)).FpSynonym { if 0 == int32((*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FbEof) { var iRowid I64 = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FiRowid if bRetValid == 0 || bDesc != libc.Bool32(iRowid < iRet) { iRet = iRowid bRetValid = 1 } } } if pbEof != 0 && bRetValid == 0 { *(*int32)(unsafe.Pointer(pbEof)) = 1 } return iRet } func fts5ExprSynonymList(tls *libc.TLS, pTerm uintptr, iRowid I64, pBuf uintptr, pa uintptr, pn uintptr) int32 { bp := tls.Alloc(136) defer tls.Free(136) var aIter uintptr var nIter int32 var nAlloc int32 var rc int32 var p uintptr var nByte Sqlite3_int64 var aNew uintptr var pIter uintptr var i int32 var iMin I64 var iPrev I64 aIter = bp nIter = 0 nAlloc = 4 rc = SQLITE_OK p = pTerm __1: if !(p != 0) { goto __3 } pIter = (*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter if !(int32((*Fts5IndexIter)(unsafe.Pointer(pIter)).FbEof) == 0 && (*Fts5IndexIter)(unsafe.Pointer(pIter)).FiRowid == iRowid) { goto __4 } if !((*Fts5IndexIter)(unsafe.Pointer(pIter)).FnData == 0) { goto __5 } goto __2 __5: ; if !(nIter == nAlloc) { goto __6 } nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5PoslistReader{})) * uint64(nAlloc) * uint64(2)) aNew = Xsqlite3_malloc64(tls, uint64(nByte)) if !(aNew == uintptr(0)) { goto __7 } rc = SQLITE_NOMEM goto synonym_poslist_out __7: ; libc.Xmemcpy(tls, aNew, aIter, uint64(unsafe.Sizeof(Fts5PoslistReader{}))*uint64(nIter)) nAlloc = nAlloc * 2 if !(aIter != bp) { goto __8 } Xsqlite3_free(tls, aIter) __8: ; aIter = aNew __6: ; sqlite3Fts5PoslistReaderInit(tls, (*Fts5IndexIter)(unsafe.Pointer(pIter)).FpData, (*Fts5IndexIter)(unsafe.Pointer(pIter)).FnData, aIter+uintptr(nIter)*32) nIter++ __4: ; goto __2 __2: p = (*Fts5ExprTerm)(unsafe.Pointer(p)).FpSynonym goto __1 goto __3 __3: ; if !(nIter == 1) { goto __9 } *(*uintptr)(unsafe.Pointer(pa)) = (*Fts5PoslistReader)(unsafe.Pointer(aIter)).Fa *(*int32)(unsafe.Pointer(pn)) = (*Fts5PoslistReader)(unsafe.Pointer(aIter)).Fn goto __10 __9: *(*Fts5PoslistWriter)(unsafe.Pointer(bp + 128)) = Fts5PoslistWriter{} iPrev = int64(-1) sqlite3Fts5BufferZero(tls, pBuf) __11: if !(1 != 0) { goto __12 } iMin = int64(0xffffffff) | int64(0x7fffffff)<<32 i = 0 __13: if !(i < nIter) { goto __15 } if !(int32((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).FbEof) == 0) { goto __16 } if !((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).FiPos == iPrev) { goto __17 } if !(sqlite3Fts5PoslistReaderNext(tls, aIter+uintptr(i)*32) != 0) { goto __18 } goto __14 __18: ; __17: ; if !((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).FiPos < iMin) { goto __19 } iMin = (*Fts5PoslistReader)(unsafe.Pointer(aIter + uintptr(i)*32)).FiPos __19: ; __16: ; goto __14 __14: i++ goto __13 goto __15 __15: ; if !(iMin == int64(0xffffffff)|int64(0x7fffffff)<<32 || rc != SQLITE_OK) { goto __20 } goto __12 __20: ; rc = sqlite3Fts5PoslistWriterAppend(tls, pBuf, bp+128, iMin) iPrev = iMin goto __11 __12: ; if !(rc == SQLITE_OK) { goto __21 } *(*uintptr)(unsafe.Pointer(pa)) = (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp *(*int32)(unsafe.Pointer(pn)) = (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn __21: ; __10: ; synonym_poslist_out: if !(aIter != bp) { goto __22 } Xsqlite3_free(tls, aIter) __22: ; return rc } func fts5ExprPhraseIsMatch(tls *libc.TLS, pNode uintptr, pPhrase uintptr, pbMatch uintptr) int32 { bp := tls.Alloc(168) defer tls.Free(168) var aIter uintptr var i int32 var rc int32 var bFirst int32 var nByte Sqlite3_int64 var pTerm uintptr var bFlag int32 var pPos uintptr var iAdj I64 var bMatch int32 var iPos I64 *(*Fts5PoslistWriter)(unsafe.Pointer(bp + 160)) = Fts5PoslistWriter{} aIter = bp rc = SQLITE_OK bFirst = int32((*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32)).FbFirst) sqlite3Fts5BufferZero(tls, pPhrase+8) if !((*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm > int32(uint64(unsafe.Sizeof([4]Fts5PoslistReader{}))/uint64(unsafe.Sizeof(Fts5PoslistReader{})))) { goto __1 } nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5PoslistReader{})) * uint64((*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm)) aIter = Xsqlite3_malloc64(tls, uint64(nByte)) if !!(aIter != 0) { goto __2 } return SQLITE_NOMEM __2: ; __1: ; libc.Xmemset(tls, aIter, 0, uint64(unsafe.Sizeof(Fts5PoslistReader{}))*uint64((*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm)) i = 0 __3: if !(i < (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm) { goto __5 } pTerm = pPhrase + 32 + uintptr(i)*32 *(*int32)(unsafe.Pointer(bp + 152)) = 0 bFlag = 0 *(*uintptr)(unsafe.Pointer(bp + 144)) = uintptr(0) if !((*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym != 0) { goto __6 } *(*Fts5Buffer)(unsafe.Pointer(bp + 128)) = Fts5Buffer{} rc = fts5ExprSynonymList(tls, pTerm, (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid, bp+128, bp+144, bp+152) if !(rc != 0) { goto __8 } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 144))) goto ismatch_out __8: ; if !(*(*uintptr)(unsafe.Pointer(bp + 144)) == (*Fts5Buffer)(unsafe.Pointer(bp+128)).Fp) { goto __9 } bFlag = 1 __9: ; goto __7 __6: *(*uintptr)(unsafe.Pointer(bp + 144)) = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpIter)).FpData *(*int32)(unsafe.Pointer(bp + 152)) = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpIter)).FnData __7: ; sqlite3Fts5PoslistReaderInit(tls, *(*uintptr)(unsafe.Pointer(bp + 144)), *(*int32)(unsafe.Pointer(bp + 152)), aIter+uintptr(i)*32) (*Fts5PoslistReader)(unsafe.Pointer(aIter + uintptr(i)*32)).FbFlag = U8(bFlag) if !((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).FbEof != 0) { goto __10 } goto ismatch_out __10: ; goto __4 __4: i++ goto __3 goto __5 __5: ; __11: if !(1 != 0) { goto __12 } iPos = (*Fts5PoslistReader)(unsafe.Pointer(aIter)).FiPos __13: bMatch = 1 i = 0 __16: if !(i < (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm) { goto __18 } pPos = aIter + uintptr(i)*32 iAdj = iPos + I64(i) if !((*Fts5PoslistReader)(unsafe.Pointer(pPos)).FiPos != iAdj) { goto __19 } bMatch = 0 __20: if !((*Fts5PoslistReader)(unsafe.Pointer(pPos)).FiPos < iAdj) { goto __21 } if !(sqlite3Fts5PoslistReaderNext(tls, pPos) != 0) { goto __22 } goto ismatch_out __22: ; goto __20 __21: ; if !((*Fts5PoslistReader)(unsafe.Pointer(pPos)).FiPos > iAdj) { goto __23 } iPos = (*Fts5PoslistReader)(unsafe.Pointer(pPos)).FiPos - I64(i) __23: ; __19: ; goto __17 __17: i++ goto __16 goto __18 __18: ; goto __14 __14: if bMatch == 0 { goto __13 } goto __15 __15: ; if !(bFirst == 0 || int32(iPos&int64(0x7FFFFFFF)) == 0) { goto __24 } rc = sqlite3Fts5PoslistWriterAppend(tls, pPhrase+8, bp+160, iPos) if !(rc != SQLITE_OK) { goto __25 } goto ismatch_out __25: ; __24: ; i = 0 __26: if !(i < (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm) { goto __28 } if !(sqlite3Fts5PoslistReaderNext(tls, aIter+uintptr(i)*32) != 0) { goto __29 } goto ismatch_out __29: ; goto __27 __27: i++ goto __26 goto __28 __28: ; goto __11 __12: ; ismatch_out: *(*int32)(unsafe.Pointer(pbMatch)) = libc.Bool32((*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn > 0) i = 0 __30: if !(i < (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm) { goto __32 } if !((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).FbFlag != 0) { goto __33 } Xsqlite3_free(tls, (*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).Fa) __33: ; goto __31 __31: i++ goto __30 goto __32 __32: ; if !(aIter != bp) { goto __34 } Xsqlite3_free(tls, aIter) __34: ; return rc } type Fts5LookaheadReader1 = struct { Fa uintptr Fn int32 Fi int32 FiPos I64 FiLookahead I64 } type Fts5LookaheadReader = Fts5LookaheadReader1 func fts5LookaheadReaderNext(tls *libc.TLS, p uintptr) int32 { (*Fts5LookaheadReader)(unsafe.Pointer(p)).FiPos = (*Fts5LookaheadReader)(unsafe.Pointer(p)).FiLookahead if sqlite3Fts5PoslistNext64(tls, (*Fts5LookaheadReader)(unsafe.Pointer(p)).Fa, (*Fts5LookaheadReader)(unsafe.Pointer(p)).Fn, p+12, p+24) != 0 { (*Fts5LookaheadReader)(unsafe.Pointer(p)).FiLookahead = int64(1) << 62 } return libc.Bool32((*Fts5LookaheadReader)(unsafe.Pointer(p)).FiPos == int64(1)<<62) } func fts5LookaheadReaderInit(tls *libc.TLS, a uintptr, n int32, p uintptr) int32 { libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(Fts5LookaheadReader{}))) (*Fts5LookaheadReader)(unsafe.Pointer(p)).Fa = a (*Fts5LookaheadReader)(unsafe.Pointer(p)).Fn = n fts5LookaheadReaderNext(tls, p) return fts5LookaheadReaderNext(tls, p) } type Fts5NearTrimmer1 = struct { Freader Fts5LookaheadReader Fwriter Fts5PoslistWriter FpOut uintptr } type Fts5NearTrimmer = Fts5NearTrimmer1 func fts5ExprNearIsMatch(tls *libc.TLS, pRc uintptr, pNear uintptr) int32 { bp := tls.Alloc(196) defer tls.Free(196) var a uintptr var apPhrase uintptr var i int32 var bMatch int32 var nByte Sqlite3_int64 var pPoslist uintptr var pPos uintptr var iPos I64 var pWriter uintptr var iAdv int32 var iMin I64 var iMax I64 var bRet int32 a = bp apPhrase = pNear + 24 *(*int32)(unsafe.Pointer(bp + 192)) = *(*int32)(unsafe.Pointer(pRc)) if !((*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase > int32(uint64(unsafe.Sizeof([4]Fts5NearTrimmer{}))/uint64(unsafe.Sizeof(Fts5NearTrimmer{})))) { goto __1 } nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5NearTrimmer{})) * uint64((*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase)) a = sqlite3Fts5MallocZero(tls, bp+192, nByte) goto __2 __1: libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([4]Fts5NearTrimmer{}))) __2: ; if !(*(*int32)(unsafe.Pointer(bp + 192)) != SQLITE_OK) { goto __3 } *(*int32)(unsafe.Pointer(pRc)) = *(*int32)(unsafe.Pointer(bp + 192)) return 0 __3: ; i = 0 __4: if !(i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase) { goto __6 } pPoslist = *(*uintptr)(unsafe.Pointer(apPhrase + uintptr(i)*8)) + 8 fts5LookaheadReaderInit(tls, (*Fts5Buffer)(unsafe.Pointer(pPoslist)).Fp, (*Fts5Buffer)(unsafe.Pointer(pPoslist)).Fn, a+uintptr(i)*48) (*Fts5Buffer)(unsafe.Pointer(pPoslist)).Fn = 0 (*Fts5NearTrimmer)(unsafe.Pointer(a + uintptr(i)*48)).FpOut = pPoslist goto __5 __5: i++ goto __4 goto __6 __6: ; __7: if !(1 != 0) { goto __8 } iMax = (*Fts5NearTrimmer)(unsafe.Pointer(a)).Freader.FiPos __9: bMatch = 1 i = 0 __12: if !(i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase) { goto __14 } pPos = a + uintptr(i)*48 iMin = iMax - I64((*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(i)*8)))).FnTerm) - I64((*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnNear) if !((*Fts5LookaheadReader)(unsafe.Pointer(pPos)).FiPos < iMin || (*Fts5LookaheadReader)(unsafe.Pointer(pPos)).FiPos > iMax) { goto __15 } bMatch = 0 __16: if !((*Fts5LookaheadReader)(unsafe.Pointer(pPos)).FiPos < iMin) { goto __17 } if !(fts5LookaheadReaderNext(tls, pPos) != 0) { goto __18 } goto ismatch_out __18: ; goto __16 __17: ; if !((*Fts5LookaheadReader)(unsafe.Pointer(pPos)).FiPos > iMax) { goto __19 } iMax = (*Fts5LookaheadReader)(unsafe.Pointer(pPos)).FiPos __19: ; __15: ; goto __13 __13: i++ goto __12 goto __14 __14: ; goto __10 __10: if bMatch == 0 { goto __9 } goto __11 __11: ; i = 0 __20: if !(i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase) { goto __22 } iPos = (*Fts5NearTrimmer)(unsafe.Pointer(a + uintptr(i)*48)).Freader.FiPos pWriter = a + uintptr(i)*48 + 32 if !((*Fts5Buffer)(unsafe.Pointer((*Fts5NearTrimmer)(unsafe.Pointer(a+uintptr(i)*48)).FpOut)).Fn == 0 || iPos != (*Fts5PoslistWriter)(unsafe.Pointer(pWriter)).FiPrev) { goto __23 } sqlite3Fts5PoslistWriterAppend(tls, (*Fts5NearTrimmer)(unsafe.Pointer(a+uintptr(i)*48)).FpOut, pWriter, iPos) __23: ; goto __21 __21: i++ goto __20 goto __22 __22: ; iAdv = 0 iMin = (*Fts5NearTrimmer)(unsafe.Pointer(a)).Freader.FiLookahead i = 0 __24: if !(i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase) { goto __26 } if !((*Fts5NearTrimmer)(unsafe.Pointer(a+uintptr(i)*48)).Freader.FiLookahead < iMin) { goto __27 } iMin = (*Fts5NearTrimmer)(unsafe.Pointer(a + uintptr(i)*48)).Freader.FiLookahead iAdv = i __27: ; goto __25 __25: i++ goto __24 goto __26 __26: ; if !(fts5LookaheadReaderNext(tls, a+uintptr(iAdv)*48) != 0) { goto __28 } goto ismatch_out __28: ; goto __7 __8: ; ismatch_out: bRet = libc.Bool32((*Fts5Buffer)(unsafe.Pointer((*Fts5NearTrimmer)(unsafe.Pointer(a)).FpOut)).Fn > 0) *(*int32)(unsafe.Pointer(pRc)) = *(*int32)(unsafe.Pointer(bp + 192)) if !(a != bp) { goto __29 } Xsqlite3_free(tls, a) __29: ; return bRet return int32(0) } func fts5ExprAdvanceto(tls *libc.TLS, pIter uintptr, bDesc int32, piLast uintptr, pRc uintptr, pbEof uintptr) int32 { var iLast I64 = *(*I64)(unsafe.Pointer(piLast)) var iRowid I64 iRowid = (*Fts5IndexIter)(unsafe.Pointer(pIter)).FiRowid if bDesc == 0 && iLast > iRowid || bDesc != 0 && iLast < iRowid { var rc int32 = sqlite3Fts5IterNextFrom(tls, pIter, iLast) if rc != 0 || (*Fts5IndexIter)(unsafe.Pointer(pIter)).FbEof != 0 { *(*int32)(unsafe.Pointer(pRc)) = rc *(*int32)(unsafe.Pointer(pbEof)) = 1 return 1 } iRowid = (*Fts5IndexIter)(unsafe.Pointer(pIter)).FiRowid } *(*I64)(unsafe.Pointer(piLast)) = iRowid return 0 } func fts5ExprSynonymAdvanceto(tls *libc.TLS, pTerm uintptr, bDesc int32, piLast uintptr, pRc uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var rc int32 = SQLITE_OK var iLast I64 = *(*I64)(unsafe.Pointer(piLast)) var p uintptr *(*int32)(unsafe.Pointer(bp)) = 0 for p = pTerm; rc == SQLITE_OK && p != 0; p = (*Fts5ExprTerm)(unsafe.Pointer(p)).FpSynonym { if int32((*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FbEof) == 0 { var iRowid I64 = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FiRowid if bDesc == 0 && iLast > iRowid || bDesc != 0 && iLast < iRowid { rc = sqlite3Fts5IterNextFrom(tls, (*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter, iLast) } } } if rc != SQLITE_OK { *(*int32)(unsafe.Pointer(pRc)) = rc *(*int32)(unsafe.Pointer(bp)) = 1 } else { *(*I64)(unsafe.Pointer(piLast)) = fts5ExprSynonymRowid(tls, pTerm, bDesc, bp) } return *(*int32)(unsafe.Pointer(bp)) } func fts5ExprNearTest(tls *libc.TLS, pRc uintptr, pExpr uintptr, pNode uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pNear uintptr = (*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear *(*int32)(unsafe.Pointer(bp + 4)) = *(*int32)(unsafe.Pointer(pRc)) if (*Fts5Config)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FpConfig)).FeDetail != FTS5_DETAIL_FULL { var pTerm uintptr var pPhrase uintptr = *(*uintptr)(unsafe.Pointer(pNear + 24)) (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn = 0 for pTerm = pPhrase + 32; pTerm != 0; pTerm = (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym { var pIter uintptr = (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpIter if int32((*Fts5IndexIter)(unsafe.Pointer(pIter)).FbEof) == 0 { if (*Fts5IndexIter)(unsafe.Pointer(pIter)).FiRowid == (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid && (*Fts5IndexIter)(unsafe.Pointer(pIter)).FnData > 0 { (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn = 1 } } } return (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn } else { var i int32 for i = 0; *(*int32)(unsafe.Pointer(bp + 4)) == SQLITE_OK && i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase; i++ { var pPhrase uintptr = *(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(i)*8)) if (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm > 1 || (*Fts5ExprTerm)(unsafe.Pointer(pPhrase+32)).FpSynonym != 0 || (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset != 0 || (*Fts5ExprTerm)(unsafe.Pointer(pPhrase+32)).FbFirst != 0 { *(*int32)(unsafe.Pointer(bp)) = 0 *(*int32)(unsafe.Pointer(bp + 4)) = fts5ExprPhraseIsMatch(tls, pNode, pPhrase, bp) if *(*int32)(unsafe.Pointer(bp)) == 0 { break } } else { var pIter uintptr = (*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32)).FpIter sqlite3Fts5BufferSet(tls, bp+4, pPhrase+8, (*Fts5IndexIter)(unsafe.Pointer(pIter)).FnData, (*Fts5IndexIter)(unsafe.Pointer(pIter)).FpData) } } *(*int32)(unsafe.Pointer(pRc)) = *(*int32)(unsafe.Pointer(bp + 4)) if i == (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase && (i == 1 || fts5ExprNearIsMatch(tls, pRc, pNear) != 0) { return 1 } return 0 } return int32(0) } func fts5ExprNearInitAll(tls *libc.TLS, pExpr uintptr, pNode uintptr) int32 { var pNear uintptr = (*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear var i int32 for i = 0; i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase; i++ { var pPhrase uintptr = *(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(i)*8)) if (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm == 0 { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 1 return SQLITE_OK } else { var j int32 for j = 0; j < (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm; j++ { var pTerm uintptr = pPhrase + 32 + uintptr(j)*32 var p uintptr var bHit int32 = 0 for p = pTerm; p != 0; p = (*Fts5ExprTerm)(unsafe.Pointer(p)).FpSynonym { var rc int32 if (*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter != 0 { sqlite3Fts5IterClose(tls, (*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter) (*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter = uintptr(0) } rc = sqlite3Fts5IndexQuery(tls, (*Fts5Expr)(unsafe.Pointer(pExpr)).FpIndex, (*Fts5ExprTerm)(unsafe.Pointer(p)).FzTerm, int32(libc.Xstrlen(tls, (*Fts5ExprTerm)(unsafe.Pointer(p)).FzTerm)), func() int32 { if (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FbPrefix != 0 { return FTS5INDEX_QUERY_PREFIX } return 0 }()|func() int32 { if (*Fts5Expr)(unsafe.Pointer(pExpr)).FbDesc != 0 { return FTS5INDEX_QUERY_DESC } return 0 }(), (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset, p+16) if rc != SQLITE_OK { return rc } if 0 == int32((*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FbEof) { bHit = 1 } } if bHit == 0 { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 1 return SQLITE_OK } } } } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 0 return SQLITE_OK } func fts5RowidCmp(tls *libc.TLS, pExpr uintptr, iLhs I64, iRhs I64) int32 { if (*Fts5Expr)(unsafe.Pointer(pExpr)).FbDesc == 0 { if iLhs < iRhs { return -1 } return libc.Bool32(iLhs > iRhs) } else { if iLhs > iRhs { return -1 } return libc.Bool32(iLhs < iRhs) } return int32(0) } func fts5ExprSetEof(tls *libc.TLS, pNode uintptr) { var i int32 (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 1 (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { fts5ExprSetEof(tls, *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8))) } } func fts5ExprNodeZeroPoslist(tls *libc.TLS, pNode uintptr) { if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_STRING || (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_TERM { var pNear uintptr = (*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear var i int32 for i = 0; i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase; i++ { var pPhrase uintptr = *(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(i)*8)) (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn = 0 } } else { var i int32 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { fts5ExprNodeZeroPoslist(tls, *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8))) } } } func fts5NodeCompare(tls *libc.TLS, pExpr uintptr, p1 uintptr, p2 uintptr) int32 { if (*Fts5ExprNode)(unsafe.Pointer(p2)).FbEof != 0 { return -1 } if (*Fts5ExprNode)(unsafe.Pointer(p1)).FbEof != 0 { return +1 } return fts5RowidCmp(tls, pExpr, (*Fts5ExprNode)(unsafe.Pointer(p1)).FiRowid, (*Fts5ExprNode)(unsafe.Pointer(p2)).FiRowid) } func fts5ExprNodeTest_STRING(tls *libc.TLS, pExpr uintptr, pNode uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var pNear uintptr = (*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear var pLeft uintptr = *(*uintptr)(unsafe.Pointer(pNear + 24)) *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_OK var i int32 var j int32 var bMatch int32 var bDesc int32 = (*Fts5Expr)(unsafe.Pointer(pExpr)).FbDesc if (*Fts5ExprTerm)(unsafe.Pointer(pLeft+32)).FpSynonym != 0 { *(*I64)(unsafe.Pointer(bp)) = fts5ExprSynonymRowid(tls, pLeft+32, bDesc, uintptr(0)) } else { *(*I64)(unsafe.Pointer(bp)) = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(pLeft + 32)).FpIter)).FiRowid } for __ccgo := true; __ccgo; __ccgo = bMatch == 0 { bMatch = 1 for i = 0; i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase; i++ { var pPhrase uintptr = *(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(i)*8)) for j = 0; j < (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm; j++ { var pTerm uintptr = pPhrase + 32 + uintptr(j)*32 if (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym != 0 { var iRowid I64 = fts5ExprSynonymRowid(tls, pTerm, bDesc, uintptr(0)) if iRowid == *(*I64)(unsafe.Pointer(bp)) { continue } bMatch = 0 if fts5ExprSynonymAdvanceto(tls, pTerm, bDesc, bp, bp+8) != 0 { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 1 return *(*int32)(unsafe.Pointer(bp + 8)) } } else { var pIter uintptr = (*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32 + uintptr(j)*32)).FpIter if (*Fts5IndexIter)(unsafe.Pointer(pIter)).FiRowid == *(*I64)(unsafe.Pointer(bp)) || (*Fts5IndexIter)(unsafe.Pointer(pIter)).FbEof != 0 { continue } bMatch = 0 if fts5ExprAdvanceto(tls, pIter, bDesc, bp, bp+8, pNode+4) != 0 { return *(*int32)(unsafe.Pointer(bp + 8)) } } } } } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid = *(*I64)(unsafe.Pointer(bp)) (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = libc.Bool32(0 == fts5ExprNearTest(tls, bp+8, pExpr, pNode) && *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK) return *(*int32)(unsafe.Pointer(bp + 8)) } func fts5ExprNodeNext_STRING(tls *libc.TLS, pExpr uintptr, pNode uintptr, bFromValid int32, iFrom I64) int32 { var pTerm uintptr = *(*uintptr)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear + 24)) + 32 var rc int32 = SQLITE_OK (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 if (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym != 0 { var bEof int32 = 1 var p uintptr var iRowid I64 = fts5ExprSynonymRowid(tls, pTerm, (*Fts5Expr)(unsafe.Pointer(pExpr)).FbDesc, uintptr(0)) for p = pTerm; p != 0; p = (*Fts5ExprTerm)(unsafe.Pointer(p)).FpSynonym { if int32((*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FbEof) == 0 { var ii I64 = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FiRowid if ii == iRowid || bFromValid != 0 && ii != iFrom && libc.Bool32(ii > iFrom) == (*Fts5Expr)(unsafe.Pointer(pExpr)).FbDesc { if bFromValid != 0 { rc = sqlite3Fts5IterNextFrom(tls, (*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter, iFrom) } else { rc = sqlite3Fts5IterNext(tls, (*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter) } if rc != SQLITE_OK { break } if int32((*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(p)).FpIter)).FbEof) == 0 { bEof = 0 } } else { bEof = 0 } } } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = libc.Bool32(rc != 0 || bEof != 0) } else { var pIter uintptr = (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpIter if bFromValid != 0 { rc = sqlite3Fts5IterNextFrom(tls, pIter, iFrom) } else { rc = sqlite3Fts5IterNext(tls, pIter) } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = libc.Bool32(rc != 0 || (*Fts5IndexIter)(unsafe.Pointer(pIter)).FbEof != 0) } if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof == 0 { rc = fts5ExprNodeTest_STRING(tls, pExpr, pNode) } return rc } func fts5ExprNodeTest_TERM(tls *libc.TLS, pExpr uintptr, pNode uintptr) int32 { var pPhrase uintptr = *(*uintptr)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear + 24)) var pIter uintptr = (*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32)).FpIter (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn = (*Fts5IndexIter)(unsafe.Pointer(pIter)).FnData if (*Fts5Config)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FpConfig)).FeDetail == FTS5_DETAIL_FULL { (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fp = (*Fts5IndexIter)(unsafe.Pointer(pIter)).FpData } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid = (*Fts5IndexIter)(unsafe.Pointer(pIter)).FiRowid (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = libc.Bool32((*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn == 0) return SQLITE_OK } func fts5ExprNodeNext_TERM(tls *libc.TLS, pExpr uintptr, pNode uintptr, bFromValid int32, iFrom I64) int32 { var rc int32 var pIter uintptr = (*Fts5ExprTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear + 24)) + 32)).FpIter if bFromValid != 0 { rc = sqlite3Fts5IterNextFrom(tls, pIter, iFrom) } else { rc = sqlite3Fts5IterNext(tls, pIter) } if rc == SQLITE_OK && int32((*Fts5IndexIter)(unsafe.Pointer(pIter)).FbEof) == 0 { rc = fts5ExprNodeTest_TERM(tls, pExpr, pNode) } else { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 1 (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 } return rc } func fts5ExprNodeTest_OR(tls *libc.TLS, pExpr uintptr, pNode uintptr) { var pNext uintptr = *(*uintptr)(unsafe.Pointer(pNode + 48)) var i int32 for i = 1; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { var pChild uintptr = *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8)) var cmp int32 = fts5NodeCompare(tls, pExpr, pNext, pChild) if cmp > 0 || cmp == 0 && (*Fts5ExprNode)(unsafe.Pointer(pChild)).FbNomatch == 0 { pNext = pChild } } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid = (*Fts5ExprNode)(unsafe.Pointer(pNext)).FiRowid (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = (*Fts5ExprNode)(unsafe.Pointer(pNext)).FbEof (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = (*Fts5ExprNode)(unsafe.Pointer(pNext)).FbNomatch } func fts5ExprNodeNext_OR(tls *libc.TLS, pExpr uintptr, pNode uintptr, bFromValid int32, iFrom I64) int32 { var i int32 var iLast I64 = (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { var p1 uintptr = *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8)) if (*Fts5ExprNode)(unsafe.Pointer(p1)).FbEof == 0 { if (*Fts5ExprNode)(unsafe.Pointer(p1)).FiRowid == iLast || bFromValid != 0 && fts5RowidCmp(tls, pExpr, (*Fts5ExprNode)(unsafe.Pointer(p1)).FiRowid, iFrom) < 0 { var rc int32 = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(p1)).FxNext})).f(tls, pExpr, p1, bFromValid, iFrom) if rc != SQLITE_OK { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 return rc } } } } fts5ExprNodeTest_OR(tls, pExpr, pNode) return SQLITE_OK } func fts5ExprNodeTest_AND(tls *libc.TLS, pExpr uintptr, pAnd uintptr) int32 { var iChild int32 var iLast I64 = (*Fts5ExprNode)(unsafe.Pointer(pAnd)).FiRowid var rc int32 = SQLITE_OK var bMatch int32 for __ccgo := true; __ccgo; __ccgo = bMatch == 0 { (*Fts5ExprNode)(unsafe.Pointer(pAnd)).FbNomatch = 0 bMatch = 1 for iChild = 0; iChild < (*Fts5ExprNode)(unsafe.Pointer(pAnd)).FnChild; iChild++ { var pChild uintptr = *(*uintptr)(unsafe.Pointer(pAnd + 48 + uintptr(iChild)*8)) var cmp int32 = fts5RowidCmp(tls, pExpr, iLast, (*Fts5ExprNode)(unsafe.Pointer(pChild)).FiRowid) if cmp > 0 { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(pChild)).FxNext})).f(tls, pExpr, pChild, 1, iLast) if rc != SQLITE_OK { (*Fts5ExprNode)(unsafe.Pointer(pAnd)).FbNomatch = 0 return rc } } if (*Fts5ExprNode)(unsafe.Pointer(pChild)).FbEof != 0 { fts5ExprSetEof(tls, pAnd) bMatch = 1 break } else if iLast != (*Fts5ExprNode)(unsafe.Pointer(pChild)).FiRowid { bMatch = 0 iLast = (*Fts5ExprNode)(unsafe.Pointer(pChild)).FiRowid } if (*Fts5ExprNode)(unsafe.Pointer(pChild)).FbNomatch != 0 { (*Fts5ExprNode)(unsafe.Pointer(pAnd)).FbNomatch = 1 } } } if (*Fts5ExprNode)(unsafe.Pointer(pAnd)).FbNomatch != 0 && pAnd != (*Fts5Expr)(unsafe.Pointer(pExpr)).FpRoot { fts5ExprNodeZeroPoslist(tls, pAnd) } (*Fts5ExprNode)(unsafe.Pointer(pAnd)).FiRowid = iLast return SQLITE_OK } func fts5ExprNodeNext_AND(tls *libc.TLS, pExpr uintptr, pNode uintptr, bFromValid int32, iFrom I64) int32 { var rc int32 = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNode + 48)))).FxNext})).f(tls, pExpr, *(*uintptr)(unsafe.Pointer(pNode + 48)), bFromValid, iFrom) if rc == SQLITE_OK { rc = fts5ExprNodeTest_AND(tls, pExpr, pNode) } else { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 } return rc } func fts5ExprNodeTest_NOT(tls *libc.TLS, pExpr uintptr, pNode uintptr) int32 { var rc int32 = SQLITE_OK var p1 uintptr = *(*uintptr)(unsafe.Pointer(pNode + 48)) var p2 uintptr = *(*uintptr)(unsafe.Pointer(pNode + 48 + 1*8)) for rc == SQLITE_OK && (*Fts5ExprNode)(unsafe.Pointer(p1)).FbEof == 0 { var cmp int32 = fts5NodeCompare(tls, pExpr, p1, p2) if cmp > 0 { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(p2)).FxNext})).f(tls, pExpr, p2, 1, (*Fts5ExprNode)(unsafe.Pointer(p1)).FiRowid) cmp = fts5NodeCompare(tls, pExpr, p1, p2) } if cmp != 0 || (*Fts5ExprNode)(unsafe.Pointer(p2)).FbNomatch != 0 { break } rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(p1)).FxNext})).f(tls, pExpr, p1, 0, int64(0)) } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = (*Fts5ExprNode)(unsafe.Pointer(p1)).FbEof (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = (*Fts5ExprNode)(unsafe.Pointer(p1)).FbNomatch (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid = (*Fts5ExprNode)(unsafe.Pointer(p1)).FiRowid if (*Fts5ExprNode)(unsafe.Pointer(p1)).FbEof != 0 { fts5ExprNodeZeroPoslist(tls, p2) } return rc } func fts5ExprNodeNext_NOT(tls *libc.TLS, pExpr uintptr, pNode uintptr, bFromValid int32, iFrom I64) int32 { var rc int32 = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNode + 48)))).FxNext})).f(tls, pExpr, *(*uintptr)(unsafe.Pointer(pNode + 48)), bFromValid, iFrom) if rc == SQLITE_OK { rc = fts5ExprNodeTest_NOT(tls, pExpr, pNode) } if rc != SQLITE_OK { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 } return rc } func fts5ExprNodeTest(tls *libc.TLS, pExpr uintptr, pNode uintptr) int32 { var rc int32 = SQLITE_OK if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof == 0 { switch (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType { case FTS5_STRING: { rc = fts5ExprNodeTest_STRING(tls, pExpr, pNode) break } fallthrough case FTS5_TERM: { rc = fts5ExprNodeTest_TERM(tls, pExpr, pNode) break } fallthrough case FTS5_AND: { rc = fts5ExprNodeTest_AND(tls, pExpr, pNode) break } fallthrough case FTS5_OR: { fts5ExprNodeTest_OR(tls, pExpr, pNode) break } fallthrough default: { rc = fts5ExprNodeTest_NOT(tls, pExpr, pNode) break } } } return rc } func fts5ExprNodeFirst(tls *libc.TLS, pExpr uintptr, pNode uintptr) int32 { var rc int32 = SQLITE_OK (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 0 (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbNomatch = 0 if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_TERM || (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_STRING { rc = fts5ExprNearInitAll(tls, pExpr, pNode) } else if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FxNext == uintptr(0) { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 1 } else { var i int32 var nEof int32 = 0 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild && rc == SQLITE_OK; i++ { var pChild uintptr = *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8)) rc = fts5ExprNodeFirst(tls, pExpr, *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8))) nEof = nEof + (*Fts5ExprNode)(unsafe.Pointer(pChild)).FbEof } (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid = (*Fts5ExprNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNode + 48)))).FiRowid switch (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType { case FTS5_AND: if nEof > 0 { fts5ExprSetEof(tls, pNode) } break fallthrough case FTS5_OR: if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild == nEof { fts5ExprSetEof(tls, pNode) } break fallthrough default: (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = (*Fts5ExprNode)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNode + 48)))).FbEof break } } if rc == SQLITE_OK { rc = fts5ExprNodeTest(tls, pExpr, pNode) } return rc } func sqlite3Fts5ExprFirst(tls *libc.TLS, p uintptr, pIdx uintptr, iFirst I64, bDesc int32) int32 { var pRoot uintptr = (*Fts5Expr)(unsafe.Pointer(p)).FpRoot var rc int32 (*Fts5Expr)(unsafe.Pointer(p)).FpIndex = pIdx (*Fts5Expr)(unsafe.Pointer(p)).FbDesc = bDesc rc = fts5ExprNodeFirst(tls, p, pRoot) if rc == SQLITE_OK && 0 == (*Fts5ExprNode)(unsafe.Pointer(pRoot)).FbEof && fts5RowidCmp(tls, p, (*Fts5ExprNode)(unsafe.Pointer(pRoot)).FiRowid, iFirst) < 0 { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(pRoot)).FxNext})).f(tls, p, pRoot, 1, iFirst) } for (*Fts5ExprNode)(unsafe.Pointer(pRoot)).FbNomatch != 0 && rc == SQLITE_OK { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(pRoot)).FxNext})).f(tls, p, pRoot, 0, int64(0)) } return rc } func sqlite3Fts5ExprNext(tls *libc.TLS, p uintptr, iLast I64) int32 { var rc int32 var pRoot uintptr = (*Fts5Expr)(unsafe.Pointer(p)).FpRoot for __ccgo := true; __ccgo; __ccgo = (*Fts5ExprNode)(unsafe.Pointer(pRoot)).FbNomatch != 0 { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5ExprNode)(unsafe.Pointer(pRoot)).FxNext})).f(tls, p, pRoot, 0, int64(0)) } if fts5RowidCmp(tls, p, (*Fts5ExprNode)(unsafe.Pointer(pRoot)).FiRowid, iLast) > 0 { (*Fts5ExprNode)(unsafe.Pointer(pRoot)).FbEof = 1 } return rc } func sqlite3Fts5ExprEof(tls *libc.TLS, p uintptr) int32 { return (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(p)).FpRoot)).FbEof } func sqlite3Fts5ExprRowid(tls *libc.TLS, p uintptr) I64 { return (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(p)).FpRoot)).FiRowid } func fts5ParseStringFromToken(tls *libc.TLS, pToken uintptr, pz uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK *(*uintptr)(unsafe.Pointer(pz)) = sqlite3Fts5Strndup(tls, bp, (*Fts5Token)(unsafe.Pointer(pToken)).Fp, (*Fts5Token)(unsafe.Pointer(pToken)).Fn) return *(*int32)(unsafe.Pointer(bp)) } func fts5ExprPhraseFree(tls *libc.TLS, pPhrase uintptr) { if pPhrase != 0 { var i int32 for i = 0; i < (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm; i++ { var pSyn uintptr var pNext uintptr var pTerm uintptr = pPhrase + 32 + uintptr(i)*32 Xsqlite3_free(tls, (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FzTerm) sqlite3Fts5IterClose(tls, (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpIter) for pSyn = (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym; pSyn != 0; pSyn = pNext { pNext = (*Fts5ExprTerm)(unsafe.Pointer(pSyn)).FpSynonym sqlite3Fts5IterClose(tls, (*Fts5ExprTerm)(unsafe.Pointer(pSyn)).FpIter) sqlite3Fts5BufferFree(tls, pSyn+1*32) Xsqlite3_free(tls, pSyn) } } if (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.FnSpace > 0 { sqlite3Fts5BufferFree(tls, pPhrase+8) } Xsqlite3_free(tls, pPhrase) } } func sqlite3Fts5ParseSetCaret(tls *libc.TLS, pPhrase uintptr) { if pPhrase != 0 && (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm != 0 { (*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32)).FbFirst = U8(1) } } func sqlite3Fts5ParseNearset(tls *libc.TLS, pParse uintptr, pNear uintptr, pPhrase uintptr) uintptr { var SZALLOC int32 = 8 var pRet uintptr = uintptr(0) if (*Fts5Parse)(unsafe.Pointer(pParse)).Frc == SQLITE_OK { if pPhrase == uintptr(0) { return pNear } if pNear == uintptr(0) { var nByte Sqlite3_int64 nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5ExprNearset{})) + uint64(SZALLOC)*uint64(unsafe.Sizeof(uintptr(0)))) pRet = Xsqlite3_malloc64(tls, uint64(nByte)) if pRet == uintptr(0) { (*Fts5Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } else { libc.Xmemset(tls, pRet, 0, Size_t(nByte)) } } else if (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase%SZALLOC == 0 { var nNew int32 = (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase + SZALLOC var nByte Sqlite3_int64 nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5ExprNearset{})) + uint64(nNew)*uint64(unsafe.Sizeof(uintptr(0)))) pRet = Xsqlite3_realloc64(tls, pNear, uint64(nByte)) if pRet == uintptr(0) { (*Fts5Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } } else { pRet = pNear } } if pRet == uintptr(0) { sqlite3Fts5ParseNearsetFree(tls, pNear) sqlite3Fts5ParsePhraseFree(tls, pPhrase) } else { if (*Fts5ExprNearset)(unsafe.Pointer(pRet)).FnPhrase > 0 { var pLast uintptr = *(*uintptr)(unsafe.Pointer(pRet + 24 + uintptr((*Fts5ExprNearset)(unsafe.Pointer(pRet)).FnPhrase-1)*8)) if (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm == 0 { fts5ExprPhraseFree(tls, pPhrase) (*Fts5ExprNearset)(unsafe.Pointer(pRet)).FnPhrase-- (*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-- pPhrase = pLast } else if (*Fts5ExprPhrase)(unsafe.Pointer(pLast)).FnTerm == 0 { fts5ExprPhraseFree(tls, pLast) *(*uintptr)(unsafe.Pointer((*Fts5Parse)(unsafe.Pointer(pParse)).FapPhrase + uintptr((*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-2)*8)) = pPhrase (*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-- (*Fts5ExprNearset)(unsafe.Pointer(pRet)).FnPhrase-- } } *(*uintptr)(unsafe.Pointer(pRet + 24 + uintptr(libc.PostIncInt32(&(*Fts5ExprNearset)(unsafe.Pointer(pRet)).FnPhrase, 1))*8)) = pPhrase } return pRet } type TokenCtx1 = struct { FpPhrase uintptr Frc int32 F__ccgo_pad1 [4]byte } type TokenCtx = TokenCtx1 func fts5ParseTokenize(tls *libc.TLS, pContext uintptr, tflags int32, pToken uintptr, nToken int32, iUnused1 int32, iUnused2 int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var SZALLOC int32 = 8 var pCtx uintptr = pContext var pPhrase uintptr = (*TokenCtx)(unsafe.Pointer(pCtx)).FpPhrase _ = iUnused1 _ = iUnused2 if (*TokenCtx)(unsafe.Pointer(pCtx)).Frc != SQLITE_OK { return (*TokenCtx)(unsafe.Pointer(pCtx)).Frc } if nToken > FTS5_MAX_TOKEN_SIZE { nToken = FTS5_MAX_TOKEN_SIZE } if pPhrase != 0 && (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm > 0 && tflags&FTS5_TOKEN_COLOCATED != 0 { var pSyn uintptr var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5ExprTerm{})) + uint64(unsafe.Sizeof(Fts5Buffer{})) + uint64(nToken) + uint64(1)) pSyn = Xsqlite3_malloc64(tls, uint64(nByte)) if pSyn == uintptr(0) { *(*int32)(unsafe.Pointer(bp)) = SQLITE_NOMEM } else { libc.Xmemset(tls, pSyn, 0, Size_t(nByte)) (*Fts5ExprTerm)(unsafe.Pointer(pSyn)).FzTerm = pSyn + uintptr(uint64(unsafe.Sizeof(Fts5ExprTerm{}))) + uintptr(uint64(unsafe.Sizeof(Fts5Buffer{}))) libc.Xmemcpy(tls, (*Fts5ExprTerm)(unsafe.Pointer(pSyn)).FzTerm, pToken, uint64(nToken)) (*Fts5ExprTerm)(unsafe.Pointer(pSyn)).FpSynonym = (*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32 + uintptr((*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm-1)*32)).FpSynonym (*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32 + uintptr((*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm-1)*32)).FpSynonym = pSyn } } else { var pTerm uintptr if pPhrase == uintptr(0) || (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm%SZALLOC == 0 { var pNew uintptr var nNew int32 = SZALLOC + func() int32 { if pPhrase != 0 { return (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm } return 0 }() pNew = Xsqlite3_realloc64(tls, pPhrase, uint64(unsafe.Sizeof(Fts5ExprPhrase{}))+uint64(unsafe.Sizeof(Fts5ExprTerm{}))*uint64(nNew)) if pNew == uintptr(0) { *(*int32)(unsafe.Pointer(bp)) = SQLITE_NOMEM } else { if pPhrase == uintptr(0) { libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Fts5ExprPhrase{}))) } (*TokenCtx)(unsafe.Pointer(pCtx)).FpPhrase = libc.AssignUintptr(&pPhrase, pNew) (*Fts5ExprPhrase)(unsafe.Pointer(pNew)).FnTerm = nNew - SZALLOC } } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { pTerm = pPhrase + 32 + uintptr(libc.PostIncInt32(&(*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm, 1))*32 libc.Xmemset(tls, pTerm, 0, uint64(unsafe.Sizeof(Fts5ExprTerm{}))) (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FzTerm = sqlite3Fts5Strndup(tls, bp, pToken, nToken) } } (*TokenCtx)(unsafe.Pointer(pCtx)).Frc = *(*int32)(unsafe.Pointer(bp)) return *(*int32)(unsafe.Pointer(bp)) } func sqlite3Fts5ParsePhraseFree(tls *libc.TLS, pPhrase uintptr) { fts5ExprPhraseFree(tls, pPhrase) } func sqlite3Fts5ParseNearsetFree(tls *libc.TLS, pNear uintptr) { if pNear != 0 { var i int32 for i = 0; i < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase; i++ { fts5ExprPhraseFree(tls, *(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(i)*8))) } Xsqlite3_free(tls, (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset) Xsqlite3_free(tls, pNear) } } func sqlite3Fts5ParseFinished(tls *libc.TLS, pParse uintptr, p uintptr) { (*Fts5Parse)(unsafe.Pointer(pParse)).FpExpr = p } func parseGrowPhraseArray(tls *libc.TLS, pParse uintptr) int32 { if (*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase%8 == 0 { var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(uintptr(0))) * uint64((*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase+8)) var apNew uintptr apNew = Xsqlite3_realloc64(tls, (*Fts5Parse)(unsafe.Pointer(pParse)).FapPhrase, uint64(nByte)) if apNew == uintptr(0) { (*Fts5Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM return SQLITE_NOMEM } (*Fts5Parse)(unsafe.Pointer(pParse)).FapPhrase = apNew } return SQLITE_OK } func sqlite3Fts5ParseTerm(tls *libc.TLS, pParse uintptr, pAppend uintptr, pToken uintptr, bPrefix int32) uintptr { bp := tls.Alloc(24) defer tls.Free(24) var pConfig uintptr = (*Fts5Parse)(unsafe.Pointer(pParse)).FpConfig var rc int32 *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(TokenCtx{}))) (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase = pAppend rc = fts5ParseStringFromToken(tls, pToken, bp+16) if rc == SQLITE_OK { var flags int32 = FTS5_TOKENIZE_QUERY | func() int32 { if bPrefix != 0 { return FTS5_TOKENIZE_PREFIX } return 0 }() var n int32 sqlite3Fts5Dequote(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) n = int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(bp + 16)))) rc = sqlite3Fts5Tokenize(tls, pConfig, flags, *(*uintptr)(unsafe.Pointer(bp + 16)), n, bp, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5ParseTokenize}))) } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if rc != 0 || libc.AssignInt32(&rc, (*TokenCtx)(unsafe.Pointer(bp)).Frc) != 0 { (*Fts5Parse)(unsafe.Pointer(pParse)).Frc = rc fts5ExprPhraseFree(tls, (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase) (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase = uintptr(0) } else { if pAppend == uintptr(0) { if parseGrowPhraseArray(tls, pParse) != 0 { fts5ExprPhraseFree(tls, (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase) return uintptr(0) } (*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase++ } if (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase == uintptr(0) { (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase = sqlite3Fts5MallocZero(tls, pParse+16, int64(unsafe.Sizeof(Fts5ExprPhrase{}))) } else if (*Fts5ExprPhrase)(unsafe.Pointer((*TokenCtx)(unsafe.Pointer(bp)).FpPhrase)).FnTerm != 0 { (*Fts5ExprTerm)(unsafe.Pointer((*TokenCtx)(unsafe.Pointer(bp)).FpPhrase + 32 + uintptr((*Fts5ExprPhrase)(unsafe.Pointer((*TokenCtx)(unsafe.Pointer(bp)).FpPhrase)).FnTerm-1)*32)).FbPrefix = U8(bPrefix) } *(*uintptr)(unsafe.Pointer((*Fts5Parse)(unsafe.Pointer(pParse)).FapPhrase + uintptr((*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-1)*8)) = (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase } return (*TokenCtx)(unsafe.Pointer(bp)).FpPhrase } func sqlite3Fts5ExprClonePhrase(tls *libc.TLS, pExpr uintptr, iPhrase int32, ppNew uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var pOrig uintptr var pNew uintptr = uintptr(0) *(*TokenCtx)(unsafe.Pointer(bp + 8)) = TokenCtx{} pOrig = *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(iPhrase)*8)) pNew = sqlite3Fts5MallocZero(tls, bp, int64(unsafe.Sizeof(Fts5Expr{}))) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { (*Fts5Expr)(unsafe.Pointer(pNew)).FapExprPhrase = sqlite3Fts5MallocZero(tls, bp, int64(unsafe.Sizeof(uintptr(0)))) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { (*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot = sqlite3Fts5MallocZero(tls, bp, int64(unsafe.Sizeof(Fts5ExprNode{}))) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FpNear = sqlite3Fts5MallocZero(tls, bp, int64(uint64(unsafe.Sizeof(Fts5ExprNearset{}))+uint64(unsafe.Sizeof(uintptr(0))))) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { var pColsetOrig uintptr = (*Fts5ExprNearset)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer((*Fts5ExprPhrase)(unsafe.Pointer(pOrig)).FpNode)).FpNear)).FpColset if pColsetOrig != 0 { var nByte Sqlite3_int64 var pColset uintptr nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Colset{})) + uint64((*Fts5Colset)(unsafe.Pointer(pColsetOrig)).FnCol-1)*uint64(unsafe.Sizeof(int32(0)))) pColset = sqlite3Fts5MallocZero(tls, bp, nByte) if pColset != 0 { libc.Xmemcpy(tls, pColset, pColsetOrig, Size_t(nByte)) } (*Fts5ExprNearset)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FpNear)).FpColset = pColset } } if (*Fts5ExprPhrase)(unsafe.Pointer(pOrig)).FnTerm != 0 { var i int32 for i = 0; *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK && i < (*Fts5ExprPhrase)(unsafe.Pointer(pOrig)).FnTerm; i++ { var tflags int32 = 0 var p uintptr for p = pOrig + 32 + uintptr(i)*32; p != 0 && *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK; p = (*Fts5ExprTerm)(unsafe.Pointer(p)).FpSynonym { var zTerm uintptr = (*Fts5ExprTerm)(unsafe.Pointer(p)).FzTerm *(*int32)(unsafe.Pointer(bp)) = fts5ParseTokenize(tls, bp+8, tflags, zTerm, int32(libc.Xstrlen(tls, zTerm)), 0, 0) tflags = FTS5_TOKEN_COLOCATED } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { (*Fts5ExprTerm)(unsafe.Pointer((*TokenCtx)(unsafe.Pointer(bp+8)).FpPhrase + 32 + uintptr(i)*32)).FbPrefix = (*Fts5ExprTerm)(unsafe.Pointer(pOrig + 32 + uintptr(i)*32)).FbPrefix (*Fts5ExprTerm)(unsafe.Pointer((*TokenCtx)(unsafe.Pointer(bp+8)).FpPhrase + 32 + uintptr(i)*32)).FbFirst = (*Fts5ExprTerm)(unsafe.Pointer(pOrig + 32 + uintptr(i)*32)).FbFirst } } } else { (*TokenCtx)(unsafe.Pointer(bp + 8)).FpPhrase = sqlite3Fts5MallocZero(tls, bp, int64(unsafe.Sizeof(Fts5ExprPhrase{}))) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK && (*TokenCtx)(unsafe.Pointer(bp+8)).FpPhrase != 0 { (*Fts5Expr)(unsafe.Pointer(pNew)).FpIndex = (*Fts5Expr)(unsafe.Pointer(pExpr)).FpIndex (*Fts5Expr)(unsafe.Pointer(pNew)).FpConfig = (*Fts5Expr)(unsafe.Pointer(pExpr)).FpConfig (*Fts5Expr)(unsafe.Pointer(pNew)).FnPhrase = 1 *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FapExprPhrase)) = (*TokenCtx)(unsafe.Pointer(bp + 8)).FpPhrase *(*uintptr)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FpNear + 24)) = (*TokenCtx)(unsafe.Pointer(bp + 8)).FpPhrase (*Fts5ExprNearset)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FpNear)).FnPhrase = 1 (*Fts5ExprPhrase)(unsafe.Pointer((*TokenCtx)(unsafe.Pointer(bp + 8)).FpPhrase)).FpNode = (*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot if (*Fts5ExprPhrase)(unsafe.Pointer(pOrig)).FnTerm == 1 && (*Fts5ExprTerm)(unsafe.Pointer(pOrig+32)).FpSynonym == uintptr(0) && int32((*Fts5ExprTerm)(unsafe.Pointer(pOrig+32)).FbFirst) == 0 { (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FeType = FTS5_TERM (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 }{fts5ExprNodeNext_TERM})) } else { (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FeType = FTS5_STRING (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pNew)).FpRoot)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 }{fts5ExprNodeNext_STRING})) } } else { sqlite3Fts5ExprFree(tls, pNew) fts5ExprPhraseFree(tls, (*TokenCtx)(unsafe.Pointer(bp+8)).FpPhrase) pNew = uintptr(0) } *(*uintptr)(unsafe.Pointer(ppNew)) = pNew return *(*int32)(unsafe.Pointer(bp)) } func sqlite3Fts5ParseNear(tls *libc.TLS, pParse uintptr, pTok uintptr) { bp := tls.Alloc(16) defer tls.Free(16) if (*Fts5Token)(unsafe.Pointer(pTok)).Fn != 4 || libc.Xmemcmp(tls, ts+36108, (*Fts5Token)(unsafe.Pointer(pTok)).Fp, uint64(4)) != 0 { sqlite3Fts5ParseError(tls, pParse, ts+35137, libc.VaList(bp, (*Fts5Token)(unsafe.Pointer(pTok)).Fn, (*Fts5Token)(unsafe.Pointer(pTok)).Fp)) } } func sqlite3Fts5ParseSetDistance(tls *libc.TLS, pParse uintptr, pNear uintptr, p uintptr) { bp := tls.Alloc(16) defer tls.Free(16) if pNear != 0 { var nNear int32 = 0 var i int32 if (*Fts5Token)(unsafe.Pointer(p)).Fn != 0 { for i = 0; i < (*Fts5Token)(unsafe.Pointer(p)).Fn; i++ { var c int8 = *(*int8)(unsafe.Pointer((*Fts5Token)(unsafe.Pointer(p)).Fp + uintptr(i))) if int32(c) < '0' || int32(c) > '9' { sqlite3Fts5ParseError(tls, pParse, ts+36113, libc.VaList(bp, (*Fts5Token)(unsafe.Pointer(p)).Fn, (*Fts5Token)(unsafe.Pointer(p)).Fp)) return } nNear = nNear*10 + (int32(*(*int8)(unsafe.Pointer((*Fts5Token)(unsafe.Pointer(p)).Fp + uintptr(i)))) - '0') } } else { nNear = FTS5_DEFAULT_NEARDIST } (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnNear = nNear } } func fts5ParseColset(tls *libc.TLS, pParse uintptr, p uintptr, iCol int32) uintptr { var nCol int32 if p != 0 { nCol = (*Fts5Colset)(unsafe.Pointer(p)).FnCol } else { nCol = 0 } var pNew uintptr pNew = Xsqlite3_realloc64(tls, p, uint64(unsafe.Sizeof(Fts5Colset{}))+uint64(unsafe.Sizeof(int32(0)))*uint64(nCol)) if pNew == uintptr(0) { (*Fts5Parse)(unsafe.Pointer(pParse)).Frc = SQLITE_NOMEM } else { var aiCol uintptr = pNew + 4 var i int32 var j int32 for i = 0; i < nCol; i++ { if *(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)) == iCol { return pNew } if *(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)) > iCol { break } } for j = nCol; j > i; j-- { *(*int32)(unsafe.Pointer(aiCol + uintptr(j)*4)) = *(*int32)(unsafe.Pointer(aiCol + uintptr(j-1)*4)) } *(*int32)(unsafe.Pointer(aiCol + uintptr(i)*4)) = iCol (*Fts5Colset)(unsafe.Pointer(pNew)).FnCol = nCol + 1 } return pNew } func sqlite3Fts5ParseColsetInvert(tls *libc.TLS, pParse uintptr, p uintptr) uintptr { var pRet uintptr var nCol int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Parse)(unsafe.Pointer(pParse)).FpConfig)).FnCol pRet = sqlite3Fts5MallocZero(tls, pParse+16, int64(uint64(unsafe.Sizeof(Fts5Colset{}))+uint64(unsafe.Sizeof(int32(0)))*uint64(nCol))) if pRet != 0 { var i int32 var iOld int32 = 0 for i = 0; i < nCol; i++ { if iOld >= (*Fts5Colset)(unsafe.Pointer(p)).FnCol || *(*int32)(unsafe.Pointer(p + 4 + uintptr(iOld)*4)) != i { *(*int32)(unsafe.Pointer(pRet + 4 + uintptr(libc.PostIncInt32(&(*Fts5Colset)(unsafe.Pointer(pRet)).FnCol, 1))*4)) = i } else { iOld++ } } } Xsqlite3_free(tls, p) return pRet } func sqlite3Fts5ParseColset(tls *libc.TLS, pParse uintptr, pColset uintptr, p uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var pRet uintptr = uintptr(0) var iCol int32 var z uintptr z = sqlite3Fts5Strndup(tls, pParse+16, (*Fts5Token)(unsafe.Pointer(p)).Fp, (*Fts5Token)(unsafe.Pointer(p)).Fn) if (*Fts5Parse)(unsafe.Pointer(pParse)).Frc == SQLITE_OK { var pConfig uintptr = (*Fts5Parse)(unsafe.Pointer(pParse)).FpConfig sqlite3Fts5Dequote(tls, z) for iCol = 0; iCol < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; iCol++ { if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FazCol + uintptr(iCol)*8)), z) { break } } if iCol == (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol { sqlite3Fts5ParseError(tls, pParse, ts+21944, libc.VaList(bp, z)) } else { pRet = fts5ParseColset(tls, pParse, pColset, iCol) } Xsqlite3_free(tls, z) } if pRet == uintptr(0) { Xsqlite3_free(tls, pColset) } return pRet } func fts5CloneColset(tls *libc.TLS, pRc uintptr, pOrig uintptr) uintptr { var pRet uintptr if pOrig != 0 { var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Colset{})) + uint64((*Fts5Colset)(unsafe.Pointer(pOrig)).FnCol-1)*uint64(unsafe.Sizeof(int32(0)))) pRet = sqlite3Fts5MallocZero(tls, pRc, nByte) if pRet != 0 { libc.Xmemcpy(tls, pRet, pOrig, Size_t(nByte)) } } else { pRet = uintptr(0) } return pRet } func fts5MergeColset(tls *libc.TLS, pColset uintptr, pMerge uintptr) { var iIn int32 = 0 var iMerge int32 = 0 var iOut int32 = 0 for iIn < (*Fts5Colset)(unsafe.Pointer(pColset)).FnCol && iMerge < (*Fts5Colset)(unsafe.Pointer(pMerge)).FnCol { var iDiff int32 = *(*int32)(unsafe.Pointer(pColset + 4 + uintptr(iIn)*4)) - *(*int32)(unsafe.Pointer(pMerge + 4 + uintptr(iMerge)*4)) if iDiff == 0 { *(*int32)(unsafe.Pointer(pColset + 4 + uintptr(libc.PostIncInt32(&iOut, 1))*4)) = *(*int32)(unsafe.Pointer(pMerge + 4 + uintptr(iMerge)*4)) iMerge++ iIn++ } else if iDiff > 0 { iMerge++ } else { iIn++ } } (*Fts5Colset)(unsafe.Pointer(pColset)).FnCol = iOut } func fts5ParseSetColset(tls *libc.TLS, pParse uintptr, pNode uintptr, pColset uintptr, ppFree uintptr) { if (*Fts5Parse)(unsafe.Pointer(pParse)).Frc == SQLITE_OK { if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_STRING || (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_TERM { var pNear uintptr = (*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear if (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset != 0 { fts5MergeColset(tls, (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset, pColset) if (*Fts5Colset)(unsafe.Pointer((*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset)).FnCol == 0 { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType = FTS5_EOF (*Fts5ExprNode)(unsafe.Pointer(pNode)).FxNext = uintptr(0) } } else if *(*uintptr)(unsafe.Pointer(ppFree)) != 0 { (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset = pColset *(*uintptr)(unsafe.Pointer(ppFree)) = uintptr(0) } else { (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FpColset = fts5CloneColset(tls, pParse+16, pColset) } } else { var i int32 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { fts5ParseSetColset(tls, pParse, *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8)), pColset, ppFree) } } } } func sqlite3Fts5ParseSetColset(tls *libc.TLS, pParse uintptr, pExpr uintptr, pColset uintptr) { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = pColset if (*Fts5Config)(unsafe.Pointer((*Fts5Parse)(unsafe.Pointer(pParse)).FpConfig)).FeDetail == FTS5_DETAIL_NONE { sqlite3Fts5ParseError(tls, pParse, ts+36142, 0) } else { fts5ParseSetColset(tls, pParse, pExpr, pColset, bp) } Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp))) } func fts5ExprAssignXNext(tls *libc.TLS, pNode uintptr) { switch (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType { case FTS5_STRING: { var pNear uintptr = (*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear if (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase == 1 && (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24)))).FnTerm == 1 && (*Fts5ExprTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24))+32)).FpSynonym == uintptr(0) && int32((*Fts5ExprTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24))+32)).FbFirst) == 0 { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType = FTS5_TERM (*Fts5ExprNode)(unsafe.Pointer(pNode)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 }{fts5ExprNodeNext_TERM})) } else { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 }{fts5ExprNodeNext_STRING})) } break } case FTS5_OR: { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 }{fts5ExprNodeNext_OR})) break } case FTS5_AND: { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 }{fts5ExprNodeNext_AND})) break } default: { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, I64) int32 }{fts5ExprNodeNext_NOT})) break } } } func fts5ExprAddChildren(tls *libc.TLS, p uintptr, pSub uintptr) { if (*Fts5ExprNode)(unsafe.Pointer(p)).FeType != FTS5_NOT && (*Fts5ExprNode)(unsafe.Pointer(pSub)).FeType == (*Fts5ExprNode)(unsafe.Pointer(p)).FeType { var nByte int32 = int32(uint64(unsafe.Sizeof(uintptr(0))) * uint64((*Fts5ExprNode)(unsafe.Pointer(pSub)).FnChild)) libc.Xmemcpy(tls, p+48+uintptr((*Fts5ExprNode)(unsafe.Pointer(p)).FnChild)*8, pSub+48, uint64(nByte)) *(*int32)(unsafe.Pointer(p + 40)) += (*Fts5ExprNode)(unsafe.Pointer(pSub)).FnChild Xsqlite3_free(tls, pSub) } else { *(*uintptr)(unsafe.Pointer(p + 48 + uintptr(libc.PostIncInt32(&(*Fts5ExprNode)(unsafe.Pointer(p)).FnChild, 1))*8)) = pSub } } func fts5ParsePhraseToAnd(tls *libc.TLS, pParse uintptr, pNear uintptr) uintptr { var nTerm int32 = (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24)))).FnTerm var ii int32 var nByte int32 var pRet uintptr nByte = int32(uint64(unsafe.Sizeof(Fts5ExprNode{})) + uint64(nTerm)*uint64(unsafe.Sizeof(uintptr(0)))) pRet = sqlite3Fts5MallocZero(tls, pParse+16, int64(nByte)) if pRet != 0 { (*Fts5ExprNode)(unsafe.Pointer(pRet)).FeType = FTS5_AND (*Fts5ExprNode)(unsafe.Pointer(pRet)).FnChild = nTerm fts5ExprAssignXNext(tls, pRet) (*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-- for ii = 0; ii < nTerm; ii++ { var pPhrase uintptr = sqlite3Fts5MallocZero(tls, pParse+16, int64(unsafe.Sizeof(Fts5ExprPhrase{}))) if pPhrase != 0 { if parseGrowPhraseArray(tls, pParse) != 0 { fts5ExprPhraseFree(tls, pPhrase) } else { *(*uintptr)(unsafe.Pointer((*Fts5Parse)(unsafe.Pointer(pParse)).FapPhrase + uintptr(libc.PostIncInt32(&(*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase, 1))*8)) = pPhrase (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm = 1 (*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32)).FzTerm = sqlite3Fts5Strndup(tls, pParse+16, (*Fts5ExprTerm)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24))+32+uintptr(ii)*32)).FzTerm, -1) *(*uintptr)(unsafe.Pointer(pRet + 48 + uintptr(ii)*8)) = sqlite3Fts5ParseNode(tls, pParse, FTS5_STRING, uintptr(0), uintptr(0), sqlite3Fts5ParseNearset(tls, pParse, uintptr(0), pPhrase)) } } } if (*Fts5Parse)(unsafe.Pointer(pParse)).Frc != 0 { sqlite3Fts5ParseNodeFree(tls, pRet) pRet = uintptr(0) } else { sqlite3Fts5ParseNearsetFree(tls, pNear) } } return pRet } func sqlite3Fts5ParseNode(tls *libc.TLS, pParse uintptr, eType int32, pLeft uintptr, pRight uintptr, pNear uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var pRet uintptr = uintptr(0) if (*Fts5Parse)(unsafe.Pointer(pParse)).Frc == SQLITE_OK { var nChild int32 = 0 var nByte Sqlite3_int64 if eType == FTS5_STRING && pNear == uintptr(0) { return uintptr(0) } if eType != FTS5_STRING && pLeft == uintptr(0) { return pRight } if eType != FTS5_STRING && pRight == uintptr(0) { return pLeft } if eType == FTS5_STRING && (*Fts5Parse)(unsafe.Pointer(pParse)).FbPhraseToAnd != 0 && (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24)))).FnTerm > 1 { pRet = fts5ParsePhraseToAnd(tls, pParse, pNear) } else { if eType == FTS5_NOT { nChild = 2 } else if eType == FTS5_AND || eType == FTS5_OR { nChild = 2 if (*Fts5ExprNode)(unsafe.Pointer(pLeft)).FeType == eType { nChild = nChild + ((*Fts5ExprNode)(unsafe.Pointer(pLeft)).FnChild - 1) } if (*Fts5ExprNode)(unsafe.Pointer(pRight)).FeType == eType { nChild = nChild + ((*Fts5ExprNode)(unsafe.Pointer(pRight)).FnChild - 1) } } nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5ExprNode{})) + uint64(unsafe.Sizeof(uintptr(0)))*uint64(nChild-1)) pRet = sqlite3Fts5MallocZero(tls, pParse+16, nByte) if pRet != 0 { (*Fts5ExprNode)(unsafe.Pointer(pRet)).FeType = eType (*Fts5ExprNode)(unsafe.Pointer(pRet)).FpNear = pNear fts5ExprAssignXNext(tls, pRet) if eType == FTS5_STRING { var iPhrase int32 for iPhrase = 0; iPhrase < (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase; iPhrase++ { (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(iPhrase)*8)))).FpNode = pRet if (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pNear + 24 + uintptr(iPhrase)*8)))).FnTerm == 0 { (*Fts5ExprNode)(unsafe.Pointer(pRet)).FxNext = uintptr(0) (*Fts5ExprNode)(unsafe.Pointer(pRet)).FeType = FTS5_EOF } } if (*Fts5Config)(unsafe.Pointer((*Fts5Parse)(unsafe.Pointer(pParse)).FpConfig)).FeDetail != FTS5_DETAIL_FULL { var pPhrase uintptr = *(*uintptr)(unsafe.Pointer(pNear + 24)) if (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase != 1 || (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm > 1 || (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FnTerm > 0 && (*Fts5ExprTerm)(unsafe.Pointer(pPhrase+32)).FbFirst != 0 { sqlite3Fts5ParseError(tls, pParse, ts+36195, libc.VaList(bp, func() uintptr { if (*Fts5ExprNearset)(unsafe.Pointer(pNear)).FnPhrase == 1 { return ts + 36245 } return ts + 36108 }())) Xsqlite3_free(tls, pRet) pRet = uintptr(0) } } } else { fts5ExprAddChildren(tls, pRet, pLeft) fts5ExprAddChildren(tls, pRet, pRight) } } } } if pRet == uintptr(0) { sqlite3Fts5ParseNodeFree(tls, pLeft) sqlite3Fts5ParseNodeFree(tls, pRight) sqlite3Fts5ParseNearsetFree(tls, pNear) } return pRet } func sqlite3Fts5ParseImplicitAnd(tls *libc.TLS, pParse uintptr, pLeft uintptr, pRight uintptr) uintptr { var pRet uintptr = uintptr(0) var pPrev uintptr if (*Fts5Parse)(unsafe.Pointer(pParse)).Frc != 0 { sqlite3Fts5ParseNodeFree(tls, pLeft) sqlite3Fts5ParseNodeFree(tls, pRight) } else { if (*Fts5ExprNode)(unsafe.Pointer(pLeft)).FeType == FTS5_AND { pPrev = *(*uintptr)(unsafe.Pointer(pLeft + 48 + uintptr((*Fts5ExprNode)(unsafe.Pointer(pLeft)).FnChild-1)*8)) } else { pPrev = pLeft } if (*Fts5ExprNode)(unsafe.Pointer(pRight)).FeType == FTS5_EOF { sqlite3Fts5ParseNodeFree(tls, pRight) pRet = pLeft (*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-- } else if (*Fts5ExprNode)(unsafe.Pointer(pPrev)).FeType == FTS5_EOF { var ap uintptr if pPrev == pLeft { pRet = pRight } else { *(*uintptr)(unsafe.Pointer(pLeft + 48 + uintptr((*Fts5ExprNode)(unsafe.Pointer(pLeft)).FnChild-1)*8)) = pRight pRet = pLeft } ap = (*Fts5Parse)(unsafe.Pointer(pParse)).FapPhrase + uintptr((*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-1-(*Fts5ExprNearset)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pRight)).FpNear)).FnPhrase)*8 libc.Xmemmove(tls, ap, ap+1*8, uint64(unsafe.Sizeof(uintptr(0)))*uint64((*Fts5ExprNearset)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pRight)).FpNear)).FnPhrase)) (*Fts5Parse)(unsafe.Pointer(pParse)).FnPhrase-- sqlite3Fts5ParseNodeFree(tls, pPrev) } else { pRet = sqlite3Fts5ParseNode(tls, pParse, FTS5_AND, pLeft, pRight, uintptr(0)) } } return pRet } func sqlite3Fts5ExprInit(tls *libc.TLS, pGlobal uintptr, db uintptr) int32 { var rc int32 = SQLITE_OK _ = pGlobal _ = db _ = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, int32) int32 }{sqlite3Fts5ParserFallback})) return rc } func sqlite3Fts5ExprPhraseCount(tls *libc.TLS, pExpr uintptr) int32 { return func() int32 { if pExpr != 0 { return (*Fts5Expr)(unsafe.Pointer(pExpr)).FnPhrase } return 0 }() } func sqlite3Fts5ExprPhraseSize(tls *libc.TLS, pExpr uintptr, iPhrase int32) int32 { if iPhrase < 0 || iPhrase >= (*Fts5Expr)(unsafe.Pointer(pExpr)).FnPhrase { return 0 } return (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(iPhrase)*8)))).FnTerm } func sqlite3Fts5ExprPoslist(tls *libc.TLS, pExpr uintptr, iPhrase int32, pa uintptr) int32 { var nRet int32 var pPhrase uintptr = *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(iPhrase)*8)) var pNode uintptr = (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FpNode if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof == 0 && (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid == (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FpRoot)).FiRowid { *(*uintptr)(unsafe.Pointer(pa)) = (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fp nRet = (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn } else { *(*uintptr)(unsafe.Pointer(pa)) = uintptr(0) nRet = 0 } return nRet } func sqlite3Fts5ExprClearPoslists(tls *libc.TLS, pExpr uintptr, bLive int32) uintptr { var pRet uintptr pRet = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(Fts5PoslistPopulator{}))*uint64((*Fts5Expr)(unsafe.Pointer(pExpr)).FnPhrase)) if pRet != 0 { var i int32 libc.Xmemset(tls, pRet, 0, uint64(unsafe.Sizeof(Fts5PoslistPopulator{}))*uint64((*Fts5Expr)(unsafe.Pointer(pExpr)).FnPhrase)) for i = 0; i < (*Fts5Expr)(unsafe.Pointer(pExpr)).FnPhrase; i++ { var pBuf uintptr = *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(i)*8)) + 8 var pNode uintptr = (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(i)*8)))).FpNode if bLive != 0 && ((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn == 0 || (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid != (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FpRoot)).FiRowid || (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof != 0) { (*Fts5PoslistPopulator)(unsafe.Pointer(pRet + uintptr(i)*16)).FbMiss = 1 } else { (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn = 0 } } } return pRet } type Fts5ExprCtx1 = struct { FpExpr uintptr FaPopulator uintptr FiOff I64 } type Fts5ExprCtx = Fts5ExprCtx1 func fts5ExprColsetTest(tls *libc.TLS, pColset uintptr, iCol int32) int32 { var i int32 for i = 0; i < (*Fts5Colset)(unsafe.Pointer(pColset)).FnCol; i++ { if *(*int32)(unsafe.Pointer(pColset + 4 + uintptr(i)*4)) == iCol { return 1 } } return 0 } func fts5ExprPopulatePoslistsCb(tls *libc.TLS, pCtx uintptr, tflags int32, pToken uintptr, nToken int32, iUnused1 int32, iUnused2 int32) int32 { var p uintptr = pCtx var pExpr uintptr = (*Fts5ExprCtx)(unsafe.Pointer(p)).FpExpr var i int32 _ = iUnused1 _ = iUnused2 if nToken > FTS5_MAX_TOKEN_SIZE { nToken = FTS5_MAX_TOKEN_SIZE } if tflags&FTS5_TOKEN_COLOCATED == 0 { (*Fts5ExprCtx)(unsafe.Pointer(p)).FiOff++ } for i = 0; i < (*Fts5Expr)(unsafe.Pointer(pExpr)).FnPhrase; i++ { var pTerm uintptr if (*Fts5PoslistPopulator)(unsafe.Pointer((*Fts5ExprCtx)(unsafe.Pointer(p)).FaPopulator+uintptr(i)*16)).FbOk == 0 { continue } for pTerm = *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(i)*8)) + 32; pTerm != 0; pTerm = (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym { var nTerm int32 = int32(libc.Xstrlen(tls, (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FzTerm)) if (nTerm == nToken || nTerm < nToken && (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FbPrefix != 0) && libc.Xmemcmp(tls, (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FzTerm, pToken, uint64(nTerm)) == 0 { var rc int32 = sqlite3Fts5PoslistWriterAppend(tls, *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(i)*8))+8, (*Fts5ExprCtx)(unsafe.Pointer(p)).FaPopulator+uintptr(i)*16, (*Fts5ExprCtx)(unsafe.Pointer(p)).FiOff) if rc != 0 { return rc } break } } } return SQLITE_OK } func sqlite3Fts5ExprPopulatePoslists(tls *libc.TLS, pConfig uintptr, pExpr uintptr, aPopulator uintptr, iCol int32, z uintptr, n int32) int32 { bp := tls.Alloc(24) defer tls.Free(24) var i int32 (*Fts5ExprCtx)(unsafe.Pointer(bp)).FpExpr = pExpr (*Fts5ExprCtx)(unsafe.Pointer(bp)).FaPopulator = aPopulator (*Fts5ExprCtx)(unsafe.Pointer(bp)).FiOff = I64(iCol)<<32 - int64(1) for i = 0; i < (*Fts5Expr)(unsafe.Pointer(pExpr)).FnPhrase; i++ { var pNode uintptr = (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(i)*8)))).FpNode var pColset uintptr = (*Fts5ExprNearset)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear)).FpColset if pColset != 0 && 0 == fts5ExprColsetTest(tls, pColset, iCol) || (*Fts5PoslistPopulator)(unsafe.Pointer(aPopulator+uintptr(i)*16)).FbMiss != 0 { (*Fts5PoslistPopulator)(unsafe.Pointer(aPopulator + uintptr(i)*16)).FbOk = 0 } else { (*Fts5PoslistPopulator)(unsafe.Pointer(aPopulator + uintptr(i)*16)).FbOk = 1 } } return sqlite3Fts5Tokenize(tls, pConfig, FTS5_TOKENIZE_DOCUMENT, z, n, bp, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5ExprPopulatePoslistsCb}))) } func fts5ExprClearPoslists(tls *libc.TLS, pNode uintptr) { if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_TERM || (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType == FTS5_STRING { (*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear + 24)))).Fposlist.Fn = 0 } else { var i int32 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { fts5ExprClearPoslists(tls, *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8))) } } } func fts5ExprCheckPoslists(tls *libc.TLS, pNode uintptr, iRowid I64) int32 { (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid = iRowid (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof = 0 switch (*Fts5ExprNode)(unsafe.Pointer(pNode)).FeType { case FTS5_TERM: fallthrough case FTS5_STRING: return libc.Bool32((*Fts5ExprPhrase)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer((*Fts5ExprNode)(unsafe.Pointer(pNode)).FpNear + 24)))).Fposlist.Fn > 0) case FTS5_AND: { var i int32 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { if fts5ExprCheckPoslists(tls, *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8)), iRowid) == 0 { fts5ExprClearPoslists(tls, pNode) return 0 } } break } case FTS5_OR: { var i int32 var bRet int32 = 0 for i = 0; i < (*Fts5ExprNode)(unsafe.Pointer(pNode)).FnChild; i++ { if fts5ExprCheckPoslists(tls, *(*uintptr)(unsafe.Pointer(pNode + 48 + uintptr(i)*8)), iRowid) != 0 { bRet = 1 } } return bRet } default: { if 0 == fts5ExprCheckPoslists(tls, *(*uintptr)(unsafe.Pointer(pNode + 48)), iRowid) || 0 != fts5ExprCheckPoslists(tls, *(*uintptr)(unsafe.Pointer(pNode + 48 + 1*8)), iRowid) { fts5ExprClearPoslists(tls, pNode) return 0 } break } } return 1 } func sqlite3Fts5ExprCheckPoslists(tls *libc.TLS, pExpr uintptr, iRowid I64) { fts5ExprCheckPoslists(tls, (*Fts5Expr)(unsafe.Pointer(pExpr)).FpRoot, iRowid) } func sqlite3Fts5ExprPhraseCollist(tls *libc.TLS, pExpr uintptr, iPhrase int32, ppCollist uintptr, pnCollist uintptr) int32 { var pPhrase uintptr = *(*uintptr)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FapExprPhrase + uintptr(iPhrase)*8)) var pNode uintptr = (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).FpNode var rc int32 = SQLITE_OK if (*Fts5ExprNode)(unsafe.Pointer(pNode)).FbEof == 0 && (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid == (*Fts5ExprNode)(unsafe.Pointer((*Fts5Expr)(unsafe.Pointer(pExpr)).FpRoot)).FiRowid && (*Fts5ExprPhrase)(unsafe.Pointer(pPhrase)).Fposlist.Fn > 0 { var pTerm uintptr = pPhrase + 32 if (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym != 0 { var pBuf uintptr = (*Fts5ExprTerm)(unsafe.Pointer(pTerm)).FpSynonym + 1*32 rc = fts5ExprSynonymList(tls, pTerm, (*Fts5ExprNode)(unsafe.Pointer(pNode)).FiRowid, pBuf, ppCollist, pnCollist) } else { *(*uintptr)(unsafe.Pointer(ppCollist)) = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32)).FpIter)).FpData *(*int32)(unsafe.Pointer(pnCollist)) = (*Fts5IndexIter)(unsafe.Pointer((*Fts5ExprTerm)(unsafe.Pointer(pPhrase + 32)).FpIter)).FnData } } else { *(*uintptr)(unsafe.Pointer(ppCollist)) = uintptr(0) *(*int32)(unsafe.Pointer(pnCollist)) = 0 } return rc } type Fts5HashEntry1 = struct { FpHashNext uintptr FpScanNext uintptr FnAlloc int32 FiSzPoslist int32 FnData int32 FnKey int32 FbDel U8 FbContent U8 FiCol I16 FiPos int32 FiRowid I64 } type Fts5HashEntry = Fts5HashEntry1 func sqlite3Fts5HashNew(tls *libc.TLS, pConfig uintptr, ppNew uintptr, pnByte uintptr) int32 { var rc int32 = SQLITE_OK var pNew uintptr *(*uintptr)(unsafe.Pointer(ppNew)) = libc.AssignUintptr(&pNew, Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Fts5Hash{})))) if pNew == uintptr(0) { rc = SQLITE_NOMEM } else { var nByte Sqlite3_int64 libc.Xmemset(tls, pNew, 0, uint64(unsafe.Sizeof(Fts5Hash{}))) (*Fts5Hash)(unsafe.Pointer(pNew)).FpnByte = pnByte (*Fts5Hash)(unsafe.Pointer(pNew)).FeDetail = (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail (*Fts5Hash)(unsafe.Pointer(pNew)).FnSlot = 1024 nByte = Sqlite3_int64(uint64(unsafe.Sizeof(uintptr(0))) * uint64((*Fts5Hash)(unsafe.Pointer(pNew)).FnSlot)) (*Fts5Hash)(unsafe.Pointer(pNew)).FaSlot = Xsqlite3_malloc64(tls, uint64(nByte)) if (*Fts5Hash)(unsafe.Pointer(pNew)).FaSlot == uintptr(0) { Xsqlite3_free(tls, pNew) *(*uintptr)(unsafe.Pointer(ppNew)) = uintptr(0) rc = SQLITE_NOMEM } else { libc.Xmemset(tls, (*Fts5Hash)(unsafe.Pointer(pNew)).FaSlot, 0, Size_t(nByte)) } } return rc } func sqlite3Fts5HashFree(tls *libc.TLS, pHash uintptr) { if pHash != 0 { sqlite3Fts5HashClear(tls, pHash) Xsqlite3_free(tls, (*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot) Xsqlite3_free(tls, pHash) } } func sqlite3Fts5HashClear(tls *libc.TLS, pHash uintptr) { var i int32 for i = 0; i < (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot; i++ { var pNext uintptr var pSlot uintptr for pSlot = *(*uintptr)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot + uintptr(i)*8)); pSlot != 0; pSlot = pNext { pNext = (*Fts5HashEntry)(unsafe.Pointer(pSlot)).FpHashNext Xsqlite3_free(tls, pSlot) } } libc.Xmemset(tls, (*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot, 0, uint64((*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot)*uint64(unsafe.Sizeof(uintptr(0)))) (*Fts5Hash)(unsafe.Pointer(pHash)).FnEntry = 0 } func fts5HashKey(tls *libc.TLS, nSlot int32, p uintptr, n int32) uint32 { var i int32 var h uint32 = uint32(13) for i = n - 1; i >= 0; i-- { h = h<<3 ^ h ^ uint32(*(*U8)(unsafe.Pointer(p + uintptr(i)))) } return h % uint32(nSlot) } func fts5HashKey2(tls *libc.TLS, nSlot int32, b U8, p uintptr, n int32) uint32 { var i int32 var h uint32 = uint32(13) for i = n - 1; i >= 0; i-- { h = h<<3 ^ h ^ uint32(*(*U8)(unsafe.Pointer(p + uintptr(i)))) } h = h<<3 ^ h ^ uint32(b) return h % uint32(nSlot) } func fts5HashResize(tls *libc.TLS, pHash uintptr) int32 { var nNew int32 = (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot * 2 var i int32 var apNew uintptr var apOld uintptr = (*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot apNew = Xsqlite3_malloc64(tls, uint64(nNew)*uint64(unsafe.Sizeof(uintptr(0)))) if !(apNew != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, apNew, 0, uint64(nNew)*uint64(unsafe.Sizeof(uintptr(0)))) for i = 0; i < (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot; i++ { for *(*uintptr)(unsafe.Pointer(apOld + uintptr(i)*8)) != 0 { var iHash uint32 var p uintptr = *(*uintptr)(unsafe.Pointer(apOld + uintptr(i)*8)) *(*uintptr)(unsafe.Pointer(apOld + uintptr(i)*8)) = (*Fts5HashEntry)(unsafe.Pointer(p)).FpHashNext iHash = fts5HashKey(tls, nNew, p+1*48, int32(libc.Xstrlen(tls, p+1*48))) (*Fts5HashEntry)(unsafe.Pointer(p)).FpHashNext = *(*uintptr)(unsafe.Pointer(apNew + uintptr(iHash)*8)) *(*uintptr)(unsafe.Pointer(apNew + uintptr(iHash)*8)) = p } } Xsqlite3_free(tls, apOld) (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot = nNew (*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot = apNew return SQLITE_OK } func fts5HashAddPoslistSize(tls *libc.TLS, pHash uintptr, p uintptr, p2 uintptr) int32 { var nRet int32 = 0 if (*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist != 0 { var pPtr uintptr if p2 != 0 { pPtr = p2 } else { pPtr = p } var nData int32 = (*Fts5HashEntry)(unsafe.Pointer(p)).FnData if (*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail == FTS5_DETAIL_NONE { if (*Fts5HashEntry)(unsafe.Pointer(p)).FbDel != 0 { *(*U8)(unsafe.Pointer(pPtr + uintptr(libc.PostIncInt32(&nData, 1)))) = U8(0x00) if (*Fts5HashEntry)(unsafe.Pointer(p)).FbContent != 0 { *(*U8)(unsafe.Pointer(pPtr + uintptr(libc.PostIncInt32(&nData, 1)))) = U8(0x00) } } } else { var nSz int32 = nData - (*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist - 1 var nPos int32 = nSz*2 + int32((*Fts5HashEntry)(unsafe.Pointer(p)).FbDel) if nPos <= 127 { *(*U8)(unsafe.Pointer(pPtr + uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist))) = U8(nPos) } else { var nByte int32 = sqlite3Fts5GetVarintLen(tls, U32(nPos)) libc.Xmemmove(tls, pPtr+uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist+nByte), pPtr+uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist+1), uint64(nSz)) sqlite3Fts5PutVarint(tls, pPtr+uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist), uint64(nPos)) nData = nData + (nByte - 1) } } nRet = nData - (*Fts5HashEntry)(unsafe.Pointer(p)).FnData if p2 == uintptr(0) { (*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist = 0 (*Fts5HashEntry)(unsafe.Pointer(p)).FbDel = U8(0) (*Fts5HashEntry)(unsafe.Pointer(p)).FbContent = U8(0) (*Fts5HashEntry)(unsafe.Pointer(p)).FnData = nData } } return nRet } func sqlite3Fts5HashWrite(tls *libc.TLS, pHash uintptr, iRowid I64, iCol int32, iPos int32, bByte int8, pToken uintptr, nToken int32) int32 { var iHash uint32 var p uintptr var pPtr uintptr var nIncr int32 = 0 var bNew int32 bNew = libc.Bool32((*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail == FTS5_DETAIL_FULL) iHash = fts5HashKey2(tls, (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot, U8(bByte), pToken, nToken) for p = *(*uintptr)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot + uintptr(iHash)*8)); p != 0; p = (*Fts5HashEntry)(unsafe.Pointer(p)).FpHashNext { var zKey uintptr = p + 1*48 if int32(*(*int8)(unsafe.Pointer(zKey))) == int32(bByte) && (*Fts5HashEntry)(unsafe.Pointer(p)).FnKey == nToken && libc.Xmemcmp(tls, zKey+1, pToken, uint64(nToken)) == 0 { break } } if p == uintptr(0) { var zKey uintptr var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5HashEntry{})) + uint64(nToken+1) + uint64(1) + uint64(64)) if nByte < int64(128) { nByte = int64(128) } if (*Fts5Hash)(unsafe.Pointer(pHash)).FnEntry*2 >= (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot { var rc int32 = fts5HashResize(tls, pHash) if rc != SQLITE_OK { return rc } iHash = fts5HashKey2(tls, (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot, U8(bByte), pToken, nToken) } p = Xsqlite3_malloc64(tls, uint64(nByte)) if !(p != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(Fts5HashEntry{}))) (*Fts5HashEntry)(unsafe.Pointer(p)).FnAlloc = int32(nByte) zKey = p + 1*48 *(*int8)(unsafe.Pointer(zKey)) = bByte libc.Xmemcpy(tls, zKey+1, pToken, uint64(nToken)) (*Fts5HashEntry)(unsafe.Pointer(p)).FnKey = nToken *(*int8)(unsafe.Pointer(zKey + uintptr(nToken+1))) = int8(0) (*Fts5HashEntry)(unsafe.Pointer(p)).FnData = int32(uint64(nToken+1+1) + uint64(unsafe.Sizeof(Fts5HashEntry{}))) (*Fts5HashEntry)(unsafe.Pointer(p)).FpHashNext = *(*uintptr)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot + uintptr(iHash)*8)) *(*uintptr)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot + uintptr(iHash)*8)) = p (*Fts5Hash)(unsafe.Pointer(pHash)).FnEntry++ *(*int32)(unsafe.Pointer(p + 24)) += sqlite3Fts5PutVarint(tls, p+uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FnData), uint64(iRowid)) (*Fts5HashEntry)(unsafe.Pointer(p)).FiRowid = iRowid (*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist = (*Fts5HashEntry)(unsafe.Pointer(p)).FnData if (*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail != FTS5_DETAIL_NONE { *(*int32)(unsafe.Pointer(p + 24)) += 1 (*Fts5HashEntry)(unsafe.Pointer(p)).FiCol = func() int16 { if (*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail == FTS5_DETAIL_FULL { return int16(0) } return int16(-1) }() } } else { if (*Fts5HashEntry)(unsafe.Pointer(p)).FnAlloc-(*Fts5HashEntry)(unsafe.Pointer(p)).FnData < 9+4+1+3+5 { var nNew Sqlite3_int64 = Sqlite3_int64((*Fts5HashEntry)(unsafe.Pointer(p)).FnAlloc * 2) var pNew uintptr var pp uintptr pNew = Xsqlite3_realloc64(tls, p, uint64(nNew)) if pNew == uintptr(0) { return SQLITE_NOMEM } (*Fts5HashEntry)(unsafe.Pointer(pNew)).FnAlloc = int32(nNew) for pp = (*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot + uintptr(iHash)*8; *(*uintptr)(unsafe.Pointer(pp)) != p; pp = *(*uintptr)(unsafe.Pointer(pp)) { } *(*uintptr)(unsafe.Pointer(pp)) = pNew p = pNew } nIncr = nIncr - (*Fts5HashEntry)(unsafe.Pointer(p)).FnData } pPtr = p if iRowid != (*Fts5HashEntry)(unsafe.Pointer(p)).FiRowid { var iDiff U64 = U64(iRowid) - U64((*Fts5HashEntry)(unsafe.Pointer(p)).FiRowid) fts5HashAddPoslistSize(tls, pHash, p, uintptr(0)) *(*int32)(unsafe.Pointer(p + 24)) += sqlite3Fts5PutVarint(tls, pPtr+uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FnData), iDiff) (*Fts5HashEntry)(unsafe.Pointer(p)).FiRowid = iRowid bNew = 1 (*Fts5HashEntry)(unsafe.Pointer(p)).FiSzPoslist = (*Fts5HashEntry)(unsafe.Pointer(p)).FnData if (*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail != FTS5_DETAIL_NONE { *(*int32)(unsafe.Pointer(p + 24)) += 1 (*Fts5HashEntry)(unsafe.Pointer(p)).FiCol = func() int16 { if (*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail == FTS5_DETAIL_FULL { return int16(0) } return int16(-1) }() (*Fts5HashEntry)(unsafe.Pointer(p)).FiPos = 0 } } if iCol >= 0 { if (*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail == FTS5_DETAIL_NONE { (*Fts5HashEntry)(unsafe.Pointer(p)).FbContent = U8(1) } else { if iCol != int32((*Fts5HashEntry)(unsafe.Pointer(p)).FiCol) { if (*Fts5Hash)(unsafe.Pointer(pHash)).FeDetail == FTS5_DETAIL_FULL { *(*U8)(unsafe.Pointer(pPtr + uintptr(libc.PostIncInt32(&(*Fts5HashEntry)(unsafe.Pointer(p)).FnData, 1)))) = U8(0x01) *(*int32)(unsafe.Pointer(p + 24)) += sqlite3Fts5PutVarint(tls, pPtr+uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FnData), uint64(iCol)) (*Fts5HashEntry)(unsafe.Pointer(p)).FiCol = I16(iCol) (*Fts5HashEntry)(unsafe.Pointer(p)).FiPos = 0 } else { bNew = 1 (*Fts5HashEntry)(unsafe.Pointer(p)).FiCol = I16(libc.AssignInt32(&iPos, iCol)) } } if bNew != 0 { *(*int32)(unsafe.Pointer(p + 24)) += sqlite3Fts5PutVarint(tls, pPtr+uintptr((*Fts5HashEntry)(unsafe.Pointer(p)).FnData), uint64(iPos-(*Fts5HashEntry)(unsafe.Pointer(p)).FiPos+2)) (*Fts5HashEntry)(unsafe.Pointer(p)).FiPos = iPos } } } else { (*Fts5HashEntry)(unsafe.Pointer(p)).FbDel = U8(1) } nIncr = nIncr + (*Fts5HashEntry)(unsafe.Pointer(p)).FnData *(*int32)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(pHash)).FpnByte)) += nIncr return SQLITE_OK } func fts5HashEntryMerge(tls *libc.TLS, pLeft uintptr, pRight uintptr) uintptr { bp := tls.Alloc(8) defer tls.Free(8) var p1 uintptr = pLeft var p2 uintptr = pRight *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var ppOut uintptr = bp for p1 != 0 || p2 != 0 { if p1 == uintptr(0) { *(*uintptr)(unsafe.Pointer(ppOut)) = p2 p2 = uintptr(0) } else if p2 == uintptr(0) { *(*uintptr)(unsafe.Pointer(ppOut)) = p1 p1 = uintptr(0) } else { var i int32 = 0 var zKey1 uintptr = p1 + 1*48 var zKey2 uintptr = p2 + 1*48 for int32(*(*int8)(unsafe.Pointer(zKey1 + uintptr(i)))) == int32(*(*int8)(unsafe.Pointer(zKey2 + uintptr(i)))) { i++ } if int32(U8(*(*int8)(unsafe.Pointer(zKey1 + uintptr(i))))) > int32(U8(*(*int8)(unsafe.Pointer(zKey2 + uintptr(i))))) { *(*uintptr)(unsafe.Pointer(ppOut)) = p2 ppOut = p2 + 8 p2 = (*Fts5HashEntry)(unsafe.Pointer(p2)).FpScanNext } else { *(*uintptr)(unsafe.Pointer(ppOut)) = p1 ppOut = p1 + 8 p1 = (*Fts5HashEntry)(unsafe.Pointer(p1)).FpScanNext } *(*uintptr)(unsafe.Pointer(ppOut)) = uintptr(0) } } return *(*uintptr)(unsafe.Pointer(bp)) } func fts5HashEntrySort(tls *libc.TLS, pHash uintptr, pTerm uintptr, nTerm int32, ppSorted uintptr) int32 { var nMergeSlot int32 = 32 var ap uintptr var pList uintptr var iSlot int32 var i int32 *(*uintptr)(unsafe.Pointer(ppSorted)) = uintptr(0) ap = Xsqlite3_malloc64(tls, uint64(unsafe.Sizeof(uintptr(0)))*uint64(nMergeSlot)) if !(ap != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, ap, 0, uint64(unsafe.Sizeof(uintptr(0)))*uint64(nMergeSlot)) for iSlot = 0; iSlot < (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot; iSlot++ { var pIter uintptr for pIter = *(*uintptr)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot + uintptr(iSlot)*8)); pIter != 0; pIter = (*Fts5HashEntry)(unsafe.Pointer(pIter)).FpHashNext { if pTerm == uintptr(0) || (*Fts5HashEntry)(unsafe.Pointer(pIter)).FnKey+1 >= nTerm && 0 == libc.Xmemcmp(tls, pIter+1*48, pTerm, uint64(nTerm)) { var pEntry uintptr = pIter (*Fts5HashEntry)(unsafe.Pointer(pEntry)).FpScanNext = uintptr(0) for i = 0; *(*uintptr)(unsafe.Pointer(ap + uintptr(i)*8)) != 0; i++ { pEntry = fts5HashEntryMerge(tls, pEntry, *(*uintptr)(unsafe.Pointer(ap + uintptr(i)*8))) *(*uintptr)(unsafe.Pointer(ap + uintptr(i)*8)) = uintptr(0) } *(*uintptr)(unsafe.Pointer(ap + uintptr(i)*8)) = pEntry } } } pList = uintptr(0) for i = 0; i < nMergeSlot; i++ { pList = fts5HashEntryMerge(tls, pList, *(*uintptr)(unsafe.Pointer(ap + uintptr(i)*8))) } (*Fts5Hash)(unsafe.Pointer(pHash)).FnEntry = 0 Xsqlite3_free(tls, ap) *(*uintptr)(unsafe.Pointer(ppSorted)) = pList return SQLITE_OK } func sqlite3Fts5HashQuery(tls *libc.TLS, pHash uintptr, nPre int32, pTerm uintptr, nTerm int32, ppOut uintptr, pnDoclist uintptr) int32 { var iHash uint32 = fts5HashKey(tls, (*Fts5Hash)(unsafe.Pointer(pHash)).FnSlot, pTerm, nTerm) var zKey uintptr = uintptr(0) var p uintptr for p = *(*uintptr)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(pHash)).FaSlot + uintptr(iHash)*8)); p != 0; p = (*Fts5HashEntry)(unsafe.Pointer(p)).FpHashNext { zKey = p + 1*48 if nTerm == (*Fts5HashEntry)(unsafe.Pointer(p)).FnKey+1 && libc.Xmemcmp(tls, zKey, pTerm, uint64(nTerm)) == 0 { break } } if p != 0 { var nHashPre int32 = int32(uint64(unsafe.Sizeof(Fts5HashEntry{})) + uint64(nTerm) + uint64(1)) var nList int32 = (*Fts5HashEntry)(unsafe.Pointer(p)).FnData - nHashPre var pRet uintptr = libc.AssignPtrUintptr(ppOut, Xsqlite3_malloc64(tls, uint64(nPre+nList+10))) if pRet != 0 { var pFaux uintptr = pRet + uintptr(nPre-nHashPre) libc.Xmemcpy(tls, pRet+uintptr(nPre), p+uintptr(nHashPre), uint64(nList)) nList = nList + fts5HashAddPoslistSize(tls, pHash, p, pFaux) *(*int32)(unsafe.Pointer(pnDoclist)) = nList } else { *(*int32)(unsafe.Pointer(pnDoclist)) = 0 return SQLITE_NOMEM } } else { *(*uintptr)(unsafe.Pointer(ppOut)) = uintptr(0) *(*int32)(unsafe.Pointer(pnDoclist)) = 0 } return SQLITE_OK } func sqlite3Fts5HashScanInit(tls *libc.TLS, p uintptr, pTerm uintptr, nTerm int32) int32 { return fts5HashEntrySort(tls, p, pTerm, nTerm, p+24) } func sqlite3Fts5HashScanNext(tls *libc.TLS, p uintptr) { (*Fts5Hash)(unsafe.Pointer(p)).FpScan = (*Fts5HashEntry)(unsafe.Pointer((*Fts5Hash)(unsafe.Pointer(p)).FpScan)).FpScanNext } func sqlite3Fts5HashScanEof(tls *libc.TLS, p uintptr) int32 { return libc.Bool32((*Fts5Hash)(unsafe.Pointer(p)).FpScan == uintptr(0)) } func sqlite3Fts5HashScanEntry(tls *libc.TLS, pHash uintptr, pzTerm uintptr, ppDoclist uintptr, pnDoclist uintptr) { var p uintptr if libc.AssignUintptr(&p, (*Fts5Hash)(unsafe.Pointer(pHash)).FpScan) != 0 { var zKey uintptr = p + 1*48 var nTerm int32 = int32(libc.Xstrlen(tls, zKey)) fts5HashAddPoslistSize(tls, pHash, p, uintptr(0)) *(*uintptr)(unsafe.Pointer(pzTerm)) = zKey *(*uintptr)(unsafe.Pointer(ppDoclist)) = zKey + uintptr(nTerm+1) *(*int32)(unsafe.Pointer(pnDoclist)) = int32(uint64((*Fts5HashEntry)(unsafe.Pointer(p)).FnData) - (uint64(unsafe.Sizeof(Fts5HashEntry{})) + uint64(nTerm) + uint64(1))) } else { *(*uintptr)(unsafe.Pointer(pzTerm)) = uintptr(0) *(*uintptr)(unsafe.Pointer(ppDoclist)) = uintptr(0) *(*int32)(unsafe.Pointer(pnDoclist)) = 0 } } type Fts5Data1 = struct { Fp uintptr Fnn int32 FszLeaf int32 } type Fts5Data = Fts5Data1 type Fts5DlidxIter1 = struct { FnLvl int32 FiSegid int32 FaLvl [1]Fts5DlidxLvl } type Fts5DlidxIter = Fts5DlidxIter1 type Fts5DlidxLvl1 = struct { FpData uintptr FiOff int32 FbEof int32 FiFirstOff int32 FiLeafPgno int32 FiRowid I64 } type Fts5DlidxLvl = Fts5DlidxLvl1 type Fts5DlidxWriter1 = struct { Fpgno int32 FbPrevValid int32 FiPrev I64 Fbuf Fts5Buffer } type Fts5DlidxWriter = Fts5DlidxWriter1 type Fts5Iter1 = struct { Fbase Fts5IndexIter FpIndex uintptr Fposlist Fts5Buffer FpColset uintptr FxSetOutputs uintptr FnSeg int32 FbRev int32 FbSkipEmpty U8 F__ccgo_pad1 [7]byte FiSwitchRowid I64 FaFirst uintptr FaSeg [1]Fts5SegIter } type Fts5Iter = Fts5Iter1 type Fts5PageWriter1 = struct { Fpgno int32 FiPrevPgidx int32 Fbuf Fts5Buffer Fpgidx Fts5Buffer Fterm Fts5Buffer } type Fts5PageWriter = Fts5PageWriter1 type Fts5SegIter1 = struct { FpSeg uintptr Fflags int32 FiLeafPgno int32 FpLeaf uintptr FpNextLeaf uintptr FiLeafOffset I64 FxNext uintptr FiTermLeafPgno int32 FiTermLeafOffset int32 FiPgidxOff int32 FiEndofDoclist int32 FiRowidOffset int32 FnRowidOffset int32 FaRowidOffset uintptr FpDlidx uintptr Fterm Fts5Buffer FiRowid I64 FnPos int32 FbDel U8 F__ccgo_pad1 [3]byte } type Fts5SegIter = Fts5SegIter1 type Fts5DoclistIter1 = struct { FaEof uintptr FiRowid I64 FaPoslist uintptr FnPoslist int32 FnSize int32 } type Fts5DoclistIter = Fts5DoclistIter1 type Fts5SegWriter1 = struct { FiSegid int32 F__ccgo_pad1 [4]byte Fwriter Fts5PageWriter FiPrevRowid I64 FbFirstRowidInDoclist U8 FbFirstRowidInPage U8 FbFirstTermInPage U8 F__ccgo_pad2 [1]byte FnLeafWritten int32 FnEmpty int32 FnDlidx int32 FaDlidx uintptr Fbtterm Fts5Buffer FiBtPage int32 F__ccgo_pad3 [4]byte } type Fts5SegWriter = Fts5SegWriter1 type Fts5Structure1 = struct { FnRef int32 F__ccgo_pad1 [4]byte FnWriteCounter U64 FnSegment int32 FnLevel int32 FaLevel [1]Fts5StructureLevel } type Fts5Structure = Fts5Structure1 type Fts5StructureLevel1 = struct { FnMerge int32 FnSeg int32 FaSeg uintptr } type Fts5StructureLevel = Fts5StructureLevel1 type Fts5StructureSegment1 = struct { FiSegid int32 FpgnoFirst int32 FpgnoLast int32 } type Fts5StructureSegment = Fts5StructureSegment1 type Fts5CResult1 = struct { FiFirst U16 FbTermEq U8 F__ccgo_pad1 [1]byte } type Fts5CResult = Fts5CResult1 func fts5PutU16(tls *libc.TLS, aOut uintptr, iVal U16) { *(*U8)(unsafe.Pointer(aOut)) = U8(int32(iVal) >> 8) *(*U8)(unsafe.Pointer(aOut + 1)) = U8(int32(iVal) & 0xFF) } func fts5GetU16(tls *libc.TLS, aIn uintptr) U16 { return U16(int32(U16(*(*U8)(unsafe.Pointer(aIn))))<<8 + int32(*(*U8)(unsafe.Pointer(aIn + 1)))) } func fts5IdxMalloc(tls *libc.TLS, p uintptr, nByte Sqlite3_int64) uintptr { return sqlite3Fts5MallocZero(tls, p+52, nByte) } func fts5BufferCompare(tls *libc.TLS, pLeft uintptr, pRight uintptr) int32 { var nCmp int32 var res int32 nCmp = func() int32 { if (*Fts5Buffer)(unsafe.Pointer(pLeft)).Fn < (*Fts5Buffer)(unsafe.Pointer(pRight)).Fn { return (*Fts5Buffer)(unsafe.Pointer(pLeft)).Fn } return (*Fts5Buffer)(unsafe.Pointer(pRight)).Fn }() res = func() int32 { if nCmp <= 0 { return 0 } return libc.Xmemcmp(tls, (*Fts5Buffer)(unsafe.Pointer(pLeft)).Fp, (*Fts5Buffer)(unsafe.Pointer(pRight)).Fp, uint64(nCmp)) }() return func() int32 { if res == 0 { return (*Fts5Buffer)(unsafe.Pointer(pLeft)).Fn - (*Fts5Buffer)(unsafe.Pointer(pRight)).Fn } return res }() } func fts5LeafFirstTermOff(tls *libc.TLS, pLeaf uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr((*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf), bp) return *(*int32)(unsafe.Pointer(bp)) } func sqlite3Fts5IndexCloseReader(tls *libc.TLS, p uintptr) { if (*Fts5Index)(unsafe.Pointer(p)).FpReader != 0 { var pReader uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpReader (*Fts5Index)(unsafe.Pointer(p)).FpReader = uintptr(0) Xsqlite3_blob_close(tls, pReader) } } func fts5DataRead(tls *libc.TLS, p uintptr, iRowid I64) uintptr { var pRet uintptr = uintptr(0) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var rc int32 = SQLITE_OK if (*Fts5Index)(unsafe.Pointer(p)).FpReader != 0 { var pBlob uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpReader (*Fts5Index)(unsafe.Pointer(p)).FpReader = uintptr(0) rc = Xsqlite3_blob_reopen(tls, pBlob, iRowid) (*Fts5Index)(unsafe.Pointer(p)).FpReader = pBlob if rc != SQLITE_OK { sqlite3Fts5IndexCloseReader(tls, p) } if rc == SQLITE_ABORT { rc = SQLITE_OK } } if (*Fts5Index)(unsafe.Pointer(p)).FpReader == uintptr(0) && rc == SQLITE_OK { var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig rc = Xsqlite3_blob_open(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Index)(unsafe.Pointer(p)).FzDataTbl, ts+36252, iRowid, 0, p+56) } if rc == SQLITE_ERROR { rc = SQLITE_CORRUPT | int32(1)<<8 } if rc == SQLITE_OK { var aOut uintptr = uintptr(0) var nByte int32 = Xsqlite3_blob_bytes(tls, (*Fts5Index)(unsafe.Pointer(p)).FpReader) var nAlloc Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Data{})) + uint64(nByte) + uint64(FTS5_DATA_PADDING)) pRet = Xsqlite3_malloc64(tls, uint64(nAlloc)) if pRet != 0 { (*Fts5Data)(unsafe.Pointer(pRet)).Fnn = nByte aOut = libc.AssignPtrUintptr(pRet, pRet+1*16) } else { rc = SQLITE_NOMEM } if rc == SQLITE_OK { rc = Xsqlite3_blob_read(tls, (*Fts5Index)(unsafe.Pointer(p)).FpReader, aOut, nByte, 0) } if rc != SQLITE_OK { Xsqlite3_free(tls, pRet) pRet = uintptr(0) } else { *(*U8)(unsafe.Pointer((*Fts5Data)(unsafe.Pointer(pRet)).Fp + uintptr(nByte))) = U8(0x00) *(*U8)(unsafe.Pointer((*Fts5Data)(unsafe.Pointer(pRet)).Fp + uintptr(nByte+1))) = U8(0x00) (*Fts5Data)(unsafe.Pointer(pRet)).FszLeaf = int32(fts5GetU16(tls, (*Fts5Data)(unsafe.Pointer(pRet)).Fp+2)) } } (*Fts5Index)(unsafe.Pointer(p)).Frc = rc (*Fts5Index)(unsafe.Pointer(p)).FnRead++ } return pRet } func fts5DataRelease(tls *libc.TLS, pData uintptr) { Xsqlite3_free(tls, pData) } func fts5LeafRead(tls *libc.TLS, p uintptr, iRowid I64) uintptr { var pRet uintptr = fts5DataRead(tls, p, iRowid) if pRet != 0 { if (*Fts5Data)(unsafe.Pointer(pRet)).Fnn < 4 || (*Fts5Data)(unsafe.Pointer(pRet)).FszLeaf > (*Fts5Data)(unsafe.Pointer(pRet)).Fnn { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 fts5DataRelease(tls, pRet) pRet = uintptr(0) } } return pRet } func fts5IndexPrepareStmt(tls *libc.TLS, p uintptr, ppStmt uintptr, zSql uintptr) int32 { if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { if zSql != 0 { (*Fts5Index)(unsafe.Pointer(p)).Frc = Xsqlite3_prepare_v3(tls, (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fdb, zSql, -1, uint32(SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB), ppStmt, uintptr(0)) } else { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } } Xsqlite3_free(tls, zSql) return (*Fts5Index)(unsafe.Pointer(p)).Frc } func fts5DataWrite(tls *libc.TLS, p uintptr, iRowid I64, pData uintptr, nData int32) { bp := tls.Alloc(16) defer tls.Free(16) if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { return } if (*Fts5Index)(unsafe.Pointer(p)).FpWriter == uintptr(0) { var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig fts5IndexPrepareStmt(tls, p, p+64, Xsqlite3_mprintf(tls, ts+36258, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName))) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { return } } Xsqlite3_bind_int64(tls, (*Fts5Index)(unsafe.Pointer(p)).FpWriter, 1, iRowid) Xsqlite3_bind_blob(tls, (*Fts5Index)(unsafe.Pointer(p)).FpWriter, 2, pData, nData, uintptr(0)) Xsqlite3_step(tls, (*Fts5Index)(unsafe.Pointer(p)).FpWriter) (*Fts5Index)(unsafe.Pointer(p)).Frc = Xsqlite3_reset(tls, (*Fts5Index)(unsafe.Pointer(p)).FpWriter) Xsqlite3_bind_null(tls, (*Fts5Index)(unsafe.Pointer(p)).FpWriter, 2) } func fts5DataDelete(tls *libc.TLS, p uintptr, iFirst I64, iLast I64) { bp := tls.Alloc(16) defer tls.Free(16) if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { return } if (*Fts5Index)(unsafe.Pointer(p)).FpDeleter == uintptr(0) { var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig var zSql uintptr = Xsqlite3_mprintf(tls, ts+36309, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) if fts5IndexPrepareStmt(tls, p, p+72, zSql) != 0 { return } } Xsqlite3_bind_int64(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDeleter, 1, iFirst) Xsqlite3_bind_int64(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDeleter, 2, iLast) Xsqlite3_step(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDeleter) (*Fts5Index)(unsafe.Pointer(p)).Frc = Xsqlite3_reset(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDeleter) } func fts5DataRemoveSegment(tls *libc.TLS, p uintptr, iSegid int32) { bp := tls.Alloc(16) defer tls.Free(16) var iFirst I64 = I64(iSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B) + int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B) + int64(0)<= libc.PreDecInt32(&(*Fts5Structure)(unsafe.Pointer(pStruct)).FnRef, 1) { var i int32 for i = 0; i < (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel; i++ { Xsqlite3_free(tls, (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(i)*16)).FaSeg) } Xsqlite3_free(tls, pStruct) } } func fts5StructureRef(tls *libc.TLS, pStruct uintptr) { (*Fts5Structure)(unsafe.Pointer(pStruct)).FnRef++ } func sqlite3Fts5StructureRef(tls *libc.TLS, p uintptr) uintptr { fts5StructureRef(tls, (*Fts5Index)(unsafe.Pointer(p)).FpStruct) return (*Fts5Index)(unsafe.Pointer(p)).FpStruct } func sqlite3Fts5StructureRelease(tls *libc.TLS, p uintptr) { if p != 0 { fts5StructureRelease(tls, p) } } func sqlite3Fts5StructureTest(tls *libc.TLS, p uintptr, pStruct uintptr) int32 { if (*Fts5Index)(unsafe.Pointer(p)).FpStruct != pStruct { return SQLITE_ABORT } return SQLITE_OK } func fts5StructureMakeWritable(tls *libc.TLS, pRc uintptr, pp uintptr) { var p uintptr = *(*uintptr)(unsafe.Pointer(pp)) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK && (*Fts5Structure)(unsafe.Pointer(p)).FnRef > 1 { var nByte I64 = I64(uint64(unsafe.Sizeof(Fts5Structure{})) + uint64((*Fts5Structure)(unsafe.Pointer(p)).FnLevel-1)*uint64(unsafe.Sizeof(Fts5StructureLevel{}))) var pNew uintptr pNew = sqlite3Fts5MallocZero(tls, pRc, nByte) if pNew != 0 { var i int32 libc.Xmemcpy(tls, pNew, p, uint64(nByte)) for i = 0; i < (*Fts5Structure)(unsafe.Pointer(p)).FnLevel; i++ { (*Fts5StructureLevel)(unsafe.Pointer(pNew + 24 + uintptr(i)*16)).FaSeg = uintptr(0) } for i = 0; i < (*Fts5Structure)(unsafe.Pointer(p)).FnLevel; i++ { var pLvl uintptr = pNew + 24 + uintptr(i)*16 nByte = I64(uint64(unsafe.Sizeof(Fts5StructureSegment{})) * uint64((*Fts5StructureLevel)(unsafe.Pointer(pNew+24+uintptr(i)*16)).FnSeg)) (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg = sqlite3Fts5MallocZero(tls, pRc, nByte) if (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg == uintptr(0) { for i = 0; i < (*Fts5Structure)(unsafe.Pointer(p)).FnLevel; i++ { Xsqlite3_free(tls, (*Fts5StructureLevel)(unsafe.Pointer(pNew+24+uintptr(i)*16)).FaSeg) } Xsqlite3_free(tls, pNew) return } libc.Xmemcpy(tls, (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg, (*Fts5StructureLevel)(unsafe.Pointer(p+24+uintptr(i)*16)).FaSeg, uint64(nByte)) } (*Fts5Structure)(unsafe.Pointer(p)).FnRef-- (*Fts5Structure)(unsafe.Pointer(pNew)).FnRef = 1 } *(*uintptr)(unsafe.Pointer(pp)) = pNew } } func fts5StructureDecode(tls *libc.TLS, pData uintptr, nData int32, piCookie uintptr, ppOut uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_OK var i int32 = 0 var iLvl int32 *(*int32)(unsafe.Pointer(bp)) = 0 *(*int32)(unsafe.Pointer(bp + 4)) = 0 var nByte Sqlite3_int64 var pRet uintptr = uintptr(0) if piCookie != 0 { *(*int32)(unsafe.Pointer(piCookie)) = sqlite3Fts5Get32(tls, pData) } i = 4 i = i + sqlite3Fts5GetVarint32(tls, pData+uintptr(i), bp) i = i + sqlite3Fts5GetVarint32(tls, pData+uintptr(i), bp+4) if *(*int32)(unsafe.Pointer(bp)) > FTS5_MAX_SEGMENT || *(*int32)(unsafe.Pointer(bp)) < 0 || *(*int32)(unsafe.Pointer(bp + 4)) > FTS5_MAX_SEGMENT || *(*int32)(unsafe.Pointer(bp + 4)) < 0 { return SQLITE_CORRUPT | int32(1)<<8 } nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Structure{})) + uint64(unsafe.Sizeof(Fts5StructureLevel{}))*uint64(*(*int32)(unsafe.Pointer(bp))-1)) pRet = sqlite3Fts5MallocZero(tls, bp+8, nByte) if pRet != 0 { (*Fts5Structure)(unsafe.Pointer(pRet)).FnRef = 1 (*Fts5Structure)(unsafe.Pointer(pRet)).FnLevel = *(*int32)(unsafe.Pointer(bp)) (*Fts5Structure)(unsafe.Pointer(pRet)).FnSegment = *(*int32)(unsafe.Pointer(bp + 4)) i = i + int32(sqlite3Fts5GetVarint(tls, pData+uintptr(i), pRet+8)) for iLvl = 0; *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK && iLvl < *(*int32)(unsafe.Pointer(bp)); iLvl++ { var pLvl uintptr = pRet + 24 + uintptr(iLvl)*16 *(*int32)(unsafe.Pointer(bp + 12)) = 0 var iSeg int32 if i >= nData { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_CORRUPT | int32(1)<<8 } else { i = i + sqlite3Fts5GetVarint32(tls, pData+uintptr(i), pLvl) i = i + sqlite3Fts5GetVarint32(tls, pData+uintptr(i), bp+12) if *(*int32)(unsafe.Pointer(bp + 12)) < (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_CORRUPT | int32(1)<<8 } (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg = sqlite3Fts5MallocZero(tls, bp+8, int64(uint64(*(*int32)(unsafe.Pointer(bp + 12)))*uint64(unsafe.Sizeof(Fts5StructureSegment{})))) *(*int32)(unsafe.Pointer(bp + 4)) -= *(*int32)(unsafe.Pointer(bp + 12)) } if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg = *(*int32)(unsafe.Pointer(bp + 12)) for iSeg = 0; iSeg < *(*int32)(unsafe.Pointer(bp + 12)); iSeg++ { var pSeg uintptr = (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg + uintptr(iSeg)*12 if i >= nData { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_CORRUPT | int32(1)<<8 break } i = i + sqlite3Fts5GetVarint32(tls, pData+uintptr(i), pSeg) i = i + sqlite3Fts5GetVarint32(tls, pData+uintptr(i), pSeg+4) i = i + sqlite3Fts5GetVarint32(tls, pData+uintptr(i), pSeg+8) if (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast < (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_CORRUPT | int32(1)<<8 break } } if iLvl > 0 && (*Fts5StructureLevel)(unsafe.Pointer(pLvl+libc.UintptrFromInt32(-1)*16)).FnMerge != 0 && *(*int32)(unsafe.Pointer(bp + 12)) == 0 { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_CORRUPT | int32(1)<<8 } if iLvl == *(*int32)(unsafe.Pointer(bp))-1 && (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge != 0 { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_CORRUPT | int32(1)<<8 } } } if *(*int32)(unsafe.Pointer(bp + 4)) != 0 && *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_CORRUPT | int32(1)<<8 } if *(*int32)(unsafe.Pointer(bp + 8)) != SQLITE_OK { fts5StructureRelease(tls, pRet) pRet = uintptr(0) } } *(*uintptr)(unsafe.Pointer(ppOut)) = pRet return *(*int32)(unsafe.Pointer(bp + 8)) } func fts5StructureAddLevel(tls *libc.TLS, pRc uintptr, ppStruct uintptr) { fts5StructureMakeWritable(tls, pRc, ppStruct) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var pStruct uintptr = *(*uintptr)(unsafe.Pointer(ppStruct)) var nLevel int32 = (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Structure{})) + uint64(unsafe.Sizeof(Fts5StructureLevel{}))*uint64(nLevel+1)) pStruct = Xsqlite3_realloc64(tls, pStruct, uint64(nByte)) if pStruct != 0 { libc.Xmemset(tls, pStruct+24+uintptr(nLevel)*16, 0, uint64(unsafe.Sizeof(Fts5StructureLevel{}))) (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel++ *(*uintptr)(unsafe.Pointer(ppStruct)) = pStruct } else { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } } func fts5StructureExtendLevel(tls *libc.TLS, pRc uintptr, pStruct uintptr, iLvl int32, nExtra int32, bInsert int32) { if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var pLvl uintptr = pStruct + 24 + uintptr(iLvl)*16 var aNew uintptr var nByte Sqlite3_int64 nByte = Sqlite3_int64(uint64((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg+nExtra) * uint64(unsafe.Sizeof(Fts5StructureSegment{}))) aNew = Xsqlite3_realloc64(tls, (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg, uint64(nByte)) if aNew != 0 { if bInsert == 0 { libc.Xmemset(tls, aNew+uintptr((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg)*12, 0, uint64(unsafe.Sizeof(Fts5StructureSegment{}))*uint64(nExtra)) } else { var nMove int32 = int32(uint64((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg) * uint64(unsafe.Sizeof(Fts5StructureSegment{}))) libc.Xmemmove(tls, aNew+uintptr(nExtra)*12, aNew, uint64(nMove)) libc.Xmemset(tls, aNew, 0, uint64(unsafe.Sizeof(Fts5StructureSegment{}))*uint64(nExtra)) } (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg = aNew } else { *(*int32)(unsafe.Pointer(pRc)) = SQLITE_NOMEM } } } func fts5StructureReadUncached(tls *libc.TLS, p uintptr) uintptr { bp := tls.Alloc(16) defer tls.Free(16) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig var pData uintptr pData = fts5DataRead(tls, p, int64(FTS5_STRUCTURE_ROWID)) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { libc.Xmemset(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp+uintptr((*Fts5Data)(unsafe.Pointer(pData)).Fnn), 0, uint64(FTS5_DATA_PADDING)) (*Fts5Index)(unsafe.Pointer(p)).Frc = fts5StructureDecode(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp, (*Fts5Data)(unsafe.Pointer(pData)).Fnn, bp, bp+8) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && ((*Fts5Config)(unsafe.Pointer(pConfig)).Fpgsz == 0 || (*Fts5Config)(unsafe.Pointer(pConfig)).FiCookie != *(*int32)(unsafe.Pointer(bp))) { (*Fts5Index)(unsafe.Pointer(p)).Frc = sqlite3Fts5ConfigLoad(tls, pConfig, *(*int32)(unsafe.Pointer(bp))) } fts5DataRelease(tls, pData) if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { fts5StructureRelease(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) } } return *(*uintptr)(unsafe.Pointer(bp + 8)) } func fts5IndexDataVersion(tls *libc.TLS, p uintptr) I64 { bp := tls.Alloc(8) defer tls.Free(8) var iVersion I64 = int64(0) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { if (*Fts5Index)(unsafe.Pointer(p)).FpDataVersion == uintptr(0) { (*Fts5Index)(unsafe.Pointer(p)).Frc = fts5IndexPrepareStmt(tls, p, p+112, Xsqlite3_mprintf(tls, ts+36398, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FzDb))) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { return int64(0) } } if SQLITE_ROW == Xsqlite3_step(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDataVersion) { iVersion = Xsqlite3_column_int64(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDataVersion, 0) } (*Fts5Index)(unsafe.Pointer(p)).Frc = Xsqlite3_reset(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDataVersion) } return iVersion } func fts5StructureRead(tls *libc.TLS, p uintptr) uintptr { if (*Fts5Index)(unsafe.Pointer(p)).FpStruct == uintptr(0) { (*Fts5Index)(unsafe.Pointer(p)).FiStructVersion = fts5IndexDataVersion(tls, p) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Fts5Index)(unsafe.Pointer(p)).FpStruct = fts5StructureReadUncached(tls, p) } } if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { return uintptr(0) } fts5StructureRef(tls, (*Fts5Index)(unsafe.Pointer(p)).FpStruct) return (*Fts5Index)(unsafe.Pointer(p)).FpStruct } func fts5StructureInvalidate(tls *libc.TLS, p uintptr) { if (*Fts5Index)(unsafe.Pointer(p)).FpStruct != 0 { fts5StructureRelease(tls, (*Fts5Index)(unsafe.Pointer(p)).FpStruct) (*Fts5Index)(unsafe.Pointer(p)).FpStruct = uintptr(0) } } func fts5StructureWrite(tls *libc.TLS, p uintptr, pStruct uintptr) { bp := tls.Alloc(16) defer tls.Free(16) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var iLvl int32 var iCookie int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) iCookie = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FiCookie if iCookie < 0 { iCookie = 0 } if 0 == sqlite3Fts5BufferSize(tls, p+52, bp, uint32(4+9+9+9)) { sqlite3Fts5Put32(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp, iCookie) (*Fts5Buffer)(unsafe.Pointer(bp)).Fn = 4 { *(*int32)(unsafe.Pointer(bp + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp)).Fn), uint64((*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel)) } { *(*int32)(unsafe.Pointer(bp + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp)).Fn), uint64((*Fts5Structure)(unsafe.Pointer(pStruct)).FnSegment)) } { *(*int32)(unsafe.Pointer(bp + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp)).Fn), uint64(I64((*Fts5Structure)(unsafe.Pointer(pStruct)).FnWriteCounter))) } } for iLvl = 0; iLvl < (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel; iLvl++ { var iSeg int32 var pLvl uintptr = pStruct + 24 + uintptr(iLvl)*16 sqlite3Fts5BufferAppendVarint(tls, p+52, bp, I64((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge)) sqlite3Fts5BufferAppendVarint(tls, p+52, bp, I64((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg)) for iSeg = 0; iSeg < (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg; iSeg++ { sqlite3Fts5BufferAppendVarint(tls, p+52, bp, I64((*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(iSeg)*12)).FiSegid)) sqlite3Fts5BufferAppendVarint(tls, p+52, bp, I64((*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(iSeg)*12)).FpgnoFirst)) sqlite3Fts5BufferAppendVarint(tls, p+52, bp, I64((*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(iSeg)*12)).FpgnoLast)) } } fts5DataWrite(tls, p, int64(FTS5_STRUCTURE_ROWID), (*Fts5Buffer)(unsafe.Pointer(bp)).Fp, (*Fts5Buffer)(unsafe.Pointer(bp)).Fn) sqlite3Fts5BufferFree(tls, bp) } } func fts5SegmentSize(tls *libc.TLS, pSeg uintptr) int32 { return 1 + (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast - (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst } func fts5StructurePromoteTo(tls *libc.TLS, p uintptr, iPromote int32, szPromote int32, pStruct uintptr) { var il int32 var is int32 var pOut uintptr = pStruct + 24 + uintptr(iPromote)*16 if (*Fts5StructureLevel)(unsafe.Pointer(pOut)).FnMerge == 0 { for il = iPromote + 1; il < (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel; il++ { var pLvl uintptr = pStruct + 24 + uintptr(il)*16 if (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge != 0 { return } for is = (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg - 1; is >= 0; is-- { var sz int32 = fts5SegmentSize(tls, (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(is)*12) if sz > szPromote { return } fts5StructureExtendLevel(tls, p+52, pStruct, iPromote, 1, 1) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { return } libc.Xmemcpy(tls, (*Fts5StructureLevel)(unsafe.Pointer(pOut)).FaSeg, (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(is)*12, uint64(unsafe.Sizeof(Fts5StructureSegment{}))) (*Fts5StructureLevel)(unsafe.Pointer(pOut)).FnSeg++ (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg-- } } } } func fts5StructurePromote(tls *libc.TLS, p uintptr, iLvl int32, pStruct uintptr) { if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var iTst int32 var iPromote int32 = -1 var szPromote int32 = 0 var pSeg uintptr var szSeg int32 var nSeg int32 = (*Fts5StructureLevel)(unsafe.Pointer(pStruct + 24 + uintptr(iLvl)*16)).FnSeg if nSeg == 0 { return } pSeg = (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FaSeg + uintptr((*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FnSeg-1)*12 szSeg = 1 + (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast - (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst for iTst = iLvl - 1; iTst >= 0 && (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iTst)*16)).FnSeg == 0; iTst-- { } if iTst >= 0 { var i int32 var szMax int32 = 0 var pTst uintptr = pStruct + 24 + uintptr(iTst)*16 for i = 0; i < (*Fts5StructureLevel)(unsafe.Pointer(pTst)).FnSeg; i++ { var sz int32 = (*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pTst)).FaSeg+uintptr(i)*12)).FpgnoLast - (*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pTst)).FaSeg+uintptr(i)*12)).FpgnoFirst + 1 if sz > szMax { szMax = sz } } if szMax >= szSeg { iPromote = iTst szPromote = szMax } } if iPromote < 0 { iPromote = iLvl szPromote = szSeg } fts5StructurePromoteTo(tls, p, iPromote, szPromote, pStruct) } } func fts5DlidxLvlNext(tls *libc.TLS, pLvl uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pData uintptr = (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FpData if (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff == 0 { (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff = 1 *(*int32)(unsafe.Pointer(pLvl + 8)) += sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp+1, pLvl+20) *(*int32)(unsafe.Pointer(pLvl + 8)) += int32(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp+uintptr((*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff), pLvl+24)) (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiFirstOff = (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff } else { var iOff int32 for iOff = (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff; iOff < (*Fts5Data)(unsafe.Pointer(pData)).Fnn; iOff++ { if *(*U8)(unsafe.Pointer((*Fts5Data)(unsafe.Pointer(pData)).Fp + uintptr(iOff))) != 0 { break } } if iOff < (*Fts5Data)(unsafe.Pointer(pData)).Fnn { *(*int32)(unsafe.Pointer(pLvl + 20)) += iOff - (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff + 1 iOff = iOff + int32(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp+uintptr(iOff), bp)) *(*I64)(unsafe.Pointer(pLvl + 24)) += *(*I64)(unsafe.Pointer(bp)) (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff = iOff } else { (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FbEof = 1 } } return (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FbEof } func fts5DlidxIterNextR(tls *libc.TLS, p uintptr, pIter uintptr, iLvl int32) int32 { var pLvl uintptr = pIter + 8 + uintptr(iLvl)*32 if fts5DlidxLvlNext(tls, pLvl) != 0 { if iLvl+1 < (*Fts5DlidxIter)(unsafe.Pointer(pIter)).FnLvl { fts5DlidxIterNextR(tls, p, pIter, iLvl+1) if (*Fts5DlidxLvl)(unsafe.Pointer(pLvl+1*32)).FbEof == 0 { fts5DataRelease(tls, (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FpData) libc.Xmemset(tls, pLvl, 0, uint64(unsafe.Sizeof(Fts5DlidxLvl{}))) (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FpData = fts5DataRead(tls, p, I64((*Fts5DlidxIter)(unsafe.Pointer(pIter)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(1)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+I64(iLvl)<= 0; i-- { var pLvl uintptr = pIter + 8 + uintptr(i)*32 for fts5DlidxLvlNext(tls, pLvl) == 0 { } (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FbEof = 0 if i > 0 { var pChild uintptr = pLvl + libc.UintptrFromInt32(-1)*32 fts5DataRelease(tls, (*Fts5DlidxLvl)(unsafe.Pointer(pChild)).FpData) libc.Xmemset(tls, pChild, 0, uint64(unsafe.Sizeof(Fts5DlidxLvl{}))) (*Fts5DlidxLvl)(unsafe.Pointer(pChild)).FpData = fts5DataRead(tls, p, I64((*Fts5DlidxIter)(unsafe.Pointer(pIter)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(1)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+I64(i-1)< 9 { return iOff - 9 } return 0 }() for iOff--; iOff > iLimit; iOff-- { if int32(*(*U8)(unsafe.Pointer(a + uintptr(iOff-1))))&0x80 == 0 { break } } sqlite3Fts5GetVarint(tls, a+uintptr(iOff), bp) *(*I64)(unsafe.Pointer(pLvl + 24)) -= *(*I64)(unsafe.Pointer(bp)) (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiLeafPgno-- for ii = iOff - 1; ii >= (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiFirstOff && int32(*(*U8)(unsafe.Pointer(a + uintptr(ii)))) == 0x00; ii-- { nZero++ } if ii >= (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiFirstOff && int32(*(*U8)(unsafe.Pointer(a + uintptr(ii))))&0x80 != 0 { var bZero int32 = 0 if ii-8 >= (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiFirstOff { var j int32 for j = 1; j <= 8 && int32(*(*U8)(unsafe.Pointer(a + uintptr(ii-j))))&0x80 != 0; j++ { } bZero = libc.Bool32(j > 8) } if bZero == 0 { nZero-- } } *(*int32)(unsafe.Pointer(pLvl + 20)) -= nZero (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FiOff = iOff - nZero } return (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FbEof } func fts5DlidxIterPrevR(tls *libc.TLS, p uintptr, pIter uintptr, iLvl int32) int32 { var pLvl uintptr = pIter + 8 + uintptr(iLvl)*32 if fts5DlidxLvlPrev(tls, pLvl) != 0 { if iLvl+1 < (*Fts5DlidxIter)(unsafe.Pointer(pIter)).FnLvl { fts5DlidxIterPrevR(tls, p, pIter, iLvl+1) if (*Fts5DlidxLvl)(unsafe.Pointer(pLvl+1*32)).FbEof == 0 { fts5DataRelease(tls, (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FpData) libc.Xmemset(tls, pLvl, 0, uint64(unsafe.Sizeof(Fts5DlidxLvl{}))) (*Fts5DlidxLvl)(unsafe.Pointer(pLvl)).FpData = fts5DataRead(tls, p, I64((*Fts5DlidxIter)(unsafe.Pointer(pIter)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(1)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+I64(iLvl)<= (*Fts5Data)(unsafe.Pointer(pLeaf)).Fnn { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = (*Fts5Data)(unsafe.Pointer(pLeaf)).Fnn + 1 } else { *(*int32)(unsafe.Pointer(pIter + 56)) += sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr((*Fts5SegIter)(unsafe.Pointer(pIter)).FiPgidxOff), pIter+60) } } } func fts5GetPoslistSize(tls *libc.TLS, p uintptr, pnSz uintptr, pbDel uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var n int32 = 0 { *(*int32)(unsafe.Pointer(bp)) = int32(*(*U8)(unsafe.Pointer(p + uintptr(libc.PostIncInt32(&n, 1))))) if *(*int32)(unsafe.Pointer(bp))&0x80 != 0 { n-- n = n + sqlite3Fts5GetVarint32(tls, p+uintptr(n), bp) } } *(*int32)(unsafe.Pointer(pnSz)) = *(*int32)(unsafe.Pointer(bp)) / 2 *(*int32)(unsafe.Pointer(pbDel)) = *(*int32)(unsafe.Pointer(bp)) & 0x0001 return n } func fts5SegIterLoadNPos(tls *libc.TLS, p uintptr, pIter uintptr) { bp := tls.Alloc(4) defer tls.Free(4) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var iOff int32 = int32((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset) if (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FeDetail == FTS5_DETAIL_NONE { var iEod int32 = func() int32 { if (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist < (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf { return (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist } return (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf }() (*Fts5SegIter)(unsafe.Pointer(pIter)).FbDel = U8(0) (*Fts5SegIter)(unsafe.Pointer(pIter)).FnPos = 1 if iOff < iEod && int32(*(*U8)(unsafe.Pointer((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp + uintptr(iOff)))) == 0 { (*Fts5SegIter)(unsafe.Pointer(pIter)).FbDel = U8(1) iOff++ if iOff < iEod && int32(*(*U8)(unsafe.Pointer((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp + uintptr(iOff)))) == 0 { (*Fts5SegIter)(unsafe.Pointer(pIter)).FnPos = 1 iOff++ } else { (*Fts5SegIter)(unsafe.Pointer(pIter)).FnPos = 0 } } } else { { *(*int32)(unsafe.Pointer(bp)) = int32(*(*U8)(unsafe.Pointer((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp + uintptr(libc.PostIncInt32(&iOff, 1))))) if *(*int32)(unsafe.Pointer(bp))&0x80 != 0 { iOff-- iOff = iOff + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp+uintptr(iOff), bp) } } (*Fts5SegIter)(unsafe.Pointer(pIter)).FbDel = U8(*(*int32)(unsafe.Pointer(bp)) & 0x0001) (*Fts5SegIter)(unsafe.Pointer(pIter)).FnPos = *(*int32)(unsafe.Pointer(bp)) >> 1 } (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(iOff) } } func fts5SegIterLoadRowid(tls *libc.TLS, p uintptr, pIter uintptr) { var a uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp var iOff I64 = (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset if iOff >= I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf) { fts5SegIterNextPage(tls, p, pIter) if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf == uintptr(0) { if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } return } iOff = int64(4) a = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp } iOff = iOff + I64(sqlite3Fts5GetVarint(tls, a+uintptr(iOff), pIter+104)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = iOff } func fts5SegIterLoadTerm(tls *libc.TLS, p uintptr, pIter uintptr, nKeep int32) { bp := tls.Alloc(8) defer tls.Free(8) var a uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp var iOff I64 = (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset iOff = iOff + I64(sqlite3Fts5GetVarint32(tls, a+uintptr(iOff), bp)) if iOff+I64(*(*int32)(unsafe.Pointer(bp))) > I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf) || nKeep > (*Fts5SegIter)(unsafe.Pointer(pIter)).Fterm.Fn || *(*int32)(unsafe.Pointer(bp)) == 0 { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return } (*Fts5SegIter)(unsafe.Pointer(pIter)).Fterm.Fn = nKeep sqlite3Fts5BufferAppendBlob(tls, p+52, pIter+88, uint32(*(*int32)(unsafe.Pointer(bp))), a+uintptr(iOff)) iOff = iOff + I64(*(*int32)(unsafe.Pointer(bp))) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiTermLeafOffset = int32(iOff) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiTermLeafPgno = (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = iOff if (*Fts5SegIter)(unsafe.Pointer(pIter)).FiPgidxOff >= (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn + 1 } else { *(*int32)(unsafe.Pointer(pIter + 56)) += sqlite3Fts5GetVarint32(tls, a+uintptr((*Fts5SegIter)(unsafe.Pointer(pIter)).FiPgidxOff), bp+4) *(*int32)(unsafe.Pointer(pIter + 60)) += *(*int32)(unsafe.Pointer(bp + 4)) } fts5SegIterLoadRowid(tls, p, pIter) } func fts5SegIterSetNext(tls *libc.TLS, p uintptr, pIter uintptr) { if (*Fts5SegIter)(unsafe.Pointer(pIter)).Fflags&FTS5_SEGITER_REVERSE != 0 { (*Fts5SegIter)(unsafe.Pointer(pIter)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{fts5SegIterNext_Reverse})) } else if (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FeDetail == FTS5_DETAIL_NONE { (*Fts5SegIter)(unsafe.Pointer(pIter)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{fts5SegIterNext_None})) } else { (*Fts5SegIter)(unsafe.Pointer(pIter)).FxNext = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr) }{fts5SegIterNext})) } } func fts5SegIterInit(tls *libc.TLS, p uintptr, pSeg uintptr, pIter uintptr) { if (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst == 0 { return } if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(Fts5SegIter{}))) fts5SegIterSetNext(tls, p, pIter) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg = pSeg (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno = (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst - 1 fts5SegIterNextPage(tls, p, pIter) } if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = int64(4) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiPgidxOff = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf + 1 fts5SegIterLoadTerm(tls, p, pIter, 0) fts5SegIterLoadNPos(tls, p, pIter) } } func fts5SegIterReverseInitPage(tls *libc.TLS, p uintptr, pIter uintptr) { bp := tls.Alloc(16) defer tls.Free(16) var eDetail int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FeDetail var n int32 = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf var i int32 = int32((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset) var a uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp var iRowidOffset int32 = 0 if n > (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist { n = (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist } for 1 != 0 { *(*U64)(unsafe.Pointer(bp + 8)) = uint64(0) if eDetail == FTS5_DETAIL_NONE { if i < n && int32(*(*U8)(unsafe.Pointer(a + uintptr(i)))) == 0 { i++ if i < n && int32(*(*U8)(unsafe.Pointer(a + uintptr(i)))) == 0 { i++ } } } else { i = i + fts5GetPoslistSize(tls, a+uintptr(i), bp, bp+4) i = i + *(*int32)(unsafe.Pointer(bp)) } if i >= n { break } i = i + int32(sqlite3Fts5GetVarint(tls, a+uintptr(i), bp+8)) *(*I64)(unsafe.Pointer(pIter + 104)) += I64(*(*U64)(unsafe.Pointer(bp + 8))) if iRowidOffset >= (*Fts5SegIter)(unsafe.Pointer(pIter)).FnRowidOffset { var nNew int32 = (*Fts5SegIter)(unsafe.Pointer(pIter)).FnRowidOffset + 8 var aNew uintptr = Xsqlite3_realloc64(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FaRowidOffset, uint64(nNew)*uint64(unsafe.Sizeof(int32(0)))) if aNew == uintptr(0) { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM break } (*Fts5SegIter)(unsafe.Pointer(pIter)).FaRowidOffset = aNew (*Fts5SegIter)(unsafe.Pointer(pIter)).FnRowidOffset = nNew } *(*int32)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FaRowidOffset + uintptr(libc.PostIncInt32(&iRowidOffset, 1))*4)) = int32((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(i) } (*Fts5SegIter)(unsafe.Pointer(pIter)).FiRowidOffset = iRowidOffset fts5SegIterLoadNPos(tls, p, pIter) } func fts5SegIterReverseNewPage(tls *libc.TLS, p uintptr, pIter uintptr) { fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = uintptr(0) for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno > (*Fts5SegIter)(unsafe.Pointer(pIter)).FiTermLeafPgno { var pNew uintptr (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno-- pNew = fts5DataRead(tls, p, I64((*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+int64(0)<= (*Fts5Data)(unsafe.Pointer(pNew)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = pNew (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(iRowidOff) } } } if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf != 0 { var a uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp + uintptr((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset) *(*I64)(unsafe.Pointer(pIter + 32)) += I64(sqlite3Fts5GetVarint(tls, a, pIter+104)) break } else { fts5DataRelease(tls, pNew) } } } if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf != 0 { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn + 1 fts5SegIterReverseInitPage(tls, p, pIter) } } func fts5MultiIterIsEmpty(tls *libc.TLS, p uintptr, pIter uintptr) int32 { var pSeg uintptr = pIter + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst+1*4)).FiFirst)*120 return libc.Bool32((*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf != 0 && (*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos == 0) } func fts5SegIterNext_Reverse(tls *libc.TLS, p uintptr, pIter uintptr, pbUnused uintptr) { bp := tls.Alloc(8) defer tls.Free(8) _ = pbUnused if (*Fts5SegIter)(unsafe.Pointer(pIter)).FiRowidOffset > 0 { var a uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp var iOff int32 (*Fts5SegIter)(unsafe.Pointer(pIter)).FiRowidOffset-- (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(*(*int32)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FaRowidOffset + uintptr((*Fts5SegIter)(unsafe.Pointer(pIter)).FiRowidOffset)*4))) fts5SegIterLoadNPos(tls, p, pIter) iOff = int32((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset) if (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FeDetail != FTS5_DETAIL_NONE { iOff = iOff + (*Fts5SegIter)(unsafe.Pointer(pIter)).FnPos } sqlite3Fts5GetVarint(tls, a+uintptr(iOff), bp) *(*I64)(unsafe.Pointer(pIter + 104)) -= I64(*(*U64)(unsafe.Pointer(bp))) } else { fts5SegIterReverseNewPage(tls, p, pIter) } } func fts5SegIterNext_None(tls *libc.TLS, p uintptr, pIter uintptr, pbNewTerm uintptr) { bp := tls.Alloc(36) defer tls.Free(36) var iOff int32 iOff = int32((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset) if !((*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg != 0 && iOff >= (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf) { goto __1 } fts5SegIterNextPage(tls, p, pIter) if !((*Fts5Index)(unsafe.Pointer(p)).Frc != 0 || (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf == uintptr(0)) { goto __2 } return __2: ; (*Fts5SegIter)(unsafe.Pointer(pIter)).FiRowid = int64(0) iOff = 4 __1: ; if !(iOff < (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist) { goto __3 } iOff = iOff + int32(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp+uintptr(iOff), bp)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(iOff) *(*I64)(unsafe.Pointer(pIter + 104)) += *(*I64)(unsafe.Pointer(bp)) goto __4 __3: if !((*Fts5SegIter)(unsafe.Pointer(pIter)).Fflags&FTS5_SEGITER_ONETERM == 0) { goto __5 } if !((*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg != 0) { goto __7 } *(*int32)(unsafe.Pointer(bp + 8)) = 0 if !(iOff != fts5LeafFirstTermOff(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)) { goto __9 } iOff = iOff + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp+uintptr(iOff), bp+8) __9: ; (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(iOff) fts5SegIterLoadTerm(tls, p, pIter, *(*int32)(unsafe.Pointer(bp + 8))) goto __8 __7: *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) sqlite3Fts5HashScanNext(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash) sqlite3Fts5HashScanEntry(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash, bp+16, bp+24, bp+32) if !(*(*uintptr)(unsafe.Pointer(bp + 24)) == uintptr(0)) { goto __10 } goto next_none_eof __10: ; (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp = *(*uintptr)(unsafe.Pointer(bp + 24)) (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn = *(*int32)(unsafe.Pointer(bp + 32)) (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf = *(*int32)(unsafe.Pointer(bp + 32)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = *(*int32)(unsafe.Pointer(bp + 32)) sqlite3Fts5BufferSet(tls, p+52, pIter+88, int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(bp + 16)))), *(*uintptr)(unsafe.Pointer(bp + 16))) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(sqlite3Fts5GetVarint(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), pIter+104)) __8: ; if !(pbNewTerm != 0) { goto __11 } *(*int32)(unsafe.Pointer(pbNewTerm)) = 1 __11: ; goto __6 __5: goto next_none_eof __6: ; __4: ; fts5SegIterLoadNPos(tls, p, pIter) return next_none_eof: fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = uintptr(0) } func fts5SegIterNext(tls *libc.TLS, p uintptr, pIter uintptr, pbNewTerm uintptr) { bp := tls.Alloc(44) defer tls.Free(44) var pLeaf uintptr = (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf var bNewTerm int32 = 0 *(*int32)(unsafe.Pointer(bp)) = 0 var a uintptr var n int32 a = (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp n = (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf *(*int32)(unsafe.Pointer(bp + 36)) = int32((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset + I64((*Fts5SegIter)(unsafe.Pointer(pIter)).FnPos)) if *(*int32)(unsafe.Pointer(bp + 36)) < n { if *(*int32)(unsafe.Pointer(bp + 36)) >= (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist { bNewTerm = 1 if *(*int32)(unsafe.Pointer(bp + 36)) != fts5LeafFirstTermOff(tls, pLeaf) { *(*int32)(unsafe.Pointer(bp + 36)) += sqlite3Fts5GetVarint32(tls, a+uintptr(*(*int32)(unsafe.Pointer(bp + 36))), bp) } } else { *(*int32)(unsafe.Pointer(bp + 36)) += int32(sqlite3Fts5GetVarint(tls, a+uintptr(*(*int32)(unsafe.Pointer(bp + 36))), bp+8)) *(*I64)(unsafe.Pointer(pIter + 104)) += I64(*(*U64)(unsafe.Pointer(bp + 8))) } (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(*(*int32)(unsafe.Pointer(bp + 36))) } else if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg == uintptr(0) { *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 32)) = 0 if 0 == (*Fts5SegIter)(unsafe.Pointer(pIter)).Fflags&FTS5_SEGITER_ONETERM { sqlite3Fts5HashScanNext(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash) sqlite3Fts5HashScanEntry(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash, bp+16, bp+24, bp+32) } if *(*uintptr)(unsafe.Pointer(bp + 24)) == uintptr(0) { fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = uintptr(0) } else { (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp = *(*uintptr)(unsafe.Pointer(bp + 24)) (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn = *(*int32)(unsafe.Pointer(bp + 32)) (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf = *(*int32)(unsafe.Pointer(bp + 32)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = *(*int32)(unsafe.Pointer(bp + 32)) + 1 sqlite3Fts5BufferSet(tls, p+52, pIter+88, int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(bp + 16)))), *(*uintptr)(unsafe.Pointer(bp + 16))) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(sqlite3Fts5GetVarint(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), pIter+104)) *(*int32)(unsafe.Pointer(pbNewTerm)) = 1 } } else { *(*int32)(unsafe.Pointer(bp + 36)) = 0 for *(*int32)(unsafe.Pointer(bp + 36)) == 0 { fts5SegIterNextPage(tls, p, pIter) pLeaf = (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf if pLeaf == uintptr(0) { break } if libc.AssignPtrInt32(bp+36, int32(fts5GetU16(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp))) != 0 && *(*int32)(unsafe.Pointer(bp + 36)) < (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { *(*int32)(unsafe.Pointer(bp + 36)) += int32(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(*(*int32)(unsafe.Pointer(bp + 36))), pIter+104)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(*(*int32)(unsafe.Pointer(bp + 36))) if (*Fts5Data)(unsafe.Pointer(pLeaf)).Fnn > (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiPgidxOff = (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr((*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf), pIter+60) } } else if (*Fts5Data)(unsafe.Pointer(pLeaf)).Fnn > (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiPgidxOff = (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr((*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf), bp+36) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(*(*int32)(unsafe.Pointer(bp + 36))) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = *(*int32)(unsafe.Pointer(bp + 36)) bNewTerm = 1 } if *(*int32)(unsafe.Pointer(bp + 36)) > (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return } } } if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf != 0 { if bNewTerm != 0 { if (*Fts5SegIter)(unsafe.Pointer(pIter)).Fflags&FTS5_SEGITER_ONETERM != 0 { fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = uintptr(0) } else { fts5SegIterLoadTerm(tls, p, pIter, *(*int32)(unsafe.Pointer(bp))) fts5SegIterLoadNPos(tls, p, pIter) if pbNewTerm != 0 { *(*int32)(unsafe.Pointer(pbNewTerm)) = 1 } } } else { { *(*int32)(unsafe.Pointer(bp + 40)) = int32(*(*U8)(unsafe.Pointer((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp + uintptr(libc.PostIncInt64(&(*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset, 1))))) if *(*int32)(unsafe.Pointer(bp + 40))&0x80 != 0 { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset-- *(*I64)(unsafe.Pointer(pIter + 32)) += I64(sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp+uintptr((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset), bp+40)) } } (*Fts5SegIter)(unsafe.Pointer(pIter)).FbDel = U8(*(*int32)(unsafe.Pointer(bp + 40)) & 0x0001) (*Fts5SegIter)(unsafe.Pointer(pIter)).FnPos = *(*int32)(unsafe.Pointer(bp + 40)) >> 1 } } } func fts5SegIterReverse(tls *libc.TLS, p uintptr, pIter uintptr) { var pDlidx uintptr = (*Fts5SegIter)(unsafe.Pointer(pIter)).FpDlidx var pLast uintptr = uintptr(0) var pgnoLast int32 = 0 if pDlidx != 0 { var iSegid int32 = (*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg)).FiSegid pgnoLast = fts5DlidxIterPgno(tls, pDlidx) pLast = fts5LeafRead(tls, p, I64(iSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+int64(0)<= (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { var pgno int32 var pSeg uintptr = (*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg for pgno = (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno + 1; !((*Fts5Index)(unsafe.Pointer(p)).Frc != 0) && pgno <= (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast; pgno++ { var iAbs I64 = I64((*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B) + int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B) + int64(0)<= (*Fts5Data)(unsafe.Pointer(pNew)).Fnn) if iRowid != 0 { { var tmp uintptr tmp = pNew pNew = pLast pLast = tmp } pgnoLast = pgno } fts5DataRelease(tls, pNew) if bTermless == 0 { break } } } } } if pLast != 0 { var iOff int32 fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = pLast (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno = pgnoLast iOff = int32(fts5GetU16(tls, (*Fts5Data)(unsafe.Pointer(pLast)).Fp)) if iOff > (*Fts5Data)(unsafe.Pointer(pLast)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return } iOff = iOff + int32(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pLast)).Fp+uintptr(iOff), pIter+104)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(iOff) if (*Fts5Data)(unsafe.Pointer(pLast)).FszLeaf >= (*Fts5Data)(unsafe.Pointer(pLast)).Fnn { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = (*Fts5Data)(unsafe.Pointer(pLast)).Fnn + 1 } else { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = fts5LeafFirstTermOff(tls, pLast) } } fts5SegIterReverseInitPage(tls, p, pIter) } func fts5SegIterLoadDlidx(tls *libc.TLS, p uintptr, pIter uintptr) { var iSeg int32 = (*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg)).FiSegid var bRev int32 = (*Fts5SegIter)(unsafe.Pointer(pIter)).Fflags & FTS5_SEGITER_REVERSE var pLeaf uintptr = (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf if (*Fts5SegIter)(unsafe.Pointer(pIter)).FiTermLeafPgno == (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno && (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist < (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { return } (*Fts5SegIter)(unsafe.Pointer(pIter)).FpDlidx = fts5DlidxIterInit(tls, p, bRev, iSeg, (*Fts5SegIter)(unsafe.Pointer(pIter)).FiTermLeafPgno) } func fts5LeafSeek(tls *libc.TLS, p uintptr, bGe int32, pIter uintptr, pTerm uintptr, nTerm int32) { bp := tls.Alloc(20) defer tls.Free(20) var a uintptr var n U32 var nMatch U32 var iPgidx U32 var bEndOfPage int32 var nCmp U32 var i U32 a = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp n = U32((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn) nMatch = U32(0) *(*U32)(unsafe.Pointer(bp + 8)) = U32(0) *(*U32)(unsafe.Pointer(bp + 4)) = U32(0) bEndOfPage = 0 iPgidx = U32((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf) iPgidx = iPgidx + U32(sqlite3Fts5GetVarint32(tls, a+uintptr(iPgidx), bp)) *(*U32)(unsafe.Pointer(bp + 12)) = *(*U32)(unsafe.Pointer(bp)) if !(*(*U32)(unsafe.Pointer(bp + 12)) > n) { goto __1 } (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return __1: ; __2: if !(1 != 0) { goto __3 } *(*U32)(unsafe.Pointer(bp + 4)) = U32(*(*U8)(unsafe.Pointer(a + uintptr(libc.PostIncUint32(&*(*U32)(unsafe.Pointer(bp + 12)), 1))))) if !(*(*U32)(unsafe.Pointer(bp + 4))&U32(0x80) != 0) { goto __4 } *(*U32)(unsafe.Pointer(bp + 12))-- *(*U32)(unsafe.Pointer(bp + 12)) += U32(sqlite3Fts5GetVarint32(tls, a+uintptr(*(*U32)(unsafe.Pointer(bp + 12))), bp+4)) __4: ; if !(*(*U32)(unsafe.Pointer(bp + 8)) < nMatch) { goto __5 } goto search_failed __5: ; if !(*(*U32)(unsafe.Pointer(bp + 8)) == nMatch) { goto __6 } nCmp = func() uint32 { if *(*U32)(unsafe.Pointer(bp + 4)) < U32(nTerm)-nMatch { return *(*U32)(unsafe.Pointer(bp + 4)) } return U32(nTerm) - nMatch }() i = U32(0) __7: if !(i < nCmp) { goto __9 } if !(int32(*(*U8)(unsafe.Pointer(a + uintptr(*(*U32)(unsafe.Pointer(bp + 12))+i)))) != int32(*(*U8)(unsafe.Pointer(pTerm + uintptr(nMatch+i))))) { goto __10 } goto __9 __10: ; goto __8 __8: i++ goto __7 goto __9 __9: ; nMatch = nMatch + i if !(U32(nTerm) == nMatch) { goto __11 } if !(i == *(*U32)(unsafe.Pointer(bp + 4))) { goto __13 } goto search_success goto __14 __13: goto search_failed __14: ; goto __12 __11: if !(i < *(*U32)(unsafe.Pointer(bp + 4)) && int32(*(*U8)(unsafe.Pointer(a + uintptr(*(*U32)(unsafe.Pointer(bp + 12))+i)))) > int32(*(*U8)(unsafe.Pointer(pTerm + uintptr(nMatch))))) { goto __15 } goto search_failed __15: ; __12: ; __6: ; if !(iPgidx >= n) { goto __16 } bEndOfPage = 1 goto __3 __16: ; iPgidx = iPgidx + U32(sqlite3Fts5GetVarint32(tls, a+uintptr(iPgidx), bp+8)) *(*U32)(unsafe.Pointer(bp)) += *(*U32)(unsafe.Pointer(bp + 8)) *(*U32)(unsafe.Pointer(bp + 12)) = *(*U32)(unsafe.Pointer(bp)) if !(*(*U32)(unsafe.Pointer(bp + 12)) >= n) { goto __17 } (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return __17: ; *(*U32)(unsafe.Pointer(bp + 8)) = U32(*(*U8)(unsafe.Pointer(a + uintptr(libc.PostIncUint32(&*(*U32)(unsafe.Pointer(bp + 12)), 1))))) if !(*(*U32)(unsafe.Pointer(bp + 8))&U32(0x80) != 0) { goto __18 } *(*U32)(unsafe.Pointer(bp + 12))-- *(*U32)(unsafe.Pointer(bp + 12)) += U32(sqlite3Fts5GetVarint32(tls, a+uintptr(*(*U32)(unsafe.Pointer(bp + 12))), bp+8)) __18: ; goto __2 __3: ; search_failed: if !(bGe == 0) { goto __19 } fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = uintptr(0) return goto __20 __19: if !(bEndOfPage != 0) { goto __21 } __22: fts5SegIterNextPage(tls, p, pIter) if !((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf == uintptr(0)) { goto __25 } return __25: ; a = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp if !(libc.Bool32((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf >= (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn) == 0) { goto __26 } iPgidx = U32((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf) iPgidx = iPgidx + U32(sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp+uintptr(iPgidx), bp+12)) if !(*(*U32)(unsafe.Pointer(bp + 12)) < U32(4) || I64(*(*U32)(unsafe.Pointer(bp + 12))) >= I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf)) { goto __27 } (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return goto __28 __27: *(*U32)(unsafe.Pointer(bp + 8)) = U32(0) *(*U32)(unsafe.Pointer(bp)) = *(*U32)(unsafe.Pointer(bp + 12)) n = U32((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn) *(*U32)(unsafe.Pointer(bp + 12)) += U32(sqlite3Fts5GetVarint32(tls, a+uintptr(*(*U32)(unsafe.Pointer(bp + 12))), bp+4)) goto __24 __28: ; __26: ; goto __23 __23: if 1 != 0 { goto __22 } goto __24 __24: ; __21: ; __20: ; search_success: if !(I64(*(*U32)(unsafe.Pointer(bp + 12)))+I64(*(*U32)(unsafe.Pointer(bp + 4))) > I64(n) || *(*U32)(unsafe.Pointer(bp + 4)) < U32(1)) { goto __29 } (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return __29: ; (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(*(*U32)(unsafe.Pointer(bp + 12)) + *(*U32)(unsafe.Pointer(bp + 4))) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiTermLeafOffset = int32((*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiTermLeafPgno = (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno sqlite3Fts5BufferSet(tls, p+52, pIter+88, int32(*(*U32)(unsafe.Pointer(bp + 8))), pTerm) sqlite3Fts5BufferAppendBlob(tls, p+52, pIter+88, *(*U32)(unsafe.Pointer(bp + 4)), a+uintptr(*(*U32)(unsafe.Pointer(bp + 12)))) if !(iPgidx >= n) { goto __30 } (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fnn + 1 goto __31 __30: iPgidx = iPgidx + U32(sqlite3Fts5GetVarint32(tls, a+uintptr(iPgidx), bp+16)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = int32(*(*U32)(unsafe.Pointer(bp)) + U32(*(*int32)(unsafe.Pointer(bp + 16)))) __31: ; (*Fts5SegIter)(unsafe.Pointer(pIter)).FiPgidxOff = int32(iPgidx) fts5SegIterLoadRowid(tls, p, pIter) fts5SegIterLoadNPos(tls, p, pIter) } func fts5IdxSelectStmt(tls *libc.TLS, p uintptr) uintptr { bp := tls.Alloc(16) defer tls.Free(16) if (*Fts5Index)(unsafe.Pointer(p)).FpIdxSelect == uintptr(0) { var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig fts5IndexPrepareStmt(tls, p, p+96, Xsqlite3_mprintf(tls, ts+36421, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName))) } return (*Fts5Index)(unsafe.Pointer(p)).FpIdxSelect } func fts5SegIterSeekInit(tls *libc.TLS, p uintptr, pTerm uintptr, nTerm int32, flags int32, pSeg uintptr, pIter uintptr) { var iPg int32 = 1 var bGe int32 = flags & FTS5INDEX_QUERY_SCAN var bDlidx int32 = 0 var pIdxSelect uintptr = uintptr(0) libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(Fts5SegIter{}))) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg = pSeg pIdxSelect = fts5IdxSelectStmt(tls, p) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { return } Xsqlite3_bind_int(tls, pIdxSelect, 1, (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FiSegid) Xsqlite3_bind_blob(tls, pIdxSelect, 2, pTerm, nTerm, uintptr(0)) if SQLITE_ROW == Xsqlite3_step(tls, pIdxSelect) { var val I64 = I64(Xsqlite3_column_int(tls, pIdxSelect, 0)) iPg = int32(val >> 1) bDlidx = int32(val & int64(0x0001)) } (*Fts5Index)(unsafe.Pointer(p)).Frc = Xsqlite3_reset(tls, pIdxSelect) Xsqlite3_bind_null(tls, pIdxSelect, 2) if iPg < (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst { iPg = (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst bDlidx = 0 } (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno = iPg - 1 fts5SegIterNextPage(tls, p, pIter) if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf != 0 { fts5LeafSeek(tls, p, bGe, pIter, pTerm, nTerm) } if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && bGe == 0 { *(*int32)(unsafe.Pointer(pIter + 8)) |= FTS5_SEGITER_ONETERM if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf != 0 { if flags&FTS5INDEX_QUERY_DESC != 0 { *(*int32)(unsafe.Pointer(pIter + 8)) |= FTS5_SEGITER_REVERSE } if bDlidx != 0 { fts5SegIterLoadDlidx(tls, p, pIter) } if flags&FTS5INDEX_QUERY_DESC != 0 { fts5SegIterReverse(tls, p, pIter) } } } fts5SegIterSetNext(tls, p, pIter) } func fts5SegIterHashInit(tls *libc.TLS, p uintptr, pTerm uintptr, nTerm int32, flags int32, pIter uintptr) { bp := tls.Alloc(32) defer tls.Free(32) *(*int32)(unsafe.Pointer(bp + 16)) = 0 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var n int32 = 0 *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) if pTerm == uintptr(0) || flags&FTS5INDEX_QUERY_SCAN != 0 { *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) (*Fts5Index)(unsafe.Pointer(p)).Frc = sqlite3Fts5HashScanInit(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash, pTerm, nTerm) sqlite3Fts5HashScanEntry(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash, bp, bp+8, bp+16) n = func() int32 { if *(*uintptr)(unsafe.Pointer(bp)) != 0 { return int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(bp)))) } return 0 }() if *(*uintptr)(unsafe.Pointer(bp + 8)) != 0 { *(*uintptr)(unsafe.Pointer(bp + 24)) = fts5IdxMalloc(tls, p, int64(unsafe.Sizeof(Fts5Data{}))) if *(*uintptr)(unsafe.Pointer(bp + 24)) != 0 { (*Fts5Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).Fp = *(*uintptr)(unsafe.Pointer(bp + 8)) } } } else { (*Fts5Index)(unsafe.Pointer(p)).Frc = sqlite3Fts5HashQuery(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash, int32(unsafe.Sizeof(Fts5Data{})), pTerm, nTerm, bp+24, bp+16) if *(*uintptr)(unsafe.Pointer(bp + 24)) != 0 { (*Fts5Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).Fp = *(*uintptr)(unsafe.Pointer(bp + 24)) + 1*16 } *(*uintptr)(unsafe.Pointer(bp)) = pTerm n = nTerm *(*int32)(unsafe.Pointer(pIter + 8)) |= FTS5_SEGITER_ONETERM } if *(*uintptr)(unsafe.Pointer(bp + 24)) != 0 { sqlite3Fts5BufferSet(tls, p+52, pIter+88, n, *(*uintptr)(unsafe.Pointer(bp))) (*Fts5Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).Fnn = libc.AssignPtrInt32(*(*uintptr)(unsafe.Pointer(bp + 24))+12, *(*int32)(unsafe.Pointer(bp + 16))) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = *(*uintptr)(unsafe.Pointer(bp + 24)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).Fp, pIter+104)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = (*Fts5Data)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 24)))).Fnn if flags&FTS5INDEX_QUERY_DESC != 0 { *(*int32)(unsafe.Pointer(pIter + 8)) |= FTS5_SEGITER_REVERSE fts5SegIterReverseInitPage(tls, p, pIter) } else { fts5SegIterLoadNPos(tls, p, pIter) } } fts5SegIterSetNext(tls, p, pIter) } func fts5SegIterClear(tls *libc.TLS, pIter uintptr) { sqlite3Fts5BufferFree(tls, pIter+88) fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf) fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpNextLeaf) fts5DlidxIterFree(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpDlidx) Xsqlite3_free(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FaRowidOffset) libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(Fts5SegIter{}))) } func fts5MultiIterDoCompare(tls *libc.TLS, pIter uintptr, iOut int32) int32 { var i1 int32 var i2 int32 var iRes int32 var p1 uintptr var p2 uintptr var pRes uintptr = (*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst + uintptr(iOut)*4 if iOut >= (*Fts5Iter)(unsafe.Pointer(pIter)).FnSeg/2 { i1 = (iOut - (*Fts5Iter)(unsafe.Pointer(pIter)).FnSeg/2) * 2 i2 = i1 + 1 } else { i1 = int32((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst + uintptr(iOut*2)*4)).FiFirst) i2 = int32((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst + uintptr(iOut*2+1)*4)).FiFirst) } p1 = pIter + 96 + uintptr(i1)*120 p2 = pIter + 96 + uintptr(i2)*120 (*Fts5CResult)(unsafe.Pointer(pRes)).FbTermEq = U8(0) if (*Fts5SegIter)(unsafe.Pointer(p1)).FpLeaf == uintptr(0) { iRes = i2 } else if (*Fts5SegIter)(unsafe.Pointer(p2)).FpLeaf == uintptr(0) { iRes = i1 } else { var res int32 = fts5BufferCompare(tls, p1+88, p2+88) if res == 0 { (*Fts5CResult)(unsafe.Pointer(pRes)).FbTermEq = U8(1) if (*Fts5SegIter)(unsafe.Pointer(p1)).FiRowid == (*Fts5SegIter)(unsafe.Pointer(p2)).FiRowid { (*Fts5SegIter)(unsafe.Pointer(p1)).FbDel = (*Fts5SegIter)(unsafe.Pointer(p2)).FbDel return i2 } if libc.Bool32((*Fts5SegIter)(unsafe.Pointer(p1)).FiRowid > (*Fts5SegIter)(unsafe.Pointer(p2)).FiRowid) == (*Fts5Iter)(unsafe.Pointer(pIter)).FbRev { res = -1 } else { res = +1 } } if res < 0 { iRes = i1 } else { iRes = i2 } } (*Fts5CResult)(unsafe.Pointer(pRes)).FiFirst = U16(iRes) return 0 } func fts5SegIterGotoPage(tls *libc.TLS, p uintptr, pIter uintptr, iLeafPgno int32) { if iLeafPgno > (*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpSeg)).FpgnoLast { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pIter)).FpNextLeaf) (*Fts5SegIter)(unsafe.Pointer(pIter)).FpNextLeaf = uintptr(0) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno = iLeafPgno - 1 fts5SegIterNextPage(tls, p, pIter) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf != uintptr(0) { var iOff int32 var a uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp var n int32 = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).FszLeaf iOff = int32(fts5GetU16(tls, (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf)).Fp)) if iOff < 4 || iOff >= n { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { iOff = iOff + int32(sqlite3Fts5GetVarint(tls, a+uintptr(iOff), pIter+104)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(iOff) fts5SegIterLoadNPos(tls, p, pIter) } } } } func fts5SegIterNextFrom(tls *libc.TLS, p uintptr, pIter uintptr, iMatch I64) { var bRev int32 = (*Fts5SegIter)(unsafe.Pointer(pIter)).Fflags & FTS5_SEGITER_REVERSE var pDlidx uintptr = (*Fts5SegIter)(unsafe.Pointer(pIter)).FpDlidx var iLeafPgno int32 = (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno var bMove int32 = 1 if bRev == 0 { for !(fts5DlidxIterEof(tls, p, pDlidx) != 0) && iMatch > fts5DlidxIterRowid(tls, pDlidx) { iLeafPgno = fts5DlidxIterPgno(tls, pDlidx) fts5DlidxIterNext(tls, p, pDlidx) } if iLeafPgno > (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno { fts5SegIterGotoPage(tls, p, pIter, iLeafPgno) bMove = 0 } } else { for !(fts5DlidxIterEof(tls, p, pDlidx) != 0) && iMatch < fts5DlidxIterRowid(tls, pDlidx) { fts5DlidxIterPrev(tls, p, pDlidx) } iLeafPgno = fts5DlidxIterPgno(tls, pDlidx) if iLeafPgno < (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno { (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafPgno = iLeafPgno + 1 fts5SegIterReverseNewPage(tls, p, pIter) bMove = 0 } } for __ccgo := true; __ccgo; __ccgo = (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { if bMove != 0 && (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5SegIter)(unsafe.Pointer(pIter)).FxNext})).f(tls, p, pIter, uintptr(0)) } if (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf == uintptr(0) { break } if bRev == 0 && (*Fts5SegIter)(unsafe.Pointer(pIter)).FiRowid >= iMatch { break } if bRev != 0 && (*Fts5SegIter)(unsafe.Pointer(pIter)).FiRowid <= iMatch { break } bMove = 1 } } func fts5MultiIterFree(tls *libc.TLS, pIter uintptr) { if pIter != 0 { var i int32 for i = 0; i < (*Fts5Iter)(unsafe.Pointer(pIter)).FnSeg; i++ { fts5SegIterClear(tls, pIter+96+uintptr(i)*120) } sqlite3Fts5BufferFree(tls, pIter+32) Xsqlite3_free(tls, pIter) } } func fts5MultiIterAdvanced(tls *libc.TLS, p uintptr, pIter uintptr, iChanged int32, iMinset int32) { var i int32 for i = ((*Fts5Iter)(unsafe.Pointer(pIter)).FnSeg + iChanged) / 2; i >= iMinset && (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK; i = i / 2 { var iEq int32 if libc.AssignInt32(&iEq, fts5MultiIterDoCompare(tls, pIter, i)) != 0 { var pSeg uintptr = pIter + 96 + uintptr(iEq)*120 (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5SegIter)(unsafe.Pointer(pSeg)).FxNext})).f(tls, p, pSeg, uintptr(0)) i = (*Fts5Iter)(unsafe.Pointer(pIter)).FnSeg + iEq } } } func fts5MultiIterAdvanceRowid(tls *libc.TLS, pIter uintptr, iChanged int32, ppFirst uintptr) int32 { var pNew uintptr = pIter + 96 + uintptr(iChanged)*120 if (*Fts5SegIter)(unsafe.Pointer(pNew)).FiRowid == (*Fts5Iter)(unsafe.Pointer(pIter)).FiSwitchRowid || libc.Bool32((*Fts5SegIter)(unsafe.Pointer(pNew)).FiRowid < (*Fts5Iter)(unsafe.Pointer(pIter)).FiSwitchRowid) == (*Fts5Iter)(unsafe.Pointer(pIter)).FbRev { var i int32 var pOther uintptr = pIter + 96 + uintptr(iChanged^0x0001)*120 (*Fts5Iter)(unsafe.Pointer(pIter)).FiSwitchRowid = func() int64 { if (*Fts5Iter)(unsafe.Pointer(pIter)).FbRev != 0 { return int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32) } return int64(0xffffffff) | int64(0x7fffffff)<<32 }() for i = ((*Fts5Iter)(unsafe.Pointer(pIter)).FnSeg + iChanged) / 2; 1 != 0; i = i / 2 { var pRes uintptr = (*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst + uintptr(i)*4 if (*Fts5CResult)(unsafe.Pointer(pRes)).FbTermEq != 0 { if (*Fts5SegIter)(unsafe.Pointer(pNew)).FiRowid == (*Fts5SegIter)(unsafe.Pointer(pOther)).FiRowid { return 1 } else if libc.Bool32((*Fts5SegIter)(unsafe.Pointer(pOther)).FiRowid > (*Fts5SegIter)(unsafe.Pointer(pNew)).FiRowid) == (*Fts5Iter)(unsafe.Pointer(pIter)).FbRev { (*Fts5Iter)(unsafe.Pointer(pIter)).FiSwitchRowid = (*Fts5SegIter)(unsafe.Pointer(pOther)).FiRowid pNew = pOther } else if libc.Bool32((*Fts5SegIter)(unsafe.Pointer(pOther)).FiRowid > (*Fts5Iter)(unsafe.Pointer(pIter)).FiSwitchRowid) == (*Fts5Iter)(unsafe.Pointer(pIter)).FbRev { (*Fts5Iter)(unsafe.Pointer(pIter)).FiSwitchRowid = (*Fts5SegIter)(unsafe.Pointer(pOther)).FiRowid } } (*Fts5CResult)(unsafe.Pointer(pRes)).FiFirst = U16(int64((pNew - (pIter + 96)) / 120)) if i == 1 { break } pOther = pIter + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst+uintptr(i^0x0001)*4)).FiFirst)*120 } } *(*uintptr)(unsafe.Pointer(ppFirst)) = pNew return 0 } func fts5MultiIterSetEof(tls *libc.TLS, pIter uintptr) { var pSeg uintptr = pIter + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst+1*4)).FiFirst)*120 (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FbEof = U8(libc.Bool32((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf == uintptr(0))) (*Fts5Iter)(unsafe.Pointer(pIter)).FiSwitchRowid = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiRowid } func fts5MultiIterNext(tls *libc.TLS, p uintptr, pIter uintptr, bFrom int32, iFrom I64) { bp := tls.Alloc(16) defer tls.Free(16) var bUseFrom int32 = bFrom for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var iFirst int32 = int32((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst + 1*4)).FiFirst) *(*int32)(unsafe.Pointer(bp)) = 0 *(*uintptr)(unsafe.Pointer(bp + 8)) = pIter + 96 + uintptr(iFirst)*120 if bUseFrom != 0 && (*Fts5SegIter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpDlidx != 0 { fts5SegIterNextFrom(tls, p, *(*uintptr)(unsafe.Pointer(bp + 8)), iFrom) } else { (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5SegIter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FxNext})).f(tls, p, *(*uintptr)(unsafe.Pointer(bp + 8)), bp) } if (*Fts5SegIter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpLeaf == uintptr(0) || *(*int32)(unsafe.Pointer(bp)) != 0 || fts5MultiIterAdvanceRowid(tls, pIter, iFirst, bp+8) != 0 { fts5MultiIterAdvanced(tls, p, pIter, iFirst, 1) fts5MultiIterSetEof(tls, pIter) *(*uintptr)(unsafe.Pointer(bp + 8)) = pIter + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst+1*4)).FiFirst)*120 if (*Fts5SegIter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpLeaf == uintptr(0) { return } } if int32((*Fts5Iter)(unsafe.Pointer(pIter)).FbSkipEmpty) == 0 || (*Fts5SegIter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FnPos != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Iter)(unsafe.Pointer(pIter)).FxSetOutputs})).f(tls, pIter, *(*uintptr)(unsafe.Pointer(bp + 8))) return } bUseFrom = 0 } } func fts5MultiIterNext2(tls *libc.TLS, p uintptr, pIter uintptr, pbNewTerm uintptr) { bp := tls.Alloc(16) defer tls.Free(16) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { *(*int32)(unsafe.Pointer(pbNewTerm)) = 0 for __ccgo := true; __ccgo; __ccgo = fts5MultiIterIsEmpty(tls, p, pIter) != 0 { var iFirst int32 = int32((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst + 1*4)).FiFirst) *(*uintptr)(unsafe.Pointer(bp + 8)) = pIter + 96 + uintptr(iFirst)*120 *(*int32)(unsafe.Pointer(bp)) = 0 (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5SegIter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FxNext})).f(tls, p, *(*uintptr)(unsafe.Pointer(bp + 8)), bp) if (*Fts5SegIter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpLeaf == uintptr(0) || *(*int32)(unsafe.Pointer(bp)) != 0 || fts5MultiIterAdvanceRowid(tls, pIter, iFirst, bp+8) != 0 { fts5MultiIterAdvanced(tls, p, pIter, iFirst, 1) fts5MultiIterSetEof(tls, pIter) *(*int32)(unsafe.Pointer(pbNewTerm)) = 1 } } } } func fts5IterSetOutputs_Noop(tls *libc.TLS, pUnused1 uintptr, pUnused2 uintptr) { _ = pUnused1 _ = pUnused2 } func fts5MultiIterAlloc(tls *libc.TLS, p uintptr, nSeg int32) uintptr { var pNew uintptr var nSlot int32 for nSlot = 2; nSlot < nSeg; nSlot = nSlot * 2 { } pNew = fts5IdxMalloc(tls, p, int64(uint64(unsafe.Sizeof(Fts5Iter{}))+uint64(unsafe.Sizeof(Fts5SegIter{}))*uint64(nSlot-1)+uint64(unsafe.Sizeof(Fts5CResult{}))*uint64(nSlot))) if pNew != 0 { (*Fts5Iter)(unsafe.Pointer(pNew)).FnSeg = nSlot (*Fts5Iter)(unsafe.Pointer(pNew)).FaFirst = pNew + 96 + uintptr(nSlot)*120 (*Fts5Iter)(unsafe.Pointer(pNew)).FpIndex = p (*Fts5Iter)(unsafe.Pointer(pNew)).FxSetOutputs = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{fts5IterSetOutputs_Noop})) } return pNew } func fts5PoslistCallback(tls *libc.TLS, pUnused uintptr, pContext uintptr, pChunk uintptr, nChunk int32) { _ = pUnused if nChunk > 0 { { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(pContext)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pContext)).Fn), pChunk, uint64(nChunk)) *(*int32)(unsafe.Pointer(pContext + 8)) += nChunk } } } type PoslistCallbackCtx1 = struct { FpBuf uintptr FpColset uintptr FeState int32 F__ccgo_pad1 [4]byte } type PoslistCallbackCtx = PoslistCallbackCtx1 type PoslistOffsetsCtx1 = struct { FpBuf uintptr FpColset uintptr FiRead int32 FiWrite int32 } type PoslistOffsetsCtx = PoslistOffsetsCtx1 func fts5IndexColsetTest(tls *libc.TLS, pColset uintptr, iCol int32) int32 { var i int32 for i = 0; i < (*Fts5Colset)(unsafe.Pointer(pColset)).FnCol; i++ { if *(*int32)(unsafe.Pointer(pColset + 4 + uintptr(i)*4)) == iCol { return 1 } } return 0 } func fts5PoslistOffsetsCallback(tls *libc.TLS, pUnused uintptr, pContext uintptr, pChunk uintptr, nChunk int32) { bp := tls.Alloc(4) defer tls.Free(4) var pCtx uintptr = pContext _ = pUnused if nChunk > 0 { var i int32 = 0 for i < nChunk { i = i + sqlite3Fts5GetVarint32(tls, pChunk+uintptr(i), bp) *(*int32)(unsafe.Pointer(bp)) += (*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FiRead - 2 (*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FiRead = *(*int32)(unsafe.Pointer(bp)) if fts5IndexColsetTest(tls, (*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FpColset, *(*int32)(unsafe.Pointer(bp))) != 0 { { *(*int32)(unsafe.Pointer((*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FpBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer((*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer((*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fn), uint64(*(*int32)(unsafe.Pointer(bp))+2-(*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FiWrite)) } (*PoslistOffsetsCtx)(unsafe.Pointer(pCtx)).FiWrite = *(*int32)(unsafe.Pointer(bp)) } } } } func fts5PoslistFilterCallback(tls *libc.TLS, pUnused uintptr, pContext uintptr, pChunk uintptr, nChunk int32) { bp := tls.Alloc(8) defer tls.Free(8) var pCtx uintptr = pContext _ = pUnused if nChunk > 0 { var i int32 = 0 var iStart int32 = 0 if (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FeState == 2 { { *(*int32)(unsafe.Pointer(bp)) = int32(*(*U8)(unsafe.Pointer(pChunk + uintptr(libc.PostIncInt32(&i, 1))))) if *(*int32)(unsafe.Pointer(bp))&0x80 != 0 { i-- i = i + sqlite3Fts5GetVarint32(tls, pChunk+uintptr(i), bp) } } if fts5IndexColsetTest(tls, (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpColset, *(*int32)(unsafe.Pointer(bp))) != 0 { (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FeState = 1 { *(*int32)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fn), uint64(1)) } } else { (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FeState = 0 } } for __ccgo := true; __ccgo; __ccgo = i < nChunk { for i < nChunk && int32(*(*U8)(unsafe.Pointer(pChunk + uintptr(i)))) != 0x01 { for int32(*(*U8)(unsafe.Pointer(pChunk + uintptr(i))))&0x80 != 0 { i++ } i++ } if (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FeState != 0 { { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fn), pChunk+uintptr(iStart), uint64(i-iStart)) *(*int32)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf + 8)) += i - iStart } } if i < nChunk { iStart = i i++ if i >= nChunk { (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FeState = 2 } else { { *(*int32)(unsafe.Pointer(bp + 4)) = int32(*(*U8)(unsafe.Pointer(pChunk + uintptr(libc.PostIncInt32(&i, 1))))) if *(*int32)(unsafe.Pointer(bp + 4))&0x80 != 0 { i-- i = i + sqlite3Fts5GetVarint32(tls, pChunk+uintptr(i), bp+4) } } (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FeState = fts5IndexColsetTest(tls, (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpColset, *(*int32)(unsafe.Pointer(bp + 4))) if (*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FeState != 0 { { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf)).Fn), pChunk+uintptr(iStart), uint64(i-iStart)) *(*int32)(unsafe.Pointer((*PoslistCallbackCtx)(unsafe.Pointer(pCtx)).FpBuf + 8)) += i - iStart } iStart = i } } } } } } func fts5ChunkIterate(tls *libc.TLS, p uintptr, pSeg uintptr, pCtx uintptr, xChunk uintptr) { var nRem int32 = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos var pData uintptr = uintptr(0) var pChunk uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).Fp + uintptr((*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset) var nChunk int32 = func() int32 { if I64(nRem) < I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).FszLeaf)-(*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset { return nRem } return int32(I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).FszLeaf) - (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset) }() var pgno int32 = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafPgno var pgnoSave int32 = 0 if (*Fts5SegIter)(unsafe.Pointer(pSeg)).Fflags&FTS5_SEGITER_REVERSE == 0 { pgnoSave = pgno + 1 } for 1 != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32) })(unsafe.Pointer(&struct{ uintptr }{xChunk})).f(tls, p, pCtx, pChunk, nChunk) nRem = nRem - nChunk fts5DataRelease(tls, pData) if nRem <= 0 { break } else if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpSeg == uintptr(0) { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 return } else { pgno++ pData = fts5LeafRead(tls, p, I64((*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpSeg)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+int64(0)< 1 && sqlite3Fts5BufferSize(tls, pRc, pIter+32, uint32(nPos)) != 0 { return } for 1 != 0 { for *(*int32)(unsafe.Pointer(pColset + 4 + uintptr(i)*4)) < *(*int32)(unsafe.Pointer(bp)) { i++ if i == (*Fts5Colset)(unsafe.Pointer(pColset)).FnCol { (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fn return } } for p < pEnd && int32(*(*U8)(unsafe.Pointer(p))) != 0x01 { for int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&p, 1))))&0x80 != 0 { } } if *(*int32)(unsafe.Pointer(pColset + 4 + uintptr(i)*4)) == *(*int32)(unsafe.Pointer(bp)) { if (*Fts5Colset)(unsafe.Pointer(pColset)).FnCol == 1 { (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = aCopy (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = int32((int64(p) - int64(aCopy)) / 1) return } { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(pIter+32)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pIter+32)).Fn), aCopy, uint64((int64(p)-int64(aCopy))/1)) *(*int32)(unsafe.Pointer(pIter + 32 + 8)) += int32((int64(p) - int64(aCopy)) / 1) } } if p >= pEnd { (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fn return } aCopy = libc.PostIncUintptr(&p, 1) *(*int32)(unsafe.Pointer(bp)) = int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&p, 1)))) if *(*int32)(unsafe.Pointer(bp))&0x80 != 0 { p-- p += uintptr(sqlite3Fts5GetVarint32(tls, p, bp)) } } } } func fts5IterSetOutputs_None(tls *libc.TLS, pIter uintptr, pSeg uintptr) { (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FiRowid = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiRowid (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos } func fts5IterSetOutputs_Nocolset(tls *libc.TLS, pIter uintptr, pSeg uintptr) { (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FiRowid = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiRowid (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset+I64((*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos) <= I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).FszLeaf) { (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).Fp + uintptr((*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset) } else { sqlite3Fts5BufferZero(tls, pIter+32) fts5SegiterPoslist(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex, pSeg, uintptr(0), pIter+32) (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp } } func fts5IterSetOutputs_ZeroColset(tls *libc.TLS, pIter uintptr, pSeg uintptr) { _ = pSeg (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = 0 } func fts5IterSetOutputs_Col(tls *libc.TLS, pIter uintptr, pSeg uintptr) { sqlite3Fts5BufferZero(tls, pIter+32) fts5SegiterPoslist(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex, pSeg, (*Fts5Iter)(unsafe.Pointer(pIter)).FpColset, pIter+32) (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FiRowid = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiRowid (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fn } func fts5IterSetOutputs_Col100(tls *libc.TLS, pIter uintptr, pSeg uintptr) { var a uintptr var pEnd uintptr var iPrev int32 var aiCol uintptr var aiColEnd uintptr var aOut uintptr var iPrevOut int32 if !((*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset+I64((*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos) > I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).FszLeaf)) { goto __1 } fts5IterSetOutputs_Col(tls, pIter, pSeg) goto __2 __1: a = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).Fp + uintptr((*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset) pEnd = a + uintptr((*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos) iPrev = 0 aiCol = (*Fts5Iter)(unsafe.Pointer(pIter)).FpColset + 4 aiColEnd = aiCol + uintptr((*Fts5Colset)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FpColset)).FnCol)*4 aOut = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp iPrevOut = 0 (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FiRowid = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiRowid __3: if !(a < pEnd) { goto __4 } iPrev = iPrev + (int32(*(*U8)(unsafe.Pointer(libc.PostIncUintptr(&a, 1)))) - 2) __5: if !(*(*int32)(unsafe.Pointer(aiCol)) < iPrev) { goto __6 } aiCol += 4 if !(aiCol == aiColEnd) { goto __7 } goto setoutputs_col_out __7: ; goto __5 __6: ; if !(*(*int32)(unsafe.Pointer(aiCol)) == iPrev) { goto __8 } *(*U8)(unsafe.Pointer(libc.PostIncUintptr(&aOut, 1))) = U8(iPrev - iPrevOut + 2) iPrevOut = iPrev __8: ; goto __3 __4: ; setoutputs_col_out: (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = int32((int64(aOut) - int64((*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp)) / 1) __2: } func fts5IterSetOutputs_Full(tls *libc.TLS, pIter uintptr, pSeg uintptr) { var pColset uintptr = (*Fts5Iter)(unsafe.Pointer(pIter)).FpColset (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FiRowid = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiRowid if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset+I64((*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos) <= I64((*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).FszLeaf) { var a uintptr = (*Fts5Data)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf)).Fp + uintptr((*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafOffset) var pRc uintptr = (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex + 52 sqlite3Fts5BufferZero(tls, pIter+32) fts5IndexExtractColset(tls, pRc, pColset, a, (*Fts5SegIter)(unsafe.Pointer(pSeg)).FnPos, pIter) } else { sqlite3Fts5BufferZero(tls, pIter+32) fts5SegiterPoslist(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex, pSeg, pColset, pIter+32) (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FpData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fp (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FnData = (*Fts5Iter)(unsafe.Pointer(pIter)).Fposlist.Fn } } func fts5IterSetOutputCb(tls *libc.TLS, pRc uintptr, pIter uintptr) { if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { var pConfig uintptr = (*Fts5Index)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex)).FpConfig if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_NONE { (*Fts5Iter)(unsafe.Pointer(pIter)).FxSetOutputs = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{fts5IterSetOutputs_None})) } else if (*Fts5Iter)(unsafe.Pointer(pIter)).FpColset == uintptr(0) { (*Fts5Iter)(unsafe.Pointer(pIter)).FxSetOutputs = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{fts5IterSetOutputs_Nocolset})) } else if (*Fts5Colset)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FpColset)).FnCol == 0 { (*Fts5Iter)(unsafe.Pointer(pIter)).FxSetOutputs = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{fts5IterSetOutputs_ZeroColset})) } else if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_FULL { (*Fts5Iter)(unsafe.Pointer(pIter)).FxSetOutputs = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{fts5IterSetOutputs_Full})) } else { if (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol <= 100 { (*Fts5Iter)(unsafe.Pointer(pIter)).FxSetOutputs = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{fts5IterSetOutputs_Col100})) sqlite3Fts5BufferSize(tls, pRc, pIter+32, uint32((*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)) } else { (*Fts5Iter)(unsafe.Pointer(pIter)).FxSetOutputs = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr) }{fts5IterSetOutputs_Col})) } } } } func fts5MultiIterNew(tls *libc.TLS, p uintptr, pStruct uintptr, flags int32, pColset uintptr, pTerm uintptr, nTerm int32, iLevel int32, nSegment int32, ppOut uintptr) { var nSeg int32 var iIter int32 var iSeg int32 var pLvl uintptr var pNew uintptr var pIter uintptr var pSeg uintptr var pIter1 uintptr var pEnd uintptr var pSeg1 uintptr var iEq int32 var pSeg2 uintptr nSeg = 0 iIter = 0 if !((*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __1 } if !(iLevel < 0) { goto __2 } nSeg = (*Fts5Structure)(unsafe.Pointer(pStruct)).FnSegment nSeg = nSeg + func() int32 { if (*Fts5Index)(unsafe.Pointer(p)).FpHash != 0 { return 1 } return 0 }() goto __3 __2: nSeg = func() int32 { if (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLevel)*16)).FnSeg < nSegment { return (*Fts5StructureLevel)(unsafe.Pointer(pStruct + 24 + uintptr(iLevel)*16)).FnSeg } return nSegment }() __3: ; __1: ; *(*uintptr)(unsafe.Pointer(ppOut)) = libc.AssignUintptr(&pNew, fts5MultiIterAlloc(tls, p, nSeg)) if !(pNew == uintptr(0)) { goto __4 } goto fts5MultiIterNew_post_check __4: ; (*Fts5Iter)(unsafe.Pointer(pNew)).FbRev = libc.Bool32(0 != flags&FTS5INDEX_QUERY_DESC) (*Fts5Iter)(unsafe.Pointer(pNew)).FbSkipEmpty = U8(libc.Bool32(0 != flags&FTS5INDEX_QUERY_SKIPEMPTY)) (*Fts5Iter)(unsafe.Pointer(pNew)).FpColset = pColset if !(flags&FTS5INDEX_QUERY_NOOUTPUT == 0) { goto __5 } fts5IterSetOutputCb(tls, p+52, pNew) __5: ; if !((*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __6 } if !(iLevel < 0) { goto __7 } pEnd = pStruct + 24 + uintptr((*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel)*16 if !((*Fts5Index)(unsafe.Pointer(p)).FpHash != 0) { goto __9 } pIter = pNew + 96 + uintptr(libc.PostIncInt32(&iIter, 1))*120 fts5SegIterHashInit(tls, p, pTerm, nTerm, flags, pIter) __9: ; pLvl = pStruct + 24 __10: if !(pLvl < pEnd) { goto __12 } iSeg = (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg - 1 __13: if !(iSeg >= 0) { goto __15 } pSeg = (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg + uintptr(iSeg)*12 pIter1 = pNew + 96 + uintptr(libc.PostIncInt32(&iIter, 1))*120 if !(pTerm == uintptr(0)) { goto __16 } fts5SegIterInit(tls, p, pSeg, pIter1) goto __17 __16: fts5SegIterSeekInit(tls, p, pTerm, nTerm, flags, pSeg, pIter1) __17: ; goto __14 __14: iSeg-- goto __13 goto __15 __15: ; goto __11 __11: pLvl += 16 goto __10 goto __12 __12: ; goto __8 __7: pLvl = pStruct + 24 + uintptr(iLevel)*16 iSeg = nSeg - 1 __18: if !(iSeg >= 0) { goto __20 } fts5SegIterInit(tls, p, (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(iSeg)*12, pNew+96+uintptr(libc.PostIncInt32(&iIter, 1))*120) goto __19 __19: iSeg-- goto __18 goto __20 __20: ; __8: ; __6: ; if !((*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __21 } iIter = (*Fts5Iter)(unsafe.Pointer(pNew)).FnSeg - 1 __23: if !(iIter > 0) { goto __25 } if !(libc.AssignInt32(&iEq, fts5MultiIterDoCompare(tls, pNew, iIter)) != 0) { goto __26 } pSeg1 = pNew + 96 + uintptr(iEq)*120 if !((*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK) { goto __27 } (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5SegIter)(unsafe.Pointer(pSeg1)).FxNext})).f(tls, p, pSeg1, uintptr(0)) __27: ; fts5MultiIterAdvanced(tls, p, pNew, iEq, iIter) __26: ; goto __24 __24: iIter-- goto __23 goto __25 __25: ; fts5MultiIterSetEof(tls, pNew) if !((*Fts5Iter)(unsafe.Pointer(pNew)).FbSkipEmpty != 0 && fts5MultiIterIsEmpty(tls, p, pNew) != 0) { goto __28 } fts5MultiIterNext(tls, p, pNew, 0, int64(0)) goto __29 __28: if !(int32((*Fts5Iter)(unsafe.Pointer(pNew)).Fbase.FbEof) == 0) { goto __30 } pSeg2 = pNew + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pNew)).FaFirst+1*4)).FiFirst)*120 (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Iter)(unsafe.Pointer(pNew)).FxSetOutputs})).f(tls, pNew, pSeg2) __30: ; __29: ; goto __22 __21: fts5MultiIterFree(tls, pNew) *(*uintptr)(unsafe.Pointer(ppOut)) = uintptr(0) __22: ; fts5MultiIterNew_post_check: ; return } func fts5MultiIterNew2(tls *libc.TLS, p uintptr, pData uintptr, bDesc int32, ppOut uintptr) { var pNew uintptr pNew = fts5MultiIterAlloc(tls, p, 2) if pNew != 0 { var pIter uintptr = pNew + 96 + 1*120 (*Fts5SegIter)(unsafe.Pointer(pIter)).Fflags = FTS5_SEGITER_ONETERM if (*Fts5Data)(unsafe.Pointer(pData)).FszLeaf > 0 { (*Fts5SegIter)(unsafe.Pointer(pIter)).FpLeaf = pData (*Fts5SegIter)(unsafe.Pointer(pIter)).FiLeafOffset = I64(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp, pIter+104)) (*Fts5SegIter)(unsafe.Pointer(pIter)).FiEndofDoclist = (*Fts5Data)(unsafe.Pointer(pData)).Fnn (*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pNew)).FaFirst + 1*4)).FiFirst = U16(1) if bDesc != 0 { (*Fts5Iter)(unsafe.Pointer(pNew)).FbRev = 1 *(*int32)(unsafe.Pointer(pIter + 8)) |= FTS5_SEGITER_REVERSE fts5SegIterReverseInitPage(tls, p, pIter) } else { fts5SegIterLoadNPos(tls, p, pIter) } pData = uintptr(0) } else { (*Fts5Iter)(unsafe.Pointer(pNew)).Fbase.FbEof = U8(1) } fts5SegIterSetNext(tls, p, pIter) *(*uintptr)(unsafe.Pointer(ppOut)) = pNew } fts5DataRelease(tls, pData) } func fts5MultiIterEof(tls *libc.TLS, p uintptr, pIter uintptr) int32 { return libc.Bool32((*Fts5Index)(unsafe.Pointer(p)).Frc != 0 || (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FbEof != 0) } func fts5MultiIterRowid(tls *libc.TLS, pIter uintptr) I64 { return (*Fts5SegIter)(unsafe.Pointer(pIter + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst+1*4)).FiFirst)*120)).FiRowid } func fts5MultiIterNextFrom(tls *libc.TLS, p uintptr, pIter uintptr, iMatch I64) { for 1 != 0 { var iRowid I64 fts5MultiIterNext(tls, p, pIter, 1, iMatch) if fts5MultiIterEof(tls, p, pIter) != 0 { break } iRowid = fts5MultiIterRowid(tls, pIter) if (*Fts5Iter)(unsafe.Pointer(pIter)).FbRev == 0 && iRowid >= iMatch { break } if (*Fts5Iter)(unsafe.Pointer(pIter)).FbRev != 0 && iRowid <= iMatch { break } } } func fts5MultiIterTerm(tls *libc.TLS, pIter uintptr, pn uintptr) uintptr { var p uintptr = pIter + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst+1*4)).FiFirst)*120 *(*int32)(unsafe.Pointer(pn)) = (*Fts5SegIter)(unsafe.Pointer(p)).Fterm.Fn return (*Fts5SegIter)(unsafe.Pointer(p)).Fterm.Fp } func fts5AllocateSegid(tls *libc.TLS, p uintptr, pStruct uintptr) int32 { bp := tls.Alloc(252) defer tls.Free(252) var iSegid int32 = 0 if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { if (*Fts5Structure)(unsafe.Pointer(pStruct)).FnSegment >= FTS5_MAX_SEGMENT { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_FULL } else { var iLvl int32 var iSeg int32 var i int32 var mask U32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof([63]U32{}))) for iLvl = 0; iLvl < (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel; iLvl++ { for iSeg = 0; iSeg < (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FnSeg; iSeg++ { var iId int32 = (*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FaSeg + uintptr(iSeg)*12)).FiSegid if iId <= FTS5_MAX_SEGMENT && iId > 0 { *(*U32)(unsafe.Pointer(bp + uintptr((iId-1)/32)*4)) |= U32(1) << ((iId - 1) % 32) } } } for i = 0; *(*U32)(unsafe.Pointer(bp + uintptr(i)*4)) == 0xFFFFFFFF; i++ { } mask = *(*U32)(unsafe.Pointer(bp + uintptr(i)*4)) for iSegid = 0; mask&(U32(1)<= (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnDlidx { var aDlidx uintptr = Xsqlite3_realloc64(tls, (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx, uint64(unsafe.Sizeof(Fts5DlidxWriter{}))*uint64(nLvl)) if aDlidx == uintptr(0) { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_NOMEM } else { var nByte Size_t = uint64(unsafe.Sizeof(Fts5DlidxWriter{})) * uint64(nLvl-(*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnDlidx) libc.Xmemset(tls, aDlidx+uintptr((*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnDlidx)*32, 0, nByte) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx = aDlidx (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnDlidx = nLvl } } return (*Fts5Index)(unsafe.Pointer(p)).Frc } func fts5WriteFlushDlidx(tls *libc.TLS, p uintptr, pWriter uintptr) int32 { var bFlag int32 = 0 if (*Fts5DlidxWriter)(unsafe.Pointer((*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx)).Fbuf.Fn > 0 && (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnEmpty >= FTS5_MIN_DLIDX_SIZE { bFlag = 1 } fts5WriteDlidxClear(tls, p, pWriter, bFlag) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnEmpty = 0 return bFlag } func fts5WriteFlushBtree(tls *libc.TLS, p uintptr, pWriter uintptr) { var bFlag int32 if (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiBtPage == 0 { return } bFlag = fts5WriteFlushDlidx(tls, p, pWriter) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var z uintptr = func() uintptr { if (*Fts5SegWriter)(unsafe.Pointer(pWriter)).Fbtterm.Fn > 0 { return (*Fts5SegWriter)(unsafe.Pointer(pWriter)).Fbtterm.Fp } return ts + 1544 }() Xsqlite3_bind_blob(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter, 2, z, (*Fts5SegWriter)(unsafe.Pointer(pWriter)).Fbtterm.Fn, uintptr(0)) Xsqlite3_bind_int64(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter, 3, I64(bFlag)+I64((*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiBtPage)<<1) Xsqlite3_step(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter) (*Fts5Index)(unsafe.Pointer(p)).Frc = Xsqlite3_reset(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter) Xsqlite3_bind_null(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter, 2) } (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiBtPage = 0 } func fts5WriteBtreeTerm(tls *libc.TLS, p uintptr, pWriter uintptr, nTerm int32, pTerm uintptr) { fts5WriteFlushBtree(tls, p, pWriter) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { sqlite3Fts5BufferSet(tls, p+52, pWriter+96, nTerm, pTerm) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiBtPage = (*Fts5SegWriter)(unsafe.Pointer(pWriter)).Fwriter.Fpgno } } func fts5WriteBtreeNoTerm(tls *libc.TLS, p uintptr, pWriter uintptr) { if (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInPage != 0 && (*Fts5DlidxWriter)(unsafe.Pointer((*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx)).Fbuf.Fn > 0 { var pDlidx uintptr = (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx sqlite3Fts5BufferAppendVarint(tls, p+52, pDlidx+16, int64(0)) } (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnEmpty++ } func fts5DlidxExtractFirstRowid(tls *libc.TLS, pBuf uintptr) I64 { bp := tls.Alloc(8) defer tls.Free(8) var iOff int32 iOff = 1 + int32(sqlite3Fts5GetVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+1, bp)) sqlite3Fts5GetVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr(iOff), bp) return *(*I64)(unsafe.Pointer(bp)) } func fts5WriteDlidxAppend(tls *libc.TLS, p uintptr, pWriter uintptr, iRowid I64) { var i int32 var bDone int32 = 0 for i = 0; (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && bDone == 0; i++ { var iVal I64 var pDlidx uintptr = (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx + uintptr(i)*32 if (*Fts5DlidxWriter)(unsafe.Pointer(pDlidx)).Fbuf.Fn >= (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fpgsz { *(*U8)(unsafe.Pointer((*Fts5DlidxWriter)(unsafe.Pointer(pDlidx)).Fbuf.Fp)) = U8(0x01) fts5DataWrite(tls, p, I64((*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(1)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+I64(i)<= (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fpgsz { if (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fn > 4 { fts5WriteFlushLeaf(tls, p, pWriter) if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { return } } if !(U32((*Fts5Buffer)(unsafe.Pointer(pPage+8)).Fn)+U32(nTerm+FTS5_DATA_PADDING) <= U32((*Fts5Buffer)(unsafe.Pointer(pPage+8)).FnSpace)) { sqlite3Fts5BufferSize(tls, p+52, pPage+8, uint32(nTerm+FTS5_DATA_PADDING+(*Fts5Buffer)(unsafe.Pointer(pPage+8)).Fn)) } } *(*int32)(unsafe.Pointer(pPgidx + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pPgidx)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pPgidx)).Fn), uint64((*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fn-(*Fts5PageWriter)(unsafe.Pointer(pPage)).FiPrevPgidx)) (*Fts5PageWriter)(unsafe.Pointer(pPage)).FiPrevPgidx = (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fn if (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstTermInPage != 0 { nPrefix = 0 if (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fpgno != 1 { var n int32 = nTerm if (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fterm.Fn != 0 { n = 1 + fts5PrefixCompress(tls, nMin, (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fterm.Fp, pTerm) } fts5WriteBtreeTerm(tls, p, pWriter, n, pTerm) if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { return } pPage = pWriter + 8 } } else { nPrefix = fts5PrefixCompress(tls, nMin, (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fterm.Fp, pTerm) sqlite3Fts5BufferAppendVarint(tls, p+52, pPage+8, I64(nPrefix)) } sqlite3Fts5BufferAppendVarint(tls, p+52, pPage+8, I64(nTerm)-I64(nPrefix)) sqlite3Fts5BufferAppendBlob(tls, p+52, pPage+8, uint32(nTerm-nPrefix), pTerm+uintptr(nPrefix)) sqlite3Fts5BufferSet(tls, p+52, pPage+40, nTerm, pTerm) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstTermInPage = U8(0) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInPage = U8(0) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInDoclist = U8(1) (*Fts5DlidxWriter)(unsafe.Pointer((*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx)).Fpgno = (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fpgno } func fts5WriteAppendRowid(tls *libc.TLS, p uintptr, pWriter uintptr, iRowid I64) { if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var pPage uintptr = pWriter + 8 if (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fn+(*Fts5PageWriter)(unsafe.Pointer(pPage)).Fpgidx.Fn >= (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fpgsz { fts5WriteFlushLeaf(tls, p, pWriter) } if (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInPage != 0 { fts5PutU16(tls, (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fp, U16((*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fn)) fts5WriteDlidxAppend(tls, p, pWriter, iRowid) } if (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInDoclist != 0 || (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInPage != 0 { sqlite3Fts5BufferAppendVarint(tls, p+52, pPage+8, iRowid) } else { sqlite3Fts5BufferAppendVarint(tls, p+52, pPage+8, int64(U64(I64(U64(iRowid)))-U64((*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiPrevRowid))) } (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiPrevRowid = iRowid (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInDoclist = U8(0) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstRowidInPage = U8(0) } } func fts5WriteAppendPoslistData(tls *libc.TLS, p uintptr, pWriter uintptr, aData uintptr, nData int32) { bp := tls.Alloc(8) defer tls.Free(8) var pPage uintptr = pWriter + 8 var a uintptr = aData var n int32 = nData for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fn+(*Fts5PageWriter)(unsafe.Pointer(pPage)).Fpgidx.Fn+n >= (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fpgsz { var nReq int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fpgsz - (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fbuf.Fn - (*Fts5PageWriter)(unsafe.Pointer(pPage)).Fpgidx.Fn var nCopy int32 = 0 for nCopy < nReq { nCopy = nCopy + int32(sqlite3Fts5GetVarint(tls, a+uintptr(nCopy), bp)) } sqlite3Fts5BufferAppendBlob(tls, p+52, pPage+8, uint32(nCopy), a) a += uintptr(nCopy) n = n - nCopy fts5WriteFlushLeaf(tls, p, pWriter) } if n > 0 { sqlite3Fts5BufferAppendBlob(tls, p+52, pPage+8, uint32(n), a) } } func fts5WriteFinish(tls *libc.TLS, p uintptr, pWriter uintptr, pnLeaf uintptr) { var i int32 var pLeaf uintptr = pWriter + 8 if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { if (*Fts5PageWriter)(unsafe.Pointer(pLeaf)).Fbuf.Fn > 4 { fts5WriteFlushLeaf(tls, p, pWriter) } *(*int32)(unsafe.Pointer(pnLeaf)) = (*Fts5PageWriter)(unsafe.Pointer(pLeaf)).Fpgno - 1 if (*Fts5PageWriter)(unsafe.Pointer(pLeaf)).Fpgno > 1 { fts5WriteFlushBtree(tls, p, pWriter) } } sqlite3Fts5BufferFree(tls, pLeaf+40) sqlite3Fts5BufferFree(tls, pLeaf+8) sqlite3Fts5BufferFree(tls, pLeaf+24) sqlite3Fts5BufferFree(tls, pWriter+96) for i = 0; i < (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FnDlidx; i++ { sqlite3Fts5BufferFree(tls, (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx+uintptr(i)*32+16) } Xsqlite3_free(tls, (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FaDlidx) } func fts5WriteInit(tls *libc.TLS, p uintptr, pWriter uintptr, iSegid int32) { bp := tls.Alloc(16) defer tls.Free(16) var nBuffer int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fpgsz + FTS5_DATA_PADDING libc.Xmemset(tls, pWriter, 0, uint64(unsafe.Sizeof(Fts5SegWriter{}))) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiSegid = iSegid fts5WriteDlidxGrow(tls, p, pWriter, 1) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).Fwriter.Fpgno = 1 (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FbFirstTermInPage = U8(1) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiBtPage = 1 sqlite3Fts5BufferSize(tls, p+52, pWriter+8+24, uint32(nBuffer)) sqlite3Fts5BufferSize(tls, p+52, pWriter+8+8, uint32(nBuffer)) if (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter == uintptr(0) { var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig fts5IndexPrepareStmt(tls, p, p+80, Xsqlite3_mprintf(tls, ts+36505, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName))) } if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { libc.Xmemset(tls, (*Fts5SegWriter)(unsafe.Pointer(pWriter)).Fwriter.Fbuf.Fp, 0, uint64(4)) (*Fts5SegWriter)(unsafe.Pointer(pWriter)).Fwriter.Fbuf.Fn = 4 Xsqlite3_bind_int(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter, 1, (*Fts5SegWriter)(unsafe.Pointer(pWriter)).FiSegid) } } func fts5TrimSegments(tls *libc.TLS, p uintptr, pIter uintptr) { bp := tls.Alloc(20) defer tls.Free(20) var i int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) for i = 0; i < (*Fts5Iter)(unsafe.Pointer(pIter)).FnSeg && (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK; i++ { var pSeg uintptr = pIter + 96 + uintptr(i)*120 if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpSeg == uintptr(0) { } else if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf == uintptr(0) { (*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpSeg)).FpgnoLast = 0 (*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpSeg)).FpgnoFirst = 0 } else { var iOff int32 = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiTermLeafOffset var iLeafRowid I64 var pData uintptr var iId int32 = (*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpSeg)).FiSegid *(*[4]U8)(unsafe.Pointer(bp + 16)) = [4]U8{U8(0x00), U8(0x00), U8(0x00), U8(0x00)} iLeafRowid = I64(iId)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B) + int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B) + int64(0)< (*Fts5Data)(unsafe.Pointer(pData)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { sqlite3Fts5BufferZero(tls, bp) if !(U32((*Fts5Buffer)(unsafe.Pointer(bp)).Fn)+U32((*Fts5Data)(unsafe.Pointer(pData)).Fnn) <= U32((*Fts5Buffer)(unsafe.Pointer(bp)).FnSpace)) { sqlite3Fts5BufferSize(tls, p+52, bp, uint32((*Fts5Data)(unsafe.Pointer(pData)).Fnn+(*Fts5Buffer)(unsafe.Pointer(bp)).Fn)) } sqlite3Fts5BufferAppendBlob(tls, p+52, bp, uint32(unsafe.Sizeof([4]U8{})), bp+16) sqlite3Fts5BufferAppendVarint(tls, p+52, bp, I64((*Fts5SegIter)(unsafe.Pointer(pSeg)).Fterm.Fn)) sqlite3Fts5BufferAppendBlob(tls, p+52, bp, uint32((*Fts5SegIter)(unsafe.Pointer(pSeg)).Fterm.Fn), (*Fts5SegIter)(unsafe.Pointer(pSeg)).Fterm.Fp) sqlite3Fts5BufferAppendBlob(tls, p+52, bp, uint32((*Fts5Data)(unsafe.Pointer(pData)).FszLeaf-iOff), (*Fts5Data)(unsafe.Pointer(pData)).Fp+uintptr(iOff)) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { fts5PutU16(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp+2, U16((*Fts5Buffer)(unsafe.Pointer(bp)).Fn)) } sqlite3Fts5BufferAppendVarint(tls, p+52, bp, int64(4)) if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiLeafPgno == (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiTermLeafPgno && (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiEndofDoclist < (*Fts5Data)(unsafe.Pointer(pData)).FszLeaf && (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiPgidxOff <= (*Fts5Data)(unsafe.Pointer(pData)).Fnn { var nDiff int32 = (*Fts5Data)(unsafe.Pointer(pData)).FszLeaf - (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiEndofDoclist sqlite3Fts5BufferAppendVarint(tls, p+52, bp, I64((*Fts5Buffer)(unsafe.Pointer(bp)).Fn)-int64(1)-I64(nDiff)-int64(4)) sqlite3Fts5BufferAppendBlob(tls, p+52, bp, uint32((*Fts5Data)(unsafe.Pointer(pData)).Fnn-(*Fts5SegIter)(unsafe.Pointer(pSeg)).FiPgidxOff), (*Fts5Data)(unsafe.Pointer(pData)).Fp+uintptr((*Fts5SegIter)(unsafe.Pointer(pSeg)).FiPgidxOff)) } (*Fts5StructureSegment)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).FpSeg)).FpgnoFirst = (*Fts5SegIter)(unsafe.Pointer(pSeg)).FiTermLeafPgno fts5DataDelete(tls, p, I64(iId)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+int64(0)< nRem { break } sqlite3Fts5BufferSet(tls, p+52, bp+120, *(*int32)(unsafe.Pointer(bp + 144)), pTerm) bTermWritten = 0 } if (*Fts5SegIter)(unsafe.Pointer(pSegIter)).FnPos == 0 && (bOldest != 0 || int32((*Fts5SegIter)(unsafe.Pointer(pSegIter)).FbDel) == 0) { continue } if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && bTermWritten == 0 { fts5WriteAppendTerm(tls, p, bp, *(*int32)(unsafe.Pointer(bp + 144)), pTerm) bTermWritten = 1 } fts5WriteAppendRowid(tls, p, bp, fts5MultiIterRowid(tls, *(*uintptr)(unsafe.Pointer(bp + 136)))) if eDetail == FTS5_DETAIL_NONE { if (*Fts5SegIter)(unsafe.Pointer(pSegIter)).FbDel != 0 { sqlite3Fts5BufferAppendVarint(tls, p+52, bp+8+8, int64(0)) if (*Fts5SegIter)(unsafe.Pointer(pSegIter)).FnPos > 0 { sqlite3Fts5BufferAppendVarint(tls, p+52, bp+8+8, int64(0)) } } } else { nPos = (*Fts5SegIter)(unsafe.Pointer(pSegIter)).FnPos*2 + int32((*Fts5SegIter)(unsafe.Pointer(pSegIter)).FbDel) sqlite3Fts5BufferAppendVarint(tls, p+52, bp+8+8, I64(nPos)) fts5ChunkIterate(tls, p, pSegIter, bp, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32) }{fts5MergeChunkCallback}))) } } fts5WriteFinish(tls, p, bp, pSeg+8) if fts5MultiIterEof(tls, p, *(*uintptr)(unsafe.Pointer(bp + 136))) != 0 { var i int32 for i = 0; i < nInput; i++ { fts5DataRemoveSegment(tls, p, (*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(i)*12)).FiSegid) } if (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg != nInput { var nMove int32 = int32(uint64((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg-nInput) * uint64(unsafe.Sizeof(Fts5StructureSegment{}))) libc.Xmemmove(tls, (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg, (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg+uintptr(nInput)*12, uint64(nMove)) } *(*int32)(unsafe.Pointer(pStruct + 16)) -= nInput *(*int32)(unsafe.Pointer(pLvl + 4)) -= nInput (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge = 0 if (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast == 0 { (*Fts5StructureLevel)(unsafe.Pointer(pLvlOut)).FnSeg-- (*Fts5Structure)(unsafe.Pointer(pStruct)).FnSegment-- } } else { fts5TrimSegments(tls, p, *(*uintptr)(unsafe.Pointer(bp + 136))) (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge = nInput } fts5MultiIterFree(tls, *(*uintptr)(unsafe.Pointer(bp + 136))) sqlite3Fts5BufferFree(tls, bp+120) if pnRem != 0 { *(*int32)(unsafe.Pointer(pnRem)) -= (*Fts5SegWriter)(unsafe.Pointer(bp)).FnLeafWritten } } func fts5IndexMerge(tls *libc.TLS, p uintptr, ppStruct uintptr, nPg int32, nMin int32) int32 { bp := tls.Alloc(12) defer tls.Free(12) *(*int32)(unsafe.Pointer(bp + 8)) = nPg var bRet int32 = 0 *(*uintptr)(unsafe.Pointer(bp)) = *(*uintptr)(unsafe.Pointer(ppStruct)) for *(*int32)(unsafe.Pointer(bp + 8)) > 0 && (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var iLvl int32 var iBestLvl int32 = 0 var nBest int32 = 0 for iLvl = 0; iLvl < (*Fts5Structure)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnLevel; iLvl++ { var pLvl uintptr = *(*uintptr)(unsafe.Pointer(bp)) + 24 + uintptr(iLvl)*16 if (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge != 0 { if (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge > nBest { iBestLvl = iLvl nBest = (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnMerge } break } if (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg > nBest { nBest = (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FnSeg iBestLvl = iLvl } } if nBest < nMin && (*Fts5StructureLevel)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))+24+uintptr(iBestLvl)*16)).FnMerge == 0 { break } bRet = 1 fts5IndexMergeLevel(tls, p, bp, iBestLvl, bp+8) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5StructureLevel)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))+24+uintptr(iBestLvl)*16)).FnMerge == 0 { fts5StructurePromote(tls, p, iBestLvl+1, *(*uintptr)(unsafe.Pointer(bp))) } } *(*uintptr)(unsafe.Pointer(ppStruct)) = *(*uintptr)(unsafe.Pointer(bp)) return bRet } func fts5IndexAutomerge(tls *libc.TLS, p uintptr, ppStruct uintptr, nLeaf int32) { if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FnAutomerge > 0 && *(*uintptr)(unsafe.Pointer(ppStruct)) != uintptr(0) { var pStruct uintptr = *(*uintptr)(unsafe.Pointer(ppStruct)) var nWrite U64 var nWork int32 var nRem int32 nWrite = (*Fts5Structure)(unsafe.Pointer(pStruct)).FnWriteCounter nWork = int32((nWrite+U64(nLeaf))/U64((*Fts5Index)(unsafe.Pointer(p)).FnWorkUnit) - nWrite/U64((*Fts5Index)(unsafe.Pointer(p)).FnWorkUnit)) *(*U64)(unsafe.Pointer(pStruct + 8)) += U64(nLeaf) nRem = (*Fts5Index)(unsafe.Pointer(p)).FnWorkUnit * nWork * (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel fts5IndexMerge(tls, p, ppStruct, nRem, (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FnAutomerge) } } func fts5IndexCrisismerge(tls *libc.TLS, p uintptr, ppStruct uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var nCrisis int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FnCrisisMerge *(*uintptr)(unsafe.Pointer(bp)) = *(*uintptr)(unsafe.Pointer(ppStruct)) var iLvl int32 = 0 for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5StructureLevel)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))+24+uintptr(iLvl)*16)).FnSeg >= nCrisis { fts5IndexMergeLevel(tls, p, bp, iLvl, uintptr(0)) fts5StructurePromote(tls, p, iLvl+1, *(*uintptr)(unsafe.Pointer(bp))) iLvl++ } *(*uintptr)(unsafe.Pointer(ppStruct)) = *(*uintptr)(unsafe.Pointer(bp)) } func fts5IndexReturn(tls *libc.TLS, p uintptr) int32 { var rc int32 = (*Fts5Index)(unsafe.Pointer(p)).Frc (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_OK return rc } type Fts5FlushCtx1 = struct { FpIdx uintptr Fwriter Fts5SegWriter } type Fts5FlushCtx = Fts5FlushCtx1 func fts5PoslistPrefix(tls *libc.TLS, aBuf uintptr, nMax int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var ret int32 ret = sqlite3Fts5GetVarint32(tls, aBuf, bp) if ret < nMax { for 1 != 0 { var i int32 = sqlite3Fts5GetVarint32(tls, aBuf+uintptr(ret), bp) if ret+i > nMax { break } ret = ret + i } } return ret } func fts5FlushOneHash(tls *libc.TLS, p uintptr) { bp := tls.Alloc(176) defer tls.Free(176) var pHash uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpHash var iSegid int32 *(*int32)(unsafe.Pointer(bp + 160)) = 0 *(*uintptr)(unsafe.Pointer(bp + 168)) = fts5StructureRead(tls, p) iSegid = fts5AllocateSegid(tls, p, *(*uintptr)(unsafe.Pointer(bp + 168))) fts5StructureInvalidate(tls, p) if iSegid != 0 { var pgsz int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).Fpgsz var eDetail int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FeDetail var pSeg uintptr var pBuf uintptr var pPgidx uintptr fts5WriteInit(tls, p, bp, iSegid) pBuf = bp + 8 + 8 pPgidx = bp + 8 + 24 if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Fts5Index)(unsafe.Pointer(p)).Frc = sqlite3Fts5HashScanInit(tls, pHash, uintptr(0), 0) } for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && 0 == sqlite3Fts5HashScanEof(tls, pHash) { sqlite3Fts5HashScanEntry(tls, pHash, bp+120, bp+128, bp+136) fts5WriteAppendTerm(tls, p, bp, int32(libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(bp + 120)))), *(*uintptr)(unsafe.Pointer(bp + 120))) if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { break } if pgsz >= (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn+(*Fts5Buffer)(unsafe.Pointer(pPgidx)).Fn+*(*int32)(unsafe.Pointer(bp + 136))+1 { { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), *(*uintptr)(unsafe.Pointer(bp + 128)), uint64(*(*int32)(unsafe.Pointer(bp + 136)))) *(*int32)(unsafe.Pointer(pBuf + 8)) += *(*int32)(unsafe.Pointer(bp + 136)) } } else { var iRowid I64 = int64(0) *(*U64)(unsafe.Pointer(bp + 144)) = uint64(0) var iOff int32 = 0 for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && iOff < *(*int32)(unsafe.Pointer(bp + 136)) { iOff = iOff + int32(sqlite3Fts5GetVarint(tls, *(*uintptr)(unsafe.Pointer(bp + 128))+uintptr(iOff), bp+144)) iRowid = I64(U64(iRowid) + *(*U64)(unsafe.Pointer(bp + 144))) if (*Fts5SegWriter)(unsafe.Pointer(bp)).FbFirstRowidInPage != 0 { fts5PutU16(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp, U16((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)) *(*int32)(unsafe.Pointer(pBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), uint64(iRowid)) (*Fts5SegWriter)(unsafe.Pointer(bp)).FbFirstRowidInPage = U8(0) fts5WriteDlidxAppend(tls, p, bp, iRowid) if (*Fts5Index)(unsafe.Pointer(p)).Frc != SQLITE_OK { break } } else { *(*int32)(unsafe.Pointer(pBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), *(*U64)(unsafe.Pointer(bp + 144))) } if eDetail == FTS5_DETAIL_NONE { if iOff < *(*int32)(unsafe.Pointer(bp + 136)) && int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 128)) + uintptr(iOff)))) == 0 { *(*U8)(unsafe.Pointer((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp + uintptr(libc.PostIncInt32(&(*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn, 1)))) = U8(0) iOff++ if iOff < *(*int32)(unsafe.Pointer(bp + 136)) && int32(*(*U8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 128)) + uintptr(iOff)))) == 0 { *(*U8)(unsafe.Pointer((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp + uintptr(libc.PostIncInt32(&(*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn, 1)))) = U8(0) iOff++ } } if (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn+(*Fts5Buffer)(unsafe.Pointer(pPgidx)).Fn >= pgsz { fts5WriteFlushLeaf(tls, p, bp) } } else { var nCopy int32 = fts5GetPoslistSize(tls, *(*uintptr)(unsafe.Pointer(bp + 128))+uintptr(iOff), bp+152, bp+156) nCopy = nCopy + *(*int32)(unsafe.Pointer(bp + 152)) if (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn+(*Fts5Buffer)(unsafe.Pointer(pPgidx)).Fn+nCopy <= pgsz { { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), *(*uintptr)(unsafe.Pointer(bp + 128))+uintptr(iOff), uint64(nCopy)) *(*int32)(unsafe.Pointer(pBuf + 8)) += nCopy } } else { var pPoslist uintptr = *(*uintptr)(unsafe.Pointer(bp + 128)) + uintptr(iOff) var iPos int32 = 0 for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var nSpace int32 = pgsz - (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn - (*Fts5Buffer)(unsafe.Pointer(pPgidx)).Fn var n int32 = 0 if nCopy-iPos <= nSpace { n = nCopy - iPos } else { n = fts5PoslistPrefix(tls, pPoslist+uintptr(iPos), nSpace) } { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), pPoslist+uintptr(iPos), uint64(n)) *(*int32)(unsafe.Pointer(pBuf + 8)) += n } iPos = iPos + n if (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn+(*Fts5Buffer)(unsafe.Pointer(pPgidx)).Fn >= pgsz { fts5WriteFlushLeaf(tls, p, bp) } if iPos >= nCopy { break } } } iOff = iOff + nCopy } } } if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { sqlite3Fts5HashScanNext(tls, pHash) } } sqlite3Fts5HashClear(tls, pHash) fts5WriteFinish(tls, p, bp, bp+160) if (*Fts5Structure)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 168)))).FnLevel == 0 { fts5StructureAddLevel(tls, p+52, bp+168) } fts5StructureExtendLevel(tls, p+52, *(*uintptr)(unsafe.Pointer(bp + 168)), 0, 1, 0) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { pSeg = (*Fts5StructureLevel)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 168))+24)).FaSeg + uintptr(libc.PostIncInt32(&(*Fts5StructureLevel)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 168))+24)).FnSeg, 1))*12 (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FiSegid = iSegid (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst = 1 (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast = *(*int32)(unsafe.Pointer(bp + 160)) (*Fts5Structure)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 168)))).FnSegment++ } fts5StructurePromote(tls, p, 0, *(*uintptr)(unsafe.Pointer(bp + 168))) } fts5IndexAutomerge(tls, p, bp+168, *(*int32)(unsafe.Pointer(bp + 160))) fts5IndexCrisismerge(tls, p, bp+168) fts5StructureWrite(tls, p, *(*uintptr)(unsafe.Pointer(bp + 168))) fts5StructureRelease(tls, *(*uintptr)(unsafe.Pointer(bp + 168))) } func fts5IndexFlush(tls *libc.TLS, p uintptr) { if (*Fts5Index)(unsafe.Pointer(p)).FnPendingData != 0 { (*Fts5Index)(unsafe.Pointer(p)).FnPendingData = 0 fts5FlushOneHash(tls, p) } } func fts5IndexOptimizeStruct(tls *libc.TLS, p uintptr, pStruct uintptr) uintptr { var pNew uintptr = uintptr(0) var nByte Sqlite3_int64 = Sqlite3_int64(unsafe.Sizeof(Fts5Structure{})) var nSeg int32 = (*Fts5Structure)(unsafe.Pointer(pStruct)).FnSegment var i int32 if nSeg < 2 { return uintptr(0) } for i = 0; i < (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel; i++ { var nThis int32 = (*Fts5StructureLevel)(unsafe.Pointer(pStruct + 24 + uintptr(i)*16)).FnSeg if nThis == nSeg || nThis == nSeg-1 && (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(i)*16)).FnMerge == nThis { fts5StructureRef(tls, pStruct) return pStruct } } nByte = Sqlite3_int64(uint64(nByte) + uint64((*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel+1)*uint64(unsafe.Sizeof(Fts5StructureLevel{}))) pNew = sqlite3Fts5MallocZero(tls, p+52, nByte) if pNew != 0 { var pLvl uintptr nByte = Sqlite3_int64(uint64(nSeg) * uint64(unsafe.Sizeof(Fts5StructureSegment{}))) (*Fts5Structure)(unsafe.Pointer(pNew)).FnLevel = func() int32 { if (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel+1 < FTS5_MAX_LEVEL { return (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel + 1 } return FTS5_MAX_LEVEL }() (*Fts5Structure)(unsafe.Pointer(pNew)).FnRef = 1 (*Fts5Structure)(unsafe.Pointer(pNew)).FnWriteCounter = (*Fts5Structure)(unsafe.Pointer(pStruct)).FnWriteCounter pLvl = pNew + 24 + uintptr((*Fts5Structure)(unsafe.Pointer(pNew)).FnLevel-1)*16 (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg = sqlite3Fts5MallocZero(tls, p+52, nByte) if (*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg != 0 { var iLvl int32 var iSeg int32 var iSegOut int32 = 0 for iLvl = (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel - 1; iLvl >= 0; iLvl-- { for iSeg = 0; iSeg < (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FnSeg; iSeg++ { *(*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pLvl)).FaSeg + uintptr(iSegOut)*12)) = *(*Fts5StructureSegment)(unsafe.Pointer((*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FaSeg + uintptr(iSeg)*12)) iSegOut++ } } (*Fts5Structure)(unsafe.Pointer(pNew)).FnSegment = libc.AssignPtrInt32(pLvl+4, nSeg) } else { Xsqlite3_free(tls, pNew) pNew = uintptr(0) } } return pNew } func sqlite3Fts5IndexOptimize(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var pStruct uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) fts5IndexFlush(tls, p) pStruct = fts5StructureRead(tls, p) fts5StructureInvalidate(tls, p) if pStruct != 0 { *(*uintptr)(unsafe.Pointer(bp)) = fts5IndexOptimizeStruct(tls, p, pStruct) } fts5StructureRelease(tls, pStruct) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { var iLvl int32 for iLvl = 0; (*Fts5StructureLevel)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))+24+uintptr(iLvl)*16)).FnSeg == 0; iLvl++ { } for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5StructureLevel)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))+24+uintptr(iLvl)*16)).FnSeg > 0 { *(*int32)(unsafe.Pointer(bp + 8)) = FTS5_OPT_WORK_UNIT fts5IndexMergeLevel(tls, p, bp, iLvl, bp+8) } fts5StructureWrite(tls, p, *(*uintptr)(unsafe.Pointer(bp))) fts5StructureRelease(tls, *(*uintptr)(unsafe.Pointer(bp))) } return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexMerge(tls *libc.TLS, p uintptr, nMerge int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = fts5StructureRead(tls, p) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { var nMin int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FnUsermerge fts5StructureInvalidate(tls, p) if nMerge < 0 { var pNew uintptr = fts5IndexOptimizeStruct(tls, p, *(*uintptr)(unsafe.Pointer(bp))) fts5StructureRelease(tls, *(*uintptr)(unsafe.Pointer(bp))) *(*uintptr)(unsafe.Pointer(bp)) = pNew nMin = 2 nMerge = nMerge * -1 } if *(*uintptr)(unsafe.Pointer(bp)) != 0 && (*Fts5Structure)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FnLevel != 0 { if fts5IndexMerge(tls, p, bp, nMerge, nMin) != 0 { fts5StructureWrite(tls, p, *(*uintptr)(unsafe.Pointer(bp))) } } fts5StructureRelease(tls, *(*uintptr)(unsafe.Pointer(bp))) } return fts5IndexReturn(tls, p) } func fts5AppendRowid(tls *libc.TLS, p uintptr, iDelta U64, pUnused uintptr, pBuf uintptr) { _ = pUnused sqlite3Fts5BufferAppendVarint(tls, p+52, pBuf, I64(iDelta)) } func fts5AppendPoslist(tls *libc.TLS, p uintptr, iDelta U64, pMulti uintptr, pBuf uintptr) { var nData int32 = (*Fts5Iter)(unsafe.Pointer(pMulti)).Fbase.FnData var nByte int32 = nData + 9 + 9 + FTS5_DATA_ZERO_PADDING if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && 0 == func() int32 { if U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)+U32(nByte) <= U32((*Fts5Buffer)(unsafe.Pointer(pBuf)).FnSpace) { return 0 } return sqlite3Fts5BufferSize(tls, p+52, pBuf, uint32(nByte+(*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn)) }() { { *(*int32)(unsafe.Pointer(pBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), iDelta) } { *(*int32)(unsafe.Pointer(pBuf + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), uint64(nData*2)) } { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), (*Fts5Iter)(unsafe.Pointer(pMulti)).Fbase.FpData, uint64(nData)) *(*int32)(unsafe.Pointer(pBuf + 8)) += nData } libc.Xmemset(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn), 0, uint64(FTS5_DATA_ZERO_PADDING)) } } func fts5DoclistIterNext(tls *libc.TLS, pIter uintptr) { bp := tls.Alloc(12) defer tls.Free(12) var p uintptr = (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaPoslist + uintptr((*Fts5DoclistIter)(unsafe.Pointer(pIter)).FnSize) + uintptr((*Fts5DoclistIter)(unsafe.Pointer(pIter)).FnPoslist) if p >= (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaEof { (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaPoslist = uintptr(0) } else { p += uintptr(sqlite3Fts5GetVarint(tls, p, bp)) *(*I64)(unsafe.Pointer(pIter + 8)) += *(*I64)(unsafe.Pointer(bp)) if int32(*(*U8)(unsafe.Pointer(p)))&0x80 != 0 { (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FnSize = sqlite3Fts5GetVarint32(tls, p, bp+8) (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FnPoslist = *(*int32)(unsafe.Pointer(bp + 8)) >> 1 } else { (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FnPoslist = int32(*(*U8)(unsafe.Pointer(p))) >> 1 (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FnSize = 1 } (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaPoslist = p if (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaPoslist+uintptr((*Fts5DoclistIter)(unsafe.Pointer(pIter)).FnPoslist) > (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaEof { (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaPoslist = uintptr(0) } } } func fts5DoclistIterInit(tls *libc.TLS, pBuf uintptr, pIter uintptr) { libc.Xmemset(tls, pIter, 0, uint64(unsafe.Sizeof(Fts5DoclistIter{}))) if (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn > 0 { (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaPoslist = (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp (*Fts5DoclistIter)(unsafe.Pointer(pIter)).FaEof = (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp + uintptr((*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn) fts5DoclistIterNext(tls, pIter) } } func fts5BufferSwap(tls *libc.TLS, p1 uintptr, p2 uintptr) { var tmp = *(*Fts5Buffer)(unsafe.Pointer(p1)) *(*Fts5Buffer)(unsafe.Pointer(p1)) = *(*Fts5Buffer)(unsafe.Pointer(p2)) *(*Fts5Buffer)(unsafe.Pointer(p2)) = tmp } func fts5NextRowid(tls *libc.TLS, pBuf uintptr, piOff uintptr, piRowid uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var i int32 = *(*int32)(unsafe.Pointer(piOff)) if i >= (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn { *(*int32)(unsafe.Pointer(piOff)) = -1 } else { *(*int32)(unsafe.Pointer(piOff)) = i + int32(sqlite3Fts5GetVarint(tls, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp+uintptr(i), bp)) *(*I64)(unsafe.Pointer(piRowid)) += I64(*(*U64)(unsafe.Pointer(bp))) } } func fts5MergeRowidLists(tls *libc.TLS, p uintptr, p1 uintptr, nBuf int32, aBuf uintptr) { bp := tls.Alloc(48) defer tls.Free(48) *(*int32)(unsafe.Pointer(bp + 16)) = 0 *(*int32)(unsafe.Pointer(bp + 32)) = 0 *(*I64)(unsafe.Pointer(bp + 24)) = int64(0) *(*I64)(unsafe.Pointer(bp + 40)) = int64(0) var iOut I64 = int64(0) var p2 uintptr = aBuf _ = nBuf libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) sqlite3Fts5BufferSize(tls, p+52, bp, uint32((*Fts5Buffer)(unsafe.Pointer(p1)).Fn+(*Fts5Buffer)(unsafe.Pointer(p2)).Fn)) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { return } fts5NextRowid(tls, p1, bp+16, bp+24) fts5NextRowid(tls, p2, bp+32, bp+40) for *(*int32)(unsafe.Pointer(bp + 16)) >= 0 || *(*int32)(unsafe.Pointer(bp + 32)) >= 0 { if *(*int32)(unsafe.Pointer(bp + 16)) >= 0 && (*(*int32)(unsafe.Pointer(bp + 32)) < 0 || *(*I64)(unsafe.Pointer(bp + 24)) < *(*I64)(unsafe.Pointer(bp + 40))) { { *(*int32)(unsafe.Pointer(bp + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp)).Fn), uint64(*(*I64)(unsafe.Pointer(bp + 24))-iOut)) } iOut = *(*I64)(unsafe.Pointer(bp + 24)) fts5NextRowid(tls, p1, bp+16, bp+24) } else { { *(*int32)(unsafe.Pointer(bp + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp)).Fn), uint64(*(*I64)(unsafe.Pointer(bp + 40))-iOut)) } iOut = *(*I64)(unsafe.Pointer(bp + 40)) if *(*int32)(unsafe.Pointer(bp + 16)) >= 0 && *(*I64)(unsafe.Pointer(bp + 24)) == *(*I64)(unsafe.Pointer(bp + 40)) { fts5NextRowid(tls, p1, bp+16, bp+24) } fts5NextRowid(tls, p2, bp+32, bp+40) } } fts5BufferSwap(tls, bp, p1) sqlite3Fts5BufferFree(tls, bp) } type PrefixMerger1 = struct { Fiter Fts5DoclistIter FiPos I64 FiOff int32 F__ccgo_pad1 [4]byte FaPos uintptr FpNext uintptr } type PrefixMerger = PrefixMerger1 func fts5PrefixMergerInsertByRowid(tls *libc.TLS, ppHead uintptr, p uintptr) { if (*PrefixMerger)(unsafe.Pointer(p)).Fiter.FaPoslist != 0 { var pp uintptr = ppHead for *(*uintptr)(unsafe.Pointer(pp)) != 0 && (*PrefixMerger)(unsafe.Pointer(p)).Fiter.FiRowid > (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).Fiter.FiRowid { pp = *(*uintptr)(unsafe.Pointer(pp)) + 56 } (*PrefixMerger)(unsafe.Pointer(p)).FpNext = *(*uintptr)(unsafe.Pointer(pp)) *(*uintptr)(unsafe.Pointer(pp)) = p } } func fts5PrefixMergerInsertByPosition(tls *libc.TLS, ppHead uintptr, p uintptr) { if (*PrefixMerger)(unsafe.Pointer(p)).FiPos >= int64(0) { var pp uintptr = ppHead for *(*uintptr)(unsafe.Pointer(pp)) != 0 && (*PrefixMerger)(unsafe.Pointer(p)).FiPos > (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(pp)))).FiPos { pp = *(*uintptr)(unsafe.Pointer(pp)) + 56 } (*PrefixMerger)(unsafe.Pointer(p)).FpNext = *(*uintptr)(unsafe.Pointer(pp)) *(*uintptr)(unsafe.Pointer(pp)) = p } } func fts5MergePrefixLists(tls *libc.TLS, p uintptr, p1 uintptr, nBuf int32, aBuf uintptr) { bp := tls.Alloc(1072) defer tls.Free(1072) *(*uintptr)(unsafe.Pointer(bp + 1024)) = uintptr(0) var i int32 var nOut int32 = 0 *(*Fts5Buffer)(unsafe.Pointer(bp + 1032)) = Fts5Buffer{} *(*Fts5Buffer)(unsafe.Pointer(bp + 1048)) = Fts5Buffer{} var iLastRowid I64 = int64(0) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(PrefixMerger{}))*uint64(nBuf+1)) *(*uintptr)(unsafe.Pointer(bp + 1024)) = bp + uintptr(nBuf)*64 fts5DoclistIterInit(tls, p1, *(*uintptr)(unsafe.Pointer(bp + 1024))) for i = 0; i < nBuf; i++ { fts5DoclistIterInit(tls, aBuf+uintptr(i)*16, bp+uintptr(i)*64) fts5PrefixMergerInsertByRowid(tls, bp+1024, bp+uintptr(i)*64) nOut = nOut + (*Fts5Buffer)(unsafe.Pointer(aBuf+uintptr(i)*16)).Fn } if nOut == 0 { return } nOut = nOut + ((*Fts5Buffer)(unsafe.Pointer(p1)).Fn + 9 + 10*nBuf) if sqlite3Fts5BufferSize(tls, p+52, bp+1032, uint32(nOut)) != 0 { return } for *(*uintptr)(unsafe.Pointer(bp + 1024)) != 0 { { { *(*int32)(unsafe.Pointer(bp + 1032 + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fn), U64((*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).Fiter.FiRowid)-U64(iLastRowid)) } iLastRowid = (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).Fiter.FiRowid } if (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FpNext != 0 && iLastRowid == (*PrefixMerger)(unsafe.Pointer((*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FpNext)).Fiter.FiRowid { *(*I64)(unsafe.Pointer(bp + 1064)) = int64(0) var nTmp int32 = FTS5_DATA_ZERO_PADDING var nMerge int32 = 0 var pSave uintptr = *(*uintptr)(unsafe.Pointer(bp + 1024)) var pThis uintptr = uintptr(0) var nTail int32 = 0 *(*uintptr)(unsafe.Pointer(bp + 1024)) = uintptr(0) for pSave != 0 && (*PrefixMerger)(unsafe.Pointer(pSave)).Fiter.FiRowid == iLastRowid { var pNext uintptr = (*PrefixMerger)(unsafe.Pointer(pSave)).FpNext (*PrefixMerger)(unsafe.Pointer(pSave)).FiOff = 0 (*PrefixMerger)(unsafe.Pointer(pSave)).FiPos = int64(0) (*PrefixMerger)(unsafe.Pointer(pSave)).FaPos = (*PrefixMerger)(unsafe.Pointer(pSave)).Fiter.FaPoslist + uintptr((*PrefixMerger)(unsafe.Pointer(pSave)).Fiter.FnSize) sqlite3Fts5PoslistNext64(tls, (*PrefixMerger)(unsafe.Pointer(pSave)).FaPos, (*PrefixMerger)(unsafe.Pointer(pSave)).Fiter.FnPoslist, pSave+40, pSave+32) nTmp = nTmp + ((*PrefixMerger)(unsafe.Pointer(pSave)).Fiter.FnPoslist + 10) nMerge++ fts5PrefixMergerInsertByPosition(tls, bp+1024, pSave) pSave = pNext } if *(*uintptr)(unsafe.Pointer(bp + 1024)) == uintptr(0) || (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FpNext == uintptr(0) { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 break } if sqlite3Fts5BufferSize(tls, p+52, bp+1048, uint32(nTmp+nMerge*10)) != 0 { break } sqlite3Fts5BufferZero(tls, bp+1048) pThis = *(*uintptr)(unsafe.Pointer(bp + 1024)) *(*uintptr)(unsafe.Pointer(bp + 1024)) = (*PrefixMerger)(unsafe.Pointer(pThis)).FpNext sqlite3Fts5PoslistSafeAppend(tls, bp+1048, bp+1064, (*PrefixMerger)(unsafe.Pointer(pThis)).FiPos) sqlite3Fts5PoslistNext64(tls, (*PrefixMerger)(unsafe.Pointer(pThis)).FaPos, (*PrefixMerger)(unsafe.Pointer(pThis)).Fiter.FnPoslist, pThis+40, pThis+32) fts5PrefixMergerInsertByPosition(tls, bp+1024, pThis) for (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FpNext != 0 { pThis = *(*uintptr)(unsafe.Pointer(bp + 1024)) if (*PrefixMerger)(unsafe.Pointer(pThis)).FiPos != *(*I64)(unsafe.Pointer(bp + 1064)) { sqlite3Fts5PoslistSafeAppend(tls, bp+1048, bp+1064, (*PrefixMerger)(unsafe.Pointer(pThis)).FiPos) } sqlite3Fts5PoslistNext64(tls, (*PrefixMerger)(unsafe.Pointer(pThis)).FaPos, (*PrefixMerger)(unsafe.Pointer(pThis)).Fiter.FnPoslist, pThis+40, pThis+32) *(*uintptr)(unsafe.Pointer(bp + 1024)) = (*PrefixMerger)(unsafe.Pointer(pThis)).FpNext fts5PrefixMergerInsertByPosition(tls, bp+1024, pThis) } if (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FiPos != *(*I64)(unsafe.Pointer(bp + 1064)) { sqlite3Fts5PoslistSafeAppend(tls, bp+1048, bp+1064, (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FiPos) } nTail = (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).Fiter.FnPoslist - (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FiOff if (*Fts5Buffer)(unsafe.Pointer(bp+1048)).Fn+nTail > nTmp-FTS5_DATA_ZERO_PADDING { if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } break } { *(*int32)(unsafe.Pointer(bp + 1032 + 8)) += sqlite3Fts5PutVarint(tls, (*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fn), uint64(((*Fts5Buffer)(unsafe.Pointer(bp+1048)).Fn+nTail)*2)) } { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fn), (*Fts5Buffer)(unsafe.Pointer(bp+1048)).Fp, uint64((*Fts5Buffer)(unsafe.Pointer(bp+1048)).Fn)) *(*int32)(unsafe.Pointer(bp + 1032 + 8)) += (*Fts5Buffer)(unsafe.Pointer(bp + 1048)).Fn } if nTail > 0 { { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fn), (*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FaPos+uintptr((*PrefixMerger)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 1024)))).FiOff), uint64(nTail)) *(*int32)(unsafe.Pointer(bp + 1032 + 8)) += nTail } } *(*uintptr)(unsafe.Pointer(bp + 1024)) = pSave for i = 0; i < nBuf+1; i++ { var pX uintptr = bp + uintptr(i)*64 if (*PrefixMerger)(unsafe.Pointer(pX)).Fiter.FaPoslist != 0 && (*PrefixMerger)(unsafe.Pointer(pX)).Fiter.FiRowid == iLastRowid { fts5DoclistIterNext(tls, pX) fts5PrefixMergerInsertByRowid(tls, bp+1024, pX) } } } else { var pThis uintptr = *(*uintptr)(unsafe.Pointer(bp + 1024)) var pI uintptr = pThis { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fn), (*Fts5DoclistIter)(unsafe.Pointer(pI)).FaPoslist, uint64((*Fts5DoclistIter)(unsafe.Pointer(pI)).FnPoslist+(*Fts5DoclistIter)(unsafe.Pointer(pI)).FnSize)) *(*int32)(unsafe.Pointer(bp + 1032 + 8)) += (*Fts5DoclistIter)(unsafe.Pointer(pI)).FnPoslist + (*Fts5DoclistIter)(unsafe.Pointer(pI)).FnSize } fts5DoclistIterNext(tls, pI) *(*uintptr)(unsafe.Pointer(bp + 1024)) = (*PrefixMerger)(unsafe.Pointer(pThis)).FpNext fts5PrefixMergerInsertByRowid(tls, bp+1024, pThis) } } sqlite3Fts5BufferFree(tls, p1) sqlite3Fts5BufferFree(tls, bp+1048) libc.Xmemset(tls, (*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fp+uintptr((*Fts5Buffer)(unsafe.Pointer(bp+1032)).Fn), 0, uint64(FTS5_DATA_ZERO_PADDING)) *(*Fts5Buffer)(unsafe.Pointer(p1)) = *(*Fts5Buffer)(unsafe.Pointer(bp + 1032)) } func fts5SetupPrefixIter(tls *libc.TLS, p uintptr, bDesc int32, iIdx int32, pToken uintptr, nToken int32, pColset uintptr, ppIter uintptr) { bp := tls.Alloc(32) defer tls.Free(32) var pStruct uintptr var aBuf uintptr var nBuf int32 = 32 var nMerge int32 = 1 var xMerge uintptr var xAppend uintptr if (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FeDetail == FTS5_DETAIL_NONE { xMerge = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) }{fts5MergeRowidLists})) xAppend = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, U64, uintptr, uintptr) }{fts5AppendRowid})) } else { nMerge = FTS5_MERGE_NLIST - 1 nBuf = nMerge * 8 xMerge = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) }{fts5MergePrefixLists})) xAppend = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, U64, uintptr, uintptr) }{fts5AppendPoslist})) } aBuf = fts5IdxMalloc(tls, p, int64(uint64(unsafe.Sizeof(Fts5Buffer{}))*uint64(nBuf))) pStruct = fts5StructureRead(tls, p) if aBuf != 0 && pStruct != 0 { var flags int32 = FTS5INDEX_QUERY_SCAN | FTS5INDEX_QUERY_SKIPEMPTY | FTS5INDEX_QUERY_NOOUTPUT var i int32 var iLastRowid I64 = int64(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var pData uintptr *(*int32)(unsafe.Pointer(bp + 28)) = 1 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) if iIdx != 0 { *(*int32)(unsafe.Pointer(bp + 24)) = 0 var f2 int32 = FTS5INDEX_QUERY_SKIPEMPTY | FTS5INDEX_QUERY_NOOUTPUT *(*U8)(unsafe.Pointer(pToken)) = U8('0') fts5MultiIterNew(tls, p, pStruct, f2, pColset, pToken, nToken, -1, 0, bp+16) fts5IterSetOutputCb(tls, p+52, *(*uintptr)(unsafe.Pointer(bp + 16))) for ; fts5MultiIterEof(tls, p, *(*uintptr)(unsafe.Pointer(bp + 16))) == 0; fts5MultiIterNext2(tls, p, *(*uintptr)(unsafe.Pointer(bp + 16)), bp+24) { var pSeg uintptr = *(*uintptr)(unsafe.Pointer(bp + 16)) + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaFirst+1*4)).FiFirst)*120 (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FxSetOutputs})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), pSeg) if (*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fbase.FnData != 0 { (*struct { f func(*libc.TLS, uintptr, U64, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xAppend})).f(tls, p, U64((*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fbase.FiRowid)-U64(iLastRowid), *(*uintptr)(unsafe.Pointer(bp + 16)), bp) iLastRowid = (*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fbase.FiRowid } } fts5MultiIterFree(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) } *(*U8)(unsafe.Pointer(pToken)) = U8('0' + iIdx) fts5MultiIterNew(tls, p, pStruct, flags, pColset, pToken, nToken, -1, 0, bp+16) fts5IterSetOutputCb(tls, p+52, *(*uintptr)(unsafe.Pointer(bp + 16))) for ; fts5MultiIterEof(tls, p, *(*uintptr)(unsafe.Pointer(bp + 16))) == 0; fts5MultiIterNext2(tls, p, *(*uintptr)(unsafe.Pointer(bp + 16)), bp+28) { var pSeg uintptr = *(*uintptr)(unsafe.Pointer(bp + 16)) + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaFirst+1*4)).FiFirst)*120 var nTerm int32 = (*Fts5SegIter)(unsafe.Pointer(pSeg)).Fterm.Fn var pTerm uintptr = (*Fts5SegIter)(unsafe.Pointer(pSeg)).Fterm.Fp (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FxSetOutputs})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), pSeg) if *(*int32)(unsafe.Pointer(bp + 28)) != 0 { if nTerm < nToken || libc.Xmemcmp(tls, pToken, pTerm, uint64(nToken)) != 0 { break } } if (*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fbase.FnData == 0 { continue } if (*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fbase.FiRowid <= iLastRowid && (*Fts5Buffer)(unsafe.Pointer(bp)).Fn > 0 { for i = 0; (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5Buffer)(unsafe.Pointer(bp)).Fn != 0; i++ { var i1 int32 = i * nMerge var iStore int32 for iStore = i1; iStore < i1+nMerge; iStore++ { if (*Fts5Buffer)(unsafe.Pointer(aBuf+uintptr(iStore)*16)).Fn == 0 { fts5BufferSwap(tls, bp, aBuf+uintptr(iStore)*16) sqlite3Fts5BufferZero(tls, bp) break } } if iStore == i1+nMerge { (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xMerge})).f(tls, p, bp, nMerge, aBuf+uintptr(i1)*16) for iStore = i1; iStore < i1+nMerge; iStore++ { sqlite3Fts5BufferZero(tls, aBuf+uintptr(iStore)*16) } } } iLastRowid = int64(0) } (*struct { f func(*libc.TLS, uintptr, U64, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xAppend})).f(tls, p, U64((*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fbase.FiRowid)-U64(iLastRowid), *(*uintptr)(unsafe.Pointer(bp + 16)), bp) iLastRowid = (*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).Fbase.FiRowid } for i = 0; i < nBuf; i = i + nMerge { var iFree int32 if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xMerge})).f(tls, p, bp, nMerge, aBuf+uintptr(i)*16) } for iFree = i; iFree < i+nMerge; iFree++ { sqlite3Fts5BufferFree(tls, aBuf+uintptr(iFree)*16) } } fts5MultiIterFree(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) pData = fts5IdxMalloc(tls, p, int64(uint64(unsafe.Sizeof(Fts5Data{}))+uint64((*Fts5Buffer)(unsafe.Pointer(bp)).Fn)+uint64(FTS5_DATA_ZERO_PADDING))) if pData != 0 { (*Fts5Data)(unsafe.Pointer(pData)).Fp = pData + 1*16 (*Fts5Data)(unsafe.Pointer(pData)).Fnn = libc.AssignPtrInt32(pData+12, (*Fts5Buffer)(unsafe.Pointer(bp)).Fn) if (*Fts5Buffer)(unsafe.Pointer(bp)).Fn != 0 { libc.Xmemcpy(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp, uint64((*Fts5Buffer)(unsafe.Pointer(bp)).Fn)) } fts5MultiIterNew2(tls, p, pData, bDesc, ppIter) } sqlite3Fts5BufferFree(tls, bp) } fts5StructureRelease(tls, pStruct) Xsqlite3_free(tls, aBuf) } func sqlite3Fts5IndexBeginWrite(tls *libc.TLS, p uintptr, bDelete int32, iRowid I64) int32 { if (*Fts5Index)(unsafe.Pointer(p)).FpHash == uintptr(0) { (*Fts5Index)(unsafe.Pointer(p)).Frc = sqlite3Fts5HashNew(tls, (*Fts5Index)(unsafe.Pointer(p)).FpConfig, p+24, p+32) } if iRowid < (*Fts5Index)(unsafe.Pointer(p)).FiWriteRowid || iRowid == (*Fts5Index)(unsafe.Pointer(p)).FiWriteRowid && (*Fts5Index)(unsafe.Pointer(p)).FbDelete == 0 || (*Fts5Index)(unsafe.Pointer(p)).FnPendingData > (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FnHashSize { fts5IndexFlush(tls, p) } (*Fts5Index)(unsafe.Pointer(p)).FiWriteRowid = iRowid (*Fts5Index)(unsafe.Pointer(p)).FbDelete = bDelete return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexSync(tls *libc.TLS, p uintptr) int32 { fts5IndexFlush(tls, p) sqlite3Fts5IndexCloseReader(tls, p) return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexRollback(tls *libc.TLS, p uintptr) int32 { sqlite3Fts5IndexCloseReader(tls, p) fts5IndexDiscardData(tls, p) fts5StructureInvalidate(tls, p) return SQLITE_OK } func sqlite3Fts5IndexReinit(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(40) defer tls.Free(40) fts5StructureInvalidate(tls, p) fts5IndexDiscardData(tls, p) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Structure{}))) fts5DataWrite(tls, p, int64(FTS5_AVERAGES_ROWID), ts+1544, 0) fts5StructureWrite(tls, p, bp) return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexOpen(tls *libc.TLS, pConfig uintptr, bCreate int32, pp uintptr, pzErr uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_OK var p uintptr *(*uintptr)(unsafe.Pointer(pp)) = libc.AssignUintptr(&p, sqlite3Fts5MallocZero(tls, bp+8, int64(unsafe.Sizeof(Fts5Index{})))) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { (*Fts5Index)(unsafe.Pointer(p)).FpConfig = pConfig (*Fts5Index)(unsafe.Pointer(p)).FnWorkUnit = FTS5_WORK_UNIT (*Fts5Index)(unsafe.Pointer(p)).FzDataTbl = sqlite3Fts5Mprintf(tls, bp+8, ts+36562, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) if (*Fts5Index)(unsafe.Pointer(p)).FzDataTbl != 0 && bCreate != 0 { *(*int32)(unsafe.Pointer(bp + 8)) = sqlite3Fts5CreateTable(tls, pConfig, ts+26479, ts+36570, 0, pzErr) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 8)) = sqlite3Fts5CreateTable(tls, pConfig, ts+12840, ts+36605, 1, pzErr) } if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 8)) = sqlite3Fts5IndexReinit(tls, p) } } } if *(*int32)(unsafe.Pointer(bp + 8)) != 0 { sqlite3Fts5IndexClose(tls, p) *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) } return *(*int32)(unsafe.Pointer(bp + 8)) } func sqlite3Fts5IndexClose(tls *libc.TLS, p uintptr) int32 { var rc int32 = SQLITE_OK if p != 0 { fts5StructureInvalidate(tls, p) Xsqlite3_finalize(tls, (*Fts5Index)(unsafe.Pointer(p)).FpWriter) Xsqlite3_finalize(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDeleter) Xsqlite3_finalize(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxWriter) Xsqlite3_finalize(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxDeleter) Xsqlite3_finalize(tls, (*Fts5Index)(unsafe.Pointer(p)).FpIdxSelect) Xsqlite3_finalize(tls, (*Fts5Index)(unsafe.Pointer(p)).FpDataVersion) sqlite3Fts5HashFree(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash) Xsqlite3_free(tls, (*Fts5Index)(unsafe.Pointer(p)).FzDataTbl) Xsqlite3_free(tls, p) } return rc } func sqlite3Fts5IndexCharlenToBytelen(tls *libc.TLS, p uintptr, nByte int32, nChar int32) int32 { var n int32 = 0 var i int32 for i = 0; i < nChar; i++ { if n >= nByte { return 0 } if int32(uint8(*(*int8)(unsafe.Pointer(p + uintptr(libc.PostIncInt32(&n, 1)))))) >= 0xc0 { if n >= nByte { return 0 } for int32(*(*int8)(unsafe.Pointer(p + uintptr(n))))&0xc0 == 0x80 { n++ if n >= nByte { if i+1 == nChar { break } return 0 } } } } return n } func fts5IndexCharlen(tls *libc.TLS, pIn uintptr, nIn int32) int32 { var nChar int32 = 0 var i int32 = 0 for i < nIn { if int32(uint8(*(*int8)(unsafe.Pointer(pIn + uintptr(libc.PostIncInt32(&i, 1)))))) >= 0xc0 { for i < nIn && int32(*(*int8)(unsafe.Pointer(pIn + uintptr(i))))&0xc0 == 0x80 { i++ } } nChar++ } return nChar } func sqlite3Fts5IndexWrite(tls *libc.TLS, p uintptr, iCol int32, iPos int32, pToken uintptr, nToken int32) int32 { var i int32 var rc int32 = SQLITE_OK var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig rc = sqlite3Fts5HashWrite(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash, (*Fts5Index)(unsafe.Pointer(p)).FiWriteRowid, iCol, iPos, int8('0'), pToken, nToken) for i = 0; i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnPrefix && rc == SQLITE_OK; i++ { var nChar int32 = *(*int32)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FaPrefix + uintptr(i)*4)) var nByte int32 = sqlite3Fts5IndexCharlenToBytelen(tls, pToken, nToken, nChar) if nByte != 0 { rc = sqlite3Fts5HashWrite(tls, (*Fts5Index)(unsafe.Pointer(p)).FpHash, (*Fts5Index)(unsafe.Pointer(p)).FiWriteRowid, iCol, iPos, int8('0'+i+1), pToken, nByte) } } return rc } func sqlite3Fts5IndexQuery(tls *libc.TLS, p uintptr, pToken uintptr, nToken int32, flags int32, pColset uintptr, ppIter uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) *(*Fts5Buffer)(unsafe.Pointer(bp)) = Fts5Buffer{} if sqlite3Fts5BufferSize(tls, p+52, bp, uint32(nToken+1)) == 0 { var iIdx int32 = 0 var iPrefixIdx int32 = 0 if nToken > 0 { libc.Xmemcpy(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp+1, pToken, uint64(nToken)) } if flags&FTS5INDEX_QUERY_PREFIX != 0 { var nChar int32 = fts5IndexCharlen(tls, pToken, nToken) for iIdx = 1; iIdx <= (*Fts5Config)(unsafe.Pointer(pConfig)).FnPrefix; iIdx++ { var nIdxChar int32 = *(*int32)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FaPrefix + uintptr(iIdx-1)*4)) if nIdxChar == nChar { break } if nIdxChar == nChar+1 { iPrefixIdx = iIdx } } } if iIdx <= (*Fts5Config)(unsafe.Pointer(pConfig)).FnPrefix { var pStruct uintptr = fts5StructureRead(tls, p) *(*U8)(unsafe.Pointer((*Fts5Buffer)(unsafe.Pointer(bp)).Fp)) = U8('0' + iIdx) if pStruct != 0 { fts5MultiIterNew(tls, p, pStruct, flags|FTS5INDEX_QUERY_SKIPEMPTY, pColset, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp, nToken+1, -1, 0, bp+16) fts5StructureRelease(tls, pStruct) } } else { var bDesc int32 = libc.Bool32(flags&FTS5INDEX_QUERY_DESC != 0) fts5SetupPrefixIter(tls, p, bDesc, iPrefixIdx, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp, nToken+1, pColset, bp+16) if *(*uintptr)(unsafe.Pointer(bp + 16)) == uintptr(0) { } else { fts5IterSetOutputCb(tls, p+52, *(*uintptr)(unsafe.Pointer(bp + 16))) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var pSeg uintptr = *(*uintptr)(unsafe.Pointer(bp + 16)) + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FaFirst+1*4)).FiFirst)*120 if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf != 0 { (*struct { f func(*libc.TLS, uintptr, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))).FxSetOutputs})).f(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), pSeg) } } } } if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { sqlite3Fts5IterClose(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) sqlite3Fts5IndexCloseReader(tls, p) } *(*uintptr)(unsafe.Pointer(ppIter)) = *(*uintptr)(unsafe.Pointer(bp + 16)) sqlite3Fts5BufferFree(tls, bp) } return fts5IndexReturn(tls, p) } func sqlite3Fts5IterNext(tls *libc.TLS, pIndexIter uintptr) int32 { var pIter uintptr = pIndexIter fts5MultiIterNext(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex, pIter, 0, int64(0)) return fts5IndexReturn(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex) } func sqlite3Fts5IterNextScan(tls *libc.TLS, pIndexIter uintptr) int32 { var pIter uintptr = pIndexIter var p uintptr = (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex fts5MultiIterNext(tls, p, pIter, 0, int64(0)) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var pSeg uintptr = pIter + 96 + uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(pIter)).FaFirst+1*4)).FiFirst)*120 if (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf != 0 && int32(*(*U8)(unsafe.Pointer((*Fts5SegIter)(unsafe.Pointer(pSeg)).Fterm.Fp))) != '0' { fts5DataRelease(tls, (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf) (*Fts5SegIter)(unsafe.Pointer(pSeg)).FpLeaf = uintptr(0) (*Fts5Iter)(unsafe.Pointer(pIter)).Fbase.FbEof = U8(1) } } return fts5IndexReturn(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex) } func sqlite3Fts5IterNextFrom(tls *libc.TLS, pIndexIter uintptr, iMatch I64) int32 { var pIter uintptr = pIndexIter fts5MultiIterNextFrom(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex, pIter, iMatch) return fts5IndexReturn(tls, (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex) } func sqlite3Fts5IterTerm(tls *libc.TLS, pIndexIter uintptr, pn uintptr) uintptr { bp := tls.Alloc(4) defer tls.Free(4) var z uintptr = fts5MultiIterTerm(tls, pIndexIter, bp) *(*int32)(unsafe.Pointer(pn)) = *(*int32)(unsafe.Pointer(bp)) - 1 return func() uintptr { if z != 0 { return z + 1 } return uintptr(0) }() } func sqlite3Fts5IterClose(tls *libc.TLS, pIndexIter uintptr) { if pIndexIter != 0 { var pIter uintptr = pIndexIter var pIndex uintptr = (*Fts5Iter)(unsafe.Pointer(pIter)).FpIndex fts5MultiIterFree(tls, pIter) sqlite3Fts5IndexCloseReader(tls, pIndex) } } func sqlite3Fts5IndexGetAverages(tls *libc.TLS, p uintptr, pnRow uintptr, anSize uintptr) int32 { var nCol int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FnCol var pData uintptr *(*I64)(unsafe.Pointer(pnRow)) = int64(0) libc.Xmemset(tls, anSize, 0, uint64(unsafe.Sizeof(I64(0)))*uint64(nCol)) pData = fts5DataRead(tls, p, int64(FTS5_AVERAGES_ROWID)) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && (*Fts5Data)(unsafe.Pointer(pData)).Fnn != 0 { var i int32 = 0 var iCol int32 i = i + int32(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp+uintptr(i), pnRow)) for iCol = 0; i < (*Fts5Data)(unsafe.Pointer(pData)).Fnn && iCol < nCol; iCol++ { i = i + int32(sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pData)).Fp+uintptr(i), anSize+uintptr(iCol)*8)) } } fts5DataRelease(tls, pData) return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexSetAverages(tls *libc.TLS, p uintptr, pData uintptr, nData int32) int32 { fts5DataWrite(tls, p, int64(FTS5_AVERAGES_ROWID), pData, nData) return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexReads(tls *libc.TLS, p uintptr) int32 { return (*Fts5Index)(unsafe.Pointer(p)).FnRead } func sqlite3Fts5IndexSetCookie(tls *libc.TLS, p uintptr, iNew int32) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) sqlite3Fts5Put32(tls, bp, iNew) rc = Xsqlite3_blob_open(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Index)(unsafe.Pointer(p)).FzDataTbl, ts+36252, int64(FTS5_STRUCTURE_ROWID), 1, bp+8) if rc == SQLITE_OK { Xsqlite3_blob_write(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), bp, 4, 0) rc = Xsqlite3_blob_close(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } return rc } func sqlite3Fts5IndexLoadConfig(tls *libc.TLS, p uintptr) int32 { var pStruct uintptr pStruct = fts5StructureRead(tls, p) fts5StructureRelease(tls, pStruct) return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexEntryCksum(tls *libc.TLS, iRowid I64, iCol int32, iPos int32, iIdx int32, pTerm uintptr, nTerm int32) U64 { var i int32 var ret U64 = U64(iRowid) ret = ret + (ret<<3 + U64(iCol)) ret = ret + (ret<<3 + U64(iPos)) if iIdx >= 0 { ret = ret + (ret<<3 + U64('0'+iIdx)) } for i = 0; i < nTerm; i++ { ret = ret + (ret<<3 + U64(*(*int8)(unsafe.Pointer(pTerm + uintptr(i))))) } return ret } func fts5IndexIntegrityCheckEmpty(tls *libc.TLS, p uintptr, pSeg uintptr, iFirst int32, iNoRowid int32, iLast int32) { var i int32 for i = iFirst; (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && i <= iLast; i++ { var pLeaf uintptr = fts5DataRead(tls, p, I64((*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)+int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B)+int64(0)<= (*Fts5Data)(unsafe.Pointer(pLeaf)).Fnn) { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } if i >= iNoRowid && 0 != int32(fts5GetU16(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp)) { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } } fts5DataRelease(tls, pLeaf) } } func fts5IntegrityCheckPgidx(tls *libc.TLS, p uintptr, pLeaf uintptr) { bp := tls.Alloc(48) defer tls.Free(48) var iTermOff int32 = 0 var ii int32 *(*Fts5Buffer)(unsafe.Pointer(bp + 8)) = Fts5Buffer{} *(*Fts5Buffer)(unsafe.Pointer(bp + 32)) = Fts5Buffer{} ii = (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf for ii < (*Fts5Data)(unsafe.Pointer(pLeaf)).Fnn && (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { var res int32 var iOff int32 ii = ii + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(ii), bp) iTermOff = iTermOff + *(*int32)(unsafe.Pointer(bp)) iOff = iTermOff if iOff >= (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else if iTermOff == *(*int32)(unsafe.Pointer(bp)) { iOff = iOff + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iOff), bp+4) if iOff+*(*int32)(unsafe.Pointer(bp + 4)) > (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { sqlite3Fts5BufferSet(tls, p+52, bp+8, *(*int32)(unsafe.Pointer(bp + 4)), (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iOff)) } } else { iOff = iOff + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iOff), bp+24) iOff = iOff + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iOff), bp+28) if *(*int32)(unsafe.Pointer(bp + 24)) > (*Fts5Buffer)(unsafe.Pointer(bp+8)).Fn || iOff+*(*int32)(unsafe.Pointer(bp + 28)) > (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { (*Fts5Buffer)(unsafe.Pointer(bp + 8)).Fn = *(*int32)(unsafe.Pointer(bp + 24)) sqlite3Fts5BufferAppendBlob(tls, p+52, bp+8, uint32(*(*int32)(unsafe.Pointer(bp + 28))), (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iOff)) } if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { res = fts5BufferCompare(tls, bp+8, bp+32) if res <= 0 { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } } } sqlite3Fts5BufferSet(tls, p+52, bp+32, (*Fts5Buffer)(unsafe.Pointer(bp+8)).Fn, (*Fts5Buffer)(unsafe.Pointer(bp+8)).Fp) } sqlite3Fts5BufferFree(tls, bp+8) sqlite3Fts5BufferFree(tls, bp+32) } func fts5IndexIntegrityCheckSegment(tls *libc.TLS, p uintptr, pSeg uintptr) { bp := tls.Alloc(48) defer tls.Free(48) var pConfig uintptr = (*Fts5Index)(unsafe.Pointer(p)).FpConfig *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) var rc2 int32 var iIdxPrevLeaf int32 = (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst - 1 var iDlidxPrevLeaf int32 = (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast if (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst == 0 { return } fts5IndexPrepareStmt(tls, p, bp+24, Xsqlite3_mprintf(tls, ts+36649, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FiSegid))) for (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) { var iRow I64 var pLeaf uintptr var zIdxTerm uintptr = Xsqlite3_column_blob(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), 1) var nIdxTerm int32 = Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), 1) var iIdxLeaf int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), 2) var bIdxDlidx int32 = Xsqlite3_column_int(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), 3) if iIdxLeaf < (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoFirst { continue } iRow = I64((*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FiSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B) + int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B) + int64(0)<= iOff || iOff >= (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { iOff = iOff + sqlite3Fts5GetVarint32(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iOff), bp+32) res = func() int32 { if func() int32 { if *(*int32)(unsafe.Pointer(bp + 32)) < nIdxTerm { return *(*int32)(unsafe.Pointer(bp + 32)) } return nIdxTerm }() <= 0 { return 0 } return libc.Xmemcmp(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iOff), zIdxTerm, func() uint64 { if *(*int32)(unsafe.Pointer(bp + 32)) < nIdxTerm { return uint64(*(*int32)(unsafe.Pointer(bp + 32))) } return uint64(nIdxTerm) }()) }() if res == 0 { res = *(*int32)(unsafe.Pointer(bp + 32)) - nIdxTerm } if res < 0 { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } } fts5IntegrityCheckPgidx(tls, p, pLeaf) } fts5DataRelease(tls, pLeaf) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { break } fts5IndexIntegrityCheckEmpty(tls, p, pSeg, iIdxPrevLeaf+1, iDlidxPrevLeaf+1, iIdxLeaf-1) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { break } if bIdxDlidx != 0 { var pDlidx uintptr = uintptr(0) var iPrevLeaf int32 = iIdxLeaf var iSegid int32 = (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FiSegid var iPg int32 = 0 var iKey I64 for pDlidx = fts5DlidxIterInit(tls, p, 0, iSegid, iIdxLeaf); fts5DlidxIterEof(tls, p, pDlidx) == 0; fts5DlidxIterNext(tls, p, pDlidx) { for iPg = iPrevLeaf + 1; iPg < fts5DlidxIterPgno(tls, pDlidx); iPg++ { iKey = I64(iSegid)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B) + int64(0)<<(FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B) + int64(0)<= (*Fts5Data)(unsafe.Pointer(pLeaf)).FszLeaf { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } else { sqlite3Fts5GetVarint(tls, (*Fts5Data)(unsafe.Pointer(pLeaf)).Fp+uintptr(iRowidOff), bp+40) if *(*I64)(unsafe.Pointer(bp + 40)) != fts5DlidxIterRowid(tls, pDlidx) { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } } fts5DataRelease(tls, pLeaf) } } iDlidxPrevLeaf = iPg fts5DlidxIterFree(tls, pDlidx) } else { iDlidxPrevLeaf = (*Fts5StructureSegment)(unsafe.Pointer(pSeg)).FpgnoLast } iIdxPrevLeaf = iIdxLeaf } rc2 = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK { (*Fts5Index)(unsafe.Pointer(p)).Frc = rc2 } } func sqlite3Fts5IndexIntegrityCheck(tls *libc.TLS, p uintptr, cksum U64, bUseCksum int32) int32 { bp := tls.Alloc(48) defer tls.Free(48) var eDetail int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Index)(unsafe.Pointer(p)).FpConfig)).FeDetail var cksum2 U64 = uint64(0) *(*Fts5Buffer)(unsafe.Pointer(bp + 16)) = Fts5Buffer{} var pStruct uintptr var iLvl int32 var iSeg int32 var flags int32 = FTS5INDEX_QUERY_NOOUTPUT pStruct = fts5StructureRead(tls, p) if pStruct == uintptr(0) { return fts5IndexReturn(tls, p) } for iLvl = 0; iLvl < (*Fts5Structure)(unsafe.Pointer(pStruct)).FnLevel; iLvl++ { for iSeg = 0; iSeg < (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FnSeg; iSeg++ { var pSeg uintptr = (*Fts5StructureLevel)(unsafe.Pointer(pStruct+24+uintptr(iLvl)*16)).FaSeg + uintptr(iSeg)*12 fts5IndexIntegrityCheckSegment(tls, p, pSeg) } } for fts5MultiIterNew(tls, p, pStruct, flags, uintptr(0), uintptr(0), 0, -1, 0, bp); fts5MultiIterEof(tls, p, *(*uintptr)(unsafe.Pointer(bp))) == 0; fts5MultiIterNext(tls, p, *(*uintptr)(unsafe.Pointer(bp)), 0, int64(0)) { *(*I64)(unsafe.Pointer(bp + 40)) = int64(0) *(*int32)(unsafe.Pointer(bp + 32)) = 0 var iRowid I64 = fts5MultiIterRowid(tls, *(*uintptr)(unsafe.Pointer(bp))) var z uintptr = fts5MultiIterTerm(tls, *(*uintptr)(unsafe.Pointer(bp)), bp+8) if (*Fts5Index)(unsafe.Pointer(p)).Frc != 0 { break } if eDetail == FTS5_DETAIL_NONE { if 0 == fts5MultiIterIsEmpty(tls, p, *(*uintptr)(unsafe.Pointer(bp))) { cksum2 = cksum2 ^ sqlite3Fts5IndexEntryCksum(tls, iRowid, 0, 0, -1, z, *(*int32)(unsafe.Pointer(bp + 8))) } } else { (*Fts5Buffer)(unsafe.Pointer(bp + 16)).Fn = 0 fts5SegiterPoslist(tls, p, *(*uintptr)(unsafe.Pointer(bp))+96+uintptr((*Fts5CResult)(unsafe.Pointer((*Fts5Iter)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FaFirst+1*4)).FiFirst)*120, uintptr(0), bp+16) sqlite3Fts5BufferAppendBlob(tls, p+52, bp+16, uint32(4), ts+36735) for 0 == sqlite3Fts5PoslistNext64(tls, (*Fts5Buffer)(unsafe.Pointer(bp+16)).Fp, (*Fts5Buffer)(unsafe.Pointer(bp+16)).Fn, bp+32, bp+40) { var iCol int32 = int32(*(*I64)(unsafe.Pointer(bp + 40)) >> 32) var iTokOff int32 = int32(*(*I64)(unsafe.Pointer(bp + 40)) & int64(0x7FFFFFFF)) cksum2 = cksum2 ^ sqlite3Fts5IndexEntryCksum(tls, iRowid, iCol, iTokOff, -1, z, *(*int32)(unsafe.Pointer(bp + 8))) } } } fts5MultiIterFree(tls, *(*uintptr)(unsafe.Pointer(bp))) if (*Fts5Index)(unsafe.Pointer(p)).Frc == SQLITE_OK && bUseCksum != 0 && cksum != cksum2 { (*Fts5Index)(unsafe.Pointer(p)).Frc = SQLITE_CORRUPT | int32(1)<<8 } fts5StructureRelease(tls, pStruct) sqlite3Fts5BufferFree(tls, bp+16) return fts5IndexReturn(tls, p) } func sqlite3Fts5IndexInit(tls *libc.TLS, db uintptr) int32 { return SQLITE_OK _ = db return int32(0) } func sqlite3Fts5IndexReset(tls *libc.TLS, p uintptr) int32 { if fts5IndexDataVersion(tls, p) != (*Fts5Index)(unsafe.Pointer(p)).FiStructVersion { fts5StructureInvalidate(tls, p) } return fts5IndexReturn(tls, p) } type Fts5Auxdata1 = struct { FpAux uintptr FpPtr uintptr FxDelete uintptr FpNext uintptr } type Fts5Auxdata = Fts5Auxdata1 type Fts5Auxiliary1 = struct { FpGlobal uintptr FzFunc uintptr FpUserData uintptr FxFunc Fts5_extension_function FxDestroy uintptr FpNext uintptr } type Fts5Auxiliary = Fts5Auxiliary1 type Fts5Cursor1 = struct { Fbase Sqlite3_vtab_cursor FpNext uintptr FaColumnSize uintptr FiCsrId I64 FePlan int32 FbDesc int32 FiFirstRowid I64 FiLastRowid I64 FpStmt uintptr FpExpr uintptr FpSorter uintptr Fcsrflags int32 F__ccgo_pad1 [4]byte FiSpecial I64 FzRank uintptr FzRankArgs uintptr FpRank uintptr FnRankArg int32 F__ccgo_pad2 [4]byte FapRankArg uintptr FpRankArgStmt uintptr FpAux uintptr FpAuxdata uintptr FaInstIter uintptr FnInstAlloc int32 FnInstCount int32 FaInst uintptr } type Fts5Cursor = Fts5Cursor1 type Fts5FullTable1 = struct { Fp Fts5Table FpStorage uintptr FpGlobal uintptr FpSortCsr uintptr } type Fts5FullTable = Fts5FullTable1 type Fts5Sorter1 = struct { FpStmt uintptr FiRowid I64 FaPoslist uintptr FnIdx int32 FaIdx [1]int32 } type Fts5Sorter = Fts5Sorter1 type Fts5TokenizerModule1 = struct { FzName uintptr FpUserData uintptr Fx Fts5_tokenizer FxDestroy uintptr FpNext uintptr } type Fts5TokenizerModule = Fts5TokenizerModule1 // NOTES ON TRANSACTIONS: // // SQLite invokes the following virtual table methods as transactions are // opened and closed by the user: // // xBegin(): Start of a new transaction. // xSync(): Initial part of two-phase commit. // xCommit(): Final part of two-phase commit. // xRollback(): Rollback the transaction. // // Anything that is required as part of a commit that may fail is performed // in the xSync() callback. Current versions of SQLite ignore any errors // returned by xCommit(). // // And as sub-transactions are opened/closed: // // xSavepoint(int S): Open savepoint S. // xRelease(int S): Commit and close savepoint S. // xRollbackTo(int S): Rollback to start of savepoint S. // // During a write-transaction the fts5_index.c module may cache some data // in-memory. It is flushed to disk whenever xSync(), xRelease() or // xSavepoint() is called. And discarded whenever xRollback() or xRollbackTo() // is called. // // Additionally, if SQLITE_DEBUG is defined, an instance of the following // structure is used to record the current transaction state. This information // is not required, but it is used in the assert() statements executed by // function fts5CheckTransactionState() (see below). type Fts5TransactionState = struct { FeState int32 FiSavepoint int32 } type Fts5MatchPhrase = struct { FpPoslist uintptr FnTerm int32 F__ccgo_pad1 [4]byte } func fts5IsContentless(tls *libc.TLS, pTab uintptr) int32 { return libc.Bool32((*Fts5Config)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig)).FeContent == FTS5_CONTENT_NONE) } func fts5FreeVtab(tls *libc.TLS, pTab uintptr) { if pTab != 0 { sqlite3Fts5IndexClose(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex) sqlite3Fts5StorageClose(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) sqlite3Fts5ConfigFree(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig) Xsqlite3_free(tls, pTab) } } func fts5DisconnectMethod(tls *libc.TLS, pVtab uintptr) int32 { fts5FreeVtab(tls, pVtab) return SQLITE_OK } func fts5DestroyMethod(tls *libc.TLS, pVtab uintptr) int32 { var pTab uintptr = pVtab var rc int32 = sqlite3Fts5DropAll(tls, (*Fts5Table)(unsafe.Pointer(pTab)).FpConfig) if rc == SQLITE_OK { fts5FreeVtab(tls, pVtab) } return rc } func fts5InitVtab(tls *libc.TLS, bCreate int32, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVTab uintptr, pzErr uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pGlobal uintptr = pAux var azConfig uintptr = argv *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var pTab uintptr = uintptr(0) pTab = sqlite3Fts5MallocZero(tls, bp, int64(unsafe.Sizeof(Fts5FullTable{}))) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp)) = sqlite3Fts5ConfigParse(tls, pGlobal, db, argc, azConfig, bp+8, pzErr) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig = *(*uintptr)(unsafe.Pointer(bp + 8)) (*Fts5FullTable)(unsafe.Pointer(pTab)).FpGlobal = pGlobal } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp)) = sqlite3Fts5IndexOpen(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), bCreate, pTab+32, pzErr) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp)) = sqlite3Fts5StorageOpen(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex, bCreate, pTab+40, pzErr) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp)) = sqlite3Fts5ConfigDeclareVtab(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { (*Fts5Config)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpzErrmsg = pzErr *(*int32)(unsafe.Pointer(bp)) = sqlite3Fts5IndexLoadConfig(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex) sqlite3Fts5IndexRollback(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex) (*Fts5Config)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 8)))).FpzErrmsg = uintptr(0) } if *(*int32)(unsafe.Pointer(bp)) != SQLITE_OK { fts5FreeVtab(tls, pTab) pTab = uintptr(0) } else if bCreate != 0 { } *(*uintptr)(unsafe.Pointer(ppVTab)) = pTab return *(*int32)(unsafe.Pointer(bp)) } func fts5ConnectMethod(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return fts5InitVtab(tls, 0, db, pAux, argc, argv, ppVtab, pzErr) } func fts5CreateMethod(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return fts5InitVtab(tls, 1, db, pAux, argc, argv, ppVtab, pzErr) } func fts5SetUniqueFlag(tls *libc.TLS, pIdxInfo uintptr) { { *(*int32)(unsafe.Pointer(pIdxInfo + 80)) |= SQLITE_INDEX_SCAN_UNIQUE } } func fts5UsePatternMatch(tls *libc.TLS, pConfig uintptr, p uintptr) int32 { if (*Fts5Config)(unsafe.Pointer(pConfig)).FePattern == FTS5_PATTERN_GLOB && int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == FTS5_PATTERN_GLOB { return 1 } if (*Fts5Config)(unsafe.Pointer(pConfig)).FePattern == FTS5_PATTERN_LIKE && (int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == FTS5_PATTERN_LIKE || int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == FTS5_PATTERN_GLOB) { return 1 } return 0 } func fts5BestIndexMethod(tls *libc.TLS, pVTab uintptr, pInfo uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pTab uintptr = pVTab var pConfig uintptr = (*Fts5Table)(unsafe.Pointer(pTab)).FpConfig var nCol int32 = (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol var idxFlags int32 = 0 var i int32 var idxStr uintptr var iIdxStr int32 = 0 var iCons int32 = 0 var bSeenEq int32 = 0 var bSeenGt int32 = 0 var bSeenLt int32 = 0 var bSeenMatch int32 = 0 var bSeenRank int32 = 0 if (*Fts5Config)(unsafe.Pointer(pConfig)).FbLock != 0 { (*Fts5Table)(unsafe.Pointer(pTab)).Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+36740, 0) return SQLITE_ERROR } idxStr = Xsqlite3_malloc(tls, (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FnConstraint*8+1) if idxStr == uintptr(0) { return SQLITE_NOMEM } (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FidxStr = idxStr (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FneedToFreeIdxStr = 1 for i = 0; i < (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FnConstraint; i++ { var p uintptr = (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraint + uintptr(i)*12 var iCol int32 = (*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_MATCH || int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_EQ && iCol >= nCol { if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fusable) == 0 || iCol < 0 { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = 1e50 *(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr))) = int8(0) return SQLITE_OK } else { if iCol == nCol+1 { if bSeenRank != 0 { continue } *(*int8)(unsafe.Pointer(idxStr + uintptr(libc.PostIncInt32(&iIdxStr, 1)))) = int8('r') bSeenRank = 1 } else if iCol >= 0 { bSeenMatch = 1 *(*int8)(unsafe.Pointer(idxStr + uintptr(libc.PostIncInt32(&iIdxStr, 1)))) = int8('M') Xsqlite3_snprintf(tls, 6, idxStr+uintptr(iIdxStr), ts+6327, libc.VaList(bp, iCol)) idxStr += uintptr(libc.Xstrlen(tls, idxStr+uintptr(iIdxStr))) } (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(i)*8)).FargvIndex = libc.PreIncInt32(&iCons, 1) (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(i)*8)).Fomit = uint8(1) } } else if (*sqlite3_index_constraint)(unsafe.Pointer(p)).Fusable != 0 { if iCol >= 0 && iCol < nCol && fts5UsePatternMatch(tls, pConfig, p) != 0 { *(*int8)(unsafe.Pointer(idxStr + uintptr(libc.PostIncInt32(&iIdxStr, 1)))) = func() int8 { if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == FTS5_PATTERN_LIKE { return int8('L') } return int8('G') }() Xsqlite3_snprintf(tls, 6, idxStr+uintptr(iIdxStr), ts+6327, libc.VaList(bp+8, iCol)) idxStr += uintptr(libc.Xstrlen(tls, idxStr+uintptr(iIdxStr))) (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(i)*8)).FargvIndex = libc.PreIncInt32(&iCons, 1) } else if bSeenEq == 0 && int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_EQ && iCol < 0 { *(*int8)(unsafe.Pointer(idxStr + uintptr(libc.PostIncInt32(&iIdxStr, 1)))) = int8('=') bSeenEq = 1 (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(i)*8)).FargvIndex = libc.PreIncInt32(&iCons, 1) } } } if bSeenEq == 0 { for i = 0; i < (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FnConstraint; i++ { var p uintptr = (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraint + uintptr(i)*12 if (*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn < 0 && (*sqlite3_index_constraint)(unsafe.Pointer(p)).Fusable != 0 { var op int32 = int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) if op == SQLITE_INDEX_CONSTRAINT_LT || op == SQLITE_INDEX_CONSTRAINT_LE { if bSeenLt != 0 { continue } *(*int8)(unsafe.Pointer(idxStr + uintptr(libc.PostIncInt32(&iIdxStr, 1)))) = int8('<') (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(i)*8)).FargvIndex = libc.PreIncInt32(&iCons, 1) bSeenLt = 1 } else if op == SQLITE_INDEX_CONSTRAINT_GT || op == SQLITE_INDEX_CONSTRAINT_GE { if bSeenGt != 0 { continue } *(*int8)(unsafe.Pointer(idxStr + uintptr(libc.PostIncInt32(&iIdxStr, 1)))) = int8('>') (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(i)*8)).FargvIndex = libc.PreIncInt32(&iCons, 1) bSeenGt = 1 } } } } *(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr))) = int8(0) if (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FnOrderBy == 1 { var iSort int32 = (*sqlite3_index_orderby)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaOrderBy)).FiColumn if iSort == (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol+1 && bSeenMatch != 0 { idxFlags = idxFlags | FTS5_BI_ORDER_RANK } else if iSort == -1 { idxFlags = idxFlags | FTS5_BI_ORDER_ROWID } if idxFlags&(FTS5_BI_ORDER_RANK|FTS5_BI_ORDER_ROWID) != 0 { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).ForderByConsumed = 1 if (*sqlite3_index_orderby)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaOrderBy)).Fdesc != 0 { idxFlags = idxFlags | FTS5_BI_ORDER_DESC } } } if bSeenEq != 0 { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = func() float64 { if bSeenMatch != 0 { return 100.0 } return 10.0 }() if bSeenMatch == 0 { fts5SetUniqueFlag(tls, pInfo) } } else if bSeenLt != 0 && bSeenGt != 0 { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = func() float64 { if bSeenMatch != 0 { return 500.0 } return 250000.0 }() } else if bSeenLt != 0 || bSeenGt != 0 { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = func() float64 { if bSeenMatch != 0 { return 750.0 } return 750000.0 }() } else { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = func() float64 { if bSeenMatch != 0 { return 1000.0 } return 1000000.0 }() } (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FidxNum = idxFlags return SQLITE_OK } func fts5NewTransaction(tls *libc.TLS, pTab uintptr) int32 { var pCsr uintptr for pCsr = (*Fts5Global)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpGlobal)).FpCsr; pCsr != 0; pCsr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpNext { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab == pTab { return SQLITE_OK } } return sqlite3Fts5StorageReset(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) } func fts5OpenMethod(tls *libc.TLS, pVTab uintptr, ppCsr uintptr) int32 { var pTab uintptr = pVTab var pConfig uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig var pCsr uintptr = uintptr(0) var nByte Sqlite3_int64 var rc int32 rc = fts5NewTransaction(tls, pTab) if rc == SQLITE_OK { nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Cursor{})) + uint64((*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)*uint64(unsafe.Sizeof(int32(0)))) pCsr = Xsqlite3_malloc64(tls, uint64(nByte)) if pCsr != 0 { var pGlobal uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).FpGlobal libc.Xmemset(tls, pCsr, 0, Size_t(nByte)) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaColumnSize = pCsr + 1*184 (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpNext = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpCsr (*Fts5Global)(unsafe.Pointer(pGlobal)).FpCsr = pCsr (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiCsrId = libc.PreIncInt64(&(*Fts5Global)(unsafe.Pointer(pGlobal)).FiNextId, 1) } else { rc = SQLITE_NOMEM } } *(*uintptr)(unsafe.Pointer(ppCsr)) = pCsr return rc } func fts5StmtType(tls *libc.TLS, pCsr uintptr) int32 { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == FTS5_PLAN_SCAN { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FbDesc != 0 { return FTS5_STMT_SCAN_DESC } return FTS5_STMT_SCAN_ASC } return FTS5_STMT_LOOKUP } func fts5CsrNewrow(tls *libc.TLS, pCsr uintptr) { *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_REQUIRE_CONTENT | FTS5CSR_REQUIRE_DOCSIZE | FTS5CSR_REQUIRE_INST | FTS5CSR_REQUIRE_POSLIST } func fts5FreeCursorComponents(tls *libc.TLS, pCsr uintptr) { var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab var pData uintptr var pNext uintptr Xsqlite3_free(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInstIter) Xsqlite3_free(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInst) if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt != 0 { var eStmt int32 = fts5StmtType(tls, pCsr) sqlite3Fts5StorageStmtRelease(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, eStmt, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt) } if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter != 0 { var pSorter uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter Xsqlite3_finalize(tls, (*Fts5Sorter)(unsafe.Pointer(pSorter)).FpStmt) Xsqlite3_free(tls, pSorter) } if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan != FTS5_PLAN_SOURCE { sqlite3Fts5ExprFree(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) } for pData = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAuxdata; pData != 0; pData = pNext { pNext = (*Fts5Auxdata)(unsafe.Pointer(pData)).FpNext if (*Fts5Auxdata)(unsafe.Pointer(pData)).FxDelete != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Auxdata)(unsafe.Pointer(pData)).FxDelete})).f(tls, (*Fts5Auxdata)(unsafe.Pointer(pData)).FpPtr) } Xsqlite3_free(tls, pData) } Xsqlite3_finalize(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpRankArgStmt) Xsqlite3_free(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FapRankArg) if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_FREE_ZRANK != 0 { Xsqlite3_free(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRank) Xsqlite3_free(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRankArgs) } sqlite3Fts5IndexCloseReader(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex) libc.Xmemset(tls, pCsr+32, 0, uint64(unsafe.Sizeof(Fts5Cursor{}))-uint64((int64(pCsr+32)-int64(pCsr))/1)) } func fts5CloseMethod(tls *libc.TLS, pCursor uintptr) int32 { if pCursor != 0 { var pTab uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab var pCsr uintptr = pCursor var pp uintptr fts5FreeCursorComponents(tls, pCsr) for pp = (*Fts5FullTable)(unsafe.Pointer(pTab)).FpGlobal + 72; *(*uintptr)(unsafe.Pointer(pp)) != pCsr; pp = *(*uintptr)(unsafe.Pointer(pp)) + 8 { } *(*uintptr)(unsafe.Pointer(pp)) = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpNext Xsqlite3_free(tls, pCsr) } return SQLITE_OK } func fts5SorterNext(tls *libc.TLS, pCsr uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pSorter uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter var rc int32 rc = Xsqlite3_step(tls, (*Fts5Sorter)(unsafe.Pointer(pSorter)).FpStmt) if rc == SQLITE_DONE { rc = SQLITE_OK *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_EOF | FTS5CSR_REQUIRE_CONTENT } else if rc == SQLITE_ROW { var a uintptr var aBlob uintptr var nBlob int32 var i int32 var iOff int32 = 0 rc = SQLITE_OK (*Fts5Sorter)(unsafe.Pointer(pSorter)).FiRowid = Xsqlite3_column_int64(tls, (*Fts5Sorter)(unsafe.Pointer(pSorter)).FpStmt, 0) nBlob = Xsqlite3_column_bytes(tls, (*Fts5Sorter)(unsafe.Pointer(pSorter)).FpStmt, 1) aBlob = libc.AssignUintptr(&a, Xsqlite3_column_blob(tls, (*Fts5Sorter)(unsafe.Pointer(pSorter)).FpStmt, 1)) if nBlob > 0 { for i = 0; i < (*Fts5Sorter)(unsafe.Pointer(pSorter)).FnIdx-1; i++ { a += uintptr(sqlite3Fts5GetVarint32(tls, a, bp)) iOff = iOff + *(*int32)(unsafe.Pointer(bp)) *(*int32)(unsafe.Pointer(pSorter + 28 + uintptr(i)*4)) = iOff } *(*int32)(unsafe.Pointer(pSorter + 28 + uintptr(i)*4)) = int32((int64(aBlob+uintptr(nBlob)) - int64(a)) / 1) (*Fts5Sorter)(unsafe.Pointer(pSorter)).FaPoslist = a } fts5CsrNewrow(tls, pCsr) } return rc } func fts5TripCursors(tls *libc.TLS, pTab uintptr) { var pCsr uintptr for pCsr = (*Fts5Global)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpGlobal)).FpCsr; pCsr != 0; pCsr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpNext { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == FTS5_PLAN_MATCH && (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab == pTab { *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_REQUIRE_RESEEK } } } func fts5CursorReseek(tls *libc.TLS, pCsr uintptr, pbSkip uintptr) int32 { var rc int32 = SQLITE_OK if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_REQUIRE_RESEEK != 0 { var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab var bDesc int32 = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FbDesc var iRowid I64 = sqlite3Fts5ExprRowid(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) rc = sqlite3Fts5ExprFirst(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex, iRowid, bDesc) if rc == SQLITE_OK && iRowid != sqlite3Fts5ExprRowid(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) { *(*int32)(unsafe.Pointer(pbSkip)) = 1 } *(*int32)(unsafe.Pointer(pCsr + 80)) &= libc.CplInt32(FTS5CSR_REQUIRE_RESEEK) fts5CsrNewrow(tls, pCsr) if sqlite3Fts5ExprEof(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) != 0 { *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_EOF *(*int32)(unsafe.Pointer(pbSkip)) = 1 } } return rc } func fts5NextMethod(tls *libc.TLS, pCursor uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var pCsr uintptr = pCursor var rc int32 if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan < 3 { *(*int32)(unsafe.Pointer(bp + 8)) = 0 if libc.AssignInt32(&rc, fts5CursorReseek(tls, pCsr, bp+8)) != 0 || *(*int32)(unsafe.Pointer(bp + 8)) != 0 { return rc } rc = sqlite3Fts5ExprNext(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiLastRowid) *(*int32)(unsafe.Pointer(pCsr + 80)) |= sqlite3Fts5ExprEof(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) fts5CsrNewrow(tls, pCsr) } else { switch (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan { case FTS5_PLAN_SPECIAL: { *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_EOF rc = SQLITE_OK break } fallthrough case FTS5_PLAN_SORTED_MATCH: { rc = fts5SorterNext(tls, pCsr) break } fallthrough default: { var pConfig uintptr = (*Fts5Table)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab)).FpConfig (*Fts5Config)(unsafe.Pointer(pConfig)).FbLock++ rc = Xsqlite3_step(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt) (*Fts5Config)(unsafe.Pointer(pConfig)).FbLock-- if rc != SQLITE_ROW { *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_EOF rc = Xsqlite3_reset(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt) if rc != SQLITE_OK { (*Sqlite3_vtab)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab)).FzErrMsg = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, Xsqlite3_errmsg(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb))) } } else { rc = SQLITE_OK } break } } } return rc } func fts5PrepareStatement(tls *libc.TLS, ppStmt uintptr, pConfig uintptr, zFmt uintptr, va uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) var rc int32 var zSql uintptr var ap Va_list _ = ap ap = va zSql = Xsqlite3_vmprintf(tls, zFmt, ap) if zSql == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_prepare_v3(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, zSql, -1, uint32(SQLITE_PREPARE_PERSISTENT), bp+8, uintptr(0)) if rc != SQLITE_OK { *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, Xsqlite3_errmsg(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb))) } Xsqlite3_free(tls, zSql) } _ = ap *(*uintptr)(unsafe.Pointer(ppStmt)) = *(*uintptr)(unsafe.Pointer(bp + 8)) return rc } func fts5CursorFirstSorted(tls *libc.TLS, pTab uintptr, pCsr uintptr, bDesc int32) int32 { bp := tls.Alloc(56) defer tls.Free(56) var pConfig uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig var pSorter uintptr var nPhrase int32 var nByte Sqlite3_int64 var rc int32 var zRank uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRank var zRankArgs uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRankArgs nPhrase = sqlite3Fts5ExprPhraseCount(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Sorter{})) + uint64(unsafe.Sizeof(int32(0)))*uint64(nPhrase-1)) pSorter = Xsqlite3_malloc64(tls, uint64(nByte)) if pSorter == uintptr(0) { return SQLITE_NOMEM } libc.Xmemset(tls, pSorter, 0, Size_t(nByte)) (*Fts5Sorter)(unsafe.Pointer(pSorter)).FnIdx = nPhrase rc = fts5PrepareStatement(tls, pSorter, pConfig, ts+36779, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, zRank, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, func() uintptr { if zRankArgs != 0 { return ts + 15971 } return ts + 1544 }(), func() uintptr { if zRankArgs != 0 { return zRankArgs } return ts + 1544 }(), func() uintptr { if bDesc != 0 { return ts + 36834 } return ts + 36839 }())) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter = pSorter if rc == SQLITE_OK { (*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr = pCsr rc = fts5SorterNext(tls, pCsr) (*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr = uintptr(0) } if rc != SQLITE_OK { Xsqlite3_finalize(tls, (*Fts5Sorter)(unsafe.Pointer(pSorter)).FpStmt) Xsqlite3_free(tls, pSorter) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter = uintptr(0) } return rc } func fts5CursorFirst(tls *libc.TLS, pTab uintptr, pCsr uintptr, bDesc int32) int32 { var rc int32 var pExpr uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr rc = sqlite3Fts5ExprFirst(tls, pExpr, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiFirstRowid, bDesc) if sqlite3Fts5ExprEof(tls, pExpr) != 0 { *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_EOF } fts5CsrNewrow(tls, pCsr) return rc } func fts5SpecialMatch(tls *libc.TLS, pTab uintptr, pCsr uintptr, zQuery uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var rc int32 = SQLITE_OK var z uintptr = zQuery var n int32 for int32(*(*int8)(unsafe.Pointer(z))) == ' ' { z++ } for n = 0; *(*int8)(unsafe.Pointer(z + uintptr(n))) != 0 && int32(*(*int8)(unsafe.Pointer(z + uintptr(n)))) != ' '; n++ { } (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan = FTS5_PLAN_SPECIAL if n == 5 && 0 == Xsqlite3_strnicmp(tls, ts+36843, z, n) { (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiSpecial = I64(sqlite3Fts5IndexReads(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex)) } else if n == 2 && 0 == Xsqlite3_strnicmp(tls, ts+6409, z, n) { (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiSpecial = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiCsrId } else { (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+36849, libc.VaList(bp, n, z)) rc = SQLITE_ERROR } return rc } func fts5FindAuxiliary(tls *libc.TLS, pTab uintptr, zName uintptr) uintptr { var pAux uintptr for pAux = (*Fts5Global)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpGlobal)).FpAux; pAux != 0; pAux = (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FpNext { if Xsqlite3_stricmp(tls, zName, (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FzFunc) == 0 { return pAux } } return uintptr(0) } func fts5FindRankFunction(tls *libc.TLS, pCsr uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab var pConfig uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK var pAux uintptr = uintptr(0) var zRank uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRank var zRankArgs uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRankArgs if zRankArgs != 0 { var zSql uintptr = sqlite3Fts5Mprintf(tls, bp+16, ts+36877, libc.VaList(bp, zRankArgs)) if zSql != 0 { *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) *(*int32)(unsafe.Pointer(bp + 16)) = Xsqlite3_prepare_v3(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, zSql, -1, uint32(SQLITE_PREPARE_PERSISTENT), bp+24, uintptr(0)) Xsqlite3_free(tls, zSql) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) { var nByte Sqlite3_int64 (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnRankArg = Xsqlite3_column_count(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) nByte = Sqlite3_int64(uint64(unsafe.Sizeof(uintptr(0))) * uint64((*Fts5Cursor)(unsafe.Pointer(pCsr)).FnRankArg)) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FapRankArg = sqlite3Fts5MallocZero(tls, bp+16, nByte) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { var i int32 for i = 0; i < (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnRankArg; i++ { *(*uintptr)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FapRankArg + uintptr(i)*8)) = Xsqlite3_column_value(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), i) } } (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpRankArgStmt = *(*uintptr)(unsafe.Pointer(bp + 24)) } else { *(*int32)(unsafe.Pointer(bp + 16)) = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) } } } } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { pAux = fts5FindAuxiliary(tls, pTab, zRank) if pAux == uintptr(0) { (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+36887, libc.VaList(bp+8, zRank)) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_ERROR } } (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpRank = pAux return *(*int32)(unsafe.Pointer(bp + 16)) } func fts5CursorParseRank(tls *libc.TLS, pConfig uintptr, pCsr uintptr, pRank uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var rc int32 = SQLITE_OK if pRank != 0 { var z uintptr = Xsqlite3_value_text(tls, pRank) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) if z == uintptr(0) { if Xsqlite3_value_type(tls, pRank) == SQLITE_NULL { rc = SQLITE_ERROR } } else { rc = sqlite3Fts5ConfigParseRank(tls, z, bp+8, bp+16) } if rc == SQLITE_OK { (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRank = *(*uintptr)(unsafe.Pointer(bp + 8)) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRankArgs = *(*uintptr)(unsafe.Pointer(bp + 16)) *(*int32)(unsafe.Pointer(pCsr + 80)) |= FTS5CSR_FREE_ZRANK } else if rc == SQLITE_ERROR { (*Sqlite3_vtab)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab)).FzErrMsg = Xsqlite3_mprintf(tls, ts+36908, libc.VaList(bp, z)) } } else { if (*Fts5Config)(unsafe.Pointer(pConfig)).FzRank != 0 { (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRank = (*Fts5Config)(unsafe.Pointer(pConfig)).FzRank (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRankArgs = (*Fts5Config)(unsafe.Pointer(pConfig)).FzRankArgs } else { (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRank = ts + 35291 (*Fts5Cursor)(unsafe.Pointer(pCsr)).FzRankArgs = uintptr(0) } } return rc } func fts5GetRowidLimit(tls *libc.TLS, pVal uintptr, iDefault I64) I64 { if pVal != 0 { var eType int32 = Xsqlite3_value_numeric_type(tls, pVal) if eType == SQLITE_INTEGER { return Xsqlite3_value_int64(tls, pVal) } } return iDefault } func fts5FilterMethod(tls *libc.TLS, pCursor uintptr, idxNum int32, idxStr uintptr, nVal int32, apVal uintptr) int32 { bp := tls.Alloc(16) defer tls.Free(16) var pTab uintptr var pConfig uintptr var pCsr uintptr var rc int32 var bDesc int32 var bOrderByRank int32 var pRank uintptr var pRowidEq uintptr var pRowidLe uintptr var pRowidGe uintptr var iCol int32 var pzErrmsg uintptr var i int32 var iIdxStr int32 var pzErr uintptr var zText uintptr var bGlob int32 var zText1 uintptr pTab = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab pConfig = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig pCsr = pCursor rc = SQLITE_OK pRank = uintptr(0) pRowidEq = uintptr(0) pRowidLe = uintptr(0) pRowidGe = uintptr(0) pzErrmsg = (*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg iIdxStr = 0 *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) if !((*Fts5Config)(unsafe.Pointer(pConfig)).FbLock != 0) { goto __1 } (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+36740, 0) return SQLITE_ERROR __1: ; if !((*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan != 0) { goto __2 } fts5FreeCursorComponents(tls, pCsr) libc.Xmemset(tls, pCsr+32, 0, uint64(unsafe.Sizeof(Fts5Cursor{}))-uint64((int64(pCsr+32)-int64(pCsr))/1)) __2: ; (*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg = pTab + 16 i = 0 __3: if !(i < nVal) { goto __5 } switch int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(libc.PostIncInt32(&iIdxStr, 1))))) { case 'r': goto __7 case 'M': goto __8 case 'L': goto __9 case 'G': goto __10 case '=': goto __11 case '<': goto __12 default: goto __13 } goto __6 __7: pRank = *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8)) goto __6 __8: zText = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8))) if !(zText == uintptr(0)) { goto __14 } zText = ts + 1544 __14: ; iCol = 0 __15: iCol = iCol*10 + (int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr)))) - '0') iIdxStr++ goto __16 __16: if int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr)))) >= '0' && int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr)))) <= '9' { goto __15 } goto __17 __17: ; if !(int32(*(*int8)(unsafe.Pointer(zText))) == '*') { goto __18 } rc = fts5SpecialMatch(tls, pTab, pCsr, zText+1) goto filter_out goto __19 __18: pzErr = pTab + 16 rc = sqlite3Fts5ExprNew(tls, pConfig, 0, iCol, zText, bp+8, pzErr) if !(rc == SQLITE_OK) { goto __20 } rc = sqlite3Fts5ExprAnd(tls, pCsr+64, *(*uintptr)(unsafe.Pointer(bp + 8))) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) __20: ; if !(rc != SQLITE_OK) { goto __21 } goto filter_out __21: ; __19: ; goto __6 __9: __10: bGlob = libc.Bool32(int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr-1)))) == 'G') zText1 = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8))) iCol = 0 __22: iCol = iCol*10 + (int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr)))) - '0') iIdxStr++ goto __23 __23: if int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr)))) >= '0' && int32(*(*int8)(unsafe.Pointer(idxStr + uintptr(iIdxStr)))) <= '9' { goto __22 } goto __24 __24: ; if !(zText1 != 0) { goto __25 } rc = sqlite3Fts5ExprPattern(tls, pConfig, bGlob, iCol, zText1, bp+8) __25: ; if !(rc == SQLITE_OK) { goto __26 } rc = sqlite3Fts5ExprAnd(tls, pCsr+64, *(*uintptr)(unsafe.Pointer(bp + 8))) *(*uintptr)(unsafe.Pointer(bp + 8)) = uintptr(0) __26: ; if !(rc != SQLITE_OK) { goto __27 } goto filter_out __27: ; goto __6 __11: pRowidEq = *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8)) goto __6 __12: pRowidLe = *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8)) goto __6 __13: ; pRowidGe = *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8)) goto __6 __6: ; goto __4 __4: i++ goto __3 goto __5 __5: ; bOrderByRank = func() int32 { if idxNum&FTS5_BI_ORDER_RANK != 0 { return 1 } return 0 }() (*Fts5Cursor)(unsafe.Pointer(pCsr)).FbDesc = libc.AssignInt32(&bDesc, func() int32 { if idxNum&FTS5_BI_ORDER_DESC != 0 { return 1 } return 0 }()) if !(pRowidEq != 0) { goto __28 } pRowidLe = libc.AssignUintptr(&pRowidGe, pRowidEq) __28: ; if !(bDesc != 0) { goto __29 } (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiFirstRowid = fts5GetRowidLimit(tls, pRowidLe, int64(0xffffffff)|int64(0x7fffffff)<<32) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiLastRowid = fts5GetRowidLimit(tls, pRowidGe, int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32)) goto __30 __29: (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiLastRowid = fts5GetRowidLimit(tls, pRowidLe, int64(0xffffffff)|int64(0x7fffffff)<<32) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiFirstRowid = fts5GetRowidLimit(tls, pRowidGe, int64(-1)-(int64(0xffffffff)|int64(0x7fffffff)<<32)) __30: ; if !((*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr != 0) { goto __31 } if !((*Fts5Cursor)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr)).FbDesc != 0) { goto __33 } (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiLastRowid = (*Fts5Cursor)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr)).FiFirstRowid (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiFirstRowid = (*Fts5Cursor)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr)).FiLastRowid goto __34 __33: (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiLastRowid = (*Fts5Cursor)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr)).FiLastRowid (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiFirstRowid = (*Fts5Cursor)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr)).FiFirstRowid __34: ; (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan = FTS5_PLAN_SOURCE (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr = (*Fts5Cursor)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).FpSortCsr)).FpExpr rc = fts5CursorFirst(tls, pTab, pCsr, bDesc) goto __32 __31: if !((*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr != 0) { goto __35 } rc = fts5CursorParseRank(tls, pConfig, pCsr, pRank) if !(rc == SQLITE_OK) { goto __37 } if !(bOrderByRank != 0) { goto __38 } (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan = FTS5_PLAN_SORTED_MATCH rc = fts5CursorFirstSorted(tls, pTab, pCsr, bDesc) goto __39 __38: (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan = FTS5_PLAN_MATCH rc = fts5CursorFirst(tls, pTab, pCsr, bDesc) __39: ; __37: ; goto __36 __35: if !((*Fts5Config)(unsafe.Pointer(pConfig)).FzContent == uintptr(0)) { goto __40 } *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg)) = Xsqlite3_mprintf(tls, ts+36941, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) rc = SQLITE_ERROR goto __41 __40: (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan = func() int32 { if pRowidEq != 0 { return FTS5_PLAN_ROWID } return FTS5_PLAN_SCAN }() rc = sqlite3Fts5StorageStmt(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, fts5StmtType(tls, pCsr), pCsr+56, pTab+16) if !(rc == SQLITE_OK) { goto __42 } if !(pRowidEq != uintptr(0)) { goto __43 } Xsqlite3_bind_value(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, 1, pRowidEq) goto __44 __43: Xsqlite3_bind_int64(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, 1, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiFirstRowid) Xsqlite3_bind_int64(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, 2, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiLastRowid) __44: ; rc = fts5NextMethod(tls, pCursor) __42: ; __41: ; __36: ; __32: ; filter_out: sqlite3Fts5ExprFree(tls, *(*uintptr)(unsafe.Pointer(bp + 8))) (*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg = pzErrmsg return rc } func fts5EofMethod(tls *libc.TLS, pCursor uintptr) int32 { var pCsr uintptr = pCursor return func() int32 { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_EOF != 0 { return 1 } return 0 }() } func fts5CursorRowid(tls *libc.TLS, pCsr uintptr) I64 { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter != 0 { return (*Fts5Sorter)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter)).FiRowid } else { return sqlite3Fts5ExprRowid(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) } return I64(0) } func fts5RowidMethod(tls *libc.TLS, pCursor uintptr, pRowid uintptr) int32 { var pCsr uintptr = pCursor var ePlan int32 = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan switch ePlan { case FTS5_PLAN_SPECIAL: *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = int64(0) break case FTS5_PLAN_SOURCE: fallthrough case FTS5_PLAN_MATCH: fallthrough case FTS5_PLAN_SORTED_MATCH: *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = fts5CursorRowid(tls, pCsr) break default: *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = Xsqlite3_column_int64(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, 0) break } return SQLITE_OK } func fts5SeekCursor(tls *libc.TLS, pCsr uintptr, bErrormsg int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt == uintptr(0) { var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab var eStmt int32 = fts5StmtType(tls, pCsr) rc = sqlite3Fts5StorageStmt(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, eStmt, pCsr+56, func() uintptr { if bErrormsg != 0 { return pTab + 16 } return uintptr(0) }()) } if rc == SQLITE_OK && (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_REQUIRE_CONTENT != 0 { var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab Xsqlite3_reset(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt) Xsqlite3_bind_int64(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, 1, fts5CursorRowid(tls, pCsr)) (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer(pTab)).FpConfig)).FbLock++ rc = Xsqlite3_step(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt) (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer(pTab)).FpConfig)).FbLock-- if rc == SQLITE_ROW { rc = SQLITE_OK *(*int32)(unsafe.Pointer(pCsr + 80)) &= libc.CplInt32(FTS5CSR_REQUIRE_CONTENT) } else { rc = Xsqlite3_reset(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt) if rc == SQLITE_OK { rc = SQLITE_CORRUPT | int32(1)<<8 } else if (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer(pTab)).FpConfig)).FpzErrmsg != 0 { *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer(pTab)).FpConfig)).FpzErrmsg)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp, Xsqlite3_errmsg(tls, (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer(pTab)).FpConfig)).Fdb))) } } } return rc } func fts5SetVtabError(tls *libc.TLS, p uintptr, zFormat uintptr, va uintptr) { var ap Va_list _ = ap ap = va (*Fts5FullTable)(unsafe.Pointer(p)).Fp.Fbase.FzErrMsg = Xsqlite3_vmprintf(tls, zFormat, ap) _ = ap } func fts5SpecialInsert(tls *libc.TLS, pTab uintptr, zCmd uintptr, pVal uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pConfig uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig var rc int32 = SQLITE_OK *(*int32)(unsafe.Pointer(bp)) = 0 if 0 == Xsqlite3_stricmp(tls, ts+36977, zCmd) { if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL { fts5SetVtabError(tls, pTab, ts+36988, 0) rc = SQLITE_ERROR } else { rc = sqlite3Fts5StorageDeleteAll(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) } } else if 0 == Xsqlite3_stricmp(tls, ts+37068, zCmd) { if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NONE { fts5SetVtabError(tls, pTab, ts+37076, 0) rc = SQLITE_ERROR } else { rc = sqlite3Fts5StorageRebuild(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) } } else if 0 == Xsqlite3_stricmp(tls, ts+18313, zCmd) { rc = sqlite3Fts5StorageOptimize(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) } else if 0 == Xsqlite3_stricmp(tls, ts+37132, zCmd) { var nMerge int32 = Xsqlite3_value_int(tls, pVal) rc = sqlite3Fts5StorageMerge(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, nMerge) } else if 0 == Xsqlite3_stricmp(tls, ts+37138, zCmd) { var iArg int32 = Xsqlite3_value_int(tls, pVal) rc = sqlite3Fts5StorageIntegrity(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iArg) } else { rc = sqlite3Fts5IndexLoadConfig(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpIndex) if rc == SQLITE_OK { rc = sqlite3Fts5ConfigSetValue(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig, zCmd, pVal, bp) } if rc == SQLITE_OK { if *(*int32)(unsafe.Pointer(bp)) != 0 { rc = SQLITE_ERROR } else { rc = sqlite3Fts5StorageConfigValue(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, zCmd, pVal, 0) } } } return rc } func fts5SpecialDelete(tls *libc.TLS, pTab uintptr, apVal uintptr) int32 { var rc int32 = SQLITE_OK var eType1 int32 = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) if eType1 == SQLITE_INTEGER { var iDel Sqlite3_int64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) rc = sqlite3Fts5StorageDelete(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iDel, apVal+2*8) } return rc } func fts5StorageInsert(tls *libc.TLS, pRc uintptr, pTab uintptr, apVal uintptr, piRowid uintptr) { var rc int32 = *(*int32)(unsafe.Pointer(pRc)) if rc == SQLITE_OK { rc = sqlite3Fts5StorageContentInsert(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, apVal, piRowid) } if rc == SQLITE_OK { rc = sqlite3Fts5StorageIndexInsert(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, apVal, *(*I64)(unsafe.Pointer(piRowid))) } *(*int32)(unsafe.Pointer(pRc)) = rc } func fts5UpdateMethod(tls *libc.TLS, pVtab uintptr, nArg int32, apVal uintptr, pRowid uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) var pTab uintptr = pVtab var pConfig uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig var eType0 int32 *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK (*Fts5Config)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig)).FpzErrmsg = pTab + 16 fts5TripCursors(tls, pTab) eType0 = Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(apVal))) if eType0 == SQLITE_NULL && Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(2+(*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)*8))) != SQLITE_NULL { var z uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(2+(*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)*8))) if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent != FTS5_CONTENT_NORMAL && 0 == Xsqlite3_stricmp(tls, ts+18848, z) { *(*int32)(unsafe.Pointer(bp + 16)) = fts5SpecialDelete(tls, pTab, apVal) } else { *(*int32)(unsafe.Pointer(bp + 16)) = fts5SpecialInsert(tls, pTab, z, *(*uintptr)(unsafe.Pointer(apVal + uintptr(2+(*Fts5Config)(unsafe.Pointer(pConfig)).FnCol+1)*8))) } } else { var eConflict int32 = SQLITE_ABORT if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL { eConflict = Xsqlite3_vtab_on_conflict(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb) } if eType0 == SQLITE_INTEGER && fts5IsContentless(tls, pTab) != 0 { (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.Fbase.FzErrMsg = Xsqlite3_mprintf(tls, ts+37154, libc.VaList(bp, func() uintptr { if nArg > 1 { return ts + 21845 } return ts + 37191 }(), (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_ERROR } else if nArg == 1 { var iDel I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apVal))) *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageDelete(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iDel, uintptr(0)) } else { var eType1 int32 = Xsqlite3_value_numeric_type(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) if eType1 != SQLITE_INTEGER && eType1 != SQLITE_NULL { *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_MISMATCH } else if eType0 != SQLITE_INTEGER { if eConflict == SQLITE_REPLACE && eType1 == SQLITE_INTEGER { var iNew I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageDelete(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iNew, uintptr(0)) } fts5StorageInsert(tls, bp+16, pTab, apVal, pRowid) } else { var iOld I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apVal))) var iNew I64 = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) if eType1 == SQLITE_INTEGER && iOld != iNew { if eConflict == SQLITE_REPLACE { *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageDelete(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iOld, uintptr(0)) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageDelete(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iNew, uintptr(0)) } fts5StorageInsert(tls, bp+16, pTab, apVal, pRowid) } else { *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageContentInsert(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, apVal, pRowid) if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageDelete(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iOld, uintptr(0)) } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageIndexInsert(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, apVal, *(*Sqlite_int64)(unsafe.Pointer(pRowid))) } } } else { *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5StorageDelete(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iOld, uintptr(0)) fts5StorageInsert(tls, bp+16, pTab, apVal, pRowid) } } } } (*Fts5Config)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig)).FpzErrmsg = uintptr(0) return *(*int32)(unsafe.Pointer(bp + 16)) } func fts5SyncMethod(tls *libc.TLS, pVtab uintptr) int32 { var rc int32 var pTab uintptr = pVtab (*Fts5Config)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig)).FpzErrmsg = pTab + 16 fts5TripCursors(tls, pTab) rc = sqlite3Fts5StorageSync(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) (*Fts5Config)(unsafe.Pointer((*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig)).FpzErrmsg = uintptr(0) return rc } func fts5BeginMethod(tls *libc.TLS, pVtab uintptr) int32 { fts5NewTransaction(tls, pVtab) return SQLITE_OK } func fts5CommitMethod(tls *libc.TLS, pVtab uintptr) int32 { _ = pVtab return SQLITE_OK } func fts5RollbackMethod(tls *libc.TLS, pVtab uintptr) int32 { var rc int32 var pTab uintptr = pVtab rc = sqlite3Fts5StorageRollback(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) return rc } func fts5ApiUserData(tls *libc.TLS, pCtx uintptr) uintptr { var pCsr uintptr = pCtx return (*Fts5Auxiliary)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAux)).FpUserData } func fts5ApiColumnCount(tls *libc.TLS, pCtx uintptr) int32 { var pCsr uintptr = pCtx return (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab)).FpConfig)).FnCol } func fts5ApiColumnTotalSize(tls *libc.TLS, pCtx uintptr, iCol int32, pnToken uintptr) int32 { var pCsr uintptr = pCtx var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab return sqlite3Fts5StorageSize(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iCol, pnToken) } func fts5ApiRowCount(tls *libc.TLS, pCtx uintptr, pnRow uintptr) int32 { var pCsr uintptr = pCtx var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab return sqlite3Fts5StorageRowCount(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, pnRow) } func fts5ApiTokenize(tls *libc.TLS, pCtx uintptr, pText uintptr, nText int32, pUserData uintptr, xToken uintptr) int32 { var pCsr uintptr = pCtx var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab return sqlite3Fts5Tokenize(tls, (*Fts5Table)(unsafe.Pointer(pTab)).FpConfig, FTS5_TOKENIZE_AUX, pText, nText, pUserData, xToken) } func fts5ApiPhraseCount(tls *libc.TLS, pCtx uintptr) int32 { var pCsr uintptr = pCtx return sqlite3Fts5ExprPhraseCount(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) } func fts5ApiPhraseSize(tls *libc.TLS, pCtx uintptr, iPhrase int32) int32 { var pCsr uintptr = pCtx return sqlite3Fts5ExprPhraseSize(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, iPhrase) } func fts5ApiColumnText(tls *libc.TLS, pCtx uintptr, iCol int32, pz uintptr, pn uintptr) int32 { var rc int32 = SQLITE_OK var pCsr uintptr = pCtx if fts5IsContentless(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab) != 0 || (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == FTS5_PLAN_SPECIAL { *(*uintptr)(unsafe.Pointer(pz)) = uintptr(0) *(*int32)(unsafe.Pointer(pn)) = 0 } else { rc = fts5SeekCursor(tls, pCsr, 0) if rc == SQLITE_OK { *(*uintptr)(unsafe.Pointer(pz)) = Xsqlite3_column_text(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, iCol+1) *(*int32)(unsafe.Pointer(pn)) = Xsqlite3_column_bytes(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, iCol+1) } } return rc } func fts5CsrPoslist(tls *libc.TLS, pCsr uintptr, iPhrase int32, pa uintptr, pn uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var pConfig uintptr = (*Fts5Table)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab)).FpConfig var rc int32 = SQLITE_OK var bLive int32 = libc.Bool32((*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter == uintptr(0)) if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_REQUIRE_POSLIST != 0 { if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail != FTS5_DETAIL_FULL { var aPopulator uintptr var i int32 aPopulator = sqlite3Fts5ExprClearPoslists(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, bLive) if aPopulator == uintptr(0) { rc = SQLITE_NOMEM } for i = 0; i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol && rc == SQLITE_OK; i++ { rc = fts5ApiColumnText(tls, pCsr, i, bp, bp+8) if rc == SQLITE_OK { rc = sqlite3Fts5ExprPopulatePoslists(tls, pConfig, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, aPopulator, i, *(*uintptr)(unsafe.Pointer(bp)), *(*int32)(unsafe.Pointer(bp + 8))) } } Xsqlite3_free(tls, aPopulator) if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter != 0 { sqlite3Fts5ExprCheckPoslists(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, (*Fts5Sorter)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter)).FiRowid) } } *(*int32)(unsafe.Pointer(pCsr + 80)) &= libc.CplInt32(FTS5CSR_REQUIRE_POSLIST) } if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter != 0 && (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_FULL { var pSorter uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter var i1 int32 = func() int32 { if iPhrase == 0 { return 0 } return *(*int32)(unsafe.Pointer(pSorter + 28 + uintptr(iPhrase-1)*4)) }() *(*int32)(unsafe.Pointer(pn)) = *(*int32)(unsafe.Pointer(pSorter + 28 + uintptr(iPhrase)*4)) - i1 *(*uintptr)(unsafe.Pointer(pa)) = (*Fts5Sorter)(unsafe.Pointer(pSorter)).FaPoslist + uintptr(i1) } else { *(*int32)(unsafe.Pointer(pn)) = sqlite3Fts5ExprPoslist(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, iPhrase, pa) } return rc } func fts5CacheInstArray(tls *libc.TLS, pCsr uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK var aIter uintptr var nIter int32 var nCol int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab)).FpConfig)).FnCol nIter = sqlite3Fts5ExprPhraseCount(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInstIter == uintptr(0) { var nByte Sqlite3_int64 = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5PoslistReader{})) * uint64(nIter)) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInstIter = sqlite3Fts5MallocZero(tls, bp, nByte) } aIter = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInstIter if aIter != 0 { var nInst int32 = 0 var i int32 for i = 0; i < nIter && *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK; i++ { *(*int32)(unsafe.Pointer(bp)) = fts5CsrPoslist(tls, pCsr, i, bp+8, bp+16) if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { sqlite3Fts5PoslistReaderInit(tls, *(*uintptr)(unsafe.Pointer(bp + 8)), *(*int32)(unsafe.Pointer(bp + 16)), aIter+uintptr(i)*32) } } if *(*int32)(unsafe.Pointer(bp)) == SQLITE_OK { for 1 != 0 { var aInst uintptr var iBest int32 = -1 for i = 0; i < nIter; i++ { if int32((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).FbEof) == 0 && (iBest < 0 || (*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(i)*32)).FiPos < (*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(iBest)*32)).FiPos) { iBest = i } } if iBest < 0 { break } nInst++ if nInst >= (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnInstAlloc { var nNewSize int32 if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnInstAlloc != 0 { nNewSize = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnInstAlloc * 2 } else { nNewSize = 32 } aInst = Xsqlite3_realloc64(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInst, uint64(nNewSize)*uint64(unsafe.Sizeof(int32(0)))*uint64(3)) if aInst != 0 { (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInst = aInst (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnInstAlloc = nNewSize } else { nInst-- *(*int32)(unsafe.Pointer(bp)) = SQLITE_NOMEM break } } aInst = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInst + uintptr(3*(nInst-1))*4 *(*int32)(unsafe.Pointer(aInst)) = iBest *(*int32)(unsafe.Pointer(aInst + 1*4)) = int32((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(iBest)*32)).FiPos >> 32) *(*int32)(unsafe.Pointer(aInst + 2*4)) = int32((*Fts5PoslistReader)(unsafe.Pointer(aIter+uintptr(iBest)*32)).FiPos & int64(0x7FFFFFFF)) if *(*int32)(unsafe.Pointer(aInst + 1*4)) < 0 || *(*int32)(unsafe.Pointer(aInst + 1*4)) >= nCol { *(*int32)(unsafe.Pointer(bp)) = SQLITE_CORRUPT | int32(1)<<8 break } sqlite3Fts5PoslistReaderNext(tls, aIter+uintptr(iBest)*32) } } (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnInstCount = nInst *(*int32)(unsafe.Pointer(pCsr + 80)) &= libc.CplInt32(FTS5CSR_REQUIRE_INST) } return *(*int32)(unsafe.Pointer(bp)) } func fts5ApiInstCount(tls *libc.TLS, pCtx uintptr, pnInst uintptr) int32 { var pCsr uintptr = pCtx var rc int32 = SQLITE_OK if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_REQUIRE_INST == 0 || SQLITE_OK == libc.AssignInt32(&rc, fts5CacheInstArray(tls, pCsr)) { *(*int32)(unsafe.Pointer(pnInst)) = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnInstCount } return rc } func fts5ApiInst(tls *libc.TLS, pCtx uintptr, iIdx int32, piPhrase uintptr, piCol uintptr, piOff uintptr) int32 { var pCsr uintptr = pCtx var rc int32 = SQLITE_OK if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_REQUIRE_INST == 0 || SQLITE_OK == libc.AssignInt32(&rc, fts5CacheInstArray(tls, pCsr)) { if iIdx < 0 || iIdx >= (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnInstCount { rc = SQLITE_RANGE } else { *(*int32)(unsafe.Pointer(piPhrase)) = *(*int32)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInst + uintptr(iIdx*3)*4)) *(*int32)(unsafe.Pointer(piCol)) = *(*int32)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInst + uintptr(iIdx*3+1)*4)) *(*int32)(unsafe.Pointer(piOff)) = *(*int32)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FaInst + uintptr(iIdx*3+2)*4)) } } return rc } func fts5ApiRowid(tls *libc.TLS, pCtx uintptr) Sqlite3_int64 { return fts5CursorRowid(tls, pCtx) } func fts5ColumnSizeCb(tls *libc.TLS, pContext uintptr, tflags int32, pUnused uintptr, nUnused int32, iUnused1 int32, iUnused2 int32) int32 { var pCnt uintptr = pContext _ = pUnused _ = nUnused _ = iUnused1 _ = iUnused2 if tflags&FTS5_TOKEN_COLOCATED == 0 { *(*int32)(unsafe.Pointer(pCnt))++ } return SQLITE_OK } func fts5ApiColumnSize(tls *libc.TLS, pCtx uintptr, iCol int32, pnToken uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) var pCsr uintptr = pCtx var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab var pConfig uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig var rc int32 = SQLITE_OK if (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fcsrflags&FTS5CSR_REQUIRE_DOCSIZE != 0 { if (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { var iRowid I64 = fts5CursorRowid(tls, pCsr) rc = sqlite3Fts5StorageDocsize(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, iRowid, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaColumnSize) } else if (*Fts5Config)(unsafe.Pointer(pConfig)).FzContent == uintptr(0) { var i int32 for i = 0; i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { if int32(*(*U8)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FabUnindexed + uintptr(i)))) == 0 { *(*int32)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FaColumnSize + uintptr(i)*4)) = -1 } } } else { var i int32 for i = 0; rc == SQLITE_OK && i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { if int32(*(*U8)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FabUnindexed + uintptr(i)))) == 0 { var p uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FaColumnSize + uintptr(i)*4 *(*int32)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FaColumnSize + uintptr(i)*4)) = 0 rc = fts5ApiColumnText(tls, pCtx, i, bp, bp+8) if rc == SQLITE_OK { rc = sqlite3Fts5Tokenize(tls, pConfig, FTS5_TOKENIZE_AUX, *(*uintptr)(unsafe.Pointer(bp)), *(*int32)(unsafe.Pointer(bp + 8)), p, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5ColumnSizeCb}))) } } } } *(*int32)(unsafe.Pointer(pCsr + 80)) &= libc.CplInt32(FTS5CSR_REQUIRE_DOCSIZE) } if iCol < 0 { var i int32 *(*int32)(unsafe.Pointer(pnToken)) = 0 for i = 0; i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { *(*int32)(unsafe.Pointer(pnToken)) += *(*int32)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FaColumnSize + uintptr(i)*4)) } } else if iCol < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol { *(*int32)(unsafe.Pointer(pnToken)) = *(*int32)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).FaColumnSize + uintptr(iCol)*4)) } else { *(*int32)(unsafe.Pointer(pnToken)) = 0 rc = SQLITE_RANGE } return rc } func fts5ApiSetAuxdata(tls *libc.TLS, pCtx uintptr, pPtr uintptr, xDelete uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pCsr uintptr = pCtx var pData uintptr for pData = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAuxdata; pData != 0; pData = (*Fts5Auxdata)(unsafe.Pointer(pData)).FpNext { if (*Fts5Auxdata)(unsafe.Pointer(pData)).FpAux == (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAux { break } } if pData != 0 { if (*Fts5Auxdata)(unsafe.Pointer(pData)).FxDelete != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Auxdata)(unsafe.Pointer(pData)).FxDelete})).f(tls, (*Fts5Auxdata)(unsafe.Pointer(pData)).FpPtr) } } else { *(*int32)(unsafe.Pointer(bp)) = SQLITE_OK pData = sqlite3Fts5MallocZero(tls, bp, int64(unsafe.Sizeof(Fts5Auxdata{}))) if pData == uintptr(0) { if xDelete != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{xDelete})).f(tls, pPtr) } return *(*int32)(unsafe.Pointer(bp)) } (*Fts5Auxdata)(unsafe.Pointer(pData)).FpAux = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAux (*Fts5Auxdata)(unsafe.Pointer(pData)).FpNext = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAuxdata (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAuxdata = pData } (*Fts5Auxdata)(unsafe.Pointer(pData)).FxDelete = xDelete (*Fts5Auxdata)(unsafe.Pointer(pData)).FpPtr = pPtr return SQLITE_OK } func fts5ApiGetAuxdata(tls *libc.TLS, pCtx uintptr, bClear int32) uintptr { var pCsr uintptr = pCtx var pData uintptr var pRet uintptr = uintptr(0) for pData = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAuxdata; pData != 0; pData = (*Fts5Auxdata)(unsafe.Pointer(pData)).FpNext { if (*Fts5Auxdata)(unsafe.Pointer(pData)).FpAux == (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAux { break } } if pData != 0 { pRet = (*Fts5Auxdata)(unsafe.Pointer(pData)).FpPtr if bClear != 0 { (*Fts5Auxdata)(unsafe.Pointer(pData)).FpPtr = uintptr(0) (*Fts5Auxdata)(unsafe.Pointer(pData)).FxDelete = uintptr(0) } } return pRet } func fts5ApiPhraseNext(tls *libc.TLS, pUnused uintptr, pIter uintptr, piCol uintptr, piOff uintptr) { bp := tls.Alloc(4) defer tls.Free(4) _ = pUnused if (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa >= (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fb { *(*int32)(unsafe.Pointer(piCol)) = -1 *(*int32)(unsafe.Pointer(piOff)) = -1 } else { *(*uintptr)(unsafe.Pointer(pIter)) += uintptr(sqlite3Fts5GetVarint32(tls, (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa, bp)) if *(*int32)(unsafe.Pointer(bp)) == 1 { *(*uintptr)(unsafe.Pointer(pIter)) += uintptr(sqlite3Fts5GetVarint32(tls, (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa, bp)) *(*int32)(unsafe.Pointer(piCol)) = *(*int32)(unsafe.Pointer(bp)) *(*int32)(unsafe.Pointer(piOff)) = 0 *(*uintptr)(unsafe.Pointer(pIter)) += uintptr(sqlite3Fts5GetVarint32(tls, (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa, bp)) } *(*int32)(unsafe.Pointer(piOff)) += *(*int32)(unsafe.Pointer(bp)) - 2 } } func fts5ApiPhraseFirst(tls *libc.TLS, pCtx uintptr, iPhrase int32, pIter uintptr, piCol uintptr, piOff uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pCsr uintptr = pCtx var rc int32 = fts5CsrPoslist(tls, pCsr, iPhrase, pIter, bp) if rc == SQLITE_OK { (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fb = func() uintptr { if (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa != 0 { return (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa + uintptr(*(*int32)(unsafe.Pointer(bp))) } return uintptr(0) }() *(*int32)(unsafe.Pointer(piCol)) = 0 *(*int32)(unsafe.Pointer(piOff)) = 0 fts5ApiPhraseNext(tls, pCtx, pIter, piCol, piOff) } return rc } func fts5ApiPhraseNextColumn(tls *libc.TLS, pCtx uintptr, pIter uintptr, piCol uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var pCsr uintptr = pCtx var pConfig uintptr = (*Fts5Table)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab)).FpConfig if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_COLUMNS { if (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa >= (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fb { *(*int32)(unsafe.Pointer(piCol)) = -1 } else { *(*uintptr)(unsafe.Pointer(pIter)) += uintptr(sqlite3Fts5GetVarint32(tls, (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa, bp)) *(*int32)(unsafe.Pointer(piCol)) += *(*int32)(unsafe.Pointer(bp)) - 2 } } else { for 1 != 0 { if (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa >= (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fb { *(*int32)(unsafe.Pointer(piCol)) = -1 return } if int32(*(*uint8)(unsafe.Pointer((*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa))) == 0x01 { break } *(*uintptr)(unsafe.Pointer(pIter)) += uintptr(sqlite3Fts5GetVarint32(tls, (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa, bp+4)) } *(*uintptr)(unsafe.Pointer(pIter)) += uintptr(1 + sqlite3Fts5GetVarint32(tls, (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa+1, piCol)) } } func fts5ApiPhraseFirstColumn(tls *libc.TLS, pCtx uintptr, iPhrase int32, pIter uintptr, piCol uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var pCsr uintptr = pCtx var pConfig uintptr = (*Fts5Table)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab)).FpConfig if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_COLUMNS { var pSorter uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpSorter if pSorter != 0 { var i1 int32 = func() int32 { if iPhrase == 0 { return 0 } return *(*int32)(unsafe.Pointer(pSorter + 28 + uintptr(iPhrase-1)*4)) }() *(*int32)(unsafe.Pointer(bp)) = *(*int32)(unsafe.Pointer(pSorter + 28 + uintptr(iPhrase)*4)) - i1 (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa = (*Fts5Sorter)(unsafe.Pointer(pSorter)).FaPoslist + uintptr(i1) } else { rc = sqlite3Fts5ExprPhraseCollist(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, iPhrase, pIter, bp) } if rc == SQLITE_OK { (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fb = func() uintptr { if (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa != 0 { return (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa + uintptr(*(*int32)(unsafe.Pointer(bp))) } return uintptr(0) }() *(*int32)(unsafe.Pointer(piCol)) = 0 fts5ApiPhraseNextColumn(tls, pCtx, pIter, piCol) } } else { rc = fts5CsrPoslist(tls, pCsr, iPhrase, pIter, bp+4) if rc == SQLITE_OK { (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fb = func() uintptr { if (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa != 0 { return (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa + uintptr(*(*int32)(unsafe.Pointer(bp + 4))) } return uintptr(0) }() if *(*int32)(unsafe.Pointer(bp + 4)) <= 0 { *(*int32)(unsafe.Pointer(piCol)) = -1 } else if int32(*(*uint8)(unsafe.Pointer((*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa))) == 0x01 { *(*uintptr)(unsafe.Pointer(pIter)) += uintptr(1 + sqlite3Fts5GetVarint32(tls, (*Fts5PhraseIter)(unsafe.Pointer(pIter)).Fa+1, piCol)) } else { *(*int32)(unsafe.Pointer(piCol)) = 0 } } } return rc } var sFts5Api = Fts5ExtensionApi{ FiVersion: 2, FxUserData: 0, FxColumnCount: 0, FxRowCount: 0, FxColumnTotalSize: 0, FxTokenize: 0, FxPhraseCount: 0, FxPhraseSize: 0, FxInstCount: 0, FxInst: 0, FxRowid: 0, FxColumnText: 0, FxColumnSize: 0, FxQueryPhrase: 0, FxSetAuxdata: 0, FxGetAuxdata: 0, FxPhraseFirst: 0, FxPhraseNext: 0, FxPhraseFirstColumn: 0, FxPhraseNextColumn: 0, } func fts5ApiQueryPhrase(tls *libc.TLS, pCtx uintptr, iPhrase int32, pUserData uintptr, xCallback uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pCsr uintptr = pCtx var pTab uintptr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab var rc int32 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = fts5OpenMethod(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab, bp) if rc == SQLITE_OK { (*Fts5Cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FePlan = FTS5_PLAN_MATCH (*Fts5Cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FiFirstRowid = int64(-1) - (int64(0xffffffff) | int64(0x7fffffff)<<32) (*Fts5Cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).FiLastRowid = int64(0xffffffff) | int64(0x7fffffff)<<32 (*Fts5Cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fbase.FpVtab = pTab rc = sqlite3Fts5ExprClonePhrase(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, iPhrase, *(*uintptr)(unsafe.Pointer(bp))+64) } if rc == SQLITE_OK { for rc = fts5CursorFirst(tls, pTab, *(*uintptr)(unsafe.Pointer(bp)), 0); rc == SQLITE_OK && (*Fts5Cursor)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp)))).Fcsrflags&FTS5CSR_EOF == 0; rc = fts5NextMethod(tls, *(*uintptr)(unsafe.Pointer(bp))) { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{xCallback})).f(tls, uintptr(unsafe.Pointer(&sFts5Api)), *(*uintptr)(unsafe.Pointer(bp)), pUserData) if rc != SQLITE_OK { if rc == SQLITE_DONE { rc = SQLITE_OK } break } } } fts5CloseMethod(tls, *(*uintptr)(unsafe.Pointer(bp))) return rc } func fts5ApiInvoke(tls *libc.TLS, pAux uintptr, pCsr uintptr, context uintptr, argc int32, argv uintptr) { (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAux = pAux (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Auxiliary)(unsafe.Pointer(pAux)).FxFunc})).f(tls, uintptr(unsafe.Pointer(&sFts5Api)), pCsr, context, argc, argv) (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpAux = uintptr(0) } func fts5CursorFromCsrid(tls *libc.TLS, pGlobal uintptr, iCsrId I64) uintptr { var pCsr uintptr for pCsr = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpCsr; pCsr != 0; pCsr = (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpNext { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiCsrId == iCsrId { break } } return pCsr } func fts5ApiCallback(tls *libc.TLS, context uintptr, argc int32, argv uintptr) { bp := tls.Alloc(8) defer tls.Free(8) var pAux uintptr var pCsr uintptr var iCsrId I64 pAux = Xsqlite3_user_data(tls, context) iCsrId = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(argv))) pCsr = fts5CursorFromCsrid(tls, (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FpGlobal, iCsrId) if pCsr == uintptr(0) || (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == 0 { var zErr uintptr = Xsqlite3_mprintf(tls, ts+37203, libc.VaList(bp, iCsrId)) Xsqlite3_result_error(tls, context, zErr, -1) Xsqlite3_free(tls, zErr) } else { fts5ApiInvoke(tls, pAux, pCsr, context, argc-1, argv+1*8) } } func sqlite3Fts5TableFromCsrid(tls *libc.TLS, pGlobal uintptr, iCsrId I64) uintptr { var pCsr uintptr pCsr = fts5CursorFromCsrid(tls, pGlobal, iCsrId) if pCsr != 0 { return (*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab } return uintptr(0) } func fts5PoslistBlob(tls *libc.TLS, pCtx uintptr, pCsr uintptr) int32 { bp := tls.Alloc(68) defer tls.Free(68) var i int32 *(*int32)(unsafe.Pointer(bp + 24)) = SQLITE_OK var nPhrase int32 = sqlite3Fts5ExprPhraseCount(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr) libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) switch (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5Cursor)(unsafe.Pointer(pCsr)).Fbase.FpVtab)).FpConfig)).FeDetail { case FTS5_DETAIL_FULL: for i = 0; i < nPhrase-1; i++ { var nByte int32 = sqlite3Fts5ExprPoslist(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, i, bp+16) sqlite3Fts5BufferAppendVarint(tls, bp+24, bp, int64(nByte)) } for i = 0; i < nPhrase; i++ { var nPoslist int32 nPoslist = sqlite3Fts5ExprPoslist(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, i, bp+32) sqlite3Fts5BufferAppendBlob(tls, bp+24, bp, uint32(nPoslist), *(*uintptr)(unsafe.Pointer(bp + 32))) } break case FTS5_DETAIL_COLUMNS: for i = 0; *(*int32)(unsafe.Pointer(bp + 24)) == SQLITE_OK && i < nPhrase-1; i++ { *(*int32)(unsafe.Pointer(bp + 24)) = sqlite3Fts5ExprPhraseCollist(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, i, bp+40, bp+48) sqlite3Fts5BufferAppendVarint(tls, bp+24, bp, int64(*(*int32)(unsafe.Pointer(bp + 48)))) } for i = 0; *(*int32)(unsafe.Pointer(bp + 24)) == SQLITE_OK && i < nPhrase; i++ { *(*int32)(unsafe.Pointer(bp + 24)) = sqlite3Fts5ExprPhraseCollist(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpExpr, i, bp+56, bp+64) sqlite3Fts5BufferAppendBlob(tls, bp+24, bp, uint32(*(*int32)(unsafe.Pointer(bp + 64))), *(*uintptr)(unsafe.Pointer(bp + 56))) } break default: break } Xsqlite3_result_blob(tls, pCtx, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp, (*Fts5Buffer)(unsafe.Pointer(bp)).Fn, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{Xsqlite3_free}))) return *(*int32)(unsafe.Pointer(bp + 24)) } func fts5ColumnMethod(tls *libc.TLS, pCursor uintptr, pCtx uintptr, iCol int32) int32 { var pTab uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab var pConfig uintptr = (*Fts5FullTable)(unsafe.Pointer(pTab)).Fp.FpConfig var pCsr uintptr = pCursor var rc int32 = SQLITE_OK if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == FTS5_PLAN_SPECIAL { if iCol == (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol { Xsqlite3_result_int64(tls, pCtx, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiSpecial) } } else if iCol == (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol { Xsqlite3_result_int64(tls, pCtx, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FiCsrId) } else if iCol == (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol+1 { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == FTS5_PLAN_SOURCE { fts5PoslistBlob(tls, pCtx, pCsr) } else if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == FTS5_PLAN_MATCH || (*Fts5Cursor)(unsafe.Pointer(pCsr)).FePlan == FTS5_PLAN_SORTED_MATCH { if (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpRank != 0 || SQLITE_OK == libc.AssignInt32(&rc, fts5FindRankFunction(tls, pCsr)) { fts5ApiInvoke(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpRank, pCsr, pCtx, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FnRankArg, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FapRankArg) } } } else if !(fts5IsContentless(tls, pTab) != 0) { (*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg = pTab + 16 rc = fts5SeekCursor(tls, pCsr, 1) if rc == SQLITE_OK { Xsqlite3_result_value(tls, pCtx, Xsqlite3_column_value(tls, (*Fts5Cursor)(unsafe.Pointer(pCsr)).FpStmt, iCol+1)) } (*Fts5Config)(unsafe.Pointer(pConfig)).FpzErrmsg = uintptr(0) } return rc } func fts5FindFunctionMethod(tls *libc.TLS, pVtab uintptr, nUnused int32, zName uintptr, pxFunc uintptr, ppArg uintptr) int32 { var pTab uintptr = pVtab var pAux uintptr _ = nUnused pAux = fts5FindAuxiliary(tls, pTab, zName) if pAux != 0 { *(*uintptr)(unsafe.Pointer(pxFunc)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{fts5ApiCallback})) *(*uintptr)(unsafe.Pointer(ppArg)) = pAux return 1 } return 0 } func fts5RenameMethod(tls *libc.TLS, pVtab uintptr, zName uintptr) int32 { var pTab uintptr = pVtab return sqlite3Fts5StorageRename(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage, zName) } func sqlite3Fts5FlushToDisk(tls *libc.TLS, pTab uintptr) int32 { fts5TripCursors(tls, pTab) return sqlite3Fts5StorageSync(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) } func fts5SavepointMethod(tls *libc.TLS, pVtab uintptr, iSavepoint int32) int32 { _ = iSavepoint return sqlite3Fts5FlushToDisk(tls, pVtab) } func fts5ReleaseMethod(tls *libc.TLS, pVtab uintptr, iSavepoint int32) int32 { _ = iSavepoint return sqlite3Fts5FlushToDisk(tls, pVtab) } func fts5RollbackToMethod(tls *libc.TLS, pVtab uintptr, iSavepoint int32) int32 { var pTab uintptr = pVtab _ = iSavepoint fts5TripCursors(tls, pTab) return sqlite3Fts5StorageRollback(tls, (*Fts5FullTable)(unsafe.Pointer(pTab)).FpStorage) } func fts5CreateAux(tls *libc.TLS, pApi uintptr, zName uintptr, pUserData uintptr, xFunc Fts5_extension_function, xDestroy uintptr) int32 { var pGlobal uintptr = pApi var rc int32 = Xsqlite3_overload_function(tls, (*Fts5Global)(unsafe.Pointer(pGlobal)).Fdb, zName, -1) if rc == SQLITE_OK { var pAux uintptr var nName Sqlite3_int64 var nByte Sqlite3_int64 nName = Sqlite3_int64(libc.Xstrlen(tls, zName) + uint64(1)) nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Auxiliary{})) + uint64(nName)) pAux = Xsqlite3_malloc64(tls, uint64(nByte)) if pAux != 0 { libc.Xmemset(tls, pAux, 0, Size_t(nByte)) (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FzFunc = pAux + 1*48 libc.Xmemcpy(tls, (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FzFunc, zName, uint64(nName)) (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FpGlobal = pGlobal (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FpUserData = pUserData (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FxFunc = xFunc (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FxDestroy = xDestroy (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FpNext = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpAux (*Fts5Global)(unsafe.Pointer(pGlobal)).FpAux = pAux } else { rc = SQLITE_NOMEM } } return rc } func fts5CreateTokenizer(tls *libc.TLS, pApi uintptr, zName uintptr, pUserData uintptr, pTokenizer uintptr, xDestroy uintptr) int32 { var pGlobal uintptr = pApi var pNew uintptr var nName Sqlite3_int64 var nByte Sqlite3_int64 var rc int32 = SQLITE_OK nName = Sqlite3_int64(libc.Xstrlen(tls, zName) + uint64(1)) nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5TokenizerModule{})) + uint64(nName)) pNew = Xsqlite3_malloc64(tls, uint64(nByte)) if pNew != 0 { libc.Xmemset(tls, pNew, 0, Size_t(nByte)) (*Fts5TokenizerModule)(unsafe.Pointer(pNew)).FzName = pNew + 1*56 libc.Xmemcpy(tls, (*Fts5TokenizerModule)(unsafe.Pointer(pNew)).FzName, zName, uint64(nName)) (*Fts5TokenizerModule)(unsafe.Pointer(pNew)).FpUserData = pUserData (*Fts5TokenizerModule)(unsafe.Pointer(pNew)).Fx = *(*Fts5_tokenizer)(unsafe.Pointer(pTokenizer)) (*Fts5TokenizerModule)(unsafe.Pointer(pNew)).FxDestroy = xDestroy (*Fts5TokenizerModule)(unsafe.Pointer(pNew)).FpNext = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpTok (*Fts5Global)(unsafe.Pointer(pGlobal)).FpTok = pNew if (*Fts5TokenizerModule)(unsafe.Pointer(pNew)).FpNext == uintptr(0) { (*Fts5Global)(unsafe.Pointer(pGlobal)).FpDfltTok = pNew } } else { rc = SQLITE_NOMEM } return rc } func fts5LocateTokenizer(tls *libc.TLS, pGlobal uintptr, zName uintptr) uintptr { var pMod uintptr = uintptr(0) if zName == uintptr(0) { pMod = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpDfltTok } else { for pMod = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpTok; pMod != 0; pMod = (*Fts5TokenizerModule)(unsafe.Pointer(pMod)).FpNext { if Xsqlite3_stricmp(tls, zName, (*Fts5TokenizerModule)(unsafe.Pointer(pMod)).FzName) == 0 { break } } } return pMod } func fts5FindTokenizer(tls *libc.TLS, pApi uintptr, zName uintptr, ppUserData uintptr, pTokenizer uintptr) int32 { var rc int32 = SQLITE_OK var pMod uintptr pMod = fts5LocateTokenizer(tls, pApi, zName) if pMod != 0 { *(*Fts5_tokenizer)(unsafe.Pointer(pTokenizer)) = (*Fts5TokenizerModule)(unsafe.Pointer(pMod)).Fx *(*uintptr)(unsafe.Pointer(ppUserData)) = (*Fts5TokenizerModule)(unsafe.Pointer(pMod)).FpUserData } else { libc.Xmemset(tls, pTokenizer, 0, uint64(unsafe.Sizeof(Fts5_tokenizer{}))) rc = SQLITE_ERROR } return rc } func sqlite3Fts5GetTokenizer(tls *libc.TLS, pGlobal uintptr, azArg uintptr, nArg int32, pConfig uintptr, pzErr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pMod uintptr var rc int32 = SQLITE_OK pMod = fts5LocateTokenizer(tls, pGlobal, func() uintptr { if nArg == 0 { return uintptr(0) } return *(*uintptr)(unsafe.Pointer(azArg)) }()) if pMod == uintptr(0) { rc = SQLITE_ERROR *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+37224, libc.VaList(bp, *(*uintptr)(unsafe.Pointer(azArg)))) } else { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5TokenizerModule)(unsafe.Pointer(pMod)).Fx.FxCreate})).f(tls, (*Fts5TokenizerModule)(unsafe.Pointer(pMod)).FpUserData, func() uintptr { if azArg != 0 { return azArg + 1*8 } return uintptr(0) }(), func() int32 { if nArg != 0 { return nArg - 1 } return 0 }(), pConfig+104) (*Fts5Config)(unsafe.Pointer(pConfig)).FpTokApi = pMod + 16 if rc != SQLITE_OK { if pzErr != 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+37246, 0) } } else { (*Fts5Config)(unsafe.Pointer(pConfig)).FePattern = sqlite3Fts5TokenizerPattern(tls, (*Fts5TokenizerModule)(unsafe.Pointer(pMod)).Fx.FxCreate, (*Fts5Config)(unsafe.Pointer(pConfig)).FpTok) } } if rc != SQLITE_OK { (*Fts5Config)(unsafe.Pointer(pConfig)).FpTokApi = uintptr(0) (*Fts5Config)(unsafe.Pointer(pConfig)).FpTok = uintptr(0) } return rc } func fts5ModuleDestroy(tls *libc.TLS, pCtx uintptr) { var pTok uintptr var pNextTok uintptr var pAux uintptr var pNextAux uintptr var pGlobal uintptr = pCtx for pAux = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpAux; pAux != 0; pAux = pNextAux { pNextAux = (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FpNext if (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FxDestroy != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5Auxiliary)(unsafe.Pointer(pAux)).FxDestroy})).f(tls, (*Fts5Auxiliary)(unsafe.Pointer(pAux)).FpUserData) } Xsqlite3_free(tls, pAux) } for pTok = (*Fts5Global)(unsafe.Pointer(pGlobal)).FpTok; pTok != 0; pTok = pNextTok { pNextTok = (*Fts5TokenizerModule)(unsafe.Pointer(pTok)).FpNext if (*Fts5TokenizerModule)(unsafe.Pointer(pTok)).FxDestroy != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*Fts5TokenizerModule)(unsafe.Pointer(pTok)).FxDestroy})).f(tls, (*Fts5TokenizerModule)(unsafe.Pointer(pTok)).FpUserData) } Xsqlite3_free(tls, pTok) } Xsqlite3_free(tls, pGlobal) } func fts5Fts5Func(tls *libc.TLS, pCtx uintptr, nArg int32, apArg uintptr) { var pGlobal uintptr = Xsqlite3_user_data(tls, pCtx) var ppApi uintptr _ = nArg ppApi = Xsqlite3_value_pointer(tls, *(*uintptr)(unsafe.Pointer(apArg)), ts+37277) if ppApi != 0 { *(*uintptr)(unsafe.Pointer(ppApi)) = pGlobal } } func fts5SourceIdFunc(tls *libc.TLS, pCtx uintptr, nArg int32, apUnused uintptr) { _ = nArg _ = apUnused Xsqlite3_result_text(tls, pCtx, ts+37290, -1, libc.UintptrFromInt32(-1)) } func fts5ShadowName(tls *libc.TLS, zName uintptr) int32 { var i uint32 for i = uint32(0); uint64(i) < uint64(unsafe.Sizeof(azName2))/uint64(unsafe.Sizeof(uintptr(0))); i++ { if Xsqlite3_stricmp(tls, zName, azName2[i]) == 0 { return 1 } } return 0 } var azName2 = [5]uintptr{ ts + 37381, ts + 35480, ts + 26479, ts + 35831, ts + 12840, } func fts5Init(tls *libc.TLS, db uintptr) int32 { var rc int32 var pGlobal uintptr = uintptr(0) pGlobal = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Fts5Global{}))) if pGlobal == uintptr(0) { rc = SQLITE_NOMEM } else { var p uintptr = pGlobal libc.Xmemset(tls, pGlobal, 0, uint64(unsafe.Sizeof(Fts5Global{}))) (*Fts5Global)(unsafe.Pointer(pGlobal)).Fdb = db (*Fts5Global)(unsafe.Pointer(pGlobal)).Fapi.FiVersion = 2 (*Fts5Global)(unsafe.Pointer(pGlobal)).Fapi.FxCreateFunction = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, Fts5_extension_function, uintptr) int32 }{fts5CreateAux})) (*Fts5Global)(unsafe.Pointer(pGlobal)).Fapi.FxCreateTokenizer = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, uintptr, uintptr) int32 }{fts5CreateTokenizer})) (*Fts5Global)(unsafe.Pointer(pGlobal)).Fapi.FxFindTokenizer = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, uintptr, uintptr) int32 }{fts5FindTokenizer})) rc = Xsqlite3_create_module_v2(tls, db, ts+37388, uintptr(unsafe.Pointer(&fts5Mod)), p, *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{fts5ModuleDestroy}))) if rc == SQLITE_OK { rc = sqlite3Fts5IndexInit(tls, db) } if rc == SQLITE_OK { rc = sqlite3Fts5ExprInit(tls, pGlobal, db) } if rc == SQLITE_OK { rc = sqlite3Fts5AuxInit(tls, pGlobal) } if rc == SQLITE_OK { rc = sqlite3Fts5TokenizerInit(tls, pGlobal) } if rc == SQLITE_OK { rc = sqlite3Fts5VocabInit(tls, pGlobal, db) } if rc == SQLITE_OK { rc = Xsqlite3_create_function(tls, db, ts+37388, 1, SQLITE_UTF8, p, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{fts5Fts5Func})), uintptr(0), uintptr(0)) } if rc == SQLITE_OK { rc = Xsqlite3_create_function(tls, db, ts+37393, 0, SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS, p, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr) }{fts5SourceIdFunc})), uintptr(0), uintptr(0)) } } return rc } var fts5Mod = Sqlite3_module{ FiVersion: 3, FxCreate: 0, FxConnect: 0, FxBestIndex: 0, FxDisconnect: 0, FxDestroy: 0, FxOpen: 0, FxClose: 0, FxFilter: 0, FxNext: 0, FxEof: 0, FxColumn: 0, FxRowid: 0, FxUpdate: 0, FxBegin: 0, FxSync: 0, FxCommit: 0, FxRollback: 0, FxFindFunction: 0, FxRename: 0, FxSavepoint: 0, FxRelease: 0, FxRollbackTo: 0, FxShadowName: 0, } // The following functions are used to register the module with SQLite. If // this module is being built as part of the SQLite core (SQLITE_CORE is // defined), then sqlite3_open() will call sqlite3Fts5Init() directly. // // Or, if this module is being built as a loadable extension, // sqlite3Fts5Init() is omitted and the two standard entry points // sqlite3_fts_init() and sqlite3_fts5_init() defined instead. func Xsqlite3Fts5Init(tls *libc.TLS, db uintptr) int32 { return fts5Init(tls, db) } func fts5StorageGetStmt(tls *libc.TLS, p uintptr, eStmt int32, ppStmt uintptr, pzErrMsg uintptr) int32 { bp := tls.Alloc(216) defer tls.Free(216) var rc int32 = SQLITE_OK if *(*uintptr)(unsafe.Pointer(p + 40 + uintptr(eStmt)*8)) == uintptr(0) { *(*[11]uintptr)(unsafe.Pointer(bp + 128)) = [11]uintptr{ ts + 37408, ts + 37476, ts + 37545, ts + 37578, ts + 37617, ts + 37657, ts + 37696, ts + 37737, ts + 37776, ts + 37818, ts + 37858, } var pC uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig var zSql uintptr = uintptr(0) switch eStmt { case FTS5_STMT_SCAN: zSql = Xsqlite3_mprintf(tls, *(*uintptr)(unsafe.Pointer(bp + 128 + uintptr(eStmt)*8)), libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pC)).FzContentExprlist, (*Fts5Config)(unsafe.Pointer(pC)).FzContent)) break fallthrough case FTS5_STMT_SCAN_ASC: fallthrough case FTS5_STMT_SCAN_DESC: zSql = Xsqlite3_mprintf(tls, *(*uintptr)(unsafe.Pointer(bp + 128 + uintptr(eStmt)*8)), libc.VaList(bp+16, (*Fts5Config)(unsafe.Pointer(pC)).FzContentExprlist, (*Fts5Config)(unsafe.Pointer(pC)).FzContent, (*Fts5Config)(unsafe.Pointer(pC)).FzContentRowid, (*Fts5Config)(unsafe.Pointer(pC)).FzContentRowid, (*Fts5Config)(unsafe.Pointer(pC)).FzContentRowid)) break fallthrough case FTS5_STMT_LOOKUP: zSql = Xsqlite3_mprintf(tls, *(*uintptr)(unsafe.Pointer(bp + 128 + uintptr(eStmt)*8)), libc.VaList(bp+56, (*Fts5Config)(unsafe.Pointer(pC)).FzContentExprlist, (*Fts5Config)(unsafe.Pointer(pC)).FzContent, (*Fts5Config)(unsafe.Pointer(pC)).FzContentRowid)) break fallthrough case FTS5_STMT_INSERT_CONTENT: fallthrough case FTS5_STMT_REPLACE_CONTENT: { var nCol int32 = (*Fts5Config)(unsafe.Pointer(pC)).FnCol + 1 var zBind uintptr var i int32 zBind = Xsqlite3_malloc64(tls, uint64(1+nCol*2)) if zBind != 0 { for i = 0; i < nCol; i++ { *(*int8)(unsafe.Pointer(zBind + uintptr(i*2))) = int8('?') *(*int8)(unsafe.Pointer(zBind + uintptr(i*2+1))) = int8(',') } *(*int8)(unsafe.Pointer(zBind + uintptr(i*2-1))) = int8(0) zSql = Xsqlite3_mprintf(tls, *(*uintptr)(unsafe.Pointer(bp + 128 + uintptr(eStmt)*8)), libc.VaList(bp+80, (*Fts5Config)(unsafe.Pointer(pC)).FzDb, (*Fts5Config)(unsafe.Pointer(pC)).FzName, zBind)) Xsqlite3_free(tls, zBind) } break } fallthrough default: zSql = Xsqlite3_mprintf(tls, *(*uintptr)(unsafe.Pointer(bp + 128 + uintptr(eStmt)*8)), libc.VaList(bp+104, (*Fts5Config)(unsafe.Pointer(pC)).FzDb, (*Fts5Config)(unsafe.Pointer(pC)).FzName)) break } if zSql == uintptr(0) { rc = SQLITE_NOMEM } else { var f int32 = SQLITE_PREPARE_PERSISTENT if eStmt > FTS5_STMT_LOOKUP { f = f | SQLITE_PREPARE_NO_VTAB } (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FbLock++ rc = Xsqlite3_prepare_v3(tls, (*Fts5Config)(unsafe.Pointer(pC)).Fdb, zSql, -1, uint32(f), p+40+uintptr(eStmt)*8, uintptr(0)) (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FbLock-- Xsqlite3_free(tls, zSql) if rc != SQLITE_OK && pzErrMsg != 0 { *(*uintptr)(unsafe.Pointer(pzErrMsg)) = Xsqlite3_mprintf(tls, ts+4493, libc.VaList(bp+120, Xsqlite3_errmsg(tls, (*Fts5Config)(unsafe.Pointer(pC)).Fdb))) } } } *(*uintptr)(unsafe.Pointer(ppStmt)) = *(*uintptr)(unsafe.Pointer(p + 40 + uintptr(eStmt)*8)) Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(ppStmt))) return rc } func fts5ExecPrintf(tls *libc.TLS, db uintptr, pzErr uintptr, zFormat uintptr, va uintptr) int32 { var rc int32 var ap Va_list _ = ap var zSql uintptr ap = va zSql = Xsqlite3_vmprintf(tls, zFormat, ap) if zSql == uintptr(0) { rc = SQLITE_NOMEM } else { rc = Xsqlite3_exec(tls, db, zSql, uintptr(0), uintptr(0), pzErr) Xsqlite3_free(tls, zSql) } _ = ap return rc } func sqlite3Fts5DropAll(tls *libc.TLS, pConfig uintptr) int32 { bp := tls.Alloc(80) defer tls.Free(80) var rc int32 = fts5ExecPrintf(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, uintptr(0), ts+37881, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { rc = fts5ExecPrintf(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, uintptr(0), ts+37985, libc.VaList(bp+48, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) } if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL { rc = fts5ExecPrintf(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, uintptr(0), ts+38023, libc.VaList(bp+64, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) } return rc } func fts5StorageRenameOne(tls *libc.TLS, pConfig uintptr, pRc uintptr, zTail uintptr, zName uintptr) { bp := tls.Alloc(40) defer tls.Free(40) if *(*int32)(unsafe.Pointer(pRc)) == SQLITE_OK { *(*int32)(unsafe.Pointer(pRc)) = fts5ExecPrintf(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, uintptr(0), ts+38061, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, zTail, zName, zTail)) } } func sqlite3Fts5StorageRename(tls *libc.TLS, pStorage uintptr, zName uintptr) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(pStorage)).FpConfig *(*int32)(unsafe.Pointer(bp)) = sqlite3Fts5StorageSync(tls, pStorage) fts5StorageRenameOne(tls, pConfig, bp, ts+26479, zName) fts5StorageRenameOne(tls, pConfig, bp, ts+12840, zName) fts5StorageRenameOne(tls, pConfig, bp, ts+37381, zName) if (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { fts5StorageRenameOne(tls, pConfig, bp, ts+35831, zName) } if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL { fts5StorageRenameOne(tls, pConfig, bp, ts+35480, zName) } return *(*int32)(unsafe.Pointer(bp)) } func sqlite3Fts5CreateTable(tls *libc.TLS, pConfig uintptr, zPost uintptr, zDefn uintptr, bWithout int32, pzErr uintptr) int32 { bp := tls.Alloc(72) defer tls.Free(72) var rc int32 *(*uintptr)(unsafe.Pointer(bp + 64)) = uintptr(0) rc = fts5ExecPrintf(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, bp+64, ts+38103, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, zPost, zDefn, func() uintptr { if bWithout != 0 { return ts + 31132 } return ts + 1544 }())) if *(*uintptr)(unsafe.Pointer(bp + 64)) != 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+38133, libc.VaList(bp+40, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, zPost, *(*uintptr)(unsafe.Pointer(bp + 64)))) Xsqlite3_free(tls, *(*uintptr)(unsafe.Pointer(bp + 64))) } return rc } func sqlite3Fts5StorageOpen(tls *libc.TLS, pConfig uintptr, pIndex uintptr, bCreate int32, pp uintptr, pzErr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK var p uintptr var nByte Sqlite3_int64 nByte = Sqlite3_int64(uint64(unsafe.Sizeof(Fts5Storage{})) + uint64((*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)*uint64(unsafe.Sizeof(I64(0)))) *(*uintptr)(unsafe.Pointer(pp)) = libc.AssignUintptr(&p, Xsqlite3_malloc64(tls, uint64(nByte))) if !(p != 0) { return SQLITE_NOMEM } libc.Xmemset(tls, p, 0, Size_t(nByte)) (*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize = p + 1*128 (*Fts5Storage)(unsafe.Pointer(p)).FpConfig = pConfig (*Fts5Storage)(unsafe.Pointer(p)).FpIndex = pIndex if bCreate != 0 { if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL { var nDefn int32 = 32 + (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol*10 var zDefn uintptr = Xsqlite3_malloc64(tls, uint64(int64(32)+Sqlite3_int64((*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)*int64(10))) if zDefn == uintptr(0) { rc = SQLITE_NOMEM } else { var i int32 var iOff int32 Xsqlite3_snprintf(tls, nDefn, zDefn, ts+38177, 0) iOff = int32(libc.Xstrlen(tls, zDefn)) for i = 0; i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { Xsqlite3_snprintf(tls, nDefn-iOff, zDefn+uintptr(iOff), ts+38200, libc.VaList(bp, i)) iOff = iOff + int32(libc.Xstrlen(tls, zDefn+uintptr(iOff))) } rc = sqlite3Fts5CreateTable(tls, pConfig, ts+35480, zDefn, 0, pzErr) } Xsqlite3_free(tls, zDefn) } if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { rc = sqlite3Fts5CreateTable(tls, pConfig, ts+35831, ts+38206, 0, pzErr) } if rc == SQLITE_OK { rc = sqlite3Fts5CreateTable(tls, pConfig, ts+37381, ts+38238, 1, pzErr) } if rc == SQLITE_OK { rc = sqlite3Fts5StorageConfigValue(tls, p, ts+35977, uintptr(0), FTS5_CURRENT_VERSION) } } if rc != 0 { sqlite3Fts5StorageClose(tls, p) *(*uintptr)(unsafe.Pointer(pp)) = uintptr(0) } return rc } func sqlite3Fts5StorageClose(tls *libc.TLS, p uintptr) int32 { var rc int32 = SQLITE_OK if p != 0 { var i int32 for i = 0; i < int32(uint64(unsafe.Sizeof([11]uintptr{}))/uint64(unsafe.Sizeof(uintptr(0)))); i++ { Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(p + 40 + uintptr(i)*8))) } Xsqlite3_free(tls, p) } return rc } type Fts5InsertCtx1 = struct { FpStorage uintptr FiCol int32 FszCol int32 } type Fts5InsertCtx = Fts5InsertCtx1 func fts5StorageInsertCallback(tls *libc.TLS, pContext uintptr, tflags int32, pToken uintptr, nToken int32, iUnused1 int32, iUnused2 int32) int32 { var pCtx uintptr = pContext var pIdx uintptr = (*Fts5Storage)(unsafe.Pointer((*Fts5InsertCtx)(unsafe.Pointer(pCtx)).FpStorage)).FpIndex _ = iUnused1 _ = iUnused2 if nToken > FTS5_MAX_TOKEN_SIZE { nToken = FTS5_MAX_TOKEN_SIZE } if tflags&FTS5_TOKEN_COLOCATED == 0 || (*Fts5InsertCtx)(unsafe.Pointer(pCtx)).FszCol == 0 { (*Fts5InsertCtx)(unsafe.Pointer(pCtx)).FszCol++ } return sqlite3Fts5IndexWrite(tls, pIdx, (*Fts5InsertCtx)(unsafe.Pointer(pCtx)).FiCol, (*Fts5InsertCtx)(unsafe.Pointer(pCtx)).FszCol-1, pToken, nToken) } func fts5StorageDeleteFromIndex(tls *libc.TLS, p uintptr, iDel I64, apVal uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 var rc2 int32 var iCol int32 if apVal == uintptr(0) { rc = fts5StorageGetStmt(tls, p, FTS5_STMT_LOOKUP, bp, uintptr(0)) if rc != SQLITE_OK { return rc } Xsqlite3_bind_int64(tls, *(*uintptr)(unsafe.Pointer(bp)), 1, iDel) if Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) != SQLITE_ROW { return Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) } } (*Fts5InsertCtx)(unsafe.Pointer(bp + 8)).FpStorage = p (*Fts5InsertCtx)(unsafe.Pointer(bp + 8)).FiCol = -1 rc = sqlite3Fts5IndexBeginWrite(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, 1, iDel) for iCol = 1; rc == SQLITE_OK && iCol <= (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; iCol++ { if int32(*(*U8)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FabUnindexed + uintptr(iCol-1)))) == 0 { var zText uintptr var nText int32 if *(*uintptr)(unsafe.Pointer(bp)) != 0 { zText = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp)), iCol) nText = Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp)), iCol) } else if apVal != 0 { zText = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(iCol-1)*8))) nText = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr(iCol-1)*8))) } else { continue } (*Fts5InsertCtx)(unsafe.Pointer(bp + 8)).FszCol = 0 rc = sqlite3Fts5Tokenize(tls, pConfig, FTS5_TOKENIZE_DOCUMENT, zText, nText, bp+8, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5StorageInsertCallback}))) *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr(iCol-1)*8)) -= I64((*Fts5InsertCtx)(unsafe.Pointer(bp + 8)).FszCol) if *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr(iCol-1)*8)) < int64(0) { rc = SQLITE_CORRUPT | int32(1)<<8 } } } if rc == SQLITE_OK && (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow < int64(1) { rc = SQLITE_CORRUPT | int32(1)<<8 } else { (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow-- } rc2 = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) if rc == SQLITE_OK { rc = rc2 } return rc } func fts5StorageInsertDocsize(tls *libc.TLS, p uintptr, iRowid I64, pBuf uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_OK if (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FbColumnsize != 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = fts5StorageGetStmt(tls, p, FTS5_STMT_REPLACE_DOCSIZE, bp, uintptr(0)) if rc == SQLITE_OK { Xsqlite3_bind_int64(tls, *(*uintptr)(unsafe.Pointer(bp)), 1, iRowid) Xsqlite3_bind_blob(tls, *(*uintptr)(unsafe.Pointer(bp)), 2, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fp, (*Fts5Buffer)(unsafe.Pointer(pBuf)).Fn, uintptr(0)) Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3_bind_null(tls, *(*uintptr)(unsafe.Pointer(bp)), 2) } } return rc } func fts5StorageLoadTotals(tls *libc.TLS, p uintptr, bCache int32) int32 { var rc int32 = SQLITE_OK if (*Fts5Storage)(unsafe.Pointer(p)).FbTotalsValid == 0 { rc = sqlite3Fts5IndexGetAverages(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, p+24, (*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize) (*Fts5Storage)(unsafe.Pointer(p)).FbTotalsValid = bCache } return rc } func fts5StorageSaveTotals(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(20) defer tls.Free(20) var nCol int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FnCol var i int32 *(*int32)(unsafe.Pointer(bp + 16)) = SQLITE_OK libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) sqlite3Fts5BufferAppendVarint(tls, bp+16, bp, (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow) for i = 0; i < nCol; i++ { sqlite3Fts5BufferAppendVarint(tls, bp+16, bp, *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr(i)*8))) } if *(*int32)(unsafe.Pointer(bp + 16)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 16)) = sqlite3Fts5IndexSetAverages(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp, (*Fts5Buffer)(unsafe.Pointer(bp)).Fn) } Xsqlite3_free(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp) return *(*int32)(unsafe.Pointer(bp + 16)) } func sqlite3Fts5StorageDelete(tls *libc.TLS, p uintptr, iDel I64, apVal uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig var rc int32 *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = fts5StorageLoadTotals(tls, p, 1) if rc == SQLITE_OK { rc = fts5StorageDeleteFromIndex(tls, p, iDel, apVal) } if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { rc = fts5StorageGetStmt(tls, p, FTS5_STMT_DELETE_DOCSIZE, bp, uintptr(0)) if rc == SQLITE_OK { Xsqlite3_bind_int64(tls, *(*uintptr)(unsafe.Pointer(bp)), 1, iDel) Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) } } if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL { if rc == SQLITE_OK { rc = fts5StorageGetStmt(tls, p, FTS5_STMT_DELETE_CONTENT, bp, uintptr(0)) } if rc == SQLITE_OK { Xsqlite3_bind_int64(tls, *(*uintptr)(unsafe.Pointer(bp)), 1, iDel) Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) } } return rc } func sqlite3Fts5StorageDeleteAll(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(48) defer tls.Free(48) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig var rc int32 (*Fts5Storage)(unsafe.Pointer(p)).FbTotalsValid = 0 rc = fts5ExecPrintf(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, uintptr(0), ts+38255, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { rc = fts5ExecPrintf(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, uintptr(0), ts+38305, libc.VaList(bp+32, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName)) } if rc == SQLITE_OK { rc = sqlite3Fts5IndexReinit(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex) } if rc == SQLITE_OK { rc = sqlite3Fts5StorageConfigValue(tls, p, ts+35977, uintptr(0), FTS5_CURRENT_VERSION) } return rc } func sqlite3Fts5StorageRebuild(tls *libc.TLS, p uintptr) int32 { bp := tls.Alloc(44) defer tls.Free(44) *(*Fts5Buffer)(unsafe.Pointer(bp + 24)) = Fts5Buffer{} var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig *(*uintptr)(unsafe.Pointer(bp + 16)) = uintptr(0) var rc2 int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5InsertCtx{}))) (*Fts5InsertCtx)(unsafe.Pointer(bp)).FpStorage = p *(*int32)(unsafe.Pointer(bp + 40)) = sqlite3Fts5StorageDeleteAll(tls, p) if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = fts5StorageLoadTotals(tls, p, 1) } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = fts5StorageGetStmt(tls, p, FTS5_STMT_SCAN, bp+16, uintptr(0)) } for *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) { var iRowid I64 = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), 0) sqlite3Fts5BufferZero(tls, bp+24) *(*int32)(unsafe.Pointer(bp + 40)) = sqlite3Fts5IndexBeginWrite(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, 0, iRowid) for (*Fts5InsertCtx)(unsafe.Pointer(bp)).FiCol = 0; *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK && (*Fts5InsertCtx)(unsafe.Pointer(bp)).FiCol < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; (*Fts5InsertCtx)(unsafe.Pointer(bp)).FiCol++ { (*Fts5InsertCtx)(unsafe.Pointer(bp)).FszCol = 0 if int32(*(*U8)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FabUnindexed + uintptr((*Fts5InsertCtx)(unsafe.Pointer(bp)).FiCol)))) == 0 { var zText uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), (*Fts5InsertCtx)(unsafe.Pointer(bp)).FiCol+1) var nText int32 = Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp + 16)), (*Fts5InsertCtx)(unsafe.Pointer(bp)).FiCol+1) *(*int32)(unsafe.Pointer(bp + 40)) = sqlite3Fts5Tokenize(tls, pConfig, FTS5_TOKENIZE_DOCUMENT, zText, nText, bp, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5StorageInsertCallback}))) } sqlite3Fts5BufferAppendVarint(tls, bp+40, bp+24, int64((*Fts5InsertCtx)(unsafe.Pointer(bp)).FszCol)) *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr((*Fts5InsertCtx)(unsafe.Pointer(bp)).FiCol)*8)) += I64((*Fts5InsertCtx)(unsafe.Pointer(bp)).FszCol) } (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow++ if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = fts5StorageInsertDocsize(tls, p, iRowid, bp+24) } } Xsqlite3_free(tls, (*Fts5Buffer)(unsafe.Pointer(bp+24)).Fp) rc2 = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp + 16))) if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = rc2 } if *(*int32)(unsafe.Pointer(bp + 40)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 40)) = fts5StorageSaveTotals(tls, p) } return *(*int32)(unsafe.Pointer(bp + 40)) } func sqlite3Fts5StorageOptimize(tls *libc.TLS, p uintptr) int32 { return sqlite3Fts5IndexOptimize(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex) } func sqlite3Fts5StorageMerge(tls *libc.TLS, p uintptr, nMerge int32) int32 { return sqlite3Fts5IndexMerge(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, nMerge) } func sqlite3Fts5StorageReset(tls *libc.TLS, p uintptr) int32 { return sqlite3Fts5IndexReset(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex) } func fts5StorageNewRowid(tls *libc.TLS, p uintptr, piRowid uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var rc int32 = SQLITE_MISMATCH if (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FbColumnsize != 0 { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) rc = fts5StorageGetStmt(tls, p, FTS5_STMT_REPLACE_DOCSIZE, bp, uintptr(0)) if rc == SQLITE_OK { Xsqlite3_bind_null(tls, *(*uintptr)(unsafe.Pointer(bp)), 1) Xsqlite3_bind_null(tls, *(*uintptr)(unsafe.Pointer(bp)), 2) Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) } if rc == SQLITE_OK { *(*I64)(unsafe.Pointer(piRowid)) = Xsqlite3_last_insert_rowid(tls, (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).Fdb) } } return rc } func sqlite3Fts5StorageContentInsert(tls *libc.TLS, p uintptr, apVal uintptr, piRowid uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig var rc int32 = SQLITE_OK if (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent != FTS5_CONTENT_NORMAL { if Xsqlite3_value_type(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) == SQLITE_INTEGER { *(*I64)(unsafe.Pointer(piRowid)) = Xsqlite3_value_int64(tls, *(*uintptr)(unsafe.Pointer(apVal + 1*8))) } else { rc = fts5StorageNewRowid(tls, p, piRowid) } } else { *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var i int32 rc = fts5StorageGetStmt(tls, p, FTS5_STMT_INSERT_CONTENT, bp, uintptr(0)) for i = 1; rc == SQLITE_OK && i <= (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol+1; i++ { rc = Xsqlite3_bind_value(tls, *(*uintptr)(unsafe.Pointer(bp)), i, *(*uintptr)(unsafe.Pointer(apVal + uintptr(i)*8))) } if rc == SQLITE_OK { Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) } *(*I64)(unsafe.Pointer(piRowid)) = Xsqlite3_last_insert_rowid(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb) } return rc } func sqlite3Fts5StorageIndexInsert(tls *libc.TLS, p uintptr, apVal uintptr, iRowid I64) int32 { bp := tls.Alloc(36) defer tls.Free(36) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_OK libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5Buffer{}))) (*Fts5InsertCtx)(unsafe.Pointer(bp + 16)).FpStorage = p *(*int32)(unsafe.Pointer(bp + 32)) = fts5StorageLoadTotals(tls, p, 1) if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 32)) = sqlite3Fts5IndexBeginWrite(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, 0, iRowid) } for (*Fts5InsertCtx)(unsafe.Pointer(bp + 16)).FiCol = 0; *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK && (*Fts5InsertCtx)(unsafe.Pointer(bp+16)).FiCol < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; (*Fts5InsertCtx)(unsafe.Pointer(bp+16)).FiCol++ { (*Fts5InsertCtx)(unsafe.Pointer(bp + 16)).FszCol = 0 if int32(*(*U8)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FabUnindexed + uintptr((*Fts5InsertCtx)(unsafe.Pointer(bp+16)).FiCol)))) == 0 { var zText uintptr = Xsqlite3_value_text(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr((*Fts5InsertCtx)(unsafe.Pointer(bp+16)).FiCol+2)*8))) var nText int32 = Xsqlite3_value_bytes(tls, *(*uintptr)(unsafe.Pointer(apVal + uintptr((*Fts5InsertCtx)(unsafe.Pointer(bp+16)).FiCol+2)*8))) *(*int32)(unsafe.Pointer(bp + 32)) = sqlite3Fts5Tokenize(tls, pConfig, FTS5_TOKENIZE_DOCUMENT, zText, nText, bp+16, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5StorageInsertCallback}))) } sqlite3Fts5BufferAppendVarint(tls, bp+32, bp, int64((*Fts5InsertCtx)(unsafe.Pointer(bp+16)).FszCol)) *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr((*Fts5InsertCtx)(unsafe.Pointer(bp+16)).FiCol)*8)) += I64((*Fts5InsertCtx)(unsafe.Pointer(bp + 16)).FszCol) } (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow++ if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 32)) = fts5StorageInsertDocsize(tls, p, iRowid, bp) } Xsqlite3_free(tls, (*Fts5Buffer)(unsafe.Pointer(bp)).Fp) return *(*int32)(unsafe.Pointer(bp + 32)) } func fts5StorageCount(tls *libc.TLS, p uintptr, zSuffix uintptr, pnRow uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig var zSql uintptr var rc int32 zSql = Xsqlite3_mprintf(tls, ts+38334, libc.VaList(bp, (*Fts5Config)(unsafe.Pointer(pConfig)).FzDb, (*Fts5Config)(unsafe.Pointer(pConfig)).FzName, zSuffix)) if zSql == uintptr(0) { rc = SQLITE_NOMEM } else { *(*uintptr)(unsafe.Pointer(bp + 24)) = uintptr(0) rc = Xsqlite3_prepare_v2(tls, (*Fts5Config)(unsafe.Pointer(pConfig)).Fdb, zSql, -1, bp+24, uintptr(0)) if rc == SQLITE_OK { if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) { *(*I64)(unsafe.Pointer(pnRow)) = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 24)), 0) } rc = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 24))) } } Xsqlite3_free(tls, zSql) return rc } // Context object used by sqlite3Fts5StorageIntegrity(). type Fts5IntegrityCtx1 = struct { FiRowid I64 FiCol int32 FszCol int32 Fcksum U64 FpTermset uintptr FpConfig uintptr } // Context object used by sqlite3Fts5StorageIntegrity(). type Fts5IntegrityCtx = Fts5IntegrityCtx1 func fts5StorageIntegrityCallback(tls *libc.TLS, pContext uintptr, tflags int32, pToken uintptr, nToken int32, iUnused1 int32, iUnused2 int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var pCtx uintptr = pContext var pTermset uintptr = (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FpTermset var ii int32 var rc int32 = SQLITE_OK var iPos int32 var iCol int32 _ = iUnused1 _ = iUnused2 if nToken > FTS5_MAX_TOKEN_SIZE { nToken = FTS5_MAX_TOKEN_SIZE } if tflags&FTS5_TOKEN_COLOCATED == 0 || (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FszCol == 0 { (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FszCol++ } switch (*Fts5Config)(unsafe.Pointer((*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FpConfig)).FeDetail { case FTS5_DETAIL_FULL: iPos = (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FszCol - 1 iCol = (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FiCol break case FTS5_DETAIL_COLUMNS: iPos = (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FiCol iCol = 0 break default: iPos = 0 iCol = 0 break } rc = sqlite3Fts5TermsetAdd(tls, pTermset, 0, pToken, nToken, bp) if rc == SQLITE_OK && *(*int32)(unsafe.Pointer(bp)) == 0 { *(*U64)(unsafe.Pointer(pCtx + 16)) ^= sqlite3Fts5IndexEntryCksum(tls, (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FiRowid, iCol, iPos, 0, pToken, nToken) } for ii = 0; rc == SQLITE_OK && ii < (*Fts5Config)(unsafe.Pointer((*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FpConfig)).FnPrefix; ii++ { var nChar int32 = *(*int32)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer((*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FpConfig)).FaPrefix + uintptr(ii)*4)) var nByte int32 = sqlite3Fts5IndexCharlenToBytelen(tls, pToken, nToken, nChar) if nByte != 0 { rc = sqlite3Fts5TermsetAdd(tls, pTermset, ii+1, pToken, nByte, bp) if *(*int32)(unsafe.Pointer(bp)) == 0 { *(*U64)(unsafe.Pointer(pCtx + 16)) ^= sqlite3Fts5IndexEntryCksum(tls, (*Fts5IntegrityCtx)(unsafe.Pointer(pCtx)).FiRowid, iCol, iPos, ii+1, pToken, nByte) } } } return rc } func sqlite3Fts5StorageIntegrity(tls *libc.TLS, p uintptr, iArg int32) int32 { bp := tls.Alloc(64) defer tls.Free(64) var pConfig uintptr = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig var rc int32 = SQLITE_OK var aColSize uintptr var aTotalSize uintptr var bUseCksum int32 libc.Xmemset(tls, bp, 0, uint64(unsafe.Sizeof(Fts5IntegrityCtx{}))) (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FpConfig = (*Fts5Storage)(unsafe.Pointer(p)).FpConfig aTotalSize = Xsqlite3_malloc64(tls, uint64((*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)*(uint64(unsafe.Sizeof(int32(0)))+uint64(unsafe.Sizeof(I64(0))))) if !(aTotalSize != 0) { return SQLITE_NOMEM } aColSize = aTotalSize + uintptr((*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)*8 libc.Xmemset(tls, aTotalSize, 0, uint64(unsafe.Sizeof(I64(0)))*uint64((*Fts5Config)(unsafe.Pointer(pConfig)).FnCol)) bUseCksum = libc.Bool32((*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL || (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_EXTERNAL && iArg != 0) if bUseCksum != 0 { rc = fts5StorageGetStmt(tls, p, FTS5_STMT_SCAN, bp+40, uintptr(0)) if rc == SQLITE_OK { var rc2 int32 for SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 40))) { var i int32 (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FiRowid = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 40)), 0) (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FszCol = 0 if (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { rc = sqlite3Fts5StorageDocsize(tls, p, (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FiRowid, aColSize) } if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_NONE { rc = sqlite3Fts5TermsetNew(tls, bp+24) } for i = 0; rc == SQLITE_OK && i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { if *(*U8)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer(pConfig)).FabUnindexed + uintptr(i))) != 0 { continue } (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FiCol = i (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FszCol = 0 if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_COLUMNS { rc = sqlite3Fts5TermsetNew(tls, bp+24) } if rc == SQLITE_OK { var zText uintptr = Xsqlite3_column_text(tls, *(*uintptr)(unsafe.Pointer(bp + 40)), i+1) var nText int32 = Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp + 40)), i+1) rc = sqlite3Fts5Tokenize(tls, pConfig, FTS5_TOKENIZE_DOCUMENT, zText, nText, bp, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5StorageIntegrityCallback}))) } if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 && (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FszCol != *(*int32)(unsafe.Pointer(aColSize + uintptr(i)*4)) { rc = SQLITE_CORRUPT | int32(1)<<8 } *(*I64)(unsafe.Pointer(aTotalSize + uintptr(i)*8)) += I64((*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FszCol) if (*Fts5Config)(unsafe.Pointer(pConfig)).FeDetail == FTS5_DETAIL_COLUMNS { sqlite3Fts5TermsetFree(tls, (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FpTermset) (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FpTermset = uintptr(0) } } sqlite3Fts5TermsetFree(tls, (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FpTermset) (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).FpTermset = uintptr(0) if rc != SQLITE_OK { break } } rc2 = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp + 40))) if rc == SQLITE_OK { rc = rc2 } } if rc == SQLITE_OK { var i int32 rc = fts5StorageLoadTotals(tls, p, 0) for i = 0; rc == SQLITE_OK && i < (*Fts5Config)(unsafe.Pointer(pConfig)).FnCol; i++ { if *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr(i)*8)) != *(*I64)(unsafe.Pointer(aTotalSize + uintptr(i)*8)) { rc = SQLITE_CORRUPT | int32(1)<<8 } } } if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FeContent == FTS5_CONTENT_NORMAL { *(*I64)(unsafe.Pointer(bp + 48)) = int64(0) rc = fts5StorageCount(tls, p, ts+35480, bp+48) if rc == SQLITE_OK && *(*I64)(unsafe.Pointer(bp + 48)) != (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow { rc = SQLITE_CORRUPT | int32(1)<<8 } } if rc == SQLITE_OK && (*Fts5Config)(unsafe.Pointer(pConfig)).FbColumnsize != 0 { *(*I64)(unsafe.Pointer(bp + 56)) = int64(0) rc = fts5StorageCount(tls, p, ts+35831, bp+56) if rc == SQLITE_OK && *(*I64)(unsafe.Pointer(bp + 56)) != (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow { rc = SQLITE_CORRUPT | int32(1)<<8 } } } if rc == SQLITE_OK { rc = sqlite3Fts5IndexIntegrityCheck(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, (*Fts5IntegrityCtx)(unsafe.Pointer(bp)).Fcksum, bUseCksum) } Xsqlite3_free(tls, aTotalSize) return rc } func sqlite3Fts5StorageStmt(tls *libc.TLS, p uintptr, eStmt int32, pp uintptr, pzErrMsg uintptr) int32 { var rc int32 rc = fts5StorageGetStmt(tls, p, eStmt, pp, pzErrMsg) if rc == SQLITE_OK { *(*uintptr)(unsafe.Pointer(p + 40 + uintptr(eStmt)*8)) = uintptr(0) } return rc } func sqlite3Fts5StorageStmtRelease(tls *libc.TLS, p uintptr, eStmt int32, pStmt uintptr) { if *(*uintptr)(unsafe.Pointer(p + 40 + uintptr(eStmt)*8)) == uintptr(0) { Xsqlite3_reset(tls, pStmt) *(*uintptr)(unsafe.Pointer(p + 40 + uintptr(eStmt)*8)) = pStmt } else { Xsqlite3_finalize(tls, pStmt) } } func fts5StorageDecodeSizeArray(tls *libc.TLS, aCol uintptr, nCol int32, aBlob uintptr, nBlob int32) int32 { var i int32 var iOff int32 = 0 for i = 0; i < nCol; i++ { if iOff >= nBlob { return 1 } iOff = iOff + sqlite3Fts5GetVarint32(tls, aBlob+uintptr(iOff), aCol+uintptr(i)*4) } return libc.Bool32(iOff != nBlob) } func sqlite3Fts5StorageDocsize(tls *libc.TLS, p uintptr, iRowid I64, aCol uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var nCol int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FnCol *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 rc = fts5StorageGetStmt(tls, p, FTS5_STMT_LOOKUP_DOCSIZE, bp, uintptr(0)) if *(*uintptr)(unsafe.Pointer(bp)) != 0 { var bCorrupt int32 = 1 Xsqlite3_bind_int64(tls, *(*uintptr)(unsafe.Pointer(bp)), 1, iRowid) if SQLITE_ROW == Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) { var aBlob uintptr = Xsqlite3_column_blob(tls, *(*uintptr)(unsafe.Pointer(bp)), 0) var nBlob int32 = Xsqlite3_column_bytes(tls, *(*uintptr)(unsafe.Pointer(bp)), 0) if 0 == fts5StorageDecodeSizeArray(tls, aCol, nCol, aBlob, nBlob) { bCorrupt = 0 } } rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) if bCorrupt != 0 && rc == SQLITE_OK { rc = SQLITE_CORRUPT | int32(1)<<8 } } else { } return rc } func sqlite3Fts5StorageSize(tls *libc.TLS, p uintptr, iCol int32, pnToken uintptr) int32 { var rc int32 = fts5StorageLoadTotals(tls, p, 0) if rc == SQLITE_OK { *(*I64)(unsafe.Pointer(pnToken)) = int64(0) if iCol < 0 { var i int32 for i = 0; i < (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FnCol; i++ { *(*I64)(unsafe.Pointer(pnToken)) += *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr(i)*8)) } } else if iCol < (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FnCol { *(*I64)(unsafe.Pointer(pnToken)) = *(*I64)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FaTotalSize + uintptr(iCol)*8)) } else { rc = SQLITE_RANGE } } return rc } func sqlite3Fts5StorageRowCount(tls *libc.TLS, p uintptr, pnRow uintptr) int32 { var rc int32 = fts5StorageLoadTotals(tls, p, 0) if rc == SQLITE_OK { *(*I64)(unsafe.Pointer(pnRow)) = (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow if (*Fts5Storage)(unsafe.Pointer(p)).FnTotalRow <= int64(0) { rc = SQLITE_CORRUPT | int32(1)<<8 } } return rc } func sqlite3Fts5StorageSync(tls *libc.TLS, p uintptr) int32 { var rc int32 = SQLITE_OK var iLastRowid I64 = Xsqlite3_last_insert_rowid(tls, (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).Fdb) if (*Fts5Storage)(unsafe.Pointer(p)).FbTotalsValid != 0 { rc = fts5StorageSaveTotals(tls, p) (*Fts5Storage)(unsafe.Pointer(p)).FbTotalsValid = 0 } if rc == SQLITE_OK { rc = sqlite3Fts5IndexSync(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex) } Xsqlite3_set_last_insert_rowid(tls, (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).Fdb, iLastRowid) return rc } func sqlite3Fts5StorageRollback(tls *libc.TLS, p uintptr) int32 { (*Fts5Storage)(unsafe.Pointer(p)).FbTotalsValid = 0 return sqlite3Fts5IndexRollback(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex) } func sqlite3Fts5StorageConfigValue(tls *libc.TLS, p uintptr, z uintptr, pVal uintptr, iVal int32) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var rc int32 = fts5StorageGetStmt(tls, p, FTS5_STMT_REPLACE_CONFIG, bp, uintptr(0)) if rc == SQLITE_OK { Xsqlite3_bind_text(tls, *(*uintptr)(unsafe.Pointer(bp)), 1, z, -1, uintptr(0)) if pVal != 0 { Xsqlite3_bind_value(tls, *(*uintptr)(unsafe.Pointer(bp)), 2, pVal) } else { Xsqlite3_bind_int(tls, *(*uintptr)(unsafe.Pointer(bp)), 2, iVal) } Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp))) rc = Xsqlite3_reset(tls, *(*uintptr)(unsafe.Pointer(bp))) Xsqlite3_bind_null(tls, *(*uintptr)(unsafe.Pointer(bp)), 1) } if rc == SQLITE_OK && pVal != 0 { var iNew int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FiCookie + 1 rc = sqlite3Fts5IndexSetCookie(tls, (*Fts5Storage)(unsafe.Pointer(p)).FpIndex, iNew) if rc == SQLITE_OK { (*Fts5Config)(unsafe.Pointer((*Fts5Storage)(unsafe.Pointer(p)).FpConfig)).FiCookie = iNew } } return rc } var aAsciiTokenChar = [128]uint8{ uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), } type AsciiTokenizer1 = struct{ FaTokenChar [128]uint8 } type AsciiTokenizer = AsciiTokenizer1 func fts5AsciiAddExceptions(tls *libc.TLS, p uintptr, zArg uintptr, bTokenChars int32) { var i int32 for i = 0; *(*int8)(unsafe.Pointer(zArg + uintptr(i))) != 0; i++ { if int32(*(*int8)(unsafe.Pointer(zArg + uintptr(i))))&0x80 == 0 { *(*uint8)(unsafe.Pointer(p + uintptr(int32(*(*int8)(unsafe.Pointer(zArg + uintptr(i))))))) = uint8(bTokenChars) } } } func fts5AsciiDelete(tls *libc.TLS, p uintptr) { Xsqlite3_free(tls, p) } func fts5AsciiCreate(tls *libc.TLS, pUnused uintptr, azArg uintptr, nArg int32, ppOut uintptr) int32 { var rc int32 = SQLITE_OK var p uintptr = uintptr(0) _ = pUnused if nArg%2 != 0 { rc = SQLITE_ERROR } else { p = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(AsciiTokenizer{}))) if p == uintptr(0) { rc = SQLITE_NOMEM } else { var i int32 libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(AsciiTokenizer{}))) libc.Xmemcpy(tls, p, uintptr(unsafe.Pointer(&aAsciiTokenChar)), uint64(unsafe.Sizeof(aAsciiTokenChar))) for i = 0; rc == SQLITE_OK && i < nArg; i = i + 2 { var zArg uintptr = *(*uintptr)(unsafe.Pointer(azArg + uintptr(i+1)*8)) if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38366) { fts5AsciiAddExceptions(tls, p, zArg, 1) } else if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38377) { fts5AsciiAddExceptions(tls, p, zArg, 0) } else { rc = SQLITE_ERROR } } if rc != SQLITE_OK { fts5AsciiDelete(tls, p) p = uintptr(0) } } } *(*uintptr)(unsafe.Pointer(ppOut)) = p return rc } func asciiFold(tls *libc.TLS, aOut uintptr, aIn uintptr, nByte int32) { var i int32 for i = 0; i < nByte; i++ { var c int8 = *(*int8)(unsafe.Pointer(aIn + uintptr(i))) if int32(c) >= 'A' && int32(c) <= 'Z' { c = int8(int32(c) + 32) } *(*int8)(unsafe.Pointer(aOut + uintptr(i))) = c } } func fts5AsciiTokenize(tls *libc.TLS, pTokenizer uintptr, pCtx uintptr, iUnused int32, pText uintptr, nText int32, xToken uintptr) int32 { bp := tls.Alloc(64) defer tls.Free(64) var p uintptr = pTokenizer var rc int32 = SQLITE_OK var ie int32 var is int32 = 0 var nFold int32 = int32(unsafe.Sizeof([64]int8{})) var pFold uintptr = bp var a uintptr = p _ = iUnused for is < nText && rc == SQLITE_OK { var nByte int32 for is < nText && (int32(*(*int8)(unsafe.Pointer(pText + uintptr(is))))&0x80 == 0 && int32(*(*uint8)(unsafe.Pointer(a + uintptr(int32(*(*int8)(unsafe.Pointer(pText + uintptr(is)))))))) == 0) { is++ } if is == nText { break } ie = is + 1 for ie < nText && (int32(*(*int8)(unsafe.Pointer(pText + uintptr(ie))))&0x80 != 0 || *(*uint8)(unsafe.Pointer(a + uintptr(int32(*(*int8)(unsafe.Pointer(pText + uintptr(ie))))))) != 0) { ie++ } nByte = ie - is if nByte > nFold { if pFold != bp { Xsqlite3_free(tls, pFold) } pFold = Xsqlite3_malloc64(tls, uint64(Sqlite3_int64(nByte)*int64(2))) if pFold == uintptr(0) { rc = SQLITE_NOMEM break } nFold = nByte * 2 } asciiFold(tls, pFold, pText+uintptr(is), nByte) rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xToken})).f(tls, pCtx, 0, pFold, nByte, is, ie) is = ie + 1 } if pFold != bp { Xsqlite3_free(tls, pFold) } if rc == SQLITE_DONE { rc = SQLITE_OK } return rc } type Unicode61Tokenizer1 = struct { FaTokenChar [128]uint8 FaFold uintptr FnFold int32 FeRemoveDiacritic int32 FnException int32 F__ccgo_pad1 [4]byte FaiException uintptr FaCategory [32]uint8 } type Unicode61Tokenizer = Unicode61Tokenizer1 func fts5UnicodeAddExceptions(tls *libc.TLS, p uintptr, z uintptr, bTokenChars int32) int32 { var rc int32 = SQLITE_OK var n int32 = int32(libc.Xstrlen(tls, z)) var aNew uintptr if n > 0 { aNew = Xsqlite3_realloc64(tls, (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaiException, uint64(n+(*Unicode61Tokenizer)(unsafe.Pointer(p)).FnException)*uint64(unsafe.Sizeof(int32(0)))) if aNew != 0 { var nNew int32 = (*Unicode61Tokenizer)(unsafe.Pointer(p)).FnException var zCsr uintptr = z var zTerm uintptr = z + uintptr(n) for zCsr < zTerm { var iCode U32 var bToken int32 iCode = U32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zCsr, 1)))) if iCode >= U32(0xc0) { iCode = U32(sqlite3Utf8Trans1[iCode-U32(0xc0)]) for zCsr != zTerm && int32(*(*uint8)(unsafe.Pointer(zCsr)))&0xc0 == 0x80 { iCode = iCode<<6 + U32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zCsr, 1))))) } if iCode < U32(0x80) || iCode&0xFFFFF800 == U32(0xD800) || iCode&0xFFFFFFFE == U32(0xFFFE) { iCode = U32(0xFFFD) } } if iCode < U32(128) { *(*uint8)(unsafe.Pointer(p + uintptr(iCode))) = uint8(bTokenChars) } else { bToken = int32(*(*uint8)(unsafe.Pointer(p + 160 + uintptr(sqlite3Fts5UnicodeCategory(tls, iCode))))) if bToken != bTokenChars && sqlite3Fts5UnicodeIsdiacritic(tls, int32(iCode)) == 0 { var i int32 for i = 0; i < nNew; i++ { if U32(*(*int32)(unsafe.Pointer(aNew + uintptr(i)*4))) > iCode { break } } libc.Xmemmove(tls, aNew+uintptr(i+1)*4, aNew+uintptr(i)*4, uint64(nNew-i)*uint64(unsafe.Sizeof(int32(0)))) *(*int32)(unsafe.Pointer(aNew + uintptr(i)*4)) = int32(iCode) nNew++ } } } (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaiException = aNew (*Unicode61Tokenizer)(unsafe.Pointer(p)).FnException = nNew } else { rc = SQLITE_NOMEM } } return rc } func fts5UnicodeIsException(tls *libc.TLS, p uintptr, iCode int32) int32 { if (*Unicode61Tokenizer)(unsafe.Pointer(p)).FnException > 0 { var a uintptr = (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaiException var iLo int32 = 0 var iHi int32 = (*Unicode61Tokenizer)(unsafe.Pointer(p)).FnException - 1 for iHi >= iLo { var iTest int32 = (iHi + iLo) / 2 if iCode == *(*int32)(unsafe.Pointer(a + uintptr(iTest)*4)) { return 1 } else if iCode > *(*int32)(unsafe.Pointer(a + uintptr(iTest)*4)) { iLo = iTest + 1 } else { iHi = iTest - 1 } } } return 0 } func fts5UnicodeDelete(tls *libc.TLS, pTok uintptr) { if pTok != 0 { var p uintptr = pTok Xsqlite3_free(tls, (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaiException) Xsqlite3_free(tls, (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold) Xsqlite3_free(tls, p) } return } func unicodeSetCategories(tls *libc.TLS, p uintptr, zCat uintptr) int32 { var z uintptr = zCat for *(*int8)(unsafe.Pointer(z)) != 0 { for int32(*(*int8)(unsafe.Pointer(z))) == ' ' || int32(*(*int8)(unsafe.Pointer(z))) == '\t' { z++ } if *(*int8)(unsafe.Pointer(z)) != 0 && sqlite3Fts5UnicodeCatParse(tls, z, p+160) != 0 { return SQLITE_ERROR } for int32(*(*int8)(unsafe.Pointer(z))) != ' ' && int32(*(*int8)(unsafe.Pointer(z))) != '\t' && int32(*(*int8)(unsafe.Pointer(z))) != 0 { z++ } } sqlite3Fts5UnicodeAscii(tls, p+160, p) return SQLITE_OK } func fts5UnicodeCreate(tls *libc.TLS, pUnused uintptr, azArg uintptr, nArg int32, ppOut uintptr) int32 { var rc int32 = SQLITE_OK var p uintptr = uintptr(0) _ = pUnused if nArg%2 != 0 { rc = SQLITE_ERROR } else { p = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(Unicode61Tokenizer{}))) if p != 0 { var zCat uintptr = ts + 38388 var i int32 libc.Xmemset(tls, p, 0, uint64(unsafe.Sizeof(Unicode61Tokenizer{}))) (*Unicode61Tokenizer)(unsafe.Pointer(p)).FeRemoveDiacritic = FTS5_REMOVE_DIACRITICS_SIMPLE (*Unicode61Tokenizer)(unsafe.Pointer(p)).FnFold = 64 (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold = Xsqlite3_malloc64(tls, uint64((*Unicode61Tokenizer)(unsafe.Pointer(p)).FnFold)*uint64(unsafe.Sizeof(int8(0)))) if (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold == uintptr(0) { rc = SQLITE_NOMEM } for i = 0; rc == SQLITE_OK && i < nArg; i = i + 2 { if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38397) { zCat = *(*uintptr)(unsafe.Pointer(azArg + uintptr(i+1)*8)) } } if rc == SQLITE_OK { rc = unicodeSetCategories(tls, p, zCat) } for i = 0; rc == SQLITE_OK && i < nArg; i = i + 2 { var zArg uintptr = *(*uintptr)(unsafe.Pointer(azArg + uintptr(i+1)*8)) if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38408) { if int32(*(*int8)(unsafe.Pointer(zArg))) != '0' && int32(*(*int8)(unsafe.Pointer(zArg))) != '1' && int32(*(*int8)(unsafe.Pointer(zArg))) != '2' || *(*int8)(unsafe.Pointer(zArg + 1)) != 0 { rc = SQLITE_ERROR } else { (*Unicode61Tokenizer)(unsafe.Pointer(p)).FeRemoveDiacritic = int32(*(*int8)(unsafe.Pointer(zArg))) - '0' } } else if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38366) { rc = fts5UnicodeAddExceptions(tls, p, zArg, 1) } else if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38377) { rc = fts5UnicodeAddExceptions(tls, p, zArg, 0) } else if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38397) { } else { rc = SQLITE_ERROR } } } else { rc = SQLITE_NOMEM } if rc != SQLITE_OK { fts5UnicodeDelete(tls, p) p = uintptr(0) } *(*uintptr)(unsafe.Pointer(ppOut)) = p } return rc } func fts5UnicodeIsAlnum(tls *libc.TLS, p uintptr, iCode int32) int32 { return int32(*(*uint8)(unsafe.Pointer(p + 160 + uintptr(sqlite3Fts5UnicodeCategory(tls, U32(iCode)))))) ^ fts5UnicodeIsException(tls, p, iCode) } func fts5UnicodeTokenize(tls *libc.TLS, pTokenizer uintptr, pCtx uintptr, iUnused int32, pText uintptr, nText int32, xToken uintptr) int32 { var p uintptr var rc int32 var a uintptr var zTerm uintptr var zCsr uintptr var aFold uintptr var nFold int32 var pEnd uintptr var iCode U32 var zOut uintptr var is int32 var ie int32 p = pTokenizer rc = SQLITE_OK a = p zTerm = pText + uintptr(nText) zCsr = pText aFold = (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold nFold = (*Unicode61Tokenizer)(unsafe.Pointer(p)).FnFold pEnd = aFold + uintptr(nFold-6) _ = iUnused __1: if !(rc == SQLITE_OK) { goto __2 } zOut = aFold __3: if !(1 != 0) { goto __4 } if !(zCsr >= zTerm) { goto __5 } goto tokenize_done __5: ; if !(int32(*(*uint8)(unsafe.Pointer(zCsr)))&0x80 != 0) { goto __6 } is = int32((int64(zCsr) - int64(pText)) / 1) iCode = U32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zCsr, 1)))) if !(iCode >= U32(0xc0)) { goto __8 } iCode = U32(sqlite3Utf8Trans1[iCode-U32(0xc0)]) __9: if !(zCsr != zTerm && int32(*(*uint8)(unsafe.Pointer(zCsr)))&0xc0 == 0x80) { goto __10 } iCode = iCode<<6 + U32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zCsr, 1))))) goto __9 __10: ; if !(iCode < U32(0x80) || iCode&0xFFFFF800 == U32(0xD800) || iCode&0xFFFFFFFE == U32(0xFFFE)) { goto __11 } iCode = U32(0xFFFD) __11: ; __8: ; if !(fts5UnicodeIsAlnum(tls, p, int32(iCode)) != 0) { goto __12 } goto non_ascii_tokenchar __12: ; goto __7 __6: if !(*(*uint8)(unsafe.Pointer(a + uintptr(*(*uint8)(unsafe.Pointer(zCsr))))) != 0) { goto __13 } is = int32((int64(zCsr) - int64(pText)) / 1) goto ascii_tokenchar __13: ; zCsr++ __7: ; goto __3 __4: ; __14: if !(zCsr < zTerm) { goto __15 } if !(zOut > pEnd) { goto __16 } aFold = Xsqlite3_malloc64(tls, uint64(Sqlite3_int64(nFold)*int64(2))) if !(aFold == uintptr(0)) { goto __17 } rc = SQLITE_NOMEM goto tokenize_done __17: ; zOut = aFold + uintptr((int64(zOut)-int64((*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold))/1) libc.Xmemcpy(tls, aFold, (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold, uint64(nFold)) Xsqlite3_free(tls, (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold) (*Unicode61Tokenizer)(unsafe.Pointer(p)).FaFold = aFold (*Unicode61Tokenizer)(unsafe.Pointer(p)).FnFold = libc.AssignInt32(&nFold, nFold*2) pEnd = aFold + uintptr(nFold-6) __16: ; if !(int32(*(*uint8)(unsafe.Pointer(zCsr)))&0x80 != 0) { goto __18 } iCode = U32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zCsr, 1)))) if !(iCode >= U32(0xc0)) { goto __20 } iCode = U32(sqlite3Utf8Trans1[iCode-U32(0xc0)]) __21: if !(zCsr != zTerm && int32(*(*uint8)(unsafe.Pointer(zCsr)))&0xc0 == 0x80) { goto __22 } iCode = iCode<<6 + U32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zCsr, 1))))) goto __21 __22: ; if !(iCode < U32(0x80) || iCode&0xFFFFF800 == U32(0xD800) || iCode&0xFFFFFFFE == U32(0xFFFE)) { goto __23 } iCode = U32(0xFFFD) __23: ; __20: ; if !(fts5UnicodeIsAlnum(tls, p, int32(iCode)) != 0 || sqlite3Fts5UnicodeIsdiacritic(tls, int32(iCode)) != 0) { goto __24 } non_ascii_tokenchar: iCode = U32(sqlite3Fts5UnicodeFold(tls, int32(iCode), (*Unicode61Tokenizer)(unsafe.Pointer(p)).FeRemoveDiacritic)) if !(iCode != 0) { goto __26 } if !(iCode < U32(0x00080)) { goto __27 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(U8(iCode & U32(0xFF))) goto __28 __27: if !(iCode < U32(0x00800)) { goto __29 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xC0 + int32(U8(iCode>>6&U32(0x1F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) goto __30 __29: if !(iCode < U32(0x10000)) { goto __31 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xE0 + int32(U8(iCode>>12&U32(0x0F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) goto __32 __31: *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xF0 + int32(U8(iCode>>18&U32(0x07)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>12&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) __32: ; __30: ; __28: ; __26: ; goto __25 __24: goto __15 __25: ; goto __19 __18: if !(int32(*(*uint8)(unsafe.Pointer(a + uintptr(*(*uint8)(unsafe.Pointer(zCsr)))))) == 0) { goto __33 } goto __15 goto __34 __33: ascii_tokenchar: if !(int32(*(*uint8)(unsafe.Pointer(zCsr))) >= 'A' && int32(*(*uint8)(unsafe.Pointer(zCsr))) <= 'Z') { goto __35 } *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(int32(*(*uint8)(unsafe.Pointer(zCsr))) + 32) goto __36 __35: *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(*(*uint8)(unsafe.Pointer(zCsr))) __36: ; zCsr++ __34: ; __19: ; ie = int32((int64(zCsr) - int64(pText)) / 1) goto __14 __15: ; rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xToken})).f(tls, pCtx, 0, aFold, int32((int64(zOut)-int64(aFold))/1), is, ie) goto __1 __2: ; tokenize_done: if !(rc == SQLITE_DONE) { goto __37 } rc = SQLITE_OK __37: ; return rc } type PorterTokenizer1 = struct { Ftokenizer Fts5_tokenizer FpTokenizer uintptr FaBuf [128]int8 } type PorterTokenizer = PorterTokenizer1 func fts5PorterDelete(tls *libc.TLS, pTok uintptr) { if pTok != 0 { var p uintptr = pTok if (*PorterTokenizer)(unsafe.Pointer(p)).FpTokenizer != 0 { (*struct{ f func(*libc.TLS, uintptr) })(unsafe.Pointer(&struct{ uintptr }{(*PorterTokenizer)(unsafe.Pointer(p)).Ftokenizer.FxDelete})).f(tls, (*PorterTokenizer)(unsafe.Pointer(p)).FpTokenizer) } Xsqlite3_free(tls, p) } } func fts5PorterCreate(tls *libc.TLS, pCtx uintptr, azArg uintptr, nArg int32, ppOut uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var pApi uintptr = pCtx var rc int32 = SQLITE_OK var pRet uintptr *(*uintptr)(unsafe.Pointer(bp)) = uintptr(0) var zBase uintptr = ts + 38426 if nArg > 0 { zBase = *(*uintptr)(unsafe.Pointer(azArg)) } pRet = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(PorterTokenizer{}))) if pRet != 0 { libc.Xmemset(tls, pRet, 0, uint64(unsafe.Sizeof(PorterTokenizer{}))) rc = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5_api)(unsafe.Pointer(pApi)).FxFindTokenizer})).f(tls, pApi, zBase, bp, pRet) } else { rc = SQLITE_NOMEM } if rc == SQLITE_OK { var nArg2 int32 = func() int32 { if nArg > 0 { return nArg - 1 } return 0 }() var azArg2 uintptr = func() uintptr { if nArg2 != 0 { return azArg + 1*8 } return uintptr(0) }() rc = (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*PorterTokenizer)(unsafe.Pointer(pRet)).Ftokenizer.FxCreate})).f(tls, *(*uintptr)(unsafe.Pointer(bp)), azArg2, nArg2, pRet+24) } if rc != SQLITE_OK { fts5PorterDelete(tls, pRet) pRet = uintptr(0) } *(*uintptr)(unsafe.Pointer(ppOut)) = pRet return rc } type PorterContext1 = struct { FpCtx uintptr FxToken uintptr FaBuf uintptr } type PorterContext = PorterContext1 type PorterRule1 = struct { FzSuffix uintptr FnSuffix int32 F__ccgo_pad1 [4]byte FxCond uintptr FzOutput uintptr FnOutput int32 F__ccgo_pad2 [4]byte } type PorterRule = PorterRule1 func fts5PorterIsVowel(tls *libc.TLS, c int8, bYIsVowel int32) int32 { return libc.Bool32(int32(c) == 'a' || int32(c) == 'e' || int32(c) == 'i' || int32(c) == 'o' || int32(c) == 'u' || bYIsVowel != 0 && int32(c) == 'y') } func fts5PorterGobbleVC(tls *libc.TLS, zStem uintptr, nStem int32, bPrevCons int32) int32 { var i int32 var bCons int32 = bPrevCons for i = 0; i < nStem; i++ { if 0 == libc.AssignInt32(&bCons, libc.BoolInt32(!(fts5PorterIsVowel(tls, *(*int8)(unsafe.Pointer(zStem + uintptr(i))), bCons) != 0))) { break } } for i++; i < nStem; i++ { if libc.AssignInt32(&bCons, libc.BoolInt32(!(fts5PorterIsVowel(tls, *(*int8)(unsafe.Pointer(zStem + uintptr(i))), bCons) != 0))) != 0 { return i + 1 } } return 0 } func fts5Porter_MGt0(tls *libc.TLS, zStem uintptr, nStem int32) int32 { return libc.BoolInt32(!!(fts5PorterGobbleVC(tls, zStem, nStem, 0) != 0)) } func fts5Porter_MGt1(tls *libc.TLS, zStem uintptr, nStem int32) int32 { var n int32 n = fts5PorterGobbleVC(tls, zStem, nStem, 0) if n != 0 && fts5PorterGobbleVC(tls, zStem+uintptr(n), nStem-n, 1) != 0 { return 1 } return 0 } func fts5Porter_MEq1(tls *libc.TLS, zStem uintptr, nStem int32) int32 { var n int32 n = fts5PorterGobbleVC(tls, zStem, nStem, 0) if n != 0 && 0 == fts5PorterGobbleVC(tls, zStem+uintptr(n), nStem-n, 1) { return 1 } return 0 } func fts5Porter_Ostar(tls *libc.TLS, zStem uintptr, nStem int32) int32 { if int32(*(*int8)(unsafe.Pointer(zStem + uintptr(nStem-1)))) == 'w' || int32(*(*int8)(unsafe.Pointer(zStem + uintptr(nStem-1)))) == 'x' || int32(*(*int8)(unsafe.Pointer(zStem + uintptr(nStem-1)))) == 'y' { return 0 } else { var i int32 var mask int32 = 0 var bCons int32 = 0 for i = 0; i < nStem; i++ { bCons = libc.BoolInt32(!(fts5PorterIsVowel(tls, *(*int8)(unsafe.Pointer(zStem + uintptr(i))), bCons) != 0)) mask = mask<<1 + bCons } return libc.Bool32(mask&0x0007 == 0x0005) } return int32(0) } func fts5Porter_MGt1_and_S_or_T(tls *libc.TLS, zStem uintptr, nStem int32) int32 { return libc.Bool32((int32(*(*int8)(unsafe.Pointer(zStem + uintptr(nStem-1)))) == 's' || int32(*(*int8)(unsafe.Pointer(zStem + uintptr(nStem-1)))) == 't') && fts5Porter_MGt1(tls, zStem, nStem) != 0) } func fts5Porter_Vowel(tls *libc.TLS, zStem uintptr, nStem int32) int32 { var i int32 for i = 0; i < nStem; i++ { if fts5PorterIsVowel(tls, *(*int8)(unsafe.Pointer(zStem + uintptr(i))), libc.Bool32(i > 0)) != 0 { return 1 } } return 0 } func fts5PorterStep4(tls *libc.TLS, aBuf uintptr, pnBuf uintptr) int32 { var ret int32 = 0 var nBuf int32 = *(*int32)(unsafe.Pointer(pnBuf)) switch int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-2)))) { case 'a': if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38436, aBuf+uintptr(nBuf-2), uint64(2)) { if fts5Porter_MGt1(tls, aBuf, nBuf-2) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 } } break case 'c': if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38439, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt1(tls, aBuf, nBuf-4) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 } } else if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38444, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt1(tls, aBuf, nBuf-4) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 } } break case 'e': if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38449, aBuf+uintptr(nBuf-2), uint64(2)) { if fts5Porter_MGt1(tls, aBuf, nBuf-2) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 } } break case 'i': if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38452, aBuf+uintptr(nBuf-2), uint64(2)) { if fts5Porter_MGt1(tls, aBuf, nBuf-2) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 } } break case 'l': if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38455, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt1(tls, aBuf, nBuf-4) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 } } else if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38460, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt1(tls, aBuf, nBuf-4) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 } } break case 'n': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38465, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } else if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38469, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt1(tls, aBuf, nBuf-5) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 } } else if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38475, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt1(tls, aBuf, nBuf-4) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 } } else if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38480, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } break case 'o': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38484, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1_and_S_or_T(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } else if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38488, aBuf+uintptr(nBuf-2), uint64(2)) { if fts5Porter_MGt1(tls, aBuf, nBuf-2) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 } } break case 's': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38491, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } break case 't': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38495, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } else if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38499, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } break case 'u': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38503, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } break case 'v': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38507, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } break case 'z': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38511, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt1(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } break } return ret } func fts5PorterStep1B2(tls *libc.TLS, aBuf uintptr, pnBuf uintptr) int32 { var ret int32 = 0 var nBuf int32 = *(*int32)(unsafe.Pointer(pnBuf)) switch int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-2)))) { case 'a': if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38515, aBuf+uintptr(nBuf-2), uint64(2)) { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-2), ts+38495, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 + 3 ret = 1 } break case 'b': if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38518, aBuf+uintptr(nBuf-2), uint64(2)) { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-2), ts+38521, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 + 3 ret = 1 } break case 'i': if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38525, aBuf+uintptr(nBuf-2), uint64(2)) { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-2), ts+38511, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 + 3 ret = 1 } break } return ret } func fts5PorterStep2(tls *libc.TLS, aBuf uintptr, pnBuf uintptr) int32 { var ret int32 = 0 var nBuf int32 = *(*int32)(unsafe.Pointer(pnBuf)) switch int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-2)))) { case 'a': if nBuf > 7 && 0 == libc.Xmemcmp(tls, ts+38528, aBuf+uintptr(nBuf-7), uint64(7)) { if fts5Porter_MGt0(tls, aBuf, nBuf-7) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-7), ts+38495, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 7 + 3 } } else if nBuf > 6 && 0 == libc.Xmemcmp(tls, ts+38536, aBuf+uintptr(nBuf-6), uint64(6)) { if fts5Porter_MGt0(tls, aBuf, nBuf-6) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-6), ts+38543, uint64(4)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 6 + 4 } } break case 'c': if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38548, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-4), ts+38444, uint64(4)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 + 4 } } else if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38553, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-4), ts+38439, uint64(4)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 + 4 } } break case 'e': if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38558, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-4), ts+38511, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 + 3 } } break case 'g': if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38563, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-4), ts+16837, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 + 3 } } break case 'l': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38568, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt0(tls, aBuf, nBuf-3) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-3), ts+38521, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 + 3 } } else if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38572, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-4), ts+38436, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 + 2 } } else if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38577, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38480, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 3 } } else if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38583, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt0(tls, aBuf, nBuf-3) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-3), ts+38587, uint64(1)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 + 1 } } else if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38589, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38503, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 3 } } break case 'o': if nBuf > 7 && 0 == libc.Xmemcmp(tls, ts+38595, aBuf+uintptr(nBuf-7), uint64(7)) { if fts5Porter_MGt0(tls, aBuf, nBuf-7) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-7), ts+38511, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 7 + 3 } } else if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38603, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38495, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 3 } } else if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38609, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-4), ts+38495, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 + 3 } } break case 's': if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38614, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38436, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 2 } } else if nBuf > 7 && 0 == libc.Xmemcmp(tls, ts+38620, aBuf+uintptr(nBuf-7), uint64(7)) { if fts5Porter_MGt0(tls, aBuf, nBuf-7) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-7), ts+38507, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 7 + 3 } } else if nBuf > 7 && 0 == libc.Xmemcmp(tls, ts+38628, aBuf+uintptr(nBuf-7), uint64(7)) { if fts5Porter_MGt0(tls, aBuf, nBuf-7) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-7), ts+38636, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 7 + 3 } } else if nBuf > 7 && 0 == libc.Xmemcmp(tls, ts+38640, aBuf+uintptr(nBuf-7), uint64(7)) { if fts5Porter_MGt0(tls, aBuf, nBuf-7) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-7), ts+38503, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 7 + 3 } } break case 't': if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38648, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38436, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 2 } } else if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38654, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38507, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 3 } } else if nBuf > 6 && 0 == libc.Xmemcmp(tls, ts+38660, aBuf+uintptr(nBuf-6), uint64(6)) { if fts5Porter_MGt0(tls, aBuf, nBuf-6) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-6), ts+38521, uint64(3)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 6 + 3 } } break } return ret } func fts5PorterStep3(tls *libc.TLS, aBuf uintptr, pnBuf uintptr) int32 { var ret int32 = 0 var nBuf int32 = *(*int32)(unsafe.Pointer(pnBuf)) switch int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-2)))) { case 'a': if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38667, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-4), ts+38452, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 + 2 } } break case 's': if nBuf > 4 && 0 == libc.Xmemcmp(tls, ts+38672, aBuf+uintptr(nBuf-4), uint64(4)) { if fts5Porter_MGt0(tls, aBuf, nBuf-4) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 4 } } break case 't': if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38677, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38452, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 2 } } else if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38683, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38452, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 2 } } break case 'u': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38636, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt0(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 } } break case 'v': if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38689, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 } } break case 'z': if nBuf > 5 && 0 == libc.Xmemcmp(tls, ts+38695, aBuf+uintptr(nBuf-5), uint64(5)) { if fts5Porter_MGt0(tls, aBuf, nBuf-5) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-5), ts+38436, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 5 + 2 } } break } return ret } func fts5PorterStep1B(tls *libc.TLS, aBuf uintptr, pnBuf uintptr) int32 { var ret int32 = 0 var nBuf int32 = *(*int32)(unsafe.Pointer(pnBuf)) switch int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-2)))) { case 'e': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38701, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_MGt0(tls, aBuf, nBuf-3) != 0 { libc.Xmemcpy(tls, aBuf+uintptr(nBuf-3), ts+38705, uint64(2)) *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 + 2 } } else if nBuf > 2 && 0 == libc.Xmemcmp(tls, ts+38708, aBuf+uintptr(nBuf-2), uint64(2)) { if fts5Porter_Vowel(tls, aBuf, nBuf-2) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 ret = 1 } } break case 'n': if nBuf > 3 && 0 == libc.Xmemcmp(tls, ts+38711, aBuf+uintptr(nBuf-3), uint64(3)) { if fts5Porter_Vowel(tls, aBuf, nBuf-3) != 0 { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 3 ret = 1 } } break } return ret } func fts5PorterStep1A(tls *libc.TLS, aBuf uintptr, pnBuf uintptr) { var nBuf int32 = *(*int32)(unsafe.Pointer(pnBuf)) if int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-1)))) == 's' { if int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-2)))) == 'e' { if nBuf > 4 && int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-4)))) == 's' && int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-3)))) == 's' || nBuf > 3 && int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-3)))) == 'i' { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 2 } else { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 1 } } else if int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(nBuf-2)))) != 's' { *(*int32)(unsafe.Pointer(pnBuf)) = nBuf - 1 } } } func fts5PorterCb(tls *libc.TLS, pCtx uintptr, tflags int32, pToken uintptr, nToken int32, iStart int32, iEnd int32) int32 { bp := tls.Alloc(4) defer tls.Free(4) var p uintptr var aBuf uintptr var c int8 p = pCtx if !(nToken > FTS5_PORTER_MAX_TOKEN || nToken < 3) { goto __1 } goto pass_through __1: ; aBuf = (*PorterContext)(unsafe.Pointer(p)).FaBuf *(*int32)(unsafe.Pointer(bp)) = nToken libc.Xmemcpy(tls, aBuf, pToken, uint64(*(*int32)(unsafe.Pointer(bp)))) fts5PorterStep1A(tls, aBuf, bp) if !(fts5PorterStep1B(tls, aBuf, bp) != 0) { goto __2 } if !(fts5PorterStep1B2(tls, aBuf, bp) == 0) { goto __3 } c = *(*int8)(unsafe.Pointer(aBuf + uintptr(*(*int32)(unsafe.Pointer(bp))-1))) if !(fts5PorterIsVowel(tls, c, 0) == 0 && int32(c) != 'l' && int32(c) != 's' && int32(c) != 'z' && int32(c) == int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(*(*int32)(unsafe.Pointer(bp))-2))))) { goto __4 } *(*int32)(unsafe.Pointer(bp))-- goto __5 __4: if !(fts5Porter_MEq1(tls, aBuf, *(*int32)(unsafe.Pointer(bp))) != 0 && fts5Porter_Ostar(tls, aBuf, *(*int32)(unsafe.Pointer(bp))) != 0) { goto __6 } *(*int8)(unsafe.Pointer(aBuf + uintptr(libc.PostIncInt32(&*(*int32)(unsafe.Pointer(bp)), 1)))) = int8('e') __6: ; __5: ; __3: ; __2: ; if !(int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(*(*int32)(unsafe.Pointer(bp))-1)))) == 'y' && fts5Porter_Vowel(tls, aBuf, *(*int32)(unsafe.Pointer(bp))-1) != 0) { goto __7 } *(*int8)(unsafe.Pointer(aBuf + uintptr(*(*int32)(unsafe.Pointer(bp))-1))) = int8('i') __7: ; fts5PorterStep2(tls, aBuf, bp) fts5PorterStep3(tls, aBuf, bp) fts5PorterStep4(tls, aBuf, bp) if !(int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(*(*int32)(unsafe.Pointer(bp))-1)))) == 'e') { goto __8 } if !(fts5Porter_MGt1(tls, aBuf, *(*int32)(unsafe.Pointer(bp))-1) != 0 || fts5Porter_MEq1(tls, aBuf, *(*int32)(unsafe.Pointer(bp))-1) != 0 && !(fts5Porter_Ostar(tls, aBuf, *(*int32)(unsafe.Pointer(bp))-1) != 0)) { goto __9 } *(*int32)(unsafe.Pointer(bp))-- __9: ; __8: ; if !(*(*int32)(unsafe.Pointer(bp)) > 1 && int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(*(*int32)(unsafe.Pointer(bp))-1)))) == 'l' && int32(*(*int8)(unsafe.Pointer(aBuf + uintptr(*(*int32)(unsafe.Pointer(bp))-2)))) == 'l' && fts5Porter_MGt1(tls, aBuf, *(*int32)(unsafe.Pointer(bp))-1) != 0) { goto __10 } *(*int32)(unsafe.Pointer(bp))-- __10: ; return (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*PorterContext)(unsafe.Pointer(p)).FxToken})).f(tls, (*PorterContext)(unsafe.Pointer(p)).FpCtx, tflags, aBuf, *(*int32)(unsafe.Pointer(bp)), iStart, iEnd) pass_through: return (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{(*PorterContext)(unsafe.Pointer(p)).FxToken})).f(tls, (*PorterContext)(unsafe.Pointer(p)).FpCtx, tflags, pToken, nToken, iStart, iEnd) } func fts5PorterTokenize(tls *libc.TLS, pTokenizer uintptr, pCtx uintptr, flags int32, pText uintptr, nText int32, xToken uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var p uintptr = pTokenizer (*PorterContext)(unsafe.Pointer(bp)).FxToken = xToken (*PorterContext)(unsafe.Pointer(bp)).FpCtx = pCtx (*PorterContext)(unsafe.Pointer(bp)).FaBuf = p + 32 return (*struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, int32, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*PorterTokenizer)(unsafe.Pointer(p)).Ftokenizer.FxTokenize})).f(tls, (*PorterTokenizer)(unsafe.Pointer(p)).FpTokenizer, bp, flags, pText, nText, *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 }{fts5PorterCb}))) } // ************************************************************************* // // Start of trigram implementation. type TrigramTokenizer1 = struct{ FbFold int32 } // ************************************************************************* // // Start of trigram implementation. type TrigramTokenizer = TrigramTokenizer1 func fts5TriDelete(tls *libc.TLS, p uintptr) { Xsqlite3_free(tls, p) } func fts5TriCreate(tls *libc.TLS, pUnused uintptr, azArg uintptr, nArg int32, ppOut uintptr) int32 { var rc int32 = SQLITE_OK var pNew uintptr = Xsqlite3_malloc(tls, int32(unsafe.Sizeof(TrigramTokenizer{}))) _ = pUnused if pNew == uintptr(0) { rc = SQLITE_NOMEM } else { var i int32 (*TrigramTokenizer)(unsafe.Pointer(pNew)).FbFold = 1 for i = 0; rc == SQLITE_OK && i < nArg; i = i + 2 { var zArg uintptr = *(*uintptr)(unsafe.Pointer(azArg + uintptr(i+1)*8)) if 0 == Xsqlite3_stricmp(tls, *(*uintptr)(unsafe.Pointer(azArg + uintptr(i)*8)), ts+38715) { if int32(*(*int8)(unsafe.Pointer(zArg))) != '0' && int32(*(*int8)(unsafe.Pointer(zArg))) != '1' || *(*int8)(unsafe.Pointer(zArg + 1)) != 0 { rc = SQLITE_ERROR } else { (*TrigramTokenizer)(unsafe.Pointer(pNew)).FbFold = libc.Bool32(int32(*(*int8)(unsafe.Pointer(zArg))) == '0') } } else { rc = SQLITE_ERROR } } if rc != SQLITE_OK { fts5TriDelete(tls, pNew) pNew = uintptr(0) } } *(*uintptr)(unsafe.Pointer(ppOut)) = pNew return rc } func fts5TriTokenize(tls *libc.TLS, pTok uintptr, pCtx uintptr, unusedFlags int32, pText uintptr, nText int32, xToken uintptr) int32 { bp := tls.Alloc(32) defer tls.Free(32) var p uintptr = pTok var rc int32 = SQLITE_OK var zIn uintptr = pText var zEof uintptr = zIn + uintptr(nText) var iCode U32 _ = unusedFlags for 1 != 0 { var zOut uintptr = bp var iStart int32 = int32((int64(zIn) - int64(pText)) / 1) var zNext uintptr iCode = U32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) if iCode >= U32(0xc0) { iCode = U32(sqlite3Utf8Trans1[iCode-U32(0xc0)]) for zIn != zEof && int32(*(*uint8)(unsafe.Pointer(zIn)))&0xc0 == 0x80 { iCode = iCode<<6 + U32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))))) } if iCode < U32(0x80) || iCode&0xFFFFF800 == U32(0xD800) || iCode&0xFFFFFFFE == U32(0xFFFE) { iCode = U32(0xFFFD) } } if iCode == U32(0) { break } zNext = zIn if zIn < zEof { if (*TrigramTokenizer)(unsafe.Pointer(p)).FbFold != 0 { iCode = U32(sqlite3Fts5UnicodeFold(tls, int32(iCode), 0)) } { if iCode < U32(0x00080) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(U8(iCode & U32(0xFF))) } else if iCode < U32(0x00800) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xC0 + int32(U8(iCode>>6&U32(0x1F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } else if iCode < U32(0x10000) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xE0 + int32(U8(iCode>>12&U32(0x0F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } else { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xF0 + int32(U8(iCode>>18&U32(0x07)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>12&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } } iCode = U32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) if iCode >= U32(0xc0) { iCode = U32(sqlite3Utf8Trans1[iCode-U32(0xc0)]) for zIn != zEof && int32(*(*uint8)(unsafe.Pointer(zIn)))&0xc0 == 0x80 { iCode = iCode<<6 + U32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))))) } if iCode < U32(0x80) || iCode&0xFFFFF800 == U32(0xD800) || iCode&0xFFFFFFFE == U32(0xFFFE) { iCode = U32(0xFFFD) } } if iCode == U32(0) { break } } else { break } if zIn < zEof { if (*TrigramTokenizer)(unsafe.Pointer(p)).FbFold != 0 { iCode = U32(sqlite3Fts5UnicodeFold(tls, int32(iCode), 0)) } { if iCode < U32(0x00080) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(U8(iCode & U32(0xFF))) } else if iCode < U32(0x00800) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xC0 + int32(U8(iCode>>6&U32(0x1F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } else if iCode < U32(0x10000) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xE0 + int32(U8(iCode>>12&U32(0x0F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } else { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xF0 + int32(U8(iCode>>18&U32(0x07)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>12&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } } iCode = U32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1)))) if iCode >= U32(0xc0) { iCode = U32(sqlite3Utf8Trans1[iCode-U32(0xc0)]) for zIn != zEof && int32(*(*uint8)(unsafe.Pointer(zIn)))&0xc0 == 0x80 { iCode = iCode<<6 + U32(0x3f&int32(*(*uint8)(unsafe.Pointer(libc.PostIncUintptr(&zIn, 1))))) } if iCode < U32(0x80) || iCode&0xFFFFF800 == U32(0xD800) || iCode&0xFFFFFFFE == U32(0xFFFE) { iCode = U32(0xFFFD) } } if iCode == U32(0) { break } if (*TrigramTokenizer)(unsafe.Pointer(p)).FbFold != 0 { iCode = U32(sqlite3Fts5UnicodeFold(tls, int32(iCode), 0)) } { if iCode < U32(0x00080) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(U8(iCode & U32(0xFF))) } else if iCode < U32(0x00800) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xC0 + int32(U8(iCode>>6&U32(0x1F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } else if iCode < U32(0x10000) { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xE0 + int32(U8(iCode>>12&U32(0x0F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } else { *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0xF0 + int32(U8(iCode>>18&U32(0x07)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>12&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode>>6&U32(0x3F)))) *(*int8)(unsafe.Pointer(libc.PostIncUintptr(&zOut, 1))) = int8(0x80 + int32(U8(iCode&U32(0x3F)))) } } } else { break } rc = (*struct { f func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32 })(unsafe.Pointer(&struct{ uintptr }{xToken})).f(tls, pCtx, 0, bp, int32(int64((zOut-bp)/1)), iStart, int32(int64((uintptr(iStart)+zOut-bp)/1))) if rc != SQLITE_OK { break } zIn = zNext } return rc } func sqlite3Fts5TokenizerPattern(tls *libc.TLS, xCreate uintptr, pTok uintptr) int32 { if xCreate == *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 }{fts5TriCreate})) { var p uintptr = pTok if (*TrigramTokenizer)(unsafe.Pointer(p)).FbFold != 0 { return FTS5_PATTERN_LIKE } return FTS5_PATTERN_GLOB } return FTS5_PATTERN_NONE } func sqlite3Fts5TokenizerInit(tls *libc.TLS, pApi uintptr) int32 { bp := tls.Alloc(128) defer tls.Free(128) *(*[4]BuiltinTokenizer)(unsafe.Pointer(bp)) = [4]BuiltinTokenizer{ {FzName: ts + 38426, Fx: Fts5_tokenizer{FxCreate: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 }{fts5UnicodeCreate})), FxDelete: *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{fts5UnicodeDelete})), FxTokenize: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, int32, uintptr) int32 }{fts5UnicodeTokenize}))}}, {FzName: ts + 38730, Fx: Fts5_tokenizer{FxCreate: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 }{fts5AsciiCreate})), FxDelete: *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{fts5AsciiDelete})), FxTokenize: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, int32, uintptr) int32 }{fts5AsciiTokenize}))}}, {FzName: ts + 38736, Fx: Fts5_tokenizer{FxCreate: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 }{fts5PorterCreate})), FxDelete: *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{fts5PorterDelete})), FxTokenize: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, int32, uintptr) int32 }{fts5PorterTokenize}))}}, {FzName: ts + 38743, Fx: Fts5_tokenizer{FxCreate: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32 }{fts5TriCreate})), FxDelete: *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, uintptr) }{fts5TriDelete})), FxTokenize: *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, uintptr, int32, uintptr, int32, uintptr) int32 }{fts5TriTokenize}))}}, } var rc int32 = SQLITE_OK var i int32 for i = 0; rc == SQLITE_OK && i < int32(uint64(unsafe.Sizeof([4]BuiltinTokenizer{}))/uint64(unsafe.Sizeof(BuiltinTokenizer{}))); i++ { rc = (*struct { f func(*libc.TLS, uintptr, uintptr, uintptr, uintptr, uintptr) int32 })(unsafe.Pointer(&struct{ uintptr }{(*Fts5_api)(unsafe.Pointer(pApi)).FxCreateTokenizer})).f(tls, pApi, (*BuiltinTokenizer)(unsafe.Pointer(bp+uintptr(i)*32)).FzName, pApi, bp+uintptr(i)*32+8, uintptr(0)) } return rc } type BuiltinTokenizer = struct { FzName uintptr Fx Fts5_tokenizer } func fts5_remove_diacritic(tls *libc.TLS, c int32, bComplex int32) int32 { bp := tls.Alloc(378) defer tls.Free(378) *(*[126]uint16)(unsafe.Pointer(bp)) = [126]uint16{ uint16(0), uint16(1797), uint16(1848), uint16(1859), uint16(1891), uint16(1928), uint16(1940), uint16(1995), uint16(2024), uint16(2040), uint16(2060), uint16(2110), uint16(2168), uint16(2206), uint16(2264), uint16(2286), uint16(2344), uint16(2383), uint16(2472), uint16(2488), uint16(2516), uint16(2596), uint16(2668), uint16(2732), uint16(2782), uint16(2842), uint16(2894), uint16(2954), uint16(2984), uint16(3000), uint16(3028), uint16(3336), uint16(3456), uint16(3696), uint16(3712), uint16(3728), uint16(3744), uint16(3766), uint16(3832), uint16(3896), uint16(3912), uint16(3928), uint16(3944), uint16(3968), uint16(4008), uint16(4040), uint16(4056), uint16(4106), uint16(4138), uint16(4170), uint16(4202), uint16(4234), uint16(4266), uint16(4296), uint16(4312), uint16(4344), uint16(4408), uint16(4424), uint16(4442), uint16(4472), uint16(4488), uint16(4504), uint16(6148), uint16(6198), uint16(6264), uint16(6280), uint16(6360), uint16(6429), uint16(6505), uint16(6529), uint16(61448), uint16(61468), uint16(61512), uint16(61534), uint16(61592), uint16(61610), uint16(61642), uint16(61672), uint16(61688), uint16(61704), uint16(61726), uint16(61784), uint16(61800), uint16(61816), uint16(61836), uint16(61880), uint16(61896), uint16(61914), uint16(61948), uint16(61998), uint16(62062), uint16(62122), uint16(62154), uint16(62184), uint16(62200), uint16(62218), uint16(62252), uint16(62302), uint16(62364), uint16(62410), uint16(62442), uint16(62478), uint16(62536), uint16(62554), uint16(62584), uint16(62604), uint16(62640), uint16(62648), uint16(62656), uint16(62664), uint16(62730), uint16(62766), uint16(62830), uint16(62890), uint16(62924), uint16(62974), uint16(63032), uint16(63050), uint16(63082), uint16(63118), uint16(63182), uint16(63242), uint16(63274), uint16(63310), uint16(63368), uint16(63390), } *(*[126]uint8)(unsafe.Pointer(bp + 252)) = [126]uint8{ uint8(0), uint8('a'), uint8('c'), uint8('e'), uint8('i'), uint8('n'), uint8('o'), uint8('u'), uint8('y'), uint8('y'), uint8('a'), uint8('c'), uint8('d'), uint8('e'), uint8('e'), uint8('g'), uint8('h'), uint8('i'), uint8('j'), uint8('k'), uint8('l'), uint8('n'), uint8('o'), uint8('r'), uint8('s'), uint8('t'), uint8('u'), uint8('u'), uint8('w'), uint8('y'), uint8('z'), uint8('o'), uint8('u'), uint8('a'), uint8('i'), uint8('o'), uint8('u'), uint8('u' | int32(uint8(0x80))), uint8('a' | int32(uint8(0x80))), uint8('g'), uint8('k'), uint8('o'), uint8('o' | int32(uint8(0x80))), uint8('j'), uint8('g'), uint8('n'), uint8('a' | int32(uint8(0x80))), uint8('a'), uint8('e'), uint8('i'), uint8('o'), uint8('r'), uint8('u'), uint8('s'), uint8('t'), uint8('h'), uint8('a'), uint8('e'), uint8('o' | int32(uint8(0x80))), uint8('o'), uint8('o' | int32(uint8(0x80))), uint8('y'), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8(0), uint8('a'), uint8('b'), uint8('c' | int32(uint8(0x80))), uint8('d'), uint8('d'), uint8('e' | int32(uint8(0x80))), uint8('e'), uint8('e' | int32(uint8(0x80))), uint8('f'), uint8('g'), uint8('h'), uint8('h'), uint8('i'), uint8('i' | int32(uint8(0x80))), uint8('k'), uint8('l'), uint8('l' | int32(uint8(0x80))), uint8('l'), uint8('m'), uint8('n'), uint8('o' | int32(uint8(0x80))), uint8('p'), uint8('r'), uint8('r' | int32(uint8(0x80))), uint8('r'), uint8('s'), uint8('s' | int32(uint8(0x80))), uint8('t'), uint8('u'), uint8('u' | int32(uint8(0x80))), uint8('v'), uint8('w'), uint8('w'), uint8('x'), uint8('y'), uint8('z'), uint8('h'), uint8('t'), uint8('w'), uint8('y'), uint8('a'), uint8('a' | int32(uint8(0x80))), uint8('a' | int32(uint8(0x80))), uint8('a' | int32(uint8(0x80))), uint8('e'), uint8('e' | int32(uint8(0x80))), uint8('e' | int32(uint8(0x80))), uint8('i'), uint8('o'), uint8('o' | int32(uint8(0x80))), uint8('o' | int32(uint8(0x80))), uint8('o' | int32(uint8(0x80))), uint8('u'), uint8('u' | int32(uint8(0x80))), uint8('u' | int32(uint8(0x80))), uint8('y'), } var key uint32 = uint32(c)<<3 | uint32(0x00000007) var iRes int32 = 0 var iHi int32 = int32(uint64(unsafe.Sizeof([126]uint16{}))/uint64(unsafe.Sizeof(uint16(0))) - uint64(1)) var iLo int32 = 0 for iHi >= iLo { var iTest int32 = (iHi + iLo) / 2 if key >= uint32(*(*uint16)(unsafe.Pointer(bp + uintptr(iTest)*2))) { iRes = iTest iLo = iTest + 1 } else { iHi = iTest - 1 } } if bComplex == 0 && int32(*(*uint8)(unsafe.Pointer(bp + 252 + uintptr(iRes))))&0x80 != 0 { return c } if c > int32(*(*uint16)(unsafe.Pointer(bp + uintptr(iRes)*2)))>>3+int32(*(*uint16)(unsafe.Pointer(bp + uintptr(iRes)*2)))&0x07 { return c } return int32(*(*uint8)(unsafe.Pointer(bp + 252 + uintptr(iRes)))) & 0x7F } func sqlite3Fts5UnicodeIsdiacritic(tls *libc.TLS, c int32) int32 { var mask0 uint32 = uint32(0x08029FDF) var mask1 uint32 = uint32(0x000361F8) if c < 768 || c > 817 { return 0 } if c < 768+32 { return int32(mask0 & (uint32(1) << (c - 768))) } return int32(mask1 & (uint32(1) << (c - 768 - 32))) } func sqlite3Fts5UnicodeFold(tls *libc.TLS, c int32, eRemoveDiacritic int32) int32 { var ret int32 = c if c < 128 { if c >= 'A' && c <= 'Z' { ret = c + ('a' - 'A') } } else if c < 65536 { var p uintptr var iHi int32 = int32(uint64(unsafe.Sizeof(aEntry))/uint64(unsafe.Sizeof(TableEntry{})) - uint64(1)) var iLo int32 = 0 var iRes int32 = -1 for iHi >= iLo { var iTest int32 = (iHi + iLo) / 2 var cmp int32 = c - int32(aEntry[iTest].FiCode) if cmp >= 0 { iRes = iTest iLo = iTest + 1 } else { iHi = iTest - 1 } } p = uintptr(unsafe.Pointer(&aEntry)) + uintptr(iRes)*4 if c < int32((*TableEntry)(unsafe.Pointer(p)).FiCode)+int32((*TableEntry)(unsafe.Pointer(p)).FnRange) && 0 == 0x01&int32((*TableEntry)(unsafe.Pointer(p)).Fflags)&(int32((*TableEntry)(unsafe.Pointer(p)).FiCode)^c) { ret = (c + int32(aiOff[int32((*TableEntry)(unsafe.Pointer(p)).Fflags)>>1])) & 0x0000FFFF } if eRemoveDiacritic != 0 { ret = fts5_remove_diacritic(tls, ret, libc.Bool32(eRemoveDiacritic == 2)) } } else if c >= 66560 && c < 66600 { ret = c + 40 } return ret } // Each entry in the following array defines a rule for folding a range // of codepoints to lower case. The rule applies to a range of nRange // codepoints starting at codepoint iCode. // // If the least significant bit in flags is clear, then the rule applies // to all nRange codepoints (i.e. all nRange codepoints are upper case and // need to be folded). Or, if it is set, then the rule only applies to // every second codepoint in the range, starting with codepoint C. // // The 7 most significant bits in flags are an index into the aiOff[] // array. If a specific codepoint C does require folding, then its lower // case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF). // // The contents of this array are generated by parsing the CaseFolding.txt // file distributed as part of the "Unicode Character Database". See // http://www.unicode.org for details. type TableEntry = struct { FiCode uint16 Fflags uint8 FnRange uint8 } var aEntry = [163]TableEntry{ {FiCode: uint16(65), Fflags: uint8(14), FnRange: uint8(26)}, {FiCode: uint16(181), Fflags: uint8(64), FnRange: uint8(1)}, {FiCode: uint16(192), Fflags: uint8(14), FnRange: uint8(23)}, {FiCode: uint16(216), Fflags: uint8(14), FnRange: uint8(7)}, {FiCode: uint16(256), Fflags: uint8(1), FnRange: uint8(48)}, {FiCode: uint16(306), Fflags: uint8(1), FnRange: uint8(6)}, {FiCode: uint16(313), Fflags: uint8(1), FnRange: uint8(16)}, {FiCode: uint16(330), Fflags: uint8(1), FnRange: uint8(46)}, {FiCode: uint16(376), Fflags: uint8(116), FnRange: uint8(1)}, {FiCode: uint16(377), Fflags: uint8(1), FnRange: uint8(6)}, {FiCode: uint16(383), Fflags: uint8(104), FnRange: uint8(1)}, {FiCode: uint16(385), Fflags: uint8(50), FnRange: uint8(1)}, {FiCode: uint16(386), Fflags: uint8(1), FnRange: uint8(4)}, {FiCode: uint16(390), Fflags: uint8(44), FnRange: uint8(1)}, {FiCode: uint16(391), FnRange: uint8(1)}, {FiCode: uint16(393), Fflags: uint8(42), FnRange: uint8(2)}, {FiCode: uint16(395), FnRange: uint8(1)}, {FiCode: uint16(398), Fflags: uint8(32), FnRange: uint8(1)}, {FiCode: uint16(399), Fflags: uint8(38), FnRange: uint8(1)}, {FiCode: uint16(400), Fflags: uint8(40), FnRange: uint8(1)}, {FiCode: uint16(401), FnRange: uint8(1)}, {FiCode: uint16(403), Fflags: uint8(42), FnRange: uint8(1)}, {FiCode: uint16(404), Fflags: uint8(46), FnRange: uint8(1)}, {FiCode: uint16(406), Fflags: uint8(52), FnRange: uint8(1)}, {FiCode: uint16(407), Fflags: uint8(48), FnRange: uint8(1)}, {FiCode: uint16(408), FnRange: uint8(1)}, {FiCode: uint16(412), Fflags: uint8(52), FnRange: uint8(1)}, {FiCode: uint16(413), Fflags: uint8(54), FnRange: uint8(1)}, {FiCode: uint16(415), Fflags: uint8(56), FnRange: uint8(1)}, {FiCode: uint16(416), Fflags: uint8(1), FnRange: uint8(6)}, {FiCode: uint16(422), Fflags: uint8(60), FnRange: uint8(1)}, {FiCode: uint16(423), FnRange: uint8(1)}, {FiCode: uint16(425), Fflags: uint8(60), FnRange: uint8(1)}, {FiCode: uint16(428), FnRange: uint8(1)}, {FiCode: uint16(430), Fflags: uint8(60), FnRange: uint8(1)}, {FiCode: uint16(431), FnRange: uint8(1)}, {FiCode: uint16(433), Fflags: uint8(58), FnRange: uint8(2)}, {FiCode: uint16(435), Fflags: uint8(1), FnRange: uint8(4)}, {FiCode: uint16(439), Fflags: uint8(62), FnRange: uint8(1)}, {FiCode: uint16(440), FnRange: uint8(1)}, {FiCode: uint16(444), FnRange: uint8(1)}, {FiCode: uint16(452), Fflags: uint8(2), FnRange: uint8(1)}, {FiCode: uint16(453), FnRange: uint8(1)}, {FiCode: uint16(455), Fflags: uint8(2), FnRange: uint8(1)}, {FiCode: uint16(456), FnRange: uint8(1)}, {FiCode: uint16(458), Fflags: uint8(2), FnRange: uint8(1)}, {FiCode: uint16(459), Fflags: uint8(1), FnRange: uint8(18)}, {FiCode: uint16(478), Fflags: uint8(1), FnRange: uint8(18)}, {FiCode: uint16(497), Fflags: uint8(2), FnRange: uint8(1)}, {FiCode: uint16(498), Fflags: uint8(1), FnRange: uint8(4)}, {FiCode: uint16(502), Fflags: uint8(122), FnRange: uint8(1)}, {FiCode: uint16(503), Fflags: uint8(134), FnRange: uint8(1)}, {FiCode: uint16(504), Fflags: uint8(1), FnRange: uint8(40)}, {FiCode: uint16(544), Fflags: uint8(110), FnRange: uint8(1)}, {FiCode: uint16(546), Fflags: uint8(1), FnRange: uint8(18)}, {FiCode: uint16(570), Fflags: uint8(70), FnRange: uint8(1)}, {FiCode: uint16(571), FnRange: uint8(1)}, {FiCode: uint16(573), Fflags: uint8(108), FnRange: uint8(1)}, {FiCode: uint16(574), Fflags: uint8(68), FnRange: uint8(1)}, {FiCode: uint16(577), FnRange: uint8(1)}, {FiCode: uint16(579), Fflags: uint8(106), FnRange: uint8(1)}, {FiCode: uint16(580), Fflags: uint8(28), FnRange: uint8(1)}, {FiCode: uint16(581), Fflags: uint8(30), FnRange: uint8(1)}, {FiCode: uint16(582), Fflags: uint8(1), FnRange: uint8(10)}, {FiCode: uint16(837), Fflags: uint8(36), FnRange: uint8(1)}, {FiCode: uint16(880), Fflags: uint8(1), FnRange: uint8(4)}, {FiCode: uint16(886), FnRange: uint8(1)}, {FiCode: uint16(902), Fflags: uint8(18), FnRange: uint8(1)}, {FiCode: uint16(904), Fflags: uint8(16), FnRange: uint8(3)}, {FiCode: uint16(908), Fflags: uint8(26), FnRange: uint8(1)}, {FiCode: uint16(910), Fflags: uint8(24), FnRange: uint8(2)}, {FiCode: uint16(913), Fflags: uint8(14), FnRange: uint8(17)}, {FiCode: uint16(931), Fflags: uint8(14), FnRange: uint8(9)}, {FiCode: uint16(962), FnRange: uint8(1)}, {FiCode: uint16(975), Fflags: uint8(4), FnRange: uint8(1)}, {FiCode: uint16(976), Fflags: uint8(140), FnRange: uint8(1)}, {FiCode: uint16(977), Fflags: uint8(142), FnRange: uint8(1)}, {FiCode: uint16(981), Fflags: uint8(146), FnRange: uint8(1)}, {FiCode: uint16(982), Fflags: uint8(144), FnRange: uint8(1)}, {FiCode: uint16(984), Fflags: uint8(1), FnRange: uint8(24)}, {FiCode: uint16(1008), Fflags: uint8(136), FnRange: uint8(1)}, {FiCode: uint16(1009), Fflags: uint8(138), FnRange: uint8(1)}, {FiCode: uint16(1012), Fflags: uint8(130), FnRange: uint8(1)}, {FiCode: uint16(1013), Fflags: uint8(128), FnRange: uint8(1)}, {FiCode: uint16(1015), FnRange: uint8(1)}, {FiCode: uint16(1017), Fflags: uint8(152), FnRange: uint8(1)}, {FiCode: uint16(1018), FnRange: uint8(1)}, {FiCode: uint16(1021), Fflags: uint8(110), FnRange: uint8(3)}, {FiCode: uint16(1024), Fflags: uint8(34), FnRange: uint8(16)}, {FiCode: uint16(1040), Fflags: uint8(14), FnRange: uint8(32)}, {FiCode: uint16(1120), Fflags: uint8(1), FnRange: uint8(34)}, {FiCode: uint16(1162), Fflags: uint8(1), FnRange: uint8(54)}, {FiCode: uint16(1216), Fflags: uint8(6), FnRange: uint8(1)}, {FiCode: uint16(1217), Fflags: uint8(1), FnRange: uint8(14)}, {FiCode: uint16(1232), Fflags: uint8(1), FnRange: uint8(88)}, {FiCode: uint16(1329), Fflags: uint8(22), FnRange: uint8(38)}, {FiCode: uint16(4256), Fflags: uint8(66), FnRange: uint8(38)}, {FiCode: uint16(4295), Fflags: uint8(66), FnRange: uint8(1)}, {FiCode: uint16(4301), Fflags: uint8(66), FnRange: uint8(1)}, {FiCode: uint16(7680), Fflags: uint8(1), FnRange: uint8(150)}, {FiCode: uint16(7835), Fflags: uint8(132), FnRange: uint8(1)}, {FiCode: uint16(7838), Fflags: uint8(96), FnRange: uint8(1)}, {FiCode: uint16(7840), Fflags: uint8(1), FnRange: uint8(96)}, {FiCode: uint16(7944), Fflags: uint8(150), FnRange: uint8(8)}, {FiCode: uint16(7960), Fflags: uint8(150), FnRange: uint8(6)}, {FiCode: uint16(7976), Fflags: uint8(150), FnRange: uint8(8)}, {FiCode: uint16(7992), Fflags: uint8(150), FnRange: uint8(8)}, {FiCode: uint16(8008), Fflags: uint8(150), FnRange: uint8(6)}, {FiCode: uint16(8025), Fflags: uint8(151), FnRange: uint8(8)}, {FiCode: uint16(8040), Fflags: uint8(150), FnRange: uint8(8)}, {FiCode: uint16(8072), Fflags: uint8(150), FnRange: uint8(8)}, {FiCode: uint16(8088), Fflags: uint8(150), FnRange: uint8(8)}, {FiCode: uint16(8104), Fflags: uint8(150), FnRange: uint8(8)}, {FiCode: uint16(8120), Fflags: uint8(150), FnRange: uint8(2)}, {FiCode: uint16(8122), Fflags: uint8(126), FnRange: uint8(2)}, {FiCode: uint16(8124), Fflags: uint8(148), FnRange: uint8(1)}, {FiCode: uint16(8126), Fflags: uint8(100), FnRange: uint8(1)}, {FiCode: uint16(8136), Fflags: uint8(124), FnRange: uint8(4)}, {FiCode: uint16(8140), Fflags: uint8(148), FnRange: uint8(1)}, {FiCode: uint16(8152), Fflags: uint8(150), FnRange: uint8(2)}, {FiCode: uint16(8154), Fflags: uint8(120), FnRange: uint8(2)}, {FiCode: uint16(8168), Fflags: uint8(150), FnRange: uint8(2)}, {FiCode: uint16(8170), Fflags: uint8(118), FnRange: uint8(2)}, {FiCode: uint16(8172), Fflags: uint8(152), FnRange: uint8(1)}, {FiCode: uint16(8184), Fflags: uint8(112), FnRange: uint8(2)}, {FiCode: uint16(8186), Fflags: uint8(114), FnRange: uint8(2)}, {FiCode: uint16(8188), Fflags: uint8(148), FnRange: uint8(1)}, {FiCode: uint16(8486), Fflags: uint8(98), FnRange: uint8(1)}, {FiCode: uint16(8490), Fflags: uint8(92), FnRange: uint8(1)}, {FiCode: uint16(8491), Fflags: uint8(94), FnRange: uint8(1)}, {FiCode: uint16(8498), Fflags: uint8(12), FnRange: uint8(1)}, {FiCode: uint16(8544), Fflags: uint8(8), FnRange: uint8(16)}, {FiCode: uint16(8579), FnRange: uint8(1)}, {FiCode: uint16(9398), Fflags: uint8(10), FnRange: uint8(26)}, {FiCode: uint16(11264), Fflags: uint8(22), FnRange: uint8(47)}, {FiCode: uint16(11360), FnRange: uint8(1)}, {FiCode: uint16(11362), Fflags: uint8(88), FnRange: uint8(1)}, {FiCode: uint16(11363), Fflags: uint8(102), FnRange: uint8(1)}, {FiCode: uint16(11364), Fflags: uint8(90), FnRange: uint8(1)}, {FiCode: uint16(11367), Fflags: uint8(1), FnRange: uint8(6)}, {FiCode: uint16(11373), Fflags: uint8(84), FnRange: uint8(1)}, {FiCode: uint16(11374), Fflags: uint8(86), FnRange: uint8(1)}, {FiCode: uint16(11375), Fflags: uint8(80), FnRange: uint8(1)}, {FiCode: uint16(11376), Fflags: uint8(82), FnRange: uint8(1)}, {FiCode: uint16(11378), FnRange: uint8(1)}, {FiCode: uint16(11381), FnRange: uint8(1)}, {FiCode: uint16(11390), Fflags: uint8(78), FnRange: uint8(2)}, {FiCode: uint16(11392), Fflags: uint8(1), FnRange: uint8(100)}, {FiCode: uint16(11499), Fflags: uint8(1), FnRange: uint8(4)}, {FiCode: uint16(11506), FnRange: uint8(1)}, {FiCode: uint16(42560), Fflags: uint8(1), FnRange: uint8(46)}, {FiCode: uint16(42624), Fflags: uint8(1), FnRange: uint8(24)}, {FiCode: uint16(42786), Fflags: uint8(1), FnRange: uint8(14)}, {FiCode: uint16(42802), Fflags: uint8(1), FnRange: uint8(62)}, {FiCode: uint16(42873), Fflags: uint8(1), FnRange: uint8(4)}, {FiCode: uint16(42877), Fflags: uint8(76), FnRange: uint8(1)}, {FiCode: uint16(42878), Fflags: uint8(1), FnRange: uint8(10)}, {FiCode: uint16(42891), FnRange: uint8(1)}, {FiCode: uint16(42893), Fflags: uint8(74), FnRange: uint8(1)}, {FiCode: uint16(42896), Fflags: uint8(1), FnRange: uint8(4)}, {FiCode: uint16(42912), Fflags: uint8(1), FnRange: uint8(10)}, {FiCode: uint16(42922), Fflags: uint8(72), FnRange: uint8(1)}, {FiCode: uint16(65313), Fflags: uint8(14), FnRange: uint8(26)}, } var aiOff = [77]uint16{ uint16(1), uint16(2), uint16(8), uint16(15), uint16(16), uint16(26), uint16(28), uint16(32), uint16(37), uint16(38), uint16(40), uint16(48), uint16(63), uint16(64), uint16(69), uint16(71), uint16(79), uint16(80), uint16(116), uint16(202), uint16(203), uint16(205), uint16(206), uint16(207), uint16(209), uint16(210), uint16(211), uint16(213), uint16(214), uint16(217), uint16(218), uint16(219), uint16(775), uint16(7264), uint16(10792), uint16(10795), uint16(23228), uint16(23256), uint16(30204), uint16(54721), uint16(54753), uint16(54754), uint16(54756), uint16(54787), uint16(54793), uint16(54809), uint16(57153), uint16(57274), uint16(57921), uint16(58019), uint16(58363), uint16(61722), uint16(65268), uint16(65341), uint16(65373), uint16(65406), uint16(65408), uint16(65410), uint16(65415), uint16(65424), uint16(65436), uint16(65439), uint16(65450), uint16(65462), uint16(65472), uint16(65476), uint16(65478), uint16(65480), uint16(65482), uint16(65488), uint16(65506), uint16(65511), uint16(65514), uint16(65521), uint16(65527), uint16(65528), uint16(65529), } func sqlite3Fts5UnicodeCatParse(tls *libc.TLS, zCat uintptr, aArray uintptr) int32 { *(*U8)(unsafe.Pointer(aArray)) = U8(1) switch int32(*(*int8)(unsafe.Pointer(zCat))) { case 'C': switch int32(*(*int8)(unsafe.Pointer(zCat + 1))) { case 'c': *(*U8)(unsafe.Pointer(aArray + 1)) = U8(1) break case 'f': *(*U8)(unsafe.Pointer(aArray + 2)) = U8(1) break case 'n': *(*U8)(unsafe.Pointer(aArray + 3)) = U8(1) break case 's': *(*U8)(unsafe.Pointer(aArray + 4)) = U8(1) break case 'o': *(*U8)(unsafe.Pointer(aArray + 31)) = U8(1) break case '*': *(*U8)(unsafe.Pointer(aArray + 1)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 2)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 3)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 4)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 31)) = U8(1) break default: return 1 } break case 'L': switch int32(*(*int8)(unsafe.Pointer(zCat + 1))) { case 'l': *(*U8)(unsafe.Pointer(aArray + 5)) = U8(1) break case 'm': *(*U8)(unsafe.Pointer(aArray + 6)) = U8(1) break case 'o': *(*U8)(unsafe.Pointer(aArray + 7)) = U8(1) break case 't': *(*U8)(unsafe.Pointer(aArray + 8)) = U8(1) break case 'u': *(*U8)(unsafe.Pointer(aArray + 9)) = U8(1) break case 'C': *(*U8)(unsafe.Pointer(aArray + 30)) = U8(1) break case '*': *(*U8)(unsafe.Pointer(aArray + 5)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 6)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 7)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 8)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 9)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 30)) = U8(1) break default: return 1 } break case 'M': switch int32(*(*int8)(unsafe.Pointer(zCat + 1))) { case 'c': *(*U8)(unsafe.Pointer(aArray + 10)) = U8(1) break case 'e': *(*U8)(unsafe.Pointer(aArray + 11)) = U8(1) break case 'n': *(*U8)(unsafe.Pointer(aArray + 12)) = U8(1) break case '*': *(*U8)(unsafe.Pointer(aArray + 10)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 11)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 12)) = U8(1) break default: return 1 } break case 'N': switch int32(*(*int8)(unsafe.Pointer(zCat + 1))) { case 'd': *(*U8)(unsafe.Pointer(aArray + 13)) = U8(1) break case 'l': *(*U8)(unsafe.Pointer(aArray + 14)) = U8(1) break case 'o': *(*U8)(unsafe.Pointer(aArray + 15)) = U8(1) break case '*': *(*U8)(unsafe.Pointer(aArray + 13)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 14)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 15)) = U8(1) break default: return 1 } break case 'P': switch int32(*(*int8)(unsafe.Pointer(zCat + 1))) { case 'c': *(*U8)(unsafe.Pointer(aArray + 16)) = U8(1) break case 'd': *(*U8)(unsafe.Pointer(aArray + 17)) = U8(1) break case 'e': *(*U8)(unsafe.Pointer(aArray + 18)) = U8(1) break case 'f': *(*U8)(unsafe.Pointer(aArray + 19)) = U8(1) break case 'i': *(*U8)(unsafe.Pointer(aArray + 20)) = U8(1) break case 'o': *(*U8)(unsafe.Pointer(aArray + 21)) = U8(1) break case 's': *(*U8)(unsafe.Pointer(aArray + 22)) = U8(1) break case '*': *(*U8)(unsafe.Pointer(aArray + 16)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 17)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 18)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 19)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 20)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 21)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 22)) = U8(1) break default: return 1 } break case 'S': switch int32(*(*int8)(unsafe.Pointer(zCat + 1))) { case 'c': *(*U8)(unsafe.Pointer(aArray + 23)) = U8(1) break case 'k': *(*U8)(unsafe.Pointer(aArray + 24)) = U8(1) break case 'm': *(*U8)(unsafe.Pointer(aArray + 25)) = U8(1) break case 'o': *(*U8)(unsafe.Pointer(aArray + 26)) = U8(1) break case '*': *(*U8)(unsafe.Pointer(aArray + 23)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 24)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 25)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 26)) = U8(1) break default: return 1 } break case 'Z': switch int32(*(*int8)(unsafe.Pointer(zCat + 1))) { case 'l': *(*U8)(unsafe.Pointer(aArray + 27)) = U8(1) break case 'p': *(*U8)(unsafe.Pointer(aArray + 28)) = U8(1) break case 's': *(*U8)(unsafe.Pointer(aArray + 29)) = U8(1) break case '*': *(*U8)(unsafe.Pointer(aArray + 27)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 28)) = U8(1) *(*U8)(unsafe.Pointer(aArray + 29)) = U8(1) break default: return 1 } break } return 0 } var aFts5UnicodeBlock = [17]U16{ U16(0), U16(1471), U16(1753), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1760), U16(1763), U16(1765), } var aFts5UnicodeMap = [1765]U16{ U16(0), U16(32), U16(33), U16(36), U16(37), U16(40), U16(41), U16(42), U16(43), U16(44), U16(45), U16(46), U16(48), U16(58), U16(60), U16(63), U16(65), U16(91), U16(92), U16(93), U16(94), U16(95), U16(96), U16(97), U16(123), U16(124), U16(125), U16(126), U16(127), U16(160), U16(161), U16(162), U16(166), U16(167), U16(168), U16(169), U16(170), U16(171), U16(172), U16(173), U16(174), U16(175), U16(176), U16(177), U16(178), U16(180), U16(181), U16(182), U16(184), U16(185), U16(186), U16(187), U16(188), U16(191), U16(192), U16(215), U16(216), U16(223), U16(247), U16(248), U16(256), U16(312), U16(313), U16(329), U16(330), U16(377), U16(383), U16(385), U16(387), U16(388), U16(391), U16(394), U16(396), U16(398), U16(402), U16(403), U16(405), U16(406), U16(409), U16(412), U16(414), U16(415), U16(417), U16(418), U16(423), U16(427), U16(428), U16(431), U16(434), U16(436), U16(437), U16(440), U16(442), U16(443), U16(444), U16(446), U16(448), U16(452), U16(453), U16(454), U16(455), U16(456), U16(457), U16(458), U16(459), U16(460), U16(461), U16(477), U16(478), U16(496), U16(497), U16(498), U16(499), U16(500), U16(503), U16(505), U16(506), U16(564), U16(570), U16(572), U16(573), U16(575), U16(577), U16(580), U16(583), U16(584), U16(592), U16(660), U16(661), U16(688), U16(706), U16(710), U16(722), U16(736), U16(741), U16(748), U16(749), U16(750), U16(751), U16(768), U16(880), U16(884), U16(885), U16(886), U16(890), U16(891), U16(894), U16(900), U16(902), U16(903), U16(904), U16(908), U16(910), U16(912), U16(913), U16(931), U16(940), U16(975), U16(977), U16(978), U16(981), U16(984), U16(1008), U16(1012), U16(1014), U16(1015), U16(1018), U16(1020), U16(1021), U16(1072), U16(1120), U16(1154), U16(1155), U16(1160), U16(1162), U16(1217), U16(1231), U16(1232), U16(1329), U16(1369), U16(1370), U16(1377), U16(1417), U16(1418), U16(1423), U16(1425), U16(1470), U16(1471), U16(1472), U16(1473), U16(1475), U16(1476), U16(1478), U16(1479), U16(1488), U16(1520), U16(1523), U16(1536), U16(1542), U16(1545), U16(1547), U16(1548), U16(1550), U16(1552), U16(1563), U16(1566), U16(1568), U16(1600), U16(1601), U16(1611), U16(1632), U16(1642), U16(1646), U16(1648), U16(1649), U16(1748), U16(1749), U16(1750), U16(1757), U16(1758), U16(1759), U16(1765), U16(1767), U16(1769), U16(1770), U16(1774), U16(1776), U16(1786), U16(1789), U16(1791), U16(1792), U16(1807), U16(1808), U16(1809), U16(1810), U16(1840), U16(1869), U16(1958), U16(1969), U16(1984), U16(1994), U16(2027), U16(2036), U16(2038), U16(2039), U16(2042), U16(2048), U16(2070), U16(2074), U16(2075), U16(2084), U16(2085), U16(2088), U16(2089), U16(2096), U16(2112), U16(2137), U16(2142), U16(2208), U16(2210), U16(2276), U16(2304), U16(2307), U16(2308), U16(2362), U16(2363), U16(2364), U16(2365), U16(2366), U16(2369), U16(2377), U16(2381), U16(2382), U16(2384), U16(2385), U16(2392), U16(2402), U16(2404), U16(2406), U16(2416), U16(2417), U16(2418), U16(2425), U16(2433), U16(2434), U16(2437), U16(2447), U16(2451), U16(2474), U16(2482), U16(2486), U16(2492), U16(2493), U16(2494), U16(2497), U16(2503), U16(2507), U16(2509), U16(2510), U16(2519), U16(2524), U16(2527), U16(2530), U16(2534), U16(2544), U16(2546), U16(2548), U16(2554), U16(2555), U16(2561), U16(2563), U16(2565), U16(2575), U16(2579), U16(2602), U16(2610), U16(2613), U16(2616), U16(2620), U16(2622), U16(2625), U16(2631), U16(2635), U16(2641), U16(2649), U16(2654), U16(2662), U16(2672), U16(2674), U16(2677), U16(2689), U16(2691), U16(2693), U16(2703), U16(2707), U16(2730), U16(2738), U16(2741), U16(2748), U16(2749), U16(2750), U16(2753), U16(2759), U16(2761), U16(2763), U16(2765), U16(2768), U16(2784), U16(2786), U16(2790), U16(2800), U16(2801), U16(2817), U16(2818), U16(2821), U16(2831), U16(2835), U16(2858), U16(2866), U16(2869), U16(2876), U16(2877), U16(2878), U16(2879), U16(2880), U16(2881), U16(2887), U16(2891), U16(2893), U16(2902), U16(2903), U16(2908), U16(2911), U16(2914), U16(2918), U16(2928), U16(2929), U16(2930), U16(2946), U16(2947), U16(2949), U16(2958), U16(2962), U16(2969), U16(2972), U16(2974), U16(2979), U16(2984), U16(2990), U16(3006), U16(3008), U16(3009), U16(3014), U16(3018), U16(3021), U16(3024), U16(3031), U16(3046), U16(3056), U16(3059), U16(3065), U16(3066), U16(3073), U16(3077), U16(3086), U16(3090), U16(3114), U16(3125), U16(3133), U16(3134), U16(3137), U16(3142), U16(3146), U16(3157), U16(3160), U16(3168), U16(3170), U16(3174), U16(3192), U16(3199), U16(3202), U16(3205), U16(3214), U16(3218), U16(3242), U16(3253), U16(3260), U16(3261), U16(3262), U16(3263), U16(3264), U16(3270), U16(3271), U16(3274), U16(3276), U16(3285), U16(3294), U16(3296), U16(3298), U16(3302), U16(3313), U16(3330), U16(3333), U16(3342), U16(3346), U16(3389), U16(3390), U16(3393), U16(3398), U16(3402), U16(3405), U16(3406), U16(3415), U16(3424), U16(3426), U16(3430), U16(3440), U16(3449), U16(3450), U16(3458), U16(3461), U16(3482), U16(3507), U16(3517), U16(3520), U16(3530), U16(3535), U16(3538), U16(3542), U16(3544), U16(3570), U16(3572), U16(3585), U16(3633), U16(3634), U16(3636), U16(3647), U16(3648), U16(3654), U16(3655), U16(3663), U16(3664), U16(3674), U16(3713), U16(3716), U16(3719), U16(3722), U16(3725), U16(3732), U16(3737), U16(3745), U16(3749), U16(3751), U16(3754), U16(3757), U16(3761), U16(3762), U16(3764), U16(3771), U16(3773), U16(3776), U16(3782), U16(3784), U16(3792), U16(3804), U16(3840), U16(3841), U16(3844), U16(3859), U16(3860), U16(3861), U16(3864), U16(3866), U16(3872), U16(3882), U16(3892), U16(3893), U16(3894), U16(3895), U16(3896), U16(3897), U16(3898), U16(3899), U16(3900), U16(3901), U16(3902), U16(3904), U16(3913), U16(3953), U16(3967), U16(3968), U16(3973), U16(3974), U16(3976), U16(3981), U16(3993), U16(4030), U16(4038), U16(4039), U16(4046), U16(4048), U16(4053), U16(4057), U16(4096), U16(4139), U16(4141), U16(4145), U16(4146), U16(4152), U16(4153), U16(4155), U16(4157), U16(4159), U16(4160), U16(4170), U16(4176), U16(4182), U16(4184), U16(4186), U16(4190), U16(4193), U16(4194), U16(4197), U16(4199), U16(4206), U16(4209), U16(4213), U16(4226), U16(4227), U16(4229), U16(4231), U16(4237), U16(4238), U16(4239), U16(4240), U16(4250), U16(4253), U16(4254), U16(4256), U16(4295), U16(4301), U16(4304), U16(4347), U16(4348), U16(4349), U16(4682), U16(4688), U16(4696), U16(4698), U16(4704), U16(4746), U16(4752), U16(4786), U16(4792), U16(4800), U16(4802), U16(4808), U16(4824), U16(4882), U16(4888), U16(4957), U16(4960), U16(4969), U16(4992), U16(5008), U16(5024), U16(5120), U16(5121), U16(5741), U16(5743), U16(5760), U16(5761), U16(5787), U16(5788), U16(5792), U16(5867), U16(5870), U16(5888), U16(5902), U16(5906), U16(5920), U16(5938), U16(5941), U16(5952), U16(5970), U16(5984), U16(5998), U16(6002), U16(6016), U16(6068), U16(6070), U16(6071), U16(6078), U16(6086), U16(6087), U16(6089), U16(6100), U16(6103), U16(6104), U16(6107), U16(6108), U16(6109), U16(6112), U16(6128), U16(6144), U16(6150), U16(6151), U16(6155), U16(6158), U16(6160), U16(6176), U16(6211), U16(6212), U16(6272), U16(6313), U16(6314), U16(6320), U16(6400), U16(6432), U16(6435), U16(6439), U16(6441), U16(6448), U16(6450), U16(6451), U16(6457), U16(6464), U16(6468), U16(6470), U16(6480), U16(6512), U16(6528), U16(6576), U16(6593), U16(6600), U16(6608), U16(6618), U16(6622), U16(6656), U16(6679), U16(6681), U16(6686), U16(6688), U16(6741), U16(6742), U16(6743), U16(6744), U16(6752), U16(6753), U16(6754), U16(6755), U16(6757), U16(6765), U16(6771), U16(6783), U16(6784), U16(6800), U16(6816), U16(6823), U16(6824), U16(6912), U16(6916), U16(6917), U16(6964), U16(6965), U16(6966), U16(6971), U16(6972), U16(6973), U16(6978), U16(6979), U16(6981), U16(6992), U16(7002), U16(7009), U16(7019), U16(7028), U16(7040), U16(7042), U16(7043), U16(7073), U16(7074), U16(7078), U16(7080), U16(7082), U16(7083), U16(7084), U16(7086), U16(7088), U16(7098), U16(7142), U16(7143), U16(7144), U16(7146), U16(7149), U16(7150), U16(7151), U16(7154), U16(7164), U16(7168), U16(7204), U16(7212), U16(7220), U16(7222), U16(7227), U16(7232), U16(7245), U16(7248), U16(7258), U16(7288), U16(7294), U16(7360), U16(7376), U16(7379), U16(7380), U16(7393), U16(7394), U16(7401), U16(7405), U16(7406), U16(7410), U16(7412), U16(7413), U16(7424), U16(7468), U16(7531), U16(7544), U16(7545), U16(7579), U16(7616), U16(7676), U16(7680), U16(7830), U16(7838), U16(7936), U16(7944), U16(7952), U16(7960), U16(7968), U16(7976), U16(7984), U16(7992), U16(8000), U16(8008), U16(8016), U16(8025), U16(8027), U16(8029), U16(8031), U16(8033), U16(8040), U16(8048), U16(8064), U16(8072), U16(8080), U16(8088), U16(8096), U16(8104), U16(8112), U16(8118), U16(8120), U16(8124), U16(8125), U16(8126), U16(8127), U16(8130), U16(8134), U16(8136), U16(8140), U16(8141), U16(8144), U16(8150), U16(8152), U16(8157), U16(8160), U16(8168), U16(8173), U16(8178), U16(8182), U16(8184), U16(8188), U16(8189), U16(8192), U16(8203), U16(8208), U16(8214), U16(8216), U16(8217), U16(8218), U16(8219), U16(8221), U16(8222), U16(8223), U16(8224), U16(8232), U16(8233), U16(8234), U16(8239), U16(8240), U16(8249), U16(8250), U16(8251), U16(8255), U16(8257), U16(8260), U16(8261), U16(8262), U16(8263), U16(8274), U16(8275), U16(8276), U16(8277), U16(8287), U16(8288), U16(8298), U16(8304), U16(8305), U16(8308), U16(8314), U16(8317), U16(8318), U16(8319), U16(8320), U16(8330), U16(8333), U16(8334), U16(8336), U16(8352), U16(8400), U16(8413), U16(8417), U16(8418), U16(8421), U16(8448), U16(8450), U16(8451), U16(8455), U16(8456), U16(8458), U16(8459), U16(8462), U16(8464), U16(8467), U16(8468), U16(8469), U16(8470), U16(8472), U16(8473), U16(8478), U16(8484), U16(8485), U16(8486), U16(8487), U16(8488), U16(8489), U16(8490), U16(8494), U16(8495), U16(8496), U16(8500), U16(8501), U16(8505), U16(8506), U16(8508), U16(8510), U16(8512), U16(8517), U16(8519), U16(8522), U16(8523), U16(8524), U16(8526), U16(8527), U16(8528), U16(8544), U16(8579), U16(8581), U16(8585), U16(8592), U16(8597), U16(8602), U16(8604), U16(8608), U16(8609), U16(8611), U16(8612), U16(8614), U16(8615), U16(8622), U16(8623), U16(8654), U16(8656), U16(8658), U16(8659), U16(8660), U16(8661), U16(8692), U16(8960), U16(8968), U16(8972), U16(8992), U16(8994), U16(9001), U16(9002), U16(9003), U16(9084), U16(9085), U16(9115), U16(9140), U16(9180), U16(9186), U16(9216), U16(9280), U16(9312), U16(9372), U16(9450), U16(9472), U16(9655), U16(9656), U16(9665), U16(9666), U16(9720), U16(9728), U16(9839), U16(9840), U16(9985), U16(10088), U16(10089), U16(10090), U16(10091), U16(10092), U16(10093), U16(10094), U16(10095), U16(10096), U16(10097), U16(10098), U16(10099), U16(10100), U16(10101), U16(10102), U16(10132), U16(10176), U16(10181), U16(10182), U16(10183), U16(10214), U16(10215), U16(10216), U16(10217), U16(10218), U16(10219), U16(10220), U16(10221), U16(10222), U16(10223), U16(10224), U16(10240), U16(10496), U16(10627), U16(10628), U16(10629), U16(10630), U16(10631), U16(10632), U16(10633), U16(10634), U16(10635), U16(10636), U16(10637), U16(10638), U16(10639), U16(10640), U16(10641), U16(10642), U16(10643), U16(10644), U16(10645), U16(10646), U16(10647), U16(10648), U16(10649), U16(10712), U16(10713), U16(10714), U16(10715), U16(10716), U16(10748), U16(10749), U16(10750), U16(11008), U16(11056), U16(11077), U16(11079), U16(11088), U16(11264), U16(11312), U16(11360), U16(11363), U16(11365), U16(11367), U16(11374), U16(11377), U16(11378), U16(11380), U16(11381), U16(11383), U16(11388), U16(11390), U16(11393), U16(11394), U16(11492), U16(11493), U16(11499), U16(11503), U16(11506), U16(11513), U16(11517), U16(11518), U16(11520), U16(11559), U16(11565), U16(11568), U16(11631), U16(11632), U16(11647), U16(11648), U16(11680), U16(11688), U16(11696), U16(11704), U16(11712), U16(11720), U16(11728), U16(11736), U16(11744), U16(11776), U16(11778), U16(11779), U16(11780), U16(11781), U16(11782), U16(11785), U16(11786), U16(11787), U16(11788), U16(11789), U16(11790), U16(11799), U16(11800), U16(11802), U16(11803), U16(11804), U16(11805), U16(11806), U16(11808), U16(11809), U16(11810), U16(11811), U16(11812), U16(11813), U16(11814), U16(11815), U16(11816), U16(11817), U16(11818), U16(11823), U16(11824), U16(11834), U16(11904), U16(11931), U16(12032), U16(12272), U16(12288), U16(12289), U16(12292), U16(12293), U16(12294), U16(12295), U16(12296), U16(12297), U16(12298), U16(12299), U16(12300), U16(12301), U16(12302), U16(12303), U16(12304), U16(12305), U16(12306), U16(12308), U16(12309), U16(12310), U16(12311), U16(12312), U16(12313), U16(12314), U16(12315), U16(12316), U16(12317), U16(12318), U16(12320), U16(12321), U16(12330), U16(12334), U16(12336), U16(12337), U16(12342), U16(12344), U16(12347), U16(12348), U16(12349), U16(12350), U16(12353), U16(12441), U16(12443), U16(12445), U16(12447), U16(12448), U16(12449), U16(12539), U16(12540), U16(12543), U16(12549), U16(12593), U16(12688), U16(12690), U16(12694), U16(12704), U16(12736), U16(12784), U16(12800), U16(12832), U16(12842), U16(12872), U16(12880), U16(12881), U16(12896), U16(12928), U16(12938), U16(12977), U16(12992), U16(13056), U16(13312), U16(19893), U16(19904), U16(19968), U16(40908), U16(40960), U16(40981), U16(40982), U16(42128), U16(42192), U16(42232), U16(42238), U16(42240), U16(42508), U16(42509), U16(42512), U16(42528), U16(42538), U16(42560), U16(42606), U16(42607), U16(42608), U16(42611), U16(42612), U16(42622), U16(42623), U16(42624), U16(42655), U16(42656), U16(42726), U16(42736), U16(42738), U16(42752), U16(42775), U16(42784), U16(42786), U16(42800), U16(42802), U16(42864), U16(42865), U16(42873), U16(42878), U16(42888), U16(42889), U16(42891), U16(42896), U16(42912), U16(43000), U16(43002), U16(43003), U16(43010), U16(43011), U16(43014), U16(43015), U16(43019), U16(43020), U16(43043), U16(43045), U16(43047), U16(43048), U16(43056), U16(43062), U16(43064), U16(43065), U16(43072), U16(43124), U16(43136), U16(43138), U16(43188), U16(43204), U16(43214), U16(43216), U16(43232), U16(43250), U16(43256), U16(43259), U16(43264), U16(43274), U16(43302), U16(43310), U16(43312), U16(43335), U16(43346), U16(43359), U16(43360), U16(43392), U16(43395), U16(43396), U16(43443), U16(43444), U16(43446), U16(43450), U16(43452), U16(43453), U16(43457), U16(43471), U16(43472), U16(43486), U16(43520), U16(43561), U16(43567), U16(43569), U16(43571), U16(43573), U16(43584), U16(43587), U16(43588), U16(43596), U16(43597), U16(43600), U16(43612), U16(43616), U16(43632), U16(43633), U16(43639), U16(43642), U16(43643), U16(43648), U16(43696), U16(43697), U16(43698), U16(43701), U16(43703), U16(43705), U16(43710), U16(43712), U16(43713), U16(43714), U16(43739), U16(43741), U16(43742), U16(43744), U16(43755), U16(43756), U16(43758), U16(43760), U16(43762), U16(43763), U16(43765), U16(43766), U16(43777), U16(43785), U16(43793), U16(43808), U16(43816), U16(43968), U16(44003), U16(44005), U16(44006), U16(44008), U16(44009), U16(44011), U16(44012), U16(44013), U16(44016), U16(44032), U16(55203), U16(55216), U16(55243), U16(55296), U16(56191), U16(56319), U16(57343), U16(57344), U16(63743), U16(63744), U16(64112), U16(64256), U16(64275), U16(64285), U16(64286), U16(64287), U16(64297), U16(64298), U16(64312), U16(64318), U16(64320), U16(64323), U16(64326), U16(64434), U16(64467), U16(64830), U16(64831), U16(64848), U16(64914), U16(65008), U16(65020), U16(65021), U16(65024), U16(65040), U16(65047), U16(65048), U16(65049), U16(65056), U16(65072), U16(65073), U16(65075), U16(65077), U16(65078), U16(65079), U16(65080), U16(65081), U16(65082), U16(65083), U16(65084), U16(65085), U16(65086), U16(65087), U16(65088), U16(65089), U16(65090), U16(65091), U16(65092), U16(65093), U16(65095), U16(65096), U16(65097), U16(65101), U16(65104), U16(65108), U16(65112), U16(65113), U16(65114), U16(65115), U16(65116), U16(65117), U16(65118), U16(65119), U16(65122), U16(65123), U16(65124), U16(65128), U16(65129), U16(65130), U16(65136), U16(65142), U16(65279), U16(65281), U16(65284), U16(65285), U16(65288), U16(65289), U16(65290), U16(65291), U16(65292), U16(65293), U16(65294), U16(65296), U16(65306), U16(65308), U16(65311), U16(65313), U16(65339), U16(65340), U16(65341), U16(65342), U16(65343), U16(65344), U16(65345), U16(65371), U16(65372), U16(65373), U16(65374), U16(65375), U16(65376), U16(65377), U16(65378), U16(65379), U16(65380), U16(65382), U16(65392), U16(65393), U16(65438), U16(65440), U16(65474), U16(65482), U16(65490), U16(65498), U16(65504), U16(65506), U16(65507), U16(65508), U16(65509), U16(65512), U16(65513), U16(65517), U16(65529), U16(65532), U16(0), U16(13), U16(40), U16(60), U16(63), U16(80), U16(128), U16(256), U16(263), U16(311), U16(320), U16(373), U16(377), U16(394), U16(400), U16(464), U16(509), U16(640), U16(672), U16(768), U16(800), U16(816), U16(833), U16(834), U16(842), U16(896), U16(927), U16(928), U16(968), U16(976), U16(977), U16(1024), U16(1064), U16(1104), U16(1184), U16(2048), U16(2056), U16(2058), U16(2103), U16(2108), U16(2111), U16(2135), U16(2136), U16(2304), U16(2326), U16(2335), U16(2336), U16(2367), U16(2432), U16(2494), U16(2560), U16(2561), U16(2565), U16(2572), U16(2576), U16(2581), U16(2585), U16(2616), U16(2623), U16(2624), U16(2640), U16(2656), U16(2685), U16(2687), U16(2816), U16(2873), U16(2880), U16(2904), U16(2912), U16(2936), U16(3072), U16(3680), U16(4096), U16(4097), U16(4098), U16(4099), U16(4152), U16(4167), U16(4178), U16(4198), U16(4224), U16(4226), U16(4227), U16(4272), U16(4275), U16(4279), U16(4281), U16(4283), U16(4285), U16(4286), U16(4304), U16(4336), U16(4352), U16(4355), U16(4391), U16(4396), U16(4397), U16(4406), U16(4416), U16(4480), U16(4482), U16(4483), U16(4531), U16(4534), U16(4543), U16(4545), U16(4549), U16(4560), U16(5760), U16(5803), U16(5804), U16(5805), U16(5806), U16(5808), U16(5814), U16(5815), U16(5824), U16(8192), U16(9216), U16(9328), U16(12288), U16(26624), U16(28416), U16(28496), U16(28497), U16(28559), U16(28563), U16(45056), U16(53248), U16(53504), U16(53545), U16(53605), U16(53607), U16(53610), U16(53613), U16(53619), U16(53627), U16(53635), U16(53637), U16(53644), U16(53674), U16(53678), U16(53760), U16(53826), U16(53829), U16(54016), U16(54112), U16(54272), U16(54298), U16(54324), U16(54350), U16(54358), U16(54376), U16(54402), U16(54428), U16(54430), U16(54434), U16(54437), U16(54441), U16(54446), U16(54454), U16(54459), U16(54461), U16(54469), U16(54480), U16(54506), U16(54532), U16(54535), U16(54541), U16(54550), U16(54558), U16(54584), U16(54587), U16(54592), U16(54598), U16(54602), U16(54610), U16(54636), U16(54662), U16(54688), U16(54714), U16(54740), U16(54766), U16(54792), U16(54818), U16(54844), U16(54870), U16(54896), U16(54922), U16(54952), U16(54977), U16(54978), U16(55003), U16(55004), U16(55010), U16(55035), U16(55036), U16(55061), U16(55062), U16(55068), U16(55093), U16(55094), U16(55119), U16(55120), U16(55126), U16(55151), U16(55152), U16(55177), U16(55178), U16(55184), U16(55209), U16(55210), U16(55235), U16(55236), U16(55242), U16(55246), U16(60928), U16(60933), U16(60961), U16(60964), U16(60967), U16(60969), U16(60980), U16(60985), U16(60987), U16(60994), U16(60999), U16(61001), U16(61003), U16(61005), U16(61009), U16(61012), U16(61015), U16(61017), U16(61019), U16(61021), U16(61023), U16(61025), U16(61028), U16(61031), U16(61036), U16(61044), U16(61049), U16(61054), U16(61056), U16(61067), U16(61089), U16(61093), U16(61099), U16(61168), U16(61440), U16(61488), U16(61600), U16(61617), U16(61633), U16(61649), U16(61696), U16(61712), U16(61744), U16(61808), U16(61926), U16(61968), U16(62016), U16(62032), U16(62208), U16(62256), U16(62263), U16(62336), U16(62368), U16(62406), U16(62432), U16(62464), U16(62528), U16(62530), U16(62713), U16(62720), U16(62784), U16(62800), U16(62971), U16(63045), U16(63104), U16(63232), U16(0), U16(42710), U16(42752), U16(46900), U16(46912), U16(47133), U16(63488), U16(1), U16(32), U16(256), U16(0), U16(65533), } var aFts5UnicodeData = [1765]U16{ U16(1025), U16(61), U16(117), U16(55), U16(117), U16(54), U16(50), U16(53), U16(57), U16(53), U16(49), U16(85), U16(333), U16(85), U16(121), U16(85), U16(841), U16(54), U16(53), U16(50), U16(56), U16(48), U16(56), U16(837), U16(54), U16(57), U16(50), U16(57), U16(1057), U16(61), U16(53), U16(151), U16(58), U16(53), U16(56), U16(58), U16(39), U16(52), U16(57), U16(34), U16(58), U16(56), U16(58), U16(57), U16(79), U16(56), U16(37), U16(85), U16(56), U16(47), U16(39), U16(51), U16(111), U16(53), U16(745), U16(57), U16(233), U16(773), U16(57), U16(261), U16(1822), U16(37), U16(542), U16(37), U16(1534), U16(222), U16(69), U16(73), U16(37), U16(126), U16(126), U16(73), U16(69), U16(137), U16(37), U16(73), U16(37), U16(105), U16(101), U16(73), U16(37), U16(73), U16(37), U16(190), U16(158), U16(37), U16(126), U16(126), U16(73), U16(37), U16(126), U16(94), U16(37), U16(39), U16(94), U16(69), U16(135), U16(41), U16(40), U16(37), U16(41), U16(40), U16(37), U16(41), U16(40), U16(37), U16(542), U16(37), U16(606), U16(37), U16(41), U16(40), U16(37), U16(126), U16(73), U16(37), U16(1886), U16(197), U16(73), U16(37), U16(73), U16(69), U16(126), U16(105), U16(37), U16(286), U16(2181), U16(39), U16(869), U16(582), U16(152), U16(390), U16(472), U16(166), U16(248), U16(38), U16(56), U16(38), U16(568), U16(3596), U16(158), U16(38), U16(56), U16(94), U16(38), U16(101), U16(53), U16(88), U16(41), U16(53), U16(105), U16(41), U16(73), U16(37), U16(553), U16(297), U16(1125), U16(94), U16(37), U16(105), U16(101), U16(798), U16(133), U16(94), U16(57), U16(126), U16(94), U16(37), U16(1641), U16(1541), U16(1118), U16(58), U16(172), U16(75), U16(1790), U16(478), U16(37), U16(2846), U16(1225), U16(38), U16(213), U16(1253), U16(53), U16(49), U16(55), U16(1452), U16(49), U16(44), U16(53), U16(76), U16(53), U16(76), U16(53), U16(44), U16(871), U16(103), U16(85), U16(162), U16(121), U16(85), U16(55), U16(85), U16(90), U16(364), U16(53), U16(85), U16(1031), U16(38), U16(327), U16(684), U16(333), U16(149), U16(71), U16(44), U16(3175), U16(53), U16(39), U16(236), U16(34), U16(58), U16(204), U16(70), U16(76), U16(58), U16(140), U16(71), U16(333), U16(103), U16(90), U16(39), U16(469), U16(34), U16(39), U16(44), U16(967), U16(876), U16(2855), U16(364), U16(39), U16(333), U16(1063), U16(300), U16(70), U16(58), U16(117), U16(38), U16(711), U16(140), U16(38), U16(300), U16(38), U16(108), U16(38), U16(172), U16(501), U16(807), U16(108), U16(53), U16(39), U16(359), U16(876), U16(108), U16(42), U16(1735), U16(44), U16(42), U16(44), U16(39), U16(106), U16(268), U16(138), U16(44), U16(74), U16(39), U16(236), U16(327), U16(76), U16(85), U16(333), U16(53), U16(38), U16(199), U16(231), U16(44), U16(74), U16(263), U16(71), U16(711), U16(231), U16(39), U16(135), U16(44), U16(39), U16(106), U16(140), U16(74), U16(74), U16(44), U16(39), U16(42), U16(71), U16(103), U16(76), U16(333), U16(71), U16(87), U16(207), U16(58), U16(55), U16(76), U16(42), U16(199), U16(71), U16(711), U16(231), U16(71), U16(71), U16(71), U16(44), U16(106), U16(76), U16(76), U16(108), U16(44), U16(135), U16(39), U16(333), U16(76), U16(103), U16(44), U16(76), U16(42), U16(295), U16(103), U16(711), U16(231), U16(71), U16(167), U16(44), U16(39), U16(106), U16(172), U16(76), U16(42), U16(74), U16(44), U16(39), U16(71), U16(76), U16(333), U16(53), U16(55), U16(44), U16(74), U16(263), U16(71), U16(711), U16(231), U16(71), U16(167), U16(44), U16(39), U16(42), U16(44), U16(42), U16(140), U16(74), U16(74), U16(44), U16(44), U16(42), U16(71), U16(103), U16(76), U16(333), U16(58), U16(39), U16(207), U16(44), U16(39), U16(199), U16(103), U16(135), U16(71), U16(39), U16(71), U16(71), U16(103), U16(391), U16(74), U16(44), U16(74), U16(106), U16(106), U16(44), U16(39), U16(42), U16(333), U16(111), U16(218), U16(55), U16(58), U16(106), U16(263), U16(103), U16(743), U16(327), U16(167), U16(39), U16(108), U16(138), U16(108), U16(140), U16(76), U16(71), U16(71), U16(76), U16(333), U16(239), U16(58), U16(74), U16(263), U16(103), U16(743), U16(327), U16(167), U16(44), U16(39), U16(42), U16(44), U16(170), U16(44), U16(74), U16(74), U16(76), U16(74), U16(39), U16(71), U16(76), U16(333), U16(71), U16(74), U16(263), U16(103), U16(1319), U16(39), U16(106), U16(140), U16(106), U16(106), U16(44), U16(39), U16(42), U16(71), U16(76), U16(333), U16(207), U16(58), U16(199), U16(74), U16(583), U16(775), U16(295), U16(39), U16(231), U16(44), U16(106), U16(108), U16(44), U16(266), U16(74), U16(53), U16(1543), U16(44), U16(71), U16(236), U16(55), U16(199), U16(38), U16(268), U16(53), U16(333), U16(85), U16(71), U16(39), U16(71), U16(39), U16(39), U16(135), U16(231), U16(103), U16(39), U16(39), U16(71), U16(135), U16(44), U16(71), U16(204), U16(76), U16(39), U16(167), U16(38), U16(204), U16(333), U16(135), U16(39), U16(122), U16(501), U16(58), U16(53), U16(122), U16(76), U16(218), U16(333), U16(335), U16(58), U16(44), U16(58), U16(44), U16(58), U16(44), U16(54), U16(50), U16(54), U16(50), U16(74), U16(263), U16(1159), U16(460), U16(42), U16(172), U16(53), U16(76), U16(167), U16(364), U16(1164), U16(282), U16(44), U16(218), U16(90), U16(181), U16(154), U16(85), U16(1383), U16(74), U16(140), U16(42), U16(204), U16(42), U16(76), U16(74), U16(76), U16(39), U16(333), U16(213), U16(199), U16(74), U16(76), U16(135), U16(108), U16(39), U16(106), U16(71), U16(234), U16(103), U16(140), U16(423), U16(44), U16(74), U16(76), U16(202), U16(44), U16(39), U16(42), U16(333), U16(106), U16(44), U16(90), U16(1225), U16(41), U16(41), U16(1383), U16(53), U16(38), U16(10631), U16(135), U16(231), U16(39), U16(135), U16(1319), U16(135), U16(1063), U16(135), U16(231), U16(39), U16(135), U16(487), U16(1831), U16(135), U16(2151), U16(108), U16(309), U16(655), U16(519), U16(346), U16(2727), U16(49), U16(19847), U16(85), U16(551), U16(61), U16(839), U16(54), U16(50), U16(2407), U16(117), U16(110), U16(423), U16(135), U16(108), U16(583), U16(108), U16(85), U16(583), U16(76), U16(423), U16(103), U16(76), U16(1671), U16(76), U16(42), U16(236), U16(266), U16(44), U16(74), U16(364), U16(117), U16(38), U16(117), U16(55), U16(39), U16(44), U16(333), U16(335), U16(213), U16(49), U16(149), U16(108), U16(61), U16(333), U16(1127), U16(38), U16(1671), U16(1319), U16(44), U16(39), U16(2247), U16(935), U16(108), U16(138), U16(76), U16(106), U16(74), U16(44), U16(202), U16(108), U16(58), U16(85), U16(333), U16(967), U16(167), U16(1415), U16(554), U16(231), U16(74), U16(333), U16(47), U16(1114), U16(743), U16(76), U16(106), U16(85), U16(1703), U16(42), U16(44), U16(42), U16(236), U16(44), U16(42), U16(44), U16(74), U16(268), U16(202), U16(332), U16(44), U16(333), U16(333), U16(245), U16(38), U16(213), U16(140), U16(42), U16(1511), U16(44), U16(42), U16(172), U16(42), U16(44), U16(170), U16(44), U16(74), U16(231), U16(333), U16(245), U16(346), U16(300), U16(314), U16(76), U16(42), U16(967), U16(42), U16(140), U16(74), U16(76), U16(42), U16(44), U16(74), U16(71), U16(333), U16(1415), U16(44), U16(42), U16(76), U16(106), U16(44), U16(42), U16(108), U16(74), U16(149), U16(1159), U16(266), U16(268), U16(74), U16(76), U16(181), U16(333), U16(103), U16(333), U16(967), U16(198), U16(85), U16(277), U16(108), U16(53), U16(428), U16(42), U16(236), U16(135), U16(44), U16(135), U16(74), U16(44), U16(71), U16(1413), U16(2022), U16(421), U16(38), U16(1093), U16(1190), U16(1260), U16(140), U16(4830), U16(261), U16(3166), U16(261), U16(265), U16(197), U16(201), U16(261), U16(265), U16(261), U16(265), U16(197), U16(201), U16(261), U16(41), U16(41), U16(41), U16(94), U16(229), U16(265), U16(453), U16(261), U16(264), U16(261), U16(264), U16(261), U16(264), U16(165), U16(69), U16(137), U16(40), U16(56), U16(37), U16(120), U16(101), U16(69), U16(137), U16(40), U16(120), U16(133), U16(69), U16(137), U16(120), U16(261), U16(169), U16(120), U16(101), U16(69), U16(137), U16(40), U16(88), U16(381), U16(162), U16(209), U16(85), U16(52), U16(51), U16(54), U16(84), U16(51), U16(54), U16(52), U16(277), U16(59), U16(60), U16(162), U16(61), U16(309), U16(52), U16(51), U16(149), U16(80), U16(117), U16(57), U16(54), U16(50), U16(373), U16(57), U16(53), U16(48), U16(341), U16(61), U16(162), U16(194), U16(47), U16(38), U16(207), U16(121), U16(54), U16(50), U16(38), U16(335), U16(121), U16(54), U16(50), U16(422), U16(855), U16(428), U16(139), U16(44), U16(107), U16(396), U16(90), U16(41), U16(154), U16(41), U16(90), U16(37), U16(105), U16(69), U16(105), U16(37), U16(58), U16(41), U16(90), U16(57), U16(169), U16(218), U16(41), U16(58), U16(41), U16(58), U16(41), U16(58), U16(137), U16(58), U16(37), U16(137), U16(37), U16(135), U16(37), U16(90), U16(69), U16(73), U16(185), U16(94), U16(101), U16(58), U16(57), U16(90), U16(37), U16(58), U16(527), U16(1134), U16(94), U16(142), U16(47), U16(185), U16(186), U16(89), U16(154), U16(57), U16(90), U16(57), U16(90), U16(57), U16(250), U16(57), U16(1018), U16(89), U16(90), U16(57), U16(58), U16(57), U16(1018), U16(8601), U16(282), U16(153), U16(666), U16(89), U16(250), U16(54), U16(50), U16(2618), U16(57), U16(986), U16(825), U16(1306), U16(217), U16(602), U16(1274), U16(378), U16(1935), U16(2522), U16(719), U16(5882), U16(57), U16(314), U16(57), U16(1754), U16(281), U16(3578), U16(57), U16(4634), U16(3322), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(975), U16(1434), U16(185), U16(54), U16(50), U16(1017), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(537), U16(8218), U16(4217), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(2041), U16(54), U16(50), U16(54), U16(50), U16(1049), U16(54), U16(50), U16(8281), U16(1562), U16(697), U16(90), U16(217), U16(346), U16(1513), U16(1509), U16(126), U16(73), U16(69), U16(254), U16(105), U16(37), U16(94), U16(37), U16(94), U16(165), U16(70), U16(105), U16(37), U16(3166), U16(37), U16(218), U16(158), U16(108), U16(94), U16(149), U16(47), U16(85), U16(1221), U16(37), U16(37), U16(1799), U16(38), U16(53), U16(44), U16(743), U16(231), U16(231), U16(231), U16(231), U16(231), U16(231), U16(231), U16(231), U16(1036), U16(85), U16(52), U16(51), U16(52), U16(51), U16(117), U16(52), U16(51), U16(53), U16(52), U16(51), U16(309), U16(49), U16(85), U16(49), U16(53), U16(52), U16(51), U16(85), U16(52), U16(51), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(181), U16(38), U16(341), U16(81), U16(858), U16(2874), U16(6874), U16(410), U16(61), U16(117), U16(58), U16(38), U16(39), U16(46), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(90), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(49), U16(54), U16(82), U16(58), U16(302), U16(140), U16(74), U16(49), U16(166), U16(90), U16(110), U16(38), U16(39), U16(53), U16(90), U16(2759), U16(76), U16(88), U16(70), U16(39), U16(49), U16(2887), U16(53), U16(102), U16(39), U16(1319), U16(3015), U16(90), U16(143), U16(346), U16(871), U16(1178), U16(519), U16(1018), U16(335), U16(986), U16(271), U16(58), U16(495), U16(1050), U16(335), U16(1274), U16(495), U16(2042), U16(8218), U16(39), U16(39), U16(2074), U16(39), U16(39), U16(679), U16(38), U16(36583), U16(1786), U16(1287), U16(198), U16(85), U16(8583), U16(38), U16(117), U16(519), U16(333), U16(71), U16(1502), U16(39), U16(44), U16(107), U16(53), U16(332), U16(53), U16(38), U16(798), U16(44), U16(2247), U16(334), U16(76), U16(213), U16(760), U16(294), U16(88), U16(478), U16(69), U16(2014), U16(38), U16(261), U16(190), U16(350), U16(38), U16(88), U16(158), U16(158), U16(382), U16(70), U16(37), U16(231), U16(44), U16(103), U16(44), U16(135), U16(44), U16(743), U16(74), U16(76), U16(42), U16(154), U16(207), U16(90), U16(55), U16(58), U16(1671), U16(149), U16(74), U16(1607), U16(522), U16(44), U16(85), U16(333), U16(588), U16(199), U16(117), U16(39), U16(333), U16(903), U16(268), U16(85), U16(743), U16(364), U16(74), U16(53), U16(935), U16(108), U16(42), U16(1511), U16(44), U16(74), U16(140), U16(74), U16(44), U16(138), U16(437), U16(38), U16(333), U16(85), U16(1319), U16(204), U16(74), U16(76), U16(74), U16(76), U16(103), U16(44), U16(263), U16(44), U16(42), U16(333), U16(149), U16(519), U16(38), U16(199), U16(122), U16(39), U16(42), U16(1543), U16(44), U16(39), U16(108), U16(71), U16(76), U16(167), U16(76), U16(39), U16(44), U16(39), U16(71), U16(38), U16(85), U16(359), U16(42), U16(76), U16(74), U16(85), U16(39), U16(70), U16(42), U16(44), U16(199), U16(199), U16(199), U16(231), U16(231), U16(1127), U16(74), U16(44), U16(74), U16(44), U16(74), U16(53), U16(42), U16(44), U16(333), U16(39), U16(39), U16(743), U16(1575), U16(36), U16(68), U16(68), U16(36), U16(63), U16(63), U16(11719), U16(3399), U16(229), U16(165), U16(39), U16(44), U16(327), U16(57), U16(423), U16(167), U16(39), U16(71), U16(71), U16(3463), U16(536), U16(11623), U16(54), U16(50), U16(2055), U16(1735), U16(391), U16(55), U16(58), U16(524), U16(245), U16(54), U16(50), U16(53), U16(236), U16(53), U16(81), U16(80), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(85), U16(54), U16(50), U16(149), U16(112), U16(117), U16(149), U16(49), U16(54), U16(50), U16(54), U16(50), U16(54), U16(50), U16(117), U16(57), U16(49), U16(121), U16(53), U16(55), U16(85), U16(167), U16(4327), U16(34), U16(117), U16(55), U16(117), U16(54), U16(50), U16(53), U16(57), U16(53), U16(49), U16(85), U16(333), U16(85), U16(121), U16(85), U16(841), U16(54), U16(53), U16(50), U16(56), U16(48), U16(56), U16(837), U16(54), U16(57), U16(50), U16(57), U16(54), U16(50), U16(53), U16(54), U16(50), U16(85), U16(327), U16(38), U16(1447), U16(70), U16(999), U16(199), U16(199), U16(199), U16(103), U16(87), U16(57), U16(56), U16(58), U16(87), U16(58), U16(153), U16(90), U16(98), U16(90), U16(391), U16(839), U16(615), U16(71), U16(487), U16(455), U16(3943), U16(117), U16(1455), U16(314), U16(1710), U16(143), U16(570), U16(47), U16(410), U16(1466), U16(44), U16(935), U16(1575), U16(999), U16(143), U16(551), U16(46), U16(263), U16(46), U16(967), U16(53), U16(1159), U16(263), U16(53), U16(174), U16(1289), U16(1285), U16(2503), U16(333), U16(199), U16(39), U16(1415), U16(71), U16(39), U16(743), U16(53), U16(271), U16(711), U16(207), U16(53), U16(839), U16(53), U16(1799), U16(71), U16(39), U16(108), U16(76), U16(140), U16(135), U16(103), U16(871), U16(108), U16(44), U16(271), U16(309), U16(935), U16(79), U16(53), U16(1735), U16(245), U16(711), U16(271), U16(615), U16(271), U16(2343), U16(1007), U16(42), U16(44), U16(42), U16(1703), U16(492), U16(245), U16(655), U16(333), U16(76), U16(42), U16(1447), U16(106), U16(140), U16(74), U16(76), U16(85), U16(34), U16(149), U16(807), U16(333), U16(108), U16(1159), U16(172), U16(42), U16(268), U16(333), U16(149), U16(76), U16(42), U16(1543), U16(106), U16(300), U16(74), U16(135), U16(149), U16(333), U16(1383), U16(44), U16(42), U16(44), U16(74), U16(204), U16(42), U16(44), U16(333), U16(28135), U16(3182), U16(149), U16(34279), U16(18215), U16(2215), U16(39), U16(1482), U16(140), U16(422), U16(71), U16(7898), U16(1274), U16(1946), U16(74), U16(108), U16(122), U16(202), U16(258), U16(268), U16(90), U16(236), U16(986), U16(140), U16(1562), U16(2138), U16(108), U16(58), U16(2810), U16(591), U16(841), U16(837), U16(841), U16(229), U16(581), U16(841), U16(837), U16(41), U16(73), U16(41), U16(73), U16(137), U16(265), U16(133), U16(37), U16(229), U16(357), U16(841), U16(837), U16(73), U16(137), U16(265), U16(233), U16(837), U16(73), U16(137), U16(169), U16(41), U16(233), U16(837), U16(841), U16(837), U16(841), U16(837), U16(841), U16(837), U16(841), U16(837), U16(841), U16(837), U16(841), U16(901), U16(809), U16(57), U16(805), U16(57), U16(197), U16(809), U16(57), U16(805), U16(57), U16(197), U16(809), U16(57), U16(805), U16(57), U16(197), U16(809), U16(57), U16(805), U16(57), U16(197), U16(809), U16(57), U16(805), U16(57), U16(197), U16(94), U16(1613), U16(135), U16(871), U16(71), U16(39), U16(39), U16(327), U16(135), U16(39), U16(39), U16(39), U16(39), U16(39), U16(39), U16(103), U16(71), U16(39), U16(39), U16(39), U16(39), U16(39), U16(39), U16(71), U16(39), U16(135), U16(231), U16(135), U16(135), U16(39), U16(327), U16(551), U16(103), U16(167), U16(551), U16(89), U16(1434), U16(3226), U16(506), U16(474), U16(506), U16(506), U16(367), U16(1018), U16(1946), U16(1402), U16(954), U16(1402), U16(314), U16(90), U16(1082), U16(218), U16(2266), U16(666), U16(1210), U16(186), U16(570), U16(2042), U16(58), U16(5850), U16(154), U16(2010), U16(154), U16(794), U16(2266), U16(378), U16(2266), U16(3738), U16(39), U16(39), U16(39), U16(39), U16(39), U16(39), U16(17351), U16(34), U16(3074), U16(7692), U16(63), U16(63), } func sqlite3Fts5UnicodeCategory(tls *libc.TLS, iCode U32) int32 { var iRes int32 = -1 var iHi int32 var iLo int32 var ret int32 var iKey U16 if iCode >= U32(int32(1)<<20) { return 0 } iLo = int32(aFts5UnicodeBlock[iCode>>16]) iHi = int32(aFts5UnicodeBlock[U32(1)+iCode>>16]) iKey = U16(iCode & U32(0xFFFF)) for iHi > iLo { var iTest int32 = (iHi + iLo) / 2 if int32(iKey) >= int32(aFts5UnicodeMap[iTest]) { iRes = iTest iLo = iTest + 1 } else { iHi = iTest } } if iRes < 0 { return 0 } if int32(iKey) >= int32(aFts5UnicodeMap[iRes])+int32(aFts5UnicodeData[iRes])>>5 { return 0 } ret = int32(aFts5UnicodeData[iRes]) & 0x1F if ret != 30 { return ret } if (int32(iKey)-int32(aFts5UnicodeMap[iRes]))&0x01 != 0 { return 5 } return 9 } func sqlite3Fts5UnicodeAscii(tls *libc.TLS, aArray uintptr, aAscii uintptr) { var i int32 = 0 var iTbl int32 = 0 for i < 128 { var bToken int32 = int32(*(*U8)(unsafe.Pointer(aArray + uintptr(int32(aFts5UnicodeData[iTbl])&0x1F)))) var n int32 = int32(aFts5UnicodeData[iTbl])>>5 + i for ; i < 128 && i < n; i++ { *(*U8)(unsafe.Pointer(aAscii + uintptr(i))) = U8(bToken) } iTbl++ } *(*U8)(unsafe.Pointer(aAscii)) = U8(0) } func sqlite3Fts5GetVarint32(tls *libc.TLS, p uintptr, v uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) var a U32 var b U32 a = U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { *(*U32)(unsafe.Pointer(v)) = a return 1 } p++ b = U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { a = a & U32(0x7f) a = a << 7 *(*U32)(unsafe.Pointer(v)) = a | b return 2 } p++ a = a << 14 a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { a = a & U32(int32(0x7f)<<14|0x7f) b = b & U32(0x7f) b = b << 7 *(*U32)(unsafe.Pointer(v)) = a | b return 3 } { var n U8 p -= uintptr(2) n = sqlite3Fts5GetVarint(tls, p, bp) *(*U32)(unsafe.Pointer(v)) = U32(*(*U64)(unsafe.Pointer(bp))) & U32(0x7FFFFFFF) return int32(n) } return int32(0) } func sqlite3Fts5GetVarint(tls *libc.TLS, p uintptr, v uintptr) U8 { var a U32 var b U32 var s U32 a = U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { *(*U64)(unsafe.Pointer(v)) = U64(a) return U8(1) } p++ b = U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { a = a & U32(0x7f) a = a << 7 a = a | b *(*U64)(unsafe.Pointer(v)) = U64(a) return U8(2) } p++ a = a << 14 a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { a = a & U32(SLOT_2_0) b = b & U32(0x7f) b = b << 7 a = a | b *(*U64)(unsafe.Pointer(v)) = U64(a) return U8(3) } a = a & U32(SLOT_2_0) p++ b = b << 14 b = b | U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { b = b & U32(SLOT_2_0) a = a << 7 a = a | b *(*U64)(unsafe.Pointer(v)) = U64(a) return U8(4) } b = b & U32(SLOT_2_0) s = a p++ a = a << 14 a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { b = b << 7 a = a | b s = s >> 18 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(5) } s = s << 7 s = s | b p++ b = b << 14 b = b | U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { a = a & U32(SLOT_2_0) a = a << 7 a = a | b s = s >> 18 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(6) } p++ a = a << 14 a = a | U32(*(*uint8)(unsafe.Pointer(p))) if !(a&U32(0x80) != 0) { a = a & SLOT_4_2_0 b = b & U32(SLOT_2_0) b = b << 7 a = a | b s = s >> 11 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(7) } a = a & U32(SLOT_2_0) p++ b = b << 14 b = b | U32(*(*uint8)(unsafe.Pointer(p))) if !(b&U32(0x80) != 0) { b = b & SLOT_4_2_0 a = a << 7 a = a | b s = s >> 4 *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(8) } p++ a = a << 15 a = a | U32(*(*uint8)(unsafe.Pointer(p))) b = b & U32(SLOT_2_0) b = b << 8 a = a | b s = s << 4 b = U32(*(*uint8)(unsafe.Pointer(p + libc.UintptrFromInt32(-4)))) b = b & U32(0x7f) b = b >> 3 s = s | b *(*U64)(unsafe.Pointer(v)) = U64(s)<<32 | U64(a) return U8(9) } func fts5PutVarint64(tls *libc.TLS, p uintptr, v U64) int32 { bp := tls.Alloc(10) defer tls.Free(10) var i int32 var j int32 var n int32 if v&(uint64(0xff000000)<<32) != 0 { *(*uint8)(unsafe.Pointer(p + 8)) = U8(v) v >>= 8 for i = 7; i >= 0; i-- { *(*uint8)(unsafe.Pointer(p + uintptr(i))) = U8(v&uint64(0x7f) | uint64(0x80)) v >>= 7 } return 9 } n = 0 for __ccgo := true; __ccgo; __ccgo = v != uint64(0) { *(*U8)(unsafe.Pointer(bp + uintptr(libc.PostIncInt32(&n, 1)))) = U8(v&uint64(0x7f) | uint64(0x80)) v >>= 7 } *(*U8)(unsafe.Pointer(bp)) &= U8(0x7f) i = 0 j = n - 1 __1: if !(j >= 0) { goto __3 } { *(*uint8)(unsafe.Pointer(p + uintptr(i))) = *(*U8)(unsafe.Pointer(bp + uintptr(j))) } goto __2 __2: j-- i++ goto __1 goto __3 __3: ; return n } func sqlite3Fts5PutVarint(tls *libc.TLS, p uintptr, v U64) int32 { if v <= uint64(0x7f) { *(*uint8)(unsafe.Pointer(p)) = uint8(v & uint64(0x7f)) return 1 } if v <= uint64(0x3fff) { *(*uint8)(unsafe.Pointer(p)) = uint8(v>>7&uint64(0x7f) | uint64(0x80)) *(*uint8)(unsafe.Pointer(p + 1)) = uint8(v & uint64(0x7f)) return 2 } return fts5PutVarint64(tls, p, v) } func sqlite3Fts5GetVarintLen(tls *libc.TLS, iVal U32) int32 { if iVal < U32(int32(1)<<14) { return 2 } if iVal < U32(int32(1)<<21) { return 3 } if iVal < U32(int32(1)<<28) { return 4 } return 5 } type Fts5VocabTable1 = struct { Fbase Sqlite3_vtab FzFts5Tbl uintptr FzFts5Db uintptr Fdb uintptr FpGlobal uintptr FeType int32 FbBusy uint32 } type Fts5VocabTable = Fts5VocabTable1 type Fts5VocabCursor1 = struct { Fbase Sqlite3_vtab_cursor FpStmt uintptr FpFts5 uintptr FbEof int32 F__ccgo_pad1 [4]byte FpIter uintptr FpStruct uintptr FnLeTerm int32 F__ccgo_pad2 [4]byte FzLeTerm uintptr FiCol int32 F__ccgo_pad3 [4]byte FaCnt uintptr FaDoc uintptr Frowid I64 Fterm Fts5Buffer FiInstPos I64 FiInstOff int32 F__ccgo_pad4 [4]byte } type Fts5VocabCursor = Fts5VocabCursor1 func fts5VocabTableType(tls *libc.TLS, zType uintptr, pzErr uintptr, peType uintptr) int32 { bp := tls.Alloc(12) defer tls.Free(12) *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_OK var zCopy uintptr = sqlite3Fts5Strndup(tls, bp+8, zType, -1) if *(*int32)(unsafe.Pointer(bp + 8)) == SQLITE_OK { sqlite3Fts5Dequote(tls, zCopy) if Xsqlite3_stricmp(tls, zCopy, ts+38751) == 0 { *(*int32)(unsafe.Pointer(peType)) = FTS5_VOCAB_COL } else if Xsqlite3_stricmp(tls, zCopy, ts+38755) == 0 { *(*int32)(unsafe.Pointer(peType)) = FTS5_VOCAB_ROW } else if Xsqlite3_stricmp(tls, zCopy, ts+38759) == 0 { *(*int32)(unsafe.Pointer(peType)) = FTS5_VOCAB_INSTANCE } else { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+38768, libc.VaList(bp, zCopy)) *(*int32)(unsafe.Pointer(bp + 8)) = SQLITE_ERROR } Xsqlite3_free(tls, zCopy) } return *(*int32)(unsafe.Pointer(bp + 8)) } func fts5VocabDisconnectMethod(tls *libc.TLS, pVtab uintptr) int32 { var pTab uintptr = pVtab Xsqlite3_free(tls, pTab) return SQLITE_OK } func fts5VocabDestroyMethod(tls *libc.TLS, pVtab uintptr) int32 { var pTab uintptr = pVtab Xsqlite3_free(tls, pTab) return SQLITE_OK } func fts5VocabInitVtab(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVTab uintptr, pzErr uintptr) int32 { bp := tls.Alloc(36) defer tls.Free(36) *(*[3]uintptr)(unsafe.Pointer(bp + 8)) = [3]uintptr{ ts + 38802, ts + 38842, ts + 38877, } var pRet uintptr = uintptr(0) *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_OK var bDb int32 bDb = libc.Bool32(argc == 6 && libc.Xstrlen(tls, *(*uintptr)(unsafe.Pointer(argv + 1*8))) == uint64(4) && libc.Xmemcmp(tls, ts+24768, *(*uintptr)(unsafe.Pointer(argv + 1*8)), uint64(4)) == 0) if argc != 5 && bDb == 0 { *(*uintptr)(unsafe.Pointer(pzErr)) = Xsqlite3_mprintf(tls, ts+38920, 0) *(*int32)(unsafe.Pointer(bp + 32)) = SQLITE_ERROR } else { var nByte int32 var zDb uintptr if bDb != 0 { zDb = *(*uintptr)(unsafe.Pointer(argv + 3*8)) } else { zDb = *(*uintptr)(unsafe.Pointer(argv + 1*8)) } var zTab uintptr if bDb != 0 { zTab = *(*uintptr)(unsafe.Pointer(argv + 4*8)) } else { zTab = *(*uintptr)(unsafe.Pointer(argv + 3*8)) } var zType uintptr if bDb != 0 { zType = *(*uintptr)(unsafe.Pointer(argv + 5*8)) } else { zType = *(*uintptr)(unsafe.Pointer(argv + 4*8)) } var nDb int32 = int32(libc.Xstrlen(tls, zDb)) + 1 var nTab int32 = int32(libc.Xstrlen(tls, zTab)) + 1 *(*int32)(unsafe.Pointer(bp)) = 0 *(*int32)(unsafe.Pointer(bp + 32)) = fts5VocabTableType(tls, zType, pzErr, bp) if *(*int32)(unsafe.Pointer(bp + 32)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 32)) = Xsqlite3_declare_vtab(tls, db, *(*uintptr)(unsafe.Pointer(bp + 8 + uintptr(*(*int32)(unsafe.Pointer(bp)))*8))) } nByte = int32(uint64(unsafe.Sizeof(Fts5VocabTable{})) + uint64(nDb) + uint64(nTab)) pRet = sqlite3Fts5MallocZero(tls, bp+32, int64(nByte)) if pRet != 0 { (*Fts5VocabTable)(unsafe.Pointer(pRet)).FpGlobal = pAux (*Fts5VocabTable)(unsafe.Pointer(pRet)).FeType = *(*int32)(unsafe.Pointer(bp)) (*Fts5VocabTable)(unsafe.Pointer(pRet)).Fdb = db (*Fts5VocabTable)(unsafe.Pointer(pRet)).FzFts5Tbl = pRet + 1*64 (*Fts5VocabTable)(unsafe.Pointer(pRet)).FzFts5Db = (*Fts5VocabTable)(unsafe.Pointer(pRet)).FzFts5Tbl + uintptr(nTab) libc.Xmemcpy(tls, (*Fts5VocabTable)(unsafe.Pointer(pRet)).FzFts5Tbl, zTab, uint64(nTab)) libc.Xmemcpy(tls, (*Fts5VocabTable)(unsafe.Pointer(pRet)).FzFts5Db, zDb, uint64(nDb)) sqlite3Fts5Dequote(tls, (*Fts5VocabTable)(unsafe.Pointer(pRet)).FzFts5Tbl) sqlite3Fts5Dequote(tls, (*Fts5VocabTable)(unsafe.Pointer(pRet)).FzFts5Db) } } *(*uintptr)(unsafe.Pointer(ppVTab)) = pRet return *(*int32)(unsafe.Pointer(bp + 32)) } func fts5VocabConnectMethod(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return fts5VocabInitVtab(tls, db, pAux, argc, argv, ppVtab, pzErr) } func fts5VocabCreateMethod(tls *libc.TLS, db uintptr, pAux uintptr, argc int32, argv uintptr, ppVtab uintptr, pzErr uintptr) int32 { return fts5VocabInitVtab(tls, db, pAux, argc, argv, ppVtab, pzErr) } func fts5VocabBestIndexMethod(tls *libc.TLS, pUnused uintptr, pInfo uintptr) int32 { var i int32 var iTermEq int32 = -1 var iTermGe int32 = -1 var iTermLe int32 = -1 var idxNum int32 = 0 var nArg int32 = 0 _ = pUnused for i = 0; i < (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FnConstraint; i++ { var p uintptr = (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraint + uintptr(i)*12 if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fusable) == 0 { continue } if (*sqlite3_index_constraint)(unsafe.Pointer(p)).FiColumn == 0 { if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_EQ { iTermEq = i } if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_LE { iTermLe = i } if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_LT { iTermLe = i } if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_GE { iTermGe = i } if int32((*sqlite3_index_constraint)(unsafe.Pointer(p)).Fop) == SQLITE_INDEX_CONSTRAINT_GT { iTermGe = i } } } if iTermEq >= 0 { idxNum = idxNum | FTS5_VOCAB_TERM_EQ (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(iTermEq)*8)).FargvIndex = libc.PreIncInt32(&nArg, 1) (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = float64(100) } else { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = float64(1000000) if iTermGe >= 0 { idxNum = idxNum | FTS5_VOCAB_TERM_GE (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(iTermGe)*8)).FargvIndex = libc.PreIncInt32(&nArg, 1) (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost / float64(2) } if iTermLe >= 0 { idxNum = idxNum | FTS5_VOCAB_TERM_LE (*sqlite3_index_constraint_usage)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaConstraintUsage + uintptr(iTermLe)*8)).FargvIndex = libc.PreIncInt32(&nArg, 1) (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost = (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FestimatedCost / float64(2) } } if (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FnOrderBy == 1 && (*sqlite3_index_orderby)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaOrderBy)).FiColumn == 0 && int32((*sqlite3_index_orderby)(unsafe.Pointer((*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FaOrderBy)).Fdesc) == 0 { (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).ForderByConsumed = 1 } (*Sqlite3_index_info)(unsafe.Pointer(pInfo)).FidxNum = idxNum return SQLITE_OK } func fts5VocabOpenMethod(tls *libc.TLS, pVTab uintptr, ppCsr uintptr) int32 { bp := tls.Alloc(80) defer tls.Free(80) var pTab uintptr = pVTab var pFts5 uintptr = uintptr(0) var pCsr uintptr = uintptr(0) *(*int32)(unsafe.Pointer(bp + 64)) = SQLITE_OK *(*uintptr)(unsafe.Pointer(bp + 72)) = uintptr(0) var zSql uintptr = uintptr(0) if (*Fts5VocabTable)(unsafe.Pointer(pTab)).FbBusy != 0 { (*Sqlite3_vtab)(unsafe.Pointer(pVTab)).FzErrMsg = Xsqlite3_mprintf(tls, ts+38953, libc.VaList(bp, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Db, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Tbl)) return SQLITE_ERROR } zSql = sqlite3Fts5Mprintf(tls, bp+64, ts+38984, libc.VaList(bp+16, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Tbl, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Db, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Tbl, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Tbl)) if zSql != 0 { *(*int32)(unsafe.Pointer(bp + 64)) = Xsqlite3_prepare_v2(tls, (*Fts5VocabTable)(unsafe.Pointer(pTab)).Fdb, zSql, -1, bp+72, uintptr(0)) } Xsqlite3_free(tls, zSql) if *(*int32)(unsafe.Pointer(bp + 64)) == SQLITE_ERROR { *(*int32)(unsafe.Pointer(bp + 64)) = SQLITE_OK } (*Fts5VocabTable)(unsafe.Pointer(pTab)).FbBusy = uint32(1) if *(*uintptr)(unsafe.Pointer(bp + 72)) != 0 && Xsqlite3_step(tls, *(*uintptr)(unsafe.Pointer(bp + 72))) == SQLITE_ROW { var iId I64 = Xsqlite3_column_int64(tls, *(*uintptr)(unsafe.Pointer(bp + 72)), 0) pFts5 = sqlite3Fts5TableFromCsrid(tls, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FpGlobal, iId) } (*Fts5VocabTable)(unsafe.Pointer(pTab)).FbBusy = uint32(0) if *(*int32)(unsafe.Pointer(bp + 64)) == SQLITE_OK { if pFts5 == uintptr(0) { *(*int32)(unsafe.Pointer(bp + 64)) = Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 72))) *(*uintptr)(unsafe.Pointer(bp + 72)) = uintptr(0) if *(*int32)(unsafe.Pointer(bp + 64)) == SQLITE_OK { (*Sqlite3_vtab)(unsafe.Pointer(pVTab)).FzErrMsg = Xsqlite3_mprintf(tls, ts+39035, libc.VaList(bp+48, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Db, (*Fts5VocabTable)(unsafe.Pointer(pTab)).FzFts5Tbl)) *(*int32)(unsafe.Pointer(bp + 64)) = SQLITE_ERROR } } else { *(*int32)(unsafe.Pointer(bp + 64)) = sqlite3Fts5FlushToDisk(tls, pFts5) } } if *(*int32)(unsafe.Pointer(bp + 64)) == SQLITE_OK { var nByte I64 = I64(uint64((*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer(pFts5)).FpConfig)).FnCol)*uint64(unsafe.Sizeof(I64(0)))*uint64(2) + uint64(unsafe.Sizeof(Fts5VocabCursor{}))) pCsr = sqlite3Fts5MallocZero(tls, bp+64, nByte) } if pCsr != 0 { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5 = pFts5 (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpStmt = *(*uintptr)(unsafe.Pointer(bp + 72)) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaCnt = pCsr + 1*128 (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc = (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaCnt + uintptr((*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer(pFts5)).FpConfig)).FnCol)*8 } else { Xsqlite3_finalize(tls, *(*uintptr)(unsafe.Pointer(bp + 72))) } *(*uintptr)(unsafe.Pointer(ppCsr)) = pCsr return *(*int32)(unsafe.Pointer(bp + 64)) } func fts5VocabResetCursor(tls *libc.TLS, pCsr uintptr) { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).Frowid = int64(0) sqlite3Fts5IterClose(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter) sqlite3Fts5StructureRelease(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpStruct) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpStruct = uintptr(0) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter = uintptr(0) Xsqlite3_free(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FzLeTerm) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm = -1 (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FzLeTerm = uintptr(0) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof = 0 } func fts5VocabCloseMethod(tls *libc.TLS, pCursor uintptr) int32 { var pCsr uintptr = pCursor fts5VocabResetCursor(tls, pCsr) sqlite3Fts5BufferFree(tls, pCsr+96) Xsqlite3_finalize(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpStmt) Xsqlite3_free(tls, pCsr) return SQLITE_OK } func fts5VocabInstanceNewTerm(tls *libc.TLS, pCsr uintptr) int32 { bp := tls.Alloc(8) defer tls.Free(8) *(*int32)(unsafe.Pointer(bp + 4)) = SQLITE_OK if (*Fts5IndexIter)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter)).FbEof != 0 { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof = 1 } else { var zTerm uintptr zTerm = sqlite3Fts5IterTerm(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter, bp) if (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm >= 0 { var nCmp int32 = func() int32 { if *(*int32)(unsafe.Pointer(bp)) < (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm { return *(*int32)(unsafe.Pointer(bp)) } return (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm }() var bCmp int32 = libc.Xmemcmp(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FzLeTerm, zTerm, uint64(nCmp)) if bCmp < 0 || bCmp == 0 && (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm < *(*int32)(unsafe.Pointer(bp)) { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof = 1 } } sqlite3Fts5BufferSet(tls, bp+4, pCsr+96, *(*int32)(unsafe.Pointer(bp)), zTerm) } return *(*int32)(unsafe.Pointer(bp + 4)) } func fts5VocabInstanceNext(tls *libc.TLS, pCsr uintptr) int32 { var eDetail int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FeDetail var rc int32 = SQLITE_OK var pIter uintptr = (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter var pp uintptr = pCsr + 112 var po uintptr = pCsr + 120 for eDetail == FTS5_DETAIL_NONE || sqlite3Fts5PoslistNext64(tls, (*Fts5IndexIter)(unsafe.Pointer(pIter)).FpData, (*Fts5IndexIter)(unsafe.Pointer(pIter)).FnData, po, pp) != 0 { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiInstPos = int64(0) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiInstOff = 0 rc = sqlite3Fts5IterNextScan(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter) if rc == SQLITE_OK { rc = fts5VocabInstanceNewTerm(tls, pCsr) if (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof != 0 || eDetail == FTS5_DETAIL_NONE { break } } if rc != 0 { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof = 1 break } } return rc } func fts5VocabNextMethod(tls *libc.TLS, pCursor uintptr) int32 { bp := tls.Alloc(24) defer tls.Free(24) var pCsr uintptr = pCursor var pTab uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab var nCol int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FnCol *(*int32)(unsafe.Pointer(bp + 4)) = sqlite3Fts5StructureTest(tls, (*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpIndex, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpStruct) if *(*int32)(unsafe.Pointer(bp + 4)) != SQLITE_OK { return *(*int32)(unsafe.Pointer(bp + 4)) } (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).Frowid++ if (*Fts5VocabTable)(unsafe.Pointer(pTab)).FeType == FTS5_VOCAB_INSTANCE { return fts5VocabInstanceNext(tls, pCsr) } if (*Fts5VocabTable)(unsafe.Pointer(pTab)).FeType == FTS5_VOCAB_COL { for (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol++; (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol < nCol; (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol++ { if *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc + uintptr((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol)*8)) != 0 { break } } } if (*Fts5VocabTable)(unsafe.Pointer(pTab)).FeType != FTS5_VOCAB_COL || (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol >= nCol { if (*Fts5IndexIter)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter)).FbEof != 0 { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof = 1 } else { var zTerm uintptr zTerm = sqlite3Fts5IterTerm(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter, bp) if (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm >= 0 { var nCmp int32 = func() int32 { if *(*int32)(unsafe.Pointer(bp)) < (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm { return *(*int32)(unsafe.Pointer(bp)) } return (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm }() var bCmp int32 = libc.Xmemcmp(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FzLeTerm, zTerm, uint64(nCmp)) if bCmp < 0 || bCmp == 0 && (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm < *(*int32)(unsafe.Pointer(bp)) { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof = 1 return SQLITE_OK } } sqlite3Fts5BufferSet(tls, bp+4, pCsr+96, *(*int32)(unsafe.Pointer(bp)), zTerm) libc.Xmemset(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaCnt, 0, uint64(nCol)*uint64(unsafe.Sizeof(I64(0)))) libc.Xmemset(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc, 0, uint64(nCol)*uint64(unsafe.Sizeof(I64(0)))) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol = 0 for *(*int32)(unsafe.Pointer(bp + 4)) == SQLITE_OK { var eDetail int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FeDetail var pPos uintptr var nPos int32 *(*I64)(unsafe.Pointer(bp + 16)) = int64(0) *(*int32)(unsafe.Pointer(bp + 8)) = 0 pPos = (*Fts5IndexIter)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter)).FpData nPos = (*Fts5IndexIter)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter)).FnData switch (*Fts5VocabTable)(unsafe.Pointer(pTab)).FeType { case FTS5_VOCAB_ROW: if eDetail == FTS5_DETAIL_FULL { for 0 == sqlite3Fts5PoslistNext64(tls, pPos, nPos, bp+8, bp+16) { *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaCnt))++ } } *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc))++ break fallthrough case FTS5_VOCAB_COL: if eDetail == FTS5_DETAIL_FULL { var iCol int32 = -1 for 0 == sqlite3Fts5PoslistNext64(tls, pPos, nPos, bp+8, bp+16) { var ii int32 = int32(*(*I64)(unsafe.Pointer(bp + 16)) >> 32) if iCol != ii { if ii >= nCol { *(*int32)(unsafe.Pointer(bp + 4)) = SQLITE_CORRUPT | int32(1)<<8 break } *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc + uintptr(ii)*8))++ iCol = ii } *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaCnt + uintptr(ii)*8))++ } } else if eDetail == FTS5_DETAIL_COLUMNS { for 0 == sqlite3Fts5PoslistNext64(tls, pPos, nPos, bp+8, bp+16) { if *(*I64)(unsafe.Pointer(bp + 16)) >= I64(nCol) { *(*int32)(unsafe.Pointer(bp + 4)) = SQLITE_CORRUPT | int32(1)<<8 break } *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc + uintptr(*(*I64)(unsafe.Pointer(bp + 16)))*8))++ } } else { *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc))++ } break fallthrough default: break } if *(*int32)(unsafe.Pointer(bp + 4)) == SQLITE_OK { *(*int32)(unsafe.Pointer(bp + 4)) = sqlite3Fts5IterNextScan(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter) } if (*Fts5VocabTable)(unsafe.Pointer(pTab)).FeType == FTS5_VOCAB_INSTANCE { break } if *(*int32)(unsafe.Pointer(bp + 4)) == SQLITE_OK { zTerm = sqlite3Fts5IterTerm(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter, bp) if *(*int32)(unsafe.Pointer(bp)) != (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).Fterm.Fn || *(*int32)(unsafe.Pointer(bp)) > 0 && libc.Xmemcmp(tls, zTerm, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).Fterm.Fp, uint64(*(*int32)(unsafe.Pointer(bp)))) != 0 { break } if (*Fts5IndexIter)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter)).FbEof != 0 { break } } } } } if *(*int32)(unsafe.Pointer(bp + 4)) == SQLITE_OK && (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof == 0 && (*Fts5VocabTable)(unsafe.Pointer(pTab)).FeType == FTS5_VOCAB_COL { for ; (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol < nCol && *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc + uintptr((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol)*8)) == int64(0); (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol++ { } if (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol == nCol { *(*int32)(unsafe.Pointer(bp + 4)) = SQLITE_CORRUPT | int32(1)<<8 } } return *(*int32)(unsafe.Pointer(bp + 4)) } func fts5VocabFilterMethod(tls *libc.TLS, pCursor uintptr, idxNum int32, zUnused uintptr, nUnused int32, apVal uintptr) int32 { var pTab uintptr = (*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab var pCsr uintptr = pCursor var eType int32 = (*Fts5VocabTable)(unsafe.Pointer(pTab)).FeType var rc int32 = SQLITE_OK var iVal int32 = 0 var f int32 = FTS5INDEX_QUERY_SCAN var zTerm uintptr = uintptr(0) var nTerm int32 = 0 var pEq uintptr = uintptr(0) var pGe uintptr = uintptr(0) var pLe uintptr = uintptr(0) _ = zUnused _ = nUnused fts5VocabResetCursor(tls, pCsr) if idxNum&FTS5_VOCAB_TERM_EQ != 0 { pEq = *(*uintptr)(unsafe.Pointer(apVal + uintptr(libc.PostIncInt32(&iVal, 1))*8)) } if idxNum&FTS5_VOCAB_TERM_GE != 0 { pGe = *(*uintptr)(unsafe.Pointer(apVal + uintptr(libc.PostIncInt32(&iVal, 1))*8)) } if idxNum&FTS5_VOCAB_TERM_LE != 0 { pLe = *(*uintptr)(unsafe.Pointer(apVal + uintptr(libc.PostIncInt32(&iVal, 1))*8)) } if pEq != 0 { zTerm = Xsqlite3_value_text(tls, pEq) nTerm = Xsqlite3_value_bytes(tls, pEq) f = 0 } else { if pGe != 0 { zTerm = Xsqlite3_value_text(tls, pGe) nTerm = Xsqlite3_value_bytes(tls, pGe) } if pLe != 0 { var zCopy uintptr = Xsqlite3_value_text(tls, pLe) if zCopy == uintptr(0) { zCopy = ts + 1544 } (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm = Xsqlite3_value_bytes(tls, pLe) (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FzLeTerm = Xsqlite3_malloc(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm+1) if (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FzLeTerm == uintptr(0) { rc = SQLITE_NOMEM } else { libc.Xmemcpy(tls, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FzLeTerm, zCopy, uint64((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FnLeTerm+1)) } } } if rc == SQLITE_OK { var pIndex uintptr = (*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpIndex rc = sqlite3Fts5IndexQuery(tls, pIndex, zTerm, nTerm, f, uintptr(0), pCsr+32) if rc == SQLITE_OK { (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpStruct = sqlite3Fts5StructureRef(tls, pIndex) } } if rc == SQLITE_OK && eType == FTS5_VOCAB_INSTANCE { rc = fts5VocabInstanceNewTerm(tls, pCsr) } if rc == SQLITE_OK && !((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof != 0) && (eType != FTS5_VOCAB_INSTANCE || (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FeDetail != FTS5_DETAIL_NONE) { rc = fts5VocabNextMethod(tls, pCursor) } return rc } func fts5VocabEofMethod(tls *libc.TLS, pCursor uintptr) int32 { var pCsr uintptr = pCursor return (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FbEof } func fts5VocabColumnMethod(tls *libc.TLS, pCursor uintptr, pCtx uintptr, iCol int32) int32 { var pCsr uintptr = pCursor var eDetail int32 = (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FeDetail var eType int32 = (*Fts5VocabTable)(unsafe.Pointer((*Sqlite3_vtab_cursor)(unsafe.Pointer(pCursor)).FpVtab)).FeType var iVal I64 = int64(0) if iCol == 0 { Xsqlite3_result_text(tls, pCtx, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).Fterm.Fp, (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).Fterm.Fn, libc.UintptrFromInt32(-1)) } else if eType == FTS5_VOCAB_COL { if iCol == 1 { if eDetail != FTS5_DETAIL_NONE { var z uintptr = *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FazCol + uintptr((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol)*8)) Xsqlite3_result_text(tls, pCtx, z, -1, uintptr(0)) } } else if iCol == 2 { iVal = *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc + uintptr((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol)*8)) } else { iVal = *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaCnt + uintptr((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiCol)*8)) } } else if eType == FTS5_VOCAB_ROW { if iCol == 1 { iVal = *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaDoc)) } else { iVal = *(*I64)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FaCnt)) } } else { switch iCol { case 1: Xsqlite3_result_int64(tls, pCtx, (*Fts5IndexIter)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpIter)).FiRowid) break fallthrough case 2: { var ii int32 = -1 if eDetail == FTS5_DETAIL_FULL { ii = int32((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiInstPos >> 32) } else if eDetail == FTS5_DETAIL_COLUMNS { ii = int32((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiInstPos) } if ii >= 0 && ii < (*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FnCol { var z uintptr = *(*uintptr)(unsafe.Pointer((*Fts5Config)(unsafe.Pointer((*Fts5Table)(unsafe.Pointer((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FpFts5)).FpConfig)).FazCol + uintptr(ii)*8)) Xsqlite3_result_text(tls, pCtx, z, -1, uintptr(0)) } break } fallthrough default: { if eDetail == FTS5_DETAIL_FULL { var ii int32 = int32((*Fts5VocabCursor)(unsafe.Pointer(pCsr)).FiInstPos & int64(0x7FFFFFFF)) Xsqlite3_result_int(tls, pCtx, ii) } break } } } if iVal > int64(0) { Xsqlite3_result_int64(tls, pCtx, iVal) } return SQLITE_OK } func fts5VocabRowidMethod(tls *libc.TLS, pCursor uintptr, pRowid uintptr) int32 { var pCsr uintptr = pCursor *(*Sqlite_int64)(unsafe.Pointer(pRowid)) = (*Fts5VocabCursor)(unsafe.Pointer(pCsr)).Frowid return SQLITE_OK } func sqlite3Fts5VocabInit(tls *libc.TLS, pGlobal uintptr, db uintptr) int32 { var p uintptr = pGlobal return Xsqlite3_create_module_v2(tls, db, ts+39061, uintptr(unsafe.Pointer(&fts5Vocab)), p, uintptr(0)) } var fts5Vocab = Sqlite3_module{ FiVersion: 2, FxCreate: 0, FxConnect: 0, FxBestIndex: 0, FxDisconnect: 0, FxDestroy: 0, FxOpen: 0, FxClose: 0, FxFilter: 0, FxNext: 0, FxEof: 0, FxColumn: 0, FxRowid: 0, } // ************* End of stmt.c *********************************************** // Return the source-id for this library func Xsqlite3_sourceid(tls *libc.TLS) uintptr { return ts + 39071 } func init() { *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&Xsqlite3aEQb)) + 0)) = uintptr(unsafe.Pointer(&Xsqlite3UpperToLower)) + 210 *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&Xsqlite3aGTb)) + 0)) = uintptr(unsafe.Pointer(&Xsqlite3UpperToLower)) + 216 *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&Xsqlite3aLTb)) + 0)) = uintptr(unsafe.Pointer(&Xsqlite3UpperToLower)) + 204 *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aAgg)) + 0)) = geopolyBBoxStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aAgg)) + 8)) = geopolyBBoxFinal *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aAlterTableFuncs)) + 24)) = renameColumnFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aAlterTableFuncs)) + 96)) = renameTableFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aAlterTableFuncs)) + 168)) = renameTableTest *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aAlterTableFuncs)) + 240)) = dropColumnFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aAlterTableFuncs)) + 312)) = renameQuotefixFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 24)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 96)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 168)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 240)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 312)) = soundexFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 384)) = loadExt *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 456)) = loadExt *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 528)) = compileoptionusedFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 600)) = compileoptiongetFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 672)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 744)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 816)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 888)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 960)) = trimFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1032)) = trimFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1104)) = trimFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1176)) = trimFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1248)) = trimFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1320)) = trimFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1392)) = minmaxFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1536)) = minmaxStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1544)) = minMaxFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1552)) = minMaxValue *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1608)) = minmaxFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1752)) = minmaxStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1760)) = minMaxFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1768)) = minMaxValue *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1824)) = typeofFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1896)) = subtypeFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 1968)) = lengthFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2040)) = instrFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2112)) = printfFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2184)) = printfFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2256)) = unicodeFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2328)) = charFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2400)) = absFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2472)) = roundFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2544)) = roundFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2616)) = upperFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2688)) = lowerFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2760)) = hexFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2832)) = unhexFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2904)) = unhexFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 2976)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3048)) = randomFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3120)) = randomBlob *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3192)) = nullifFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3264)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3336)) = sourceidFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3408)) = errlogFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3480)) = quoteFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3552)) = last_insert_rowid *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3624)) = changes *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3696)) = total_changes *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3768)) = replaceFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3840)) = zeroblobFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3912)) = substrFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 3984)) = substrFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4056)) = substrFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4128)) = substrFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4200)) = sumStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4208)) = sumFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4216)) = sumFinalize *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4224)) = sumInverse *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4272)) = sumStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4280)) = totalFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4288)) = totalFinalize *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4296)) = sumInverse *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4344)) = sumStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4352)) = avgFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4360)) = avgFinalize *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4368)) = sumInverse *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4416)) = countStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4424)) = countFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4432)) = countFinalize *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4440)) = countInverse *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4488)) = countStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4496)) = countFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4504)) = countFinalize *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4512)) = countInverse *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4560)) = groupConcatStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4568)) = groupConcatFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4576)) = groupConcatValue *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4584)) = groupConcatInverse *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4632)) = groupConcatStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4640)) = groupConcatFinalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4648)) = groupConcatValue *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4656)) = groupConcatInverse *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4688)) = uintptr(unsafe.Pointer(&globInfo)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4704)) = likeFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4760)) = uintptr(unsafe.Pointer(&likeInfoNorm)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4776)) = likeFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4832)) = uintptr(unsafe.Pointer(&likeInfoNorm)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 4848)) = likeFunc *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5048)) = xCeil *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5064)) = ceilingFunc *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5120)) = xCeil *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5136)) = ceilingFunc *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5192)) = xFloor *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5208)) = ceilingFunc *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5264)) = libc.Xtrunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5280)) = ceilingFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5352)) = logFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5424)) = logFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5496)) = logFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5568)) = logFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5640)) = logFunc *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5696)) = libc.Xexp *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5712)) = math1Func *(*func(*libc.TLS, float64, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5768)) = libc.Xpow *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5784)) = math2Func *(*func(*libc.TLS, float64, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5840)) = libc.Xpow *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5856)) = math2Func *(*func(*libc.TLS, float64, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5912)) = libc.Xfmod *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5928)) = math2Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 5984)) = libc.Xacos *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6000)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6056)) = libc.Xasin *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6072)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6128)) = libc.Xatan *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6144)) = math1Func *(*func(*libc.TLS, float64, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6200)) = libc.Xatan2 *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6216)) = math2Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6272)) = libc.Xcos *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6288)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6344)) = libc.Xsin *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6360)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6416)) = libc.Xtan *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6432)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6488)) = libc.Xcosh *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6504)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6560)) = libc.Xsinh *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6576)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6632)) = libc.Xtanh *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6648)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6704)) = libc.Xacosh *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6720)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6776)) = libc.Xasinh *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6792)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6848)) = libc.Xatanh *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6864)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6920)) = libc.Xsqrt *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6936)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 6992)) = degToRad *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 7008)) = math1Func *(*func(*libc.TLS, float64) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 7064)) = radToDeg *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 7080)) = math1Func *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 7152)) = piFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 7224)) = signFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 7296)) = versionFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aBuiltinFunc)) + 7368)) = versionFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 8)) = uintptr(unsafe.Pointer(&Xsqlite3Config)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 24)) = juliandayFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 80)) = uintptr(unsafe.Pointer(&Xsqlite3Config)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 96)) = unixepochFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 152)) = uintptr(unsafe.Pointer(&Xsqlite3Config)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 168)) = dateFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 224)) = uintptr(unsafe.Pointer(&Xsqlite3Config)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 240)) = timeFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 296)) = uintptr(unsafe.Pointer(&Xsqlite3Config)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 312)) = datetimeFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 368)) = uintptr(unsafe.Pointer(&Xsqlite3Config)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 384)) = strftimeFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 456)) = ctimeFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 528)) = ctimestampFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aDateTimeFuncs)) + 600)) = cdateFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 0)) = geopolyAreaFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 24)) = geopolyBlobFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 48)) = geopolyJsonFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 72)) = geopolySvgFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 96)) = geopolyWithinFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 120)) = geopolyContainsPointFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 144)) = geopolyOverlapFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 168)) = geopolyDebugFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 192)) = geopolyBBoxFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 216)) = geopolyXformFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 240)) = geopolyRegularFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aFunc)) + 264)) = geopolyCcwFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 24)) = jsonRemoveFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 96)) = jsonArrayFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 168)) = jsonArrayLengthFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 240)) = jsonArrayLengthFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 312)) = jsonExtractFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 384)) = jsonExtractFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 456)) = jsonExtractFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 528)) = jsonSetFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 600)) = jsonObjectFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 672)) = jsonPatchFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 744)) = jsonQuoteFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 816)) = jsonRemoveFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 888)) = jsonReplaceFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 960)) = jsonSetFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1032)) = jsonTypeFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1104)) = jsonTypeFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1176)) = jsonValidFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1248)) = jsonArrayStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1256)) = jsonArrayFinal *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1264)) = jsonArrayValue *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1272)) = jsonGroupInverse *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1320)) = jsonObjectStep *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1328)) = jsonObjectFinal *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1336)) = jsonObjectValue *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aJsonFunc)) + 1344)) = jsonGroupInverse *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aMod)) + 8)) = uintptr(unsafe.Pointer(&jsonEachModule)) *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aMod)) + 24)) = uintptr(unsafe.Pointer(&jsonTreeModule)) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 8)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS) WINBOOL }{libc.XAreFileApisANSI})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 80)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE) WINBOOL }{libc.XCloseHandle})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 104)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE) HANDLE }{libc.XCreateFileA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 128)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE) HANDLE }{libc.XCreateFileW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 152)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR) HANDLE }{libc.XCreateFileMappingA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 176)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCWSTR) HANDLE }{libc.XCreateFileMappingW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 200)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPSECURITY_ATTRIBUTES, WINBOOL, LPCWSTR) HANDLE }{libc.XCreateMutexW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 224)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCSTR) WINBOOL }{libc.XDeleteFileA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 248)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCWSTR) WINBOOL }{libc.XDeleteFileW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 320)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE) WINBOOL }{libc.XFlushFileBuffers})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 344)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, DWORD, LPCVOID, DWORD, DWORD, LPSTR, DWORD, uintptr) DWORD }{libc.XFormatMessageA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 368)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, DWORD, LPCVOID, DWORD, DWORD, LPWSTR, DWORD, uintptr) DWORD }{libc.XFormatMessageW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 392)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HMODULE) WINBOOL }{libc.XFreeLibrary})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 416)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS) DWORD }{libc.XGetCurrentProcessId})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 440)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD) WINBOOL }{libc.XGetDiskFreeSpaceA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 464)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCWSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD) WINBOOL }{libc.XGetDiskFreeSpaceW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 488)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, LPCSTR) DWORD }{libc.XGetFileAttributesA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 512)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCWSTR) DWORD }{libc.XGetFileAttributesW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 536)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCWSTR, GET_FILEEX_INFO_LEVELS, LPVOID) WINBOOL }{libc.XGetFileAttributesExW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 560)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, LPDWORD) DWORD }{libc.XGetFileSize})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 584)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCSTR, DWORD, LPSTR, uintptr) DWORD }{libc.XGetFullPathNameA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 608)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCWSTR, DWORD, LPWSTR, uintptr) DWORD }{libc.XGetFullPathNameW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 632)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS) DWORD }{libc.XGetLastError})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 656)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HMODULE, LPCSTR) FARPROC }{libc.XGetProcAddress})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 680)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPSYSTEM_INFO) }{libc.XGetSystemInfo})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 704)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, LPSYSTEMTIME) }{libc.XGetSystemTime})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 728)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, LPFILETIME) }{libc.XGetSystemTimeAsFileTime})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 752)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, DWORD, LPSTR) DWORD }{libc.XGetTempPathA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 776)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, DWORD, LPWSTR) DWORD }{libc.XGetTempPathW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 800)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS) DWORD }{libc.XGetTickCount})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 824)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPOSVERSIONINFOA) WINBOOL }{libc.XGetVersionExA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 848)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPOSVERSIONINFOW) WINBOOL }{libc.XGetVersionExW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 872)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, SIZE_T) LPVOID }{libc.XHeapAlloc})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 896)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, DWORD, SIZE_T, SIZE_T) HANDLE }{libc.XHeapCreate})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 920)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE) WINBOOL }{libc.XHeapDestroy})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 944)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, LPVOID) WINBOOL }{libc.XHeapFree})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 968)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, LPVOID, SIZE_T) LPVOID }{libc.XHeapReAlloc})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 992)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, LPCVOID) SIZE_T }{libc.XHeapSize})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1016)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, LPCVOID) WINBOOL }{libc.XHeapValidate})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1040)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD) SIZE_T }{libc.XHeapCompact})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1064)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCSTR) HMODULE }{libc.XLoadLibraryA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1088)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCWSTR) HMODULE }{libc.XLoadLibraryW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1112)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HLOCAL) HLOCAL }{libc.XLocalFree})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1136)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, DWORD) WINBOOL }{libc.XLockFile})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1160)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED) WINBOOL }{libc.XLockFileEx})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1184)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, SIZE_T) LPVOID }{libc.XMapViewOfFile})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1208)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, UINT, DWORD, LPCCH, int32, LPWSTR, int32) int32 }{libc.XMultiByteToWideChar})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1232)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) WINBOOL }{libc.XQueryPerformanceCounter})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1256)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED) WINBOOL }{libc.XReadFile})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1280)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE) WINBOOL }{libc.XSetEndOfFile})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1304)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, LONG, PLONG, DWORD) DWORD }{libc.XSetFilePointer})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1328)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, DWORD) }{libc.XSleep})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1352)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr, LPFILETIME) WINBOOL }{libc.XSystemTimeToFileTime})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1376)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, DWORD) WINBOOL }{libc.XUnlockFile})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1400)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, DWORD, DWORD, LPOVERLAPPED) WINBOOL }{libc.XUnlockFileEx})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1424)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCVOID) WINBOOL }{libc.XUnmapViewOfFile})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1448)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, UINT, DWORD, LPCWCH, int32, LPSTR, int32, LPCCH, LPBOOL) int32 }{libc.XWideCharToMultiByte})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1472)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED) WINBOOL }{libc.XWriteFile})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1520)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD) DWORD }{libc.XWaitForSingleObject})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1544)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, HANDLE, DWORD, WINBOOL) DWORD }{libc.XWaitForSingleObjectEx})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1736)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, LPCSTR) }{libc.XOutputDebugStringA})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1760)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS, LPCWSTR) }{libc.XOutputDebugStringW})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1784)) = *(*uintptr)(unsafe.Pointer(&struct{ f func(*libc.TLS) HANDLE }{libc.XGetProcessHeap})) *(*Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aSyscall)) + 1904)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, LPCVOID, SIZE_T) WINBOOL }{libc.XFlushViewOfFile})) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 24)) = row_numberStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 32)) = row_numberValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 40)) = row_numberValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 48)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 56)) = uintptr(unsafe.Pointer(&row_numberName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 96)) = dense_rankStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 104)) = dense_rankValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 112)) = dense_rankValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 120)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 128)) = uintptr(unsafe.Pointer(&dense_rankName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 168)) = rankStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 176)) = rankValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 184)) = rankValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 192)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 200)) = uintptr(unsafe.Pointer(&rankName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 240)) = percent_rankStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 248)) = percent_rankValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 256)) = percent_rankValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 264)) = percent_rankInvFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 272)) = uintptr(unsafe.Pointer(&percent_rankName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 312)) = cume_distStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 320)) = cume_distValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 328)) = cume_distValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 336)) = cume_distInvFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 344)) = uintptr(unsafe.Pointer(&cume_distName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 384)) = ntileStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 392)) = ntileValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 400)) = ntileValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 408)) = ntileInvFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 416)) = uintptr(unsafe.Pointer(&ntileName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 456)) = last_valueStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 464)) = last_valueFinalizeFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 472)) = last_valueValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 480)) = last_valueInvFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 488)) = uintptr(unsafe.Pointer(&last_valueName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 528)) = nth_valueStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 536)) = nth_valueFinalizeFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 544)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 552)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 560)) = uintptr(unsafe.Pointer(&nth_valueName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 600)) = first_valueStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 608)) = first_valueFinalizeFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 616)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 624)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 632)) = uintptr(unsafe.Pointer(&first_valueName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 672)) = noopStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 680)) = noopValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 688)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 696)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 704)) = uintptr(unsafe.Pointer(&leadName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 744)) = noopStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 752)) = noopValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 760)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 768)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 776)) = uintptr(unsafe.Pointer(&leadName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 816)) = noopStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 824)) = noopValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 832)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 840)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 848)) = uintptr(unsafe.Pointer(&leadName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 888)) = noopStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 896)) = noopValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 904)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 912)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 920)) = uintptr(unsafe.Pointer(&lagName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 960)) = noopStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 968)) = noopValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 976)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 984)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 992)) = uintptr(unsafe.Pointer(&lagName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 1032)) = noopStepFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 1040)) = noopValueFunc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 1048)) = noopValueFunc *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 1056)) = noopStepFunc *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&aWindowFuncs)) + 1064)) = uintptr(unsafe.Pointer(&lagName)) *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&attach_func)) + 24)) = attachFunc *(*func(*libc.TLS, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods)) + 0)) = sqlite3MemMalloc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods)) + 8)) = sqlite3MemFree *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods)) + 16)) = sqlite3MemRealloc *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods)) + 24)) = sqlite3MemSize *(*func(*libc.TLS, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods)) + 32)) = sqlite3MemRoundup *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods)) + 40)) = sqlite3MemInit *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods)) + 48)) = sqlite3MemShutdown *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 16)) = pcache1Init *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 24)) = pcache1Shutdown *(*func(*libc.TLS, int32, int32, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 32)) = pcache1Create *(*func(*libc.TLS, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 40)) = pcache1Cachesize *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 48)) = pcache1Pagecount *(*func(*libc.TLS, uintptr, uint32, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 56)) = pcache1Fetch *(*func(*libc.TLS, uintptr, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 64)) = pcache1Unpin *(*func(*libc.TLS, uintptr, uintptr, uint32, uint32))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 72)) = pcache1Rekey *(*func(*libc.TLS, uintptr, uint32))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 80)) = pcache1Truncate *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 88)) = pcache1Destroy *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&defaultMethods1)) + 96)) = pcache1Shrink *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&detach_func)) + 24)) = detachFunc *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 8)) = fts5CreateMethod *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 16)) = fts5ConnectMethod *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 24)) = fts5BestIndexMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 32)) = fts5DisconnectMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 40)) = fts5DestroyMethod *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 48)) = fts5OpenMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 56)) = fts5CloseMethod *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 64)) = fts5FilterMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 72)) = fts5NextMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 80)) = fts5EofMethod *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 88)) = fts5ColumnMethod *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 96)) = fts5RowidMethod *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 104)) = fts5UpdateMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 112)) = fts5BeginMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 120)) = fts5SyncMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 128)) = fts5CommitMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 136)) = fts5RollbackMethod *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 144)) = fts5FindFunctionMethod *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 152)) = fts5RenameMethod *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 160)) = fts5SavepointMethod *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 168)) = fts5ReleaseMethod *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 176)) = fts5RollbackToMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Mod)) + 184)) = fts5ShadowName *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 8)) = fts5VocabCreateMethod *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 16)) = fts5VocabConnectMethod *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 24)) = fts5VocabBestIndexMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 32)) = fts5VocabDisconnectMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 40)) = fts5VocabDestroyMethod *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 48)) = fts5VocabOpenMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 56)) = fts5VocabCloseMethod *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 64)) = fts5VocabFilterMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 72)) = fts5VocabNextMethod *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 80)) = fts5VocabEofMethod *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 88)) = fts5VocabColumnMethod *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&fts5Vocab)) + 96)) = fts5VocabRowidMethod *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 8)) = geopolyCreate *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 16)) = geopolyConnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 24)) = geopolyBestIndex *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 32)) = rtreeDisconnect *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 40)) = rtreeDestroy *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 48)) = rtreeOpen *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 56)) = rtreeClose *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 64)) = geopolyFilter *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 72)) = rtreeNext *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 80)) = rtreeEof *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 88)) = geopolyColumn *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 96)) = rtreeRowid *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 104)) = geopolyUpdate *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 112)) = rtreeBeginTransaction *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 120)) = rtreeEndTransaction *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 128)) = rtreeEndTransaction *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 136)) = rtreeEndTransaction *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 144)) = geopolyFindFunction *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 152)) = rtreeRename *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 160)) = rtreeSavepoint *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&geopolyModule)) + 184)) = rtreeShadowName *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 16)) = jsonEachConnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 24)) = jsonEachBestIndex *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 32)) = jsonEachDisconnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 48)) = jsonEachOpenEach *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 56)) = jsonEachClose *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 64)) = jsonEachFilter *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 72)) = jsonEachNext *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 80)) = jsonEachEof *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 88)) = jsonEachColumn *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonEachModule)) + 96)) = jsonEachRowid *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 16)) = jsonEachConnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 24)) = jsonEachBestIndex *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 32)) = jsonEachDisconnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 48)) = jsonEachOpenTree *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 56)) = jsonEachClose *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 64)) = jsonEachFilter *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 72)) = jsonEachNext *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 80)) = jsonEachEof *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 88)) = jsonEachColumn *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&jsonTreeModule)) + 96)) = jsonEachRowid *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 8)) = memdbClose *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 16)) = memdbRead *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 24)) = memdbWrite *(*func(*libc.TLS, uintptr, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 32)) = memdbTruncate *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 40)) = memdbSync *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 48)) = memdbFileSize *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 56)) = memdbLock *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 64)) = memdbUnlock *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 80)) = memdbFileControl *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 96)) = memdbDeviceCharacteristics *(*func(*libc.TLS, uintptr, Sqlite3_int64, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 136)) = memdbFetch *(*func(*libc.TLS, uintptr, Sqlite3_int64, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_io_methods)) + 144)) = memdbUnfetch *(*func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 40)) = memdbOpen *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 56)) = memdbAccess *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 64)) = memdbFullPathname *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 72)) = memdbDlOpen *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 80)) = memdbDlError *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 88)) = memdbDlSym *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 96)) = memdbDlClose *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 104)) = memdbRandomness *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 112)) = memdbSleep *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 128)) = memdbGetLastError *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&memdb_vfs)) + 136)) = memdbCurrentTimeInt64 *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 16)) = pragmaVtabConnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 24)) = pragmaVtabBestIndex *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 32)) = pragmaVtabDisconnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 48)) = pragmaVtabOpen *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 56)) = pragmaVtabClose *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 64)) = pragmaVtabFilter *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 72)) = pragmaVtabNext *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 80)) = pragmaVtabEof *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 88)) = pragmaVtabColumn *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&pragmaVtabModule)) + 96)) = pragmaVtabRowid *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 8)) = rbuVfsClose *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 16)) = rbuVfsRead *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 24)) = rbuVfsWrite *(*func(*libc.TLS, uintptr, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 32)) = rbuVfsTruncate *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 40)) = rbuVfsSync *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 48)) = rbuVfsFileSize *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 56)) = rbuVfsLock *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 64)) = rbuVfsUnlock *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 72)) = rbuVfsCheckReservedLock *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 80)) = rbuVfsFileControl *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 88)) = rbuVfsSectorSize *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 96)) = rbuVfsDeviceCharacteristics *(*func(*libc.TLS, uintptr, int32, int32, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 104)) = rbuVfsShmMap *(*func(*libc.TLS, uintptr, int32, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 112)) = rbuVfsShmLock *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 120)) = rbuVfsShmBarrier *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods)) + 128)) = rbuVfsShmUnmap *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 8)) = rbuVfsClose *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 16)) = rbuVfsRead *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 24)) = rbuVfsWrite *(*func(*libc.TLS, uintptr, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 32)) = rbuVfsTruncate *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 40)) = rbuVfsSync *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 48)) = rbuVfsFileSize *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 56)) = rbuVfsLock *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 64)) = rbuVfsUnlock *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 72)) = rbuVfsCheckReservedLock *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 80)) = rbuVfsFileControl *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 88)) = rbuVfsSectorSize *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rbuvfs_io_methods1)) + 96)) = rbuVfsDeviceCharacteristics *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 8)) = rtreeCreate *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 16)) = rtreeConnect *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 24)) = rtreeBestIndex *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 32)) = rtreeDisconnect *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 40)) = rtreeDestroy *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 48)) = rtreeOpen *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 56)) = rtreeClose *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 64)) = rtreeFilter *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 72)) = rtreeNext *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 80)) = rtreeEof *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 88)) = rtreeColumn *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 96)) = rtreeRowid *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 104)) = rtreeUpdate *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 112)) = rtreeBeginTransaction *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 120)) = rtreeEndTransaction *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 128)) = rtreeEndTransaction *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 136)) = rtreeEndTransaction *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 152)) = rtreeRename *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 160)) = rtreeSavepoint *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&rtreeModule)) + 184)) = rtreeShadowName *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 8)) = fts5ApiUserData *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 16)) = fts5ApiColumnCount *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 24)) = fts5ApiRowCount *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 32)) = fts5ApiColumnTotalSize *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 40)) = fts5ApiTokenize *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 48)) = fts5ApiPhraseCount *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 56)) = fts5ApiPhraseSize *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 64)) = fts5ApiInstCount *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 72)) = fts5ApiInst *(*func(*libc.TLS, uintptr) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 80)) = fts5ApiRowid *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 88)) = fts5ApiColumnText *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 96)) = fts5ApiColumnSize *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 104)) = fts5ApiQueryPhrase *(*func(*libc.TLS, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 112)) = fts5ApiSetAuxdata *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 120)) = fts5ApiGetAuxdata *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 128)) = fts5ApiPhraseFirst *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 136)) = fts5ApiPhraseNext *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 144)) = fts5ApiPhraseFirstColumn *(*func(*libc.TLS, uintptr, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sFts5Api)) + 152)) = fts5ApiPhraseNextColumn *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMemJournalMethods)) + 8)) = memjrnlClose *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMemJournalMethods)) + 16)) = memjrnlRead *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMemJournalMethods)) + 24)) = memjrnlWrite *(*func(*libc.TLS, uintptr, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMemJournalMethods)) + 32)) = memjrnlTruncate *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMemJournalMethods)) + 40)) = memjrnlSync *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMemJournalMethods)) + 48)) = memjrnlFileSize *(*func(*libc.TLS) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMutex)) + 0)) = noopMutexInit *(*func(*libc.TLS) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMutex)) + 8)) = noopMutexEnd *(*func(*libc.TLS, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMutex)) + 16)) = noopMutexAlloc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sMutex)) + 24)) = noopMutexFree *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sMutex)) + 32)) = noopMutexEnter *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sMutex)) + 40)) = noopMutexTry *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sMutex)) + 48)) = noopMutexLeave *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 0)) = Xsqlite3_aggregate_context *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 8)) = Xsqlite3_aggregate_count *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 16)) = Xsqlite3_bind_blob *(*func(*libc.TLS, uintptr, int32, float64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 24)) = Xsqlite3_bind_double *(*func(*libc.TLS, uintptr, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 32)) = Xsqlite3_bind_int *(*func(*libc.TLS, uintptr, int32, Sqlite_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 40)) = Xsqlite3_bind_int64 *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 48)) = Xsqlite3_bind_null *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 56)) = Xsqlite3_bind_parameter_count *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 64)) = Xsqlite3_bind_parameter_index *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 72)) = Xsqlite3_bind_parameter_name *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 80)) = Xsqlite3_bind_text *(*func(*libc.TLS, uintptr, int32, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 88)) = Xsqlite3_bind_text16 *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 96)) = Xsqlite3_bind_value *(*func(*libc.TLS, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 104)) = Xsqlite3_busy_handler *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 112)) = Xsqlite3_busy_timeout *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 120)) = Xsqlite3_changes *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 128)) = Xsqlite3_close *(*func(*libc.TLS, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 136)) = Xsqlite3_collation_needed *(*func(*libc.TLS, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 144)) = Xsqlite3_collation_needed16 *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 152)) = Xsqlite3_column_blob *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 160)) = Xsqlite3_column_bytes *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 168)) = Xsqlite3_column_bytes16 *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 176)) = Xsqlite3_column_count *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 184)) = Xsqlite3_column_database_name *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 192)) = Xsqlite3_column_database_name16 *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 200)) = Xsqlite3_column_decltype *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 208)) = Xsqlite3_column_decltype16 *(*func(*libc.TLS, uintptr, int32) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 216)) = Xsqlite3_column_double *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 224)) = Xsqlite3_column_int *(*func(*libc.TLS, uintptr, int32) Sqlite_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 232)) = Xsqlite3_column_int64 *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 240)) = Xsqlite3_column_name *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 248)) = Xsqlite3_column_name16 *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 256)) = Xsqlite3_column_origin_name *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 264)) = Xsqlite3_column_origin_name16 *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 272)) = Xsqlite3_column_table_name *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 280)) = Xsqlite3_column_table_name16 *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 288)) = Xsqlite3_column_text *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 296)) = Xsqlite3_column_text16 *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 304)) = Xsqlite3_column_type *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 312)) = Xsqlite3_column_value *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 320)) = Xsqlite3_commit_hook *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 328)) = Xsqlite3_complete *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 336)) = Xsqlite3_complete16 *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 344)) = Xsqlite3_create_collation *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 352)) = Xsqlite3_create_collation16 *(*func(*libc.TLS, uintptr, uintptr, int32, int32, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 360)) = Xsqlite3_create_function *(*func(*libc.TLS, uintptr, uintptr, int32, int32, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 368)) = Xsqlite3_create_function16 *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 376)) = Xsqlite3_create_module *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 384)) = Xsqlite3_data_count *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 392)) = Xsqlite3_db_handle *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 400)) = Xsqlite3_declare_vtab *(*func(*libc.TLS, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 408)) = Xsqlite3_enable_shared_cache *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 416)) = Xsqlite3_errcode *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 424)) = Xsqlite3_errmsg *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 432)) = Xsqlite3_errmsg16 *(*func(*libc.TLS, uintptr, uintptr, Sqlite3_callback, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 440)) = Xsqlite3_exec *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 448)) = Xsqlite3_expired *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 456)) = Xsqlite3_finalize *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 464)) = Xsqlite3_free *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 472)) = Xsqlite3_free_table *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 480)) = Xsqlite3_get_autocommit *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 488)) = Xsqlite3_get_auxdata *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 496)) = Xsqlite3_get_table *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 512)) = Xsqlite3_interrupt *(*func(*libc.TLS, uintptr) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 520)) = Xsqlite3_last_insert_rowid *(*func(*libc.TLS) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 528)) = Xsqlite3_libversion *(*func(*libc.TLS) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 536)) = Xsqlite3_libversion_number *(*func(*libc.TLS, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 544)) = Xsqlite3_malloc *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 552)) = Xsqlite3_mprintf *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 560)) = Xsqlite3_open *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 568)) = Xsqlite3_open16 *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 576)) = Xsqlite3_prepare *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 584)) = Xsqlite3_prepare16 *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 592)) = Xsqlite3_profile *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 600)) = Xsqlite3_progress_handler *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 608)) = Xsqlite3_realloc *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 616)) = Xsqlite3_reset *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 624)) = Xsqlite3_result_blob *(*func(*libc.TLS, uintptr, float64))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 632)) = Xsqlite3_result_double *(*func(*libc.TLS, uintptr, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 640)) = Xsqlite3_result_error *(*func(*libc.TLS, uintptr, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 648)) = Xsqlite3_result_error16 *(*func(*libc.TLS, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 656)) = Xsqlite3_result_int *(*func(*libc.TLS, uintptr, I64))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 664)) = Xsqlite3_result_int64 *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 672)) = Xsqlite3_result_null *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 680)) = Xsqlite3_result_text *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 688)) = Xsqlite3_result_text16 *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 696)) = Xsqlite3_result_text16be *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 704)) = Xsqlite3_result_text16le *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 712)) = Xsqlite3_result_value *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 720)) = Xsqlite3_rollback_hook *(*func(*libc.TLS, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 728)) = Xsqlite3_set_authorizer *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 736)) = Xsqlite3_set_auxdata *(*func(*libc.TLS, int32, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 744)) = Xsqlite3_snprintf *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 752)) = Xsqlite3_step *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 760)) = Xsqlite3_table_column_metadata *(*func(*libc.TLS))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 768)) = Xsqlite3_thread_cleanup *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 776)) = Xsqlite3_total_changes *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 784)) = Xsqlite3_trace *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 792)) = Xsqlite3_transfer_bindings *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 800)) = Xsqlite3_update_hook *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 808)) = Xsqlite3_user_data *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 816)) = Xsqlite3_value_blob *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 824)) = Xsqlite3_value_bytes *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 832)) = Xsqlite3_value_bytes16 *(*func(*libc.TLS, uintptr) float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 840)) = Xsqlite3_value_double *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 848)) = Xsqlite3_value_int *(*func(*libc.TLS, uintptr) Sqlite_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 856)) = Xsqlite3_value_int64 *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 864)) = Xsqlite3_value_numeric_type *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 872)) = Xsqlite3_value_text *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 880)) = Xsqlite3_value_text16 *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 888)) = Xsqlite3_value_text16be *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 896)) = Xsqlite3_value_text16le *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 904)) = Xsqlite3_value_type *(*func(*libc.TLS, uintptr, Va_list) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 912)) = Xsqlite3_vmprintf *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 920)) = Xsqlite3_overload_function *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 928)) = Xsqlite3_prepare_v2 *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 936)) = Xsqlite3_prepare16_v2 *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 944)) = Xsqlite3_clear_bindings *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 952)) = Xsqlite3_create_module_v2 *(*func(*libc.TLS, uintptr, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 960)) = Xsqlite3_bind_zeroblob *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 968)) = Xsqlite3_blob_bytes *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 976)) = Xsqlite3_blob_close *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr, Sqlite_int64, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 984)) = Xsqlite3_blob_open *(*func(*libc.TLS, uintptr, uintptr, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 992)) = Xsqlite3_blob_read *(*func(*libc.TLS, uintptr, uintptr, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1000)) = Xsqlite3_blob_write *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1008)) = Xsqlite3_create_collation_v2 *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1016)) = Xsqlite3_file_control *(*func(*libc.TLS, int32) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1024)) = Xsqlite3_memory_highwater *(*func(*libc.TLS) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1032)) = Xsqlite3_memory_used *(*func(*libc.TLS, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1040)) = Xsqlite3_mutex_alloc *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1048)) = Xsqlite3_mutex_enter *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1056)) = Xsqlite3_mutex_free *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1064)) = Xsqlite3_mutex_leave *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1072)) = Xsqlite3_mutex_try *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1080)) = Xsqlite3_open_v2 *(*func(*libc.TLS, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1088)) = Xsqlite3_release_memory *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1096)) = Xsqlite3_result_error_nomem *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1104)) = Xsqlite3_result_error_toobig *(*func(*libc.TLS, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1112)) = Xsqlite3_sleep *(*func(*libc.TLS, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1120)) = Xsqlite3_soft_heap_limit *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1128)) = Xsqlite3_vfs_find *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1136)) = Xsqlite3_vfs_register *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1144)) = Xsqlite3_vfs_unregister *(*func(*libc.TLS) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1152)) = Xsqlite3_threadsafe *(*func(*libc.TLS, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1160)) = Xsqlite3_result_zeroblob *(*func(*libc.TLS, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1168)) = Xsqlite3_result_error_code *(*func(*libc.TLS, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1176)) = Xsqlite3_test_control *(*func(*libc.TLS, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1184)) = Xsqlite3_randomness *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1192)) = Xsqlite3_context_db_handle *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1200)) = Xsqlite3_extended_result_codes *(*func(*libc.TLS, uintptr, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1208)) = Xsqlite3_limit *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1216)) = Xsqlite3_next_stmt *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1224)) = Xsqlite3_sql *(*func(*libc.TLS, int32, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1232)) = Xsqlite3_status *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1240)) = Xsqlite3_backup_finish *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1248)) = Xsqlite3_backup_init *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1256)) = Xsqlite3_backup_pagecount *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1264)) = Xsqlite3_backup_remaining *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1272)) = Xsqlite3_backup_step *(*func(*libc.TLS, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1280)) = Xsqlite3_compileoption_get *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1288)) = Xsqlite3_compileoption_used *(*func(*libc.TLS, uintptr, uintptr, int32, int32, uintptr, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1296)) = Xsqlite3_create_function_v2 *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1304)) = Xsqlite3_db_config *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1312)) = Xsqlite3_db_mutex *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1320)) = Xsqlite3_db_status *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1328)) = Xsqlite3_extended_errcode *(*func(*libc.TLS, int32, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1336)) = Xsqlite3_log *(*func(*libc.TLS, Sqlite3_int64) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1344)) = Xsqlite3_soft_heap_limit64 *(*func(*libc.TLS) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1352)) = Xsqlite3_sourceid *(*func(*libc.TLS, uintptr, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1360)) = Xsqlite3_stmt_status *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1368)) = Xsqlite3_strnicmp *(*func(*libc.TLS, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1376)) = Xsqlite3_unlock_notify *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1384)) = Xsqlite3_wal_autocheckpoint *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1392)) = Xsqlite3_wal_checkpoint *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1400)) = Xsqlite3_wal_hook *(*func(*libc.TLS, uintptr, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1408)) = Xsqlite3_blob_reopen *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1416)) = Xsqlite3_vtab_config *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1424)) = Xsqlite3_vtab_on_conflict *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1432)) = Xsqlite3_close_v2 *(*func(*libc.TLS, uintptr, uintptr) Sqlite3_filename)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1440)) = Xsqlite3_db_filename *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1448)) = Xsqlite3_db_readonly *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1456)) = Xsqlite3_db_release_memory *(*func(*libc.TLS, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1464)) = Xsqlite3_errstr *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1472)) = Xsqlite3_stmt_busy *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1480)) = Xsqlite3_stmt_readonly *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1488)) = Xsqlite3_stricmp *(*func(*libc.TLS, Sqlite3_filename, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1496)) = Xsqlite3_uri_boolean *(*func(*libc.TLS, Sqlite3_filename, uintptr, Sqlite3_int64) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1504)) = Xsqlite3_uri_int64 *(*func(*libc.TLS, Sqlite3_filename, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1512)) = Xsqlite3_uri_parameter *(*func(*libc.TLS, int32, uintptr, uintptr, Va_list) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1520)) = Xsqlite3_vsnprintf *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1528)) = Xsqlite3_wal_checkpoint_v2 *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1536)) = Xsqlite3_auto_extension *(*func(*libc.TLS, uintptr, int32, uintptr, Sqlite3_uint64, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1544)) = Xsqlite3_bind_blob64 *(*func(*libc.TLS, uintptr, int32, uintptr, Sqlite3_uint64, uintptr, uint8) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1552)) = Xsqlite3_bind_text64 *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1560)) = Xsqlite3_cancel_auto_extension *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1568)) = Xsqlite3_load_extension *(*func(*libc.TLS, Sqlite3_uint64) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1576)) = Xsqlite3_malloc64 *(*func(*libc.TLS, uintptr) Sqlite3_uint64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1584)) = Xsqlite3_msize *(*func(*libc.TLS, uintptr, Sqlite3_uint64) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1592)) = Xsqlite3_realloc64 *(*func(*libc.TLS))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1600)) = Xsqlite3_reset_auto_extension *(*func(*libc.TLS, uintptr, uintptr, Sqlite3_uint64, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1608)) = Xsqlite3_result_blob64 *(*func(*libc.TLS, uintptr, uintptr, Sqlite3_uint64, uintptr, uint8))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1616)) = Xsqlite3_result_text64 *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1624)) = Xsqlite3_strglob *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1632)) = *(*uintptr)(unsafe.Pointer(&struct { f func(*libc.TLS, uintptr) uintptr }{Xsqlite3_value_dup})) *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1640)) = Xsqlite3_value_free *(*func(*libc.TLS, uintptr, U64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1648)) = Xsqlite3_result_zeroblob64 *(*func(*libc.TLS, uintptr, int32, Sqlite3_uint64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1656)) = Xsqlite3_bind_zeroblob64 *(*func(*libc.TLS, uintptr) uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1664)) = Xsqlite3_value_subtype *(*func(*libc.TLS, uintptr, uint32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1672)) = Xsqlite3_result_subtype *(*func(*libc.TLS, int32, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1680)) = Xsqlite3_status64 *(*func(*libc.TLS, uintptr, uintptr, uint32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1688)) = Xsqlite3_strlike *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1696)) = Xsqlite3_db_cacheflush *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1704)) = Xsqlite3_system_errno *(*func(*libc.TLS, uintptr, uint32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1712)) = Xsqlite3_trace_v2 *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1720)) = Xsqlite3_expanded_sql *(*func(*libc.TLS, uintptr, Sqlite3_int64))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1728)) = Xsqlite3_set_last_insert_rowid *(*func(*libc.TLS, uintptr, uintptr, int32, uint32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1736)) = Xsqlite3_prepare_v3 *(*func(*libc.TLS, uintptr, uintptr, int32, uint32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1744)) = Xsqlite3_prepare16_v3 *(*func(*libc.TLS, uintptr, int32, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1752)) = Xsqlite3_bind_pointer *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1760)) = Xsqlite3_result_pointer *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1768)) = Xsqlite3_value_pointer *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1776)) = Xsqlite3_vtab_nochange *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1784)) = Xsqlite3_value_nochange *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1792)) = Xsqlite3_vtab_collation *(*func(*libc.TLS) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1800)) = Xsqlite3_keyword_count *(*func(*libc.TLS, int32, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1808)) = Xsqlite3_keyword_name *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1816)) = Xsqlite3_keyword_check *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1824)) = Xsqlite3_str_new *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1832)) = Xsqlite3_str_finish *(*func(*libc.TLS, uintptr, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1840)) = Xsqlite3_str_appendf *(*func(*libc.TLS, uintptr, uintptr, Va_list))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1848)) = Xsqlite3_str_vappendf *(*func(*libc.TLS, uintptr, uintptr, int32))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1856)) = Xsqlite3_str_append *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1864)) = Xsqlite3_str_appendall *(*func(*libc.TLS, uintptr, int32, int8))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1872)) = Xsqlite3_str_appendchar *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1880)) = Xsqlite3_str_reset *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1888)) = Xsqlite3_str_errcode *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1896)) = Xsqlite3_str_length *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1904)) = Xsqlite3_str_value *(*func(*libc.TLS, uintptr, uintptr, int32, int32, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1912)) = Xsqlite3_create_window_function *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1928)) = Xsqlite3_stmt_isexplain *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1936)) = Xsqlite3_value_frombind *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1944)) = Xsqlite3_drop_modules *(*func(*libc.TLS, Sqlite3_int64) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1952)) = Xsqlite3_hard_heap_limit64 *(*func(*libc.TLS, Sqlite3_filename, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1960)) = Xsqlite3_uri_key *(*func(*libc.TLS, Sqlite3_filename) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1968)) = Xsqlite3_filename_database *(*func(*libc.TLS, Sqlite3_filename) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1976)) = Xsqlite3_filename_journal *(*func(*libc.TLS, Sqlite3_filename) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1984)) = Xsqlite3_filename_wal *(*func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) Sqlite3_filename)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 1992)) = Xsqlite3_create_filename *(*func(*libc.TLS, Sqlite3_filename))(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2000)) = Xsqlite3_free_filename *(*func(*libc.TLS, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2008)) = Xsqlite3_database_file_object *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2016)) = Xsqlite3_txn_state *(*func(*libc.TLS, uintptr) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2024)) = Xsqlite3_changes64 *(*func(*libc.TLS, uintptr) Sqlite3_int64)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2032)) = Xsqlite3_total_changes64 *(*func(*libc.TLS, uintptr, uintptr, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2040)) = Xsqlite3_autovacuum_pages *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2048)) = Xsqlite3_error_offset *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2056)) = Xsqlite3_vtab_rhs_value *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2064)) = Xsqlite3_vtab_distinct *(*func(*libc.TLS, uintptr, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2072)) = Xsqlite3_vtab_in *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2080)) = Xsqlite3_vtab_in_first *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2088)) = Xsqlite3_vtab_in_next *(*func(*libc.TLS, uintptr, uintptr, uintptr, Sqlite3_int64, Sqlite3_int64, uint32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2096)) = Xsqlite3_deserialize *(*func(*libc.TLS, uintptr, uintptr, uintptr, uint32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2104)) = Xsqlite3_serialize *(*func(*libc.TLS, uintptr, int32) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2112)) = Xsqlite3_db_name *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2120)) = Xsqlite3_value_encoding *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3Apis)) + 2128)) = Xsqlite3_is_interrupted *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3BuiltinExtensions)) + 0)) = Xsqlite3Fts5Init *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3BuiltinExtensions)) + 8)) = Xsqlite3RtreeInit *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3BuiltinExtensions)) + 16)) = sqlite3TestExtInit *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&sqlite3BuiltinExtensions)) + 24)) = Xsqlite3JsonTableFunctions *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&statGetFuncdef)) + 24)) = statGet *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&statInitFuncdef)) + 24)) = statInit *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&statPushFuncdef)) + 24)) = statPush *(*func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 40)) = rbuVfsOpen *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 48)) = rbuVfsDelete *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 56)) = rbuVfsAccess *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 64)) = rbuVfsFullPathname *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 72)) = rbuVfsDlOpen *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 80)) = rbuVfsDlError *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 88)) = rbuVfsDlSym *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 96)) = rbuVfsDlClose *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 104)) = rbuVfsRandomness *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 112)) = rbuVfsSleep *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 120)) = rbuVfsCurrentTime *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&vfs_template)) + 128)) = rbuVfsGetLastError *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winAppData)) + 0)) = uintptr(unsafe.Pointer(&winIoMethod)) *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 8)) = winClose *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 16)) = winRead *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 24)) = winWrite *(*func(*libc.TLS, uintptr, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 32)) = winTruncate *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 40)) = winSync *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 48)) = winFileSize *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 56)) = winLock *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 64)) = winUnlock *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 72)) = winCheckReservedLock *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 80)) = winFileControl *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 88)) = winSectorSize *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 96)) = winDeviceCharacteristics *(*func(*libc.TLS, uintptr, int32, int32, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 104)) = winShmMap *(*func(*libc.TLS, uintptr, int32, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 112)) = winShmLock *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 120)) = winShmBarrier *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 128)) = winShmUnmap *(*func(*libc.TLS, uintptr, I64, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 136)) = winFetch *(*func(*libc.TLS, uintptr, I64, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoMethod)) + 144)) = winUnfetch *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 8)) = winClose *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 16)) = winRead *(*func(*libc.TLS, uintptr, uintptr, int32, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 24)) = winWrite *(*func(*libc.TLS, uintptr, Sqlite3_int64) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 32)) = winTruncate *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 40)) = winSync *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 48)) = winFileSize *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 56)) = winNolockLock *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 64)) = winNolockUnlock *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 72)) = winNolockCheckReservedLock *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 80)) = winFileControl *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 88)) = winSectorSize *(*func(*libc.TLS, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 96)) = winDeviceCharacteristics *(*func(*libc.TLS, uintptr, int32, int32, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 104)) = winShmMap *(*func(*libc.TLS, uintptr, int32, int32, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 112)) = winShmLock *(*func(*libc.TLS, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 120)) = winShmBarrier *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 128)) = winShmUnmap *(*func(*libc.TLS, uintptr, I64, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 136)) = winFetch *(*func(*libc.TLS, uintptr, I64, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winIoNolockMethod)) + 144)) = winUnfetch *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 32)) = uintptr(unsafe.Pointer(&winNolockAppData)) *(*func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 40)) = winOpen *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 48)) = winDelete *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 56)) = winAccess *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 64)) = winFullPathname *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 72)) = winDlOpen *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 80)) = winDlError *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 88)) = winDlSym *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 96)) = winDlClose *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 104)) = winRandomness *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 112)) = winSleep *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 120)) = winCurrentTime *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 128)) = winGetLastError *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 136)) = winCurrentTimeInt64 *(*func(*libc.TLS, uintptr, uintptr, Sqlite3_syscall_ptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 144)) = winSetSystemCall *(*func(*libc.TLS, uintptr, uintptr) Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 152)) = winGetSystemCall *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathNolockVfs)) + 160)) = winNextSystemCall *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 32)) = uintptr(unsafe.Pointer(&winAppData)) *(*func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 40)) = winOpen *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 48)) = winDelete *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 56)) = winAccess *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 64)) = winFullPathname *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 72)) = winDlOpen *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 80)) = winDlError *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 88)) = winDlSym *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 96)) = winDlClose *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 104)) = winRandomness *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 112)) = winSleep *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 120)) = winCurrentTime *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 128)) = winGetLastError *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 136)) = winCurrentTimeInt64 *(*func(*libc.TLS, uintptr, uintptr, Sqlite3_syscall_ptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 144)) = winSetSystemCall *(*func(*libc.TLS, uintptr, uintptr) Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 152)) = winGetSystemCall *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winLongPathVfs)) + 160)) = winNextSystemCall *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockAppData)) + 0)) = uintptr(unsafe.Pointer(&winIoNolockMethod)) *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 32)) = uintptr(unsafe.Pointer(&winNolockAppData)) *(*func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 40)) = winOpen *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 48)) = winDelete *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 56)) = winAccess *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 64)) = winFullPathname *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 72)) = winDlOpen *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 80)) = winDlError *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 88)) = winDlSym *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 96)) = winDlClose *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 104)) = winRandomness *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 112)) = winSleep *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 120)) = winCurrentTime *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 128)) = winGetLastError *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 136)) = winCurrentTimeInt64 *(*func(*libc.TLS, uintptr, uintptr, Sqlite3_syscall_ptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 144)) = winSetSystemCall *(*func(*libc.TLS, uintptr, uintptr) Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 152)) = winGetSystemCall *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winNolockVfs)) + 160)) = winNextSystemCall *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 32)) = uintptr(unsafe.Pointer(&winAppData)) *(*func(*libc.TLS, uintptr, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 40)) = winOpen *(*func(*libc.TLS, uintptr, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 48)) = winDelete *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 56)) = winAccess *(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 64)) = winFullPathname *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 72)) = winDlOpen *(*func(*libc.TLS, uintptr, int32, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 80)) = winDlError *(*func(*libc.TLS, uintptr, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 88)) = winDlSym *(*func(*libc.TLS, uintptr, uintptr))(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 96)) = winDlClose *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 104)) = winRandomness *(*func(*libc.TLS, uintptr, int32) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 112)) = winSleep *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 120)) = winCurrentTime *(*func(*libc.TLS, uintptr, int32, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 128)) = winGetLastError *(*func(*libc.TLS, uintptr, uintptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 136)) = winCurrentTimeInt64 *(*func(*libc.TLS, uintptr, uintptr, Sqlite3_syscall_ptr) int32)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 144)) = winSetSystemCall *(*func(*libc.TLS, uintptr, uintptr) Sqlite3_syscall_ptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 152)) = winGetSystemCall *(*func(*libc.TLS, uintptr, uintptr) uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&winVfs)) + 160)) = winNextSystemCall } var ts1 = "3.41.2\x00ATOMIC_INTRINSICS=1\x00COMPILER=msvc-1900\x00DEFAULT_AUTOVACUUM\x00DEFAULT_CACHE_SIZE=-2000\x00DEFAULT_FILE_FORMAT=4\x00DEFAULT_JOURNAL_SIZE_LIMIT=-1\x00DEFAULT_MEMSTATUS=0\x00DEFAULT_MMAP_SIZE=0\x00DEFAULT_PAGE_SIZE=4096\x00DEFAULT_PCACHE_INITSZ=20\x00DEFAULT_RECURSIVE_TRIGGERS\x00DEFAULT_SECTOR_SIZE=4096\x00DEFAULT_SYNCHRONOUS=2\x00DEFAULT_WAL_AUTOCHECKPOINT=1000\x00DEFAULT_WAL_SYNCHRONOUS=2\x00DEFAULT_WORKER_THREADS=0\x00ENABLE_COLUMN_METADATA\x00ENABLE_FTS5\x00ENABLE_GEOPOLY\x00ENABLE_MATH_FUNCTIONS\x00ENABLE_MEMORY_MANAGEMENT\x00ENABLE_OFFSET_SQL_FUNC\x00ENABLE_PREUPDATE_HOOK\x00ENABLE_RBU\x00ENABLE_RTREE\x00ENABLE_SESSION\x00ENABLE_SNAPSHOT\x00ENABLE_STAT4\x00ENABLE_UNLOCK_NOTIFY\x00LIKE_DOESNT_MATCH_BLOBS\x00MALLOC_SOFT_LIMIT=1024\x00MAX_ATTACHED=10\x00MAX_COLUMN=2000\x00MAX_COMPOUND_SELECT=500\x00MAX_DEFAULT_PAGE_SIZE=8192\x00MAX_EXPR_DEPTH=1000\x00MAX_FUNCTION_ARG=127\x00MAX_LENGTH=1000000000\x00MAX_LIKE_PATTERN_LENGTH=50000\x00MAX_MMAP_SIZE=0x7fff0000\x00MAX_PAGE_COUNT=1073741823\x00MAX_PAGE_SIZE=65536\x00MAX_SQL_LENGTH=1000000000\x00MAX_TRIGGER_DEPTH=1000\x00MAX_VARIABLE_NUMBER=32766\x00MAX_VDBE_OP=250000000\x00MAX_WORKER_THREADS=8\x00MUTEX_NOOP\x00SOUNDEX\x00SYSTEM_MALLOC\x00TEMP_STORE=1\x00THREADSAFE=1\x00BINARY\x00ANY\x00BLOB\x00INT\x00INTEGER\x00REAL\x00TEXT\x0020b:20e\x0020c:20e\x0020e\x0040f-21a-21d\x00now\x00local time unavailable\x00second\x00minute\x00hour\x00\x00\x00day\x00\x00\x00\x00month\x00\x00year\x00\x00\x00auto\x00julianday\x00localtime\x00unixepoch\x00utc\x00weekday \x00start of \x00month\x00year\x00day\x00%02d\x00%06.3f\x00%03d\x00%.16g\x00%lld\x00%04d\x00date\x00time\x00datetime\x00strftime\x00current_time\x00current_timestamp\x00current_date\x00failed to allocate %u bytes of memory\x00failed memory resize %u to %u bytes\x00out of memory\x000123456789ABCDEF0123456789abcdef\x00-x0\x00X0\x00%\x00NaN\x00Inf\x00\x00NULL\x00(NULL)\x00.\x00(join-%u)\x00(subquery-%u)\x00thstndrd\x00922337203685477580\x00API call with %s database connection pointer\x00unopened\x00invalid\x00Savepoint\x00AutoCommit\x00Transaction\x00Checkpoint\x00JournalMode\x00Vacuum\x00VFilter\x00VUpdate\x00Init\x00Goto\x00Gosub\x00InitCoroutine\x00Yield\x00MustBeInt\x00Jump\x00Once\x00If\x00IfNot\x00IsType\x00Not\x00IfNullRow\x00SeekLT\x00SeekLE\x00SeekGE\x00SeekGT\x00IfNotOpen\x00IfNoHope\x00NoConflict\x00NotFound\x00Found\x00SeekRowid\x00NotExists\x00Last\x00IfSmaller\x00SorterSort\x00Sort\x00Rewind\x00SorterNext\x00Prev\x00Next\x00IdxLE\x00IdxGT\x00IdxLT\x00Or\x00And\x00IdxGE\x00RowSetRead\x00RowSetTest\x00Program\x00FkIfZero\x00IsNull\x00NotNull\x00Ne\x00Eq\x00Gt\x00Le\x00Lt\x00Ge\x00ElseEq\x00IfPos\x00IfNotZero\x00DecrJumpZero\x00IncrVacuum\x00VNext\x00Filter\x00PureFunc\x00Function\x00Return\x00EndCoroutine\x00HaltIfNull\x00Halt\x00Integer\x00Int64\x00String\x00BeginSubrtn\x00Null\x00SoftNull\x00Blob\x00Variable\x00Move\x00Copy\x00SCopy\x00IntCopy\x00FkCheck\x00ResultRow\x00CollSeq\x00AddImm\x00RealAffinity\x00Cast\x00Permutation\x00Compare\x00IsTrue\x00ZeroOrNull\x00Offset\x00Column\x00TypeCheck\x00Affinity\x00MakeRecord\x00Count\x00ReadCookie\x00SetCookie\x00ReopenIdx\x00BitAnd\x00BitOr\x00ShiftLeft\x00ShiftRight\x00Add\x00Subtract\x00Multiply\x00Divide\x00Remainder\x00Concat\x00OpenRead\x00OpenWrite\x00BitNot\x00OpenDup\x00OpenAutoindex\x00String8\x00OpenEphemeral\x00SorterOpen\x00SequenceTest\x00OpenPseudo\x00Close\x00ColumnsUsed\x00SeekScan\x00SeekHit\x00Sequence\x00NewRowid\x00Insert\x00RowCell\x00Delete\x00ResetCount\x00SorterCompare\x00SorterData\x00RowData\x00Rowid\x00NullRow\x00SeekEnd\x00IdxInsert\x00SorterInsert\x00IdxDelete\x00DeferredSeek\x00IdxRowid\x00FinishSeek\x00Destroy\x00Clear\x00ResetSorter\x00CreateBtree\x00SqlExec\x00ParseSchema\x00LoadAnalysis\x00DropTable\x00DropIndex\x00Real\x00DropTrigger\x00IntegrityCk\x00RowSetAdd\x00Param\x00FkCounter\x00MemMax\x00OffsetLimit\x00AggInverse\x00AggStep\x00AggStep1\x00AggValue\x00AggFinal\x00Expire\x00CursorLock\x00CursorUnlock\x00TableLock\x00VBegin\x00VCreate\x00VDestroy\x00VOpen\x00VInitIn\x00VColumn\x00VRename\x00Pagecount\x00MaxPgcnt\x00ClrSubtype\x00FilterAdd\x00Trace\x00CursorHint\x00ReleaseReg\x00Noop\x00Explain\x00Abortable\x00AreFileApisANSI\x00CharLowerW\x00CharUpperW\x00CloseHandle\x00CreateFileA\x00CreateFileW\x00CreateFileMappingA\x00CreateFileMappingW\x00CreateMutexW\x00DeleteFileA\x00DeleteFileW\x00FileTimeToLocalFileTime\x00FileTimeToSystemTime\x00FlushFileBuffers\x00FormatMessageA\x00FormatMessageW\x00FreeLibrary\x00GetCurrentProcessId\x00GetDiskFreeSpaceA\x00GetDiskFreeSpaceW\x00GetFileAttributesA\x00GetFileAttributesW\x00GetFileAttributesExW\x00GetFileSize\x00GetFullPathNameA\x00GetFullPathNameW\x00GetLastError\x00GetProcAddressA\x00GetSystemInfo\x00GetSystemTime\x00GetSystemTimeAsFileTime\x00GetTempPathA\x00GetTempPathW\x00GetTickCount\x00GetVersionExA\x00GetVersionExW\x00HeapAlloc\x00HeapCreate\x00HeapDestroy\x00HeapFree\x00HeapReAlloc\x00HeapSize\x00HeapValidate\x00HeapCompact\x00LoadLibraryA\x00LoadLibraryW\x00LocalFree\x00LockFile\x00LockFileEx\x00MapViewOfFile\x00MultiByteToWideChar\x00QueryPerformanceCounter\x00ReadFile\x00SetEndOfFile\x00SetFilePointer\x00Sleep\x00SystemTimeToFileTime\x00UnlockFile\x00UnlockFileEx\x00UnmapViewOfFile\x00WideCharToMultiByte\x00WriteFile\x00CreateEventExW\x00WaitForSingleObject\x00WaitForSingleObjectEx\x00SetFilePointerEx\x00GetFileInformationByHandleEx\x00MapViewOfFileFromApp\x00CreateFile2\x00LoadPackagedLibrary\x00GetTickCount64\x00GetNativeSystemInfo\x00OutputDebugStringA\x00OutputDebugStringW\x00GetProcessHeap\x00CreateFileMappingFromApp\x00InterlockedCompareExchange\x00UuidCreate\x00UuidCreateSequential\x00FlushViewOfFile\x00%s\x00OsError 0x%lx (%lu)\x00os_win.c:%d: (%lu) %s(%s) - %s\x00delayed %dms for lock/sharing conflict at line %d\x00winSeekFile\x00winClose\x00winRead\x00winWrite1\x00winWrite2\x00winTruncate1\x00winTruncate2\x00winSync1\x00winSync2\x00winFileSize\x00winUnlockReadLock\x00winUnlock\x00winLockSharedMemory\x00%s-shm\x00readonly_shm\x00winOpenShm\x00winShmMap1\x00winShmMap2\x00winShmMap3\x00winUnmapfile1\x00winUnmapfile2\x00winMapfile1\x00winMapfile2\x00etilqs_\x00winGetTempname1\x00winGetTempname2\x00winGetTempname3\x00winGetTempname4\x00winGetTempname5\x00abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\x00exclusive\x00winOpen\x00psow\x00winDelete\x00winAccess\x00%s%c%s\x00winFullPathname1\x00winFullPathname2\x00winFullPathname3\x00winFullPathname4\x00win32\x00win32-longpath\x00win32-none\x00win32-longpath-none\x00memdb\x00memdb(%p,%lld)\x00PRAGMA \"%w\".page_count\x00ATTACH x AS %Q\x00recovered %d pages from %s\x00-journal\x00-wal\x00nolock\x00immutable\x00PRAGMA table_list\x00recovered %d frames from WAL file %s\x00cannot limit WAL size: %s\x00SQLite format 3\x00:memory:\x00@ \x00\n\x00invalid page number %d\x002nd reference to page %d\x00Failed to read ptrmap key=%d\x00Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)\x00failed to get page %d\x00freelist leaf count too big on page %d\x00%s is %d but should be %d\x00size\x00overflow list length\x00Page %u: \x00unable to get the page. error code=%d\x00btreeInitPage() returns error code %d\x00free space corruption\x00On tree page %u cell %d: \x00On page %u at right child: \x00Offset %d out of range %d..%d\x00Extends off end of page\x00Rowid %lld out of order\x00Child page depth differs\x00Multiple uses for byte %u of page %u\x00Fragmentation of %d bytes reported as %d on page %u\x00Main freelist: \x00max rootpage (%d) disagrees with header (%d)\x00incremental_vacuum enabled with a max rootpage of zero\x00Page %d is never used\x00Pointer map page %d is referenced\x00unknown database %s\x00destination database is in use\x00source and destination must be distinct\x00%!.15g\x00-\x00%s%s\x00k(%d\x00B\x00,%s%s%s\x00N.\x00)\x00%.18s-%s\x00%s(%d)\x00%d\x00(blob)\x00vtab:%p\x00%c%u\x00]\x00program\x00?\x008\x0016LE\x0016BE\x00addr\x00opcode\x00p1\x00p2\x00p3\x00p4\x00p5\x00comment\x00id\x00parent\x00notused\x00detail\x00%.4c%s%.16c\x00MJ delete: %s\x00MJ collide: %s\x00-mj%06X9%02X\x00FOREIGN KEY constraint failed\x00a CHECK constraint\x00a generated column\x00an index\x00non-deterministic use of %s() in %s\x00API called with finalized prepared statement\x00API called with NULL prepared statement\x00string or blob too big\x00bind on a busy prepared statement: [%s]\x00-- \x00'%.*q'\x00zeroblob(%d)\x00x'\x00%02x\x00'\x00%s constraint failed\x00%z: %s\x00abort at %d in [%s]: %s\x00cannot store %s value in %s column %s.%s\x00cannot open savepoint - SQL statements in progress\x00no such savepoint: %s\x00cannot release savepoint - SQL statements in progress\x00cannot commit transaction - SQL statements in progress\x00cannot start a transaction within a transaction\x00cannot rollback - no transaction is active\x00cannot commit - no transaction is active\x00database schema has changed\x00index corruption\x00sqlite_master\x00SELECT*FROM\"%w\".%s WHERE %s ORDER BY rowid\x00too many levels of trigger recursion\x00cannot change %s wal mode from within a transaction\x00into\x00out of\x00database table is locked: %s\x00ValueList\x00-- %s\x00statement aborts at %d: [%s] %s\x00NOT NULL\x00UNIQUE\x00CHECK\x00FOREIGN KEY\x00cannot open value of type %s\x00null\x00real\x00integer\x00no such rowid: %lld\x00cannot open virtual table: %s\x00cannot open table without rowid: %s\x00cannot open view: %s\x00no such column: \"%s\"\x00foreign key\x00indexed\x00cannot open %s column for writing\x00sqlite_\x00sqlite_temp_master\x00sqlite_temp_schema\x00sqlite_schema\x00main\x00*\x00new\x00old\x00excluded\x00misuse of aliased aggregate %s\x00misuse of aliased window function %s\x00row value misused\x00double-quoted string literal: \"%w\"\x00coalesce\x00no such column\x00ambiguous column name\x00%s: %s.%s.%s\x00%s: %s.%s\x00%s: %s\x00partial index WHERE clauses\x00index expressions\x00CHECK constraints\x00generated columns\x00%s prohibited in %s\x00the \".\" operator\x00second argument to %#T() must be a constant between 0.0 and 1.0\x00not authorized to use function: %#T\x00non-deterministic functions\x00%#T() may not be used as a window function\x00window\x00aggregate\x00misuse of %s function %#T()\x00no such function: %#T\x00wrong number of arguments to function %#T()\x00FILTER may not be used with non-aggregate %#T()\x00subqueries\x00parameters\x00%r %s BY term out of range - should be between 1 and %d\x00too many terms in ORDER BY clause\x00ORDER\x00%r ORDER BY term does not match any column in the result set\x00too many terms in %s BY clause\x00HAVING clause on a non-aggregate query\x00GROUP\x00aggregate functions are not allowed in the GROUP BY clause\x00Expression tree is too large (maximum depth %d)\x00IN(...) element has %d term%s - expected %d\x00s\x000\x00too many arguments on function %T\x00unsafe use of %#T()\x00variable number must be between ?1 and ?%d\x00too many SQL variables\x00%d columns assigned %d values\x00too many columns in %s\x00true\x00false\x00_ROWID_\x00ROWID\x00OID\x00USING ROWID SEARCH ON TABLE %s FOR IN-OPERATOR\x00USING INDEX %s FOR IN-OPERATOR\x00sub-select returns %d columns - expected %d\x00REUSE LIST SUBQUERY %d\x00%sLIST SUBQUERY %d\x00CORRELATED \x00REUSE SUBQUERY %d\x00%sSCALAR SUBQUERY %d\x001\x000x\x00hex literal too big: %s%#T\x00generated column loop on \"%s\"\x00blob\x00text\x00numeric\x00flexnum\x00none\x00misuse of aggregate: %#T()\x00unknown function: %#T()\x00RAISE() may only be used within a trigger-program\x00B\x00C\x00D\x00E\x00F\x00table %s may not be altered\x00SELECT 1 FROM \"%w\".sqlite_master WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%' AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL \x00SELECT 1 FROM temp.sqlite_master WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%' AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL \x00UPDATE \"%w\".sqlite_master SET sql = sqlite_rename_quotefix(%Q, sql)WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%'\x00UPDATE temp.sqlite_master SET sql = sqlite_rename_quotefix('temp', sql)WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%'\x00there is already another table or index with this name: %s\x00table\x00view %s may not be altered\x00UPDATE \"%w\".sqlite_master SET sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'\x00UPDATE %Q.sqlite_master SET tbl_name = %Q, name = CASE WHEN type='table' THEN %Q WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' AND type='index' THEN 'sqlite_autoindex_' || %Q || substr(name,%d+18) ELSE name END WHERE tbl_name=%Q COLLATE nocase AND (type='table' OR type='index' OR type='trigger');\x00sqlite_sequence\x00UPDATE \"%w\".sqlite_sequence set name = %Q WHERE name = %Q\x00UPDATE sqlite_temp_schema SET sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, 1), tbl_name = CASE WHEN tbl_name=%Q COLLATE nocase AND sqlite_rename_test(%Q, sql, type, name, 1, 'after rename', 0) THEN %Q ELSE tbl_name END WHERE type IN ('view', 'trigger')\x00after rename\x00SELECT raise(ABORT,%Q) FROM \"%w\".\"%w\"\x00Cannot add a PRIMARY KEY column\x00Cannot add a UNIQUE column\x00Cannot add a REFERENCES column with non-NULL default value\x00Cannot add a NOT NULL column with default value NULL\x00Cannot add a column with non-constant default\x00cannot add a STORED column\x00UPDATE \"%w\".sqlite_master SET sql = printf('%%.%ds, ',sql) || %Q || substr(sql,1+length(printf('%%.%ds',sql))) WHERE type = 'table' AND name = %Q\x00SELECT CASE WHEN quick_check GLOB 'CHECK*' THEN raise(ABORT,'CHECK constraint failed') ELSE raise(ABORT,'NOT NULL constraint failed') END FROM pragma_quick_check(%Q,%Q) WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'\x00virtual tables may not be altered\x00Cannot add a column to a view\x00sqlite_altertab_%s\x00view\x00virtual table\x00cannot %s %s \"%s\"\x00drop column from\x00rename columns of\x00no such column: \"%T\"\x00UPDATE \"%w\".sqlite_master SET sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND (type != 'index' OR tbl_name = %Q)\x00UPDATE temp.sqlite_master SET sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) WHERE type IN ('trigger', 'view')\x00error in %s %s%s%s: %s\x00 \x00CREATE \x00\"%w\" \x00%Q%s\x00%.*s%s\x00cannot drop %s column: \"%s\"\x00PRIMARY KEY\x00cannot drop column \"%s\": no other columns exist\x00UPDATE \"%w\".sqlite_master SET sql = sqlite_drop_column(%d, sql, %d) WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)\x00after drop column\x00sqlite_rename_column\x00sqlite_rename_table\x00sqlite_rename_test\x00sqlite_drop_column\x00sqlite_rename_quotefix\x00CREATE TABLE %Q.%s(%s)\x00DELETE FROM %Q.%s WHERE %s=%Q\x00DELETE FROM %Q.%s\x00sqlite_stat1\x00tbl,idx,stat\x00sqlite_stat4\x00tbl,idx,neq,nlt,ndlt,sample\x00sqlite_stat3\x00stat_init\x00stat_push\x00%llu\x00 %llu\x00%llu \x00stat_get\x00sqlite\\_%\x00BBB\x00idx\x00tbl\x00unordered*\x00sz=[0-9]*\x00noskipscan*\x00SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx\x00SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4\x00SELECT tbl,idx,stat FROM %Q.sqlite_stat1\x00x\x00\x00too many attached databases - max %d\x00database %s is already in use\x00database is already attached\x00attached databases must use the same text encoding as main database\x00unable to open database: %s\x00no such database: %s\x00cannot detach database %s\x00database %s is locked\x00sqlite_detach\x00sqlite_attach\x00%s cannot use variables\x00%s %T cannot reference objects in database %s\x00authorizer malfunction\x00%s.%s\x00%s.%z\x00access to %z is prohibited\x00not authorized\x00pragma_\x00no such view\x00no such table\x00corrupt database\x00unknown database %T\x00object name reserved for internal use: %s\x00temporary table name must be unqualified\x00%s %T already exists\x00there is already an index named %s\x00sqlite_returning\x00cannot use RETURNING in a trigger\x00too many columns on %s\x00always\x00generated\x00duplicate column name: %s\x00default value of column [%s] is not constant\x00cannot use DEFAULT on a generated column\x00generated columns cannot be part of the PRIMARY KEY\x00table \"%s\" has more than one primary key\x00AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY\x00virtual tables cannot use computed columns\x00virtual\x00stored\x00error in generated column \"%s\"\x00,\x00\n \x00,\n \x00\n)\x00CREATE TABLE \x00 TEXT\x00 NUM\x00 INT\x00 REAL\x00unknown datatype for %s.%s: \"%s\"\x00missing datatype for %s.%s\x00AUTOINCREMENT not allowed on WITHOUT ROWID tables\x00PRIMARY KEY missing on table %s\x00must have at least one non-generated column\x00TABLE\x00VIEW\x00CREATE %s %.*s\x00UPDATE %Q.sqlite_master SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q WHERE rowid=#%d\x00CREATE TABLE %Q.sqlite_sequence(name,seq)\x00tbl_name='%q' AND type!='trigger'\x00parameters are not allowed in views\x00view %s is circularly defined\x00corrupt schema\x00UPDATE %Q.sqlite_master SET rootpage=%d WHERE #%d AND rootpage=#%d\x00sqlite_stat%d\x00DELETE FROM %Q.sqlite_sequence WHERE name=%Q\x00DELETE FROM %Q.sqlite_master WHERE tbl_name=%Q and type!='trigger'\x00stat\x00table %s may not be dropped\x00use DROP TABLE to delete table %s\x00use DROP VIEW to delete view %s\x00foreign key on %s should reference only one column of table %T\x00number of columns in foreign key does not match the number of columns in the referenced table\x00unknown column \"%s\" in foreign key definition\x00unsupported use of NULLS %s\x00FIRST\x00LAST\x00index\x00cannot create a TEMP index on non-TEMP table \"%s\"\x00table %s may not be indexed\x00views may not be indexed\x00virtual tables may not be indexed\x00there is already a table named %s\x00index %s already exists\x00sqlite_autoindex_%s_%d\x00expressions prohibited in PRIMARY KEY and UNIQUE constraints\x00conflicting ON CONFLICT clauses specified\x00invalid rootpage\x00CREATE%s INDEX %.*s\x00 UNIQUE\x00INSERT INTO %Q.sqlite_master VALUES('index',%Q,%Q,#%d,%Q);\x00name='%q' AND type='index'\x00no such index: %S\x00index associated with UNIQUE or PRIMARY KEY constraint cannot be dropped\x00DELETE FROM %Q.sqlite_master WHERE name=%Q AND type='index'\x00too many FROM clause terms, max: %d\x00a JOIN clause is required before %s\x00ON\x00USING\x00BEGIN\x00ROLLBACK\x00COMMIT\x00RELEASE\x00unable to open a temporary database file for storing temporary tables\x00index '%q'\x00, \x00%s.rowid\x00unable to identify the object to be reindexed\x00duplicate WITH table name: %s\x00no such collation sequence: %s\x00unsafe use of virtual table \"%s\"\x00table %s may not be modified\x00cannot modify %s because it is a view\x00rows deleted\x00integer overflow\x00%.*f\x00LIKE or GLOB pattern too complex\x00ESCAPE expression must be a single character\x00%!.20e\x00%Q\x00?000\x00MATCH\x00like\x00implies_nonnull_row\x00expr_compare\x00expr_implies_expr\x00affinity\x00soundex\x00load_extension\x00sqlite_compileoption_used\x00sqlite_compileoption_get\x00unlikely\x00likelihood\x00likely\x00sqlite_offset\x00ltrim\x00rtrim\x00trim\x00min\x00max\x00typeof\x00subtype\x00length\x00instr\x00printf\x00format\x00unicode\x00char\x00abs\x00round\x00upper\x00lower\x00hex\x00unhex\x00ifnull\x00random\x00randomblob\x00nullif\x00sqlite_version\x00sqlite_source_id\x00sqlite_log\x00quote\x00last_insert_rowid\x00changes\x00total_changes\x00replace\x00zeroblob\x00substr\x00substring\x00sum\x00total\x00avg\x00count\x00group_concat\x00glob\x00ceil\x00ceiling\x00floor\x00trunc\x00ln\x00log\x00log10\x00log2\x00exp\x00pow\x00power\x00mod\x00acos\x00asin\x00atan\x00atan2\x00cos\x00sin\x00tan\x00cosh\x00sinh\x00tanh\x00acosh\x00asinh\x00atanh\x00sqrt\x00radians\x00degrees\x00pi\x00sign\x00iif\x00foreign key mismatch - \"%w\" referencing \"%w\"\x00cannot INSERT into generated column \"%s\"\x00table %S has no column named %s\x00table %S has %d columns but %d values were supplied\x00%d values for %d columns\x00UPSERT not implemented for virtual table \"%s\"\x00cannot UPSERT a view\x00rows inserted\x00sqlite3_extension_init\x00sqlite3_\x00lib\x00_init\x00no entry point [%s] in shared library [%s]\x00error during initialization: %s\x00unable to open shared library [%.*s]\x00dll\x00automatic extension loading failed: %s\x00seq\x00from\x00to\x00on_update\x00on_delete\x00match\x00cid\x00name\x00type\x00notnull\x00dflt_value\x00pk\x00hidden\x00schema\x00ncol\x00wr\x00strict\x00seqno\x00desc\x00coll\x00key\x00builtin\x00enc\x00narg\x00flags\x00wdth\x00hght\x00flgs\x00unique\x00origin\x00partial\x00rowid\x00fkid\x00file\x00busy\x00checkpointed\x00database\x00status\x00cache_size\x00timeout\x00analysis_limit\x00application_id\x00auto_vacuum\x00automatic_index\x00busy_timeout\x00cache_spill\x00case_sensitive_like\x00cell_size_check\x00checkpoint_fullfsync\x00collation_list\x00compile_options\x00count_changes\x00data_store_directory\x00data_version\x00database_list\x00default_cache_size\x00defer_foreign_keys\x00empty_result_callbacks\x00encoding\x00foreign_key_check\x00foreign_key_list\x00foreign_keys\x00freelist_count\x00full_column_names\x00fullfsync\x00function_list\x00hard_heap_limit\x00ignore_check_constraints\x00incremental_vacuum\x00index_info\x00index_list\x00index_xinfo\x00integrity_check\x00journal_mode\x00journal_size_limit\x00legacy_alter_table\x00locking_mode\x00max_page_count\x00mmap_size\x00module_list\x00optimize\x00page_count\x00page_size\x00pragma_list\x00query_only\x00quick_check\x00read_uncommitted\x00recursive_triggers\x00reverse_unordered_selects\x00schema_version\x00secure_delete\x00short_column_names\x00shrink_memory\x00soft_heap_limit\x00synchronous\x00table_info\x00table_list\x00table_xinfo\x00temp_store\x00temp_store_directory\x00threads\x00trusted_schema\x00user_version\x00wal_autocheckpoint\x00wal_checkpoint\x00writable_schema\x00onoffalseyestruextrafull\x00normal\x00full\x00incremental\x00memory\x00temporary storage cannot be changed from within a transaction\x00SET NULL\x00SET DEFAULT\x00CASCADE\x00RESTRICT\x00NO ACTION\x00delete\x00persist\x00off\x00truncate\x00wal\x00w\x00a\x00sissii\x00utf8\x00utf16le\x00utf16be\x00-%T\x00fast\x00not a writable directory\x00Safety level may not be changed inside a transaction\x00reset\x00issisii\x00issisi\x00SELECT*FROM\"%w\"\x00shadow\x00sssiii\x00iisX\x00isiX\x00c\x00u\x00isisi\x00iss\x00is\x00iissssss\x00NONE\x00siX\x00*** in database %s ***\n\x00row not in PRIMARY KEY order for %s\x00NULL value in %s.%s\x00non-%s value in %s.%s\x00NUMERIC value in %s.%s\x00C\x00TEXT value in %s.%s\x00CHECK constraint failed in %s\x00row \x00 missing from index \x00rowid not at end-of-record for row \x00 of index \x00 values differ from index \x00non-unique entry in index \x00wrong # of entries in index \x00ok\x00unsupported encoding: %s\x00restart\x00ANALYZE \"%w\".\"%w\"\x00UTF8\x00UTF-8\x00UTF-16le\x00UTF-16be\x00UTF16le\x00UTF16be\x00UTF-16\x00UTF16\x00CREATE TABLE x\x00%c\"%s\"\x00(\"%s\"\x00,arg HIDDEN\x00,schema HIDDEN\x00PRAGMA \x00%Q.\x00=%Q\x00error in %s %s after %s: %s\x00malformed database schema (%s)\x00%z - %s\x00rename\x00drop column\x00add column\x00orphan index\x00CREATE TABLE x(type text,name text,tbl_name text,rootpage int,sql text)\x00unsupported file format\x00SELECT*FROM\"%w\".%s ORDER BY rowid\x00database schema is locked: %s\x00statement too long\x00unknown join type: %T%s%T%s%T\x00naturaleftouterightfullinnercross\x00a NATURAL join may not have an ON or USING clause\x00cannot join using column %s - column not present in both tables\x00ambiguous reference to %s in USING()\x00UNION ALL\x00INTERSECT\x00EXCEPT\x00UNION\x00USE TEMP B-TREE FOR %s\x00USE TEMP B-TREE FOR %sORDER BY\x00RIGHT PART OF \x00column%d\x00%.*z:%u\x00NUM\x00cannot use window functions in recursive queries\x00recursive aggregate queries not supported\x00SETUP\x00RECURSIVE STEP\x00SCAN %d CONSTANT ROW%s\x00S\x00COMPOUND QUERY\x00LEFT-MOST SUBQUERY\x00%s USING TEMP B-TREE\x00all VALUES must have the same number of terms\x00SELECTs to the left and right of %s do not have the same number of result columns\x00MERGE (%s)\x00LEFT\x00RIGHT\x00no such index: %s\x00'%s' is not a function\x00no such index: \"%s\"\x00multiple references to recursive table: %s\x00circular reference: %s\x00table %s has %d values for %d columns\x00multiple recursive references: %s\x00recursive reference in a subquery: %s\x00%!S\x00too many references to \"%s\": max 65535\x00access to view \"%s\" prohibited\x00..%s\x00%s.%s.%s\x00no such table: %s\x00no tables specified\x00too many columns in result set\x00DISTINCT aggregates must have exactly one argument\x00USE TEMP B-TREE FOR %s(DISTINCT)\x00SCAN %s%s%s\x00 USING COVERING INDEX \x00target object/alias may not appear in FROM clause: %s\x00expected %d columns for '%s' but got %d\x00CO-ROUTINE %!S\x00MATERIALIZE %!S\x00DISTINCT\x00GROUP BY\x00sqlite3_get_table() called with two or more incompatible queries\x00temporary trigger may not have qualified name\x00trigger\x00cannot create triggers on virtual tables\x00trigger %T already exists\x00cannot create trigger on system table\x00cannot create %s trigger on view: %S\x00BEFORE\x00AFTER\x00cannot create INSTEAD OF trigger on table: %S\x00trigger \"%s\" may not write to shadow table \"%s\"\x00INSERT INTO %Q.sqlite_master VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')\x00type='trigger' AND name='%q'\x00no such trigger: %S\x00DELETE FROM %Q.sqlite_master WHERE name=%Q AND type='trigger'\x00%s RETURNING is not available on virtual tables\x00DELETE\x00UPDATE\x00RETURNING may not use \"TABLE.*\" wildcards\x00-- TRIGGER %s\x00cannot UPDATE generated column \"%s\"\x00no such column: %s\x00rows updated\x00%r \x00%sON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint\x00CRE\x00INS\x00cannot VACUUM from within a transaction\x00cannot VACUUM - SQL statements in progress\x00non-text filename\x00ATTACH %Q AS vacuum_db\x00output file already exists\x00SELECT sql FROM \"%w\".sqlite_schema WHERE type='table'AND name<>'sqlite_sequence' AND coalesce(rootpage,1)>0\x00SELECT sql FROM \"%w\".sqlite_schema WHERE type='index'\x00SELECT'INSERT INTO vacuum_db.'||quote(name)||' SELECT*FROM\"%w\".'||quote(name)FROM vacuum_db.sqlite_schema WHERE type='table'AND coalesce(rootpage,1)>0\x00INSERT INTO vacuum_db.sqlite_schema SELECT*FROM \"%w\".sqlite_schema WHERE type IN('view','trigger') OR(type='table'AND rootpage=0)\x00CREATE VIRTUAL TABLE %T\x00UPDATE %Q.sqlite_master SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q WHERE rowid=#%d\x00name=%Q AND sql=%Q\x00vtable constructor called recursively: %s\x00vtable constructor failed: %s\x00vtable constructor did not declare schema: %s\x00no such module: %s\x00\x00 AND \x00(\x00 (\x00%s=?\x00ANY(%s)\x00>\x00<\x00%s %S\x00SEARCH\x00SCAN\x00AUTOMATIC PARTIAL COVERING INDEX\x00AUTOMATIC COVERING INDEX\x00COVERING INDEX %s\x00INDEX %s\x00 USING \x00 USING INTEGER PRIMARY KEY (%s\x00>? AND %s\x00%c?)\x00 VIRTUAL TABLE INDEX %d:%s\x00 LEFT-JOIN\x00BLOOM FILTER ON %S (\x00rowid=?\x00MULTI-INDEX OR\x00INDEX %d\x00RIGHT-JOIN %s\x00regexp\x00ON clause references tables to its right\x00NOCASE\x00too many arguments on %s() - max %d\x00automatic index on %s(%s)\x00auto-index\x00%s.xBestIndex malfunction\x00abbreviated query algorithm search\x00no query solution\x00at most %d tables in a join\x00SCAN CONSTANT ROW\x00second argument to nth_value must be a positive integer\x00argument of ntile must be a positive integer\x00row_number\x00dense_rank\x00rank\x00percent_rank\x00cume_dist\x00ntile\x00last_value\x00nth_value\x00first_value\x00lead\x00lag\x00no such window: %s\x00RANGE with offset PRECEDING/FOLLOWING requires one ORDER BY expression\x00FILTER clause may only be used with aggregate window functions\x00misuse of aggregate: %s()\x00unsupported frame specification\x00PARTITION clause\x00ORDER BY clause\x00frame specification\x00cannot override %s of window: %s\x00DISTINCT is not supported for window functions\x00frame starting offset must be a non-negative integer\x00frame ending offset must be a non-negative integer\x00frame starting offset must be a non-negative number\x00frame ending offset must be a non-negative number\x00%s clause should come after %s not before\x00ORDER BY\x00LIMIT\x00too many terms in compound SELECT\x00syntax error after column name \"%.*s\"\x00parser stack overflow\x00unknown table option: %.*s\x00set list\x00near \"%T\": syntax error\x00qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers\x00the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers\x00the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers\x00incomplete input\x00unrecognized token: \"%T\"\x00%s in \"%s\"\x00create\x00temp\x00temporary\x00end\x00explain\x00unable to close due to unfinalized statements or unfinished backups\x00unknown error\x00abort due to ROLLBACK\x00another row available\x00no more rows available\x00not an error\x00SQL logic error\x00access permission denied\x00query aborted\x00database is locked\x00database table is locked\x00attempt to write a readonly database\x00interrupted\x00disk I/O error\x00database disk image is malformed\x00unknown operation\x00database or disk is full\x00unable to open database file\x00locking protocol\x00constraint failed\x00datatype mismatch\x00bad parameter or other API misuse\x00authorization denied\x00column index out of range\x00file is not a database\x00notification message\x00warning message\x00unable to delete/modify user-function due to active statements\x00unable to use function %s in the requested context\x00unknown database: %s\x00unable to delete/modify collation sequence due to active statements\x00file:\x00localhost\x00invalid uri authority: %.*s\x00vfs\x00cache\x00mode\x00access\x00no such %s mode: %s\x00%s mode not allowed: %s\x00no such vfs: %s\x00shared\x00private\x00ro\x00rw\x00rwc\x00RTRIM\x00\x00\x00\x00%s at line %d of [%.10s]\x00database corruption\x00misuse\x00cannot open file\x00no such table column: %s.%s\x00SQLITE_\x00database is deadlocked\x00array\x00object\x000123456789abcdef\x00JSON cannot hold BLOB values\x00malformed JSON\x00[0]\x00JSON path error near '%q'\x00json_%s() needs an odd number of arguments\x00$[\x00$.\x00json_object() requires an even number of arguments\x00json_object() labels must be TEXT\x00set\x00insert\x00[]\x00{}\x00CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,json HIDDEN,root HIDDEN)\x00.%.*s\x00[%d]\x00$\x00json\x00json_array\x00json_array_length\x00json_extract\x00->\x00->>\x00json_insert\x00json_object\x00json_patch\x00json_quote\x00json_remove\x00json_replace\x00json_set\x00json_type\x00json_valid\x00json_group_array\x00json_group_object\x00json_each\x00json_tree\x00%s_node\x00data\x00DROP TABLE '%q'.'%q_node';DROP TABLE '%q'.'%q_rowid';DROP TABLE '%q'.'%q_parent';\x00RtreeMatchArg\x00SELECT * FROM %Q.%Q\x00UNIQUE constraint failed: %s.%s\x00rtree constraint failed: %s.(%s<=%s)\x00ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";\x00SELECT stat FROM %Q.sqlite_stat1 WHERE tbl = '%q_rowid'\x00node\x00CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY,nodeno\x00,a%d\x00);CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY,data);\x00CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,parentnode);\x00INSERT INTO \"%w\".\"%w_node\"VALUES(1,zeroblob(%d))\x00INSERT INTO\"%w\".\"%w_rowid\"(rowid,nodeno)VALUES(?1,?2)ON CONFLICT(rowid)DO UPDATE SET nodeno=excluded.nodeno\x00SELECT * FROM \"%w\".\"%w_rowid\" WHERE rowid=?1\x00UPDATE \"%w\".\"%w_rowid\"SET \x00a%d=coalesce(?%d,a%d)\x00a%d=?%d\x00 WHERE rowid=?1\x00INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(?1, ?2)\x00DELETE FROM '%q'.'%q_node' WHERE nodeno = ?1\x00SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = ?1\x00INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(?1, ?2)\x00DELETE FROM '%q'.'%q_rowid' WHERE rowid = ?1\x00SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = ?1\x00INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(?1, ?2)\x00DELETE FROM '%q'.'%q_parent' WHERE nodeno = ?1\x00PRAGMA %Q.page_size\x00SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1\x00undersize RTree blobs in \"%q_node\"\x00Wrong number of columns for an rtree table\x00Too few columns for an rtree table\x00Too many columns for an rtree table\x00Auxiliary rtree columns must be last\x00CREATE TABLE x(%.*s INT\x00,%.*s\x00);\x00,%.*s REAL\x00,%.*s INT\x00{%lld\x00 %g\x00}\x00Invalid argument to rtreedepth()\x00%z%s%z\x00SELECT data FROM %Q.'%q_node' WHERE nodeno=?\x00Node %lld missing from database\x00SELECT parentnode FROM %Q.'%q_parent' WHERE nodeno=?1\x00SELECT nodeno FROM %Q.'%q_rowid' WHERE rowid=?1\x00Mapping (%lld -> %lld) missing from %s table\x00%_rowid\x00%_parent\x00Found (%lld -> %lld) in %s table, expected (%lld -> %lld)\x00Dimension %d of cell %d on node %lld is corrupt\x00Dimension %d of cell %d on node %lld is corrupt relative to parent\x00Node %lld is too small (%d bytes)\x00Rtree depth out of range (%d)\x00Node %lld is too small for cell count of %d (%d bytes)\x00SELECT count(*) FROM %Q.'%q%s'\x00Wrong number of entries in %%%s table - expected %lld, actual %lld\x00SELECT * FROM %Q.'%q_rowid'\x00Schema corrupt or not an rtree\x00_rowid\x00_parent\x00END\x00wrong number of arguments to function rtreecheck()\x00[\x00[%!g,%!g],\x00[%!g,%!g]]\x00\x00CREATE TABLE x(_shape\x00,%s\x00rtree\x00fullscan\x00_shape does not contain a valid polygon\x00geopoly_overlap\x00geopoly_within\x00geopoly\x00geopoly_area\x00geopoly_blob\x00geopoly_json\x00geopoly_svg\x00geopoly_contains_point\x00geopoly_debug\x00geopoly_bbox\x00geopoly_xform\x00geopoly_regular\x00geopoly_ccw\x00geopoly_group_bbox\x00rtreenode\x00rtreedepth\x00rtreecheck\x00rtree_i32\x00corrupt fossil delta\x00DROP TRIGGER IF EXISTS temp.rbu_insert_tr;DROP TRIGGER IF EXISTS temp.rbu_update1_tr;DROP TRIGGER IF EXISTS temp.rbu_update2_tr;DROP TRIGGER IF EXISTS temp.rbu_delete_tr;\x00SELECT rbu_target_name(name, type='view') AS target, name FROM sqlite_schema WHERE type IN ('table', 'view') AND target IS NOT NULL %s ORDER BY name\x00AND rootpage!=0 AND rootpage IS NOT NULL\x00SELECT name, rootpage, sql IS NULL OR substr(8, 6)=='UNIQUE' FROM main.sqlite_schema WHERE type='index' AND tbl_name = ?\x00SELECT (sql COLLATE nocase BETWEEN 'CREATE VIRTUAL' AND 'CREATE VIRTUAM'), rootpage FROM sqlite_schema WHERE name=%Q\x00PRAGMA index_list=%Q\x00SELECT rootpage FROM sqlite_schema WHERE name = %Q\x00PRAGMA table_info=%Q\x00PRAGMA main.index_list = %Q\x00PRAGMA main.index_xinfo = %Q\x00SELECT * FROM '%q'\x00rbu_\x00rbu_rowid\x00table %q %s rbu_rowid column\x00may not have\x00requires\x00PRAGMA table_info(%Q)\x00column missing from %q: %s\x00%z%s\"%w\"\x00%z%s%s\"%w\"%s\x00SELECT max(_rowid_) FROM \"%s%w\"\x00 WHERE _rowid_ > %lld \x00 DESC\x00quote(\x00||','||\x00SELECT %s FROM \"%s%w\" ORDER BY %s LIMIT 1\x00 WHERE (%s) > (%s) \x00_rowid_\x00%z%s \"%w\" COLLATE %Q\x00%z%s \"rbu_imp_%d%w\" COLLATE %Q DESC\x00%z%s quote(\"rbu_imp_%d%w\")\x00SELECT %s FROM \"rbu_imp_%w\" ORDER BY %s LIMIT 1\x00%z%s%s\x00(%s) > (%s)\x00%z%s(%.*s) COLLATE %Q\x00%z%s\"%w\" COLLATE %Q\x00%z%s\"rbu_imp_%d%w\"%s\x00%z%s\"rbu_imp_%d%w\" %s COLLATE %Q\x00%z%s\"rbu_imp_%d%w\" IS ?\x00%z%s%s.\"%w\"\x00%z%sNULL\x00%z, %s._rowid_\x00_rowid_ = ?%d\x00%z%sc%d=?%d\x00_rowid_ = (SELECT id FROM rbu_imposter2 WHERE %z)\x00%z%s\"%w\"=?%d\x00invalid rbu_control value\x00%z%s\"%w\"=rbu_delta(\"%w\", ?%d)\x00%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)\x00PRIMARY KEY(\x00%z%s\"%w\"%s\x00%z)\x00SELECT name FROM sqlite_schema WHERE rootpage = ?\x00%z%sc%d %s COLLATE %Q\x00%z%sc%d%s\x00%z, id INTEGER\x00CREATE TABLE rbu_imposter2(%z, PRIMARY KEY(%z)) WITHOUT ROWID\x00PRIMARY KEY \x00%z%s\"%w\" %s %sCOLLATE %Q%s\x00 NOT NULL\x00%z, %z\x00CREATE TABLE \"rbu_imp_%w\"(%z)%s\x00 WITHOUT ROWID\x00INSERT INTO %s.'rbu_tmp_%q'(rbu_control,%s%s) VALUES(%z)\x00SELECT trim(sql) FROM sqlite_schema WHERE type='index' AND name=?\x00 LIMIT -1 OFFSET %d\x00CREATE TABLE \"rbu_imp_%w\"( %s, PRIMARY KEY( %s ) ) WITHOUT ROWID\x00INSERT INTO \"rbu_imp_%w\" VALUES(%s)\x00DELETE FROM \"rbu_imp_%w\" WHERE %s\x00SELECT %s, 0 AS rbu_control FROM '%q' %s %s %s ORDER BY %s%s\x00AND\x00WHERE\x00SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s ORDER BY %s%s\x00SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s UNION ALL SELECT %s, rbu_control FROM '%q' %s %s typeof(rbu_control)='integer' AND rbu_control!=1 ORDER BY %s%s\x00rbu_imp_\x00INSERT INTO \"%s%w\"(%s%s) VALUES(%s)\x00, _rowid_\x00DELETE FROM \"%s%w\" WHERE %s\x00, rbu_rowid\x00CREATE TABLE IF NOT EXISTS %s.'rbu_tmp_%q' AS SELECT *%s FROM '%q' WHERE 0;\x00, 0 AS rbu_rowid\x00CREATE TEMP TRIGGER rbu_delete_tr BEFORE DELETE ON \"%s%w\" BEGIN SELECT rbu_tmp_insert(3, %s);END;CREATE TEMP TRIGGER rbu_update1_tr BEFORE UPDATE ON \"%s%w\" BEGIN SELECT rbu_tmp_insert(3, %s);END;CREATE TEMP TRIGGER rbu_update2_tr AFTER UPDATE ON \"%s%w\" BEGIN SELECT rbu_tmp_insert(4, %s);END;\x00CREATE TEMP TRIGGER rbu_insert_tr AFTER INSERT ON \"%s%w\" BEGIN SELECT rbu_tmp_insert(0, %s);END;\x00,_rowid_ \x00,rbu_rowid\x00SELECT %s,%s rbu_control%s FROM '%q'%s %s %s %s\x000 AS \x00UPDATE \"%s%w\" SET %s WHERE %s\x00SELECT k, v FROM %s.rbu_state\x00file:///%s-vacuum?modeof=%s\x00ATTACH %Q AS stat\x00CREATE TABLE IF NOT EXISTS %s.rbu_state(k INTEGER PRIMARY KEY, v)\x00cannot vacuum wal mode database\x00file:%s-vactmp?rbu_memory=1%s%s\x00&\x00rbu_tmp_insert\x00rbu_fossil_delta\x00rbu_target_name\x00SELECT * FROM sqlite_schema\x00rbu vfs not found\x00PRAGMA main.wal_checkpoint=restart\x00rbu_exclusive_checkpoint\x00%s-oal\x00%s-wal\x00PRAGMA schema_version\x00PRAGMA schema_version = %d\x00INSERT OR REPLACE INTO %s.rbu_state(k, v) VALUES (%d, %d), (%d, %Q), (%d, %Q), (%d, %d), (%d, %d), (%d, %lld), (%d, %lld), (%d, %lld), (%d, %lld), (%d, %Q) \x00PRAGMA main.%s\x00PRAGMA main.%s = %d\x00PRAGMA writable_schema=1\x00SELECT sql FROM sqlite_schema WHERE sql!='' AND rootpage!=0 AND name!='sqlite_sequence' ORDER BY type DESC\x00SELECT * FROM sqlite_schema WHERE rootpage=0 OR rootpage IS NULL\x00INSERT INTO sqlite_schema VALUES(?,?,?,?,?)\x00PRAGMA writable_schema=0\x00DELETE FROM %s.'rbu_tmp_%q'\x00rbu_state mismatch error\x00rbu_vfs_%d\x00SELECT count(*) FROM sqlite_schema WHERE type='index' AND tbl_name = %Q\x00rbu_index_cnt\x00SELECT 1 FROM sqlite_schema WHERE tbl_name = 'rbu_count'\x00SELECT sum(cnt * (1 + rbu_index_cnt(rbu_target_name(tbl))))FROM rbu_count\x00cannot update wal mode database\x00database modified during rbu %s\x00vacuum\x00update\x00BEGIN IMMEDIATE\x00PRAGMA journal_mode=off\x00-vactmp\x00DELETE FROM stat.rbu_state\x00rbu/zipvfs setup error\x00rbu(%s)/%z\x00rbu_memory\x00SELECT 0, 'tbl', '', 0, '', 1 UNION ALL SELECT 1, 'idx', '', 0, '', 2 UNION ALL SELECT 2, 'stat', '', 0, '', 0\x00PRAGMA '%q'.table_info('%q')\x00%z%s\"%w\".\"%w\".\"%w\"=\"%w\".\"%w\".\"%w\"\x00%z%s\"%w\".\"%w\".\"%w\" IS NOT \"%w\".\"%w\".\"%w\"\x00 OR \x00SELECT * FROM \"%w\".\"%w\" WHERE NOT EXISTS ( SELECT 1 FROM \"%w\".\"%w\" WHERE %s)\x00SELECT * FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND (%z)\x00table schemas do not match\x00SELECT tbl, ?2, stat FROM %Q.sqlite_stat1 WHERE tbl IS ?1 AND idx IS (CASE WHEN ?2=X'' THEN NULL ELSE ?2 END)\x00SELECT * FROM \x00 WHERE \x00 IS ?\x00SAVEPOINT changeset\x00RELEASE changeset\x00UPDATE main.\x00 SET \x00 = ?\x00idx IS CASE WHEN length(?4)=0 AND typeof(?4)='blob' THEN NULL ELSE ?4 END \x00DELETE FROM main.\x00 AND (?\x00AND \x00INSERT INTO main.\x00) VALUES(?\x00, ?\x00INSERT INTO main.sqlite_stat1 VALUES(?1, CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END, ?3)\x00DELETE FROM main.sqlite_stat1 WHERE tbl=?1 AND idx IS CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END AND (?4 OR stat IS ?3)\x00SAVEPOINT replace_op\x00RELEASE replace_op\x00SAVEPOINT changeset_apply\x00PRAGMA defer_foreign_keys = 1\x00sqlite3changeset_apply(): no such table: %s\x00sqlite3changeset_apply(): table %s has %d columns, expected %d or more\x00sqlite3changeset_apply(): primary key mismatch for table %s\x00PRAGMA defer_foreign_keys = 0\x00RELEASE changeset_apply\x00ROLLBACK TO changeset_apply\x00fts5: parser stack overflow\x00fts5: syntax error near \"%.*s\"\x00%z%.*s\x00wrong number of arguments to function highlight()\x00wrong number of arguments to function snippet()\x00snippet\x00highlight\x00bm25\x00prefix\x00malformed prefix=... directive\x00too many prefix indexes (max %d)\x00prefix length out of range (max 999)\x00tokenize\x00multiple tokenize=... directives\x00parse error in tokenize directive\x00content\x00multiple content=... directives\x00%Q.%Q\x00content_rowid\x00multiple content_rowid=... directives\x00columnsize\x00malformed columnsize=... directive\x00columns\x00malformed detail=... directive\x00unrecognized option: \"%.*s\"\x00reserved fts5 column name: %s\x00unindexed\x00unrecognized column option: %s\x00T.%Q\x00, T.%Q\x00, T.c%d\x00reserved fts5 table name: %s\x00parse error in \"%s\"\x00docsize\x00%Q.'%q_%s'\x00CREATE TABLE x(\x00%z%s%Q\x00%z, %Q HIDDEN, %s HIDDEN)\x00pgsz\x00hashsize\x00automerge\x00usermerge\x00crisismerge\x00SELECT k, v FROM %Q.'%q_config'\x00version\x00invalid fts5 file format (found %d, expected %d) - run 'rebuild'\x00unterminated string\x00fts5: syntax error near \"%.1s\"\x00OR\x00NOT\x00NEAR\x00expected integer, got \"%.*s\"\x00fts5: column queries are not supported (detail=none)\x00fts5: %s queries are not supported (detail!=full)\x00phrase\x00block\x00REPLACE INTO '%q'.'%q_data'(id, block) VALUES(?,?)\x00DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?\x00DELETE FROM '%q'.'%q_idx' WHERE segid=?\x00PRAGMA %Q.data_version\x00SELECT pgno FROM '%q'.'%q_idx' WHERE segid=? AND term<=? ORDER BY term DESC LIMIT 1\x00INSERT INTO '%q'.'%q_idx'(segid,term,pgno) VALUES(?,?,?)\x00%s_data\x00id INTEGER PRIMARY KEY, block BLOB\x00segid, term, pgno, PRIMARY KEY(segid, term)\x00SELECT segid, term, (pgno>>1), (pgno&1) FROM %Q.'%q_idx' WHERE segid=%d ORDER BY 1, 2\x00\x00\x00\x00\x00\x00recursively defined fts5 content table\x00SELECT rowid, rank FROM %Q.%Q ORDER BY %s(\"%w\"%s%s) %s\x00DESC\x00ASC\x00reads\x00unknown special query: %.*s\x00SELECT %s\x00no such function: %s\x00parse error in rank function: %s\x00%s: table does not support scanning\x00delete-all\x00'delete-all' may only be used with a contentless or external content fts5 table\x00rebuild\x00'rebuild' may not be used with a contentless fts5 table\x00merge\x00integrity-check\x00cannot %s contentless fts5 table: %s\x00DELETE from\x00no such cursor: %lld\x00no such tokenizer: %s\x00error in tokenizer constructor\x00fts5_api_ptr\x00fts5: 2023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da\x00config\x00fts5\x00fts5_source_id\x00SELECT %s FROM %s T WHERE T.%Q >= ? AND T.%Q <= ? ORDER BY T.%Q ASC\x00SELECT %s FROM %s T WHERE T.%Q <= ? AND T.%Q >= ? ORDER BY T.%Q DESC\x00SELECT %s FROM %s T WHERE T.%Q=?\x00INSERT INTO %Q.'%q_content' VALUES(%s)\x00REPLACE INTO %Q.'%q_content' VALUES(%s)\x00DELETE FROM %Q.'%q_content' WHERE id=?\x00REPLACE INTO %Q.'%q_docsize' VALUES(?,?)\x00DELETE FROM %Q.'%q_docsize' WHERE id=?\x00SELECT sz FROM %Q.'%q_docsize' WHERE id=?\x00REPLACE INTO %Q.'%q_config' VALUES(?,?)\x00SELECT %s FROM %s AS T\x00DROP TABLE IF EXISTS %Q.'%q_data';DROP TABLE IF EXISTS %Q.'%q_idx';DROP TABLE IF EXISTS %Q.'%q_config';\x00DROP TABLE IF EXISTS %Q.'%q_docsize';\x00DROP TABLE IF EXISTS %Q.'%q_content';\x00ALTER TABLE %Q.'%q_%s' RENAME TO '%q_%s';\x00CREATE TABLE %Q.'%q_%q'(%s)%s\x00fts5: error creating shadow table %q_%s: %s\x00id INTEGER PRIMARY KEY\x00, c%d\x00id INTEGER PRIMARY KEY, sz BLOB\x00k PRIMARY KEY, v\x00DELETE FROM %Q.'%q_data';DELETE FROM %Q.'%q_idx';\x00DELETE FROM %Q.'%q_docsize';\x00SELECT count(*) FROM %Q.'%q_%s'\x00tokenchars\x00separators\x00L* N* Co\x00categories\x00remove_diacritics\x00unicode61\x00al\x00ance\x00ence\x00er\x00ic\x00able\x00ible\x00ant\x00ement\x00ment\x00ent\x00ion\x00ou\x00ism\x00ate\x00iti\x00ous\x00ive\x00ize\x00at\x00bl\x00ble\x00iz\x00ational\x00tional\x00tion\x00enci\x00anci\x00izer\x00logi\x00bli\x00alli\x00entli\x00eli\x00e\x00ousli\x00ization\x00ation\x00ator\x00alism\x00iveness\x00fulness\x00ful\x00ousness\x00aliti\x00iviti\x00biliti\x00ical\x00ness\x00icate\x00iciti\x00ative\x00alize\x00eed\x00ee\x00ed\x00ing\x00case_sensitive\x00ascii\x00porter\x00trigram\x00col\x00row\x00instance\x00fts5vocab: unknown table type: %Q\x00CREATE TABlE vocab(term, col, doc, cnt)\x00CREATE TABlE vocab(term, doc, cnt)\x00CREATE TABlE vocab(term, doc, col, offset)\x00wrong number of vtable arguments\x00recursive definition for %s.%s\x00SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'\x00no such fts5 table: %s.%s\x00fts5vocab\x002023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da\x00" var ts = (*reflect.StringHeader)(unsafe.Pointer(&ts1)).Data