You have a bug (missing break) between line 80 and 81 which will lead to a 
memory leak every time a text value is stored ...

      switch (pval->t) {
        case SQLITE_INTEGER:
          pval->n=0;
          pval->i=sqlite3_value_int64(arg);
          break;
        case SQLITE_TEXT:
          pval->n=sqlite3_value_bytes(arg);
          if (!pval->n) {
            pval->z="";
          } else {
            pval->z=sqlite3_malloc(pval->n);
            assert (pval->z); /* TODO: SQLITE_NOMEM*/
            memcpy(pval->z,sqlite3_value_text(arg),pval->n);
          }
          break;          /* <<<<<<<<<< MISSING break <<<<<<<<<< */
        case SQLITE_BLOB: /* sqlite3_value_blob instead of _text */
          pval->n=sqlite3_value_bytes(arg);
          if (!pval->n) {
            pval->z="";
          } else {
            pval->z=sqlite3_malloc(pval->n);
            assert (pval->z); /* TODO: SQLITE_NOMEM*/
            memcpy(pval->z,sqlite3_value_blob(arg),pval->n);
          }
          break;
        case SQLITE_FLOAT:
          pval->n=0;
          pval->r=sqlite3_value_double(arg);
          break;
      }
    }


> -----Original Message-----
> From: sqlite-users-bounces at mailinglists.sqlite.org [mailto:sqlite-users-
> bounces at mailinglists.sqlite.org] On Behalf Of E.Pasma
> Sent: Monday, 22 February, 2016 07:49
> To: SQLite mailing list
> Subject: Re: [sqlite] User-defined SQL functions
> 
> 21 feb 2016, Igor Tandetnik:
> 
> > On 2/21/2016 12:09 PM, Olivier Mascia wrote:
> >> Is it possible to implement a SQL function
> (https://www.sqlite.org/c3ref/create_function.html
> >> ), which implementation would be able to return the same value for
> >> the duration of the current transaction?
> >>
> >> In other words, assume I'd like to implement some function which I
> >> could name 'now()' which would return the current_timestamp as
> >> julian day, but would return exactly the same value for any call
> >> made during the same transaction?
> >
> > When I needed a stable version of now(), this is what I did. I had a
> > global (well, actually, per-connection) time_t variable. I passed
> > its address to sqlite3_create_function, to be retrieved within the
> > custom function's implementation by means of sqlite3_user_data.
> >
> > The custom function would check this variable. If it's zero, it
> > would obtain the current timestamp save it in that variable, and
> > return it as its result; otherwise, it would return the previously-
> > cached value.
> >
> > Whenever I started a new transaction, I reset the variable to zero.
> > Luckily, I had a single spot issuing BEGIN statements (a C++ class
> > wrapping SQLite connection handle; the time_t variable was also part
> > of that class).
> > --
> > Igor Tandetnik
> 
> Hello Oliver, I have a tool that is purely within SQLite. I once named
> it sqlite_mprint. It is far from the requirement but may be a start.
> 
> sqlite> .load sqlite_mprint
> sqlite> select mprint (datetime('now')); --set time
> 2016-02-22 14:30:03
> sqlite> select mprint() as t0; --get old time
> 2016-02-22 14:30:03
> 
> The code is temporarily at
> http://h1972688.stratoserver.net/sqlite_mprint/160222
> 
> Best regards, E. Pasma
> 
> 
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



Reply via email to