Skip to content

Commit

Permalink
Up to 1.9.1
Browse files Browse the repository at this point in the history
* Plugin system to preview values e.g. json, XML or even pdf
* Improve Edit data dialog inc. issue #155
* Fix issues #159, #160, #161
* Up SQLite to 3.46.0
  • Loading branch information
little-brother committed Jul 22, 2024
1 parent 26689bd commit a5cd1b8
Show file tree
Hide file tree
Showing 20 changed files with 7,141 additions and 4,404 deletions.
5 changes: 1 addition & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
bin/
obj/
out/
extensions/*.dll
extensions/*.bat
include/*.bat
http-debug.txt
sqlite-gui.depend
sqlite-gui.layout
ToDo.txt
*.txt
*.bat
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Small, simple, [powerfull](https://youtu.be/lctkqWD7HTk), fast, free.
* Database comparison
* Search text in the whole database
* Data generator
* [Extension manager](https://github.com/little-brother/sqlite-gui/wiki#extension-manager)
* [Add-ons](https://github.com/little-brother/sqlite-gui/wiki#add-ons)
* [Cross-database queries](https://github.com/little-brother/sqlite-gui/wiki#cross-database-queries) (odbc-extension is required)
* [Quick data references](https://github.com/little-brother/sqlite-gui/wiki#quick-references)
* [Terminal mode](https://raw.githubusercontent.com/little-brother/sqlite-gui/master/resources/terminal.webp)
Expand All @@ -32,4 +32,4 @@ Small, simple, [powerfull](https://youtu.be/lctkqWD7HTk), fast, free.
Need a much simpler tool? Try [sqlite-x](https://github.com/little-brother/sqlite-x)!

If you like the project, press the like-button on [AlternativeTo](https://alternativeto.net/software/sqlite-gui/about) or rate the app on [Softpedia](https://www.softpedia.com/get/Internet/Servers/Database-Utils/SQLite-GUI-LB.shtml) to support it.<br>
If you have any problems, comments or suggestions, check [Wiki](https://github.com/little-brother/sqlite-gui/wiki), create [issue](https://github.com/little-brother/sqlite-gui/issues) or just let me know <a href="mailto:[email protected]?subject=sqlite-gui">[email protected]</a>.
If you have any problems, comments or suggestions, check [Wiki](https://github.com/little-brother/sqlite-gui/wiki), create [issue](https://github.com/little-brother/sqlite-gui/issues) or just let me know <a href="mailto:[email protected]?subject=sqlite-gui">[email protected]</a>.
8,935 changes: 5,464 additions & 3,471 deletions include/sqlite3.c

Large diffs are not rendered by default.

116 changes: 93 additions & 23 deletions include/sqlite3.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
#define SQLITE_VERSION "3.45.1"
#define SQLITE_VERSION_NUMBER 3045001
#define SQLITE_SOURCE_ID "2024-01-30 16:01:20 e876e51a0ed5c5b3126f52e532044363a014bc594cfefa87ffb5b82257cc467a"
#define SQLITE_VERSION "3.46.0"
#define SQLITE_VERSION_NUMBER 3046000
#define SQLITE_SOURCE_ID "2024-05-23 13:25:27 96c92aba00c8375bc32fafcdf12429c58bd8aabfcadab6683e35bbb9cdebf19e"

/*
** CAPI3REF: Run-Time Library Version Numbers
Expand Down Expand Up @@ -420,6 +420,8 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**);
** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running.
** <li> The application must not modify the SQL statement text passed into
** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running.
** <li> The application must not dereference the arrays or string pointers
** passed as the 3rd and 4th callback parameters after it returns.
** </ul>
*/
SQLITE_API int sqlite3_exec(
Expand Down Expand Up @@ -762,11 +764,11 @@ struct sqlite3_file {
** </ul>
** 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
** xLock() is always one 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
** 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,
Expand Down Expand Up @@ -2141,6 +2143,22 @@ struct sqlite3_mem_methods {
** configuration setting is never used, then the default maximum is determined
** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that
** compile-time option is not set, then the default maximum is 1073741824.
**
** [[SQLITE_CONFIG_ROWID_IN_VIEW]]
** <dt>SQLITE_CONFIG_ROWID_IN_VIEW
** <dd>The SQLITE_CONFIG_ROWID_IN_VIEW option enables or disables the ability
** for VIEWs to have a ROWID. The capability can only be enabled if SQLite is
** compiled with -DSQLITE_ALLOW_ROWID_IN_VIEW, in which case the capability
** defaults to on. This configuration option queries the current setting or
** changes the setting to off or on. The argument is a pointer to an integer.
** If that integer initially holds a value of 1, then the ability for VIEWs to
** have ROWIDs is activated. If the integer initially holds zero, then the
** ability is deactivated. Any other initial value for the integer leaves the
** setting unchanged. After changes, if any, the integer is written with
** a 1 or 0, if the ability for VIEWs to have ROWIDs is on or off. If SQLite
** is compiled without -DSQLITE_ALLOW_ROWID_IN_VIEW (which is the usual and
** recommended case) then the integer is always filled with zero, regardless
** if its initial value.
** </dl>
*/
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
Expand Down Expand Up @@ -2172,6 +2190,7 @@ struct sqlite3_mem_methods {
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */
#define SQLITE_CONFIG_ROWID_IN_VIEW 30 /* int* */

/*
** CAPI3REF: Database Connection Configuration Options
Expand Down Expand Up @@ -3286,8 +3305,8 @@ SQLITE_API int sqlite3_set_authorizer(
#define SQLITE_RECURSIVE 33 /* NULL NULL */

/*
** CAPI3REF: Tracing And Profiling Functions
** METHOD: sqlite3
** CAPI3REF: Deprecated Tracing And Profiling Functions
** DEPRECATED
**
** These routines are deprecated. Use the [sqlite3_trace_v2()] interface
** instead of the routines described here.
Expand Down Expand Up @@ -6868,6 +6887,12 @@ SQLITE_API int sqlite3_autovacuum_pages(
** The exceptions defined in this paragraph might change in a future
** release of SQLite.
**
** Whether the update hook is invoked before or after the
** corresponding change is currently unspecified and may differ
** depending on the type of change. Do not rely on the order of the
** hook call with regards to the final result of the operation which
** triggers the hook.
**
** The update hook implementation must not do anything that will modify
** the database connection that invoked the update hook. Any actions
** to modify the database connection must be deferred until after the
Expand Down Expand Up @@ -8338,7 +8363,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
** The sqlite3_keyword_count() interface returns the number of distinct
** keywords understood by SQLite.
**
** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
** The sqlite3_keyword_name(N,Z,L) interface finds the 0-based N-th keyword and
** makes *Z point to that keyword expressed as UTF8 and writes the number
** of bytes in the keyword into *L. The string that *Z points to is not
** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
Expand Down Expand Up @@ -9917,24 +9942,45 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
** <li value="2"><p>
** ^(If the sqlite3_vtab_distinct() interface returns 2, that means
** that the query planner does not need the rows returned in any particular
** order, as long as rows with the same values in all "aOrderBy" columns
** are adjacent.)^ ^(Furthermore, only a single row for each particular
** combination of values in the columns identified by the "aOrderBy" field
** needs to be returned.)^ ^It is always ok for two or more rows with the same
** values in all "aOrderBy" columns to be returned, as long as all such rows
** are adjacent. ^The virtual table may, if it chooses, omit extra rows
** that have the same value for all columns identified by "aOrderBy".
** ^However omitting the extra rows is optional.
** order, as long as rows with the same values in all columns identified
** by "aOrderBy" are adjacent.)^ ^(Furthermore, when two or more rows
** contain the same values for all columns identified by "colUsed", all but
** one such row may optionally be omitted from the result.)^
** The virtual table is not required to omit rows that are duplicates
** over the "colUsed" columns, but if the virtual table can do that without
** too much extra effort, it could potentially help the query to run faster.
** This mode is used for a DISTINCT query.
** <li value="3"><p>
** ^(If the sqlite3_vtab_distinct() interface returns 3, that means
** that the query planner needs only distinct rows but it does need the
** rows to be sorted.)^ ^The virtual table implementation is free to omit
** rows that are identical in all aOrderBy columns, if it wants to, but
** it is not required to omit any rows. This mode is used for queries
** ^(If the sqlite3_vtab_distinct() interface returns 3, that means the
** virtual table must return rows in the order defined by "aOrderBy" as
** if the sqlite3_vtab_distinct() interface had returned 0. However if
** two or more rows in the result have the same values for all columns
** identified by "colUsed", then all but one such row may optionally be
** omitted.)^ Like when the return value is 2, the virtual table
** is not required to omit rows that are duplicates over the "colUsed"
** columns, but if the virtual table can do that without
** too much extra effort, it could potentially help the query to run faster.
** This mode is used for queries
** that have both DISTINCT and ORDER BY clauses.
** </ol>
**
** <p>The following table summarizes the conditions under which the
** virtual table is allowed to set the "orderByConsumed" flag based on
** the value returned by sqlite3_vtab_distinct(). This table is a
** restatement of the previous four paragraphs:
**
** <table border=1 cellspacing=0 cellpadding=10 width="90%">
** <tr>
** <td valign="top">sqlite3_vtab_distinct() return value
** <td valign="top">Rows are returned in aOrderBy order
** <td valign="top">Rows with the same value in all aOrderBy columns are adjacent
** <td valign="top">Duplicates over all colUsed columns may be omitted
** <tr><td>0<td>yes<td>yes<td>no
** <tr><td>1<td>no<td>yes<td>no
** <tr><td>2<td>no<td>yes<td>yes
** <tr><td>3<td>yes<td>yes<td>yes
** </table>
**
** ^For the purposes of comparing virtual table output values to see if the
** values are same value for sorting purposes, two NULL values are considered
** to be the same. In other words, the comparison operator is "IS"
Expand Down Expand Up @@ -11979,6 +12025,30 @@ SQLITE_API int sqlite3changegroup_schema(sqlite3_changegroup*, sqlite3*, const c
*/
SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData);

/*
** CAPI3REF: Add A Single Change To A Changegroup
** METHOD: sqlite3_changegroup
**
** This function adds the single change currently indicated by the iterator
** passed as the second argument to the changegroup object. The rules for
** adding the change are just as described for [sqlite3changegroup_add()].
**
** If the change is successfully added to the changegroup, SQLITE_OK is
** returned. Otherwise, an SQLite error code is returned.
**
** The iterator must point to a valid entry when this function is called.
** If it does not, SQLITE_ERROR is returned and no change is added to the
** changegroup. Additionally, the iterator must not have been opened with
** the SQLITE_CHANGESETAPPLY_INVERT flag. In this case SQLITE_ERROR is also
** returned.
*/
SQLITE_API int sqlite3changegroup_add_change(
sqlite3_changegroup*,
sqlite3_changeset_iter*
);



/*
** CAPI3REF: Obtain A Composite Changeset From A Changegroup
** METHOD: sqlite3_changegroup
Expand Down Expand Up @@ -12783,8 +12853,8 @@ struct Fts5PhraseIter {
** EXTENSION API FUNCTIONS
**
** xUserData(pFts):
** Return a copy of the context pointer the extension function was
** registered with.
** Return a copy of the pUserData pointer passed to the xCreateFunction()
** API when the extension function was registered.
**
** xColumnTotalSize(pFts, iCol, pnToken):
** If parameter iCol is less than zero, set output variable *pnToken
Expand Down
3 changes: 2 additions & 1 deletion resources/help.sql
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,8 @@ select value from json_each(''["a", "b"]''); --> 2 rows: (a) and (b)
select value from json_each(''{"a": ["foo", "bar"]}'', ''$.a''); --> 2 rows: (foo) and (bar)', '', 'Json|Path', 2, 'json1'),
('json_tree', 'module', 'json_tree(json [, path])', 'Walks the json and returns one row for each element.', 'select value from json_tree(''{"a": ["foo", "bar"]}'', ''$.a''); --> 3 rows: (["foo","bar"]), (foo) and (bar)', '', 'Json|Path', 2, 'json1'),
('json_error_position', 'function', 'json_error_position (json)', 'Returns 0 if the json is a well-formed JSON/JSON5 string or json-blob.', 'select json_error_position(''{"x": "abc, "y": 10}'') --> 14', '', 'Json', 1, 'json1'),
('json_quote', 'function', 'json_quote (value)', 'converts the SQL value (a number or a string) into its corresponding JSON representation. If the value is a JSON value returned by another JSON function, then this function is a no-op.', 'json_quote(''test''); --> "test"', '', 'Value', 1, 'json1'),
('json_quote', 'function', 'json_quote (value)', 'Converts the SQL value (a number or a string) into its corresponding JSON representation. If the value is a JSON value returned by another JSON function, then this function is a no-op.', 'json_quote(''test''); --> "test"', '', 'Value', 1, 'json1'),
('json_pretty', 'function', 'json_pretty (json)', 'Make the JSON result easier for humans to read', 'json_pretty(''{"x":10}'');', '', 'Json', 1, 'json1'),

-- GEOPOLY

Expand Down
Binary file added resources/icons.bmp
Binary file not shown.
2 changes: 1 addition & 1 deletion resources/init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ create table if not exists prefs (name text primary key, value text);
create table if not exists recents (path text primary key, time real not null);
create table if not exists attached_recents (path text primary key, time real not null);
create table if not exists odbc_recents (alias text primary key, driver text, options text, time real not null);
create table if not exists extensions (name text primary key, enable integer, version text);
create table if not exists addons (name text, type integer, enable integer, version text, primary key (name, type));
create table if not exists history (query text primary key, time real not null);
create table if not exists gists (query text primary key, time real not null);
create table if not exists generators (type text, value text);
Expand Down
48 changes: 34 additions & 14 deletions src/dbutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,39 +23,59 @@ namespace dbutils {
return strncmp(buf, "SQLite format 3", 15) == 0;
}

int bind_variant(sqlite3_stmt* stmt, int pos, const char* value8, bool forceToText) {
int len = strlen(value8);
BYTE detectSqliteType(const char* value8, bool forceToText) {
if (value8 == 0)
return SQLITE_NULL;

int len = strlen(value8);
if (len == 0)
return sqlite3_bind_null(stmt, pos);
return SQLITE_NULL;

if (forceToText)
return sqlite3_bind_text(stmt, pos, value8, strlen(value8), SQLITE_TRANSIENT);

//if (len > 20) // 18446744073709551615
// return sqlite3_bind_text(stmt, pos, value8, strlen(value8), SQLITE_TRANSIENT);
return SQLITE_TEXT;

if (len == 1 && value8[0] == '0')
return sqlite3_bind_int(stmt, pos, 0);
return SQLITE_INTEGER;

bool isNum = true;
int dotCount = 0;
for (int i = +(value8[0] == '-' /* is negative */); i < len; i++) {
isNum = isNum && (isdigit(value8[i]) || value8[i] == '.' || value8[i] == ',');
dotCount += value8[i] == '.' || value8[i] == ',';
isNum = isNum && (isdigit(value8[i]) || value8[i] == '.');
dotCount += value8[i] == '.';// || value8[i] == ',';
}

if (isNum && dotCount == 0) {
return len < 10 ? // 2147483647
sqlite3_bind_int(stmt, pos, atoi(value8)) :
sqlite3_bind_int64(stmt, pos, atoll(value8));
return SQLITE_INTEGER;
}

double d = 0;
if (isNum && dotCount == 1 && utils::isNumber(value8, &d))
return SQLITE_FLOAT;

return SQLITE_TEXT;
}

