Use default values for the values section of an insert statement for hsqldb as well as postgres
It blows up expecting a column name in the values parenthesis, but the default values string that postgres was working seems to work. It's not in http://hsqldb.org/doc/guide/ch09.html, but so it goes.
This commit is contained in:
@@ -919,6 +919,12 @@ public abstract class BuildVisitor implements FragmentVisitor<Void>
|
||||
}
|
||||
}
|
||||
|
||||
// output the column name and value portion of an insert when all values are defaulted
|
||||
protected void appendEmptyInsertValues ()
|
||||
{
|
||||
_builder.append("default values");
|
||||
}
|
||||
|
||||
// output the column names and values for an insert
|
||||
protected void appendInsertColumns (InsertClause insertClause)
|
||||
{
|
||||
@@ -928,6 +934,18 @@ public abstract class BuildVisitor implements FragmentVisitor<Void>
|
||||
Set<String> idFields = insertClause.getIdentityFields();
|
||||
ColumnExp<?>[] fields = marsh.getColumnFieldNames();
|
||||
|
||||
boolean insertingSomething = false;
|
||||
for (ColumnExp<?> field : fields) {
|
||||
if (!idFields.contains(field.name)) {
|
||||
insertingSomething = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!insertingSomething) {
|
||||
appendEmptyInsertValues();
|
||||
return;
|
||||
}
|
||||
|
||||
_builder.append("(");
|
||||
boolean comma = false;
|
||||
for (ColumnExp<?> field : fields) {
|
||||
|
||||
@@ -155,6 +155,11 @@ public class MySQLBuilder
|
||||
bindValue(fullText.getQuery());
|
||||
_builder.append(" in boolean mode)");
|
||||
}
|
||||
|
||||
@Override protected void appendEmptyInsertValues ()
|
||||
{
|
||||
_builder.append("() values ()");
|
||||
}
|
||||
}
|
||||
|
||||
public MySQLBuilder (DepotTypes types)
|
||||
|
||||
@@ -22,8 +22,6 @@ import com.samskivert.depot.Exps;
|
||||
import com.samskivert.depot.PersistentRecord;
|
||||
import com.samskivert.depot.annotation.FullTextIndex.Configuration;
|
||||
import com.samskivert.depot.annotation.FullTextIndex;
|
||||
import com.samskivert.depot.clause.InsertClause;
|
||||
import com.samskivert.depot.expression.ColumnExp;
|
||||
import com.samskivert.depot.impl.expression.IntervalExp;
|
||||
import com.samskivert.depot.impl.expression.DateFun.DatePart;
|
||||
import com.samskivert.depot.impl.expression.DateFun.DateTruncate;
|
||||
@@ -121,22 +119,6 @@ public class PostgreSQLBuilder
|
||||
_builder.append("\"").append(field).append("\"");
|
||||
}
|
||||
|
||||
@Override protected void appendInsertColumns (InsertClause insertClause)
|
||||
{
|
||||
// see if we will be inserting any columns whatsoever
|
||||
Class<? extends PersistentRecord> pClass = insertClause.getPersistentClass();
|
||||
Set<String> idFields = insertClause.getIdentityFields();
|
||||
for (ColumnExp<?> field : _types.getMarshaller(pClass).getColumnFieldNames()) {
|
||||
if (!idFields.contains(field.name)) {
|
||||
// we found a field we're inserting, so call super and finish
|
||||
super.appendInsertColumns(insertClause);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// we never found anything we'll actually be inserting
|
||||
_builder.append("default values");
|
||||
}
|
||||
|
||||
protected PGBuildVisitor (DepotTypes types)
|
||||
{
|
||||
super(types, true);
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.samskivert.depot;
|
||||
|
||||
import com.samskivert.depot.annotation.GeneratedValue;
|
||||
import com.samskivert.depot.annotation.Id;
|
||||
import com.samskivert.depot.expression.ColumnExp;
|
||||
|
||||
public class AllGeneratedRecord extends PersistentRecord
|
||||
{
|
||||
// AUTO-GENERATED: FIELDS START
|
||||
public static final Class<AllGeneratedRecord> _R = AllGeneratedRecord.class;
|
||||
public static final ColumnExp<Integer> RECORD_ID = colexp(_R, "recordId");
|
||||
// AUTO-GENERATED: FIELDS END
|
||||
|
||||
public static final int SCHEMA_VERSION = 1;
|
||||
|
||||
@Id @GeneratedValue public int recordId;
|
||||
|
||||
// AUTO-GENERATED: METHODS START
|
||||
/**
|
||||
* Create and return a primary {@link Key} to identify a {@link AllGeneratedRecord}
|
||||
* with the supplied key values.
|
||||
*/
|
||||
public static Key<AllGeneratedRecord> getKey (int recordId)
|
||||
{
|
||||
return newKey(_R, recordId);
|
||||
}
|
||||
|
||||
/** Register the key fields in an order matching the getKey() factory. */
|
||||
static { registerKeyFields(RECORD_ID); }
|
||||
// AUTO-GENERATED: METHODS END
|
||||
}
|
||||
@@ -7,6 +7,7 @@ package com.samskivert.depot;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
@@ -15,22 +16,38 @@ import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class GeneratedValueTest
|
||||
{
|
||||
@Test public void insertAutoGeneratedValue ()
|
||||
@Before public void createRepository ()
|
||||
{
|
||||
PersistenceContext pc = TestBase.createPersistenceContext();
|
||||
DepotRepository dr = new DepotRepository(pc) {
|
||||
_dr = new DepotRepository(pc) {
|
||||
@Override
|
||||
protected void getManagedRecords (Set<Class<? extends PersistentRecord>> classes) {
|
||||
classes.add(GeneratedValueRecord.class);
|
||||
classes.add(AllGeneratedRecord.class);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@Test public void insertAutoGeneratedValue ()
|
||||
{
|
||||
GeneratedValueRecord rec = new GeneratedValueRecord();
|
||||
rec.value = 2;
|
||||
assertEquals(0, rec.recordId);
|
||||
assertEquals(1, dr.insert(rec));
|
||||
assertEquals(1, _dr.insert(rec));
|
||||
assertEquals(1, rec.recordId);
|
||||
List<GeneratedValueRecord> recs = dr.from(GeneratedValueRecord.class).
|
||||
List<GeneratedValueRecord> recs = _dr.from(GeneratedValueRecord.class).
|
||||
where(GeneratedValueRecord.VALUE.eq(2)).select();
|
||||
assertEquals(1, Iterables.getOnlyElement(recs).recordId);
|
||||
}
|
||||
|
||||
@Test public void insertAllGeneratedValue ()
|
||||
{
|
||||
AllGeneratedRecord rec = new AllGeneratedRecord();
|
||||
assertEquals(0, rec.recordId);
|
||||
assertEquals(1, _dr.insert(rec));
|
||||
assertEquals(1, rec.recordId);
|
||||
}
|
||||
|
||||
protected DepotRepository _dr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user