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

Rick Hillegas commented on DERBY-5818:
--------------------------------------

What Saurabh needs is the version level of the on-disk data, not the version 
level of derby.jar. Note that DatabaseMetaData.getDatabaseProductVersion() 
returns the version level of derby.jar, not the version level of the on-disk 
data.

Before continuing this discussion, people may want to read the description of 
Derby version identifiers found here: 
http://db.apache.org/derby/papers/versionupgrade.html.

At database creation time, Derby does save the on-disk version as a DD_Version 
object in the properties conglomerate. This object can be looked up with the 
key 'DataDictionaryVersion'. The DD_Version object preserves almost all of the 
version information, although in a tricky encoded format. More specifically, 
the DD_Version object preserves the full four part major.minor.fixpack.point id 
plus the beta flag. However, the subversion codeline stamp is not preserved.

Unfortunately, most of this information is clobbered if you boot the database 
with a higher version than the one which created it. Only the major.minor part 
of the id is preserved. The fixpack, point, and beta information are lost. The 
clobbering is done by the following code block in 
DD_Version.handleMinorRevisionChange(). This code has been part of Derby since 
it was open-sourced:

                        if (softUpgradeRun)
                        {
                                // log a version that will cause a minor 
revision change
                                // for any subsequent re-boot, including an old 
Cloudscape version
                                fromVersion.minorVersionNumber = 1; // see 
getJBMSMinorVersionNumber
                                lastRun = fromVersion;
                        }

            ...

                        
tc.setProperty(DataDictionary.CORE_DATA_DICTIONARY_VERSION, fromVersion, true);

So if you boot a 10.5.1.1 database using a 10.8.2.2 derby.jar, the database 
will be silently transformed from the 10.5.1.1 format into a generic 10.5 
format. Derby itself will not be able to figure out if the database was created 
by 10.5.1.1 or 10.5.2.0 or 10.5.3.0.

Note the following additional subtlety: If you boot a database with a lower 
version of derby.jar than the one which created the database (but still in the 
same major.minor release family), then the DD_Version information is NOT 
clobbered. E.g., if you boot a 10.8.2.2 database with 10.8.1.2, then the 
on-disk version of the data remains at level 10.8.2.2.

An additional subtletly is that the DD_Version object is also not clobbered in 
a read-only database. So if you create a database with version 10.5.1.1, put it 
in a jar file, and then boot the jar'd database using 10.8.2.2, the jar'd 
database remains at version 10.5.1.1.

To summarize:

a) If you boot a read/write database with a later version of Derby than the one 
used to create the database, then the database is silently transformed to a 
generic on-disk format, losing all version information other than the generic 
major.minor number returned by "values 
syscs_util.syscs_get_database_property('DataDictionaryVersion')".

b) This transformation does not happen if you boot the database with an earlier 
version of Derby than the one used to create the database. The transformation 
is also not performed on read-only databases.

But, in general, the very act of inspecting a database may transform it into a 
generic format. There is no general solution to the problem posed by Saurabh. 
You cannot count on the on-disk format being anything more specific than the 
generic major.minor version returned by  "values 
syscs_util.syscs_get_database_property('DataDictionaryVersion')".

Follow-on questions for Saurabh would be:

i) Why is the 2 part version level (major.minor) of the on-disk data not 
adequate?

ii) What breaks if you only have a 2 part data version rather than a four part 
data version (major.minor.fixpack.point)?

Thanks,
-Rick

                
> values syscs_util.syscs_get_database_property('DataDictionaryVersion' ) does 
> not return full version information
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-5818
>                 URL: https://issues.apache.org/jira/browse/DERBY-5818
>             Project: Derby
>          Issue Type: Bug
>            Reporter: Saurabh Kejriwal
>
> Details 
> ------------
> $ ./sysinfo 
> ------------------ Java Information ------------------
> Java Version:    1.6.0
> Java Vendor:     Sun Microsystems Inc.
> Java home:       /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre
> Java classpath:  
> /scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derby.jar:/scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derbynet.jar:/scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derbytools.jar:/scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derbyclient.jar
> OS name:         Linux
> OS architecture: i386
> OS version:      2.6.18-164.0.0.0.1.el5xen
> Java user name:  ansverma
> Java user home:  /home/ansverma
> Java user dir:   /scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/bin
> java.specification.name: Java Platform API Specification
> java.specification.version: 1.6
> java.runtime.version: 1.6.0-b09
> --------- Derby Information --------
> JRE - JDBC: Java SE 6 - JDBC 4.0
> [/scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derby.jar] 10.8.2.2 - 
> (1181258)
> [/scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derbytools.jar] 
> 10.8.2.2 - (1181258)
> [/scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derbynet.jar] 10.8.2.2 
> - (1181258)
> [/scratch/ansverma/JavaDBnew/db-derby-10.8.2.2-bin/lib/derbyclient.jar] 
> 10.8.2.2 - (1181258)
> ------------------------------------------------------
> ----------------- Locale Information -----------------
> Current Locale :  [English/United States [en_US]]
> Found support for locale: [cs]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [de_DE]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [es]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [fr]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [hu]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [it]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [ja_JP]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [ko_KR]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [pl]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [pt_BR]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [ru]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [zh_CN]
>          version: 10.8.2.2 - (1181258)
> Found support for locale: [zh_TW]
>          version: 10.8.2.2 - (1181258)
> ------------------------------------------------------
> Description
> -----------------
> I am using Derby 10.8.2.2. I want to get derby version details through SQL. I 
> ran following query to retrieve version information. 
> $ java -jar 
> /scratch/ansverma/JavaDBnew//db-derby-10.8.2.2-bin/lib/derbyrun.jar ij
> ij version 10.8
> ij> CONNECT 'jdbc:derby:test2;user=test2;password=test2';
> ij> values syscs_util.syscs_get_database_property('DataDictionaryVersion');   
>  
> 1                                                                             
>                                                   
> --------------------------------------------------------------------------------------------------------------------------------
> 10.8                                                                          
>                                                   
> 1 row selected
> It did not return full version information (10.8.2.2) for Derby. 
> Expected result =  10.8.2.2
> Actual result = 10.8
> I want the version details through SQL query.

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

        

Reply via email to