[sqlite] Do you mean utf8_fprintf on this commit ?

2015-12-31 Thread Domingo Alvarez Duarte
Hello mistachkin !  

On this commit https://www.sqlite.org/src/info/8cf01fff232d15d3 do you mean
"utf8_fprintf" instead of "utf8_printf" ?  

To be consistent with the underling wrapped function !  

Cheers !



[sqlite] Fwd: Happy New Year

2015-12-31 Thread Igor Korot
-- Forwarded message --
From: Igor Korot 
Date: Thu, Dec 31, 2015 at 5:06 PM
Subject: Happy New Year
To: "python-list at python.org" , General
Discussion of SQLite Database 


 Happy New Year to everybody on those lists. Let this year brings us a
lot of happiness and joy.
Lets keep the train rolling and make the upcoming year better.


[sqlite] non-integer rowid/document id

2015-12-31 Thread Marco
Excerpts from jeremy's message of 2015-12-14 11:09:48 -0700:
> Hi all,
> 
> I'm working with FTS5 and I'd like to guarantee that a particular document is
> indexed only once. I have what I consider to be a document id, but it is not 
> an
> integer value its a hexadecimal string, think GUID/md5/sha1. Since the fts5
> rowid column is an integer, it appears I'll need to create a mapping from my
> document id to an fts5 rowid.
Don't need a mapping use your key and ensure your key is unique.
> 
> I'm thinking the best method for me to resolve this would to just use an
> external content table with triggers to update FTS5 table. Pretty much exactly
> like https://sqlite.org/fts5.html#section_4_4_2 and use triggers to keep the
> FTS5 table in sync with the external content table.
Using that solution (the best I think) just combine:

-- The external table
CREATE TABLE tbl (key TEXT UNIQUE, content, id INTEGER PRIMARY KEY);
-- The virtual table
CREATE VIRTUAL TABLE fts USING fts5(key, content, content=tbl, 
content_rowid=id);
> 
> If I'm going to have to use an external table to create a rowid for the
> fts5 table, I might as well use use the external content table.
> 
> Any additional thoughts on this from the more knowledgeable?
> 
> enjoy,
> 
> -jeremy
> 
> --?
> 
> Jeremy Hinegarnder
> Copious Free Time, LLC

-- 
Marco Arthur @ (M)arco Creatives


[sqlite] Function patternCompare() not EBCDIC friendly

2015-12-31 Thread mario bezzi
Roland,

thank you VERY much for sharing your findings. Appreciated!

I think that the ability to compile SQLite on z/OS out of the box is a 
great achievement. We'll need to make sure that this will still hold 
true for future releases.

While using your dump procedure allows exchanging data-bases with other 
platforms, I think that having a fully compatible z/OS version is 
something we should aim to.

Back then I had a look at the xlc ASCII options, but I seem to remember 
there were drawbacks. Need to find my notes about it.

Regardless, it is good to see that things move on.

Thanks again for your work on this and for your will to share it.

mario

