| 5006 | } |
| 5007 | |
| 5008 | ValueExprNode* DefaultNode::createFromField(thread_db* tdbb, CompilerScratch* csb, |
| 5009 | StreamType* map, jrd_fld* fld) |
| 5010 | { |
| 5011 | if (fld->fld_generator_name.hasData()) |
| 5012 | { |
| 5013 | // Make a (next value for <generator name>) expression. |
| 5014 | |
| 5015 | GenIdNode* const genNode = FB_NEW_POOL(csb->csb_pool) GenIdNode( |
| 5016 | csb->csb_pool, (csb->blrVersion == 4), fld->fld_generator_name, NULL, true, true); |
| 5017 | |
| 5018 | bool sysGen = false; |
| 5019 | if (!MET_load_generator(tdbb, genNode->generator, &sysGen, &genNode->step)) |
| 5020 | status_exception::raise(Arg::Gds(isc_gennotdef) << Arg::Str(fld->fld_generator_name)); |
| 5021 | |
| 5022 | if (sysGen) |
| 5023 | status_exception::raise(Arg::Gds(isc_cant_modify_sysobj) << "generator" << fld->fld_generator_name); |
| 5024 | |
| 5025 | return genNode; |
| 5026 | } |
| 5027 | else if (fld->fld_default_value) |
| 5028 | { |
| 5029 | StreamMap localMap; |
| 5030 | if (!map) |
| 5031 | map = localMap.getBuffer(STREAM_MAP_LENGTH); |
| 5032 | |
| 5033 | return NodeCopier(csb->csb_pool, csb, map).copy(tdbb, fld->fld_default_value); |
| 5034 | } |
| 5035 | else |
| 5036 | return NullNode::instance(); |
| 5037 | } |
| 5038 | |
| 5039 | string DefaultNode::internalPrint(NodePrinter& printer) const |
| 5040 | { |