int bind_variant(sqlite3_stmt* stmt, int pos, const char* value8, bool forceToText) {
BYTE type = detectSqliteType(value8, forceToText);
if (type == SQLITE_NULL)
return sqlite3_bind_null(stmt, pos);

if (type == SQLITE_TEXT)
return sqlite3_bind_text(stmt, pos, value8, strlen(value8), SQLITE_TRANSIENT);

if (type == SQLITE_FLOAT) {
double d = 0;
utils::isNumber(value8, &d);
return sqlite3_bind_double(stmt, pos, d);
}

if (type == SQLITE_INTEGER) {
return strlen(value8) < 10 ? // 2147483647
sqlite3_bind_int(stmt, pos, atoi(value8)) :
sqlite3_bind_int64(stmt, pos, atoll(value8));
}

return sqlite3_bind_text(stmt, pos, value8, strlen(value8), SQLITE_TRANSIENT);
return SQLITE_ERROR;
}

BYTE sqlite3_type(const char* decltype8) {
Expand Down
1 change: 1 addition & 0 deletions src/dbutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
namespace dbutils {
bool isSQLiteDatabase(TCHAR* path16);
int bind_variant(sqlite3_stmt* stmt, int pos, const char* value8, bool forceToText = false);
BYTE detectSqliteType(const char* value8, bool forceToText = false);
BYTE sqlite3_type(const char* type8);
void userDefinedFunction (sqlite3_context *ctx, int argc, sqlite3_value **argv);

Expand Down
Loading

0 comments on commit a5cd1b8

Please sign in to comment.