On 12/30/2015 10:43 PM, Roland Martin wrote:
> Hi Mario, I was using SQLite 3.8.6 up to this point on z/OS with a couple of
> minor code changes which are now included in version 3.9.2. With the fix
> Richard provided this morning all functionality I have tested so far is
> working out of the box with no code changes on z/OS.
>
> The databases I use are EBCDIC based (not UTF-8) so there is no moving them
> as-is to Windows or Linux. The way I work around this is to export via:
>
> sqlite3 test.db ".dump" > test.sql
>
> FTP test.sql to Windows/Linux in ascii mode and then import. The reverse can
> also be done.
>
> I have not tried using it but xlc has the ASCII option documented here:
>
> https://www-01.ibm.com/support/knowledgecenter/SSLTBW_1.13.0/com.ibm.zos.r13
> .cbcux01/ascii.htm
>
> You should experiment with this option, it might get you closer to your
> goal. With it SQLITE_ASCII will be defined, not SQLITE_EBCDIC since 'A'  in
> the code below (line 9576 in sqlite3.c) would be an ASCII 'A'.
>
> #if 'A' == '\301'
> # define SQLITE_EBCDIC 1
> #else
> # define SQLITE_ASCII 1
> #endif
>
>
> The origins of the build scripts below are fuzzy but I believe most of the
> options come from running configure and then copying out from the makefile.
> Some xlc specific options have been added from reading and trial and error.
> Compiling sqlite3.c:
>
> xlc \
> -DPACKAGE_NAME=\"sqlite\" \
> -DPACKAGE_TARNAME=\"sqlite\" \
> -DPACKAGE_VERSION=\"3.9.2\" \
> -DPACKAGE_STRING=\"sqlite\ 3.9.2\" \
> -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\; \
> -DPACKAGE_URL=\"\" \
> -DPACKAGE=\"sqlite\" \
> -DVERSION=\"3.9.2\" \
> -DSTDC_HEADERS=1 \
> -DHAVE_SYS_TYPES_H=1 \
> -DHAVE_SYS_STAT_H=1 \
> -DHAVE_STDLIB_H=1 \
> -DHAVE_STRING_H=1 \
> -DHAVE_MEMORY_H=1 \
> -DHAVE_STRINGS_H=1 \
> -DHAVE_INTTYPES_H=1 \
> -DHAVE_STDINT_H=1 \
> -DHAVE_UNISTD_H=1 \
> -DHAVE_DLFCN_H=1 \
> -DLT_OBJDIR=\".libs/\" \
> -DHAVE_USLEEP=1 \
> -DHAVE_LOCALTIME_R=1 \
> -DHAVE_GMTIME_R=1 \
> -DHAVE_DECL_STRERROR_R=1 \
> -DHAVE_STRERROR_R=1 \
> -D_REENTRANT=1 \
> -DSQLITE_THREADSAFE=1  \
> -DSQLITE_ENABLE_FTS3 \
> -DSQLITE_ENABLE_RTREE \
> -O3 \
> -I. -V \
> -DSQLITE_OMIT_MERGE_SORT \
> -DSQLITE_MAX_MMAPSIZE=1048576 \
> -qTARG=zOSV1R11  \
> -q64 \
> -qstrict \
> -qLANG=EXTENDED \
> -qFLOAT=IEEE \
> -qnolist \
> -qnosource  \
> -D_POSIX_C_SOURCE=200112L \
> -D_XOPEN_SOURCE=600 \
> -c \
> -o sqlite3.o sqlite3.c
>
> Compiling shell.c:
>
> xlc \
> -DPACKAGE_NAME=\"sqlite\" \
> -DPACKAGE_TARNAME=\"sqlite\" \
> -DPACKAGE_VERSION=\"3.9.2\" \
> -DPACKAGE_STRING=\"sqlite\ 3.9.2\" \
> -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\; \
> -DPACKAGE_URL=\"\" \
> -DPACKAGE=\"sqlite\" \
> -DVERSION=\"3.9.2\" \
> -DSTDC_HEADERS=1 \
> -DHAVE_SYS_TYPES_H=1 \
> -DHAVE_SYS_STAT_H=1 \
> -DHAVE_STDLIB_H=1 \
> -DHAVE_STRING_H=1 \
> -DHAVE_MEMORY_H=1 \
> -DHAVE_STRINGS_H=1 \
> -DHAVE_INTTYPES_H=1 \
> -DHAVE_STDINT_H=1 \
> -DHAVE_UNISTD_H=1 \
> -DHAVE_DLFCN_H=1 \
> -DLT_OBJDIR=\".libs/\" \
> -DHAVE_USLEEP=1 \
> -DHAVE_LOCALTIME_R=1 \
> -DHAVE_GMTIME_R=1 \
> -DHAVE_DECL_STRERROR_R=1 \
> -DHAVE_STRERROR_R=1 \
> -D_REENTRANT=1 \
> -DSQLITE_THREADSAFE=1  \
> -DSQLITE_ENABLE_FTS3 \
> -DSQLITE_ENABLE_RTREE \
> -O3 \
> -I. -V \
> -DSQLITE_OMIT_MERGE_SORT \
> -DSQLITE_MAX_MMAPSIZE=1048576 \
> -qTARG=zOSV1R11  \
> -q64 \
> -qstrict \
> -qLANG=EXTENDED \
> -qFLOAT=IEEE \
> -qnolist \
> -qnosource  \
> -D_POSIX_C_SOURCE=200112L \
> -D_XOPEN_SOURCE=600 \
> -c \
> -o shell.o shell.c
>
> Linking the two together for a sqlite3 executable:
>
> xlc -q64 -o sqlite3 shell.o sqlite3.o
>
> Hope this helps - Roland
>
> -Original Message-
> From: mbezzi [mailto:mbezzi at tiscali.it]
> Sent: Wednesday, December 30, 2015 11:21 AM
> To: SQLite mailing list; rolandsmartin at gmail.com
> Subject: Re: [sqlite] Function patternCompare() not EBCDIC friendly
>
> Roland,
>
> I am pleased to see that you are successfully using SQLite on z/OS.
> Are you using the standard amalgamation? Did you need to apply special mods
> to SQLite to work on z/OS? Would you mind sharing your build procedure?
>
> Few months ago I tried compiling SQLite on z/OS: It worked but the
> data-bases generated on z/OS contains text data in EBCDIC format, including
> metadata, which makes those data-bases unusable on other platforms. The
> opposite was also true in my 

