[ 
https://issues.apache.org/jira/browse/DERBY-1482?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12857516#action_12857516
 ] 

Mamta A. Satoor commented on DERBY-1482:
----------------------------------------

I was under the impression that I would need a new format id but since the code 
changes in 10.6 will still be able to read the old ReferencedColumnsDescriptor 
there is not a need for new format id. I have removed my format id changes from 
my codeline (before removing those changes, I was constantly getting no class 
implementation found for format id). But there is a bug in the writeExternal 
that I posted above. In the case of missing trigger action column references, 
my code was incorrectly writing the length of trigger columns twice. I have 
fixed that problem. The new writeExternal will look like following

        /**
         * For triggers, 3 possible scenarios
         * 1)referencedColumns is not null but referencedColumnsInTriggerAction
         * is null - then following gets written
         *   referencedColumns.length
         *   individual elements from referencedColumns arrary
         *   eg create trigger tr1 after update of c1 on t1 for each row 
values(1); 
         * 2)referencedColumns is null but referencedColumnsInTriggerAction is 
not 
         * null - then following gets written
         *   -1
         *   -1
         *   referencedColumnsInTriggerAction.length
         *   individual elements from referencedColumnsInTriggerAction arrary
         *   eg create trigger tr1 after update on t1 referencing old as oldt 
         *      for each row values(oldt.id); 
         * 3)referencedColumns and referencedColumnsInTriggerAction are not 
null -
         *   then following gets written
         *   -1
         *   referencedColumns.length
         *   individual elements from referencedColumns arrary
         *   referencedColumnsInTriggerAction.length
         *   individual elements from referencedColumnsInTriggerAction arrary
         *   eg create trigger tr1 after update of c1 on t1 referencing old as 
oldt 
         *      for each row values(oldt.id); 
         */
        public void writeExternal(ObjectOutput out) throws IOException 
        { 
                //A null value for referencedColumnsInTriggerAction means one 
of 2 cases
                //1)We are working in soft-upgrade mode dealing with databases 
lower than 10.6
                //  Prior to 10.6 release, we did not keep track of trigger 
action columns
                //2)We are working with >10.5 release database and the trigger 
action does not 
                //  reference any column through old/new transient variables

                //versionNumber will be -1 if referencedColumnsInTriggerAction 
is not null,
                //meaning, we are dealing with >10.5 release database and the 
trigger has referenced
                //columns in trigger action through old/new transient variables.
                //Otherwise, versionNumber will be the length of the arrary 
referencedColumns. This
                //arrary holds the columns on which trigger is defined. The 
detailed meaning of
                //these 2 arrays is described at the class level 
comments(towards the beginning of
                //this class.
                int versionNumber = referencedColumnsInTriggerAction == null ? 
referencedColumns.length : -1; 

                if ( versionNumber < 0 ) { 
                        out.writeInt( versionNumber ); 
                        //If we are here, then it means that trigger action 
references 
                        //columns through old/new transient variables. 
                        //First we will check if there are any trigger columns 
selected
                        //for this trigger. If yes, we will write information 
about 
                        //trigger columns and if not, then we will write -1 to 
indicate 
                        //that there are no trigger columns selected.
                        //After that, we will write info about trigger action 
columns.
                    if ( referencedColumns != null ) { 
                        writeReferencedColumns(out);
                    } else {
                        out.writeInt(versionNumber);
                    }
                    //Write info about trigger action columns referenced 
through 
                    //old/new transient variables
                    out.writeInt(referencedColumnsInTriggerAction.length); 
                    for (int i = 0; i < 
referencedColumnsInTriggerAction.length; i++) 
                    { 
                        out.writeInt(referencedColumnsInTriggerAction[i]); 
                    } 
                } else {
                        //If we are here, then it means there are no references 
in 
                        //trigger action to old/new transient variables. But, 
three are
                        //trigger columns selected for this trigger. Write info 
about 
                        //trigger columns
                writeReferencedColumns(out);
                }                
        } 
        private void writeReferencedColumns(ObjectOutput out) throws 
IOException 
        { 
        //trigger is defined on select columns. Write info about trigger columns
        out.writeInt( referencedColumns.length ); 
        for (int i = 0; i < referencedColumns.length; i++) 
        { 
            out.writeInt(referencedColumns[i]); 
        } 
        }


> Update triggers on tables with blob columns stream blobs into memory even 
> when the blobs are not referenced/accessed.
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1482
>                 URL: https://issues.apache.org/jira/browse/DERBY-1482
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.2.1.6
>            Reporter: Daniel John Debrunner
>            Assignee: Mamta A. Satoor
>            Priority: Minor
>         Attachments: derby1482_patch1_diff.txt, derby1482_patch1_stat.txt, 
> derby1482_patch2_diff.txt, derby1482_patch2_stat.txt, 
> derby1482DeepCopyAfterTriggerOnLobColumn.java, derby1482Repro.java, 
> derby1482ReproVersion2.java, junitUpgradeTestFailureWithPatch1.out, 
> TriggerTests_ver1_diff.txt, TriggerTests_ver1_stat.txt
>
>
> Suppose I have 1) a table "t1" with blob data in it, and 2) an UPDATE trigger 
> "tr1" defined on that table, where the triggered-SQL-action for "tr1" does 
> NOT reference any of the blob columns in the table. [ Note that this is 
> different from DERBY-438 because DERBY-438 deals with triggers that _do_ 
> reference the blob column(s), whereas this issue deals with triggers that do 
> _not_ reference the blob columns--but I think they're related, so I'm 
> creating this as subtask to 438 ]. In such a case, if the trigger is fired, 
> the blob data will be streamed into memory and thus consume JVM heap, even 
> though it (the blob data) is never actually referenced/accessed by the 
> trigger statement.
> For example, suppose we have the following DDL:
>     create table t1 (id int, status smallint, bl blob(2G));
>     create table t2 (id int, updated int default 0);
>     create trigger tr1 after update of status on t1 referencing new as n_row 
> for each row mode db2sql update t2 set updated = updated + 1 where t2.id = 
> n_row.id;
> Then if t1 and t2 both have data and we make a call to:
>     update t1 set status = 3;
> the trigger tr1 will fire, which will cause the blob column in t1 to be 
> streamed into memory for each row affected by the trigger. The result is 
> that, if the blob data is large, we end up using a lot of JVM memory when we 
> really shouldn't have to (at least, in _theory_ we shouldn't have to...).
> Ideally, Derby could figure out whether or not the blob column is referenced, 
> and avoid streaming the lob into memory whenever possible (hence this is 
> probably more of an "enhancement" request than a bug)... 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to