John Scoles wrote:
> At a first look it most likely is my new
> 
> ora_ncs_buff_mtpl /ORA_DBD_NCS_BUFFER  might be the source of the problem
> 
> byt default it is 1 which may be too small.
> 
> Can you set the ORA_DBD_NCS_BUFFER to 2 then 3 and  4  to see if it
> cleans up the problem
> 
> My guess is that 1 is too small and I might have to make it 2 to cover
> more bases.
> 
> cheers
> 
> John Scoles

John,

Sorry but it wasn't until I saw your reply that I realised I'm missed
off the probable cause.

OCILobRead is very strange. You pass it bytes and for NLS_LANG=utf8 you
get character count back. Also, when utf8, if you pass it 1024 byte
buffer you get 256 filled in and not 1024 and hence why the previous
code was *4 I'd guess. As such ORA_DBD_NCS_BUFFER = 4 fixes the problem
(and 2 and 3 do not).

I suspect this peculiar behaviour of OCILobRead should be documented in
DBD::Oracle to avoid this happening again and it might even have been
worth supporting the NEED_DATA return state.

There are other funny cases with OCILobRead but I'd have to go back
through my notes from some years back to dig them out as my memory is
not too good these days.

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com

> Martin Evans wrote:
>> John Scoles wrote:
>>  
>>> Thank Charles that is really good stuff
>>>
>>> I have not investigated the
>>>
>>> NLS_LANG=.WE8ISO8859P1, but the tests 30long.t and 31lob_extended.t
>>>  still fail badly if NLS_LANG=.AL32UTF8.
>>>
>>> bug yet as my local test box is just US7ASCII.
>>>
>>> BTW can you tell me what the '
>>>
>>> NLS_CHARACTERSET and
>>>
>>> NLS_NCHAR_CHARACTERSET
>>>
>>> setting of your  Oralcle DB you are testing on
>>>
>>>
>>> I will have to do that later today or tonight as I have to install a
>>> different version or Oracle to get that to fail (I hope)
>>>
>>> If you can set $dbh->{dbd_verbose}=15 just before the test start to
>>> fail in
>>>
>>> 30long.t and 31lob_extended.t
>>>
>>> and send me the results I will have something more to go on.
>>>
>>>
>>> Look for another  RC in the next day or two.
>>>
>>> Cheers
>>>
>>> Jardine wrote:
>>>    
>>>> On 14/01/10 12:19, Charles Jardine wrote:
>>>>      
>>>>> On 12/01/10 12:07, John Scoles wrote:
>>>>>        
>>>>>> Ok third time is a Charm
>>>>>>
>>>>>> The Third RC of the beer edition of DBD::Oracle 1.24 can be found at
>>>>>>
>>>>>>
>>>>>> http://svn.perl.org/modules/dbd-oracle/trunk/DBD-Oracle-1.24-RC3.tar
>>>>>>
>>>>>>
>>>>>> This round has a few little patches from Martin Evans on it.
>>>>>>
>>>>>>
>>>>>> Please test and enjoy
>>>>>>           
>>>>> My environment is Linux x86-64, Perl 5.10.1 (64 bit), DBI 1.609,
>>>>> Oracle 10.2.0.4.2 (64 bit). Database charset UTF8, national
>>>>> charset AL16UTF16
>>>>>
>>>>> Three things:
>>>>>         
>>>> [snip]
>>>>
>>>>      
>>>>> 3. Here is a patch which removes the remaining warnings detected by
>>>>>   gcc in 64-bit mode.
>>>>>         
>>>> [snip]
>>>>
>>>> I realise that something has wrapped the very long lines in the patch,
>>>> so I am trying again, sending the patch as an attachment.
>>>>
>>>>       
>>>     
>> For me tests 40long.t and 30lob_extended.t also fail when $NLS_LANG is
>> AMERICAN_AMERICA.AL32UTF8. The values of NLS_CHARACTERSET and
>> NLS_NCHAR_CHARACTERSET in my database are:
>>
>> AL32UTF8 and
>> UTF8
>>
>> as the test output below shows.
>>
>> The errors I get are:
>>
>> prove -vb t/30long.t
>> t/30long.t ..
>> 1..479
>> # ora_server_version: 11 1 0 6 0
>> # Database 11.1.0.6.0 CHAR set is AL32UTF8 (Unicode), NCHAR set is UTF8
>> (Unicode)
>> # Client 11.1.0.6 NLS_LANG is 'AMERICAN_AMERICA.AL32UTF8', NLS_NCHAR is
>> '<unset>'
>> #
>> #
>> =========================================================================
>> #     Running long test for LONG (0) use_utf8_data=0
>> # create table dbd_ora__drop_me ( idx integer, lng LONG,  dt date )
>> # long_data[0] length 10240
>> # long_data[1] length 81920
>> # long_data[2] length 71680
>> #  --- insert some LONG data (ora_type 0)
>> ok 1 - prepare: insert into dbd_ora__drop_me values (?, ?, SYSDATE)
>> ok 2 - insert long data 40
>> ok 3 - insert long data 41
>> ok 4 - insert long data 42
>> ok 5 - insert long data undef 43
>> #  --- fetch LONG data back again -- truncated - LongTruncOk == 1
>> # LongReadLen 20, LongTruncOk 1
>> ok 6 - prepare: select * from dbd_ora__drop_me order by idx
>> ok 7 - execute: select * from dbd_ora__drop_me order by idx
>> ok 8 - fetch_arrayref for select * from dbd_ora__drop_me order by idx
>> ok 9 - four rows
>> ok 10 - byte_string test of truncated to LongReadLen 20
>> ok 11 - nice_string test of truncated to LongReadLen 20
>> ok 12 - LONG UTF8 setting
>> ok 13 - byte_string test of truncated to LongReadLen 20
>> ok 14 - nice_string test of truncated to LongReadLen 20
>> ok 15 - LONG UTF8 setting
>> ok 16 - byte_string test of truncated to LongReadLen 20
>> ok 17 - nice_string test of truncated to LongReadLen 20
>> ok 18 - LONG UTF8 setting
>> ok 19 - last row undefined
>> ok 20 - prepare select * from dbd_ora__drop_me order by idx
>> #  --- fetch LONG data back again -- truncated - LongTruncOk == 0
>> # LongReadLen 81910, LongTruncOk
>> ok 21 - execute select * from dbd_ora__drop_me order by idx
>> ok 22 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 23 - length tmp->[1] 10240
>> ok 24 - truncation error not triggered (LongReadLen 81910, data 10240)
>> ok 25 - tmp==1406 || tmp==24345 tmp actually=24345
>> #  --- fetch LONG data back again -- complete - LongTruncOk == 0
>> # LongReadLen 82920, LongTruncOk
>> ok 26 - prepare: select * from dbd_ora__drop_me order by idx
>> ok 27 - execute select * from dbd_ora__drop_me order by idx
>> ok 28 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 29 - Strings are identical, Len 10240
>> ok 30 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 31 - Strings are identical, Len 10240
>> ok 32 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 33 - Strings are identical, Len 10240
>> ok 34 # skip blob_read tests for LONGs - not currently supported
>> <snipped - all the same>
>> ok 94 # skip ora_auto_lob tests for LONGs - not supported
>> #
>> #
>> =========================================================================
>> #     Running long test for LONG RAW (24) use_utf8_data=0
>> ok 95 - prepare: insert into dbd_ora__drop_me values (?, ?, SYSDATE)
>> # create table dbd_ora__drop_me ( idx integer, lng LONG RAW,  dt date )
>> # long_data[0] length 20480
>> # long_data[1] length 81920
>> # long_data[2] length 71680
>> #  --- insert some LONG RAW data (ora_type 24)
>> ok 96 - insert long data 40
>> ok 97 - insert long data 41
>> ok 98 - insert long data 42
>> ok 99 - insert long data undef 43
>> #  --- fetch LONG RAW data back again -- truncated - LongTruncOk == 1
>> # LongReadLen 20, LongTruncOk 1
>> ok 100 - prepare: select * from dbd_ora__drop_me order by idx
>> ok 101 - execute: select * from dbd_ora__drop_me order by idx
>> ok 102 - fetch_arrayref for select * from dbd_ora__drop_me order by idx
>> ok 103 - four rows
>> ok 104 - byte_string test of truncated to LongReadLen 40
>> ok 105 - nice_string test of truncated to LongReadLen 40
>> ok 106 - LONG RAW UTF8 setting
>> ok 107 - byte_string test of truncated to LongReadLen 40
>> ok 108 - nice_string test of truncated to LongReadLen 40
>> ok 109 - LONG RAW UTF8 setting
>> ok 110 - byte_string test of truncated to LongReadLen 40
>> ok 111 - nice_string test of truncated to LongReadLen 40
>> ok 112 - LONG RAW UTF8 setting
>> ok 113 - last row undefined
>> ok 114 - prepare select * from dbd_ora__drop_me order by idx
>> #  --- fetch LONG RAW data back again -- truncated - LongTruncOk == 0
>> # LongReadLen 40955, LongTruncOk
>> ok 115 - execute select * from dbd_ora__drop_me order by idx
>> ok 116 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 117 - length tmp->[1] 20480
>> ok 118 - truncation error not triggered (LongReadLen 40955, data 20480)
>> ok 119 - tmp==1406 || tmp==24345 tmp actually=24345
>> #  --- fetch LONG RAW data back again -- complete - LongTruncOk == 0
>> # LongReadLen 82920, LongTruncOk
>> ok 120 - prepare: select * from dbd_ora__drop_me order by idx
>> ok 121 - execute select * from dbd_ora__drop_me order by idx
>> ok 122 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 123 - Strings are identical, Len 20480
>> ok 124 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 125 - Strings are identical, Len 81920
>> ok 126 - fetchrow_arrayref select * from dbd_ora__drop_me order by idx
>> ok 127 - Strings are identical, Len 71680
>> ok 128 # skip blob_read tests for LONGs - not currently supported
>> <snipped all the same>
>> ok 188 # skip ora_auto_lob tests for LONG RAWs - not supported
>> #
>> #
>> =========================================================================
>> #     Running long test for NCLOB (112) use_utf8_data=1
>> # create table dbd_ora__drop_me ( idx integer, lng NCLOB,  dt date )
>> # long_data[0] length 10240
>> ok 189 - prepare: insert into dbd_ora__drop_me values (?, ?, SYSDATE)
>> # long_data[1] length 81920
>> # long_data[2] length 71680
>> #  --- insert some NCLOB data (ora_type 112)
>> ok 190 - insert long data 40
>> ok 191 - insert long data 41
>> ok 192 - insert long data 42
>> ok 193 - insert long data undef 43
>> #  --- fetch NCLOB data back again -- truncated - LongTruncOk == 1
>> # LongReadLen 20, LongTruncOk 1
>> ok 194 - prepare: select * from dbd_ora__drop_me order by idx
>> ok 195 - execute: select * from dbd_ora__drop_me order by idx
>> DBD::Oracle has returned a NEED_DATA status when doing a LobRead!!
>> DBD::Oracle::db disconnect failed: ORA-03127: no new operations allowed
>> until the active operation ends (DBD ERROR: OCISessionEnd) at t/30long.t
>> line 68.
>> # Looks like you planned 479 tests but ran 195.
>> # Looks like your test exited with 255 just after 195.
>> Dubious, test returned 255 (wstat 65280, 0xff00)
>> Failed 284/479 subtests
>>     (less 122 skipped subtests: 73 okay)
>>
>> Test Summary Report
>> -------------------
>> t/30long.t (Wstat: 65280 Tests: 195 Failed: 0)
>>   Non-zero exit status: 255
>>   Parse errors: Bad plan.  You planned 479 tests but ran 195.
>> Files=1, Tests=195,  0 wallclock secs ( 0.04 usr  0.00 sys +  0.12 cusr
>>  0.01 csys =  0.17 CPU)
>> Result: FAIL
>>
>> It is similar with 31lob_extended.t but as it is a shorter test and it
>> is easier to segregate the failure I've concentrated on that. I
>> commented out the first section of bracketed tests in 31lob_extended.t
>> and left the remaining one which fails. The output is:
>>
>> prove -vb t/31lob_extended.t
>> t/31lob_extended.t ..
>> 1..31
>> ok 1 - created test table
>> # create table dbd_ora__drop_me ( idx integer, x clob,  dt date )
>> ok 2 - created test data
>> ok 3 - created test procedure
>> ok 4 - ora_auto_lobs not fetching prepare call proc
>> ok 5 - ora_auto_lobs not fetching - bind out cursor
>> ok 6 - ora_auto_lobs not fetching - execute to get out cursor
>> DBD::Oracle has returned a NEED_DATA status when doing a LobRead!!
>> procedure p_DBD_Oracle_drop_me possibly not dropped- check -
>> DBD::Oracle::db do failed: ORA-03127: no new operations allowed until
>> the active operation ends (DBD ERROR: OCIStmtExecute) [for Statement
>> "drop procedure p_DBD_Oracle_drop_me"] at t/31lob_extended.t line 175.
>>
>> table dbd_ora__drop_me possibly not dropped - check - DBD::Oracle::db do
>> failed: ORA-03127: no new operations allowed until the active operation
>> ends (DBD ERROR: OCIStmtExecute) [for Statement " drop table
>> dbd_ora__drop_me "] at t/nchar_test_lib.pl line 204.
>>
>> # Looks like you planned 31 tests but ran 6.
>> # Looks like your test exited with 255 just after 6.
>> DBD::Oracle::db DESTROY failed: ORA-03127: no new operations allowed
>> until the active operation ends (DBD ERROR: OCIStmtExecute)
>> ORA-03127: no new operations allowed until the active operation ends
>> (DBD ERROR: OCISessionEnd) at t/31lob_extended.t line 91.
>> Dubious, test returned 255 (wstat 65280, 0xff00)
>> Failed 25/31 subtests
>>
>> Test Summary Report
>> -------------------
>> t/31lob_extended.t (Wstat: 65280 Tests: 6 Failed: 0)
>>   Non-zero exit status: 255
>>   Parse errors: Bad plan.  You planned 31 tests but ran 6.
>> Files=1, Tests=6,  0 wallclock secs ( 0.02 usr  0.00 sys +  0.05 cusr
>> 0.01 csys =  0.08 CPU)
>> Result: FAIL
>>
>> With verbose turned on I get the attached output.
>>
>> This is not actually causing me a problem right now as it only seems to
>> happen when ora_auto_lob is on (default) and we mostly disable it.
>>
>> Please let me know if there is anything else I can provide or do to help
>> nail this one.
>>
>> Martin
>>   
> 
> 

Reply via email to