[sqlite] Magic number in sqlite source code

2015-12-31 Thread Max Vasilyev
Hello, Richard!

Probably PTR_SZ or PAGE_PTR_SZ would be good?
I feel confusing about OVFL_. Why size of the pointer to the first overflow
page could be different from size of another pointers?
Sorry, I'm far from the code and should not discourse. Just have an idea
that name should be as common (generic) as possible (to follow Occam's
razor). And it's interesting where does it(4) come from? sizeof(int), for
file we should fix it, right? (comment to define).

>OVFL_PTR_SZ might be a better name.  4 is the size (in bytes) used by
>the pointer to the first overflow page that occurs at the end of the
>on-page record.

Happy New Year!

Thanks,
Max


2015-12-31 2:54 GMT+03:00 Domingo Alvarez Duarte 
:

> Hello Duncan !
>
> I saw a very good point on your suggestion !
>
> I'll use it when writing/refactoring code.
>
> Thanks a lot !
>
>
> >  Wed Dec 30 2015 11:51:54 pm CET CET from "Darren Duncan"
> >  Subject: Re: [sqlite] Magic number in sqlite
> >source code
> >
> >  On 2015-12-30 12:51 PM, Richard Hipp wrote:
> >
> >>On 12/30/15, Richard Hipp  wrote:
> >>
> >>>I'll continue look for an alternative way to make the intent of the
> >>> code clearer.
> >>>
>
> >>  See https://www.sqlite.org/src/info/1541607d458069f5 for another
> >> attempt at removing magic numbers. But I don't like it It seems to
> >> complicate more than it clarifies. My current thinking is that the
> >> code should remain as it is on trunk.
> >>
>
> >  While kludgy itself, a possible compromise is to still use a named
> >constant /
> > macro but have '4' in the name of the macro, eg like 'SOME_FOO_4' where
> the
> >
> > SOME_FOO is a semblance of descriptive and the 4 says what the value is
> so
> >you
> > don't have to look it up. The key thing is that there may be multiple
> >reasons
> > to use the value 4 in a program and the named constant is illustrating
> >which
> > reason it is. If you change the value of the constant then you would also
> > rename this particular constant to match the new value, but the key thing
> >is you
> > have something easily look-upable that shows all the 4 are connected. --
> >Darren
> > Duncan
> >
> > ___
> > sqlite-users mailing list
> > sqlite-users at mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> >
> >
>
>
>
>
>
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>


[sqlite] Do you mean utf8_fprintf on this commit ?

2015-12-31 Thread Joe Mistachkin

Domingo Alvarez Duarte wrote:
>
> On this commit https://www.sqlite.org/src/info/8cf01fff232d15d3 do you
> mean "utf8_fprintf" instead of "utf8_printf" ?
> 

No, I meant to use the existing "utf8_printf" function (and the new
"raw_printf" macro).

