[ 
https://issues.apache.org/jira/browse/DERBY-3330?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mike Matrigali updated DERBY-3330:
----------------------------------


here are some initial comments on the derby-3330v4.diff patch

overall:
o almost unique, doesn't seem like a good name for this.  And I didn't see
  good documentation in the code explaining what this means.  Unfortunately
  could not think of something less wordy than AllowMulipleNullsInUnique.

o not sure what you are using for tab/spaces, see derby web site for following
  existing conventions in the code.  may seem minor but inconsistent tab/indent
  makes stuff unreadable.  Derby code that has tab indentation expects 4 spaces
  for those tabs.

java/engine/org/apache/derby/impl/sql/compile/CreateIndexNode.java
o no comments explaining new parameter and what false means.  
  CreateindexConstantAction also has no comments about the parameter either.

java/engine/org/apache/derby/impl/sql/execute/CreateIndexConstantAction.java
o inconsistent formatting with rest of file for new CreateIndexConstantAction
  routine, so does not indent same as rest.

o Why did you add whole new routine rather than add single parameter to 
  existing routine and update other references.  I think it is really error
  prone to have 2 routines with same name and just differ by 12 or 13 
  params.  

o no comments about almostUnique, some doc in the CreateIndexConstantAction 
  call and some comment following the existing code when property is set up
  would be appropriate.

o This line looks unused:
  Properties sortProperty = null; 
  it looks later like you use "properties" but other code seems to think that
  this may be null sometimes.

o the tabbing/indentation inconsistency makes the sort part almost unreadable.
  no comments for added sort logic.


java/engine/org/apache/derby/impl/sql/compile/TableElementList.java
o bad indentation
o looks like you removed check for null but left comments that we would check
  for null.  
o again no added comments for all changes to this file.

o need some explanation of what the added code is doing here.  What is the
  purpose of the else part of if (constraintDN.constraintType ==
          DataDictionary.UNIQUE_CONSTRAINT)?


java/engine/org/apache/derby/impl/sql/execute/IndexChanger.java
o no comments in changed code

java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java
o bad indentation
o no comments

java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
o bad indentation
o todo left in code, looks like needs to be resolved before checkin

java/engine/org/apache/derby/impl/store/access/sort/ExternalSortFactory.java
o bad indentation
o need some documentation on what changes to mergesort are doing.  

java/engine/org/apache/derby/impl/store/access/btree/BTree.java
o bad indentation
o no comments for any change to file

java/engine/org/apache/derby/impl/store/access/btree/BTreeController.java
o a bunch of imports added that look unnecessary, ie. Time, TimeStampe, 
Calendar, ...
o brace style inconsistent with rest of routine.

o getPreviousRecord()
  o what is the expected behavior on latch waits?
  o Does not follow latch/latch deadlock avoidance protocol - must not wait on
    latch while holding latch while traveling left in tree.  
  o no handling of getting and releasing latches during search.
  o see B2IRowLocking3.java!searchLeftAndLockPreviousKey for example of code
    that searches left in btree.  
  o What kind of locking will the various isolation levels need for your 
checking
    of left and right keys?  Is holding the latch while checking good enough?  I
    don't know right now.
  o note the trickiest part of this is if you have to give up the latch while
    waiting then you have to restart entire search of the tree to find where to
    do the insert because you don't have latch.
  o remember that you may have to search left many pages to find a data row.

  o i don't think you should be searching for "undeleted", deleted records 
    still count toward the integrity of the tree.  Without getting locks it
    is impossible to know if the records marked deleted are committed deleted
    or not.  Imagine if you skip a marked deleted record that would have caused
    a constraint violation, and then that xact backs out it would then mark
    the row as valid and now you would have 2 records that fail the constraint.


getNextRecord()
  o what is expected behavior of latch waits?
  o what is expected behavior if routine has to visit N right leaves (ie. will
    routine hold all latches until end of transaction)?  
  o as in getPreviousRecord() i think it should not special case deleted rows
  o remember you may have to search right many pages to find row in edge case.
  
compareLeftAndRightSiblings()
  o likely code to deal with lost latches would go into this routine and 
callers.
  o no need to call runtime_mem.get_template(getRawTran()) twice.  Once you 
    call it you have a template.  Just reuse the template.

  o there should be some comments somewhere explaining why just checking left
    and right siblings works for what you are trying to achieve.


o i have to think about it some more but the places you added the
if (compareLeftAndRightSiblings(rowToInsert,
            insert_slot, targetleaf))
        return ConglomerateController.ROWISDUPLICATE;
  don't seem optimal.  I would like to see the code only called in the 
  almost unique case, so we don't affect the behavior of existing indexes at
  all.



java/engine/org/apache/derby/impl/store/access/btree/index/B2I.java
o it is critical to properly document changes to ondisk format of store objects,
  doesn't look like any work here done.  I know from existing comments that
  upgrade still does not work so maybe you are planning more here.

o The model has been to add new stuff at the end rather than in the middle.  

o so far I haven't seen what is going to stop this from being created in soft
  upgrade.


java/engine/org/apache/derby/modules.properties
o did you consider just altering the existing sort to take an additional
  startup parameter rather than extending and creating a new module to sort?
  just would be interested to know why one approach vs. the other.


java/engine/org/apache/derby/catalog/types/IndexDescriptorImpl.java
o bad indent in places
o as todo's point out, need soft upgrade support



> provide support for unique constraint over nullable columns
> -----------------------------------------------------------
>
>                 Key: DERBY-3330
>                 URL: https://issues.apache.org/jira/browse/DERBY-3330
>             Project: Derby
>          Issue Type: New Feature
>          Components: Store
>    Affects Versions: 10.4.0.0
>         Environment: all
>            Reporter: Anurag Shekhar
>            Assignee: Anurag Shekhar
>         Attachments: derby-3330-testcase.diff, derby-3330.diff, 
> derby-3330v2.diff, derby-3330v3.diff, derby-3330v4.diff, 
> FunctionalSpec_DERBY-3330.html
>
>
> Allow unique constraint over nullable field. Right now derby support unique 
> constraint only over not null columns.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to