--
Joe Mistachkin



[sqlite] System.Data.SQLite: Incorrect implementation of SQLiteDataReader::GetSchemaTable()

2015-12-31 Thread Jann Roder
Hi,
The implementation of GetSchemaTable() in SQLiteDataReader seems to be based on 
the properties of the columns used in the select. Obviously uniqueness, 
nullness and primary key properties do not transfer when only a subset of the 
columns is selected or combined with data from other tables. Unfortunately the 
.Net Datatable::Load() command uses the information returned by
SQLiteDataReader::GetSchemaTable(). This means that the result of many queries 
cannot be loaded into a Datatable using the Load() command because of 
non-nullable columns being null (due to a left join) or even wrong (the 
Datatable just drops "duplicate" rows when loading data). See the code below 
that illustrates the problem.

I'm not sure how other DB drivers solve this problem, but it seems to me the 
SQLite driver should stop trying to be clever and just always set the IsUnique 
and IsKey columns to false and also always allow null values.

Jann

using System.Data;
using System.Data.SQLite;
using NUnit.Framework;

namespace SQLiteDemo
{
[TestFixture]
public class Demo
{
private SQLiteConnection m_connection;

[SetUp]
public void CreateDatabase()
{
m_connection = new SQLiteConnection("Data Source=:memory:");
m_connection.Open();
using (var command = new SQLiteCommand())
{
command.CommandText =
@"CREATE TABLE P (
  Pid1 INT NOT NULL,
  Pid2 INT NOT NULL,
  Value TEXT NOT NULL,
  CONSTRAINT PK_P PRIMARY KEY (Pid1, Pid2)
  );
CREATE TABLE PM (
  Pid1 INT NOT NULL,
  Pid2 INT NOT NULL,
  Value TEXT NOT NULL,
  CONSTRAINT PK_PM PRIMARY KEY (Pid1, Pid2, Value)
  );";
command.Connection = m_connection;
command.ExecuteNonQuery();
}

using (var command = new SQLiteCommand())
{
command.CommandText =
@"INSERT INTO P VALUES(1, 1, 'A');
  INSERT INTO P VALUES(2, 1, 'A');
  INSERT INTO P VALUES(3, 1, 'B');
INSERT INTO PM VALUES(1, 10, 'A');
INSERT INTO PM VALUES(3, 1, 'A');";
command.Connection = m_connection;
command.ExecuteNonQuery();
}
}

[TearDown]
public void CleanDatabase()
{
m_connection.Close();
m_connection = null;
}

[Test]
public void Case1()
{
var dt = new DataTable();
using (var command = new SQLiteCommand(@"SELECT P.Pid1, PM.Pid2
  FROM P
  LEFT JOIN PM ON P.Value = 
PM.Value", m_connection))
{
using (var reader = command.ExecuteReader())
{
var schema = reader.GetSchemaTable();

dt.Load(reader);
}
}

Assert.That(dt.Rows.Count, Is.EqualTo(5));
}

[Test]
public void Case2()
{
var dt = new DataTable();
using (var command = new SQLiteCommand(@"SELECT P.Pid1,
 CASE WHEN PM.Pid2 IS NULL 
THEN P.Pid2 ELSE PM.Pid2 END
  FROM P
  LEFT JOIN PM ON P.Value = 
PM.Value", m_connection))
{
using (var reader = command.ExecuteReader())
{
var schema = reader.GetSchemaTable();

dt.Load(reader);
}
}

Assert.That(dt.Rows.Count, Is.EqualTo(5));
}
}
}



Winton Capital Management Limited (?Winton?) is a limited company registered in 
England and Wales with its registered offices at 16 Old Bailey, London, EC4M 
7EG (Registered Company No. 3311531). Winton is authorised and regulated by the 
Financial Conduct Authority in the United Kingdom, registered as an investment 
adviser with the US Securities and Exchange Commission, registered with the US 
Commodity Futures Trading Commission and a member of the National Futures 
Association in the United States.

This communication, including any attachments, is confidential and may be 
privileged. This email is for use by the intended recipient only. If you 
receive it in error, please notify the sender and delete it. You should not 
copy or disclose all or any part of this email.

This email does not constitute an offer or solicitation and nothing contained 
in this email constitutes, and should not be construed as, investment advice. 
Prospective investors should request offering 

[sqlite] System.Data.SQLite: Incorrect implementation of SQLiteDataReader::GetSchemaTable()

2015-12-31 Thread Joe Mistachkin

Jann Roder wrote:
>
> The implementation of GetSchemaTable() in SQLiteDataReader seems to be
> based on the properties of the columns used in the select.  Obviously
> uniqueness, nullness and primary key properties do not transfer when
> only a subset of the columns is selected or combined with data from
> other tables. 
>

The official MSDN docs are a bit fuzzy on these points:


https://msdn.microsoft.com/en-us/library/system.data.idatareader.getschemata
ble%28v=vs.110%29.aspx

> 
> Unfortunately the .Net Datatable::Load() command uses the information
> returned by SQLiteDataReader::GetSchemaTable().  This means that the
> result of many queries cannot be loaded into a Datatable using the
> Load() command because of non-nullable columns being null (due to a
> left join) or even wrong (the Datatable just drops "duplicate" rows
> when loading data). See the code below that illustrates the problem.
> 

Yes, I've seen this behavior while tracking down several past issues.
On a somewhat sunnier note, the built-in ADO.NET support classes seem
remarkably good at adapting to [some of] the of idiosyncrasies of the
various ADO.NET providers.  However, as you have seen, there are some
inconsistencies.

> 
> I'm not sure how other DB drivers solve this problem, but it seems to
> me the SQLite driver should stop trying to be clever and just always
> set the IsUnique and IsKey columns to false and also always allow null
> values.
> 

Unfortunately, changing this method in such a fundamental way would not
be backwards compatible.  Also, in some cases, it can be quite difficult
to determine what the "correct" behavior should be.

--
Joe Mistachkin



[sqlite] Function patternCompare() not EBCDIC friendly

2015-12-31 Thread David Clark
Roland,
Congrads on getting something to work with sqlite and z/OS. ?How did you 
resolve the file I/O issues, or did you have any. ?I figured sqlite should be 
able to run on z/OS a few years back due to the portable nature of the code I 
saw. ? But the?mainframe guys who supposedly knew, told me...no things like 
_lseek() not present on a mainframe, then started talkingabout mainframe stuff 
I didn't follow, being from the windows world. ?
So what is the state of sqlite on z/OS and how close is to drop in and compile 
with a c compiler and run? ?? 

On Wednesday, December 30, 2015 11:32 AM, John McKown  wrote:



 On Wed, Dec 30, 2015 at 9:55 AM, Roland Martin 
wrote:

> I have tested the code change on z/OS and it works.
>

?Any chance that I could beg the source and executable code from you?


>
> Thanks for the quick turnaround!
>
> Roland Martin
>
>
-- 
Computer Science is the only discipline in which we view adding a new wing
to a building as being maintenance -- Jim Horning

Schrodinger's backup: The condition of any backup is unknown until a
restore is attempted.

Yoda of Borg, we are. Futile, resistance is, yes. Assimilated, you will be.

He's about as useful as a wax frying pan.

10 to the 12th power microphones = 1 Megaphone

Maranatha! <><
John McKown
___
sqlite-users mailing list
sqlite-users at mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users






[sqlite] Magic number in sqlite source code

2015-12-31 Thread Domingo Alvarez Duarte
Hello Duncan !  

I saw a very good point on your suggestion !  

I'll use it when writing/refactoring code.  

Thanks a lot !  

?  
>  Wed Dec 30 2015 11:51:54 pm CET CET from "Darren Duncan"
>  Subject: Re: [sqlite] Magic number in sqlite
>source code
>
>  On 2015-12-30 12:51 PM, Richard Hipp wrote:
>  
>>On 12/30/15, Richard Hipp  wrote:
>>  
>>>I'll continue look for an alternative way to make the intent of the
>>> code clearer.
>>> 

>>  See https://www.sqlite.org/src/info/1541607d458069f5 for another
>> attempt at removing magic numbers. But I don't like it It seems to
>> complicate more than it clarifies. My current thinking is that the
>> code should remain as it is on trunk.
>> 

>  While kludgy itself, a possible compromise is to still use a named
>constant / 
> macro but have '4' in the name of the macro, eg like 'SOME_FOO_4' where the
>
> SOME_FOO is a semblance of descriptive and the 4 says what the value is so
>you 
> don't have to look it up. The key thing is that there may be multiple
>reasons 
> to use the value 4 in a program and the named constant is illustrating
>which 
> reason it is. If you change the value of the constant then you would also 
> rename this particular constant to match the new value, but the key thing
>is you 
> have something easily look-upable that shows all the 4 are connected. --
>Darren 
> Duncan
> 
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> 
>
>  



?



[sqlite] Magic number in sqlite source code

2015-12-31 Thread Domingo Alvarez Duarte
Hello Richard !  

Sorry again for the mess with format and missing parameter on the maybe
more friendly function "ptrmapPutOvflPtr" !  


I decided to really look at the code now (before I looked at the diffs and
saw so many magic numbers "4").

I know that what I'm saying here not always I follow for n reasons but thanks
for giving me a chance to take a moment and reflect on this that do not seem
a problem when writing but man when we come back after 1 or more days it's
not easy to grasp what it mean. 

For example this function:

static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){
? CellInfo info;
? if( *pRC ) return;
? assert( pCell!=0 );
? pPage->xParseCell(pPage, pCell, );
? if( info.nLocalpBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC);
? }
}

I would like to see a less verbose version that hide through "inline
function/macro" parameters that can be derived making the code easier to read
and understand with less mental effort (or with mental effort directed to the
forest instead of the trees where appropriate).

static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){
? CellInfo info;
? if( *pRC ) return;
? assert( pCell!=0 );
? pPage->xParseCell(pPage, pCell, );
? if( info.nLocal

[sqlite] Magic number in sqlite source code

2015-12-31 Thread Domingo Alvarez Duarte
Hello Richard !  

!!! Last message got messed format, sorry !!!

I decided to really look at the code now (before I looked at the diffs and
saw so many magic numbers "4").

I know that what I'm saying here not always I follow for n reasons but thanks
for giving me a chance to take a moment and reflect on this that do not seem
a problem when writing but man when we come back after 1 or more days it's
not easy to grasp what it mean. 

For example this function:

static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){
? CellInfo info;
? if( *pRC ) return;
? assert( pCell!=0 );
? pPage->xParseCell(pPage, pCell, );
? if( info.nLocalpBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC);
? }
}

I would like to see a less verbose version that hide through "inline
function/macro" parameters that can be derived making the code easier to read
and understand with less mental effort (or with mental effort directed to the
forest instead of the trees where appropriate).

static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){
? CellInfo info;
? if( *pRC ) return;
? assert( pCell!=0 );
? pPage->xParseCell(pPage, pCell, );
? if( info.nLocal

[sqlite] Magic number in sqlite source code

2015-12-31 Thread Domingo Alvarez Duarte
Hello Richard !  

I decided to really look at the code now (before I looked at the diffs and
saw so many magic numbers "4").  

I know that what I'm saying here not always I follow for n reasons but thanks
for giving me a chance to take a moment and reflect on this that do not seem
a problem when writing but man when we come back after 1 or more days it's
not easy to grasp what it mean.  

For example this function:  ?  static void ptrmapPutOvflPtr(MemPage *pPage,
u8 *pCell, int *pRC){CellInfo info;if( *pRC ) return;assert(
pCell!=0 );pPage->xParseCell(pPage, pCell, );if(
info.nLocalpBt, ovfl,
PTRMAP_OVERFLOW1, pPage->pgno, pRC);}  }

I would like to see a less verbose version that hide through "inline
function/macro" parameters that can be derived making the code easier to read
and understand with less mental effort (or with mental effort directed to the
forest instead of the trees where appropriate).  static void
ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){CellInfo info;   
if( *pRC ) return;assert( pCell!=0 );pPage->xParseCell(pPage, pCell,
);if( info.nLocal